明树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 },
); );
......
This source diff could not be displayed because it is too large. You can view the blob instead.
<template> <template>
<div class="add-project-container"> <div class="add-project-container">
<div class="add-project-content" v-loading="loading"> <div class="add-project-content" v-loading="loading">
<div class="add-project-header"> <div class="add-project-header">
<div class="header-left"></div> <div class="header-left"></div>
<div class="header-right"> <div class="header-right">
<el-button type="default" @click="backClick">返回</el-button> <el-button type="default" @click="backClick">返回</el-button>
<template v-if="!loading && !isPreview"> <template v-if="!loading && !isPreview">
<el-button type="primary" @click="saveClick">保存</el-button> <el-button type="primary" @click="saveClick">保存</el-button>
</template> </template>
</div> </div>
</div>
<div class="tabs-content">
<el-tabs v-model="pageActiveName" type="border-card">
<el-tab-pane label="全生命周期责任书" name="全生命周期责任书">
<div class="project-tab-content">
<div class="tab-content">
<el-form
:model="formData"
:label-width="130"
:disabled="isPreview"
>
<el-collapse v-model="activeCollapse">
<el-collapse-item
title="责任书基本信息"
name="责任书基本信息"
>
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="责任书类型">
<el-tree-select
v-model="formData.zrslx"
:data="zrslxList"
node-key="key"
:props="zrslxProps"
placeholder="请选择"
render-after-expand
@node-click="changeZrslx"
>
<template #label>
<span>{{ selectedFullPath }}</span>
</template>
</el-tree-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="项目信息" required>
<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>
</el-select>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="责任书文件">
<el-upload
: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-form-item>
<el-form-item label="">
<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="上传时间"
>
<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="大小">
<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
>
</template>
</el-table-column>
</el-table>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="项目名称">
<el-input v-model="formData.projectName" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="投资主体">
<el-input v-model="formData.tzzt" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="项目地点">
<el-input v-model="formData.xmdd" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="项目开工日期">
<el-date-picker
v-model="formData.xmkgrq"
type="date"
placeholder="请选择"
/>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="项目实施期限">
<el-input-number
v-model="formData.xmssqx"
:min="0"
:max="99999999999.99999999"
controls-position="right"
></el-input-number>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="项目内容概述">
<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-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-table-column type="index" label="序号" width="60" />
<el-table-column prop="zbmc" label="指标名称" />
<el-table-column
prop="zbmbz"
label="指标目标值"
width="180"
>
<template #default="scope">
<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"
>
<template #default="scope">
<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"
>
<template #default="scope">
<el-switch
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"
/>
</template>
</el-table-column>
</el-table>
</el-collapse-item>
<el-collapse-item
title="批复意见落实情况"
name="批复意见落实情况"
>
<div class="tab-handle">
<el-button
type="primary"
size="small"
@click="addPfyjlsqk"
>新增</el-button
>
</div>
<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-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"
/>
</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"
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-option>
</el-select>
</template>
</el-table-column>
<el-table-column prop="lssj" label="落实时间">
<template #default="scope">
<el-date-picker
v-model="scope.row.lssj"
type="datetime"
placeholder="请选择"
value-format="YYYY-MM-DD HH:mm:ss"
/>
</template>
</el-table-column>
<el-table-column
prop="lsqkjtsm"
label="落实情况具体说明"
>
<template #default="scope">
<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
>
</template>
</el-table-column>
</el-table>
</el-collapse-item>
</el-collapse>
</el-form>
</div>
</div> </div>
<div class="tabs-content"> </el-tab-pane>
<el-tabs v-model="pageActiveName" type="border-card"> <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-row :gutter="20">
<el-form :model="formData" :label-width="130" :disabled="isPreview"> <el-col :span="24">
<el-collapse v-model="activeCollapse"> <el-form-item label="策划文件">
<el-collapse-item title="责任书基本信息" name="责任书基本信息"> <el-upload
<el-row :gutter="20"> :action="windowConfig.baseUrl + '/api/file/upload'"
<el-col :span="12"> :headers="{ Authorization: token }"
<el-form-item label="责任书类型"> :show-file-list="false"
<el-tree-select multiple
v-model="formData.zrslx" :disabled="isPreview"
:data="zrslxList" :on-success="addChwjFile"
node-key="key" >
:props="zrslxProps" <el-button :disabled="isPreview" type="default"
placeholder="请选择" >上传</el-button
render-after-expand >
@node-click="changeZrslx" </el-upload>
> <el-button
<template #label> type="default"
<span>{{ selectedFullPath }}</span> @click="multiDeleteChwj"
</template> :disabled="!chwjSelectIds.length"
</el-tree-select> >删除选中文件</el-button
</el-form-item> >
</el-col> </el-form-item>
<el-col :span="12"> <el-form-item label="">
<el-form-item label="项目信息" required> <el-table
<el-select v-model="formData.projectId" placeholder="请选择" no-data-text="暂无数据" :data="chwjData"
@change="changeProject" style="width: 100%"
> empty-text="暂无数据"
<el-option v-for="item in projectList" :key="item.id" border
:label="item.projectName" :value="item.id" @selection-change="chwjSelectionChange"
></el-option> >
</el-select> <el-table-column type="selection" width="55" />
</el-form-item> <el-table-column prop="originalname" label="文件名" />
</el-col> <el-table-column prop="updatedAt" label="上传时间">
<el-col :span="24"> <template #default="{ row, index }">
<el-form-item label="责任书文件"> <span>{{
<el-upload moment(row.updatedAt).format(
:action="windowConfig.baseUrl + '/api/file/upload'" "YYYY-MM-DD HH:mm:SS",
:headers="{Authorization: token}" )
:show-file-list="false" }}</span>
multiple </template>
:on-success="addZrsFile" </el-table-column>
> <el-table-column prop="size" label="大小">
<el-button type="default">上传</el-button> <template #default="{ row }">
</el-upload> <span>{{ row.size }} MB</span>
<el-button type="default" @click="multiDeleteZrs" :disabled="!zrsSelectIds.length">删除选中文件</el-button> </template>
</el-form-item> </el-table-column>
<el-form-item label=""> <el-table-column fixed="right" label="操作" width="100">
<el-table :data="zrsData" style="width: 100%" empty-text="暂无数据" border <template #default="{ row, index }">
@selection-change="zrsSelectionChange" <!-- 需要在查看表单disabled时保持允许下载 -->
> <span
<el-table-column type="selection" width="55" /> class="always-click"
<el-table-column prop="originalname" label="文件名" /> @click="downloadFile(row)"
<el-table-column prop="updatedAt" label="上传时间"> >下载</span
<template #default="{ row, index }"> >
<span>{{ moment(row.updatedAt).format("YYYY-MM-DD HH:mm:SS") }}</span> <el-button
</template> link
</el-table-column> type="danger"
<el-table-column prop="size" label="大小" /> size="small"
<el-table-column fixed="right" label="操作" width="100"> @click="deleteChwj(index)"
<template #default="{ row, index }"> >删除</el-button
<!-- 需要在查看表单disabled时保持允许下载 --> >
<span class="always-click" @click="downloadFile(row)">下载</span> </template>
<el-button link type="danger" size="small" @click="deleteZrs(index)">删除</el-button> </el-table-column>
</template> </el-table>
</el-table-column> </el-form-item>
</el-table> </el-col>
</el-form-item> </el-row>
</el-col> </div>
<el-col :span="8">
<el-form-item label="项目名称">
<el-input v-model="formData.projectName" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="投资主体">
<el-input v-model="formData.tzzt" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="项目地点">
<el-input v-model="formData.xmdd" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="项目开工日期">
<el-date-picker
v-model="formData.xmkgrq"
type="date"
placeholder="请选择"
/>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="项目实施期限">
<el-input-number v-model="formData.xmssqx" :min="0" :max="99999999999.99999999"
controls-position="right"
></el-input-number>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="项目内容概述">
<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-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-table-column type="index" label="序号" width="60" />
<el-table-column prop="zbmc" label="指标名称" />
<el-table-column prop="zbmbz" label="指标目标值" width="180">
<template #default="scope">
<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">
<template #default="scope">
<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">
<template #default="scope">
<el-switch
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" />
</template>
</el-table-column>
</el-table>
</el-collapse-item>
<el-collapse-item title="批复意见落实情况" name="批复意见落实情况">
<div class="tab-handle">
<el-button type="primary" size="small" @click="addPfyjlsqk">新增</el-button>
</div>
<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-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" />
</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"
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-option>
</el-select>
</template>
</el-table-column>
<el-table-column prop="lssj" label="落实时间">
<template #default="scope">
<el-date-picker
v-model="scope.row.lssj"
type="datetime"
placeholder="请选择"
value-format="YYYY-MM-DD HH:mm:ss"
/>
</template>
</el-table-column>
<el-table-column prop="lsqkjtsm" label="落实情况具体说明">
<template #default="scope">
<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>
</template>
</el-table-column>
</el-table>
</el-collapse-item>
</el-collapse>
</el-form>
</div>
</div>
</el-tab-pane>
<el-tab-pane label="全生命周期管理策划" name="全生命周期管理策划">
<div class="project-tab-content">
<div class="tab-content">
<el-row :gutter="20">
<el-col :span="24">
<el-form-item label="策划文件">
<el-upload
:action="windowConfig.baseUrl + '/api/file/upload'"
:headers="{Authorization: token}"
:show-file-list="false"
multiple
:on-success="addChwjFile"
>
<el-button type="default">上传</el-button>
</el-upload>
<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
@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>
</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>
</template>
</el-table-column>
</el-table>
</el-form-item>
</el-col>
</el-row>
</div>
</div>
</el-tab-pane>
<el-tab-pane label="年度经营管理责任书" name="年度经营管理责任书">
<div class="project-tab-content">
<div class="tab-content">
<el-row :gutter="20">
<el-col :span="24">
<div class="tab-handle">
<el-button type="primary" size="small" @click="addJyglzrs">新增</el-button>
</div>
<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">
<el-date-picker
v-model="scope.row.nd"
type="year"
placeholder="请选择"
value-format="YYYY"
/>
</template>
</el-table-column>
<el-table-column label="经营管理责任书" prop="jyglzrs">
<template #default="scope">
<el-upload
v-if="!scope.row.jyglzrs"
:action="windowConfig.baseUrl + '/api/file/upload'"
:headers="{Authorization: token}"
:show-file-list="false"
: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)">
<el-icon><CloseBold /></el-icon>
</span>
</div>
</template>
</el-table-column>
<el-table-column label="说明" prop="sm">
<template #default="scope">
<el-input v-model="scope.row.sm" 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="deleteJyglzrs(scope.$index)">删除</el-button>
</template>
</el-table-column>
</el-table>
</el-col>
</el-row>
</div>
</div>
</el-tab-pane>
</el-tabs>
</div> </div>
</div> </el-tab-pane>
<el-tab-pane label="年度经营管理责任书" name="年度经营管理责任书">
<div class="project-tab-content">
<div class="tab-content">
<el-row :gutter="20">
<el-col :span="24">
<div class="tab-handle">
<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-column type="index" width="50" />
<el-table-column prop="nd" label="年度" width="260">
<template #default="scope">
<el-date-picker
v-model="scope.row.nd"
type="year"
placeholder="请选择"
value-format="YYYY"
/>
</template>
</el-table-column>
<el-table-column label="经营管理责任书" prop="jyglzrs">
<template #default="scope">
<el-upload
v-if="!scope.row.jyglzrs"
:action="windowConfig.baseUrl + '/api/file/upload'"
:headers="{ Authorization: token }"
:show-file-list="false"
: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)"
>
<el-icon><CloseBold /></el-icon>
</span>
</div>
</template>
</el-table-column>
<el-table-column label="说明" prop="sm">
<template #default="scope">
<el-input v-model="scope.row.sm" 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="deleteJyglzrs(scope.$index)"
>删除</el-button
>
</template>
</el-table-column>
</el-table>
</el-col>
</el-row>
</div>
</div>
</el-tab-pane>
</el-tabs>
</div>
</div> </div>
</div>
</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) => { };
if (newVal) { let selectedFullPath = ref(""); //已选项的全路径名称
selectedFullPath.value = getFullPathById(newVal); watch(
} else { () => formData.zrslx,
selectedFullPath.value = ""; (newVal) => {
} if (newVal) {
}) selectedFullPath.value = getFullPathById(newVal);
// 构建节点映射表 } else {
const nodeMap = new Map() selectedFullPath.value = "";
let buildNodeMap;
const getFullPathById = (id) => {
const node = nodeMap.get(id)
if (!node) return ''
const path = []
let current = node
while (current) {
path.unshift(current.name)
current = current.parent
}
return path.join(' / ')
}
// 项目列表
let projectList = ref([]);
const getProjectData = () => {
proxy.$post({
url: "/api/project/listProject",
data: {
page: 1,
pagesize: 1000,
attributes: [],
menuType: "xmjc"
},
callback: (data) => {
projectList.value = data.rows;
}
})
};
// 批复意见落实情况
let pfyjlxList = reactive([]);
let lsqkList = reactive([]);
let pfyjlsqkData = ref([]);
const addPfyjlsqk = () => {
pfyjlsqkData.value.push({});
};
const deletePfyjlsqk = (index) => {
ElMessageBox.confirm("确认删除该项?", "提示",{
confirmButtonText: '确认',
cancelButtonText: '取消',
type: 'warning',
}).then(() => {
pfyjlsqkData.value.splice(index, 1);
})
} }
},
);
// 构建节点映射表
const nodeMap = new Map();
let buildNodeMap;
const getFullPathById = (id) => {
const node = nodeMap.get(id);
if (!node) return "";
let isPreview = !!route.query.isPreview; const path = [];
let statementId = route.query.statementId; let current = node;
// 查看编辑详情
const getStatementInfo = () => {
loading.value = true;
proxy.$post({
url: "/api/project/getTzmbzrsInfo",
data: {
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 => {
return {
...item,
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(() => {
getProjectData();
let resourceData = JSON.parse(sessionStorage.getItem("resourceData"));
zrslxList = resourceData.level;
pfyjlxList = resourceData.ssjd;
lsqkList = resourceData.lszxqk;
statementId && getStatementInfo();
buildNodeMap = (nodes, parent = null) => {
nodes.forEach(node => {
node.parent = parent
nodeMap.set(node.key, node)
if (node.children && node.children.length > 0) {
buildNodeMap(node.children, node)
}
})
}
// 初始化构建映射
buildNodeMap(zrslxList);
}); while (current) {
// 选择关联项目,同步相关字段信息 path.unshift(current.name);
const changeProject = (val) => { current = current.parent;
let selectData = projectList.value.filter(item => item.id === val)[0]; }
if (selectData) {
formData.projectName = selectData.projectName;
formData.tzzt = selectData.tzzt;
}
}
// 责任书文件 return path.join(" / ");
let zrsData = ref([]); };
const addZrsFile = (res, file) => { // 项目列表
zrsData.value.push(res.data); let projectList = ref([]);
} const getProjectData = () => {
const deleteZrs = (index) => { proxy.$post({
ElMessageBox.confirm("确认删除该项?", "提示",{ url: "/api/project/listProject",
confirmButtonText: '确认', data: {
cancelButtonText: '取消', page: 1,
type: 'warning', pagesize: 1000,
}).then(() => { attributes: [],
zrsData.value.splice(index, 1); menuType: "xmjc",
}).catch(() => {}) },
} callback: (data) => {
let zrsSelectIds = ref([]); projectList.value = data.rows;
const zrsSelectionChange = (datas) => { },
zrsSelectIds.value = datas.map(item => item.id); });
}; };
const multiDeleteZrs = () => { // 批复意见落实情况
ElMessageBox.confirm("确认删除选中数据?", "提示",{ let pfyjlxList = reactive([]);
confirmButtonText: '确认', let lsqkList = reactive([]);
cancelButtonText: '取消', let pfyjlsqkData = ref([]);
type: 'warning', const addPfyjlsqk = () => {
}).then(() => { pfyjlsqkData.value.push({});
zrsData.value = zrsData.value.filter(item => !zrsSelectIds.value.includes(item.id)); };
}).catch(() => {}) const deletePfyjlsqk = (index) => {
}; ElMessageBox.confirm("确认删除该项?", "提示", {
// 责任书具体指标 confirmButtonText: "确认",
let zrsjtzbData = ref([]); cancelButtonText: "取消",
let qsmzqZrs = [ type: "warning",
{ }).then(() => {
xh: "1", pfyjlsqkData.value.splice(index, 1);
zbmc: "项目总投资(亿元)" });
}, };
{
xh: "1.1",
zbmc: "建安费用(亿元)"
},
{
xh: "2",
zbmc: "项目带动工程收益(亿元)"
},
{
xh: "2.1",
zbmc: "工程收益率(%)"
},
{
xh: "3",
zbmc: "政府补助资金到位(亿元)"
},
{
xh: "4",
zbmc: "我方资本金投入(亿元)"
},
{
xh: "5",
zbmc: "我方负责引入的股权融资(亿元)"
},
{
xh: "6",
zbmc: "项目融资额(亿元)"
},
{
xh: "6.1",
zbmc: "融资利率(%)"
},
{
xh: "7",
zbmc: "项目实现营业收入累计(亿元)"
},
{
xh: "8",
zbmc: "项目经营净现金流累计(亿元)"
},
{
xh: "9",
zbmc: "项目全投资财务内部收益率(税前)(%)"
},
{
xh: "10",
zbmc: "项目资本金财务内部收益率(%)"
},
{
xh: "11",
zbmc: "项目竣工投产时间(年月)"
}
];
let jsqZrs = [
{
xh: "1",
zbmc: "项目总投资 (亿元)"
},
{
xh: "1.1",
zbmc: "建安费用(亿元)"
},
{
xh: "2",
zbmc: "项目带动工程收益 (亿元)"
},
{
xh: "2.1",
zbmc: "工程收益率(%)"
},
{
xh: "3",
zbmc: "建设期政府补助资金(亿元)"
},
{
xh: "4",
zbmc: "我方资本金投入(亿元)"
},
{
xh: "5",
zbmc: "我方负责引入的股权融资(亿元)"
},
{
xh: "5.1",
zbmc: "股权融资成本(%)"
},
{
xh: "6",
zbmc: "项目建设期融资额(亿元)"
},
{
xh: "6.1",
zbmc: "融资利率(%)"
},
{
xh: "7",
zbmc: "项目全投资财务内部收益率(税前)(%)"
},
{
xh: "8",
zbmc: "项目资本金财务内部收益率(%)"
},
{
xh: "9",
zbmc: "项目竣工投产时间(年月)"
}
];
let yyqZrs = [
{
xh: "1",
zbmc: "运营期政府补助资金到位(亿元)"
},
{
xh: "2",
zbmc: "项目运营期融资额(亿元)"
},
{
xh: "2.1",
zbmc: "融资利率(%)"
},
{
xh: "3",
zbmc: "项目实现营业收入累计(亿元)"
},
{
xh: "3.1",
zbmc: "利润总额累计(亿元)"
},
{
xh: "4",
zbmc: "项目经营净现金流累计(亿元)"
},
{
xh: "5",
zbmc: "项目全投资财务内部收益率(税前)(%)"
},
{
xh: "6",
zbmc: "项目资本金财务内部收益率(%)"
}
];
let ndZrs = [
{
xh: "1",
zbmc: "本年度完成投资(亿元)"
},
{
xh: "1.1",
zbmc: "建安费用(亿元)"
},
{
xh: "1.2",
zbmc: "项目征地拆迁费(亿元)"
},
{
xh: "2",
zbmc: "本年度工程收益(亿元)"
},
{
xh: "2.1",
zbmc: "工程收益率(%)"
},
{
xh: "3",
zbmc: "本年度政府补助资金(亿元)"
},
{
xh: "4",
zbmc: "本年度我方资本金投入(亿元)"
},
{
xh: "5",
zbmc: "本年度我方负责引入的股权融资(亿元)"
},
{
xh: "5.1",
zbmc: "股权融资成本(%)"
},
{
xh: "6",
zbmc: "本年度项目融资额(亿元)"
},
{
xh: "6.1",
zbmc: "融资利率(%)"
},
{
xh: "7",
zbmc: "本年度投资项目实现营业收入(亿元)"
},
{
xh: "8",
zbmc: "本年度项目经营净现金流(亿元)"
},
{
xh: "9",
zbmc: "项目全投资财务内部收益率(税前)(%)"
},
{
xh: "10",
zbmc: "项目资本金财务内部收益率(%)"
}
]
// 选择责任书类型,同步切换责任书具体指标数据
const changeZrslx = (data) => {
if (!data.children || !data.children.length) {
// 点击到最内层子节点
if (data.name.indexOf("年度") != -1) {
zrsjtzbData.value = ndZrs;
} else if(data.name.indexOf("建设") != -1) {
zrsjtzbData.value = jsqZrs;
} else if (data.name.indexOf("运营") != -1) {
zrsjtzbData.value = yyqZrs;
} else {
zrsjtzbData.value = qsmzqZrs;
}
}
}
const getSummaries = (param) => {
const { columns, data } = param;
let sums = [];
columns.forEach((column, index) => {
if (index === 0) {
sums[0] = h("div", "合计");
return
}
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
} else {
return prev
}
}, 0)}`
} else {
sums[index] = "";
}
});
return sums;
};
// 策划文件
let chwjData = ref([]);
const addChwjFile = (res, file) => {
chwjData.value.push(res.data);
}
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 = () => {
jyglzrsData.value.push({});
}
const deleteJyglzrs = (index) => {
jyglzrsData.value.splice(index, 1);
}
const addJyglzrsFile = (res, file, row) => {
row.jyglzrs = {};
Object.assign(row.jyglzrs, res.data);
};
const deleteRowFile = (row, index) => {
let {jyglzrs, ...data} = row;
jyglzrsData.value[index] = data;
};
// 下载已上传文件 let isPreview = !!route.query.isPreview;
const downloadFile = (data) => { let statementId = route.query.statementId;
let a = document.createElement("a"); // 查看编辑详情
a.href = `${proxy.windowConfig.baseUrl}/api/file/download/${data.id}`; const getStatementInfo = () => {
a.download = data.originalname; loading.value = true;
document.body.appendChild(a); proxy.$post({
a.click(); url: "/api/project/getTzmbzrsInfo",
a.remove(); data: {
}; 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) => {
return {
...item,
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(() => {
getProjectData();
let resourceData = JSON.parse(sessionStorage.getItem("resourceData"));
zrslxList = resourceData.level;
pfyjlxList = resourceData.ssjd;
lsqkList = resourceData.lszxqk;
statementId && getStatementInfo();
buildNodeMap = (nodes, parent = null) => {
nodes.forEach((node) => {
node.parent = parent;
nodeMap.set(node.key, node);
if (node.children && node.children.length > 0) {
buildNodeMap(node.children, node);
}
});
};
// 初始化构建映射
buildNodeMap(zrslxList);
});
// 选择关联项目,同步相关字段信息
const changeProject = (val) => {
let selectData = projectList.value.filter((item) => item.id === val)[0];
if (selectData) {
formData.projectName = selectData.projectName;
formData.tzzt = selectData.tzzt;
}
};
const backClick = () => { // 责任书文件
router.back(-1) let zrsData = ref([]);
const addZrsFile = (res, file) => {
zrsData.value.push(res.data);
};
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 = [
{
xh: "1",
zbmc: "项目总投资(亿元)",
},
{
xh: "1.1",
zbmc: "建安费用(亿元)",
},
{
xh: "2",
zbmc: "项目带动工程收益(亿元)",
},
{
xh: "2.1",
zbmc: "工程收益率(%)",
},
{
xh: "3",
zbmc: "政府补助资金到位(亿元)",
},
{
xh: "4",
zbmc: "我方资本金投入(亿元)",
},
{
xh: "5",
zbmc: "我方负责引入的股权融资(亿元)",
},
{
xh: "6",
zbmc: "项目融资额(亿元)",
},
{
xh: "6.1",
zbmc: "融资利率(%)",
},
{
xh: "7",
zbmc: "项目实现营业收入累计(亿元)",
},
{
xh: "8",
zbmc: "项目经营净现金流累计(亿元)",
},
{
xh: "9",
zbmc: "项目全投资财务内部收益率(税前)(%)",
},
{
xh: "10",
zbmc: "项目资本金财务内部收益率(%)",
},
{
xh: "11",
zbmc: "项目竣工投产时间(年月)",
},
];
let jsqZrs = [
{
xh: "1",
zbmc: "项目总投资 (亿元)",
},
{
xh: "1.1",
zbmc: "建安费用(亿元)",
},
{
xh: "2",
zbmc: "项目带动工程收益 (亿元)",
},
{
xh: "2.1",
zbmc: "工程收益率(%)",
},
{
xh: "3",
zbmc: "建设期政府补助资金(亿元)",
},
{
xh: "4",
zbmc: "我方资本金投入(亿元)",
},
{
xh: "5",
zbmc: "我方负责引入的股权融资(亿元)",
},
{
xh: "5.1",
zbmc: "股权融资成本(%)",
},
{
xh: "6",
zbmc: "项目建设期融资额(亿元)",
},
{
xh: "6.1",
zbmc: "融资利率(%)",
},
{
xh: "7",
zbmc: "项目全投资财务内部收益率(税前)(%)",
},
{
xh: "8",
zbmc: "项目资本金财务内部收益率(%)",
},
{
xh: "9",
zbmc: "项目竣工投产时间(年月)",
},
];
let yyqZrs = [
{
xh: "1",
zbmc: "运营期政府补助资金到位(亿元)",
},
{
xh: "2",
zbmc: "项目运营期融资额(亿元)",
},
{
xh: "2.1",
zbmc: "融资利率(%)",
},
{
xh: "3",
zbmc: "项目实现营业收入累计(亿元)",
},
{
xh: "3.1",
zbmc: "利润总额累计(亿元)",
},
{
xh: "4",
zbmc: "项目经营净现金流累计(亿元)",
},
{
xh: "5",
zbmc: "项目全投资财务内部收益率(税前)(%)",
},
{
xh: "6",
zbmc: "项目资本金财务内部收益率(%)",
},
];
let ndZrs = [
{
xh: "1",
zbmc: "本年度完成投资(亿元)",
},
{
xh: "1.1",
zbmc: "建安费用(亿元)",
},
{
xh: "1.2",
zbmc: "项目征地拆迁费(亿元)",
},
{
xh: "2",
zbmc: "本年度工程收益(亿元)",
},
{
xh: "2.1",
zbmc: "工程收益率(%)",
},
{
xh: "3",
zbmc: "本年度政府补助资金(亿元)",
},
{
xh: "4",
zbmc: "本年度我方资本金投入(亿元)",
},
{
xh: "5",
zbmc: "本年度我方负责引入的股权融资(亿元)",
},
{
xh: "5.1",
zbmc: "股权融资成本(%)",
},
{
xh: "6",
zbmc: "本年度项目融资额(亿元)",
},
{
xh: "6.1",
zbmc: "融资利率(%)",
},
{
xh: "7",
zbmc: "本年度投资项目实现营业收入(亿元)",
},
{
xh: "8",
zbmc: "本年度项目经营净现金流(亿元)",
},
{
xh: "9",
zbmc: "项目全投资财务内部收益率(税前)(%)",
},
{
xh: "10",
zbmc: "项目资本金财务内部收益率(%)",
},
];
// 选择责任书类型,同步切换责任书具体指标数据
const changeZrslx = (data) => {
if (!data.children || !data.children.length) {
// 点击到最内层子节点
if (data.name.indexOf("年度") != -1) {
zrsjtzbData.value = ndZrs;
} else if (data.name.indexOf("建设") != -1) {
zrsjtzbData.value = jsqZrs;
} else if (data.name.indexOf("运营") != -1) {
zrsjtzbData.value = yyqZrs;
} else {
zrsjtzbData.value = qsmzqZrs;
} }
const saveClick = () => { }
if (formData.projectId) { };
let url = formData.id ? "updateTzmbzrs" : "createTzmbzrs"; const getSummaries = (param) => {
proxy.$post({ const { columns, data } = param;
url: "/api/project/" + url, let sums = [];
data: { columns.forEach((column, index) => {
...formData, if (index === 0) {
zrswj: zrsData.value, sums[0] = h("div", "合计");
tzmbzrsZbs: zrsjtzbData.value, return;
chwj: chwjData.value, }
tzmbzrsNds: jyglzrsData.value, const values = data.map((item) => Number(item[column.property]));
tzmbzrsPfyjs: pfyjlsqkData.value if (["khjzf"].includes(column.property)) {
}, sums[index] = `${values.reduce((prev, curr) => {
callback: (data) => { const value = Number(curr);
router.back(-1) if (!Number.isNaN(value)) {
} return prev + curr;
})
} else { } else {
ElMessage.warning("请选择项目信息"); return prev;
} }
}, 0)}`;
} else {
sums[index] = "";
} }
});
return sums;
};
// 策划文件
let chwjData = ref([]);
const addChwjFile = (res, file) => {
chwjData.value.push(res.data);
};
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 = () => {
jyglzrsData.value.push({});
};
const deleteJyglzrs = (index) => {
jyglzrsData.value.splice(index, 1);
};
const addJyglzrsFile = (res, file, row) => {
row.jyglzrs = {};
Object.assign(row.jyglzrs, res.data);
};
const deleteRowFile = (row, index) => {
let { jyglzrs, ...data } = row;
jyglzrsData.value[index] = 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 = () => {
if (formData.projectId) {
let url = formData.id ? "updateTzmbzrs" : "createTzmbzrs";
proxy.$post({
url: "/api/project/" + url,
data: {
...formData,
zrswj: zrsData.value,
tzmbzrsZbs: zrsjtzbData.value,
chwj: chwjData.value,
tzmbzrsNds: jyglzrsData.value,
tzmbzrsPfyjs: pfyjlsqkData.value,
},
callback: (data) => {
router.back(-1);
},
});
} else {
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>
\ No newline at end of file
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