明树Git Lab

Commit 05d4eaef authored by zhanghan's avatar zhanghan

1

parent 92ea2af0
Pipeline #108418 passed with stage
in 20 seconds
......@@ -26,7 +26,7 @@
<!-- 文件列表表格 -->
<el-table
v-if="!isInline"
:data="fileList"
:data="safeFileList"
style="width: 100%"
empty-text="暂无数据"
border
......@@ -66,21 +66,21 @@
placement="bottom-start"
width="420"
trigger="hover"
:disabled="fileList.length === 0 || disabled"
:disabled="safeFileList.length === 0 || disabled"
popper-class="file-popover"
>
<!-- 弹窗内容 -->
<template #default>
<div class="file-popover-content">
<!-- 无文件提示 -->
<div v-if="fileList.length === 0" class="empty-file-tip">
<div v-if="safeFileList.length === 0" class="empty-file-tip">
暂无上传文件
</div>
<!-- 文件列表 -->
<div v-else class="file-list">
<div
v-for="(file, index) in fileList"
v-for="(file, index) in safeFileList"
:key="file.id || index"
class="file-item"
>
......@@ -127,7 +127,7 @@
<template #reference>
<div class="inline-file">
<div class="file-count">
<span class="count-num">{{ fileList.length }}</span>
<span class="count-num">{{ safeFileList.length }}</span>
<span class="count-text">个文件</span>
</div>
<el-icon class="upload-icon"><ArrowDown /></el-icon>
......@@ -144,12 +144,12 @@ import { ElMessageBox, ElMessage } from "element-plus";
import moment from "moment";
import windowConfig from "@/window";
// 引入需要的图标
import { Document, Download, Delete } from "@element-plus/icons-vue";
import { Document, Download, Delete, ArrowDown } from "@element-plus/icons-vue"; // 补充缺失的 ArrowDown 图标
// 定义组件 props(设置默认值,无需外部传参
// 定义组件 props(放宽类型限制,增加兼容性
const props = defineProps({
modelValue: {
type: Array,
type: [Array, String, Number], // 兼容更多类型
default: () => [],
required: true,
},
......@@ -192,13 +192,15 @@ const emit = defineEmits(["update:modelValue"]);
const selectedIds = ref([]);
const popoverVisible = ref(false);
// 计算属性:获取文件列表(双向绑定)
const fileList = computed({
// 核心:安全处理文件列表,将非数组值转为空数组
const safeFileList = computed({
get() {
return props.modelValue;
// 校验:如果是数组则直接返回,否则转为空数组
return Array.isArray(props.modelValue) ? props.modelValue : [];
},
set(value) {
emit("update:modelValue", value);
// 向外发射的值始终是数组,保证数据类型统一
emit("update:modelValue", Array.isArray(value) ? value : []);
},
});
......@@ -210,7 +212,7 @@ const formatDate = (date) => {
// 文件上传成功处理
const handleUploadSuccess = (res) => {
if (res && res.data) {
fileList.value = [...fileList.value, res.data];
safeFileList.value = [...safeFileList.value, res.data]; // 改用 safeFileList
console.log("上传成功:", res.data);
ElMessage.success("文件上传成功");
popoverVisible.value = false;
......@@ -253,9 +255,9 @@ const handleDelete = (index) => {
type: "warning",
})
.then(() => {
const newList = [...fileList.value];
const newList = [...safeFileList.value]; // 改用 safeFileList
newList.splice(index, 1);
fileList.value = newList;
safeFileList.value = newList; // 改用 safeFileList
// 删除后关闭popover
popoverVisible.value = false;
})
......@@ -270,20 +272,21 @@ const handleMultiDelete = () => {
type: "warning",
})
.then(() => {
const newList = fileList.value.filter(
const newList = safeFileList.value.filter(
// 改用 safeFileList
(item) => !selectedIds.value.includes(item.id),
);
fileList.value = newList;
safeFileList.value = newList; // 改用 safeFileList
selectedIds.value = [];
})
.catch(() => {});
};
// 监听外部文件列表变化
// 监听外部文件列表变化(改为监听 safeFileList,无需额外处理)
watch(
() => props.modelValue,
() => safeFileList.value,
(newVal) => {
fileList.value = newVal;
// 空监听,仅保证响应式(safeFileList 已处理类型兼容)
},
{ deep: true },
);
......
......@@ -19,16 +19,26 @@
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="项目信息" required>
<el-select v-model="formData.projectId" placeholder="请选择" no-data-text="暂无数据">
<el-option v-for="item in projectList" :key="item.id"
:label="item.projectName" :value="item.id"
<el-select
v-model="formData.projectId"
placeholder="请选择"
no-data-text="暂无数据"
>
<el-option
v-for="item in projectList"
:key="item.id"
:label="item.projectName"
:value="item.id"
></el-option>
</el-select>
</el-form-item>
</el-col>
</el-row>
</el-collapse-item>
<el-collapse-item title="费用分项控制、阶段对比表" name="费用分项控制、阶段对比表">
<el-collapse-item
title="费用分项控制、阶段对比表"
name="费用分项控制、阶段对比表"
>
<el-row :gutter="20">
<template v-if="fyfxkzIsEdit">
<el-col :span="6">
......@@ -55,181 +65,390 @@
<el-col :span="6" :offset="fyfxkzIsEdit ? 6 : 18">
<div class="tab-handle">
<template v-if="fyfxkzIsEdit">
<el-button type="default" size="small" @click="cancelFyfxkz">取消</el-button>
<el-button type="primary" size="small" @click="saveFyfxkz">确定</el-button>
<el-button
type="default"
size="small"
@click="cancelFyfxkz"
>取消</el-button
>
<el-button
type="primary"
size="small"
@click="saveFyfxkz"
>确定</el-button
>
</template>
<template v-else>
<el-select v-model="selectRange" placeholder="请选择" no-data-text="暂无数据"
:style="{width: '200px', marginRight: '20px'}"
<el-select
v-model="selectRange"
placeholder="请选择"
no-data-text="暂无数据"
:style="{ width: '200px', marginRight: '20px' }"
@change="changeRange"
>
<el-option v-for="item in rangeList" :key="item.key"
:label="item.key" :value="item.key"
<el-option
v-for="item in rangeList"
:key="item.key"
:label="item.key"
:value="item.key"
></el-option>
</el-select>
<el-button v-if="selectRange" type="primary" size="small" @click="editFyfxkz">编辑</el-button>
<el-button type="primary" size="small" @click="addFyfxkz">新增</el-button>
<el-button
v-if="selectRange"
type="primary"
size="small"
@click="editFyfxkz"
>编辑</el-button
>
<el-button
type="primary"
size="small"
@click="addFyfxkz"
>新增</el-button
>
</template>
</div>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="24">
<el-table :data="fyfxkzData" style="width: 100%" empty-text="暂无数据" border height="500">
<el-table
:data="fyfxkzData"
style="width: 100%"
empty-text="暂无数据"
border
height="500"
>
<el-table-column type="index" label="序号" width="60" />
<el-table-column prop="xm" label="项目" width="240">
<template #default="scope">
<el-input v-model="scope.row.xm" :disabled="!fyfxkzIsEdit"/>
<el-input
v-model="scope.row.xm"
:disabled="!fyfxkzIsEdit"
/>
</template>
</el-table-column>
<el-table-column prop="zbgs" label="招标估算" width="180">
<el-table-column
prop="zbgs"
label="招标估算"
width="180"
>
<template #default="scope">
<el-input-number v-model="scope.row.zbgs" :min="0" :max="99999999999.99999999"
controls-position="right" :disabled="!fyfxkzIsEdit"
<el-input-number
v-model="scope.row.zbgs"
:min="0"
:max="99999999999.99999999"
controls-position="right"
:disabled="!fyfxkzIsEdit"
/>
</template>
</el-table-column>
<el-table-column prop="jcgs" label="决策估算" width="180">
<el-table-column
prop="jcgs"
label="决策估算"
width="180"
>
<template #default="scope">
<el-input-number v-model="scope.row.jcgs" :min="0" :max="99999999999.99999999"
controls-position="right" :disabled="!fyfxkzIsEdit"
<el-input-number
v-model="scope.row.jcgs"
:min="0"
:max="99999999999.99999999"
controls-position="right"
:disabled="!fyfxkzIsEdit"
/>
</template>
</el-table-column>
<el-table-column prop="pfgusuan" label="批复估算" width="180">
<el-table-column
prop="pfgusuan"
label="批复估算"
width="180"
>
<template #default="scope">
<el-input-number v-model="scope.row.pfgusuan" :min="0" :max="99999999999.99999999"
controls-position="right" :disabled="!fyfxkzIsEdit"
<el-input-number
v-model="scope.row.pfgusuan"
:min="0"
:max="99999999999.99999999"
controls-position="right"
:disabled="!fyfxkzIsEdit"
/>
</template>
</el-table-column>
<el-table-column prop="pfgs" label="批复概算" width="180">
<el-table-column
prop="pfgs"
label="批复概算"
width="180"
>
<template #default="scope">
<el-input-number v-model="scope.row.pfgs" :min="0" :max="99999999999.99999999"
controls-position="right" :disabled="!fyfxkzIsEdit"
<el-input-number
v-model="scope.row.pfgs"
:min="0"
:max="99999999999.99999999"
controls-position="right"
:disabled="!fyfxkzIsEdit"
/>
</template>
</el-table-column>
<el-table-column prop="tkjgs" label="同口径概算" width="180">
<el-table-column
prop="tkjgs"
label="同口径概算"
width="180"
>
<template #default="scope">
<el-input-number v-model="scope.row.tkjgs" :min="0" :max="99999999999.99999999"
controls-position="right" :disabled="!fyfxkzIsEdit"
<el-input-number
v-model="scope.row.tkjgs"
:min="0"
:max="99999999999.99999999"
controls-position="right"
:disabled="!fyfxkzIsEdit"
/>
</template>
</el-table-column>
<el-table-column prop="pfys" label="批复预算" width="180">
<el-table-column
prop="pfys"
label="批复预算"
width="180"
>
<template #default="scope">
<el-input-number v-model="scope.row.pfys" :min="0" :max="99999999999.99999999"
controls-position="right" :disabled="!fyfxkzIsEdit"
<el-input-number
v-model="scope.row.pfys"
:min="0"
:max="99999999999.99999999"
controls-position="right"
:disabled="!fyfxkzIsEdit"
/>
</template>
</el-table-column>
<el-table-column prop="zbqy" label="招标签约" width="180">
<el-table-column
prop="zbqy"
label="招标签约"
width="180"
>
<template #default="scope">
<el-input-number v-model="scope.row.zbqy" :min="0" :max="99999999999.99999999"
controls-position="right" :disabled="!fyfxkzIsEdit"
<el-input-number
v-model="scope.row.zbqy"
:min="0"
:max="99999999999.99999999"
controls-position="right"
:disabled="!fyfxkzIsEdit"
/>
</template>
</el-table-column>
<el-table-column prop="jgjssj" label="竣工决算审计" width="180">
<el-table-column
prop="jgjssj"
label="竣工决算审计"
width="180"
>
<template #default="scope">
<el-input-number v-model="scope.row.jgjssj" :min="0" :max="99999999999.99999999"
controls-position="right" :disabled="!fyfxkzIsEdit"
<el-input-number
v-model="scope.row.jgjssj"
:min="0"
:max="99999999999.99999999"
controls-position="right"
:disabled="!fyfxkzIsEdit"
/>
</template>
</el-table-column>
<el-table-column prop="sqyc" label="上期预测" width="180">
<el-table-column
prop="sqyc"
label="上期预测"
width="180"
>
<template #default="scope">
<el-input-number v-model="scope.row.sqyc" :min="0" :max="99999999999.99999999"
controls-position="right" :disabled="!fyfxkzIsEdit"
<el-input-number
v-model="scope.row.sqyc"
:min="0"
:max="99999999999.99999999"
controls-position="right"
:disabled="!fyfxkzIsEdit"
/>
</template>
</el-table-column>
<el-table-column prop="bqyc" label="本期预测" width="180">
<el-table-column
prop="bqyc"
label="本期预测"
width="180"
>
<template #default="scope">
<el-input-number v-model="scope.row.bqyc" :min="0" :max="99999999999.99999999"
controls-position="right" :disabled="!fyfxkzIsEdit"
<el-input-number
v-model="scope.row.bqyc"
:min="0"
:max="99999999999.99999999"
controls-position="right"
:disabled="!fyfxkzIsEdit"
/>
</template>
</el-table-column>
<el-table-column prop="bqjsq" label="本期-上期" width="180">
<el-table-column
prop="bqjsq"
label="本期-上期"
width="180"
>
<template #default="scope">
<el-input-number v-model="scope.row.bqjsq" :min="0" :max="99999999999.99999999"
controls-position="right" :disabled="!fyfxkzIsEdit"
<el-input-number
v-model="scope.row.bqjsq"
:min="0"
:max="99999999999.99999999"
controls-position="right"
:disabled="!fyfxkzIsEdit"
/>
</template>
</el-table-column>
<el-table-column prop="cysm" label="本期较上期差异原因说明" width="240">
<el-table-column
prop="cysm"
label="本期较上期差异原因说明"
width="240"
>
<template #default="scope">
<el-input v-model="scope.row.cysm" type="textarea" :disabled="!fyfxkzIsEdit" />
<el-input
v-model="scope.row.cysm"
type="textarea"
:disabled="!fyfxkzIsEdit"
/>
</template>
</el-table-column>
</el-table>
</el-col>
</el-row>
</el-collapse-item>
<el-collapse-item title="决策条件落实情况" name="决策条件落实情况">
<el-collapse-item
title="决策条件落实情况"
name="决策条件落实情况"
>
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="决策单位">
<el-select v-model="formData.jcdw" placeholder="请选择" no-data-text="暂无数据">
<el-option v-for="item in jcdwList" :key="item.key"
:label="item.name" :value="item.key"
<el-select
v-model="formData.jcdw"
placeholder="请选择"
no-data-text="暂无数据"
>
<el-option
v-for="item in jcdwList"
:key="item.key"
:label="item.name"
:value="item.key"
></el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="项目批复意见落实情况" :label-width="170"></el-form-item>
<el-form-item
label="项目批复意见落实情况"
:label-width="170"
></el-form-item>
<div class="tab-handle">
<el-button type="primary" size="small" @click="addPfyjlsqk">新增</el-button>
<el-button
type="primary"
size="small"
@click="addPfyjlsqk"
>新增</el-button
>
</div>
<el-table :data="pfyjlsqkData" style="width: 100%" empty-text="暂无数据" border>
<el-table
:data="pfyjlsqkData"
style="width: 100%"
empty-text="暂无数据"
border
>
<el-table-column type="index" width="60" />
<el-table-column prop="zyx" label="重要性" width="180">
<template #default="scope">
<el-input v-model="scope.row.zyx" />
</template>
</el-table-column>
<el-table-column prop="ssjd" label="实施阶段" width="180">
<el-table-column
prop="ssjd"
label="实施阶段"
width="180"
>
<template #default="scope">
<el-select v-model="scope.row.ssjd" placeholder="请选择" no-data-text="暂无数据">
<el-option v-for="item in ssjdList" :key="item.key"
:label="item.name" :value="item.key"
<el-select
v-model="scope.row.ssjd"
placeholder="请选择"
no-data-text="暂无数据"
>
<el-option
v-for="item in ssjdList"
:key="item.key"
:label="item.name"
:value="item.key"
></el-option>
</el-select>
</template>
</el-table-column>
<el-table-column prop="pfnr" label="批复内容" width="180">
<el-table-column
prop="pfnr"
label="批复内容"
width="180"
>
<template #default="scope">
<el-input v-model="scope.row.pfnr" type="textarea" />
<el-input
v-model="scope.row.pfnr"
type="textarea"
/>
</template>
</el-table-column>
<el-table-column prop="pfyjlsqkjtsm" label="批复意见落实情况具体说明" width="180">
<el-table-column
prop="pfyjlsqkjtsm"
label="批复意见落实情况具体说明"
width="180"
>
<template #default="scope">
<el-input v-model="scope.row.pfyjlsqkjtsm" type="textarea" />
<el-input
v-model="scope.row.pfyjlsqkjtsm"
type="textarea"
/>
</template>
</el-table-column>
<el-table-column prop="lszxqk" label="落实(执行)情况" width="180">
<el-table-column
prop="lszxqk"
label="落实(执行)情况"
width="180"
>
<template #default="scope">
<el-select v-model="scope.row.lszxqk" placeholder="请选择" no-data-text="暂无数据">
<el-option v-for="item in lsqkList" :key="item.key"
:label="item.name" :value="item.key"
<el-select
v-model="scope.row.lszxqk"
placeholder="请选择"
no-data-text="暂无数据"
>
<el-option
v-for="item in lsqkList"
:key="item.key"
:label="item.name"
:value="item.key"
></el-option>
</el-select>
</template>
</el-table-column>
<el-table-column prop="wlsyy" label="未落实原因" width="180">
<el-table-column
prop="wlsyy"
label="未落实原因"
width="180"
>
<template #default="scope">
<el-input v-model="scope.row.wlsyy" type="textarea" />
<el-input
v-model="scope.row.wlsyy"
type="textarea"
/>
</template>
</el-table-column>
<el-table-column prop="xybgzcs" label="下一步工作措施" width="180">
<el-table-column
prop="xybgzcs"
label="下一步工作措施"
width="180"
>
<template #default="scope">
<el-input v-model="scope.row.xybgzcs" type="textarea" />
<el-input
v-model="scope.row.xybgzcs"
type="textarea"
/>
</template>
</el-table-column>
<el-table-column prop="yjwcsj" label="预计完成时间" width="260">
<el-table-column
prop="yjwcsj"
label="预计完成时间"
width="260"
>
<template #default="scope">
<el-date-picker
v-model="scope.row.yjwcsj"
......@@ -239,17 +458,29 @@
/>
</template>
</el-table-column>
<el-table-column prop="zrld" label="责任领导" width="180">
<el-table-column
prop="zrld"
label="责任领导"
width="180"
>
<template #default="scope">
<el-input v-model="scope.row.zrld" />
</template>
</el-table-column>
<el-table-column prop="zrbmjzrr" label="责任部门及责任人" width="180">
<el-table-column
prop="zrbmjzrr"
label="责任部门及责任人"
width="180"
>
<template #default="scope">
<el-input v-model="scope.row.zrbmjzrr" />
</template>
</el-table-column>
<el-table-column prop="sfgx" label="是否更新" width="160">
<el-table-column
prop="sfgx"
label="是否更新"
width="160"
>
<template #default="scope">
<el-radio-group v-model="scope.row.sfgx">
<el-radio value="1"></el-radio>
......@@ -257,20 +488,35 @@
</el-radio-group>
</template>
</el-table-column>
<el-table-column label="文件上传" prop="wjsc" width="180">
<el-table-column
label="文件上传"
prop="wjsc"
width="180"
>
<template #default="scope">
<el-upload
v-if="!scope.row.wjsc"
:action="windowConfig.baseUrl + '/api/file/upload'"
:headers="{Authorization: token}"
:action="
windowConfig.baseUrl + '/api/file/upload'
"
:headers="{ Authorization: token }"
:show-file-list="false"
:on-success="(res, file) => addWjscFile(res, file, scope.row)"
:on-success="
(res, file) => addWjscFile(res, file, scope.row)
"
>
<el-button link type="primary">上传</el-button>
</el-upload>
<div class="upload-file-wrap" v-else>
<span class="file-name" @click="downloadFile(scope.row.wjsc)">{{ scope.row.wjsc.originalname }}</span>
<span class="delete-btn" @click="deleteWjscFile(scope.row, scope.$index)">
<span
class="file-name"
@click="downloadFile(scope.row.wjsc)"
>{{ scope.row.wjsc.originalname }}</span
>
<span
class="delete-btn"
@click="deleteWjscFile(scope.row, scope.$index)"
>
<el-icon><CloseBold /></el-icon>
</span>
</div>
......@@ -283,61 +529,120 @@
</el-table-column>
<el-table-column label="操作" width="60" fixed="right">
<template #default="scope">
<el-button link type="danger" size="small" @click="deletePfyjlsqk(scope.$index)">删除</el-button>
<el-button
link
type="danger"
size="small"
@click="deletePfyjlsqk(scope.$index)"
>删除</el-button
>
</template>
</el-table-column>
</el-table>
</el-col>
</el-row>
</el-collapse-item>
<el-collapse-item title="其他建设目标重大偏差" name="其他建设目标重大偏差">
<el-collapse-item
title="其他建设目标重大偏差"
name="其他建设目标重大偏差"
>
<el-row :gutter="20">
<el-col :span="24">
<el-form-item label="工期" :label-width="50"></el-form-item>
<el-form-item
label="工期"
:label-width="50"
></el-form-item>
<div class="tab-handle">
<el-button type="primary" size="small" @click="addGq">新增</el-button>
<el-button type="primary" size="small" @click="addGq"
>新增</el-button
>
</div>
<el-table :data="gqData" style="width: 100%" empty-text="暂无数据" border>
<el-table
:data="gqData"
style="width: 100%"
empty-text="暂无数据"
border
>
<el-table-column type="index" width="60" />
<el-table-column label="监理开工令上传" prop="jlkglsc" width="180">
<el-table-column
label="监理开工令上传"
prop="jlkglsc"
width="180"
>
<template #default="scope">
<el-upload
v-if="!scope.row.jlkglsc"
:action="windowConfig.baseUrl + '/api/file/upload'"
:headers="{Authorization: token}"
:action="
windowConfig.baseUrl + '/api/file/upload'
"
:headers="{ Authorization: token }"
:show-file-list="false"
:on-success="(res, file) => addJlkglFile(res, file, scope.row)"
:on-success="
(res, file) =>
addJlkglFile(res, file, scope.row)
"
>
<el-button link type="primary">上传</el-button>
</el-upload>
<div class="upload-file-wrap" v-else>
<span class="file-name" @click="downloadFile(scope.row.jlkglsc)">{{ scope.row.jlkglsc.originalname }}</span>
<span class="delete-btn" @click="deleteJlkglFile(scope.row, scope.$index)">
<span
class="file-name"
@click="downloadFile(scope.row.jlkglsc)"
>{{ scope.row.jlkglsc.originalname }}</span
>
<span
class="delete-btn"
@click="
deleteJlkglFile(scope.row, scope.$index)
"
>
<el-icon><CloseBold /></el-icon>
</span>
</div>
</template>
</el-table-column>
<el-table-column label="行业主管部门施工许可证上传" prop="sgxkzsc" width="180">
<el-table-column
label="行业主管部门施工许可证上传"
prop="sgxkzsc"
width="180"
>
<template #default="scope">
<el-upload
v-if="!scope.row.sgxkzsc"
:action="windowConfig.baseUrl + '/api/file/upload'"
:headers="{Authorization: token}"
:action="
windowConfig.baseUrl + '/api/file/upload'
"
:headers="{ Authorization: token }"
:show-file-list="false"
:on-success="(res, file) => addSgxkzFile(res, file, scope.row)"
:on-success="
(res, file) =>
addSgxkzFile(res, file, scope.row)
"
>
<el-button link type="primary">上传</el-button>
</el-upload>
<div class="upload-file-wrap" v-else>
<span class="file-name" @click="downloadFile(scope.row.sgxkzsc)">{{ scope.row.sgxkzsc.originalname }}</span>
<span class="delete-btn" @click="deleteSgxkzFile(scope.row, scope.$index)">
<span
class="file-name"
@click="downloadFile(scope.row.sgxkzsc)"
>{{ scope.row.sgxkzsc.originalname }}</span
>
<span
class="delete-btn"
@click="
deleteSgxkzFile(scope.row, scope.$index)
"
>
<el-icon><CloseBold /></el-icon>
</span>
</div>
</template>
</el-table-column>
<el-table-column prop="kglsj" label="监理开工令开工时间" width="260">
<el-table-column
prop="kglsj"
label="监理开工令开工时间"
width="260"
>
<template #default="scope">
<el-date-picker
v-model="scope.row.kglsj"
......@@ -347,7 +652,11 @@
/>
</template>
</el-table-column>
<el-table-column prop="sgxksj" label="施工许可时间" width="260">
<el-table-column
prop="sgxksj"
label="施工许可时间"
width="260"
>
<template #default="scope">
<el-date-picker
v-model="scope.row.sgxksj"
......@@ -357,7 +666,11 @@
/>
</template>
</el-table-column>
<el-table-column prop="yjsjwgsj" label="预计/实际完成时间" width="260">
<el-table-column
prop="yjsjwgsj"
label="预计/实际完成时间"
width="260"
>
<template #default="scope">
<el-date-picker
v-model="scope.row.yjsjwgsj"
......@@ -367,50 +680,103 @@
/>
</template>
</el-table-column>
<el-table-column prop="htgqydms" label="合同工期约定描述" width="180">
<el-table-column
prop="htgqydms"
label="合同工期约定描述"
width="180"
>
<template #default="scope">
<el-input v-model="scope.row.htgqydms" type="textarea" />
<el-input
v-model="scope.row.htgqydms"
type="textarea"
/>
</template>
</el-table-column>
<el-table-column prop="gqywsm" label="工期延误说明" width="180">
<el-table-column
prop="gqywsm"
label="工期延误说明"
width="180"
>
<template #default="scope">
<el-input v-model="scope.row.gqywsm" type="textarea" />
<el-input
v-model="scope.row.gqywsm"
type="textarea"
/>
</template>
</el-table-column>
<el-table-column prop="gqtqsm" label="工期提前说明" width="180">
<el-table-column
prop="gqtqsm"
label="工期提前说明"
width="180"
>
<template #default="scope">
<el-input v-model="scope.row.gqtqsm" type="textarea" />
<el-input
v-model="scope.row.gqtqsm"
type="textarea"
/>
</template>
</el-table-column>
<el-table-column label="操作" width="60" fixed="right">
<template #default="scope">
<el-button link type="danger" size="small" @click="deleteGq(scope.$index)">删除</el-button>
<el-button
link
type="danger"
size="small"
@click="deleteGq(scope.$index)"
>删除</el-button
>
</template>
</el-table-column>
</el-table>
</el-col>
<el-col :span="24">
<el-form-item label="安全质量环保" :label-width="100"></el-form-item>
<el-form-item
label="安全质量环保"
:label-width="100"
></el-form-item>
<div class="tab-handle">
<el-button type="primary" size="small" @click="addAqzlhb">新增</el-button>
<el-button
type="primary"
size="small"
@click="addAqzlhb"
>新增</el-button
>
</div>
<el-table :data="aqzlhbData" style="width: 100%" empty-text="暂无数据" border>
<el-table
:data="aqzlhbData"
style="width: 100%"
empty-text="暂无数据"
border
>
<el-table-column type="index" width="60" />
<el-table-column prop="jlkglsc" label="目标描述">
<template #default="scope">
<el-input v-model="scope.row.jlkglsc" type="textarea" />
<el-input
v-model="scope.row.jlkglsc"
type="textarea"
/>
</template>
</el-table-column>
<el-table-column prop="ly" label="来源">
<template #default="scope">
<el-select v-model="scope.row.ly" placeholder="请选择" no-data-text="暂无数据">
<el-option v-for="item in lyList" :key="item.key"
:label="item.name" :value="item.key"
<el-select
v-model="scope.row.ly"
placeholder="请选择"
no-data-text="暂无数据"
>
<el-option
v-for="item in lyList"
:key="item.key"
:label="item.name"
:value="item.key"
></el-option>
</el-select>
</template>
</el-table-column>
<el-table-column prop="sffsaqzlhbwt" label="是否发生安全质量环保问题被行政处罚">
<el-table-column
prop="sffsaqzlhbwt"
label="是否发生安全质量环保问题被行政处罚"
>
<template #default="scope">
<el-radio-group v-model="scope.row.sffsaqzlhbwt">
<el-radio value="1"></el-radio>
......@@ -420,53 +786,57 @@
</el-table-column>
<el-table-column label="操作" width="60" fixed="right">
<template #default="scope">
<el-button link type="danger" size="small" @click="deleteAqzlhb(scope.$index)">删除</el-button>
<el-button
link
type="danger"
size="small"
@click="deleteAqzlhb(scope.$index)"
>删除</el-button
>
</template>
</el-table-column>
</el-table>
</el-col>
<el-col :span="24">
<el-col :span="24" class="fileCla">
<el-form-item label="文件上传">
<el-upload
<FileUploader
v-model="formData.qtjsmbzdpc"
></FileUploader>
</el-form-item>
<!-- <el-upload
:action="windowConfig.baseUrl + '/api/file/upload'"
:headers="{Authorization: token}"
:headers="{ Authorization: token }"
:show-file-list="false"
multiple
:on-success="addMbpcFile"
>
<el-button type="default">上传</el-button>
</el-upload>
<el-button type="default" @click="multiDeleteMbpc" :disabled="!mbpcSelectIds.length">删除选中文件</el-button>
</el-form-item>
<el-table :data="mbpcData" style="width: 100%" empty-text="暂无数据" border
@selection-change="mbpcSelectionChange"
>
<el-table-column type="selection" width="55" />
<el-table-column prop="originalname" label="文件名" />
<el-table-column prop="updatedAt" label="上传时间">
<template #default="{ row, index }">
<span>{{ moment(row.updatedAt).format("YYYY-MM-DD HH:mm:SS") }}</span>
</template>
</el-table-column>
<el-table-column prop="size" label="大小" />
<el-table-column fixed="right" label="操作" width="100">
<template #default="{ row, index }">
<!-- 需要在查看表单disabled时保持允许下载 -->
<span class="always-click" @click="downloadFile(row)">下载</span>
<el-button link type="danger" size="small" @click="deleteMbpc(index)">删除</el-button>
</template>
</el-table-column>
</el-table>
<el-button
type="default"
@click="multiDeleteMbpc"
:disabled="!mbpcSelectIds.length"
>删除选中文件</el-button
> -->
</el-col>
</el-row>
</el-collapse-item>
<el-collapse-item title="投资收益" name="投资收益">
<el-row :gutter="20">
<el-col :span="24">
<el-form-item label="财务评价主要边界条件变化对比表" :label-width="230"></el-form-item>
<el-table :data="cwpjData" style="width: 100%" empty-text="暂无数据" border height="500">
<el-form-item
label="财务评价主要边界条件变化对比表"
:label-width="230"
></el-form-item>
<el-table
:data="cwpjData"
style="width: 100%"
empty-text="暂无数据"
border
height="500"
>
<el-table-column type="index" label="序号" width="60" />
<el-table-column prop="bjtj" label="边界条件"/>
<el-table-column prop="bjtj" label="边界条件" />
<el-table-column prop="jc" label="决策">
<template #default="scope">
<el-input v-model="scope.row.jc" />
......@@ -479,14 +849,26 @@
</el-table-column>
<el-table-column prop="zycysm" label="主要差异说明">
<template #default="scope">
<el-input v-model="scope.row.zycysm" type="textarea" />
<el-input
v-model="scope.row.zycysm"
type="textarea"
/>
</template>
</el-table-column>
</el-table>
</el-col>
<el-col :span="24">
<el-form-item label="投资收益指标变化对比表" :label-width="170"></el-form-item>
<el-table :data="tzsyData" style="width: 100%" empty-text="暂无数据" border height="500">
<el-form-item
label="投资收益指标变化对比表"
:label-width="170"
></el-form-item>
<el-table
:data="tzsyData"
style="width: 100%"
empty-text="暂无数据"
border
height="500"
>
<el-table-column type="index" label="序号" width="60" />
<el-table-column prop="pjzb" label="评价指标" />
<el-table-column prop="jczb" label="决策指标">
......@@ -512,97 +894,103 @@
</div>
</template>
<script setup>
import { reactive, ref, onMounted, getCurrentInstance, h } from "vue";
import { useRouter, useRoute } from "vue-router";
import { ElMessage, ElMessageBox } from "element-plus";
import { useUserStore } from "@/stores/user.js";
const userStore = useUserStore();
const router = useRouter();
const route = useRoute();
const { proxy } = getCurrentInstance();
let token = ref("");
token.value = userStore.authToken || sessionStorage.getItem("authToken") || "";
import { reactive, ref, onMounted, getCurrentInstance } from "vue";
import { useRouter, useRoute } from "vue-router";
import { ElMessage, ElMessageBox } from "element-plus";
import FileUploader from "@/components/FileUploader/index.vue";
const activeCollapse = reactive([
"投资额控制", "费用分项控制、阶段对比表", "决策条件落实情况", "其他建设目标重大偏差", "投资收益"
]);
let formData = reactive({});
let loading = ref(false);
import { useUserStore } from "@/stores/user.js";
const userStore = useUserStore();
const router = useRouter();
const route = useRoute();
const { proxy } = getCurrentInstance();
let token = ref("");
token.value = userStore.authToken || sessionStorage.getItem("authToken") || "";
// 项目列表
let projectList = ref([]);
const getProjectData = () => {
const activeCollapse = reactive([
"投资额控制",
"费用分项控制、阶段对比表",
"决策条件落实情况",
"其他建设目标重大偏差",
"投资收益",
]);
let formData = reactive({});
let loading = ref(false);
// 项目列表
let projectList = ref([]);
const getProjectData = () => {
proxy.$post({
url: "/api/project/listProject",
data: {
page: 1,
pagesize: 1000,
attributes: [],
menuType: "xmjc"
menuType: "xmjc",
},
callback: (data) => {
projectList.value = data.rows;
}
})
};
// 费用分项控制、阶段对比表
const fyfxkzFormData = reactive({});
let rangeList = ref([]); // 往期列表
const selectRange = ref(""); // 选择查看往期数据
const fyfxkzDefaultData = [
},
});
};
// 费用分项控制、阶段对比表
const fyfxkzFormData = reactive({});
let rangeList = ref([]); // 往期列表
const selectRange = ref(""); // 选择查看往期数据
const fyfxkzDefaultData = [
{
xm: "建筑安装工程费"
xm: "建筑安装工程费",
},
{
xm: "土地使用及拆迁补偿费"
xm: "土地使用及拆迁补偿费",
},
{
xm: "项目建设其他费"
xm: "项目建设其他费",
},
{
xm: "建设单位管理费"
xm: "建设单位管理费",
},
{
xm: "信息化费"
xm: "信息化费",
},
{
xm: "监理费"
xm: "监理费",
},
{
xm: "预备费"
xm: "预备费",
},
{
xm: "建设期贷款利息"
xm: "建设期贷款利息",
},
{
xm: "新增费用"
xm: "新增费用",
},
{
xm: "合计"
}
];
let fyfxkzData = ref([]);
let fyfxkzIsEdit = ref(false);
xm: "合计",
},
];
let fyfxkzData = ref([]);
let fyfxkzIsEdit = ref(false);
let isPreview = !!route.query.isPreview;
let controlId = route.query.controlId;
const getControlInfo = () => {
let isPreview = !!route.query.isPreview;
let controlId = route.query.controlId;
const getControlInfo = () => {
loading.value = true;
proxy.$post({
url: "/api/project/getTzkzInfo",
data: {
id: controlId
id: controlId,
},
callback: (res) => {
loading.value = false;
Object.assign(formData, res);
if (res.tzkztzekzs && res.tzkztzekzs.length) {
rangeList.value = res.tzkztzekzs.map(item => {
rangeList.value = res.tzkztzekzs.map((item) => {
return {
...item,
bqsj: proxy.moment(item.bqsj).format("YYYY-MM"),
sqsj: proxy.moment(item.sqsj).format("YYYY-MM")
}
sqsj: proxy.moment(item.sqsj).format("YYYY-MM"),
};
});
selectRange.value = res.tzkztzekzs[0].key;
fyfxkzData.value = res.tzkztzekzs[0].tables;
......@@ -610,18 +998,17 @@
Object.assign(pfyjlsqkData.value, res.tzkzjcpfyjs);
Object.assign(gqData.value, res.tzkzgqs);
Object.assign(aqzlhbData.value, res.tzkzaqzlhbs);
Object.assign(mbpcData.value, res.qtjsmbzdpc);
Object.assign(cwpjData.value, res.tzkzcwpjs);
Object.assign(tzsyData.value, res.tzkztzsys);
}
},
});
};
let ssjdList = reactive([]);
let jcdwList = reactive([]);
let lsqkList = reactive([]);
let lyList = reactive([]); // 安全质量环保-来源列表
};
let ssjdList = reactive([]);
let jcdwList = reactive([]);
let lsqkList = reactive([]);
let lyList = reactive([]); // 安全质量环保-来源列表
onMounted(() => {
onMounted(() => {
getProjectData();
let resourceData = JSON.parse(sessionStorage.getItem("resourceData"));
ssjdList = resourceData.ssjd;
......@@ -635,43 +1022,45 @@
fyfxkzData.value = JSON.parse(JSON.stringify(fyfxkzDefaultData));
fyfxkzIsEdit.value = true;
}
});
// 新增费用分项控制、阶段对比表
const addFyfxkz = () => {
});
// 新增费用分项控制、阶段对比表
const addFyfxkz = () => {
selectRange.value = "";
fyfxkzIsEdit.value = true;
fyfxkzData.value = JSON.parse(JSON.stringify(fyfxkzDefaultData));
};
const editFyfxkz = () => {
};
const editFyfxkz = () => {
fyfxkzIsEdit.value = true;
let selectData = rangeList.value.filter(item => item.key === selectRange.value);
let selectData = rangeList.value.filter(
(item) => item.key === selectRange.value,
);
fyfxkzFormData.bqsj = selectData[0].bqsj;
fyfxkzFormData.sqsj = selectData[0].sqsj;
};
const saveFyfxkz = () => {
};
const saveFyfxkz = () => {
if (fyfxkzFormData.bqsj && fyfxkzFormData.sqsj) {
if (selectRange.value) {
rangeList.value = rangeList.value.map(item => {
rangeList.value = rangeList.value.map((item) => {
if (item.key === selectRange.value) {
selectRange.value = fyfxkzFormData.bqsj + "至" + fyfxkzFormData.sqsj;
return {
bqsj: fyfxkzFormData.bqsj,
sqsj: fyfxkzFormData.sqsj,
key: fyfxkzFormData.bqsj + "至" + fyfxkzFormData.sqsj,
tables: fyfxkzData.value
}
tables: fyfxkzData.value,
};
} else {
return {
...item
...item,
};
}
})
});
} else {
rangeList.value.push({
bqsj: fyfxkzFormData.bqsj,
sqsj: fyfxkzFormData.sqsj,
key: fyfxkzFormData.bqsj + "至" + fyfxkzFormData.sqsj,
tables: fyfxkzData.value
tables: fyfxkzData.value,
});
}
fyfxkzIsEdit.value = false;
......@@ -679,14 +1068,16 @@
selectRange.value = rangeList.value[0].key;
fyfxkzData.value = rangeList.value[0].tables;
} else {
let selectData = rangeList.value.filter(item => item.key === selectRange.value);
let selectData = rangeList.value.filter(
(item) => item.key === selectRange.value,
);
fyfxkzData.value = selectData.length ? selectData[0].tables : [];
}
} else {
ElMessage.warning("请补充本期及上期时间");
}
}
const cancelFyfxkz = () => {
};
const cancelFyfxkz = () => {
if (selectRange.value) {
fyfxkzData.value = rangeList.value[0].tables;
} else if (formData.id) {
......@@ -695,212 +1086,220 @@
fyfxkzData.value = JSON.parse(JSON.stringify(fyfxkzDefaultData));
}
fyfxkzIsEdit.value = false;
}
const changeRange = (val) => {
fyfxkzData.value = rangeList.value.filter(item => item.key === val)[0].tables;
};
};
const changeRange = (val) => {
fyfxkzData.value = rangeList.value.filter(
(item) => item.key === val,
)[0].tables;
};
// 项目批复意见落实情况
let pfyjlsqkData = ref([]);
const addPfyjlsqk = () => {
// 项目批复意见落实情况
let pfyjlsqkData = ref([]);
const addPfyjlsqk = () => {
pfyjlsqkData.value.push({});
};
const addWjscFile = (res, file, row) => {
};
const addWjscFile = (res, file, row) => {
row.wjsc = {};
Object.assign(row.wjsc, res.data);
};
const deleteWjscFile = (row, index) => {
let {wjsc, ...data} = row;
};
const deleteWjscFile = (row, index) => {
let { wjsc, ...data } = row;
pfyjlsqkData.value[index] = data;
};
const deletePfyjlsqk = (index) => {
ElMessageBox.confirm("确认删除该项?", "提示",{
confirmButtonText: '确认',
cancelButtonText: '取消',
type: 'warning',
};
const deletePfyjlsqk = (index) => {
ElMessageBox.confirm("确认删除该项?", "提示", {
confirmButtonText: "确认",
cancelButtonText: "取消",
type: "warning",
}).then(() => {
pfyjlsqkData.value.splice(index, 1);
})
}
});
};
// 其他建设目标重大偏差
//-工期
let gqData = ref([]);
const addGq = () => {
// 其他建设目标重大偏差
//-工期
let gqData = ref([]);
const addGq = () => {
gqData.value.push({});
};
// --监理开工令上传
const addJlkglFile = (res, file, row) => {
};
// --监理开工令上传
const addJlkglFile = (res, file, row) => {
row.jlkglsc = {};
Object.assign(row.jlkglsc, res.data);
};
const deleteJlkglFile = (row, index) => {
let {wjsc, ...data} = row;
};
const deleteJlkglFile = (row, index) => {
let { wjsc, ...data } = row;
gqData.value[index] = data;
};
// --行业主管部门施工许可证上传
const addSgxkzFile = (res, file, row) => {
};
// --行业主管部门施工许可证上传
const addSgxkzFile = (res, file, row) => {
row.sgxkzsc = {};
Object.assign(row.sgxkzsc, res.data);
};
const deleteSgxkzFile = (row, index) => {
let {wjsc, ...data} = row;
};
const deleteSgxkzFile = (row, index) => {
let { wjsc, ...data } = row;
gqData.value[index] = data;
};
const deleteGq = (index) => {
ElMessageBox.confirm("确认删除该项?", "提示",{
confirmButtonText: '确认',
cancelButtonText: '取消',
type: 'warning',
};
const deleteGq = (index) => {
ElMessageBox.confirm("确认删除该项?", "提示", {
confirmButtonText: "确认",
cancelButtonText: "取消",
type: "warning",
}).then(() => {
gqData.value.splice(index, 1);
})
}
// -安全质量环保
let aqzlhbData = ref([]);
const addAqzlhb = () => {
});
};
// -安全质量环保
let aqzlhbData = ref([]);
const addAqzlhb = () => {
aqzlhbData.value.push({});
};
const deleteAqzlhb = (index) => {
ElMessageBox.confirm("确认删除该项?", "提示",{
confirmButtonText: '确认',
cancelButtonText: '取消',
type: 'warning',
};
const deleteAqzlhb = (index) => {
ElMessageBox.confirm("确认删除该项?", "提示", {
confirmButtonText: "确认",
cancelButtonText: "取消",
type: "warning",
}).then(() => {
aqzlhbData.value.splice(index, 1);
})
}
});
};
// -文件上传
let mbpcData = ref([]);
const addMbpcFile = (res, file) => {
// -文件上传
let mbpcData = ref([]);
const addMbpcFile = (res, file) => {
mbpcData.value.push(res.data);
}
const deleteMbpc = (index) => {
ElMessageBox.confirm("确认删除该项?", "提示",{
confirmButtonText: '确认',
cancelButtonText: '取消',
type: 'warning',
}).then(() => {
};
const deleteMbpc = (index) => {
ElMessageBox.confirm("确认删除该项?", "提示", {
confirmButtonText: "确认",
cancelButtonText: "取消",
type: "warning",
})
.then(() => {
mbpcData.value.splice(index, 1);
}).catch(() => {})
}
let mbpcSelectIds = ref([]);
const mbpcSelectionChange = (datas) => {
mbpcSelectIds.value = datas.map(item => item.id);
};
const multiDeleteMbpc = () => {
ElMessageBox.confirm("确认删除选中数据?", "提示",{
confirmButtonText: '确认',
cancelButtonText: '取消',
type: 'warning',
}).then(() => {
mbpcData.value = mbpcData.value.filter(item => !mbpcSelectIds.value.includes(item.id));
}).catch(() => {})
};
})
.catch(() => {});
};
let mbpcSelectIds = ref([]);
const mbpcSelectionChange = (datas) => {
mbpcSelectIds.value = datas.map((item) => item.id);
};
const multiDeleteMbpc = () => {
ElMessageBox.confirm("确认删除选中数据?", "提示", {
confirmButtonText: "确认",
cancelButtonText: "取消",
type: "warning",
})
.then(() => {
mbpcData.value = mbpcData.value.filter(
(item) => !mbpcSelectIds.value.includes(item.id),
);
})
.catch(() => {});
};
// 下载已上传文件
const downloadFile = (data) => {
// 下载已上传文件
const downloadFile = (data) => {
let a = document.createElement("a");
a.href = `${proxy.windowConfig.baseUrl}/api/file/download/${data.id}`;
a.download = data.originalname;
document.body.appendChild(a);
a.click();
a.remove();
};
};
// 财务评价主要边界条件变化对比表
const cwpjData = ref([
// 财务评价主要边界条件变化对比表
const cwpjData = ref([
{
bjtj: "项目总投资(万元)"
bjtj: "项目总投资(万元)",
},
{
bjtj: "项目资本金(万元)"
bjtj: "项目资本金(万元)",
},
{
bjtj: "我方出资(万元)"
bjtj: "我方出资(万元)",
},
{
bjtj: "政府方出资(万元)"
bjtj: "政府方出资(万元)",
},
{
bjtj: "项目融资(万元)"
bjtj: "项目融资(万元)",
},
{
bjtj: "年度投资比例"
bjtj: "年度投资比例",
},
{
bjtj: "合作年限"
bjtj: "合作年限",
},
{
bjtj: "长期贷款利率"
bjtj: "长期贷款利率",
},
{
bjtj: "债务偿还方式"
bjtj: "债务偿还方式",
},
{
bjtj: "项目收入(亿元)"
bjtj: "项目收入(亿元)",
},
{
bjtj: "通行费收入(亿元)"
bjtj: "通行费收入(亿元)",
},
{
bjtj: "其他收入(亿元)"
bjtj: "其他收入(亿元)",
},
{
bjtj: "运营期补助收入(亿元)"
bjtj: "运营期补助收入(亿元)",
},
{
bjtj: "经营成本(亿元)"
bjtj: "经营成本(亿元)",
},
{
bjtj: "税率"
bjtj: "税率",
},
{
bjtj: "折旧摊销方式"
}
]);
// 投资收益指标变化对比表
const tzsyData = ref([
bjtj: "折旧摊销方式",
},
]);
// 投资收益指标变化对比表
const tzsyData = ref([
{
pjzb: "项目全投资内部收益率"
pjzb: "项目全投资内部收益率",
},
{
pjzb: "项目资本金内部收益率"
pjzb: "项目资本金内部收益率",
},
{
pjzb: "社会资本方内部收益率"
pjzb: "社会资本方内部收益率",
},
{
pjzb: "资本金综合内部收益率"
pjzb: "资本金综合内部收益率",
},
{
pjzb: "静态投资回收期(年)"
pjzb: "静态投资回收期(年)",
},
{
pjzb: "累计净现金流(亿元)"
pjzb: "累计净现金流(亿元)",
},
{
pjzb: "静态投资回收期(年)"
pjzb: "静态投资回收期(年)",
},
{
pjzb: "累计净现金流(亿元)"
pjzb: "累计净现金流(亿元)",
},
{
pjzb: "现金流平衡年"
pjzb: "现金流平衡年",
},
{
pjzb: "盈亏平衡年"
pjzb: "盈亏平衡年",
},
{
pjzb: "可供分配利润转正年"
}
]);
pjzb: "可供分配利润转正年",
},
]);
const backClick = () => {
router.back(-1)
}
const saveClick = () => {
const backClick = () => {
router.back(-1);
};
const saveClick = () => {
if (!formData.projectId) {
return ElMessage.warning("请选择项目信息");
}
......@@ -908,7 +1307,9 @@
return ElMessage.warning("请先保存正在添加的费用分项控制、阶段对比表");
}
let url = formData.id ? "updateTzkz" : "createTzkz";
let project = projectList.value.filter(item => item.id === formData.projectId)[0];
let project = projectList.value.filter(
(item) => item.id === formData.projectId,
)[0];
proxy.$post({
url: "/api/project/" + url,
data: {
......@@ -918,21 +1319,28 @@
tzkzjcpfyjs: pfyjlsqkData.value,
tzkzgqs: gqData.value,
tzkzaqzlhbs: aqzlhbData.value,
qtjsmbzdpc: mbpcData.value,
tzkzcwpjs: cwpjData.value,
tzkztzsys: tzsyData.value
tzkztzsys: tzsyData.value,
},
callback: (data) => {
router.back(-1)
}
router.back(-1);
},
});
}
};
</script>
<style lang="less">
@import "@/styles/manage.less";
.add-project-header{
margin-bottom: 10px;
.fileCla {
.el-form-item {
display: block !important;
.el-form-item__label {
margin-bottom: 16px;
}
}
}
@import "@/styles/manage.less";
.add-project-header {
margin-bottom: 10px;
}
</style>
......@@ -15,9 +15,16 @@
<el-tab-pane label="全生命周期责任书" name="全生命周期责任书">
<div class="project-tab-content">
<div class="tab-content">
<el-form :model="formData" :label-width="130" :disabled="isPreview">
<el-form
:model="formData"
:label-width="130"
:disabled="isPreview"
>
<el-collapse v-model="activeCollapse">
<el-collapse-item title="责任书基本信息" name="责任书基本信息">
<el-collapse-item
title="责任书基本信息"
name="责任书基本信息"
>
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="责任书类型">
......@@ -38,11 +45,17 @@
</el-col>
<el-col :span="12">
<el-form-item label="项目信息" required>
<el-select v-model="formData.projectId" placeholder="请选择" no-data-text="暂无数据"
<el-select
v-model="formData.projectId"
placeholder="请选择"
no-data-text="暂无数据"
@change="changeProject"
>
<el-option v-for="item in projectList" :key="item.id"
:label="item.projectName" :value="item.id"
<el-option
v-for="item in projectList"
:key="item.id"
:label="item.projectName"
:value="item.id"
></el-option>
</el-select>
</el-form-item>
......@@ -50,33 +63,73 @@
<el-col :span="24">
<el-form-item label="责任书文件">
<el-upload
:action="windowConfig.baseUrl + '/api/file/upload'"
:headers="{Authorization: token}"
:action="
windowConfig.baseUrl + '/api/file/upload'
"
:headers="{ Authorization: token }"
:show-file-list="false"
multiple
:on-success="addZrsFile"
>
<el-button type="default">上传</el-button>
</el-upload>
<el-button type="default" @click="multiDeleteZrs" :disabled="!zrsSelectIds.length">删除选中文件</el-button>
<el-button
type="default"
@click="multiDeleteZrs"
:disabled="!zrsSelectIds.length"
>删除选中文件</el-button
>
</el-form-item>
<el-form-item label="">
<el-table :data="zrsData" style="width: 100%" empty-text="暂无数据" border
<el-table
:data="zrsData"
style="width: 100%"
empty-text="暂无数据"
border
@selection-change="zrsSelectionChange"
>
<el-table-column type="selection" width="55" />
<el-table-column prop="originalname" label="文件名" />
<el-table-column prop="updatedAt" label="上传时间">
<el-table-column
prop="originalname"
label="文件名"
/>
<el-table-column
prop="updatedAt"
label="上传时间"
>
<template #default="{ row, index }">
<span>{{ moment(row.updatedAt).format("YYYY-MM-DD HH:mm:SS") }}</span>
<span>{{
moment(row.updatedAt).format(
"YYYY-MM-DD HH:mm:SS",
)
}}</span>
</template>
</el-table-column>
<el-table-column prop="size" label="大小" />
<el-table-column fixed="right" label="操作" width="100">
<el-table-column prop="size" label="大小">
<template #default="{ row }">
<span>{{ row.size }} MB</span>
</template>
</el-table-column>
<el-table-column
fixed="right"
label="操作"
width="100"
>
<template #default="{ row, index }">
<!-- 需要在查看表单disabled时保持允许下载 -->
<span class="always-click" @click="downloadFile(row)">下载</span>
<el-button link type="danger" size="small" @click="deleteZrs(index)">删除</el-button>
<span
class="always-click"
@click="downloadFile(row)"
>下载</span
>
<el-button
link
type="danger"
size="small"
@click="deleteZrs(index)"
>删除</el-button
>
</template>
</el-table-column>
</el-table>
......@@ -108,7 +161,10 @@
</el-col>
<el-col :span="8">
<el-form-item label="项目实施期限">
<el-input-number v-model="formData.xmssqx" :min="0" :max="99999999999.99999999"
<el-input-number
v-model="formData.xmssqx"
:min="0"
:max="99999999999.99999999"
controls-position="right"
></el-input-number>
......@@ -116,88 +172,157 @@
</el-col>
<el-col :span="12">
<el-form-item label="项目内容概述">
<el-input v-model="formData.xmnrgs" type="textarea"
:autosize="{minRows: 2, maxRows: 5}"
<el-input
v-model="formData.xmnrgs"
type="textarea"
:autosize="{ minRows: 2, maxRows: 5 }"
/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="项目经济指标概述">
<el-input v-model="formData.xmjjzbgs" type="textarea"
:autosize="{minRows: 2, maxRows: 5}"
<el-input
v-model="formData.xmjjzbgs"
type="textarea"
:autosize="{ minRows: 2, maxRows: 5 }"
/>
</el-form-item>
</el-col>
</el-row>
</el-collapse-item>
<el-collapse-item title="责任书具体指标" name="责任书具体指标">
<el-table :data="zrsjtzbData" style="width: 100%" empty-text="暂无数据" border
show-summary :summary-method="getSummaries"
<el-collapse-item
title="责任书具体指标"
name="责任书具体指标"
>
<el-table
:data="zrsjtzbData"
style="width: 100%"
empty-text="暂无数据"
border
show-summary
:summary-method="getSummaries"
>
<el-table-column type="index" label="序号" width="60" />
<el-table-column prop="zbmc" label="指标名称" />
<el-table-column prop="zbmbz" label="指标目标值" width="180">
<el-table-column
prop="zbmbz"
label="指标目标值"
width="180"
>
<template #default="scope">
<el-input-number v-model="scope.row.zbmbz" :min="0" :max="99999999999.99999999"
<el-input-number
v-model="scope.row.zbmbz"
:min="0"
:max="99999999999.99999999"
controls-position="right"
/>
</template>
</el-table-column>
<el-table-column prop="khjzf" label="考核基准分" width="180">
<el-table-column
prop="khjzf"
label="考核基准分"
width="180"
>
<template #default="scope">
<el-input-number v-model="scope.row.khjzf" :min="0" :max="99999999999.99999999"
<el-input-number
v-model="scope.row.khjzf"
:min="0"
:max="99999999999.99999999"
controls-position="right"
/>
</template>
</el-table-column>
<el-table-column prop="sfsy" label="是否适用" width="90">
<el-table-column
prop="sfsy"
label="是否适用"
width="90"
>
<template #default="scope">
<el-switch
v-model="scope.row.sfsy" inline-prompt
active-value="1" active-text="是"
inactive-value="2" inactive-text="否"
v-model="scope.row.sfsy"
inline-prompt
active-value="1"
active-text="是"
inactive-value="2"
inactive-text="否"
/>
</template>
</el-table-column>
<el-table-column prop="khsm" label="考核说明">
<template #default="scope">
<el-input v-model="scope.row.khsm" type="textarea" />
<el-input
v-model="scope.row.khsm"
type="textarea"
/>
</template>
</el-table-column>
</el-table>
</el-collapse-item>
<el-collapse-item title="批复意见落实情况" name="批复意见落实情况">
<el-collapse-item
title="批复意见落实情况"
name="批复意见落实情况"
>
<div class="tab-handle">
<el-button type="primary" size="small" @click="addPfyjlsqk">新增</el-button>
<el-button
type="primary"
size="small"
@click="addPfyjlsqk"
>新增</el-button
>
</div>
<el-table :data="pfyjlsqkData" style="width: 100%" empty-text="暂无数据" border>
<el-table
:data="pfyjlsqkData"
style="width: 100%"
empty-text="暂无数据"
border
>
<el-table-column type="index" width="60" />
<el-table-column prop="lx" label="类型">
<template #default="scope">
<el-select v-model="scope.row.lx" placeholder="请选择" no-data-text="暂无数据">
<el-option v-for="item in pfyjlxList" :key="item.key"
:label="item.name" :value="item.key"
<el-select
v-model="scope.row.lx"
placeholder="请选择"
no-data-text="暂无数据"
>
<el-option
v-for="item in pfyjlxList"
:key="item.key"
:label="item.name"
:value="item.key"
></el-option>
</el-select>
</template>
</el-table-column>
<el-table-column prop="pfyj" label="批复意见">
<template #default="scope">
<el-input v-model="scope.row.pfyj" type="textarea" />
<el-input
v-model="scope.row.pfyj"
type="textarea"
/>
</template>
</el-table-column>
<el-table-column prop="jzf" label="基准分">
<template #default="scope">
<el-input-number v-model="scope.row.jzf" :min="0" :max="99999999999.99999999"
<el-input-number
v-model="scope.row.jzf"
:min="0"
:max="99999999999.99999999"
controls-position="right"
/>
</template>
</el-table-column>
<el-table-column prop="lsqk" label="落实情况">
<template #default="scope">
<el-select v-model="scope.row.lsqk" placeholder="请选择" no-data-text="暂无数据">
<el-option v-for="item in lsqkList" :key="item.key"
:label="item.name" :value="item.key"
<el-select
v-model="scope.row.lsqk"
placeholder="请选择"
no-data-text="暂无数据"
>
<el-option
v-for="item in lsqkList"
:key="item.key"
:label="item.name"
:value="item.key"
></el-option>
</el-select>
</template>
......@@ -212,14 +337,26 @@
/>
</template>
</el-table-column>
<el-table-column prop="lsqkjtsm" label="落实情况具体说明">
<el-table-column
prop="lsqkjtsm"
label="落实情况具体说明"
>
<template #default="scope">
<el-input v-model="scope.row.lsqkjtsm" type="textarea" />
<el-input
v-model="scope.row.lsqkjtsm"
type="textarea"
/>
</template>
</el-table-column>
<el-table-column label="操作" width="60">
<template #default="scope">
<el-button link type="danger" size="small" @click="deletePfyjlsqk(scope.$index)">删除</el-button>
<el-button
link
type="danger"
size="small"
@click="deletePfyjlsqk(scope.$index)"
>删除</el-button
>
</template>
</el-table-column>
</el-table>
......@@ -237,32 +374,62 @@
<el-form-item label="策划文件">
<el-upload
:action="windowConfig.baseUrl + '/api/file/upload'"
:headers="{Authorization: token}"
:headers="{ Authorization: token }"
:show-file-list="false"
multiple
:disabled="isPreview"
:on-success="addChwjFile"
>
<el-button type="default">上传</el-button>
<el-button :disabled="isPreview" type="default"
>上传</el-button
>
</el-upload>
<el-button type="default" @click="multiDeleteChwj" :disabled="!chwjSelectIds.length">删除选中文件</el-button>
<el-button
type="default"
@click="multiDeleteChwj"
:disabled="!chwjSelectIds.length"
>删除选中文件</el-button
>
</el-form-item>
<el-form-item label="">
<el-table :data="chwjData" style="width: 100%" empty-text="暂无数据" border
<el-table
:data="chwjData"
style="width: 100%"
empty-text="暂无数据"
border
@selection-change="chwjSelectionChange"
>
<el-table-column type="selection" width="55" />
<el-table-column prop="originalname" label="文件名" />
<el-table-column prop="updatedAt" label="上传时间">
<template #default="{ row, index }">
<span>{{ moment(row.updatedAt).format("YYYY-MM-DD HH:mm:SS") }}</span>
<span>{{
moment(row.updatedAt).format(
"YYYY-MM-DD HH:mm:SS",
)
}}</span>
</template>
</el-table-column>
<el-table-column prop="size" label="大小">
<template #default="{ row }">
<span>{{ row.size }} MB</span>
</template>
</el-table-column>
<el-table-column prop="size" label="大小" />
<el-table-column fixed="right" label="操作" width="100">
<template #default="{ row, index }">
<!-- 需要在查看表单disabled时保持允许下载 -->
<span class="always-click" @click="downloadFile(row)">下载</span>
<el-button link type="danger" size="small" @click="deleteChwj(index)">删除</el-button>
<span
class="always-click"
@click="downloadFile(row)"
>下载</span
>
<el-button
link
type="danger"
size="small"
@click="deleteChwj(index)"
>删除</el-button
>
</template>
</el-table-column>
</el-table>
......@@ -278,9 +445,20 @@
<el-row :gutter="20">
<el-col :span="24">
<div class="tab-handle">
<el-button type="primary" size="small" @click="addJyglzrs">新增</el-button>
<el-button
type="primary"
:disabled="isPreview"
size="small"
@click="addJyglzrs"
>新增</el-button
>
</div>
<el-table :data="jyglzrsData" style="width: 100%" empty-text="暂无数据" border>
<el-table
:data="jyglzrsData"
style="width: 100%"
empty-text="暂无数据"
border
>
<el-table-column type="index" width="50" />
<el-table-column prop="nd" label="年度" width="260">
<template #default="scope">
......@@ -297,15 +475,25 @@
<el-upload
v-if="!scope.row.jyglzrs"
:action="windowConfig.baseUrl + '/api/file/upload'"
:headers="{Authorization: token}"
:headers="{ Authorization: token }"
:show-file-list="false"
:on-success="(res, file) => addJyglzrsFile(res, file, scope.row)"
:on-success="
(res, file) =>
addJyglzrsFile(res, file, scope.row)
"
>
<el-button link type="primary">上传</el-button>
</el-upload>
<div class="upload-file-wrap" v-else>
<span class="file-name" @click="downloadFile(scope.row.jyglzrs)">{{ scope.row.jyglzrs.originalname }}</span>
<span class="delete-btn" @click="deleteRowFile(scope.row, scope.$index)">
<span
class="file-name"
@click="downloadFile(scope.row.jyglzrs)"
>{{ scope.row.jyglzrs.originalname }}</span
>
<span
class="delete-btn"
@click="deleteRowFile(scope.row, scope.$index)"
>
<el-icon><CloseBold /></el-icon>
</span>
</div>
......@@ -318,7 +506,13 @@
</el-table-column>
<el-table-column label="操作" width="60" fixed="right">
<template #default="scope">
<el-button link type="danger" size="small" @click="deleteJyglzrs(scope.$index)">删除</el-button>
<el-button
link
type="danger"
size="small"
@click="deleteJyglzrs(scope.$index)"
>删除</el-button
>
</template>
</el-table-column>
</el-table>
......@@ -334,113 +528,121 @@
</template>
<script setup>
import { reactive, ref, onMounted, getCurrentInstance, h, watch } from "vue";
import { useRouter, useRoute } from "vue-router";
import { ElMessage, ElMessageBox } from "element-plus";
import { useUserStore } from "@/stores/user.js";
const userStore = useUserStore();
const router = useRouter();
const route = useRoute();
const { proxy } = getCurrentInstance();
const pageActiveName = ref("全生命周期责任书");
let token = ref("");
token.value = userStore.authToken || sessionStorage.getItem("authToken") || "";
import { reactive, ref, onMounted, getCurrentInstance, h, watch } from "vue";
import { useRouter, useRoute } from "vue-router";
import { ElMessage, ElMessageBox } from "element-plus";
import { useUserStore } from "@/stores/user.js";
const userStore = useUserStore();
const router = useRouter();
const route = useRoute();
const { proxy } = getCurrentInstance();
const pageActiveName = ref("全生命周期责任书");
let token = ref("");
token.value = userStore.authToken || sessionStorage.getItem("authToken") || "";
const activeCollapse = reactive([
"责任书基本信息", "责任书具体指标", "批复意见落实情况"
]);
let formData = reactive({});
let loading = ref(false);
// 责任书类型
let zrslxList = reactive([]);
let zrslxProps = {
label: "name"
}
let selectedFullPath = ref(""); //已选项的全路径名称
watch(() => formData.zrslx, (newVal) => {
const activeCollapse = reactive([
"责任书基本信息",
"责任书具体指标",
"批复意见落实情况",
]);
let formData = reactive({});
let loading = ref(false);
// 责任书类型
let zrslxList = reactive([]);
let zrslxProps = {
label: "name",
};
let selectedFullPath = ref(""); //已选项的全路径名称
watch(
() => formData.zrslx,
(newVal) => {
if (newVal) {
selectedFullPath.value = getFullPathById(newVal);
} else {
selectedFullPath.value = "";
}
})
// 构建节点映射表
const nodeMap = new Map()
let buildNodeMap;
const getFullPathById = (id) => {
const node = nodeMap.get(id)
if (!node) return ''
},
);
// 构建节点映射表
const nodeMap = new Map();
let buildNodeMap;
const getFullPathById = (id) => {
const node = nodeMap.get(id);
if (!node) return "";
const path = []
let current = node
const path = [];
let current = node;
while (current) {
path.unshift(current.name)
current = current.parent
path.unshift(current.name);
current = current.parent;
}
return path.join(' / ')
}
// 项目列表
let projectList = ref([]);
const getProjectData = () => {
return path.join(" / ");
};
// 项目列表
let projectList = ref([]);
const getProjectData = () => {
proxy.$post({
url: "/api/project/listProject",
data: {
page: 1,
pagesize: 1000,
attributes: [],
menuType: "xmjc"
menuType: "xmjc",
},
callback: (data) => {
projectList.value = data.rows;
}
})
};
// 批复意见落实情况
let pfyjlxList = reactive([]);
let lsqkList = reactive([]);
let pfyjlsqkData = ref([]);
const addPfyjlsqk = () => {
},
});
};
// 批复意见落实情况
let pfyjlxList = reactive([]);
let lsqkList = reactive([]);
let pfyjlsqkData = ref([]);
const addPfyjlsqk = () => {
pfyjlsqkData.value.push({});
};
const deletePfyjlsqk = (index) => {
ElMessageBox.confirm("确认删除该项?", "提示",{
confirmButtonText: '确认',
cancelButtonText: '取消',
type: 'warning',
};
const deletePfyjlsqk = (index) => {
ElMessageBox.confirm("确认删除该项?", "提示", {
confirmButtonText: "确认",
cancelButtonText: "取消",
type: "warning",
}).then(() => {
pfyjlsqkData.value.splice(index, 1);
})
}
});
};
let isPreview = !!route.query.isPreview;
let statementId = route.query.statementId;
// 查看编辑详情
const getStatementInfo = () => {
let isPreview = !!route.query.isPreview;
let statementId = route.query.statementId;
// 查看编辑详情
const getStatementInfo = () => {
loading.value = true;
proxy.$post({
url: "/api/project/getTzmbzrsInfo",
data: {
id: statementId
id: statementId,
},
callback: (res) => {
loading.value = false;
Object.assign(formData, res);
Object.assign(zrsData.value, res.zrswj);
Object.assign(zrsjtzbData.value, res.tzmbzrsZbs.map(item => {
Object.assign(
zrsjtzbData.value,
res.tzmbzrsZbs.map((item) => {
return {
...item,
sfsy: item.sfsy && item.sfsy.toString()
}
}));
sfsy: item.sfsy && item.sfsy.toString(),
};
}),
);
Object.assign(chwjData.value, res.chwj);
Object.assign(jyglzrsData.value, res.tzmbzrsNds);
Object.assign(pfyjlsqkData.value, res.tzmbzrsPfyjs);
}
},
});
};
onMounted(() => {
};
onMounted(() => {
getProjectData();
let resourceData = JSON.parse(sessionStorage.getItem("resourceData"));
zrslxList = resourceData.level;
......@@ -449,271 +651,276 @@
statementId && getStatementInfo();
buildNodeMap = (nodes, parent = null) => {
nodes.forEach(node => {
node.parent = parent
nodeMap.set(node.key, node)
nodes.forEach((node) => {
node.parent = parent;
nodeMap.set(node.key, node);
if (node.children && node.children.length > 0) {
buildNodeMap(node.children, node)
}
})
buildNodeMap(node.children, node);
}
});
};
// 初始化构建映射
buildNodeMap(zrslxList);
});
// 选择关联项目,同步相关字段信息
const changeProject = (val) => {
let selectData = projectList.value.filter(item => item.id === val)[0];
});
// 选择关联项目,同步相关字段信息
const changeProject = (val) => {
let selectData = projectList.value.filter((item) => item.id === val)[0];
if (selectData) {
formData.projectName = selectData.projectName;
formData.tzzt = selectData.tzzt;
}
}
};
// 责任书文件
let zrsData = ref([]);
const addZrsFile = (res, file) => {
// 责任书文件
let zrsData = ref([]);
const addZrsFile = (res, file) => {
zrsData.value.push(res.data);
}
const deleteZrs = (index) => {
ElMessageBox.confirm("确认删除该项?", "提示",{
confirmButtonText: '确认',
cancelButtonText: '取消',
type: 'warning',
}).then(() => {
};
const deleteZrs = (index) => {
ElMessageBox.confirm("确认删除该项?", "提示", {
confirmButtonText: "确认",
cancelButtonText: "取消",
type: "warning",
})
.then(() => {
zrsData.value.splice(index, 1);
}).catch(() => {})
}
let zrsSelectIds = ref([]);
const zrsSelectionChange = (datas) => {
zrsSelectIds.value = datas.map(item => item.id);
};
const multiDeleteZrs = () => {
ElMessageBox.confirm("确认删除选中数据?", "提示",{
confirmButtonText: '确认',
cancelButtonText: '取消',
type: 'warning',
}).then(() => {
zrsData.value = zrsData.value.filter(item => !zrsSelectIds.value.includes(item.id));
}).catch(() => {})
};
// 责任书具体指标
let zrsjtzbData = ref([]);
let qsmzqZrs = [
})
.catch(() => {});
};
let zrsSelectIds = ref([]);
const zrsSelectionChange = (datas) => {
zrsSelectIds.value = datas.map((item) => item.id);
};
const multiDeleteZrs = () => {
ElMessageBox.confirm("确认删除选中数据?", "提示", {
confirmButtonText: "确认",
cancelButtonText: "取消",
type: "warning",
})
.then(() => {
zrsData.value = zrsData.value.filter(
(item) => !zrsSelectIds.value.includes(item.id),
);
})
.catch(() => {});
};
// 责任书具体指标
let zrsjtzbData = ref([]);
let qsmzqZrs = [
{
xh: "1",
zbmc: "项目总投资(亿元)"
zbmc: "项目总投资(亿元)",
},
{
xh: "1.1",
zbmc: "建安费用(亿元)"
zbmc: "建安费用(亿元)",
},
{
xh: "2",
zbmc: "项目带动工程收益(亿元)"
zbmc: "项目带动工程收益(亿元)",
},
{
xh: "2.1",
zbmc: "工程收益率(%)"
zbmc: "工程收益率(%)",
},
{
xh: "3",
zbmc: "政府补助资金到位(亿元)"
zbmc: "政府补助资金到位(亿元)",
},
{
xh: "4",
zbmc: "我方资本金投入(亿元)"
zbmc: "我方资本金投入(亿元)",
},
{
xh: "5",
zbmc: "我方负责引入的股权融资(亿元)"
zbmc: "我方负责引入的股权融资(亿元)",
},
{
xh: "6",
zbmc: "项目融资额(亿元)"
zbmc: "项目融资额(亿元)",
},
{
xh: "6.1",
zbmc: "融资利率(%)"
zbmc: "融资利率(%)",
},
{
xh: "7",
zbmc: "项目实现营业收入累计(亿元)"
zbmc: "项目实现营业收入累计(亿元)",
},
{
xh: "8",
zbmc: "项目经营净现金流累计(亿元)"
zbmc: "项目经营净现金流累计(亿元)",
},
{
xh: "9",
zbmc: "项目全投资财务内部收益率(税前)(%)"
zbmc: "项目全投资财务内部收益率(税前)(%)",
},
{
xh: "10",
zbmc: "项目资本金财务内部收益率(%)"
zbmc: "项目资本金财务内部收益率(%)",
},
{
xh: "11",
zbmc: "项目竣工投产时间(年月)"
}
];
let jsqZrs = [
zbmc: "项目竣工投产时间(年月)",
},
];
let jsqZrs = [
{
xh: "1",
zbmc: "项目总投资 (亿元)"
zbmc: "项目总投资 (亿元)",
},
{
xh: "1.1",
zbmc: "建安费用(亿元)"
zbmc: "建安费用(亿元)",
},
{
xh: "2",
zbmc: "项目带动工程收益 (亿元)"
zbmc: "项目带动工程收益 (亿元)",
},
{
xh: "2.1",
zbmc: "工程收益率(%)"
zbmc: "工程收益率(%)",
},
{
xh: "3",
zbmc: "建设期政府补助资金(亿元)"
zbmc: "建设期政府补助资金(亿元)",
},
{
xh: "4",
zbmc: "我方资本金投入(亿元)"
zbmc: "我方资本金投入(亿元)",
},
{
xh: "5",
zbmc: "我方负责引入的股权融资(亿元)"
zbmc: "我方负责引入的股权融资(亿元)",
},
{
xh: "5.1",
zbmc: "股权融资成本(%)"
zbmc: "股权融资成本(%)",
},
{
xh: "6",
zbmc: "项目建设期融资额(亿元)"
zbmc: "项目建设期融资额(亿元)",
},
{
xh: "6.1",
zbmc: "融资利率(%)"
zbmc: "融资利率(%)",
},
{
xh: "7",
zbmc: "项目全投资财务内部收益率(税前)(%)"
zbmc: "项目全投资财务内部收益率(税前)(%)",
},
{
xh: "8",
zbmc: "项目资本金财务内部收益率(%)"
zbmc: "项目资本金财务内部收益率(%)",
},
{
xh: "9",
zbmc: "项目竣工投产时间(年月)"
}
];
let yyqZrs = [
zbmc: "项目竣工投产时间(年月)",
},
];
let yyqZrs = [
{
xh: "1",
zbmc: "运营期政府补助资金到位(亿元)"
zbmc: "运营期政府补助资金到位(亿元)",
},
{
xh: "2",
zbmc: "项目运营期融资额(亿元)"
zbmc: "项目运营期融资额(亿元)",
},
{
xh: "2.1",
zbmc: "融资利率(%)"
zbmc: "融资利率(%)",
},
{
xh: "3",
zbmc: "项目实现营业收入累计(亿元)"
zbmc: "项目实现营业收入累计(亿元)",
},
{
xh: "3.1",
zbmc: "利润总额累计(亿元)"
zbmc: "利润总额累计(亿元)",
},
{
xh: "4",
zbmc: "项目经营净现金流累计(亿元)"
zbmc: "项目经营净现金流累计(亿元)",
},
{
xh: "5",
zbmc: "项目全投资财务内部收益率(税前)(%)"
zbmc: "项目全投资财务内部收益率(税前)(%)",
},
{
xh: "6",
zbmc: "项目资本金财务内部收益率(%)"
}
];
let ndZrs = [
zbmc: "项目资本金财务内部收益率(%)",
},
];
let ndZrs = [
{
xh: "1",
zbmc: "本年度完成投资(亿元)"
zbmc: "本年度完成投资(亿元)",
},
{
xh: "1.1",
zbmc: "建安费用(亿元)"
zbmc: "建安费用(亿元)",
},
{
xh: "1.2",
zbmc: "项目征地拆迁费(亿元)"
zbmc: "项目征地拆迁费(亿元)",
},
{
xh: "2",
zbmc: "本年度工程收益(亿元)"
zbmc: "本年度工程收益(亿元)",
},
{
xh: "2.1",
zbmc: "工程收益率(%)"
zbmc: "工程收益率(%)",
},
{
xh: "3",
zbmc: "本年度政府补助资金(亿元)"
zbmc: "本年度政府补助资金(亿元)",
},
{
xh: "4",
zbmc: "本年度我方资本金投入(亿元)"
zbmc: "本年度我方资本金投入(亿元)",
},
{
xh: "5",
zbmc: "本年度我方负责引入的股权融资(亿元)"
zbmc: "本年度我方负责引入的股权融资(亿元)",
},
{
xh: "5.1",
zbmc: "股权融资成本(%)"
zbmc: "股权融资成本(%)",
},
{
xh: "6",
zbmc: "本年度项目融资额(亿元)"
zbmc: "本年度项目融资额(亿元)",
},
{
xh: "6.1",
zbmc: "融资利率(%)"
zbmc: "融资利率(%)",
},
{
xh: "7",
zbmc: "本年度投资项目实现营业收入(亿元)"
zbmc: "本年度投资项目实现营业收入(亿元)",
},
{
xh: "8",
zbmc: "本年度项目经营净现金流(亿元)"
zbmc: "本年度项目经营净现金流(亿元)",
},
{
xh: "9",
zbmc: "项目全投资财务内部收益率(税前)(%)"
zbmc: "项目全投资财务内部收益率(税前)(%)",
},
{
xh: "10",
zbmc: "项目资本金财务内部收益率(%)"
}
]
// 选择责任书类型,同步切换责任书具体指标数据
const changeZrslx = (data) => {
zbmc: "项目资本金财务内部收益率(%)",
},
];
// 选择责任书类型,同步切换责任书具体指标数据
const changeZrslx = (data) => {
if (!data.children || !data.children.length) {
// 点击到最内层子节点
if (data.name.indexOf("年度") != -1) {
zrsjtzbData.value = ndZrs;
} else if(data.name.indexOf("建设") != -1) {
} else if (data.name.indexOf("建设") != -1) {
zrsjtzbData.value = jsqZrs;
} else if (data.name.indexOf("运营") != -1) {
zrsjtzbData.value = yyqZrs;
......@@ -721,90 +928,95 @@
zrsjtzbData.value = qsmzqZrs;
}
}
}
const getSummaries = (param) => {
};
const getSummaries = (param) => {
const { columns, data } = param;
let sums = [];
columns.forEach((column, index) => {
if (index === 0) {
sums[0] = h("div", "合计");
return
return;
}
const values = data.map((item) => Number(item[column.property]))
const values = data.map((item) => Number(item[column.property]));
if (["khjzf"].includes(column.property)) {
sums[index] = `${values.reduce((prev, curr) => {
const value = Number(curr);
if (!Number.isNaN(value)) {
return prev + curr
return prev + curr;
} else {
return prev
return prev;
}
}, 0)}`
}, 0)}`;
} else {
sums[index] = "";
}
});
return sums;
};
// 策划文件
let chwjData = ref([]);
const addChwjFile = (res, file) => {
};
// 策划文件
let chwjData = ref([]);
const addChwjFile = (res, file) => {
chwjData.value.push(res.data);
}
const deleteChwj = (index) => {
ElMessageBox.confirm("确认删除该项?", "提示",{
confirmButtonText: '确认',
cancelButtonText: '取消',
type: 'warning',
}).then(() => {
};
const deleteChwj = (index) => {
ElMessageBox.confirm("确认删除该项?", "提示", {
confirmButtonText: "确认",
cancelButtonText: "取消",
type: "warning",
})
.then(() => {
chwjData.value.splice(index, 1);
}).catch(() => {})
}
let chwjSelectIds = ref([]);
const chwjSelectionChange = (datas) => {
chwjSelectIds.value = datas.map(item => item.id);
};
const multiDeleteChwj = () => {
ElMessageBox.confirm("确认删除选中数据?", "提示",{
confirmButtonText: '确认',
cancelButtonText: '取消',
type: 'warning',
}).then(() => {
chwjData.value = chwjData.value.filter(item => !chwjSelectIds.value.includes(item.id));
}).catch(() => {})
};
// 经营管理责任书
let jyglzrsData = ref([]);
const addJyglzrs = () => {
})
.catch(() => {});
};
let chwjSelectIds = ref([]);
const chwjSelectionChange = (datas) => {
chwjSelectIds.value = datas.map((item) => item.id);
};
const multiDeleteChwj = () => {
ElMessageBox.confirm("确认删除选中数据?", "提示", {
confirmButtonText: "确认",
cancelButtonText: "取消",
type: "warning",
})
.then(() => {
chwjData.value = chwjData.value.filter(
(item) => !chwjSelectIds.value.includes(item.id),
);
})
.catch(() => {});
};
// 经营管理责任书
let jyglzrsData = ref([]);
const addJyglzrs = () => {
jyglzrsData.value.push({});
}
const deleteJyglzrs = (index) => {
};
const deleteJyglzrs = (index) => {
jyglzrsData.value.splice(index, 1);
}
const addJyglzrsFile = (res, file, row) => {
};
const addJyglzrsFile = (res, file, row) => {
row.jyglzrs = {};
Object.assign(row.jyglzrs, res.data);
};
const deleteRowFile = (row, index) => {
let {jyglzrs, ...data} = row;
};
const deleteRowFile = (row, index) => {
let { jyglzrs, ...data } = row;
jyglzrsData.value[index] = data;
};
};
// 下载已上传文件
const downloadFile = (data) => {
// 下载已上传文件
const downloadFile = (data) => {
let a = document.createElement("a");
a.href = `${proxy.windowConfig.baseUrl}/api/file/download/${data.id}`;
a.download = data.originalname;
document.body.appendChild(a);
a.click();
a.remove();
};
};
const backClick = () => {
router.back(-1)
}
const saveClick = () => {
const backClick = () => {
router.back(-1);
};
const saveClick = () => {
if (formData.projectId) {
let url = formData.id ? "updateTzmbzrs" : "createTzmbzrs";
proxy.$post({
......@@ -815,22 +1027,21 @@
tzmbzrsZbs: zrsjtzbData.value,
chwj: chwjData.value,
tzmbzrsNds: jyglzrsData.value,
tzmbzrsPfyjs: pfyjlsqkData.value
tzmbzrsPfyjs: pfyjlsqkData.value,
},
callback: (data) => {
router.back(-1)
}
})
router.back(-1);
},
});
} else {
ElMessage.warning("请选择项目信息");
}
}
};
</script>
<style lang="less">
@import "@/styles/manage.less";
.add-project-header{
@import "@/styles/manage.less";
.add-project-header {
margin-bottom: 10px;
}
}
</style>
This source diff could not be displayed because it is too large. You can view the blob instead.
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment