明树Git Lab

Commit ada7604b authored by zhanghan's avatar zhanghan

建设期投资检查开发完毕

parent 1b3f498c
<template>
<div class="file-uploader-container" :class="isInline ? 'inline' : ''">
<!-- 上传按钮区域 -->
<el-upload
:action="uploadUrl"
:headers="headers"
:show-file-list="false"
multiple
:disabled="disabled"
:on-success="handleUploadSuccess"
:before-upload="beforeUpload"
>
<el-button type="default" :disabled="disabled">上传</el-button>
</el-upload>
<el-button
v-if="!isInline"
type="default"
@click="handleMultiDelete"
:disabled="!selectedIds.length || disabled"
class="multi-delete-btn"
>
删除选中文件
</el-button>
<!-- 文件列表表格 -->
<el-form-item :label="label" v-if="!isInline">
<el-table
:data="fileList"
style="width: 100%"
empty-text="暂无数据"
border
@selection-change="handleSelectionChange"
class="file-table"
>
<el-table-column type="selection" width="55" :disabled="disabled" />
<el-table-column prop="originalname" label="文件名" />
<el-table-column prop="updatedAt" label="上传时间">
<template #default="{ row }">
<span>{{ formatDate(row.updatedAt) }}</span>
</template>
</el-table-column>
<el-table-column prop="size" label="大小" />
<el-table-column fixed="right" label="操作" width="100">
<template #default="{ row, $index }">
<span class="download-btn" @click="handleDownload(row)">下载</span>
<el-button
link
type="danger"
size="small"
@click="handleDelete($index)"
:disabled="disabled"
class="delete-btn"
>
删除
</el-button>
</template>
</el-table-column>
</el-table>
</el-form-item>
<div v-else class="inline-file-wrapper">
<el-popover
v-model:visible="popoverVisible"
placement="bottom-start"
width="420"
trigger="hover"
:disabled="fileList.length === 0 || disabled"
popper-class="file-popover"
>
<!-- 弹窗内容 -->
<template #default>
<div class="file-popover-content">
<!-- 无文件提示 -->
<div v-if="fileList.length === 0" class="empty-file-tip">
暂无上传文件
</div>
<!-- 文件列表 -->
<div v-else class="file-list">
<div
v-for="(file, index) in fileList"
:key="file.id || index"
class="file-item"
>
<!-- 文件名 -->
<div class="file-name">
<el-icon class="file-icon"><Document /></el-icon>
<span class="name-text" :title="file.originalname">{{
file.originalname
}}</span>
</div>
<!-- 操作按钮 -->
<div class="file-actions">
<el-button
link
type="primary"
size="small"
@click.stop="handleDownload(file)"
class="download-action"
>
<el-icon><Download /></el-icon>
下载
</el-button>
<el-button
link
type="danger"
size="small"
@click.stop="handleDelete(index)"
:disabled="disabled"
class="delete-action"
>
<el-icon><Delete /></el-icon>
删除
</el-button>
</div>
</div>
</div>
</div>
</template>
<!-- 触发元素(美观的文件数量展示) -->
<template #reference>
<div class="inline-file">
<div class="file-count">
<span class="count-num">{{ fileList.length }}</span>
<span class="count-text">个文件</span>
</div>
<el-icon class="upload-icon"><ArrowDown /></el-icon>
</div>
</template>
</el-popover>
</div>
</div>
</template>
<script setup>
import { ref, watch, computed, getCurrentInstance } from "vue";
import { ElMessageBox, ElMessage } from "element-plus";
import moment from "moment";
import { useUserStore } from "@/stores/user.js";
import windowConfig from "@/window";
// 引入需要的图标
import { Document, Download, Delete } from "@element-plus/icons-vue";
// 定义组件 props(设置默认值,无需外部传参)
const props = defineProps({
modelValue: {
type: Array,
default: () => [],
required: true,
},
label: {
type: String,
default: "文件上传",
},
isInline: {
type: Boolean,
default: false,
},
uploadUrl: {
type: String,
default: () => {
return windowConfig.baseUrl + "/api/file/upload";
},
},
headers: {
type: Object,
default: () => ({
Authorization: sessionStorage.getItem("authToken") || "",
}),
},
// 是否禁用(预览模式)- 默认值:false
disabled: {
type: Boolean,
default: false,
},
// 下载接口前缀 - 默认值:系统配置的baseUrl
downloadBaseUrl: {
type: String,
default: () => {
return windowConfig.baseUrl || "";
},
},
});
const emit = defineEmits(["update:modelValue"]);
const selectedIds = ref([]);
const popoverVisible = ref(false);
// 计算属性:获取文件列表(双向绑定)
const fileList = computed({
get() {
return props.modelValue;
},
set(value) {
emit("update:modelValue", value);
},
});
// 格式化日期
const formatDate = (date) => {
return date ? moment(date).format("YYYY-MM-DD HH:mm:SS") : "";
};
// 文件上传成功处理
const handleUploadSuccess = (res) => {
if (res && res.data) {
fileList.value = [...fileList.value, res.data];
ElMessage.success("文件上传成功");
popoverVisible.value = false;
}
};
const beforeUpload = (file) => {
// 可添加文件类型、大小等校验逻辑
return true;
};
// 选择文件变化
const handleSelectionChange = (datas) => {
selectedIds.value = datas.map((item) => item.id);
};
// 下载文件
const handleDownload = (row) => {
if (!row.id) {
ElMessage.warning("文件ID不存在,无法下载");
return;
}
if (!props.downloadBaseUrl) {
ElMessage.warning("下载地址配置异常,请联系管理员");
return;
}
const a = document.createElement("a");
a.href = `${props.downloadBaseUrl}/api/file/download/${row.id}`;
a.download = row.originalname;
document.body.appendChild(a);
a.click();
a.remove();
};
// 删除单个文件
const handleDelete = (index) => {
ElMessageBox.confirm("确认删除该项?", "提示", {
confirmButtonText: "确认",
cancelButtonText: "取消",
type: "warning",
})
.then(() => {
const newList = [...fileList.value];
newList.splice(index, 1);
fileList.value = newList;
// 删除后关闭popover
popoverVisible.value = false;
})
.catch(() => {});
};
// 批量删除文件
const handleMultiDelete = () => {
ElMessageBox.confirm("确认删除选中数据?", "提示", {
confirmButtonText: "确认",
cancelButtonText: "取消",
type: "warning",
})
.then(() => {
const newList = fileList.value.filter(
(item) => !selectedIds.value.includes(item.id)
);
fileList.value = newList;
selectedIds.value = [];
})
.catch(() => {});
};
// 监听外部文件列表变化
watch(
() => props.modelValue,
(newVal) => {
fileList.value = newVal;
},
{ deep: true }
);
// 监听禁用状态变化,关闭popover
watch(
() => props.disabled,
(newVal) => {
if (newVal) {
popoverVisible.value = false;
}
}
);
</script>
<style scoped>
.file-uploader-container {
width: 100%;
}
.multi-delete-btn {
margin-left: 10px;
}
.inline {
display: flex;
align-items: center;
gap: 10px;
}
.inline-file-wrapper {
flex: 1;
margin-left: 10px;
}
.inline-file {
display: flex;
align-items: center;
padding: 3px 12px;
background: #f5f7fa;
border: 1px solid #e4e7ed;
border-radius: 6px;
cursor: pointer;
transition: all 0.2s ease;
display: flex;
justify-content: space-between;
}
.inline-file:hover {
background: #e8f4ff;
border-color: #c6e2ff;
}
.upload-icon {
color: #409eff;
font-size: 16px;
margin-right: 8px;
}
.file-count {
display: flex;
align-items: baseline;
}
.count-num {
font-size: 18px;
font-weight: 600;
color: #409eff;
margin-right: 4px;
}
.count-text {
font-size: 14px;
color: #606266;
}
:deep(.file-popover) {
padding: 0;
border-radius: 8px;
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);
}
.file-popover-content {
padding: 12px;
}
.empty-file-tip {
text-align: center;
padding: 20px 0;
color: #909399;
font-size: 14px;
}
.file-list {
max-height: 300px;
overflow-y: auto;
}
.file-item {
display: flex;
justify-content: space-between;
align-items: center;
padding: 8px 0;
border-bottom: 1px dashed #f0f0f0;
}
.file-item:last-child {
border-bottom: none;
}
.file-name {
display: flex;
align-items: center;
flex: 1;
overflow: hidden;
}
.file-icon {
color: #409eff;
font-size: 14px;
margin-right: 8px;
}
.name-text {
font-size: 14px;
color: #303133;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.file-actions {
display: flex;
gap: 8px;
}
.download-action,
.delete-action {
padding: 0;
font-size: 12px;
}
:deep(.download-action .el-icon),
:deep(.delete-action .el-icon) {
margin-right: 4px;
font-size: 12px;
}
.file-table {
--el-table-header-text-color: #303133;
--el-table-row-hover-bg-color: #f5f7fa;
}
.download-btn {
cursor: pointer;
color: #409eff;
margin-right: 10px;
user-select: none;
}
.download-btn:hover {
color: #66b1ff;
}
.delete-btn {
padding: 0;
}
:deep(.el-table__header) {
font-weight: 600;
}
:deep(.el-button--link) {
padding: 0;
}
:deep(.file-list::-webkit-scrollbar) {
width: 6px;
}
:deep(.file-list::-webkit-scrollbar-track) {
background: #f1f1f1;
border-radius: 3px;
}
:deep(.file-list::-webkit-scrollbar-thumb) {
background: #c1c1c1;
border-radius: 3px;
}
:deep(.file-list::-webkit-scrollbar-thumb:hover) {
background: #a8a8a8;
}
</style>
......@@ -201,6 +201,9 @@
padding: 0 20px;
height: 100%;
}
::v-deep .el-input {
width: 100% !important;
}
.add-dialog .el-tree {
width: 100%;
}
......
......@@ -208,6 +208,9 @@
}
}
}
::v-deep .el-input{
width: 100% !important;
}
.add-dialog{
.el-tree{
width: 100%;
......
......@@ -64,40 +64,10 @@ const { proxy } = getCurrentInstance();
let tableData = ref([]);
let tableColumns = ref([
{
prop: "qc",
label: "项目全称",
prop: "projectName",
label: "项目信息",
showOverflowTooltip: true,
},
{
prop: "jc",
label: "项目简称",
showOverflowTooltip: true,
},
{
prop: "nbtzglzt",
label: "内部投资管理主体",
showOverflowTooltip: true,
width: 170,
},
{
prop: "xmscjd",
label: "项目所处阶段",
showOverflowTooltip: true,
width: 120,
},
{
prop: "gqjg",
label: "股权结构",
showOverflowTooltip: true,
width: 120,
},
{
prop: "xmzbjze",
label: "项目资本金总额(亿元)",
showOverflowTooltip: true,
width: 180,
},
{
prop: "operations",
......@@ -116,7 +86,7 @@ let pageSize = ref(10);
const getStatementData = () => {
loading.value = true;
proxy.$post({
url: "/api/project/getCgqyglList",
url: "/api/project/getJsqtzjcList",
data: {
page: currentPage.value,
pagesize: pageSize.value,
......@@ -168,7 +138,7 @@ const deleteStatement = (item) => {
})
.then(() => {
proxy.$post({
url: "/api/project/deleteCgqygl",
url: "/api/project/deleteJsqtzjc",
data: {
id: item.id,
},
......
......@@ -15,6 +15,7 @@
<div class="tab-content">
<el-form :model="formData" :label-width="200" :disabled="isPreview">
<el-collapse v-model="activeCollapse">
<!-- 基本信息 -->
<el-collapse-item title="基本信息" name="基本信息">
<el-row :gutter="20">
<el-col :span="12">
......@@ -34,435 +35,187 @@
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="项目所处阶段">
<el-select
v-model="formData.xmscjd"
placeholder="请选择项目所处阶段"
>
<el-option
v-for="item in options?.xmjd"
:key="item.key"
:label="item.name"
:value="item.key"
></el-option>
</el-select>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="全称">
<!-- <el-col :span="12">
<el-form-item label="决策总投资 一次填报锁定">
<el-input
v-model="formData.qc"
placeholder="请输入全称"
v-model="formData.jcztz"
placeholder="请输入决策总投资 一次填报锁定"
/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="简称">
<el-input
v-model="formData.jc"
placeholder="请输入简称"
/>
</el-form-item>
</el-col>
</el-col> -->
</el-row>
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="内部投资管理主体">
<el-input
v-model="formData.nbtzglzt"
placeholder="请输入内部投资管理主体"
/>
</el-form-item>
</el-col>
<!-- <el-row :gutter="20">
<el-col :span="12">
<el-form-item label="股权结构">
<el-form-item label="资本金内部收益率(%) 一次填报锁定">
<el-input
v-model="formData.gqjg"
placeholder="请输入股权结构"
v-model="formData.zbjnbsyl"
placeholder="请输入资本金内部收益率(%) 一次填报锁定"
/>
</el-form-item>
</el-col>
</el-row>
</el-collapse-item>
<el-collapse-item title="出资情况" name="出资情况">
<el-row :gutter="20">
<el-col :span="12">
<el-form-item
label-width="210"
label="项目资本金总额(亿元)"
>
<el-input
v-model.number="formData.xmzbjze"
placeholder="请输入项目资本金总额(亿元)"
/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item
label-width="210"
label="公司资本金应出资总额(亿元)"
>
<el-input
v-model.number="formData.gszbjyczze"
placeholder="请输入公司资本金应出资总额(亿元)"
/>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="12">
<el-form-item
label-width="210"
label="公司当前应出资额(亿元)"
>
<el-input
v-model.number="formData.gsdqycze"
placeholder="请输入公司当前应出资额(亿元)"
/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item
label-width="210"
label="公司当前已出资额(亿元)"
>
<el-input
v-model.number="formData.gsdqyjcze"
placeholder="请输入公司当前已出资额(亿元)"
/>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="12">
<el-form-item
label-width="210"
label="公司当前应出未出金额(亿元)"
>
<el-input
v-model.number="formData.gsdqycwcje"
placeholder="请输入公司当前应出未出金额(亿元)"
/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item
label-width="210"
label="公司当前剩余出资额(亿元)"
>
<el-form-item label="预测总投资">
<el-input
v-model.number="formData.gsdqsycze"
placeholder="请输入公司当前剩余出资额(亿元)"
v-model="formData.ycztz"
placeholder="请输入预测总投资"
/>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label-width="210" label="超股比出资情况">
<el-form-item label="确认总投资">
<el-input
v-model="formData.cgbczqk"
placeholder="请输入超股比出资情况"
v-model="formData.qrztz"
placeholder="请输入确认总投资"
/>
</el-form-item>
</el-col>
</el-row>
</el-row> -->
</el-collapse-item>
<!-- 投资(成本)分析会资料 -->
<el-collapse-item
title="合同约定权益获取"
name="合同约定权益获取"
>
<el-row :gutter="20">
<el-col :span="24">
<el-form-item label="我方权益合同条款约定">
<el-input
type="textarea"
v-model="formData.wfqyhttkyd"
placeholder="请输入我方权益合同条款约定(市场、设计、施工、运营权、养护份额等权益)"
:rows="3"
/>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="24">
<el-form-item label="权益获取进展">
<el-input
type="textarea"
v-model="formData.qyhqjz"
placeholder="请输入权益获取进展"
:rows="3"
/>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="权益获取与约定不一致的情况">
<el-input
type="textarea"
v-model="formData.qyhqyyd"
placeholder="请输入权益获取与约定不一致的情况"
:rows="3"
/>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="24">
<el-form-item label="督办情况">
<el-input
type="textarea"
v-model="formData.dbqk"
placeholder="请输入督办情况"
:rows="3"
/>
</el-form-item>
</el-col>
</el-row>
</el-collapse-item>
<el-collapse-item title="分红情况" name="分红情况">
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="利润分配/分红约定">
<el-input
v-model="formData.lrfp"
placeholder="请输入利润分配/分红约定"
:rows="2"
/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="是否达到利润分配条件">
<el-radio-group
placeholder="请选择是否达到利润分配条件"
v-model="formData.sfddlrfptj"
title="投资(成本)分析会资料"
name="投资(成本)分析会资料"
>
<el-radio
v-for="item in options?.sf"
:key="item.id"
:id="item.name"
:value="item.key"
>{{ item.name }}</el-radio
>
</el-radio-group>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="累计获取分红(万元)">
<el-input
v-model.number="formData.ljhqfh"
placeholder="请输入累计获取分红(万元)"
/>
</el-form-item>
</el-col>
</el-row>
</el-collapse-item>
<el-collapse-item title="资金流出" name="资金流出">
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="应投入资金(万元)">
<el-input
v-model.number="formData.ytrzj"
placeholder="请输入应投入资金(万元)"
/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="累计投入资金(万元)">
<el-input
v-model.number="formData.ljtrzj"
placeholder="请输入累计投入资金(万元)"
/>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="尚需投入资金(万元)">
<el-input
v-model.number="formData.sxtrzj"
placeholder="请输入尚需投入资金(万元)"
/>
</el-form-item>
</el-col>
</el-row>
</el-collapse-item>
<el-collapse-item title="资金流入" name="资金流入">
<div class="tab-handle">
<el-button type="primary" @click="addPfyjlsqk"
<el-button type="primary" @click="addjsqtzjcTzfxs"
>新增</el-button
>
</div>
<el-table
:data="wtyys"
:data="jsqtzjcTzfxsList"
style="width: 100%"
empty-text="暂无数据"
show-summary
:summary-method="sumWtyysColumns"
border
>
<el-table-column type="index" width="60" label="序号" />
<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 options?.participation_capital"
:key="item.key"
:label="item.name"
:value="item.key"
></el-option>
</el-select>
</template>
</el-table-column>
<el-table-column prop="fwsj" label="服务时间">
<el-table-column prop="jd" label="时间 ">
<template #default="scope">
<el-date-picker
v-model="scope.row.fwsj"
<!-- <el-date-picker
v-model="scope.row.jd"
type="datetime"
format="YYYY-MM-DD HH:mm:ss"
value-format="YYYY-MM-DD HH:mm:ss"
placeholder="请选择"
/> -->
<el-input
v-model="scope.row.jd"
placeholder="请按照 xx年xx季度 格式填写"
/>
</template>
</el-table-column>
<el-table-column prop="htje" label="合同金额(万元)">
<el-table-column prop="ycztz" label="当期预测总投资">
<template #default="scope">
<el-input
v-model.number="scope.row.htje"
placeholder="请输入合同金额(万元)"
type="number"
v-model.number="scope.row.ycztz"
placeholder="请输入当期预测总投资"
/>
</template>
</el-table-column>
<el-table-column prop="ywlr" label="业务利润(万元)">
<el-table-column
prop="zbjnbsyl"
label="资本金内部收益率(%)"
>
<template #default="scope">
<el-input
v-model.number="scope.row.ywlr"
placeholder="请输入业务利润(万元)"
v-model.number="scope.row.zbjnbsyl"
placeholder="请输入资本金内部收益率(%)"
/>
</template>
</el-table-column>
<el-table-column
prop="tzcbfxhzl"
label="投资(成本)分析会资料"
>
<template #default="scope">
<FileUploader
v-model="scope.row.tzcbfxhzl"
:isInline="true"
></FileUploader>
</template>
</el-table-column>
<el-table-column label="操作" width="60">
<template #default="scope">
<el-button
link
type="danger"
size="small"
@click="deletePfyjlsqk(scope.$index)"
@click="deletejsqtzjcTzfxs(scope.$index)"
>删除</el-button
>
</template>
</el-table-column>
</el-table>
</el-collapse-item>
<!-- 专项检查 -->
<el-collapse-item title="专项检查" name="专项检查">
<div class="tab-handle">
<el-button type="primary" @click="addTzfhs">新增</el-button>
<el-button type="primary" @click="addJsqtzjcZxjcs"
>新增</el-button
>
</div>
<el-table
:data="tzfhs"
:data="jsqtzjcZxjcsList"
style="width: 100%"
empty-text="暂无数据"
show-summary
:summary-method="sumTzfhsColumns"
border
>
<el-table-column type="index" width="60" label="序号" />
<el-table-column prop="fhsj" label="分红时间">
<el-table-column prop="zxjcfl" label="专项检查类型">
<template #default="scope">
<el-date-picker
v-model="scope.row.fhsj"
type="datetime"
format="YYYY-MM-DD HH:mm:ss"
value-format="YYYY-MM-DD HH:mm:ss"
placeholder="请选择"
<el-select
v-model="scope.row.zxjcfl"
placeholder="请选择专项检查类型"
>
<el-option
v-for="item in options?.construction_classify"
:key="item.key"
:label="item.name"
:value="item.key"
></el-option>
</el-select>
</template>
</el-table-column>
<el-table-column prop="jcjg" label="检查结果">
<template #default="scope">
<el-input
v-model.number="scope.row.jcjg"
placeholder="请输入检查结果"
/>
</template>
</el-table-column>
<el-table-column prop="fhje" label="分红金额(万元)">
<el-table-column prop="zgcsqd" label="整改措施清单">
<template #default="scope">
<el-input
v-model.number="scope.row.fhje"
placeholder="请输入分红金额"
v-model.number="scope.row.zgcsqd"
placeholder="请输入整改措施清单"
/>
</template>
</el-table-column>
<el-table-column prop="fjcl" label="附件材料">
<template #default="scope">
<FileUploader
v-model="scope.row.fjcl"
:isInline="true"
></FileUploader>
</template>
</el-table-column>
<el-table-column label="操作" width="60">
<template #default="scope">
<el-button
link
type="danger"
size="small"
@click="deleteTzfhs(scope.$index)"
@click="deleteJsqtzjcZxjcs(scope.$index)"
>删除</el-button
>
</template>
</el-table-column>
</el-table>
<div class="subtotal">
<div class="label">流入小计</div>
<div class="value">{{ subtotalNum }}(万元)</div>
</div>
</el-collapse-item>
<el-collapse-item title="净现金流" name="净现金流">
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="静态">
<el-input
v-model.number="formData.jt"
placeholder="请输入静态"
/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="折现(3.5%)">
<el-input
v-model.number="formData.zx"
placeholder="请输入折现(3.5%)"
/>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="联系人">
<el-input
v-model="formData.lxr"
placeholder="请输入联系人"
/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="联系方式">
<el-input
v-model="formData.lxfs"
placeholder="请输入联系方式"
/>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="24">
<el-form-item label="备注">
<el-input
type="textarea"
v-model="formData.bz"
placeholder="请输入备注"
:rows="4"
/>
</el-form-item>
</el-col>
</el-row>
</el-collapse-item>
</el-collapse>
</el-form>
......@@ -474,155 +227,28 @@
</template>
<script setup>
import { reactive, ref, onMounted, getCurrentInstance, h, computed } from "vue";
import { reactive, ref, onMounted, getCurrentInstance } from "vue";
import { useRouter, useRoute } from "vue-router";
import { ElMessage, ElMessageBox } from "element-plus";
import { useUserStore } from "@/stores/user.js";
import { number } from "echarts";
import FileUploader from "../../components/FileUploader/index.vue";
// 初始化全局变量
const userStore = useUserStore();
const router = useRouter();
const route = useRoute();
const { proxy } = getCurrentInstance();
const token = ref(
userStore.authToken || sessionStorage.getItem("authToken") || ""
);
// 小记金额
const subtotalNum = computed(() => {
let totalHtje = tzfhs.value.reduce((sum, item) => {
const num = Number(item.fhje) || 0; // 兼容空值/非数字
return sum + num;
}, 0);
let totalYwlr = wtyys.value.reduce((sum, item) => {
const num = Number(item.ywlr) || 0; // 兼容空值/非数字
return sum + num;
}, 0);
console.log(totalYwlr, "totalYwlr");
console.log(totalHtje, "totalHtje");
return (totalHtje + totalYwlr).toFixed(2);
});
// 折叠面板默认展开项
const activeCollapse = ref([
"基本信息",
"出资情况",
"合同约定权益获取",
"分红情况",
"资金流入",
"净现金流",
"资金流出",
"分红情况",
]);
const activeCollapse = ref(["基本信息", "投资(成本)分析会资料", "专项检查"]);
// 表单数据
const formData = reactive({
projectName: "",
qc: "",
jc: "",
nbtzglzt: "",
xmscjd: "",
gqjg: "",
xmzbjze: "",
gszbjyczze: "",
gsdqycze: "",
gsdqyjcze: "",
gsdqycwcje: "",
gsdqsycze: "",
cgbczqk: "",
wfqyhttkyd: "",
qyhqjz: "",
qyhqyyd: "",
dbqk: "",
lrfp: "",
sfddlrfptj: "",
ljhqfh: "",
ytrzj: "",
ljtrzj: "",
sxtrzj: "",
jt: "",
zx: "",
lxr: "",
lxfs: "",
bz: "",
projectId: "",
del: 0, // del字段保留0默认值(删除标记,0为正常)
del: 0, // 删除标记,0为正常
createdAt: "",
updatedAt: "",
});
let options = ref();
function sumWtyysColumns(param) {
const { columns, data } = param;
const sums = [];
columns.forEach((column, index) => {
if (index === 0) {
sums[index] = h("div", "合计");
return;
}
const prop = column.property;
if (prop === "lx" || prop === "fwsj" || !prop) {
sums[index] = "";
return;
}
if (prop === "htje") {
const values = data.map((item) => Number(item.htje) || 0);
const total = values.reduce((prev, curr) => prev + curr, 0);
sums[index] = total.toFixed(2) + "(万元)";
return;
}
if (prop === "ywlr") {
const values = data.map((item) => Number(item.ywlr) || 0);
const total = values.reduce((prev, curr) => prev + curr, 0);
sums[index] = total.toFixed(2) + "(万元)";
return;
}
sums[index] = "";
});
return sums;
}
function sumTzfhsColumns(param) {
const { columns, data } = param;
const sums = [];
columns.forEach((column, index) => {
if (index === 0) {
sums[index] = h("div", "合计");
return;
}
const prop = column.property;
if (prop === "fhsj" || !prop) {
sums[index] = "";
return;
}
// 分红金额合计
if (prop === "fhje") {
const values = data.map((item) => Number(item.fhje) || 0);
const total = values.reduce((prev, curr) => prev + curr, 0);
sums[index] = total.toFixed(2) + "(万元)";
return;
}
sums[index] = "";
});
return sums;
}
// 加载状态
const loading = ref(false);
// 是否预览模式
......@@ -632,36 +258,54 @@ const projectList = ref([]);
// 当前编辑的记录ID
const rcCgqyglId = ref(route.query.id || "");
let wtyys = ref([]);
const addPfyjlsqk = () => {
wtyys.value.push({});
// 投资(成本)分析会资料列表
const jsqtzjcTzfxsList = ref([]);
// 专项检查列表
const jsqtzjcZxjcsList = ref([]);
// ========== 投资(成本)分析会资料 操作方法 ==========
const addjsqtzjcTzfxs = () => {
jsqtzjcTzfxsList.value.push({
jd: "",
ycztz: "",
zbjnbsyl: "",
jsqtzjcTzfxs: [],
});
};
const deletePfyjlsqk = (index) => {
const deletejsqtzjcTzfxs = (index) => {
ElMessageBox.confirm("确认删除该项?", "提示", {
confirmButtonText: "确认",
cancelButtonText: "取消",
type: "warning",
}).then(() => {
wtyys.value.splice(index, 1);
jsqtzjcTzfxsList.value.splice(index, 1);
ElMessage.success("删除成功");
});
};
let tzfhs = ref([]);
// 新增
const addTzfhs = () => {
tzfhs.value.push({});
// ========== 专项检查 操作方法 ==========
const addJsqtzjcZxjcs = () => {
jsqtzjcZxjcsList.value.push({
zxjcfl: "",
jcjg: "",
zgcsqd: "",
fjcl: [],
});
};
// 删除
const deleteTzfhs = (index) => {
const deleteJsqtzjcZxjcs = (index) => {
ElMessageBox.confirm("确认删除该项?", "提示", {
confirmButtonText: "确认",
cancelButtonText: "取消",
type: "warning",
}).then(() => {
tzfhs.value.splice(index, 1);
jsqtzjcZxjcsList.value.splice(index, 1);
ElMessage.success("删除成功");
});
};
// ========== 通用方法 ==========
// 获取项目列表
const getProjectData = () => {
proxy.$post({
......@@ -690,25 +334,20 @@ const changeProject = (val) => {
};
// 获取单条记录详情(编辑/预览)
const getRcCgqyglDetail = () => {
const getJsqtzjcDetail = () => {
if (!rcCgqyglId.value) return;
loading.value = true;
proxy.$post({
url: "/api/project/getCgqygl",
url: "/api/project/getJsqtzjcInfo",
data: { id: rcCgqyglId.value },
callback: (data) => {
loading.value = false;
Object.assign(formData, {
...data,
});
if (data.wtyys) {
Object.assign(wtyys.value, data.wtyys);
}
// 新增:加载
if (data.tzfhs) {
Object.assign(tzfhs.value, data.tzfhs);
}
// 赋值基础表单数据
Object.assign(formData, data);
// 赋值列表数据
jsqtzjcTzfxsList.value = data.jsqtzjcTzfxs || [];
jsqtzjcZxjcsList.value = data.jsqtzjcZxjcs || [];
},
errorCallback: () => {
loading.value = false;
......@@ -717,6 +356,7 @@ const getRcCgqyglDetail = () => {
});
};
// 返回上一页
const backClick = () => {
router.back(-1);
};
......@@ -732,43 +372,53 @@ const saveClick = () => {
loading.value = true;
// 区分新增/编辑
const url = rcCgqyglId.value
? "/api/project/updateCgqygl"
: "/api/project/createCgqygl";
? "/api/project/updateJsqtzjc"
: "/api/project/createJsqtzjc";
// 处理空数字字段:空值转为null,避免提交空字符串
// 组装提交数据
const submitData = {
...formData,
projectId: formData.projectId + "",
wtyys: wtyys.value,
tzfhs: tzfhs.value,
projectId: formData.projectId + "", // 确保为字符串类型
jsqtzjcTzfxs: jsqtzjcTzfxsList.value,
jsqtzjcZxjcs: jsqtzjcZxjcsList.value,
};
proxy.$post({
url: url,
data: submitData,
callback: (res) => {
callback: () => {
loading.value = false;
ElMessage.success(rcCgqyglId.value ? "编辑成功" : "新增成功");
router.back(-1);
},
errorCallback: () => {
loading.value = false;
ElMessage.error("保存失败,请重试");
},
});
};
let options = ref();
// 页面初始化
onMounted(() => {
// 获取项目列表
getProjectData();
options.value = JSON.parse(sessionStorage.getItem("resourceData"));
// 如果有ID则加载详情
if (rcCgqyglId.value) {
getRcCgqyglDetail();
getJsqtzjcDetail();
}
});
</script>
<style scoped lang="less">
@import "@/styles/verticalManages.less";
// @import "@/styles/manage.less";
.tab-handle {
margin-bottom: 10px;
text-align: left;
}
.subtotal {
background-color: #f5f7fa;
......
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