明树Git Lab

Commit 6dcd9fa5 authored by zhanghan's avatar zhanghan

1

parent 060a7d75
Pipeline #111996 passed with stage
in 26 seconds
...@@ -361,10 +361,11 @@ ...@@ -361,10 +361,11 @@
</el-table-column> </el-table-column>
<!-- 开累完成率 --> <!-- 开累完成率 -->
<el-table-column label="开累完成率" align="center">
<el-table-column <el-table-column
label="开累完成率" label="开累完成/合同总金额"
prop="invoiceCompletionRate" prop="invoiceCompletionRate"
min-width="180" min-width="200"
align="center" align="center"
> >
<template #default="{ row }"> <template #default="{ row }">
...@@ -373,12 +374,14 @@ ...@@ -373,12 +374,14 @@
</span> </span>
</template> </template>
</el-table-column> </el-table-column>
</el-table-column>
<!-- 欠收金额 --> <!-- 欠收金额 -->
<el-table-column label="欠收金额" align="center">
<el-table-column <el-table-column
label="欠收金额" label="累计应收-累计实收"
prop="shortfallAmount" prop="shortfallAmount"
min-width="150" min-width="200"
align="center" align="center"
> >
<template #default="{ row }"> <template #default="{ row }">
...@@ -387,6 +390,7 @@ ...@@ -387,6 +390,7 @@
</span> </span>
</template> </template>
</el-table-column> </el-table-column>
</el-table-column>
<!-- 合同总金额 --> <!-- 合同总金额 -->
<el-table-column <el-table-column
......
...@@ -555,46 +555,51 @@ ...@@ -555,46 +555,51 @@
title="可研/决策信息(单位:万元)" title="可研/决策信息(单位:万元)"
name="可研/决策信息(单位:万元)" name="可研/决策信息(单位:万元)"
> >
<el-table <div class="kyjc-table-wrap">
:data="financialIndicators" <div class="left-table">
style="width: 100%" <table class="kyjc-left-table">
border <thead>
:cell-style="tableCellStyle" <tr>
:header-cell-style="tableHeaderCellStyle" <td class="col-serial">序号</td>
:row-class-name="tableRowClassName" <td class="col-indicator">指标项</td>
row-key="serialNumber" <td class="col-total">合计</td>
class="table-stripe-colors" </tr>
> </thead>
<!-- 序号列 --> <tbody>
<el-table-column <tr
prop="serialNumber" v-for="(row, idx) in financialIndicators"
label="序号" :key="row.serialNumber"
width="80" :class="idx % 2 === 0 ? 'even-row' : 'odd-row'"
align="center" >
/> <td class="col-serial">{{ row.serialNumber }}</td>
<!-- 指标项列(层级缩进) --> <td
<el-table-column class="col-indicator"
prop="indicatorName" :style="{
label="指标项" textIndent: row.level * 20 + 'px',
min-width="300" textAlign: 'left',
}"
> >
<template #default="{ row }">
<div :style="{ textIndent: `${row.level * 20}px` }">
{{ row.indicatorName }} {{ row.indicatorName }}
</div> </td>
</template> <td class="col-total">
</el-table-column>
<!-- 合计列(自动统计) -->
<el-table-column label="合计" width="120" align="center">
<template #default="{ row }">
<span v-if="!row.skipAutoTotal" <span v-if="!row.skipAutoTotal"
>{{ >{{
row.total ? row.total.toFixed(2) : "0.00" row.total ? row.total.toFixed(2) : "0.00"
}}万元</span }}万元</span
> >
</template> </td>
</el-table-column> </tr>
<!-- 动态时间表头:当前时间+后续15期(年/年月) --> </tbody>
</table>
</div>
<div class="right-table">
<el-table
:data="financialIndicators"
border
:row-class-name="tableRowClassName"
row-key="serialNumber"
class="table-stripe-colors"
>
<el-table-column <el-table-column
v-for="time in dynamicTimeList" v-for="time in dynamicTimeList"
:key="time" :key="time"
...@@ -621,6 +626,8 @@ ...@@ -621,6 +626,8 @@
</template> </template>
</el-table-column> </el-table-column>
</el-table> </el-table>
</div>
</div>
</el-collapse-item> </el-collapse-item>
<!-- 年度投资计划:基础信息 --> <!-- 年度投资计划:基础信息 -->
...@@ -630,11 +637,7 @@ ...@@ -630,11 +637,7 @@
<div class="row_title">投资目标</div> <div class="row_title">投资目标</div>
</el-col> </el-col>
<el-col :span="6"> <el-col :span="6">
<el-form-item <el-form-item label="计划年份" prop="jhnf">
label-width="240px"
label="计划年份"
prop="jhnf"
>
<el-date-picker <el-date-picker
v-model="formData.jhnf" v-model="formData.jhnf"
type="year" type="year"
...@@ -646,20 +649,12 @@ ...@@ -646,20 +649,12 @@
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="6"> <el-col :span="6">
<el-form-item <el-form-item label="新建/续建" prop="xjXj">
label-width="240px"
label="新建/续建"
prop="xjXj"
>
<CommonSelector v-model="formData.xjXj" dictName="xj" /> <CommonSelector v-model="formData.xjXj" dictName="xj" />
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="6"> <el-col :span="6">
<el-form-item <el-form-item label="年度投资目标" prop="ndTzMb">
label-width="240px"
label="年度投资目标"
prop="ndTzMb"
>
<el-input <el-input
v-model="formData.ndTzMb" v-model="formData.ndTzMb"
placeholder="请输入年度投资目标" placeholder="请输入年度投资目标"
...@@ -671,11 +666,7 @@ ...@@ -671,11 +666,7 @@
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="6"> <el-col :span="6">
<el-form-item <el-form-item label="项目预计工期" prop="xmYjGq">
label-width="240px"
label="项目预计工期"
prop="xmYjGq"
>
<el-input <el-input
v-model="formData.xmYjGq" v-model="formData.xmYjGq"
placeholder="请输入项目预计工期(如12个月)" placeholder="请输入项目预计工期(如12个月)"
...@@ -684,10 +675,7 @@ ...@@ -684,10 +675,7 @@
</el-col> </el-col>
<el-col :span="6"> <el-col :span="6">
<el-form-item <el-form-item label="项目融资落地时间或预计落地时间">
label-width="240px"
label="项目融资落地时间或预计落地时间"
>
<el-date-picker <el-date-picker
v-model="formData.xmRzLdSjHyyjLdSj" v-model="formData.xmRzLdSjHyyjLdSj"
type="date" type="date"
...@@ -698,7 +686,6 @@ ...@@ -698,7 +686,6 @@
</el-col> </el-col>
<el-col :span="6"> <el-col :span="6">
<el-form-item <el-form-item
label-width="240px"
label="预计实现资本金内部收益率" label="预计实现资本金内部收益率"
prop="yjSxZbjNbsyl" prop="yjSxZbjNbsyl"
> >
...@@ -719,7 +706,6 @@ ...@@ -719,7 +706,6 @@
</el-col> </el-col>
<el-col :span="6"> <el-col :span="6">
<el-form-item <el-form-item
label-width="240px"
label="项目计划总投资类型" label="项目计划总投资类型"
prop="xmTzZeXmJhZtzLx" prop="xmTzZeXmJhZtzLx"
> >
...@@ -730,11 +716,7 @@ ...@@ -730,11 +716,7 @@
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="6"> <el-col :span="6">
<el-form-item <el-form-item label="计划类型" prop="jhLx">
label-width="240px"
label="计划类型"
prop="jhLx"
>
<el-input <el-input
v-model="formData.jhLx" v-model="formData.jhLx"
placeholder="请输入计划类型" placeholder="请输入计划类型"
...@@ -745,11 +727,7 @@ ...@@ -745,11 +727,7 @@
<div class="row_title">当前进展</div> <div class="row_title">当前进展</div>
</el-col> </el-col>
<el-col :span="6"> <el-col :span="6">
<el-form-item <el-form-item label="当前进展阶段" prop="dqJzJd">
label-width="240px"
label="当前进展阶段"
prop="dqJzJd"
>
<el-input <el-input
v-model="formData.dqJzJd" v-model="formData.dqJzJd"
placeholder="请输入当前进展阶段" placeholder="请输入当前进展阶段"
...@@ -758,7 +736,6 @@ ...@@ -758,7 +736,6 @@
</el-col> </el-col>
<el-col :span="6"> <el-col :span="6">
<el-form-item <el-form-item
label-width="240px"
label="项目融资是否已经落地" label="项目融资是否已经落地"
prop="xmRzSfYjLd" prop="xmRzSfYjLd"
> >
...@@ -769,11 +746,7 @@ ...@@ -769,11 +746,7 @@
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="6"> <el-col :span="6">
<el-form-item <el-form-item label="当前进展情况" prop="dqJzQk">
label-width="240px"
label="当前进展情况"
prop="dqJzQk"
>
<el-input <el-input
v-model="formData.dqJzQk" v-model="formData.dqJzQk"
placeholder="请输入当前进展情况" placeholder="请输入当前进展情况"
...@@ -781,10 +754,7 @@ ...@@ -781,10 +754,7 @@
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="6"> <el-col :span="6">
<el-form-item <el-form-item label="项目实际开工时间">
label-width="240px"
label="项目实际开工时间"
>
<el-date-picker <el-date-picker
v-model="formData.xmSjKgSj" v-model="formData.xmSjKgSj"
type="date" type="date"
...@@ -1017,22 +987,73 @@ ...@@ -1017,22 +987,73 @@
title="2026年参股单位出资情况修正(单位:万元)" title="2026年参股单位出资情况修正(单位:万元)"
name="2026年参股单位出资情况修正(单位:万元)" name="2026年参股单位出资情况修正(单位:万元)"
> >
<el-row :gutter="24"> <div class="tab-handle">
<el-col :span="24"> <el-button
<el-form-item label-width="0"> v-if="!isPreview"
<DynamicTable type="primary"
:columns="transferColumns" size="small"
:disabled="isPreview" @click="addGdxx"
v-model="formData.cgdwczqkxz" >新增</el-button
:default-row="{ >
mc: '', </div>
fj: '', <el-table
bz: '', :data="gdxxData"
}" style="width: 100%"
empty-text="暂无数据"
border
>
<el-table-column type="index" label="序号" width="60" />
<el-table-column
prop="gdmc"
label="单位名称"
min-width="200"
>
<template #default="scope">
<el-input
v-model="scope.row.gdmc"
placeholder="请填写单位名称"
/> />
</el-form-item> </template>
</el-col> </el-table-column>
</el-row> <el-table-column
prop="cze"
label="我方出资额(万元)"
min-width="200"
>
<template #default="scope">
<el-input
v-model="scope.row.cze"
placeholder="请输入我方出资额(万元)"
/>
</template>
</el-table-column>
<el-table-column prop="bz" label="差异说明" min-width="260">
<template #default="scope">
<el-input
v-model="scope.row.bz"
type="textarea"
:rows="2"
placeholder="请输入差异说明"
/>
</template>
</el-table-column>
<el-table-column
v-if="!isPreview"
label="操作"
width="80"
fixed="right"
>
<template #default="scope">
<el-button
link
type="danger"
size="small"
@click="deleteGdxx(scope.$index)"
>删除</el-button
>
</template>
</el-table-column>
</el-table>
</el-collapse-item> </el-collapse-item>
</el-collapse> </el-collapse>
</el-form> </el-form>
...@@ -1066,7 +1087,6 @@ import { reactive, ref, onMounted, getCurrentInstance, nextTick } from "vue"; ...@@ -1066,7 +1087,6 @@ import { reactive, ref, onMounted, getCurrentInstance, nextTick } from "vue";
import { useRouter, useRoute } from "vue-router"; import { useRouter, useRoute } from "vue-router";
import { ElMessage } from "element-plus"; import { ElMessage } from "element-plus";
import annualPlan from "./annualPlan.vue"; import annualPlan from "./annualPlan.vue";
import DynamicTable from "@/components/FormDynamicTable/index.vue";
import routerBack from "@/components/common/routerBack.vue"; import routerBack from "@/components/common/routerBack.vue";
import CollapseNavigation from "@/components/CollapseNavigation/index.vue"; import CollapseNavigation from "@/components/CollapseNavigation/index.vue";
// ========== 年度计划子组件专属时间列表【核心:适配任意年份,父子唯一统一】 ========== // ========== 年度计划子组件专属时间列表【核心:适配任意年份,父子唯一统一】 ==========
...@@ -1109,30 +1129,14 @@ const getCurrentYearTimeList = (baseYear) => { ...@@ -1109,30 +1129,14 @@ const getCurrentYearTimeList = (baseYear) => {
annualDynamicTimeList.value = timeList; annualDynamicTimeList.value = timeList;
}; };
// ========== 动态表格列配置(参股单位出资修正) ========== // ========== 参股单位出资情况修正 ==========
const transferColumns = ref([ const gdxxData = reactive([]);
{ const addGdxx = () => {
prop: "mc", gdxxData.push({ gdmc: "", cze: "", bz: "" });
label: "单位名称", };
type: "input", const deleteGdxx = (index) => {
placeholder: "请填写单位名称", gdxxData.splice(index, 1);
}, };
{
prop: "fj",
label: "我方出资额(万元)",
type: "input",
placeholder: "请输入我方出资额(万元)",
min: 0,
precision: 2,
},
{
prop: "bz",
label: "差异说明",
type: "textarea",
rows: 2,
placeholder: "请输入差异说明",
},
]);
// ========== 表单验证 ========== // ========== 表单验证 ==========
const formRef = ref(null); const formRef = ref(null);
...@@ -1752,6 +1756,15 @@ const changeProject = (val) => { ...@@ -1752,6 +1756,15 @@ const changeProject = (val) => {
callback: (data) => { callback: (data) => {
loading.value = false; loading.value = false;
formData.projectName = data.projectName || ""; formData.projectName = data.projectName || "";
if (
data.projectGdxxs &&
Array.isArray(data.projectGdxxs) &&
data.projectGdxxs.length > 0
) {
gdxxData.splice(0, gdxxData.length, ...data.projectGdxxs);
} else {
gdxxData.splice(0, gdxxData.length);
}
}, },
error: () => { error: () => {
loading.value = false; loading.value = false;
...@@ -1776,6 +1789,15 @@ const getJsqtzjcDetail = () => { ...@@ -1776,6 +1789,15 @@ const getJsqtzjcDetail = () => {
// 1. 回填基础字段,保留xmndjh的完整结构 // 1. 回填基础字段,保留xmndjh的完整结构
Object.assign(formData, data); Object.assign(formData, data);
// 回填股东信息
if (
data.projectGdxxs &&
Array.isArray(data.projectGdxxs) &&
data.projectGdxxs.length > 0
) {
gdxxData.splice(0, gdxxData.length, ...data.projectGdxxs);
}
// 2. 可研表格:初始化时间+回填(与年度计划无关) // 2. 可研表格:初始化时间+回填(与年度计划无关)
if (data.kyjcxx && Array.isArray(data.kyjcxx) && data.kyjcxx.length > 0) { if (data.kyjcxx && Array.isArray(data.kyjcxx) && data.kyjcxx.length > 0) {
dynamicTimeList.value = Object.keys(data.kyjcxx[0]).filter((key) => dynamicTimeList.value = Object.keys(data.kyjcxx[0]).filter((key) =>
...@@ -1831,6 +1853,7 @@ const saveClick = async () => { ...@@ -1831,6 +1853,7 @@ const saveClick = async () => {
}), }),
// 年度计划表格:直接传完整的xmndjh,不做map过滤 // 年度计划表格:直接传完整的xmndjh,不做map过滤
xmndjh: formData.xmndjh, xmndjh: formData.xmndjh,
projectGdxxs: [...gdxxData],
}; };
proxy.$post({ proxy.$post({
...@@ -1977,4 +2000,140 @@ onMounted(() => { ...@@ -1977,4 +2000,140 @@ onMounted(() => {
gap: 12px; gap: 12px;
} }
} }
// ========== 可研/决策 左右分离表格 ==========
.kyjc-table-wrap {
display: flex;
align-items: flex-start;
gap: 0;
width: 100%;
box-sizing: border-box;
}
.kyjc-table-wrap .left-table {
flex-shrink: 0;
position: sticky;
left: 0;
z-index: 2;
background: #f7faff;
}
.kyjc-table-wrap .right-table {
flex: 1;
min-width: 0;
overflow-x: auto;
}
.kyjc-left-table {
border-collapse: collapse;
border: 1px solid #ebeef5;
border-right: 0;
background: #f7faff;
}
.kyjc-left-table td {
height: 48px;
border: 1px solid #ebeef5;
padding: 0 8px;
text-align: center;
vertical-align: middle;
word-break: break-all;
box-sizing: border-box;
}
.kyjc-left-table .col-serial {
width: 80px;
}
.kyjc-left-table .col-indicator {
width: 300px;
}
.kyjc-left-table .col-total {
width: 120px;
}
.kyjc-left-table thead td {
font-weight: 600;
background: #f0f2f5;
color: #333;
}
.kyjc-left-table .even-row td {
background: #f7faff;
}
.kyjc-left-table .odd-row td {
background: #f5f5f5;
}
.kyjc-table-wrap :deep(.el-table) {
--el-table-border-color: #ebeef5;
border-left: 1px solid #ebeef5 !important;
}
.kyjc-table-wrap :deep(.el-table__header tr),
.kyjc-table-wrap :deep(.el-table__body tr) {
height: 48px !important;
}
.kyjc-table-wrap :deep(.el-table-cell) {
padding: 0 !important;
text-align: center;
vertical-align: middle;
box-sizing: border-box;
}
// 斑马纹与左侧保持一致
.kyjc-table-wrap :deep(.odd-row) {
background-color: #f5f5f5 !important;
}
.kyjc-table-wrap :deep(.even-row) {
background-color: #edf0f5 !important;
}
// ========== 小屏适配 ==========
@media screen and (max-width: 1600px) {
.project-tab-content-wrapper {
gap: 12px;
}
.navigation-wrapper {
padding-left: 4px;
:deep(.collapse-navigation) {
width: 140px !important;
.nav-item {
padding: 8px 10px;
}
.nav-text {
font-size: 12px;
}
}
}
.kyjc-left-table .col-indicator {
width: 200px;
}
.kyjc-left-table .col-total {
width: 100px;
}
}
@media screen and (max-width: 1280px) {
.project-tab-content-wrapper {
gap: 8px;
}
.navigation-wrapper {
padding-left: 0;
:deep(.collapse-navigation) {
width: 110px !important;
.nav-item {
padding: 6px 8px;
}
.nav-text {
font-size: 11px;
}
.nav-dot {
width: 4px;
height: 4px;
margin-right: 4px;
}
}
}
.kyjc-left-table .col-indicator {
width: 160px;
font-size: 12px;
}
.kyjc-left-table .col-serial {
width: 50px;
font-size: 12px;
}
.kyjc-left-table .col-total {
width: 90px;
font-size: 12px;
}
}
</style> </style>
...@@ -354,6 +354,15 @@ const tableCellStyle = ({ row, columnIndex }) => { ...@@ -354,6 +354,15 @@ const tableCellStyle = ({ row, columnIndex }) => {
} }
.left-table { .left-table {
flex-shrink: 0; flex-shrink: 0;
position: sticky;
left: 0;
z-index: 2;
background: #f7faff;
}
.right-table {
flex: 1;
min-width: 0;
overflow-x: auto;
} }
.investment-table { .investment-table {
width: fit-content; width: fit-content;
...@@ -363,10 +372,10 @@ const tableCellStyle = ({ row, columnIndex }) => { ...@@ -363,10 +372,10 @@ const tableCellStyle = ({ row, columnIndex }) => {
background: #f7faff; background: #f7faff;
} }
.investment-table td { .investment-table td {
width: 160px; width: 110px;
height: 48px; height: 48px;
border: 1px solid #ebeef5; border: 1px solid #ebeef5;
padding: 0 !important; padding: 0 4px !important;
text-align: center; text-align: center;
vertical-align: middle; vertical-align: middle;
word-break: break-all; word-break: break-all;
...@@ -410,5 +419,33 @@ const tableCellStyle = ({ row, columnIndex }) => { ...@@ -410,5 +419,33 @@ const tableCellStyle = ({ row, columnIndex }) => {
.flex { .flex {
display: flex; display: flex;
} }
// 右侧表格容器加最小宽度,避免挤压
// ========== 小屏适配:左侧列收窄,给右侧更多填写空间 ==========
@media screen and (max-width: 1600px) {
.investment-table td {
width: 110px;
font-size: 12px;
}
.investment-table td.first-col {
width: 70px;
}
.investment-table td.second-col {
width: 80px;
}
}
@media screen and (max-width: 1280px) {
.investment-table td {
width: 80px;
font-size: 11px;
}
.investment-table td.first-col {
width: 50px;
}
.investment-table td.second-col {
width: 60px;
}
.investment-table td.third-col {
width: 70px;
}
}
</style> </style>
...@@ -109,9 +109,9 @@ ...@@ -109,9 +109,9 @@
<el-col :span="6"> <el-col :span="6">
<el-form-item label="投资模式分类"> <el-form-item label="投资模式分类">
<CommonSelector <el-input
v-model="formData.tzms" v-model="formData.tzms"
dictName="tzms" placeholder="请输入投资模式分类"
/> />
</el-form-item> </el-form-item>
</el-col> </el-col>
......
...@@ -28,9 +28,7 @@ ...@@ -28,9 +28,7 @@
link link
type="primary" type="primary"
size="small" size="small"
v-if=" v-if="row.projectLzType == 9 || row.projectLzType == 13"
canAudit && (row.projectLzType == 9 || row.projectLzType == 13)
"
:loading="row.loading" :loading="row.loading"
@click="editProject(row)" @click="editProject(row)"
> >
...@@ -41,7 +39,7 @@ ...@@ -41,7 +39,7 @@
link link
type="primary" type="primary"
size="small" size="small"
v-else-if="canAudit && row.projectLzType == 12" v-else-if="row.projectLzType == 12"
:loading="row.loading" :loading="row.loading"
@click="previewProject(row)" @click="previewProject(row)"
>审核</el-button >审核</el-button
...@@ -51,7 +49,7 @@ ...@@ -51,7 +49,7 @@
link link
type="primary" type="primary"
size="small" size="small"
v-else-if="canAudit && row.projectLzType == 11" v-else-if="row.projectLzType == 11"
:loading="row.loading" :loading="row.loading"
@click="editProject(row)" @click="editProject(row)"
>填报</el-button >填报</el-button
...@@ -98,12 +96,6 @@ const userInfo = ...@@ -98,12 +96,6 @@ const userInfo =
(sessionStorage.getItem("userInfo") && (sessionStorage.getItem("userInfo") &&
JSON.parse(sessionStorage.getItem("userInfo"))) || JSON.parse(sessionStorage.getItem("userInfo"))) ||
{}; {};
let canAudit = ref(false);
userInfo.roles.map((item) => {
if (["xmlx_sp", "xmjc_sp"].includes(item.key)) {
canAudit.value = true;
}
});
let tableData = ref([]); let tableData = ref([]);
let tableColumns = ref([ let tableColumns = ref([
......
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