明树Git Lab

Commit f5c92dfa authored by zhanghan's avatar zhanghan

需求开发

parent a172f9f8
...@@ -22,7 +22,7 @@ ...@@ -22,7 +22,7 @@
prop="indicatorName" prop="indicatorName"
label="名称" label="名称"
align="left" align="left"
width="260" min-width="260"
> >
<template #default="{ row }"> <template #default="{ row }">
<div style="text-align: left">{{ row.indicatorName }}</div> <div style="text-align: left">{{ row.indicatorName }}</div>
...@@ -42,7 +42,7 @@ ...@@ -42,7 +42,7 @@
v-for="time in validDynamicTimeList" v-for="time in validDynamicTimeList"
:key="`time-col-${time}`" :key="`time-col-${time}`"
:label="time" :label="time"
width="140" min-width="140"
align="center" align="center"
> >
<template #default="{ row }"> <template #default="{ row }">
......
...@@ -116,6 +116,20 @@ const routes = [ ...@@ -116,6 +116,20 @@ const routes = [
title: "重大风险防控", title: "重大风险防控",
component: () => import("@/views/investingManage/majorRisk.vue"), component: () => import("@/views/investingManage/majorRisk.vue"),
}, },
{
path: "/constructionTime",
name: "constructionTime",
title: "建设期投资回收",
component: () =>
import("@/views/investingManage/constructionTime.vue"),
},
{
path: "/constructionTimeAdd",
name: "constructionTimeAdd",
title: "建设期投资回收",
component: () =>
import("@/views/investingManage/constructionTimeAdd.vue"),
},
{ {
path: "/addRisk", path: "/addRisk",
name: "addRisk", name: "addRisk",
......
<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="constructionTimeAdd"
>新增</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: "xmgsmc",
label: "项目公司名称",
showOverflowTooltip: true,
},
{
prop: "ssejqy",
label: "所属二级企业",
showOverflowTooltip: true,
width: 170,
},
{
prop: "xmgsmc",
label: "项目公司名称",
showOverflowTooltip: true,
width: 120,
},
{
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/getJsqtzhsList",
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 constructionTimeAdd = () => {
router.push("/constructionTimeAdd");
};
const editStatement = (item) => {
router.push({
name: "constructionTimeAdd",
query: {
id: item.id,
},
});
};
const previewStatement = (item) => {
router.push({
name: "constructionTimeAdd",
query: {
isPreview: true,
id: item.id,
},
});
};
const deleteStatement = (item) => {
ElMessageBox.confirm("确认删除该项?", "提示", {
confirmButtonText: "确认",
cancelButtonText: "取消",
type: "warning",
})
.then(() => {
proxy.$post({
url: "/api/project/deleteJsqtzhs",
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="24">
<el-col :span="12">
<el-form-item label="项目名称" required>
<el-select
v-model="formData.projectId"
placeholder="请选择项目名称"
no-data-text="暂无数据"
@change="changeProject"
>
<el-option
v-for="item in projectList"
:key="item.id"
:label="item.projectName"
:value="item.id"
></el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="所属行业">
<CommonSelector
v-model="formData.sshy"
dictName="participation_industry"
/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="项目公司名称">
<el-input
v-model="formData.xmgsmc"
placeholder="请输入项目公司名称"
/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="填报单位名称">
<el-input
v-model="formData.sbdw"
placeholder="请输入填报单位名称"
/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="所属二级企业">
<el-input
v-model="formData.ssejqy"
placeholder="请输入所属二级企业"
/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="项目阶段">
<CommonSelector
v-model="formData.xmjd"
dictName="project_phase"
/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="项目类别">
<CommonSelector
v-model="formData.xmlx"
dictName="xmlx"
></CommonSelector>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="投资模式分类">
<CommonSelector
v-model="formData.tzms"
dictName="tzms"
/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="投资回收方式">
<CommonSelector
v-model="formData.tzhsfs"
dictName="tzhsfs"
/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="下年项目阶段">
<CommonSelector
v-model="formData.xnxmjd"
dictName="xmjd"
/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="财务报表类型">
<CommonSelector
v-model="formData.cwbblx"
dictName="cwbblx"
/>
</el-form-item>
</el-col>
</el-row>
<DynamicTable
:columns="transferColumns"
:disabled="isPreview"
v-model="formData.projectGdxxs"
>
</DynamicTable>
</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.tzzejc"
placeholder="请输入项目投资总额(决策值)(万元)"
/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="我方资本金出资额-决策值(万元)">
<el-input
v-model="formData.wfzbjczejc"
placeholder="请输入我方资本金出资额-决策值(万元)"
/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="投资总额-实际值(万元)">
<el-input
v-model="formData.tzzesj"
placeholder="请输入投资总额-实际值(万元)"
/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="我方资本家出资额--实际值(万元)">
<el-input
v-model="formData.wfzbjczesj"
placeholder="请输入我方资本家出资额--实际值(万元)"
/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="投资总额-计划值(万元)">
<el-input
v-model="formData.tzzejhz"
placeholder="请输入投资总额-计划值(万元)"
/>
</el-form-item>
</el-col>
</el-row>
</el-collapse-item>
<el-collapse-item
title="2025年投资回收累计完成情况-年度更新"
name="2025年投资回收累计完成情况-年度更新"
>
<el-row gutter="20">
<!-- 第一行:决策目标值相关数字项 -->
<el-col :span="12">
<el-form-item label="本年完成 投资回收决策目标值(万元)">
<el-input
v-model="formData.bnwc"
type="number"
precision="8"
placeholder="请输入本年完成 投资回收决策目标值(万元)"
/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="截止本年累计(决策目标值)">
<el-input
v-model="formData.jzbnlj"
type="number"
precision="8"
placeholder="请输入截止本年累计(决策目标值)"
/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="下一年完成数(万元)">
<el-input
v-model="formData.xynwcs"
type="number"
precision="8"
placeholder="请输入下一年完成数(万元)"
/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="本年计划(万元)">
<el-input
v-model="formData.bnjh"
type="number"
precision="8"
placeholder="请输入本年计划(万元)"
/>
</el-form-item>
</el-col>
<!-- 第二行:实际值相关数字项 -->
<el-col :span="12">
<el-form-item label="本年完成--投资回收实际值(万元)">
<el-input
v-model="formData.bnwcsjz"
type="number"
precision="8"
placeholder="请输入本年完成--投资回收实际值(万元)"
/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="截止本年累计--投资回收实际值">
<el-input
v-model="formData.jzbnljsjz"
type="number"
precision="8"
placeholder="请输入截止本年累计--投资回收实际值"
/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="累计欠收(万元)">
<el-input
v-model="formData.ljqs"
type="number"
precision="8"
placeholder="请输入累计欠收(万元)"
/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="完成率(%)">
<el-input
v-model="formData.wcl"
type="number"
precision="2"
placeholder="请输入完成率(%)"
/>
</el-form-item>
</el-col>
<!-- 第三行及以后:长文本说明项(占满整行) -->
<el-col :span="24">
<el-form-item label="计划与决策目标值差异说明">
<el-input
v-model="formData.jhyjcmbcysm"
type="textarea"
rows="3"
placeholder="请输入计划与决策目标值差异说明"
/>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="实际与计划差异说明">
<el-input
v-model="formData.sjyjhcysm"
type="textarea"
rows="3"
placeholder="请输入实际与计划差异说明"
/>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="存在主要问题">
<el-input
v-model="formData.czdzywt"
type="textarea"
rows="3"
placeholder="请输入存在主要问题"
/>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="采取措施及开展情况">
<el-input
v-model="formData.cqcsjgzkzqk"
type="textarea"
rows="3"
placeholder="请输入采取措施及开展情况"
/>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="备注">
<el-input
v-model="formData.bz"
type="textarea"
rows="3"
placeholder="请输入备注"
/>
</el-form-item>
</el-col>
</el-row>
</el-collapse-item>
<el-collapse-item
title="截止12月末累计应收"
name="截止12月末累计应收"
>
<FinancialTable
v-model="formData.jzymljys"
:is-preview="isPreview"
/>
</el-collapse-item>
<el-collapse-item
title="截止12月末累计实收"
name="截止12月末累计实收"
>
<FinancialTable
v-model="formData.jzymljsh"
:is-preview="isPreview"
/>
</el-collapse-item>
<el-collapse-item
title="投资回收(决策)"
name="投资回收(决策)"
>
<FinancialTable
v-model="formData.tzhsjc"
:is-preview="isPreview"
/>
</el-collapse-item>
<el-collapse-item
title="投资回收(计划)"
name="投资回收(计划)"
>
<FinancialTable
v-model="formData.tzhsjh"
:is-preview="isPreview"
/>
</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 } from "element-plus";
import DynamicTable from "@/components/FormDynamicTable/index.vue";
import FinancialTable from "@/components/FinancialTable.vue";
const transferColumns = ref([
{
prop: "njfcgbl",
label: "能建方持股比例",
type: "input",
headerGroup: "能建内容",
placeholder: "请填写能建方持股比例",
},
{
prop: "njfcgblqk",
label: "能建方持股比例情况",
type: "input",
headerGroup: "能建内容",
placeholder: "请填写能建方持股比例情况",
},
{
prop: "njfcgblqk_nt",
label: "能建方持股比例情况",
type: "input",
headerGroup: "能建以外",
placeholder: "请填写能建方持股比例情况",
},
{
prop: "zwfcgbl",
label: "政府方持股比例",
type: "input",
headerGroup: "能建以外",
placeholder: "请填写政府方持股比例",
},
{
prop: "jjcgbl",
label: "基金持股比例",
type: "input",
headerGroup: "能建以外",
placeholder: "请输入基金持股比例",
min: 0,
},
{
prop: "njfglmc",
label: "能建方关联名称",
headerGroup: "能建以外",
type: "textarea",
placeholder: "请输入能建方关联名称",
},
]);
const router = useRouter();
const route = useRoute();
const { proxy } = getCurrentInstance();
// 折叠面板默认展开项
const activeCollapse = ref([
"项目基本信息",
"出资情况",
"合同约定权益获取",
"分红情况",
"投资额完成情况(万元)",
"投资回收(决策)",
"投资回收(计划)",
"2025年投资回收累计完成情况-年度更新",
"净现金流",
"截止12月末累计应收",
"截止12月末累计实收",
"资金流出",
"分红情况",
]);
// 表单数据
let initTableData = () => {
Object.assign(formData, {
jzymljys: {
// 指标列表
indicatorList: [
{ name: "政府付费", isTextRow: false, noTotal: false },
{ name: "政府补贴", isTextRow: false, noTotal: false },
{ name: "使用者付费", isTextRow: false, noTotal: false },
{ name: "使用者欠付", isTextRow: false, noTotal: false },
{ name: "补贴收入", isTextRow: false, noTotal: false },
{
name: "销售回款(含房地产、水泥、新能源售电、其他生产制造收入等)",
isTextRow: false,
noTotal: false,
},
{ name: "资产盘活", isTextRow: false, noTotal: false },
{ name: "股权分红", isTextRow: false, noTotal: false },
{ name: "其他", isTextRow: false, noTotal: false },
// 关键:标记为文本行+不需要合计
{ name: "目标(决策)与计划差异说明", isTextRow: true, noTotal: true },
],
// 时间列表(月度)
dynamicTimeList: [
"一月",
"二月",
"三月",
"四月",
"五月",
"六月",
"七月",
"八月",
"九月",
"十月",
"十一月",
"十二月",
],
// 表格数据(子组件会自动初始化,父组件可传初始值)
tableData: [],
},
jzymljsh: {
// 指标列表
indicatorList: [
{ name: "政府付费", isTextRow: false, noTotal: false },
{ name: "政府补贴", isTextRow: false, noTotal: false },
{ name: "使用者付费", isTextRow: false, noTotal: false },
{ name: "使用者欠付", isTextRow: false, noTotal: false },
{ name: "补贴收入", isTextRow: false, noTotal: false },
{
name: "销售回款(含房地产、水泥、新能源售电、其他生产制造收入等)",
isTextRow: false,
noTotal: false,
},
{ name: "资产盘活", isTextRow: false, noTotal: false },
{ name: "股权分红", isTextRow: false, noTotal: false },
{ name: "其他", isTextRow: false, noTotal: false },
// 关键:标记为文本行+不需要合计
{ name: "目标(决策)与计划差异说明", isTextRow: true, noTotal: true },
],
// 时间列表(月度)
dynamicTimeList: [
"一月",
"二月",
"三月",
"四月",
"五月",
"六月",
"七月",
"八月",
"九月",
"十月",
"十一月",
"十二月",
],
// 表格数据(子组件会自动初始化,父组件可传初始值)
tableData: [],
},
tzhsjc: {
// 指标列表
indicatorList: [
{ name: "建设期政府付费", isTextRow: false, noTotal: false },
{ name: "运营期政府付费", isTextRow: false, noTotal: false },
{ name: "投资价差收取", isTextRow: false, noTotal: false },
{ name: "参股项目投资回收", isTextRow: false, noTotal: false },
{ name: "代建工程款回收", isTextRow: false, noTotal: false },
{ name: "政府付费", isTextRow: false, noTotal: false },
{ name: "政府补贴", isTextRow: false, noTotal: false },
{ name: "使用者付费", isTextRow: false, noTotal: false },
{ name: "使用者欠付", isTextRow: false, noTotal: false },
{ name: "补贴收入", isTextRow: false, noTotal: false },
{
name: "销售回款(含房地产、水泥、新能源售电、其他生产制造收入等)",
isTextRow: false,
noTotal: false,
},
{ name: "资产盘活", isTextRow: false, noTotal: false },
{ name: "股权分红", isTextRow: false, noTotal: false },
{ name: "其他", isTextRow: false, noTotal: false },
// 关键:标记为文本行+不需要合计
{ name: "目标(决策)与计划差异说明", isTextRow: true, noTotal: true },
],
// 时间列表(月度)
dynamicTimeList: ["一季度", "二季度", "三季度", "四季度"],
// 表格数据(子组件会自动初始化,父组件可传初始值)
tableData: [],
},
tzhsjh: {
// 指标列表
indicatorList: [
{ name: "建设期政府付费", isTextRow: false, noTotal: false },
{ name: "运营期政府付费", isTextRow: false, noTotal: false },
{ name: "投资价差收取", isTextRow: false, noTotal: false },
{ name: "参股项目投资回收", isTextRow: false, noTotal: false },
{ name: "代建工程款回收", isTextRow: false, noTotal: false },
{ name: "政府付费", isTextRow: false, noTotal: false },
{ name: "政府补贴", isTextRow: false, noTotal: false },
{ name: "使用者付费", isTextRow: false, noTotal: false },
{ name: "使用者欠付", isTextRow: false, noTotal: false },
{ name: "补贴收入", isTextRow: false, noTotal: false },
{
name: "销售回款(含房地产、水泥、新能源售电、其他生产制造收入等)",
isTextRow: false,
noTotal: false,
},
{ name: "资产盘活", isTextRow: false, noTotal: false },
{ name: "股权分红", isTextRow: false, noTotal: false },
{ name: "其他", isTextRow: false, noTotal: false },
// 关键:标记为文本行+不需要合计
{ name: "目标(决策)与计划差异说明", isTextRow: true, noTotal: true },
],
// 时间列表(月度)
dynamicTimeList: ["一季度", "二季度", "三季度", "四季度"],
// 表格数据(子组件会自动初始化,父组件可传初始值)
tableData: [],
},
});
};
const formData = reactive({
jzymljys: {},
jzymljsh: {},
tzhsjc: {},
tzhsjh: {},
projectGdxxs: [],
});
let options = ref();
// ========== 选择项目同步名称(通用) ==========
const changeProject = (val) => {
proxy.$post({
url: "/api/project/getProjectFinalInfo",
data: { id: val },
callback: (data) => {
loading.value = false;
// Object.assign(formData, data);
loading.value = false;
formData.projectName = data.projectName || "";
formData.sbdw = data.sbdw || "";
formData.xmgsmc = data.xmgsmc || "";
formData.xmkgsjyj = data.xmkgsjyj || "";
formData.xmjgsjyj = data.xmjgsjyj || "";
formData.xmjd = data.xmjd || "";
formData.yynxn = data.yynxn || "";
formData.xmjsqy = data.xmjsqy || "";
},
error: () => {
loading.value = false;
ElMessage.error("获取项目详情失败");
},
});
const selectItem = projectList.value.find((item) => item.id === val);
if (selectItem) formData.projectName = selectItem.projectName;
};
// 加载状态
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 getRcCgqyglDetail = () => {
if (!rcCgqyglId.value) return;
loading.value = true;
proxy.$post({
url: "/api/project/getJsqtzhsInfo",
data: { id: rcCgqyglId.value },
callback: (data) => {
loading.value = false;
console.log(data.jzymljys.tableData[0], "1111");
Object.assign(formData, {
...data,
});
},
});
};
const backClick = () => {
router.back(-1);
};
// 保存/提交表单
const saveClick = () => {
// 基础校验
if (!formData.projectId) {
ElMessage.warning("请选择项目信息");
return;
}
loading.value = true;
// 区分新增/编辑
const url = rcCgqyglId.value
? "/api/project/updateJsqtzhs"
: "/api/project/createJsqtzhs";
// 处理空数字字段:空值转为null,避免提交空字符串
const submitData = {
...formData,
projectId: formData.projectId + "",
};
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();
} else {
initTableData();
}
});
</script>
<style scoped lang="less">
@import "@/styles/verticalManages.less";
// @import "@/styles/manage.less";
.DynamicTable-slot {
display: flex;
div {
text-align: center;
line-height: 38px;
}
div:nth-child(1) {
border: 1px solid #bbc0ca;
flex: 2;
}
div:nth-child(2) {
border: 1px solid #bbc0ca;
flex: 4;
}
height: 40px;
background-color: #f5f7fa;
}
.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