明树Git Lab

Commit 5c1a28a5 authored by zhanghan's avatar zhanghan

工期

parent b3b1feaf
Pipeline #108779 passed with stage
in 20 seconds
...@@ -35,6 +35,90 @@ ...@@ -35,6 +35,90 @@
> >
<el-table-column type="selection" width="55" :disabled="disabled" /> <el-table-column type="selection" width="55" :disabled="disabled" />
<el-table-column prop="originalname" label="文件名" /> <el-table-column prop="originalname" label="文件名" />
<!-- 新增:自定义可配置列 -->
<template
v-for="(col, index) in customColumns"
:key="`custom-col-${index}`"
>
<el-table-column
:prop="col.prop"
:label="col.label"
:width="col.width"
:fixed="col.fixed"
:align="col.align || 'left'"
>
<template #default="{ row, $index }">
<!-- 输入框 -->
<el-input
v-if="col.type === 'input'"
v-model="row[col.prop]"
:disabled="disabled || col.disabled"
:placeholder="col.placeholder || `请输入${col.label}`"
size="small"
@change="handleCustomColChange(row, col.prop, $index)"
/>
<el-input
v-else-if="col.type === 'textarea'"
v-model="row[col.prop]"
:disabled="disabled || col.disabled"
:placeholder="col.placeholder || `请输入${col.label}`"
:rows="col.rows || 2"
type="textarea"
size="small"
@change="handleCustomColChange(row, col.prop, $index)"
/>
<!-- 日期选择器 -->
<el-date-picker
v-else-if="col.type === 'date'"
v-model="row[col.prop]"
:disabled="disabled || col.disabled"
:format="col.format || 'YYYY-MM-DD'"
:value-format="col.valueFormat || 'YYYY-MM-DD'"
:placeholder="col.placeholder || `请选择${col.label}`"
size="small"
@change="handleCustomColChange(row, col.prop, $index)"
/>
<!-- 日期时间选择器 -->
<el-date-picker
v-else-if="col.type === 'datetime'"
v-model="row[col.prop]"
:disabled="disabled || col.disabled"
type="datetime"
:format="col.format || 'YYYY-MM-DD HH:mm:ss'"
:value-format="col.valueFormat || 'YYYY-MM-DD HH:mm:ss'"
:placeholder="col.placeholder || `请选择${col.label}`"
size="small"
@change="handleCustomColChange(row, col.prop, $index)"
/>
<!-- 下拉选择器 -->
<el-select
v-else-if="col.type === 'select'"
v-model="row[col.prop]"
:disabled="disabled || col.disabled"
:placeholder="col.placeholder || `请选择${col.label}`"
size="small"
@change="handleCustomColChange(row, col.prop, $index)"
>
<el-option
v-for="option in col.options || []"
:key="option.value"
:label="option.label"
:value="option.value"
/>
</el-select>
<!-- 自定义插槽(最高优先级) -->
<slot
v-else
:name="`custom-col-${col.prop}`"
:row="row"
:index="$index"
>
<!-- 默认显示字段值 -->
<span>{{ row[col.prop] || "-" }}</span>
</slot>
</template>
</el-table-column>
</template>
<el-table-column prop="updatedAt" label="上传时间"> <el-table-column prop="updatedAt" label="上传时间">
<template #default="{ row }"> <template #default="{ row }">
<span>{{ formatDate(row.updatedAt) }}</span> <span>{{ formatDate(row.updatedAt) }}</span>
...@@ -45,6 +129,8 @@ ...@@ -45,6 +129,8 @@
<span>{{ row.size }} MB</span> <span>{{ row.size }} MB</span>
</template> </template>
</el-table-column> </el-table-column>
<!-- 操作列 -->
<el-table-column fixed="right" label="操作" width="100"> <el-table-column fixed="right" label="操作" width="100">
<template #default="{ row, $index }"> <template #default="{ row, $index }">
<span class="download-btn" @click="handleDownload(row)">下载</span> <span class="download-btn" @click="handleDownload(row)">下载</span>
...@@ -144,12 +230,12 @@ import { ElMessageBox, ElMessage } from "element-plus"; ...@@ -144,12 +230,12 @@ import { ElMessageBox, ElMessage } from "element-plus";
import moment from "moment"; import moment from "moment";
import windowConfig from "@/window"; import windowConfig from "@/window";
// 引入需要的图标 // 引入需要的图标
import { Document, Download, Delete, ArrowDown } from "@element-plus/icons-vue"; // 补充缺失的 ArrowDown 图标 import { Document, Download, Delete, ArrowDown } from "@element-plus/icons-vue";
// 定义组件 props(放宽类型限制,增加兼容性 // 定义组件 props(新增 customColumns 配置
const props = defineProps({ const props = defineProps({
modelValue: { modelValue: {
type: [Array, String, Number], // 兼容更多类型 type: [Array, String, Number],
default: () => [], default: () => [],
required: true, required: true,
}, },
...@@ -173,21 +259,42 @@ const props = defineProps({ ...@@ -173,21 +259,42 @@ const props = defineProps({
Authorization: sessionStorage.getItem("authToken") || "", Authorization: sessionStorage.getItem("authToken") || "",
}), }),
}, },
// 是否禁用(预览模式)- 默认值:false
disabled: { disabled: {
type: Boolean, type: Boolean,
default: false, default: false,
}, },
// 下载接口前缀 - 默认值:系统配置的baseUrl
downloadBaseUrl: { downloadBaseUrl: {
type: String, type: String,
default: () => { default: () => {
return windowConfig.baseUrl || ""; return windowConfig.baseUrl || "";
}, },
}, },
// 新增:自定义列配置
customColumns: {
type: Array,
default: () => [],
/**
* 列配置项说明:
* @param {string} prop - 字段名(必填)
* @param {string} label - 列标题(必填)
* @param {string} type - 组件类型:input/date/datetime/select(默认显示文本)
* @param {number} width - 列宽度
* @param {string} fixed - 是否固定列:left/right
* @param {string} align - 对齐方式:left/center/right
* @param {boolean} disabled - 是否禁用该列编辑
* @param {string} placeholder - 占位提示
* @param {string} format - 日期格式化(仅date/datetime)
* @param {string} valueFormat - 日期值格式化(仅date/datetime)
* @param {Array} options - 下拉选项(仅select),格式:[{label: '选项1', value: '1'}, ...]
*/
},
}); });
const emit = defineEmits(["update:modelValue"]); const emit = defineEmits([
"update:modelValue",
// 新增:自定义列值变化事件
"custom-col-change",
]);
const selectedIds = ref([]); const selectedIds = ref([]);
const popoverVisible = ref(false); const popoverVisible = ref(false);
...@@ -195,11 +302,9 @@ const popoverVisible = ref(false); ...@@ -195,11 +302,9 @@ const popoverVisible = ref(false);
// 核心:安全处理文件列表,将非数组值转为空数组 // 核心:安全处理文件列表,将非数组值转为空数组
const safeFileList = computed({ const safeFileList = computed({
get() { get() {
// 校验:如果是数组则直接返回,否则转为空数组
return Array.isArray(props.modelValue) ? props.modelValue : []; return Array.isArray(props.modelValue) ? props.modelValue : [];
}, },
set(value) { set(value) {
// 向外发射的值始终是数组,保证数据类型统一
emit("update:modelValue", Array.isArray(value) ? value : []); emit("update:modelValue", Array.isArray(value) ? value : []);
}, },
}); });
...@@ -212,7 +317,7 @@ const formatDate = (date) => { ...@@ -212,7 +317,7 @@ const formatDate = (date) => {
// 文件上传成功处理 // 文件上传成功处理
const handleUploadSuccess = (res) => { const handleUploadSuccess = (res) => {
if (res && res.data) { if (res && res.data) {
safeFileList.value = [...safeFileList.value, res.data]; // 改用 safeFileList safeFileList.value = [...safeFileList.value, res.data];
console.log("上传成功:", res.data); console.log("上传成功:", res.data);
ElMessage.success("文件上传成功"); ElMessage.success("文件上传成功");
popoverVisible.value = false; popoverVisible.value = false;
...@@ -255,10 +360,9 @@ const handleDelete = (index) => { ...@@ -255,10 +360,9 @@ const handleDelete = (index) => {
type: "warning", type: "warning",
}) })
.then(() => { .then(() => {
const newList = [...safeFileList.value]; // 改用 safeFileList const newList = [...safeFileList.value];
newList.splice(index, 1); newList.splice(index, 1);
safeFileList.value = newList; // 改用 safeFileList safeFileList.value = newList;
// 删除后关闭popover
popoverVisible.value = false; popoverVisible.value = false;
}) })
.catch(() => {}); .catch(() => {});
...@@ -273,21 +377,31 @@ const handleMultiDelete = () => { ...@@ -273,21 +377,31 @@ const handleMultiDelete = () => {
}) })
.then(() => { .then(() => {
const newList = safeFileList.value.filter( const newList = safeFileList.value.filter(
// 改用 safeFileList
(item) => !selectedIds.value.includes(item.id), (item) => !selectedIds.value.includes(item.id),
); );
safeFileList.value = newList; // 改用 safeFileList safeFileList.value = newList;
selectedIds.value = []; selectedIds.value = [];
}) })
.catch(() => {}); .catch(() => {});
}; };
// 监听外部文件列表变化(改为监听 safeFileList,无需额外处理) // 新增:自定义列值变化处理
const handleCustomColChange = (row, prop, index) => {
// 触发自定义列变化事件,向外传递修改后的数据
emit("custom-col-change", {
row, // 整行数据
prop, // 修改的字段名
value: row[prop], // 修改后的值
index, // 行索引
});
// 更新文件列表(保证响应式)
safeFileList.value = [...safeFileList.value];
};
// 监听外部文件列表变化
watch( watch(
() => safeFileList.value, () => safeFileList.value,
(newVal) => { (newVal) => {},
// 空监听,仅保证响应式(safeFileList 已处理类型兼容)
},
{ deep: true }, { deep: true },
); );
...@@ -307,10 +421,6 @@ watch( ...@@ -307,10 +421,6 @@ watch(
width: 100%; width: 100%;
} }
// ::v-deep .el-form-item__label {
// font-weight: 600;
// color: #509eff !important;
// }
.multi-delete-btn { .multi-delete-btn {
margin-left: 10px; margin-left: 10px;
} }
...@@ -484,4 +594,14 @@ watch( ...@@ -484,4 +594,14 @@ watch(
:deep(.file-list::-webkit-scrollbar-thumb:hover) { :deep(.file-list::-webkit-scrollbar-thumb:hover) {
background: #a8a8a8; background: #a8a8a8;
} }
// 新增:自定义列组件样式优化
:deep(.el-table .el-input),
:deep(.el-table .el-date-picker),
:deep(.el-table .el-select) {
width: 100%;
}
:deep(.el-table .el-input__wrapper) {
padding: 0 8px;
}
</style> </style>
...@@ -60,10 +60,11 @@ ...@@ -60,10 +60,11 @@
:placeholder="col.placeholder" :placeholder="col.placeholder"
:disabled="disabled || col.disabled" :disabled="disabled || col.disabled"
:maxlength="col.maxlength" :maxlength="col.maxlength"
size="small"
/> />
</template> </template>
<!-- Textarea 类型(修复:改为 ===) --> <!-- Textarea 类型 -->
<template v-else-if="col.type === 'textarea'"> <template v-else-if="col.type === 'textarea'">
<el-input <el-input
v-model="scope.row[col.prop]" v-model="scope.row[col.prop]"
...@@ -74,6 +75,7 @@ ...@@ -74,6 +75,7 @@
:maxlength="col.maxlength" :maxlength="col.maxlength"
:show-word-limit="col.showWordLimit || false" :show-word-limit="col.showWordLimit || false"
style="width: 100%" style="width: 100%"
size="small"
/> />
</template> </template>
...@@ -110,6 +112,7 @@ ...@@ -110,6 +112,7 @@
:precision="col.precision" :precision="col.precision"
:min="col.min" :min="col.min"
:max="col.max" :max="col.max"
size="small"
/> />
</template> </template>
...@@ -145,6 +148,15 @@ ...@@ -145,6 +148,15 @@
:placeholder="col.placeholder" :placeholder="col.placeholder"
:disabled="disabled || col.disabled" :disabled="disabled || col.disabled"
style="width: 100%" style="width: 100%"
size="small"
/>
</template>
<!-- Upload 上传类型(核心适配) -->
<template v-else-if="col.type === 'upload'">
<FileUploader
v-model="scope.row[col.prop]"
:isInline="col.isInline ?? true"
/> />
</template> </template>
</template> </template>
...@@ -152,7 +164,7 @@ ...@@ -152,7 +164,7 @@
</el-table-column> </el-table-column>
</template> </template>
<!-- 单级表头渲染(核心修复:新增 textarea 分支) --> <!-- 单级表头渲染(核心) -->
<el-table-column <el-table-column
v-else v-else
v-for="col in columns" v-for="col in columns"
...@@ -170,10 +182,11 @@ ...@@ -170,10 +182,11 @@
:placeholder="col.placeholder" :placeholder="col.placeholder"
:disabled="disabled || col.disabled" :disabled="disabled || col.disabled"
:maxlength="col.maxlength" :maxlength="col.maxlength"
size="small"
/> />
</template> </template>
<!-- 核心修复:新增 Textarea 类型分支 --> <!-- Textarea 类型 -->
<template v-else-if="col.type === 'textarea'"> <template v-else-if="col.type === 'textarea'">
<el-input <el-input
v-model="scope.row[col.prop]" v-model="scope.row[col.prop]"
...@@ -184,10 +197,11 @@ ...@@ -184,10 +197,11 @@
:maxlength="col.maxlength" :maxlength="col.maxlength"
:show-word-limit="col.showWordLimit || false" :show-word-limit="col.showWordLimit || false"
style="width: 100%" style="width: 100%"
size="small"
/> />
</template> </template>
<!-- Select 类型 --> <!-- Select 类型(适配全局下拉选项) -->
<template v-else-if="col.type === 'select'"> <template v-else-if="col.type === 'select'">
<el-select <el-select
v-model="scope.row[col.prop]" v-model="scope.row[col.prop]"
...@@ -220,6 +234,7 @@ ...@@ -220,6 +234,7 @@
:precision="col.precision" :precision="col.precision"
:min="col.min" :min="col.min"
:max="col.max" :max="col.max"
size="small"
/> />
</template> </template>
...@@ -253,6 +268,15 @@ ...@@ -253,6 +268,15 @@
:placeholder="col.placeholder" :placeholder="col.placeholder"
:disabled="disabled || col.disabled" :disabled="disabled || col.disabled"
style="width: 100%" style="width: 100%"
size="small"
/>
</template>
<!-- Upload 上传类型(核心适配你的业务) -->
<template v-else-if="col.type === 'upload'">
<FileUploader
v-model="scope.row[col.prop]"
:isInline="col.isInline ?? true"
/> />
</template> </template>
</template> </template>
...@@ -307,17 +331,29 @@ ...@@ -307,17 +331,29 @@
</template> </template>
<script setup> <script setup>
import { defineProps, defineEmits, ref, computed, onMounted } from "vue"; import {
defineProps,
defineEmits,
ref,
computed,
onMounted,
getCurrentInstance,
} from "vue";
import { ElMessageBox, ElMessage } from "element-plus"; import { ElMessageBox, ElMessage } from "element-plus";
// 引入文件上传组件(适配你的项目路径)
import FileUploader from "@/components/FileUploader/index.vue";
// 获取全局实例(用于接口请求/全局配置)
const { proxy } = getCurrentInstance();
// 定义Props(移除selectOptions的默认值,改为空对象) // 定义Props
const props = defineProps({ const props = defineProps({
modelValue: { type: Array, required: true, default: () => [] }, modelValue: { type: Array, required: true, default: () => [] },
columns: { type: Array, required: true, default: () => [] }, columns: { type: Array, required: true, default: () => [] },
defaultRow: { type: Object, default: () => ({}) }, defaultRow: { type: Object, default: () => ({}) },
addButtonText: { type: String, default: "新增" }, addButtonText: { type: String, default: "新增" },
disabled: { type: Boolean, default: false }, disabled: { type: Boolean, default: false },
selectOptions: { type: Object, default: () => ({}) }, // 父组件可选传 selectOptions: { type: Object, default: () => ({}) }, // 父组件自定义下拉选项
scrollbarAlwaysOn: { type: Boolean, default: false }, scrollbarAlwaysOn: { type: Boolean, default: false },
showAddButton: { type: Boolean, default: true }, showAddButton: { type: Boolean, default: true },
showDeleteButton: { type: Boolean, default: true }, showDeleteButton: { type: Boolean, default: true },
...@@ -337,27 +373,38 @@ const emit = defineEmits([ ...@@ -337,27 +373,38 @@ const emit = defineEmits([
"import-success", "import-success",
]); ]);
// 1. 从sessionStorage读取全局选项(组件内部兜底 // 全局下拉选项(从sessionStorage读取,适配你的业务
const globalOptions = ref({}); const globalOptions = ref({});
// 默认上传配置(适配你的项目接口)
const defaultUploadUrl = ref("");
const defaultUploadHeaders = ref({});
const defaultDownloadUrl = ref("");
// 初始化全局配置
onMounted(() => { onMounted(() => {
try { try {
// 读取并解析sessionStorage中的resourceData // 1. 读取全局下拉选项
const storageData = sessionStorage.getItem("resourceData"); const storageData = sessionStorage.getItem("resourceData");
globalOptions.value = storageData ? JSON.parse(storageData) : {}; globalOptions.value = storageData ? JSON.parse(storageData) : {};
// 可选:打印日志,方便调试
console.log("从sessionStorage读取的全局选项:", globalOptions.value); // 2. 初始化默认上传配置(适配你的项目)
const baseUrl = proxy?.$config?.baseUrl || "";
defaultUploadUrl.value = `${baseUrl}/api/file/upload`;
defaultDownloadUrl.value = baseUrl;
defaultUploadHeaders.value = {
Authorization: sessionStorage.getItem("authToken") || "",
};
} catch (e) { } catch (e) {
console.error("解析sessionStorage中的resourceData失败:", e); console.error("初始化全局配置失败:", e);
globalOptions.value = {}; globalOptions.value = {};
} }
}); });
// 2. 合并选项:父组件传递的selectOptions 优先级 > 组件内部的globalOptions // 合并下拉选项:父组件传入 > 全局配置
const mergedSelectOptions = computed(() => { const mergedSelectOptions = computed(() => {
// 深合并,避免覆盖
return { return {
...globalOptions.value, // 兜底数据 ...globalOptions.value,
...props.selectOptions, // 父组件自定义数据(覆盖兜底) ...props.selectOptions,
}; };
}); });
...@@ -396,13 +443,25 @@ const headerColumnGroups = computed(() => { ...@@ -396,13 +443,25 @@ const headerColumnGroups = computed(() => {
return result; return result;
}); });
// 新增行 // 新增行(适配默认行数据,初始化upload字段为数组)
const handleAdd = () => { const handleAdd = () => {
try { try {
const newRow = { ...props.defaultRow }; const newRow = { ...props.defaultRow };
// 初始化textarea字段为空字符串,避免undefined导致绑定异常 // 初始化各类型字段默认值
props.columns.forEach((col) => { props.columns.forEach((col) => {
if (col.type === "textarea" && !newRow[col.prop]) { // Textarea 初始化为空字符串
if (col.type === "textarea" && newRow[col.prop] === undefined) {
newRow[col.prop] = "";
}
// Upload 初始化为空数组
if (col.type === "upload" && newRow[col.prop] === undefined) {
newRow[col.prop] = [];
}
// Select/Input 初始化为空字符串
if (
["input", "select", "number"].includes(col.type) &&
newRow[col.prop] === undefined
) {
newRow[col.prop] = ""; newRow[col.prop] = "";
} }
}); });
...@@ -454,6 +513,7 @@ const handleCustomOperation = (btn, scope) => { ...@@ -454,6 +513,7 @@ const handleCustomOperation = (btn, scope) => {
<style scoped lang="less"> <style scoped lang="less">
.dynamic-table-container { .dynamic-table-container {
width: 100%; width: 100%;
margin-bottom: 16px;
} }
.tab-handle { .tab-handle {
...@@ -483,17 +543,28 @@ const handleCustomOperation = (btn, scope) => { ...@@ -483,17 +543,28 @@ const handleCustomOperation = (btn, scope) => {
:deep(.el-table) { :deep(.el-table) {
--el-table-header-text-color: #303133; --el-table-header-text-color: #303133;
--el-table-row-hover-bg-color: #f8f9fa; --el-table-row-hover-bg-color: #f8f9fa;
--el-table-border-color: #ebeef5;
} }
/* 确保textarea宽度100%,高度适配rows */ /* 适配各组件样式 */
:deep(.el-input__textarea) { :deep(.el-input__textarea) {
width: 100%; width: 100%;
resize: vertical; /* 允许垂直调整高度 */ resize: vertical;
} }
:deep(.el-upload), :deep(.el-upload),
:deep(.el-textarea), :deep(.el-textarea),
:deep(.el-date-picker) { :deep(.el-date-picker),
:deep(.el-select) {
width: 100%; width: 100%;
} }
/* 小尺寸组件适配 */
:deep(.el-input--small) {
--el-input-height: 32px;
}
:deep(.el-table-cell) {
padding: 8px 0;
}
</style> </style>
...@@ -5,7 +5,11 @@ ...@@ -5,7 +5,11 @@
<div class="tabs-content"> <div class="tabs-content">
<div class="project-tab-content"> <div class="project-tab-content">
<div class="tab-content"> <div class="tab-content">
<el-form :model="formData" :disabled="isPreview"> <el-form
:model="formData"
label-width="160px"
:disabled="isPreview"
>
<el-collapse v-model="activeCollapse"> <el-collapse v-model="activeCollapse">
<!-- 基本信息 --> <!-- 基本信息 -->
<el-collapse-item title="基本信息" name="基本信息"> <el-collapse-item title="基本信息" name="基本信息">
...@@ -51,10 +55,6 @@ ...@@ -51,10 +55,6 @@
add-button-text="新增" add-button-text="新增"
:default-row="zxjcDefaultRow" :default-row="zxjcDefaultRow"
:disabled="isPreview" :disabled="isPreview"
:select-options="{
construction_classify:
options?.construction_classify || [],
}"
/> />
</el-collapse-item> </el-collapse-item>
</el-collapse> </el-collapse>
...@@ -97,15 +97,21 @@ const tzcbfxhzlColumns = ref([ ...@@ -97,15 +97,21 @@ const tzcbfxhzlColumns = ref([
}, },
{ {
prop: "ycztz", prop: "ycztz",
label: "当期预测总投资", label: "当期预测总投资(万元)",
type: "input", type: "input",
placeholder: "请输入当期预测总投资", placeholder: "请输入当期预测总投资(万元)",
}, },
{ {
prop: "zbjnbsyl", prop: "zbjnbsyl",
label: "资本金内部收益率(%)", label: "项目资本金内部收益率(%)",
type: "number",
placeholder: "请输入项目资本金内部收益率(%)",
},
{
prop: "wfzbjnbsyl",
label: "我方资本金内部收益率(%)",
type: "number", type: "number",
placeholder: "请输入资本金内部收益率(%)", placeholder: "请输入我方资本金内部收益率(%)",
}, },
{ {
prop: "tzcbfxhzl", prop: "tzcbfxhzl",
...@@ -128,17 +134,36 @@ const zxjcColumns = ref([ ...@@ -128,17 +134,36 @@ const zxjcColumns = ref([
optionKey: "construction_classify", optionKey: "construction_classify",
placeholder: "请选择专项检查类型", placeholder: "请选择专项检查类型",
}, },
{
prop: "jcmc",
label: "检查名称",
type: "input",
placeholder: "请输入请输入检查名称",
},
{
prop: "jcsj",
label: "检查时间",
type: "date",
placeholder: "请输入请输入检查时间",
},
{ {
prop: "jcjg", prop: "jcjg",
label: "检查结果", label: "检查揭示的主要问题或结论",
type: "input", type: "input",
placeholder: "请输入检查结果", placeholder: "请输入请输入检查揭示的主要问题或结论",
}, },
{ {
prop: "zgcsqd", prop: "zgcsqd",
label: "整改措施清单", label: "整改措施清单",
type: "input", type: "upload",
placeholder: "请输入整改措施清单", placeholder: "",
},
{
prop: "jcbg",
label: "检查报告",
type: "upload",
placeholder: "",
}, },
{ {
prop: "fjcl", prop: "fjcl",
...@@ -179,48 +204,6 @@ const yyqtzjcTzfxsList = ref([]); ...@@ -179,48 +204,6 @@ const yyqtzjcTzfxsList = ref([]);
// 专项检查列表 // 专项检查列表
const yyqtzjcZxjcsList = ref([]); const yyqtzjcZxjcsList = ref([]);
// ========== 投资(成本)分析会资料 操作方法 ==========
const addyyqtzjcTzfxs = () => {
yyqtzjcTzfxsList.value.push({
jd: "",
ycztz: "",
zbjnbsyl: "",
yyqtzjcTzfxs: [],
});
};
const deleteyyqtzjcTzfxs = (index) => {
ElMessageBox.confirm("确认删除该项?", "提示", {
confirmButtonText: "确认",
cancelButtonText: "取消",
type: "warning",
}).then(() => {
yyqtzjcTzfxsList.value.splice(index, 1);
ElMessage.success("删除成功");
});
};
// ========== 专项检查 操作方法 ==========
const addyyqtzjcZxjcs = () => {
yyqtzjcZxjcsList.value.push({
zxjcfl: "",
jcjg: "",
zgcsqd: "",
fjcl: [],
});
};
const deleteyyqtzjcZxjcs = (index) => {
ElMessageBox.confirm("确认删除该项?", "提示", {
confirmButtonText: "确认",
cancelButtonText: "取消",
type: "warning",
}).then(() => {
yyqtzjcZxjcsList.value.splice(index, 1);
ElMessage.success("删除成功");
});
};
// ========== 通用方法 ========== // ========== 通用方法 ==========
// 获取项目列表 // 获取项目列表
const getProjectData = (params = {}) => { const getProjectData = (params = {}) => {
......
...@@ -129,11 +129,11 @@ const getProjectData = (params = {}) => { ...@@ -129,11 +129,11 @@ const getProjectData = (params = {}) => {
tableData.value = data.rows.map((it) => { tableData.value = data.rows.map((it) => {
return { return {
...it, ...it,
htNum: it.qylht?.length + it.jjlht?.length, htNum: it.qylht?.length + it.jjlht?.length || 0,
zjNum: it.zjwj?.length + it.ybfspwj?.length, zjNum: it.zjwj?.length + it.ybfspwj?.length || 0,
spNum: it.bgsp?.length, spNum: it.bgsp?.length || 0,
gsNum: it.gqjg?.length + it.cwjr?.length, gsNum: it.gqjg?.length + it.cwjr?.length || 0,
qtNum: it.qt?.length, qtNum: it.qt?.length || 0,
}; };
}); });
total.value = data.count; total.value = data.count;
......
...@@ -5,7 +5,11 @@ ...@@ -5,7 +5,11 @@
<div class="tabs-content"> <div class="tabs-content">
<div class="project-tab-content"> <div class="project-tab-content">
<div class="tab-content"> <div class="tab-content">
<el-form :model="formData" :disabled="isPreview"> <el-form
:model="formData"
label-width="160px"
:disabled="isPreview"
>
<!-- 项目信息选择 --> <!-- 项目信息选择 -->
<el-row :gutter="20" style="margin-bottom: 20px"> <el-row :gutter="20" style="margin-bottom: 20px">
<el-col :span="12"> <el-col :span="12">
...@@ -35,13 +39,50 @@ ...@@ -35,13 +39,50 @@
<!-- 权益类合同 --> <!-- 权益类合同 -->
<el-col :span="24"> <el-col :span="24">
<el-form-item label="权益类合同"> <el-form-item label="权益类合同">
<FileUploader v-model="formData.qylht" /> <FileUploader
v-model="formData.qylht"
:custom-columns="[
{
prop: 'jfqdsj',
label: '甲方签订时间',
type: 'date',
width: 180,
format: 'YYYY-MM-DD',
},
{
prop: 'yfqdsj',
label: '乙方签订时间',
type: 'date',
width: 180,
format: 'YYYY-MM-DD',
},
]"
@custom-col-change="handleCustomColChange"
/>
</el-form-item> </el-form-item>
</el-col> </el-col>
<!-- 经济类合同 --> <!-- 经济类合同 -->
<el-col :span="24"> <el-col :span="24">
<el-form-item label="经济类合同"> <el-form-item label="经济类合同">
<FileUploader v-model="formData.jjlht" /> <FileUploader
:custom-columns="[
{
prop: 'jfqdsj',
label: '甲方签订时间',
type: 'date',
width: 180,
format: 'YYYY-MM-DD',
},
{
prop: 'yfqdsj',
label: '乙方签订时间',
type: 'date',
width: 180,
format: 'YYYY-MM-DD',
},
]"
v-model="formData.jjlht"
/>
</el-form-item> </el-form-item>
</el-col> </el-col>
</el-row> </el-row>
...@@ -52,14 +93,37 @@ ...@@ -52,14 +93,37 @@
<el-row :gutter="20"> <el-row :gutter="20">
<!-- 造价文件 --> <!-- 造价文件 -->
<el-col :span="24"> <el-col :span="24">
<el-form-item label="造价文件"> <el-form-item label="决策文件">
<FileUploader v-model="formData.zjwj" /> <FileUploader v-model="formData.juecewj" />
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="估算文件">
<FileUploader v-model="formData.gusuanwj" />
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="概算文件">
<FileUploader v-model="formData.gaisuanwj" />
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="预算文件">
<FileUploader v-model="formData.yswj" />
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="调概文件">
<FileUploader v-model="formData.tgwj" />
</el-form-item> </el-form-item>
</el-col> </el-col>
<!-- 动用预备费审批文件 --> <!-- 动用预备费审批文件 -->
<el-col :span="24"> <el-col :span="24">
<el-form-item label="动用预备费审批文件"> <el-form-item label="动用预备费审批文件">
<FileUploader v-model="formData.ybfspwj" /> <FileUploader
:custom-columns="customColumnsJs"
v-model="formData.ybfspwj"
/>
</el-form-item> </el-form-item>
</el-col> </el-col>
</el-row> </el-row>
...@@ -71,7 +135,10 @@ ...@@ -71,7 +135,10 @@
<!-- 变更索赔文件 --> <!-- 变更索赔文件 -->
<el-col :span="24"> <el-col :span="24">
<el-form-item label="变更索赔文件"> <el-form-item label="变更索赔文件">
<FileUploader v-model="formData.bgsp" /> <FileUploader
v-model="formData.bgsp"
:custom-columns="customColumnsJs"
/>
</el-form-item> </el-form-item>
</el-col> </el-col>
</el-row> </el-row>
...@@ -85,17 +152,20 @@ ...@@ -85,17 +152,20 @@
<el-form-item <el-form-item
label="股权结构、资金来源及构成发生重大变化的报告及审批文件" label="股权结构、资金来源及构成发生重大变化的报告及审批文件"
> >
<FileUploader v-model="formData.gqjg" /> <FileUploader
v-model="formData.gqjg"
:custom-columns="customColumnsJs"
/>
</el-form-item> </el-form-item>
</el-col> </el-col>
<!-- 接入财务金融部资本金出资台账,台账更新,系统上跟着更新 --> <!-- 接入财务金融部资本金出资台账,台账更新,系统上跟着更新 -->
<el-col :span="24"> <!-- <el-col :span="24">
<el-form-item <el-form-item
label="接入财务金融部资本金出资台账,台账更新,系统上跟着更新" label="接入财务金融部资本金出资台账,台账更新,系统上跟着更新"
> >
<FileUploader v-model="formData.cwjr" /> <FileUploader v-model="formData.cwjr" />
</el-form-item> </el-form-item>
</el-col> </el-col> -->
</el-row> </el-row>
</el-tab-pane> </el-tab-pane>
...@@ -139,6 +209,15 @@ const router = useRouter(); ...@@ -139,6 +209,15 @@ const router = useRouter();
const route = useRoute(); const route = useRoute();
const { proxy } = getCurrentInstance(); const { proxy } = getCurrentInstance();
const customColumnsJs = [
{
prop: "js",
label: "介绍",
type: "textarea",
width: 180,
format: "YYYY-MM-DD",
},
];
// 标签页默认激活项 // 标签页默认激活项
const pageActiveName = ref("合同类"); const pageActiveName = ref("合同类");
......
...@@ -99,23 +99,37 @@ ...@@ -99,23 +99,37 @@
/> />
</template> </template>
</el-table-column> </el-table-column>
<el-table-column prop="ycztz" label="当期预测总投资"> <el-table-column
prop="ycztz"
label="当期预测总投资(万元)"
>
<template #default="scope"> <template #default="scope">
<el-input <el-input
type="number" type="number"
v-model.number="scope.row.ycztz" v-model.number="scope.row.ycztz"
placeholder="请输入当期预测总投资" placeholder="请输入当期预测总投资(万元)"
/> />
</template> </template>
</el-table-column> </el-table-column>
<el-table-column <el-table-column
prop="zbjnbsyl" prop="zbjnbsyl"
label="资本金内部收益率(%)" label="项目资本金内部收益率(%)"
> >
<template #default="scope"> <template #default="scope">
<el-input <el-input
v-model.number="scope.row.zbjnbsyl" v-model.number="scope.row.zbjnbsyl"
placeholder="请输入资本金内部收益率(%)" placeholder="请输入项目资本金内部收益率(%)"
/>
</template>
</el-table-column>
<el-table-column
prop="wfzbjnbsyl"
label="我方资本金内部收益率(%)"
>
<template #default="scope">
<el-input
v-model.number="scope.row.wfzbjnbsyl"
placeholder="请输入我方资本金内部收益率(%)"
/> />
</template> </template>
</el-table-column> </el-table-column>
...@@ -173,22 +187,63 @@ ...@@ -173,22 +187,63 @@
</el-select> </el-select>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column prop="jcjg" label="检查结果"> <el-table-column prop="jcmc" label="检查名称">
<template #default="scope">
<el-input
v-model.number="scope.row.jcmc"
placeholder="请输入检查名称"
/>
</template>
</el-table-column>
<el-table-column prop="jcsj" label="检查时间">
<template #default="scope">
<el-date-picker
v-model="scope.row.jcsj"
type="date"
placeholder="请选择检查时间"
format="YYYY-MM-DD"
value-format="YYYY-MM-DD"
/>
</template>
</el-table-column>
<el-table-column
prop="jcjg"
label="检查揭示的主要问题或结论"
>
<template #default="scope"> <template #default="scope">
<el-input <el-input
v-model.number="scope.row.jcjg" v-model.number="scope.row.jcjg"
placeholder="请输入检查结果" placeholder="请输入检查揭示的主要问题或结论"
/> />
</template> </template>
</el-table-column> </el-table-column>
<el-table-column prop="zgcsqd" label="整改措施清单"> <!-- <el-table-column prop="zgcsqd" label="整改措施清单">
<template #default="scope"> <template #default="scope">
<el-input <el-input
v-model.number="scope.row.zgcsqd" v-model.number="scope.row.zgcsqd"
placeholder="请输入整改措施清单" placeholder="请输入整改措施清单"
/> />
</template> </template>
</el-table-column> -->
<el-table-column prop="zgcsqd" label="整改措施清单">
<template #default="scope">
<FileUploader
v-model="scope.row.zgcsqd"
:isInline="true"
></FileUploader>
</template>
</el-table-column> </el-table-column>
<el-table-column prop="jcbg" label="检查报告">
<template #default="scope">
<FileUploader
v-model="scope.row.jcbg"
:isInline="true"
></FileUploader>
</template>
</el-table-column>
<el-table-column prop="fjcl" label="附件材料"> <el-table-column prop="fjcl" label="附件材料">
<template #default="scope"> <template #default="scope">
<FileUploader <FileUploader
...@@ -293,6 +348,10 @@ const addJsqtzjcZxjcs = () => { ...@@ -293,6 +348,10 @@ const addJsqtzjcZxjcs = () => {
zxjcfl: null, zxjcfl: null,
jcjg: null, jcjg: null,
zgcsqd: null, zgcsqd: null,
jcsj: null,
jcmc: null,
zgcsqd: [],
jcbg: [],
fjcl: [], fjcl: [],
}); });
}; };
......
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