明树Git Lab

Commit 6dcd9fa5 authored by zhanghan's avatar zhanghan

1

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