明树Git Lab

Commit e91d68aa authored by zhanghan's avatar zhanghan

体系建设 投资规划 开发完毕

parent 7d1f1f9a
<template>
<div class="common-selector-container">
<el-select
v-if="!radio"
v-model="innerValue"
:placeholder="placeholder"
:no-data-text="noDataText"
:disabled="disabled"
style="width: 100%"
@change="handleChange"
>
<el-option
v-for="(item, index) in currentOptions"
:key="`${dictName}-${index}`"
:label="item[labelKey]"
:value="item[valueKey]"
></el-option>
</el-select>
<el-radio-group
v-else
v-model="innerValue"
:disabled="disabled"
@change="handleChange"
class="common-radio-group"
>
<el-radio
v-for="(item, index) in currentOptions"
:key="`${dictName}-${index}`"
:value="item[valueKey]"
>
{{ item[labelKey] }}
</el-radio>
</el-radio-group>
</div>
</template>
<script setup>
import {
ref,
watch,
defineProps,
defineEmits,
onMounted,
onUnmounted,
} from "vue";
// 极简Props:仅传 v-model + dictName(必传),其余可选
const props = defineProps({
// 双向绑定值(必传)
modelValue: {
type: [String, Number, Object],
default: undefined,
},
// 必传:指定从resourceData中取哪个字典(如dqlx/ zdfx-type/ fileHierarchy)
dictName: {
type: String,
required: true,
},
// 可选:自定义选项标签字段(默认name)
labelKey: {
type: String,
default: "name",
},
// 可选:自定义选项值字段(默认key)
valueKey: {
type: String,
default: "key",
},
// 可选:是否切换为单选组(默认false=下拉)
radio: {
type: Boolean,
default: false,
},
// 可选:是否禁用
disabled: {
type: Boolean,
default: false,
},
// 可选:自定义占位符
placeholder: {
type: String,
default: "请选择",
},
// 可选:自定义无数据文本
noDataText: {
type: String,
default: "暂无数据",
},
});
// 事件派发(v-model规范 + 自定义change)
const emit = defineEmits(["update:modelValue", "change"]);
// 内部状态
const innerValue = ref(props.modelValue); // 内部绑定值
const currentOptions = ref([]); // 最终渲染的字典数据
// 核心方法:从sessionStorage读取resourceData并匹配字典
const getDictFromStorage = () => {
try {
// 读取并解析sessionStorage中的resourceData
const resourceStr = sessionStorage.getItem("resourceData") || "{}";
const resourceData = JSON.parse(resourceStr);
// 根据dictName取对应字典,容错:非数组则置空
const targetDict = resourceData[props.dictName] || [];
currentOptions.value = Array.isArray(targetDict) ? targetDict : [];
} catch (e) {
currentOptions.value = [];
console.warn(`【通用选择器】读取${props.dictName}字典失败:`, e);
}
};
// 监听sessionStorage变化(适配resourceData动态更新的场景)
const handleStorageChange = (e) => {
if (e.key === "resourceData") getDictFromStorage();
};
// 初始化+监听
onMounted(() => {
getDictFromStorage(); // 首次加载读取字典
window.addEventListener("storage", handleStorageChange); // 监听storage变化
});
// 销毁时移除监听,避免内存泄漏
onUnmounted(() => {
window.removeEventListener("storage", handleStorageChange);
});
// 监听1:外部v-model值变化,同步到组件内部
watch(
() => props.modelValue,
(newVal) => {
innerValue.value = newVal;
},
{ immediate: true }
);
// 监听2:dictName/labelKey/valueKey变化,重新读取字典(适配动态切换字典的场景)
watch(
() => [props.dictName, props.labelKey, props.valueKey],
() => {
getDictFromStorage();
},
{ deep: true }
);
// 核心:值变化时更新外部v-model
const handleChange = (val) => {
emit("update:modelValue", val);
emit("change", val);
};
</script>
<style scoped lang="less">
.common-selector-container {
width: 100%; // 自适应布局
}
// 单选组间距优化
.common-radio-group {
display: flex;
flex-wrap: wrap;
gap: 16px 32px;
align-items: center;
width: 100%;
}
// 修复下拉选项宽度继承
:deep(.el-select) {
width: 100%;
}
</style>
import { createApp } from 'vue'
import './style.css'
import App from './App.vue'
import ElementPlus from 'element-plus'
import 'element-plus/dist/index.css'
import * as ElIcons from '@element-plus/icons'
import zhCn from 'element-plus/dist/locale/zh-cn.mjs'
import router from './router'
import { createPinia } from 'pinia';
import { createApp } from "vue";
import "./style.css";
import App from "./App.vue";
import ElementPlus from "element-plus";
import "element-plus/dist/index.css";
import CommonSelector from "@/components/CommonSelector.vue";
import * as ElIcons from "@element-plus/icons";
import zhCn from "element-plus/dist/locale/zh-cn.mjs";
import router from "./router";
import { createPinia } from "pinia";
import "./assets/fonts/font.less"; // 字体样式
import "../public/iconFont/iconfont.css"; // 图标字体样式
import { $get, $post } from "@/data/https.js";
import windowConfig from "@/window";
import moment from "moment";
const pinia = createPinia()
const app = createApp(App)
const pinia = createPinia();
const app = createApp(App);
app.config.globalProperties.$get = $get;
app.config.globalProperties.$post = $post;
app.config.globalProperties.windowConfig = windowConfig;
app.config.globalProperties.moment = moment;
for (const [key, component] of Object.entries(ElIcons)) {
app.component(key, component)
app.component(key, component);
}
app.use(ElementPlus, {locale: zhCn}).use(router).use(pinia).mount('#app')
app.component("CommonSelector", CommonSelector);
app.use(ElementPlus, { locale: zhCn }).use(router).use(pinia).mount("#app");
......@@ -14,30 +14,69 @@
<div class="project-tab-content">
<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">
<el-form-item label="文件名称">
<el-input
v-model="formData.qsmbgbzdw"
placeholder="请输入文件名称"
/>
<el-form-item label-width="0" required>
<el-select
v-model="formData.projectId"
placeholder="请选择项目信息"
no-data-text="暂无数据"
@change="changeProject"
>
<el-option
v-for="item in projectList"
:key="item.key"
:label="item.projectName"
:value="item.id"
></el-option>
</el-select>
</el-form-item>
</el-col>
</el-row>
</el-collapse-item>
<el-collapse-item
title="项目公司自查报告"
name="项目公司自查报告"
>
<el-form-item label-width="0" label="">
<FileUploader v-model="formData.xmgszcbg" />
</el-form-item>
</el-collapse-item>
<el-collapse-item title="投资后评价报告" name="投资后评价报告">
<el-row :gutter="20">
<el-col :span="24">
<el-form-item label-width="0" label="">
<FileUploader v-model="formData.hpjbg" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="颁布时间">
<el-form-item label="评价时间">
<el-date-picker
v-model="formData.qsmsj"
v-model="formData.hpjsj"
type="datetime"
format="YYYY-MM-DD HH:mm:ss"
value-format="YYYY-MM-DD HH:mm:ss"
placeholder="请选择颁布时间"
placeholder="请选择评价时间"
/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="报告编制单位">
<el-input
v-model="formData.hpjbgbzdw"
placeholder="请输入报告编制单位"
/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="评审单位">
<el-input
v-model="formData.qsmpsdw"
v-model="formData.hpjpsdw"
placeholder="请输入评审单位"
/>
</el-form-item>
......@@ -45,18 +84,75 @@
<el-col :span="12">
<el-form-item label="评价结果">
<el-input
v-model="formData.qsmpjjg"
v-model="formData.hpjpjjg"
placeholder="请输入评价结果"
/>
</el-form-item>
</el-col>
</el-row>
</el-collapse-item>
<el-collapse-item title="问题整改" name="问题整改">
<DynamicTable
v-model="formData.tzhpjwtzgs"
:columns="problemColumns"
:default-row="problemDefaultRow"
:select-options="selectOptions"
:show-import-export="true"
export-name="问题整改数据"
:scrollbar-always-on="true"
:disabled="isPreview"
/>
</el-collapse-item>
<el-collapse-item
title="全生命周期评价报告"
name="全生命周期评价报告"
>
<el-row :gutter="20">
<el-col :span="24">
<el-form-item label-width="0" label="">
<FileUploader v-model="formData.qsmzqpj" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="评价时间">
<el-date-picker
v-model="formData.qsmsj"
type="datetime"
format="YYYY-MM-DD HH:mm:ss"
value-format="YYYY-MM-DD HH:mm:ss"
placeholder="请选择评价时间"
/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="报告编制单位">
<el-input
v-model="formData.qsmbgbzdw"
placeholder="请输入报告编制单位"
/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="评审单位">
<el-input
v-model="formData.qsmpsdw"
placeholder="请输入评审单位"
/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="评价结果">
<el-input
v-model="formData.qsmpjjg"
placeholder="请输入评价结果"
/>
</el-form-item>
</el-col>
</el-row>
</el-collapse-item>
</el-collapse>
</el-form>
</div>
</div>
......
......@@ -4,7 +4,7 @@
<div class="manage-header">
<div class="header-left"></div>
<div class="header-right">
<el-button type="primary" @click="shareAdd">新增</el-button>
<el-button type="primary" @click="investmentAdd">新增</el-button>
</div>
</div>
<div class="manage-content" v-loading="loading">
......@@ -64,39 +64,44 @@ const { proxy } = getCurrentInstance();
let tableData = ref([]);
let tableColumns = ref([
{
prop: "qc",
label: "项目全称",
prop: "itemName",
label: "事项名称",
showOverflowTooltip: true,
},
{
prop: "jc",
label: "项目简称",
prop: "itemType",
label: "事项类型",
showOverflowTooltip: true,
},
{
prop: "nbtzglzt",
label: "内部投资管理主体",
prop: "planYear",
label: "编制年度",
showOverflowTooltip: true,
},
{
prop: "planCycle",
label: "规划周期(年)",
showOverflowTooltip: true,
width: 170,
},
{
prop: "xmscjd",
label: "项目所处阶段",
prop: "planUnit",
label: "编制单位",
showOverflowTooltip: true,
width: 120,
},
{
prop: "gqjg",
label: "股权结构",
prop: "leadingDepartment",
label: "牵头部门",
showOverflowTooltip: true,
width: 120,
},
{
prop: "xmzbjze",
label: "项目资本金总额(亿元)",
prop: "creatorName",
label: "填报人",
showOverflowTooltip: true,
},
{
prop: "creatorTime",
label: "填报时间",
showOverflowTooltip: true,
width: 180,
},
{
......@@ -116,13 +121,18 @@ let pageSize = ref(10);
const getStatementData = () => {
loading.value = true;
proxy.$post({
url: "/api/project/getCgqyglList",
url: "/api/project/getTzghList",
data: {
page: currentPage.value,
pagesize: pageSize.value,
},
callback: (data) => {
tableData.value = data.rows;
tableData.value = data.rows.map((it) => {
return {
...it,
fjscLen: it.fjsc?.length + "个",
};
});
total.value = data.count;
loading.value = false;
},
......@@ -138,12 +148,12 @@ const handleCurrentPageChange = (page) => {
currentPage.value = page;
getStatementData();
};
const shareAdd = () => {
router.push("/shareAdd");
const investmentAdd = () => {
router.push("/investmentAdd");
};
const editStatement = (item) => {
router.push({
name: "shareAdd",
name: "investmentAdd",
query: {
id: item.id,
},
......@@ -151,7 +161,7 @@ const editStatement = (item) => {
};
const previewStatement = (item) => {
router.push({
name: "shareAdd",
name: "investmentAdd",
query: {
isPreview: true,
id: item.id,
......@@ -166,7 +176,7 @@ const deleteStatement = (item) => {
})
.then(() => {
proxy.$post({
url: "/api/project/deleteCgqygl",
url: "/api/project/deleteTzgh",
data: {
id: item.id,
},
......@@ -184,5 +194,5 @@ onMounted(() => {
</script>
<style scoped lang="less">
@import "@/styles/manage.less";
@import "@/styles/verticalManages.less";
</style>
......@@ -14,457 +14,111 @@
<div class="project-tab-content">
<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">
<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.key"
:label="item.projectName"
:value="item.id"
></el-option>
</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-input
v-model="formData.qc"
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-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-col :span="12">
<el-form-item label="股权结构">
<el-form-item label="事项名称">
<el-input
v-model="formData.gqjg"
placeholder="请输入股权结构"
v-model="formData.itemName"
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-form-item label="事项类型">
<el-input
v-model.number="formData.xmzbjze"
placeholder="请输入项目资本金总额(亿元)"
v-model="formData.itemType"
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 label="编制年度">
<el-date-picker
v-model="formData.planYear"
type="year"
format="YYYY"
value-format="YYYY"
placeholder="请选择编制年度"
picker-options="{ disabledDate: (date) => date > new Date() }"
/>
</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 label="规划周期(年)">
<el-input-number
v-model="formData.planCycle"
placeholder="请输入规划周期"
:min="1"
:max="100"
style="width: 100%"
/>
<span class="input-tip">单位:年</span>
</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.gsdqyjcze"
placeholder="请输入公司当前已出资额(亿元)"
v-model="formData.planUnit"
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.number="formData.gsdqycwcje"
placeholder="请输入公司当前应出未出金额(亿元)"
v-model="formData.leadingDepartment"
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.creatorName"
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="formData.cgbczqk"
placeholder="请输入超股比出资情况"
<el-form-item label="填报时间">
<el-date-picker
v-model="formData.creatorTime"
type="date"
format="YYYY-MM-DD"
value-format="YYYY-MM-DD"
placeholder="请选择填报时间"
picker-options="{ disabledDate: (date) => date > new Date() }"
/>
</el-form-item>
</el-col>
</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 label="上级单位投资规划" label-width="200">
<FileUploader v-model="formData.sjdwtzgh" />
</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"
>
<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
>
</div>
<el-table
:data="wtyys"
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="服务时间">
<template #default="scope">
<el-date-picker
v-model="scope.row.fwsj"
type="datetime"
format="YYYY-MM-DD HH:mm:ss"
value-format="YYYY-MM-DD HH:mm:ss"
placeholder="请选择"
/>
</template>
</el-table-column>
<el-table-column prop="htje" label="合同金额(万元)">
<template #default="scope">
<el-input
v-model.number="scope.row.htje"
placeholder="请输入合同金额(万元)"
/>
</template>
</el-table-column>
<el-table-column prop="ywlr" label="业务利润(万元)">
<template #default="scope">
<el-input
v-model.number="scope.row.ywlr"
placeholder="请输入业务利润(万元)"
/>
</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>
<div class="tab-handle">
<el-button type="primary" @click="addTzfhs">新增</el-button>
</div>
<el-table
:data="tzfhs"
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="分红时间">
<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="请选择"
/>
</template>
</el-table-column>
<el-table-column prop="fhje" label="分红金额(万元)">
<template #default="scope">
<el-input
v-model.number="scope.row.fhje"
placeholder="请输入分红金额"
/>
</template>
</el-table-column>
<el-table-column label="操作" width="60">
<template #default="scope">
<el-button
link
type="danger"
size="small"
@click="deleteTzfhs(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 label="本级单位投资规划" label-width="200">
<FileUploader v-model="formData.bjdwtzgh" />
</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 label="其他材料" label-width="200">
<FileUploader v-model="formData.qtcl" />
</el-form-item>
</el-col>
</el-row>
</el-collapse-item>
</el-collapse>
</el-form>
</div>
</div>
......@@ -474,308 +128,156 @@
</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 { ElMessage } from "element-plus";
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);
// ========== 核心状态 ==========
const loading = ref(false); // 加载状态
const isPreview = ref(!!route.query.isPreview); // 是否预览模式
const rcTzghId = ref(route.query.id || ""); // 投资规划记录ID(匹配表名)
const options = ref({}); // 预留配置项,后续有下拉可扩展
return (totalHtje + totalYwlr).toFixed(2);
});
// 折叠面板默认展开项
const activeCollapse = ref([
"基本信息",
"出资情况",
"合同约定权益获取",
"分红情况",
"资金流入",
"净现金流",
"资金流出",
"分红情况",
]);
// 表单数据
// ========== 表单核心数据(完全匹配RcTzgh表结构) ==========
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为正常)
createdAt: "",
updatedAt: "",
itemName: "", // 事项名称
itemType: "", // 事项类型
planYear: "", // 编制年度(YYYY格式)
planCycle: "", // 规划周期(年)
planUnit: "", // 编制单位
leadingDepartment: "", // 牵头部门
creatorName: "", // 填报人
creatorTime: "", // 填报时间
sjdwtzgh: [], // 上级单位投资规划(附件JSON)
bjdwtzgh: [], // 本级单位投资规划(附件JSON)
qtcl: [], // 其他材料(附件JSON)
creator: proxy.$store?.getters?.userId || "", // 创建人ID(从全局状态取,可根据实际调整)
del: 0, // 删除标识,默认正常
});
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);
// 是否预览模式
const isPreview = ref(!!route.query.isPreview);
// 项目列表数据
const projectList = ref([]);
// 当前编辑的记录ID
const rcCgqyglId = ref(route.query.id || "");
let wtyys = ref([]);
const addPfyjlsqk = () => {
wtyys.value.push({});
};
const deletePfyjlsqk = (index) => {
ElMessageBox.confirm("确认删除该项?", "提示", {
confirmButtonText: "确认",
cancelButtonText: "取消",
type: "warning",
}).then(() => {
wtyys.value.splice(index, 1);
});
};
let tzfhs = ref([]);
// 新增
const addTzfhs = () => {
tzfhs.value.push({});
};
// 删除
const deleteTzfhs = (index) => {
ElMessageBox.confirm("确认删除该项?", "提示", {
confirmButtonText: "确认",
cancelButtonText: "取消",
type: "warning",
}).then(() => {
tzfhs.value.splice(index, 1);
});
};
// 获取项目列表
const getProjectData = () => {
proxy.$post({
url: "/api/project/listProject",
data: {
page: 1,
pagesize: 1000,
attributes: [],
menuType: "xmjc",
},
callback: (data) => {
projectList.value = data.rows || [];
},
});
};
// 选择项目后同步项目名称
const changeProject = (val) => {
const selectItem = projectList.value.find((item) => item.id === val);
if (selectItem) {
formData.projectName = selectItem.projectName;
}
};
// 获取单条记录详情(编辑/预览)
const getRcCgqyglDetail = () => {
if (!rcCgqyglId.value) return;
// ========== 接口请求 ==========
// 获取投资规划单条记录详情(编辑/预览时用)
const getRcTzghDetail = () => {
loading.value = true;
proxy.$post({
url: "/api/project/getCgqygl",
data: { id: rcCgqyglId.value },
url: "/api/project/getTzgh", // 匹配投资规划接口
data: { id: rcTzghId.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);
// 处理时间/数字格式,避免渲染报错
formData.planYear = data.planYear || "";
formData.planCycle = Number(data.planCycle) || "";
formData.creatorTime = data.creatorTime || "";
// 附件数组默认值
formData.sjdwtzgh = data.sjdwtzgh || [];
formData.bjdwtzgh = data.bjdwtzgh || [];
formData.qtcl = data.qtcl || [];
},
error: () => (loading.value = false),
});
};
// ========== 页面操作方法 ==========
// 返回上一页
const backClick = () => {
router.back(-1);
};
// 保存/提交表单
// 保存/提交表单(新增/编辑统一处理)
const saveClick = () => {
// 基础校验
if (!formData.projectId) {
ElMessage.warning("请选择项目信息");
return;
}
// // 简单表单校验
// if (!formData.itemName || !formData.itemType || !formData.planYear) {
// ElMessage.warning("请填写必填的事项名称、事项类型、编制年度");
// return;
// }
// if (
// !formData.planCycle ||
// !formData.planUnit ||
// !formData.leadingDepartment
// ) {
// ElMessage.warning("请填写必填的规划周期、编制单位、牵头部门");
// return;
// }
// if (!formData.creatorName || !formData.creatorTime) {
// ElMessage.warning("请填写必填的填报人、填报时间");
// return;
// }
loading.value = true;
// 区分新增/编辑
const url = rcCgqyglId.value
? "/api/project/updateCgqygl"
: "/api/project/createCgqygl";
// 处理空数字字段:空值转为null,避免提交空字符串
const submitData = {
...formData,
projectId: formData.projectId + "",
wtyys: wtyys.value,
tzfhs: tzfhs.value,
};
// 匹配投资规划的新增/编辑接口
const url = rcTzghId.value
? "/api/project/updateTzgh"
: "/api/project/createTzgh";
proxy.$post({
url: url,
data: submitData,
callback: (res) => {
data: { ...formData },
callback: () => {
loading.value = false;
ElMessage.success(rcCgqyglId.value ? "编辑成功" : "新增成功");
ElMessage.success(
rcTzghId.value ? "投资规划编辑成功" : "投资规划新增成功"
);
router.back(-1);
},
error: (err) => {
loading.value = false;
ElMessage.error(err.msg || "操作失败,请稍后重试");
},
});
};
// 页面初始化
// ========== 页面初始化 ==========
onMounted(() => {
// 获取项目列表
getProjectData();
options.value = JSON.parse(sessionStorage.getItem("resourceData"));
// 如果有ID则加载详情
if (rcCgqyglId.value) {
getRcCgqyglDetail();
// 编辑/预览模式,加载投资规划详情数据
if (rcTzghId.value) {
getRcTzghDetail();
}
});
</script>
<style scoped lang="less">
@import "@/styles/verticalManages.less";
// @import "@/styles/manage.less";
.subtotal {
background-color: #f5f7fa;
height: 40px;
.add-project-container {
padding: 20px;
background: #f5f7fa;
min-height: calc(100vh - 60px);
}
.add-project-content {
background: #fff;
border-radius: 4px;
padding: 20px;
box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.04);
}
.add-project-header {
display: flex;
.label {
width: 100px;
height: 40px;
text-align: center;
line-height: 40px;
border-right: 1px solid #ebeef5;
}
.value {
padding-left: 16px;
width: 100%;
line-height: 40px;
}
justify-content: space-between;
align-items: center;
margin-bottom: 20px;
padding-bottom: 10px;
border-bottom: 1px solid #ebeef5;
}
// 表单样式优化
:deep(.el-form-item__label) {
font-weight: 500;
}
// 数字输入框提示文字
.input-tip {
margin-left: 8px;
color: #909399;
font-size: 12px;
}
// 附件上传区域间距
:deep(.el-upload) {
margin-bottom: 10px;
}
</style>
......@@ -4,7 +4,7 @@
<div class="manage-header">
<div class="header-left"></div>
<div class="header-right">
<el-button type="primary" @click="shareAdd">新增</el-button>
<el-button type="primary" @click="investmentAdd">新增</el-button>
</div>
</div>
<div class="manage-content" v-loading="loading">
......@@ -64,39 +64,44 @@ const { proxy } = getCurrentInstance();
let tableData = ref([]);
let tableColumns = ref([
{
prop: "qc",
label: "项目全称",
prop: "itemName",
label: "事项名称",
showOverflowTooltip: true,
},
{
prop: "jc",
label: "项目简称",
prop: "itemType",
label: "事项类型",
showOverflowTooltip: true,
},
{
prop: "nbtzglzt",
label: "内部投资管理主体",
prop: "planYear",
label: "编制年度",
showOverflowTooltip: true,
},
{
prop: "planCycle",
label: "规划周期(年)",
showOverflowTooltip: true,
width: 170,
},
{
prop: "xmscjd",
label: "项目所处阶段",
prop: "planUnit",
label: "编制单位",
showOverflowTooltip: true,
width: 120,
},
{
prop: "gqjg",
label: "股权结构",
prop: "leadingDepartment",
label: "牵头部门",
showOverflowTooltip: true,
width: 120,
},
{
prop: "xmzbjze",
label: "项目资本金总额(亿元)",
prop: "creatorName",
label: "填报人",
showOverflowTooltip: true,
},
{
prop: "creatorTime",
label: "填报时间",
showOverflowTooltip: true,
width: 180,
},
{
......@@ -116,13 +121,18 @@ let pageSize = ref(10);
const getStatementData = () => {
loading.value = true;
proxy.$post({
url: "/api/project/getCgqyglList",
url: "/api/project/getTzghList",
data: {
page: currentPage.value,
pagesize: pageSize.value,
},
callback: (data) => {
tableData.value = data.rows;
tableData.value = data.rows.map((it) => {
return {
...it,
fjscLen: it.fjsc?.length + "个",
};
});
total.value = data.count;
loading.value = false;
},
......@@ -138,12 +148,12 @@ const handleCurrentPageChange = (page) => {
currentPage.value = page;
getStatementData();
};
const shareAdd = () => {
router.push("/shareAdd");
const investmentAdd = () => {
router.push("/investmentAdd");
};
const editStatement = (item) => {
router.push({
name: "shareAdd",
name: "investmentAdd",
query: {
id: item.id,
},
......@@ -151,7 +161,7 @@ const editStatement = (item) => {
};
const previewStatement = (item) => {
router.push({
name: "shareAdd",
name: "investmentAdd",
query: {
isPreview: true,
id: item.id,
......@@ -166,7 +176,7 @@ const deleteStatement = (item) => {
})
.then(() => {
proxy.$post({
url: "/api/project/deleteCgqygl",
url: "/api/project/deleteTzgh",
data: {
id: item.id,
},
......@@ -184,5 +194,5 @@ onMounted(() => {
</script>
<style scoped lang="less">
@import "@/styles/manage.less";
@import "@/styles/verticalManages.less";
</style>
......@@ -14,457 +14,111 @@
<div class="project-tab-content">
<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">
<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.key"
:label="item.projectName"
:value="item.id"
></el-option>
</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-form-item label="事项名称">
<el-input
v-model="formData.qc"
placeholder="请输入全称"
v-model="formData.itemName"
placeholder="请输入事项名称"
/>
</el-form-item>
</el-col>
<!-- 事项类型 -->
<el-col :span="12">
<el-form-item label="简称">
<el-input
v-model="formData.jc"
placeholder="请输入简称"
<el-form-item label="事项类型">
<CommonSelector
:radio="true"
v-model="formData.itemType"
dictName="matterType"
/>
</el-form-item>
</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-col :span="12">
<el-form-item label="股权结构">
<el-input
v-model="formData.gqjg"
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 label="编制年度">
<el-date-picker
v-model="formData.planYear"
type="year"
format="YYYY"
value-format="YYYY"
placeholder="请选择编制年度"
picker-options="{ disabledDate: (date) => date > new Date() }"
/>
</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 label="规划周期(年)">
<el-input-number
v-model="formData.planCycle"
placeholder="请输入规划周期"
:min="1"
:max="100"
style="width: 100%"
/>
</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.gsdqyjcze"
placeholder="请输入公司当前已出资额(亿元)"
v-model="formData.planUnit"
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.number="formData.gsdqycwcje"
placeholder="请输入公司当前应出未出金额(亿元)"
v-model="formData.leadingDepartment"
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.creatorName"
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="formData.cgbczqk"
placeholder="请输入超股比出资情况"
<el-form-item label="填报时间">
<el-date-picker
v-model="formData.creatorTime"
type="date"
format="YYYY-MM-DD"
value-format="YYYY-MM-DD"
placeholder="请选择填报时间"
picker-options="{ disabledDate: (date) => date > new Date() }"
/>
</el-form-item>
</el-col>
</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 label="上级单位投资规划" label-width="200">
<FileUploader v-model="formData.sjdwtzgh" />
</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"
>
<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
>
</div>
<el-table
:data="wtyys"
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="服务时间">
<template #default="scope">
<el-date-picker
v-model="scope.row.fwsj"
type="datetime"
format="YYYY-MM-DD HH:mm:ss"
value-format="YYYY-MM-DD HH:mm:ss"
placeholder="请选择"
/>
</template>
</el-table-column>
<el-table-column prop="htje" label="合同金额(万元)">
<template #default="scope">
<el-input
v-model.number="scope.row.htje"
placeholder="请输入合同金额(万元)"
/>
</template>
</el-table-column>
<el-table-column prop="ywlr" label="业务利润(万元)">
<template #default="scope">
<el-input
v-model.number="scope.row.ywlr"
placeholder="请输入业务利润(万元)"
/>
</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>
<div class="tab-handle">
<el-button type="primary" @click="addTzfhs">新增</el-button>
</div>
<el-table
:data="tzfhs"
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="分红时间">
<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="请选择"
/>
</template>
</el-table-column>
<el-table-column prop="fhje" label="分红金额(万元)">
<template #default="scope">
<el-input
v-model.number="scope.row.fhje"
placeholder="请输入分红金额"
/>
</template>
</el-table-column>
<el-table-column label="操作" width="60">
<template #default="scope">
<el-button
link
type="danger"
size="small"
@click="deleteTzfhs(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 label="本级单位投资规划" label-width="200">
<FileUploader v-model="formData.bjdwtzgh" />
</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 label="其他材料" label-width="200">
<FileUploader v-model="formData.qtcl" />
</el-form-item>
</el-col>
</el-row>
</el-collapse-item>
</el-collapse>
</el-form>
</div>
</div>
......@@ -474,308 +128,119 @@
</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 { ElMessage } from "element-plus";
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);
// ========== 核心状态 ==========
const loading = ref(false); // 加载状态
const isPreview = ref(!!route.query.isPreview); // 是否预览模式
const rcTzghId = ref(route.query.id || ""); // 投资规划记录ID(匹配表名)
const options = ref({}); // 预留配置项,后续有下拉可扩展
return (totalHtje + totalYwlr).toFixed(2);
});
// 折叠面板默认展开项
const activeCollapse = ref([
"基本信息",
"出资情况",
"合同约定权益获取",
"分红情况",
"资金流入",
"净现金流",
"资金流出",
"分红情况",
]);
// 表单数据
// ========== 表单核心数据(完全匹配RcTzgh表结构) ==========
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为正常)
createdAt: "",
updatedAt: "",
itemName: "", // 事项名称
itemType: "", // 事项类型
planYear: "", // 编制年度(YYYY格式)
planCycle: "", // 规划周期(年)
planUnit: "", // 编制单位
leadingDepartment: "", // 牵头部门
creatorName: "", // 填报人
creatorTime: "", // 填报时间
sjdwtzgh: [], // 上级单位投资规划(附件JSON)
bjdwtzgh: [], // 本级单位投资规划(附件JSON)
qtcl: [], // 其他材料(附件JSON)
creator: proxy.$store?.getters?.userId || "", // 创建人ID(从全局状态取,可根据实际调整)
del: 0, // 删除标识,默认正常
});
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);
// 是否预览模式
const isPreview = ref(!!route.query.isPreview);
// 项目列表数据
const projectList = ref([]);
// 当前编辑的记录ID
const rcCgqyglId = ref(route.query.id || "");
let wtyys = ref([]);
const addPfyjlsqk = () => {
wtyys.value.push({});
};
const deletePfyjlsqk = (index) => {
ElMessageBox.confirm("确认删除该项?", "提示", {
confirmButtonText: "确认",
cancelButtonText: "取消",
type: "warning",
}).then(() => {
wtyys.value.splice(index, 1);
});
};
let tzfhs = ref([]);
// 新增
const addTzfhs = () => {
tzfhs.value.push({});
};
// 删除
const deleteTzfhs = (index) => {
ElMessageBox.confirm("确认删除该项?", "提示", {
confirmButtonText: "确认",
cancelButtonText: "取消",
type: "warning",
}).then(() => {
tzfhs.value.splice(index, 1);
});
};
// 获取项目列表
const getProjectData = () => {
proxy.$post({
url: "/api/project/listProject",
data: {
page: 1,
pagesize: 1000,
attributes: [],
menuType: "xmjc",
},
callback: (data) => {
projectList.value = data.rows || [];
},
});
};
// 选择项目后同步项目名称
const changeProject = (val) => {
const selectItem = projectList.value.find((item) => item.id === val);
if (selectItem) {
formData.projectName = selectItem.projectName;
}
};
// 获取单条记录详情(编辑/预览)
const getRcCgqyglDetail = () => {
if (!rcCgqyglId.value) return;
// ========== 接口请求 ==========
// 获取投资规划单条记录详情(编辑/预览时用)
const getRcTzghDetail = () => {
loading.value = true;
proxy.$post({
url: "/api/project/getCgqygl",
data: { id: rcCgqyglId.value },
url: "/api/project/getTzgh", // 匹配投资规划接口
data: { id: rcTzghId.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);
// 处理时间/数字格式,避免渲染报错
formData.planYear = data.planYear || "";
formData.planCycle = Number(data.planCycle) || "";
formData.creatorTime = data.creatorTime || "";
// 附件数组默认值
formData.sjdwtzgh = data.sjdwtzgh || [];
formData.bjdwtzgh = data.bjdwtzgh || [];
formData.qtcl = data.qtcl || [];
},
error: () => (loading.value = false),
});
};
// ========== 页面操作方法 ==========
// 返回上一页
const backClick = () => {
router.back(-1);
};
// 保存/提交表单
// 保存/提交表单(新增/编辑统一处理)
const saveClick = () => {
// 基础校验
if (!formData.projectId) {
ElMessage.warning("请选择项目信息");
return;
}
// // 简单表单校验
// if (!formData.itemName || !formData.itemType || !formData.planYear) {
// ElMessage.warning("请填写必填的事项名称、事项类型、编制年度");
// return;
// }
// if (
// !formData.planCycle ||
// !formData.planUnit ||
// !formData.leadingDepartment
// ) {
// ElMessage.warning("请填写必填的规划周期、编制单位、牵头部门");
// return;
// }
// if (!formData.creatorName || !formData.creatorTime) {
// ElMessage.warning("请填写必填的填报人、填报时间");
// return;
// }
loading.value = true;
// 区分新增/编辑
const url = rcCgqyglId.value
? "/api/project/updateCgqygl"
: "/api/project/createCgqygl";
// 处理空数字字段:空值转为null,避免提交空字符串
const submitData = {
...formData,
projectId: formData.projectId + "",
wtyys: wtyys.value,
tzfhs: tzfhs.value,
};
// 匹配投资规划的新增/编辑接口
const url = rcTzghId.value
? "/api/project/updateTzgh"
: "/api/project/createTzgh";
proxy.$post({
url: url,
data: submitData,
callback: (res) => {
data: { ...formData },
callback: () => {
loading.value = false;
ElMessage.success(rcCgqyglId.value ? "编辑成功" : "新增成功");
ElMessage.success(
rcTzghId.value ? "投资规划编辑成功" : "投资规划新增成功"
);
router.back(-1);
},
error: (err) => {
loading.value = false;
ElMessage.error(err.msg || "操作失败,请稍后重试");
},
});
};
// 页面初始化
// ========== 页面初始化 ==========
onMounted(() => {
// 获取项目列表
getProjectData();
options.value = JSON.parse(sessionStorage.getItem("resourceData"));
// 如果有ID则加载详情
if (rcCgqyglId.value) {
getRcCgqyglDetail();
// 编辑/预览模式,加载投资规划详情数据
if (rcTzghId.value) {
getRcTzghDetail();
}
});
</script>
<style scoped lang="less">
@import "@/styles/verticalManages.less";
// @import "@/styles/manage.less";
.subtotal {
background-color: #f5f7fa;
height: 40px;
display: flex;
.label {
width: 100px;
height: 40px;
text-align: center;
line-height: 40px;
border-right: 1px solid #ebeef5;
}
.value {
padding-left: 16px;
width: 100%;
line-height: 40px;
}
}
</style>
......@@ -4,7 +4,7 @@
<div class="manage-header">
<div class="header-left"></div>
<div class="header-right">
<el-button type="primary" @click="evaluateAdd">新增</el-button>
<el-button type="primary" @click="systemAdd">新增</el-button>
</div>
</div>
<div class="manage-content" v-loading="loading">
......@@ -64,34 +64,29 @@ const { proxy } = getCurrentInstance();
let tableData = ref([]);
let tableColumns = ref([
{
prop: "projectName",
label: "项目信息",
showOverflowTooltip: true,
},
{
prop: "xmgszcbgLen",
prop: "wjmc",
label: "文件名称",
showOverflowTooltip: true,
},
{
prop: "hpjbgLen",
prop: "wjcj",
label: "文件层级",
showOverflowTooltip: true,
},
{
prop: "qsmzqpjLen",
prop: "wjlb",
label: "文件类别",
showOverflowTooltip: true,
},
{
prop: "附件上传",
label: "文件类别",
prop: "fjscLen",
label: "附件上传",
showOverflowTooltip: true,
},
{
prop: "颁布时间",
label: "文件类别",
prop: "bbsj",
label: "颁布时间",
showOverflowTooltip: true,
},
......@@ -112,7 +107,7 @@ let pageSize = ref(10);
const getStatementData = () => {
loading.value = true;
proxy.$post({
url: "/api/project/getTzhpjList",
url: "/api/project/getTxjsList",
data: {
page: currentPage.value,
pagesize: pageSize.value,
......@@ -121,10 +116,7 @@ const getStatementData = () => {
tableData.value = data.rows.map((it) => {
return {
...it,
xmgszcbgLen: it.xmgszcbg?.length + "个",
hpjbgLen: it.hpjbg?.length + "个",
qsmzqpjLen: it.qsmzqpj?.length + "个",
fjscLen: it.fjsc?.length + "个",
};
});
total.value = data.count;
......@@ -142,12 +134,12 @@ const handleCurrentPageChange = (page) => {
currentPage.value = page;
getStatementData();
};
const evaluateAdd = () => {
router.push("/evaluateAdd");
const systemAdd = () => {
router.push("/systemAdd");
};
const editStatement = (item) => {
router.push({
name: "evaluateAdd",
name: "systemAdd",
query: {
id: item.id,
},
......@@ -155,7 +147,7 @@ const editStatement = (item) => {
};
const previewStatement = (item) => {
router.push({
name: "evaluateAdd",
name: "systemAdd",
query: {
isPreview: true,
id: item.id,
......@@ -170,7 +162,7 @@ const deleteStatement = (item) => {
})
.then(() => {
proxy.$post({
url: "/api/project/deleteTzhpj",
url: "/api/project/deleteTxjs",
data: {
id: item.id,
},
......
......@@ -14,145 +14,62 @@
<div class="project-tab-content">
<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">
<el-form-item label-width="0" required>
<el-select
v-model="formData.projectId"
placeholder="请选择项目信息"
no-data-text="暂无数据"
@change="changeProject"
>
<el-option
v-for="item in projectList"
:key="item.key"
:label="item.projectName"
:value="item.id"
></el-option>
</el-select>
</el-form-item>
</el-col>
</el-row>
</el-collapse-item>
<el-collapse-item
title="项目公司自查报告"
name="项目公司自查报告"
>
<el-form-item label-width="0" label="">
<FileUploader v-model="formData.xmgszcbg" />
</el-form-item>
</el-collapse-item>
<el-collapse-item title="投资后评价报告" name="投资后评价报告">
<el-row :gutter="20">
<el-col :span="24">
<el-form-item label-width="0" label="">
<FileUploader v-model="formData.hpjbg" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="评价时间">
<el-date-picker
v-model="formData.hpjsj"
type="datetime"
format="YYYY-MM-DD HH:mm:ss"
value-format="YYYY-MM-DD HH:mm:ss"
placeholder="请选择评价时间"
/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="报告编制单位">
<el-form-item label="文件名称">
<el-input
v-model="formData.hpjbgbzdw"
placeholder="请输入报告编制单位"
v-model="formData.wjmc"
placeholder="请输入文件名称"
/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="评审单位">
<el-input
v-model="formData.hpjpsdw"
placeholder="请输入评审单位"
/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="评价结果">
<el-input
v-model="formData.hpjpjjg"
placeholder="请输入评价结果"
/>
</el-form-item>
</el-col>
</el-row>
</el-collapse-item>
<el-collapse-item title="问题整改" name="问题整改">
<DynamicTable
v-model="formData.tzhpjwtzgs"
:columns="problemColumns"
:default-row="problemDefaultRow"
:select-options="selectOptions"
:show-import-export="true"
export-name="问题整改数据"
:scrollbar-always-on="true"
:disabled="isPreview"
/>
</el-collapse-item>
<el-collapse-item
title="全生命周期评价报告"
name="全生命周期评价报告"
>
<el-row :gutter="20">
<el-col :span="24">
<el-form-item label-width="0" label="">
<FileUploader v-model="formData.qsmzqpj" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="评价时间">
<el-form-item label="颁布时间">
<el-date-picker
v-model="formData.qsmsj"
type="datetime"
format="YYYY-MM-DD HH:mm:ss"
value-format="YYYY-MM-DD HH:mm:ss"
placeholder="请选择评价时间"
v-model="formData.bbsj"
type="year"
format="YYYY-MM-DD"
value-format="YYYY-MM-DD"
placeholder="请选择颁布时间"
/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="报告编制单位">
<el-input
v-model="formData.qsmbgbzdw"
placeholder="请输入报告编制单位"
/>
<el-form-item label="文件层级">
<el-radio-group
v-model="formData.wjcj"
placeholder="请选择文件层级"
>
<el-radio
v-for="item in options?.fileHierarchy"
:key="item.id"
:value="item.key"
>{{ item.name }}</el-radio
>
</el-radio-group>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="评审单位">
<el-input
v-model="formData.qsmpsdw"
placeholder="请输入评审单位"
/>
<el-form-item label="文件类别">
<el-select
v-model="formData.wjlb"
placeholder="请选择文件类别"
>
<el-option
v-for="item in options?.fileType"
:key="item.key"
:label="item.name"
:value="item.key"
></el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="评价结果">
<el-input
v-model="formData.qsmpjjg"
placeholder="请输入评价结果"
/>
<el-col :span="24">
<el-form-item label-width="0" label="">
<FileUploader v-model="formData.fjsc" />
</el-form-item>
</el-col>
</el-row>
</el-collapse-item>
</el-collapse>
</el-form>
</div>
</div>
......@@ -164,207 +81,61 @@
<script setup>
import { reactive, ref, onMounted, getCurrentInstance } from "vue";
import { useRouter, useRoute } from "vue-router";
import { ElMessage, ElMessageBox } from "element-plus";
import { ElMessage } from "element-plus";
import FileUploader from "../../components/FileUploader/index.vue";
// 引入增强后的DynamicTable组件
import DynamicTable from "../../components/FormDynamicTable/index.vue";
// 初始化全局变量
// 路由&全局实例
const router = useRouter();
const route = useRoute();
const { proxy } = getCurrentInstance();
// 折叠面板默认展开项
const activeCollapse = ref([
"项目信息",
"项目公司自查报告",
"投资后评价报告",
"问题整改",
"全生命周期评价报告",
]);
// ========== 问题整改表格配置 ==========
// 列配置(包含input、textarea、datetime、radio类型)
const problemColumns = ref([
{
prop: "ccwt",
label: "存在的问题",
type: "input",
placeholder: "请输入存在的问题",
minWidth: 140,
},
{
prop: "wtxs",
label: "问题详述",
type: "textarea",
placeholder: "请输入问题详述",
rows: 2,
minWidth: 140,
},
{
prop: "zgcs",
label: "整改措施",
type: "textarea",
placeholder: "请输入整改措施",
rows: 2,
minWidth: 140,
},
{
prop: "lsqk",
label: "落实情况",
type: "textarea",
placeholder: "请输入落实情况",
rows: 2,
minWidth: 140,
},
{
prop: "zrbm",
label: "责任部门",
type: "input",
placeholder: "请输入责任部门",
minWidth: 140,
},
{
prop: "zrr",
label: "责任人",
type: "input",
placeholder: "请输入责任人",
minWidth: 140,
},
{
prop: "zgqx",
label: "整改期限",
type: "datetime", // 日期时间选择器
placeholder: "请选择整改期限",
format: "YYYY-MM-DD HH:mm:ss",
valueFormat: "YYYY-MM-DD HH:mm:ss",
minWidth: 140,
},
{
prop: "sfgb",
label: "是否关闭",
type: "radio", // 单选框组
optionKey: "sf", // 对应selectOptions中的sf选项
align: "center",
minWidth: 140,
},
]);
// 问题整改默认行数据
const problemDefaultRow = ref({
ccwt: "",
wtxs: "",
zgcs: "",
lsqk: "",
zrbm: "",
zrr: "",
zgqx: "",
sfgb: "",
fjcl: [],
});
// 单选框选项配置
const selectOptions = ref({
sf: [
{ key: 1, name: "是" },
{ key: 2, name: "否" },
],
});
// ========== 核心状态 ==========
const loading = ref(false); // 加载状态
const isPreview = ref(!!route.query.isPreview); // 是否预览模式
const rcCgqyglId = ref(route.query.id || ""); // 当前编辑记录ID
const options = ref({}); // 下拉/单选全局配置项(文件层级/类别)
// ========== 表单数据 ==========
// ========== 表单核心数据(删除无用数组,仅保留页面绑定的字段) ==========
const formData = reactive({
xmgszcbg: [],
hpjbg: [],
qsmzqpj: [],
// 问题整改列表(由DynamicTable自动维护)
tzhpjwtzgs: [],
wjmc: "", // 文件名称
bbsj: "", // 颁布时间
wjcj: "", // 文件层级
wjlb: "", // 文件类别
fjsc: [], // 附件上传
});
// 加载状态
const loading = ref(false);
// 是否预览模式
const isPreview = ref(!!route.query.isPreview);
// 项目列表数据
const projectList = ref([]);
// 当前编辑的记录ID
const rcCgqyglId = ref(route.query.id || "");
// ========== 原有方法保留(移除手动新增/删除) ==========
// 获取项目列表
const getProjectData = () => {
proxy.$post({
url: "/api/project/listProject",
data: {
page: 1,
pagesize: 1000,
attributes: [],
menuType: "xmjc",
},
callback: (data) => {
projectList.value = data.rows || [];
},
});
};
// 选择项目后同步项目名称
const changeProject = (val) => {
const selectItem = projectList.value.find((item) => item.id === val);
if (selectItem) {
formData.projectName = selectItem.projectName;
}
};
// 获取单条记录详情
// ========== 接口请求 ==========
// 获取单条记录详情(编辑/预览时用)
const getJsqtzjcDetail = () => {
if (!rcCgqyglId.value) return;
loading.value = true;
proxy.$post({
url: "/api/project/getTzhpjInfo",
url: "/api/project/getTxjs",
data: { id: rcCgqyglId.value },
callback: (data) => {
loading.value = false;
Object.assign(formData, data);
// 确保数组字段有默认值
formData.tzhpjwtzgs = data.tzhpjwtzgs || [];
formData.xmgszcbg = data.xmgszcbg || [];
formData.hpjbg = data.hpjbg || [];
formData.qsmzqpj = data.qsmzqpj || [];
// 同步单选选项(如果从接口获取)
if (data.sfOptions) {
selectOptions.value.sf = data.sfOptions;
}
// 确保附件数组有默认值,避免渲染报错
formData.fjsc = data.fjsc || [];
},
error: () => (loading.value = false),
});
};
// ========== 页面操作方法 ==========
// 返回上一页
const backClick = () => {
router.back(-1);
};
// 保存/提交表单
// 保存/提交表单(新增/编辑统一处理)
const saveClick = () => {
if (!formData.projectId) {
ElMessage.warning("请选择项目信息");
return;
}
loading.value = true;
const url = rcCgqyglId.value
? "/api/project/updateTzhpj"
: "/api/project/createTzhpj";
const submitData = {
...formData,
projectId: formData.projectId + "",
tzhpjwtzgs: formData.tzhpjwtzgs,
};
? "/api/project/updateTxjs"
: "/api/project/createTxjs";
proxy.$post({
url: url,
data: submitData,
data: { ...formData },
callback: () => {
loading.value = false;
ElMessage.success(rcCgqyglId.value ? "编辑成功" : "新增成功");
......@@ -377,22 +148,16 @@ const saveClick = () => {
});
};
let options = ref();
// 页面初始化
// ========== 页面初始化 ==========
onMounted(() => {
getProjectData();
// 从sessionStorage获取全局配置项(文件层级/类别)
try {
options.value = JSON.parse(sessionStorage.getItem("resourceData")) || {};
// 合并全局选项到selectOptions
if (options.value.sf) {
selectOptions.value.sf = options.value.sf;
}
} catch (e) {
options.value = {};
console.warn("解析resourceData失败:", e);
}
// 编辑/预览模式,加载详情数据
if (rcCgqyglId.value) {
getJsqtzjcDetail();
}
......@@ -424,21 +189,7 @@ onMounted(() => {
border-bottom: 1px solid #ebeef5;
}
.tab-handle {
margin-bottom: 10px;
text-align: left;
}
:deep(.el-table) {
--el-table-header-text-color: #303133;
--el-table-row-hover-bg-color: #f8f9fa;
}
:deep(.el-collapse-item__header) {
font-weight: 600;
font-size: 14px;
}
// 保留核心样式,删除无用的表格/折叠面板样式(页面未使用)
:deep(.el-form-item__label) {
font-weight: 500;
}
......
......@@ -4,7 +4,7 @@
<div class="manage-header">
<div class="header-left"></div>
<div class="header-right">
<el-button type="primary" @click="shareAdd">新增</el-button>
<el-button type="primary" @click="vscouncilAdd">新增</el-button>
</div>
</div>
<div class="manage-content" v-loading="loading">
......@@ -64,39 +64,39 @@ const { proxy } = getCurrentInstance();
let tableData = ref([]);
let tableColumns = ref([
{
prop: "qc",
label: "项目全称",
prop: "meetingCode",
label: "会议编号",
showOverflowTooltip: true,
},
{
prop: "jc",
label: "项目简称",
prop: "meetingName",
label: "会议名称",
showOverflowTooltip: true,
},
{
prop: "nbtzglzt",
label: "内部投资管理主体",
prop: "meetingDate",
label: "会议时间",
showOverflowTooltip: true,
},
{
prop: "meetingLocation",
label: "会议地点",
showOverflowTooltip: true,
width: 170,
},
{
prop: "xmscjd",
label: "项目所处阶段",
prop: "attendingLeaders",
label: "参会领导",
showOverflowTooltip: true,
width: 120,
},
{
prop: "gqjg",
label: "股权结构",
prop: "attendingDepartments",
label: "参会部门",
showOverflowTooltip: true,
width: 120,
},
{
prop: "xmzbjze",
label: "项目资本金总额(亿元)",
prop: "meetingMinutesAttachmentLen", // 会议纪要附件数量(表meetingMinutesAttachment数组长度)
label: "会议纪要",
showOverflowTooltip: true,
width: 180,
},
{
......@@ -116,13 +116,18 @@ let pageSize = ref(10);
const getStatementData = () => {
loading.value = true;
proxy.$post({
url: "/api/project/getCgqyglList",
url: "/api/project/getTwhglList",
data: {
page: currentPage.value,
pagesize: pageSize.value,
},
callback: (data) => {
tableData.value = data.rows;
tableData.value = data.rows.map((it) => {
return {
...it,
fjscLen: it.fjsc?.length + "个",
};
});
total.value = data.count;
loading.value = false;
},
......@@ -138,12 +143,12 @@ const handleCurrentPageChange = (page) => {
currentPage.value = page;
getStatementData();
};
const shareAdd = () => {
router.push("/shareAdd");
const vscouncilAdd = () => {
router.push("/vscouncilAdd");
};
const editStatement = (item) => {
router.push({
name: "shareAdd",
name: "vscouncilAdd",
query: {
id: item.id,
},
......@@ -151,7 +156,7 @@ const editStatement = (item) => {
};
const previewStatement = (item) => {
router.push({
name: "shareAdd",
name: "vscouncilAdd",
query: {
isPreview: true,
id: item.id,
......@@ -166,7 +171,7 @@ const deleteStatement = (item) => {
})
.then(() => {
proxy.$post({
url: "/api/project/deleteCgqygl",
url: "/api/project/deleteTwhgl",
data: {
id: item.id,
},
......@@ -184,5 +189,5 @@ onMounted(() => {
</script>
<style scoped lang="less">
@import "@/styles/manage.less";
@import "@/styles/verticalManages.less";
</style>
......@@ -14,457 +14,74 @@
<div class="project-tab-content">
<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">
<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.key"
:label="item.projectName"
:value="item.id"
></el-option>
</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-input
v-model="formData.qc"
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-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-col :span="12">
<el-form-item label="股权结构">
<el-input
v-model="formData.gqjg"
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-input
v-model.number="formData.gsdqsycze"
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="formData.cgbczqk"
placeholder="请输入超股比出资情况"
/>
</el-form-item>
</el-col>
</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"
>
<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-form-item label="会议编号">
<el-input
v-model.number="formData.ljhqfh"
placeholder="请输入累计获取分红(万元)"
v-model="formData.meetingCode"
placeholder="请输入会议编号(如:TWH202601)"
/>
</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-form-item label="会议名称">
<el-input
v-model.number="formData.ytrzj"
placeholder="请输入应投入资金(万元)"
v-model="formData.meetingName"
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
>
</div>
<el-table
:data="wtyys"
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="服务时间">
<template #default="scope">
<el-form-item label="会议时间">
<el-date-picker
v-model="scope.row.fwsj"
type="datetime"
format="YYYY-MM-DD HH:mm:ss"
value-format="YYYY-MM-DD HH:mm:ss"
placeholder="请选择"
/>
</template>
</el-table-column>
<el-table-column prop="htje" label="合同金额(万元)">
<template #default="scope">
<el-input
v-model.number="scope.row.htje"
placeholder="请输入合同金额(万元)"
/>
</template>
</el-table-column>
<el-table-column prop="ywlr" label="业务利润(万元)">
<template #default="scope">
<el-input
v-model.number="scope.row.ywlr"
placeholder="请输入业务利润(万元)"
/>
</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>
<div class="tab-handle">
<el-button type="primary" @click="addTzfhs">新增</el-button>
</div>
<el-table
:data="tzfhs"
v-model="formData.meetingDate"
type="date"
format="YYYY-MM-DD"
value-format="YYYY-MM-DD"
placeholder="请选择会议时间"
picker-options="{ disabledDate: (date) => date > new Date() }"
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="分红时间">
<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="请选择"
/>
</template>
</el-table-column>
<el-table-column prop="fhje" label="分红金额(万元)">
<template #default="scope">
<el-input
v-model.number="scope.row.fhje"
placeholder="请输入分红金额"
/>
</template>
</el-table-column>
<el-table-column label="操作" width="60">
<template #default="scope">
<el-button
link
type="danger"
size="small"
@click="deleteTzfhs(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-form-item label="会议地点">
<el-input
v-model.number="formData.zx"
placeholder="请输入折现(3.5%)"
v-model="formData.meetingLocation"
placeholder="请输入会议地点"
/>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<!-- 参会领导 -->
<el-col :span="12">
<el-form-item label="联系人">
<el-form-item label="参会领导">
<el-input
v-model="formData.lxr"
placeholder="请输入联系人"
v-model="formData.attendingLeaders"
placeholder="请输入参会领导"
/>
</el-form-item>
</el-col>
<!-- 参会部门 -->
<el-col :span="12">
<el-form-item label="联系方式">
<el-form-item label="参会部门">
<el-input
v-model="formData.lxfs"
placeholder="请输入联系方式"
v-model="formData.attendingDepartments"
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 label="会议纪要附件" label-width="200">
<FileUploader v-model="formData.meetingMinutesAttachment" />
</el-form-item>
</el-col>
</el-row>
</el-collapse-item>
</el-collapse>
</el-form>
</div>
</div>
......@@ -474,308 +91,157 @@
</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 { ElMessage } from "element-plus";
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);
// ========== 核心状态 ==========
const loading = ref(false); // 加载状态
const isPreview = ref(!!route.query.isPreview); // 是否预览模式
const rcTwhglId = ref(route.query.id || ""); // 投委会管理记录ID(匹配表名)
return (totalHtje + totalYwlr).toFixed(2);
});
// 折叠面板默认展开项
const activeCollapse = ref([
"基本信息",
"出资情况",
"合同约定权益获取",
"分红情况",
"资金流入",
"净现金流",
"资金流出",
"分红情况",
// 会议层级固定选项(匹配表注释:company-公司级,department-部门级,project-项目级)
const meetingLevelOptions = ref([
{ key: "company", label: "公司级" },
{ key: "department", label: "部门级" },
{ key: "project", label: "项目级" },
]);
// 表单数据
// ========== 表单核心数据(完全匹配RcTwhgl表结构) ==========
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为正常)
createdAt: "",
updatedAt: "",
meetingCode: "", // 会议编号(唯一、必填)
meetingName: "", // 会议名称(必填)
meetingDate: "", // 会议时间(必填)
meetingLocation: "", // 会议地点
attendingLeaders: "", // 参会领导
attendingDepartments: "", // 参会部门
meetingMinutesAttachment: [], // 会议纪要附件(JSON数组,组件直接绑定)
projectId: "", // 所属项目ID
creator: proxy.$store?.getters?.userId || "", // 创建人ID(从全局状态取,可调整)
del: 0, // 删除标识,默认正常
});
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);
// 是否预览模式
const isPreview = ref(!!route.query.isPreview);
// 项目列表数据
const projectList = ref([]);
// 当前编辑的记录ID
const rcCgqyglId = ref(route.query.id || "");
let wtyys = ref([]);
const addPfyjlsqk = () => {
wtyys.value.push({});
};
const deletePfyjlsqk = (index) => {
ElMessageBox.confirm("确认删除该项?", "提示", {
confirmButtonText: "确认",
cancelButtonText: "取消",
type: "warning",
}).then(() => {
wtyys.value.splice(index, 1);
});
};
let tzfhs = ref([]);
// 新增
const addTzfhs = () => {
tzfhs.value.push({});
};
// 删除
const deleteTzfhs = (index) => {
ElMessageBox.confirm("确认删除该项?", "提示", {
confirmButtonText: "确认",
cancelButtonText: "取消",
type: "warning",
}).then(() => {
tzfhs.value.splice(index, 1);
});
};
// 获取项目列表
const getProjectData = () => {
proxy.$post({
url: "/api/project/listProject",
data: {
page: 1,
pagesize: 1000,
attributes: [],
menuType: "xmjc",
},
callback: (data) => {
projectList.value = data.rows || [];
},
});
};
// 选择项目后同步项目名称
const changeProject = (val) => {
const selectItem = projectList.value.find((item) => item.id === val);
if (selectItem) {
formData.projectName = selectItem.projectName;
}
};
// 获取单条记录详情(编辑/预览)
const getRcCgqyglDetail = () => {
if (!rcCgqyglId.value) return;
// ========== 接口请求 ==========
// 获取投委会管理单条记录详情(编辑/预览时用)
const getRcTwhglDetail = () => {
loading.value = true;
proxy.$post({
url: "/api/project/getCgqygl",
data: { id: rcCgqyglId.value },
url: "/api/project/getTwhgl",
data: { id: rcTwhglId.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);
// 格式处理&默认值,避免渲染报错
formData.projectId = Number(data.projectId) || "";
formData.meetingDate = data.meetingDate || "";
formData.meetingMinutesAttachment = data.meetingMinutesAttachment || [];
},
error: () => (loading.value = false),
});
};
// ========== 页面操作方法 ==========
// 返回上一页
const backClick = () => {
router.back(-1);
};
// 保存/提交表单
// 保存/提交表单(新增/编辑统一处理)
const saveClick = () => {
// 基础校验
if (!formData.projectId) {
ElMessage.warning("请选择项目信息");
// 核心必填项校验(表中allowNull:false的字段)
if (!formData.meetingCode) {
ElMessage.warning("请填写会议编号,编号唯一请勿重复");
return;
}
if (!formData.meetingName) {
ElMessage.warning("请填写会议名称");
return;
}
if (!formData.meetingDate) {
ElMessage.warning("请选择会议时间");
return;
}
loading.value = true;
// 区分新增/编辑
const url = rcCgqyglId.value
? "/api/project/updateCgqygl"
: "/api/project/createCgqygl";
// 处理空数字字段:空值转为null,避免提交空字符串
const submitData = {
...formData,
projectId: formData.projectId + "",
wtyys: wtyys.value,
tzfhs: tzfhs.value,
};
// 投委会管理专属新增/编辑接口
const url = rcTwhglId.value
? "/api/project/updateRcTwhgl"
: "/api/project/createRcTwhgl";
proxy.$post({
url: url,
data: submitData,
callback: (res) => {
data: { ...formData },
callback: () => {
loading.value = false;
ElMessage.success(rcCgqyglId.value ? "编辑成功" : "新增成功");
ElMessage.success(
rcTwhglId.value ? "投委会记录编辑成功" : "投委会记录新增成功"
);
router.back(-1);
},
error: (err) => {
loading.value = false;
// 唯一键冲突特殊提示(会议编号重复)
if (err.msg?.includes("unique") || err.msg?.includes("重复")) {
ElMessage.error("会议编号已存在,请更换唯一编号后重试");
} else {
ElMessage.error(err.msg || "操作失败,请稍后重试");
}
},
});
};
// 页面初始化
// ========== 页面初始化 ==========
onMounted(() => {
// 获取项目列表
getProjectData();
options.value = JSON.parse(sessionStorage.getItem("resourceData"));
// 如果有ID则加载详情
if (rcCgqyglId.value) {
getRcCgqyglDetail();
// 编辑/预览模式,加载投委会管理详情数据
if (rcTwhglId.value) {
getRcTwhglDetail();
}
});
</script>
<style scoped lang="less">
@import "@/styles/verticalManages.less";
// @import "@/styles/manage.less";
.subtotal {
background-color: #f5f7fa;
height: 40px;
.add-project-container {
padding: 20px;
background: #f5f7fa;
min-height: calc(100vh - 60px);
}
.add-project-content {
background: #fff;
border-radius: 4px;
padding: 20px;
box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.04);
}
.add-project-header {
display: flex;
.label {
width: 100px;
height: 40px;
text-align: center;
line-height: 40px;
border-right: 1px solid #ebeef5;
}
.value {
padding-left: 16px;
width: 100%;
line-height: 40px;
}
justify-content: space-between;
align-items: center;
margin-bottom: 20px;
padding-bottom: 10px;
border-bottom: 1px solid #ebeef5;
}
// 表单样式优化
:deep(.el-form-item__label) {
font-weight: 500;
}
// 输入框提示文字
.input-tip {
margin-left: 4px;
color: #f56c6c;
font-size: 12px;
line-height: 1.5;
}
// 附件上传区域间距
:deep(.el-upload) {
margin-bottom: 8px;
}
</style>
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