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