明树Git Lab

Commit 7d1f1f9a authored by zhanghan's avatar zhanghan

菜单创建

parent 5c1447f5
......@@ -202,15 +202,87 @@ const routes = [
{
path: "/share",
name: "share",
title: "投资目标责任书",
title: "参股企业管理",
component: () => import("@/views/everydayPage/share.vue"),
},
{
path: "/shareAdd",
name: "shareAdd",
title: "投资目标责任书",
title: "参股企业管理",
component: () => import("@/views/everydayPage/shareAdd.vue"),
},
{
path: "/system",
name: "system",
title: "体系建设",
component: () => import("@/views/everydayPage/system.vue"),
},
{
path: "/systemAdd",
name: "systemAdd",
title: "体系建设",
component: () => import("@/views/everydayPage/systemAdd.vue"),
},
{
path: "/investment",
name: "investment",
title: "投资规划",
component: () => import("@/views/everydayPage/investment.vue"),
},
{
path: "/investmentAdd",
name: "investmentAdd",
title: "投资规划",
component: () => import("@/views/everydayPage/investmentAdd.vue"),
},
{
path: "/everyday",
name: "everyday",
title: "日常信息",
component: () => import("@/views/everydayPage/everyday.vue"),
},
{
path: "/everydayAdd",
name: "everydayAdd",
title: "日常信息",
component: () => import("@/views/everydayPage/everydayAdd.vue"),
},
{
path: "/vscouncil",
name: "vscouncil",
title: "投委会管理",
component: () => import("@/views/everydayPage/vscouncil.vue"),
},
{
path: "/vscouncilAdd",
name: "vscouncilAdd",
title: "投委会管理",
component: () => import("@/views/everydayPage/vscouncilAdd.vue"),
},
{
path: "/record",
name: "record",
title: "投资档案管理",
component: () => import("@/views/everydayPage/record.vue"),
},
{
path: "/recordAdd",
name: "recordAdd",
title: "投资档案管理",
component: () => import("@/views/everydayPage/recordAdd.vue"),
},
{
path: "/annual",
name: "annual",
title: "年度计划",
component: () => import("@/views/everydayPage/annual.vue"),
},
{
path: "/annualAdd",
name: "annualAdd",
title: "年度计划",
component: () => import("@/views/everydayPage/annualAdd.vue"),
},
// {
// path: "/bigScreen",
// name: "bigScreen",
......
......@@ -14,145 +14,49 @@
<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-row :gutter="20">
<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-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.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-collapse-item
title="项目公司自查报告"
name="项目公司自查报告"
>
<el-col :span="24">
<el-form-item label-width="0" label="">
<FileUploader v-model="formData.xmgszcbg" />
<FileUploader v-model="formData.qsmzqpj" />
</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-input
v-model="formData.hpjbgbzdw"
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-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-col>
</el-row>
</el-form>
</div>
</div>
......
<template>
<div>annual</div>
</template>
<script setup></script>
<style scoped lang="scss"></style>
<template>
<div>annualAdd</div>
</template>
<script setup></script>
<style scoped lang="scss"></style>
<template>
<div class="manage-container">
<div class="manage-wrap">
<div class="manage-header">
<div class="header-left"></div>
<div class="header-right">
<el-button type="primary" @click="shareAdd">新增</el-button>
</div>
</div>
<div class="manage-content" v-loading="loading">
<common-table
:autoHeight="true"
:maxRows="10"
:data="tableData"
:columns="tableColumns"
:total="total"
:current-page="currentPage"
:page-size="pageSize"
:index="true"
:indexLabel="'序号'"
title=""
:border="true"
@size-change="handleSizeChange"
@current-page-change="handleCurrentPageChange"
>
<template #operations="{ row, index }">
<el-button
link
type="primary"
size="small"
@click="previewStatement(row)"
>查看</el-button
>
<el-button
link
type="primary"
size="small"
@click="editStatement(row)"
>编辑</el-button
>
<el-button
link
type="danger"
size="small"
@click="deleteStatement(row)"
>删除</el-button
>
</template>
</common-table>
</div>
</div>
</div>
</template>
<script setup>
import { ref, onMounted, getCurrentInstance } from "vue";
import { useRouter } from "vue-router";
import { ElMessage, ElMessageBox } from "element-plus";
import CommonTable from "@/components/common/commonTable.vue";
const router = useRouter();
const { proxy } = getCurrentInstance();
let tableData = ref([]);
let tableColumns = ref([
{
prop: "qc",
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",
label: "操作",
width: 170,
slot: "operations",
fixed: "right",
align: "center",
},
]);
let loading = ref(false);
let total = ref(0);
let currentPage = ref(1);
let pageSize = ref(10);
// 获取列表数据
const getStatementData = () => {
loading.value = true;
proxy.$post({
url: "/api/project/getCgqyglList",
data: {
page: currentPage.value,
pagesize: pageSize.value,
},
callback: (data) => {
tableData.value = data.rows;
total.value = data.count;
loading.value = false;
},
});
};
// 分页
const handleSizeChange = (size) => {
pageSize.value = size;
currentPage.value = 1;
getStatementData();
};
const handleCurrentPageChange = (page) => {
currentPage.value = page;
getStatementData();
};
const shareAdd = () => {
router.push("/shareAdd");
};
const editStatement = (item) => {
router.push({
name: "shareAdd",
query: {
id: item.id,
},
});
};
const previewStatement = (item) => {
router.push({
name: "shareAdd",
query: {
isPreview: true,
id: item.id,
},
});
};
const deleteStatement = (item) => {
ElMessageBox.confirm("确认删除该项?", "提示", {
confirmButtonText: "确认",
cancelButtonText: "取消",
type: "warning",
})
.then(() => {
proxy.$post({
url: "/api/project/deleteCgqygl",
data: {
id: item.id,
},
callback: (data) => {
ElMessage.success("删除成功");
getStatementData();
},
});
})
.catch(() => {});
};
onMounted(() => {
getStatementData();
});
</script>
<style scoped lang="less">
@import "@/styles/manage.less";
</style>
<template>
<div class="add-project-container">
<div class="add-project-content" v-loading="loading">
<div class="add-project-header">
<div class="header-left"></div>
<div class="header-right">
<el-button type="default" @click="backClick">返回</el-button>
<template v-if="!loading && !isPreview">
<el-button type="primary" @click="saveClick">保存</el-button>
</template>
</div>
</div>
<div class="tabs-content">
<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-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>
</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>
</div>
</div>
</div>
</div>
</div>
</template>
<script setup>
import { reactive, ref, onMounted, getCurrentInstance, h, computed } from "vue";
import { useRouter, useRoute } from "vue-router";
import { ElMessage, ElMessageBox } from "element-plus";
import { useUserStore } from "@/stores/user.js";
import { number } from "echarts";
// 初始化全局变量
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);
return (totalHtje + totalYwlr).toFixed(2);
});
// 折叠面板默认展开项
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为正常)
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);
// 是否预览模式
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;
loading.value = true;
proxy.$post({
url: "/api/project/getCgqygl",
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);
}
},
});
};
const backClick = () => {
router.back(-1);
};
// 保存/提交表单
const saveClick = () => {
// 基础校验
if (!formData.projectId) {
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,
};
proxy.$post({
url: url,
data: submitData,
callback: (res) => {
loading.value = false;
ElMessage.success(rcCgqyglId.value ? "编辑成功" : "新增成功");
router.back(-1);
},
});
};
// 页面初始化
onMounted(() => {
// 获取项目列表
getProjectData();
options.value = JSON.parse(sessionStorage.getItem("resourceData"));
// 如果有ID则加载详情
if (rcCgqyglId.value) {
getRcCgqyglDetail();
}
});
</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>
<template>
<div class="manage-container">
<div class="manage-wrap">
<div class="manage-header">
<div class="header-left"></div>
<div class="header-right">
<el-button type="primary" @click="shareAdd">新增</el-button>
</div>
</div>
<div class="manage-content" v-loading="loading">
<common-table
:autoHeight="true"
:maxRows="10"
:data="tableData"
:columns="tableColumns"
:total="total"
:current-page="currentPage"
:page-size="pageSize"
:index="true"
:indexLabel="'序号'"
title=""
:border="true"
@size-change="handleSizeChange"
@current-page-change="handleCurrentPageChange"
>
<template #operations="{ row, index }">
<el-button
link
type="primary"
size="small"
@click="previewStatement(row)"
>查看</el-button
>
<el-button
link
type="primary"
size="small"
@click="editStatement(row)"
>编辑</el-button
>
<el-button
link
type="danger"
size="small"
@click="deleteStatement(row)"
>删除</el-button
>
</template>
</common-table>
</div>
</div>
</div>
</template>
<script setup>
import { ref, onMounted, getCurrentInstance } from "vue";
import { useRouter } from "vue-router";
import { ElMessage, ElMessageBox } from "element-plus";
import CommonTable from "@/components/common/commonTable.vue";
const router = useRouter();
const { proxy } = getCurrentInstance();
let tableData = ref([]);
let tableColumns = ref([
{
prop: "qc",
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",
label: "操作",
width: 170,
slot: "operations",
fixed: "right",
align: "center",
},
]);
let loading = ref(false);
let total = ref(0);
let currentPage = ref(1);
let pageSize = ref(10);
// 获取列表数据
const getStatementData = () => {
loading.value = true;
proxy.$post({
url: "/api/project/getCgqyglList",
data: {
page: currentPage.value,
pagesize: pageSize.value,
},
callback: (data) => {
tableData.value = data.rows;
total.value = data.count;
loading.value = false;
},
});
};
// 分页
const handleSizeChange = (size) => {
pageSize.value = size;
currentPage.value = 1;
getStatementData();
};
const handleCurrentPageChange = (page) => {
currentPage.value = page;
getStatementData();
};
const shareAdd = () => {
router.push("/shareAdd");
};
const editStatement = (item) => {
router.push({
name: "shareAdd",
query: {
id: item.id,
},
});
};
const previewStatement = (item) => {
router.push({
name: "shareAdd",
query: {
isPreview: true,
id: item.id,
},
});
};
const deleteStatement = (item) => {
ElMessageBox.confirm("确认删除该项?", "提示", {
confirmButtonText: "确认",
cancelButtonText: "取消",
type: "warning",
})
.then(() => {
proxy.$post({
url: "/api/project/deleteCgqygl",
data: {
id: item.id,
},
callback: (data) => {
ElMessage.success("删除成功");
getStatementData();
},
});
})
.catch(() => {});
};
onMounted(() => {
getStatementData();
});
</script>
<style scoped lang="less">
@import "@/styles/manage.less";
</style>
<template>
<div class="add-project-container">
<div class="add-project-content" v-loading="loading">
<div class="add-project-header">
<div class="header-left"></div>
<div class="header-right">
<el-button type="default" @click="backClick">返回</el-button>
<template v-if="!loading && !isPreview">
<el-button type="primary" @click="saveClick">保存</el-button>
</template>
</div>
</div>
<div class="tabs-content">
<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-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>
</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>
</div>
</div>
</div>
</div>
</div>
</template>
<script setup>
import { reactive, ref, onMounted, getCurrentInstance, h, computed } from "vue";
import { useRouter, useRoute } from "vue-router";
import { ElMessage, ElMessageBox } from "element-plus";
import { useUserStore } from "@/stores/user.js";
import { number } from "echarts";
// 初始化全局变量
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);
return (totalHtje + totalYwlr).toFixed(2);
});
// 折叠面板默认展开项
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为正常)
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);
// 是否预览模式
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;
loading.value = true;
proxy.$post({
url: "/api/project/getCgqygl",
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);
}
},
});
};
const backClick = () => {
router.back(-1);
};
// 保存/提交表单
const saveClick = () => {
// 基础校验
if (!formData.projectId) {
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,
};
proxy.$post({
url: url,
data: submitData,
callback: (res) => {
loading.value = false;
ElMessage.success(rcCgqyglId.value ? "编辑成功" : "新增成功");
router.back(-1);
},
});
};
// 页面初始化
onMounted(() => {
// 获取项目列表
getProjectData();
options.value = JSON.parse(sessionStorage.getItem("resourceData"));
// 如果有ID则加载详情
if (rcCgqyglId.value) {
getRcCgqyglDetail();
}
});
</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>
<template>
<div>record</div>
</template>
<script setup></script>
<style scoped lang="scss"></style>
<template>
<div>recordAdd</div>
</template>
<script setup></script>
<style scoped lang="scss"></style>
<template>
<div class="manage-container">
<div class="manage-wrap">
<div class="manage-header">
<div class="header-left"></div>
<div class="header-right">
<el-button type="primary" @click="evaluateAdd">新增</el-button>
</div>
</div>
<div class="manage-content" v-loading="loading">
<common-table
:autoHeight="true"
:maxRows="10"
:data="tableData"
:columns="tableColumns"
:total="total"
:current-page="currentPage"
:page-size="pageSize"
:index="true"
:indexLabel="'序号'"
title=""
:border="true"
@size-change="handleSizeChange"
@current-page-change="handleCurrentPageChange"
>
<template #operations="{ row, index }">
<el-button
link
type="primary"
size="small"
@click="previewStatement(row)"
>查看</el-button
>
<el-button
link
type="primary"
size="small"
@click="editStatement(row)"
>编辑</el-button
>
<el-button
link
type="danger"
size="small"
@click="deleteStatement(row)"
>删除</el-button
>
</template>
</common-table>
</div>
</div>
</div>
</template>
<script setup>
import { ref, onMounted, getCurrentInstance } from "vue";
import { useRouter } from "vue-router";
import { ElMessage, ElMessageBox } from "element-plus";
import CommonTable from "@/components/common/commonTable.vue";
const router = useRouter();
const { proxy } = getCurrentInstance();
let tableData = ref([]);
let tableColumns = ref([
{
prop: "projectName",
label: "项目信息",
showOverflowTooltip: true,
},
{
prop: "xmgszcbgLen",
label: "文件名称",
showOverflowTooltip: true,
},
{
prop: "hpjbgLen",
label: "文件层级",
showOverflowTooltip: true,
},
{
prop: "qsmzqpjLen",
label: "文件类别",
showOverflowTooltip: true,
},
{
prop: "附件上传",
label: "文件类别",
showOverflowTooltip: true,
},
{
prop: "颁布时间",
label: "文件类别",
showOverflowTooltip: true,
},
{
prop: "operations",
label: "操作",
width: 170,
slot: "operations",
fixed: "right",
align: "center",
},
]);
let loading = ref(false);
let total = ref(0);
let currentPage = ref(1);
let pageSize = ref(10);
// 获取列表数据
const getStatementData = () => {
loading.value = true;
proxy.$post({
url: "/api/project/getTzhpjList",
data: {
page: currentPage.value,
pagesize: pageSize.value,
},
callback: (data) => {
tableData.value = data.rows.map((it) => {
return {
...it,
xmgszcbgLen: it.xmgszcbg?.length + "个",
hpjbgLen: it.hpjbg?.length + "个",
qsmzqpjLen: it.qsmzqpj?.length + "个",
};
});
total.value = data.count;
loading.value = false;
},
});
};
// 分页
const handleSizeChange = (size) => {
pageSize.value = size;
currentPage.value = 1;
getStatementData();
};
const handleCurrentPageChange = (page) => {
currentPage.value = page;
getStatementData();
};
const evaluateAdd = () => {
router.push("/evaluateAdd");
};
const editStatement = (item) => {
router.push({
name: "evaluateAdd",
query: {
id: item.id,
},
});
};
const previewStatement = (item) => {
router.push({
name: "evaluateAdd",
query: {
isPreview: true,
id: item.id,
},
});
};
const deleteStatement = (item) => {
ElMessageBox.confirm("确认删除该项?", "提示", {
confirmButtonText: "确认",
cancelButtonText: "取消",
type: "warning",
})
.then(() => {
proxy.$post({
url: "/api/project/deleteTzhpj",
data: {
id: item.id,
},
callback: (data) => {
ElMessage.success("删除成功");
getStatementData();
},
});
})
.catch(() => {});
};
onMounted(() => {
getStatementData();
});
</script>
<style scoped lang="less">
@import "@/styles/verticalManages.less";
</style>
<template>
<div class="add-project-container">
<div class="add-project-content" v-loading="loading">
<div class="add-project-header">
<div class="header-left"></div>
<div class="header-right">
<el-button type="default" @click="backClick">返回</el-button>
<template v-if="!loading && !isPreview">
<el-button type="primary" @click="saveClick">保存</el-button>
</template>
</div>
</div>
<div class="tabs-content">
<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-input
v-model="formData.hpjbgbzdw"
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-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>
</div>
</div>
</div>
</template>
<script setup>
import { reactive, ref, onMounted, getCurrentInstance } from "vue";
import { useRouter, useRoute } from "vue-router";
import { ElMessage, ElMessageBox } from "element-plus";
import FileUploader from "../../components/FileUploader/index.vue";
// 引入增强后的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 formData = reactive({
xmgszcbg: [],
hpjbg: [],
qsmzqpj: [],
// 问题整改列表(由DynamicTable自动维护)
tzhpjwtzgs: [],
});
// 加载状态
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",
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;
}
},
});
};
// 返回上一页
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,
};
proxy.$post({
url: url,
data: submitData,
callback: () => {
loading.value = false;
ElMessage.success(rcCgqyglId.value ? "编辑成功" : "新增成功");
router.back(-1);
},
error: () => {
loading.value = false;
ElMessage.error("操作失败,请稍后重试");
},
});
};
let options = ref();
// 页面初始化
onMounted(() => {
getProjectData();
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();
}
});
</script>
<style scoped lang="less">
@import "@/styles/verticalManages.less";
.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;
justify-content: space-between;
align-items: center;
margin-bottom: 20px;
padding-bottom: 10px;
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;
}
</style>
<template>
<div class="manage-container">
<div class="manage-wrap">
<div class="manage-header">
<div class="header-left"></div>
<div class="header-right">
<el-button type="primary" @click="shareAdd">新增</el-button>
</div>
</div>
<div class="manage-content" v-loading="loading">
<common-table
:autoHeight="true"
:maxRows="10"
:data="tableData"
:columns="tableColumns"
:total="total"
:current-page="currentPage"
:page-size="pageSize"
:index="true"
:indexLabel="'序号'"
title=""
:border="true"
@size-change="handleSizeChange"
@current-page-change="handleCurrentPageChange"
>
<template #operations="{ row, index }">
<el-button
link
type="primary"
size="small"
@click="previewStatement(row)"
>查看</el-button
>
<el-button
link
type="primary"
size="small"
@click="editStatement(row)"
>编辑</el-button
>
<el-button
link
type="danger"
size="small"
@click="deleteStatement(row)"
>删除</el-button
>
</template>
</common-table>
</div>
</div>
</div>
</template>
<script setup>
import { ref, onMounted, getCurrentInstance } from "vue";
import { useRouter } from "vue-router";
import { ElMessage, ElMessageBox } from "element-plus";
import CommonTable from "@/components/common/commonTable.vue";
const router = useRouter();
const { proxy } = getCurrentInstance();
let tableData = ref([]);
let tableColumns = ref([
{
prop: "qc",
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",
label: "操作",
width: 170,
slot: "operations",
fixed: "right",
align: "center",
},
]);
let loading = ref(false);
let total = ref(0);
let currentPage = ref(1);
let pageSize = ref(10);
// 获取列表数据
const getStatementData = () => {
loading.value = true;
proxy.$post({
url: "/api/project/getCgqyglList",
data: {
page: currentPage.value,
pagesize: pageSize.value,
},
callback: (data) => {
tableData.value = data.rows;
total.value = data.count;
loading.value = false;
},
});
};
// 分页
const handleSizeChange = (size) => {
pageSize.value = size;
currentPage.value = 1;
getStatementData();
};
const handleCurrentPageChange = (page) => {
currentPage.value = page;
getStatementData();
};
const shareAdd = () => {
router.push("/shareAdd");
};
const editStatement = (item) => {
router.push({
name: "shareAdd",
query: {
id: item.id,
},
});
};
const previewStatement = (item) => {
router.push({
name: "shareAdd",
query: {
isPreview: true,
id: item.id,
},
});
};
const deleteStatement = (item) => {
ElMessageBox.confirm("确认删除该项?", "提示", {
confirmButtonText: "确认",
cancelButtonText: "取消",
type: "warning",
})
.then(() => {
proxy.$post({
url: "/api/project/deleteCgqygl",
data: {
id: item.id,
},
callback: (data) => {
ElMessage.success("删除成功");
getStatementData();
},
});
})
.catch(() => {});
};
onMounted(() => {
getStatementData();
});
</script>
<style scoped lang="less">
@import "@/styles/manage.less";
</style>
<template>
<div class="add-project-container">
<div class="add-project-content" v-loading="loading">
<div class="add-project-header">
<div class="header-left"></div>
<div class="header-right">
<el-button type="default" @click="backClick">返回</el-button>
<template v-if="!loading && !isPreview">
<el-button type="primary" @click="saveClick">保存</el-button>
</template>
</div>
</div>
<div class="tabs-content">
<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-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>
</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>
</div>
</div>
</div>
</div>
</div>
</template>
<script setup>
import { reactive, ref, onMounted, getCurrentInstance, h, computed } from "vue";
import { useRouter, useRoute } from "vue-router";
import { ElMessage, ElMessageBox } from "element-plus";
import { useUserStore } from "@/stores/user.js";
import { number } from "echarts";
// 初始化全局变量
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);
return (totalHtje + totalYwlr).toFixed(2);
});
// 折叠面板默认展开项
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为正常)
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);
// 是否预览模式
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;
loading.value = true;
proxy.$post({
url: "/api/project/getCgqygl",
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);
}
},
});
};
const backClick = () => {
router.back(-1);
};
// 保存/提交表单
const saveClick = () => {
// 基础校验
if (!formData.projectId) {
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,
};
proxy.$post({
url: url,
data: submitData,
callback: (res) => {
loading.value = false;
ElMessage.success(rcCgqyglId.value ? "编辑成功" : "新增成功");
router.back(-1);
},
});
};
// 页面初始化
onMounted(() => {
// 获取项目列表
getProjectData();
options.value = JSON.parse(sessionStorage.getItem("resourceData"));
// 如果有ID则加载详情
if (rcCgqyglId.value) {
getRcCgqyglDetail();
}
});
</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>
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