tijaodaim

This commit is contained in:
2026-02-07 15:12:15 +08:00
parent 0704b79b32
commit 8e0a7d8aa0
13 changed files with 64128 additions and 17218 deletions

View File

@@ -21,43 +21,85 @@
ref="formRef"
:model="dataForm"
:rules="dataRules"
:label-width="isView ? '120px' : '140px'"
:label-width="isView ? '160px' : '140px'"
:class="{ 'view-form': isView }">
<!-- 第一步基本信息 -->
<div v-show="currentStep === 0 || isView">
<el-row :gutter="isView ? 16 : 24" v-if="isView">
<el-col :span="isView ? 8 : 12" :class="isView ? 'mb16' : 'mb20'">
<!-- 查看模式第一行 - 申请单编号需求部门采购项目名称 -->
<el-row v-if="isView" :gutter="16">
<el-col :span="8" class="mb16">
<el-form-item label="申请单编号" prop="purchaseNo">
<span class="view-text">{{ dataForm.purchaseNo || '-' }}</span>
</el-form-item>
</el-col>
<el-col :span="isView ? 8 : 12" :class="isView ? 'mb16' : 'mb20'">
<el-col :span="8" class="mb16">
<el-form-item label="需求部门" prop="deptName">
<span class="view-text">{{ dataForm.deptName || '-' }}</span>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="isView ? 16 : 24">
<el-col :span="isView ? 8 : 12" :class="isView ? 'mb16' : 'mb20'">
<el-col :span="8" class="mb16">
<el-form-item label="采购项目名称" prop="projectName">
<span class="view-text">{{ dataForm.projectName || '-' }}</span>
</el-form-item>
</el-col>
</el-row>
<!-- 查看模式第二行 - 填报日期资金来源预算金额 -->
<el-row v-if="isView" :gutter="16">
<el-col :span="8" class="mb16">
<el-form-item label="填报日期" prop="applyDate">
<span class="view-text">{{ dataForm.applyDate || '-' }}</span>
</el-form-item>
</el-col>
<el-col :span="8" class="mb16">
<el-form-item label="资金来源" prop="fundSource">
<span class="view-text">{{ getDictLabel(fundSourceList, dataForm.fundSource) || '-' }}</span>
</el-form-item>
</el-col>
<el-col :span="8" class="mb16">
<el-form-item label="预算金额" prop="budget">
<span class="view-text">{{ dataForm.budget ? Number(dataForm.budget).toLocaleString('zh-CN', { minimumFractionDigits: 2, maximumFractionDigits: 2 }) : '-' }}</span>
</el-form-item>
</el-col>
</el-row>
<!-- 查看模式第三行 - 是否集采是否特殊情况品目编码 -->
<el-row v-if="isView" :gutter="16">
<el-col :span="8" class="mb16">
<el-form-item label="是否集采" prop="isCentralized">
<el-tag v-if="dataForm.isCentralized === '1'" type="success"></el-tag>
<el-tag v-else-if="dataForm.isCentralized === '0'" type="info"></el-tag>
<span v-else class="view-text">-</span>
</el-form-item>
</el-col>
<el-col :span="8" class="mb16">
<el-form-item label="是否特殊情况" prop="isSpecial">
<el-tag v-if="String(dataForm.isSpecial) === '1'" type="warning">紧急</el-tag>
<el-tag v-else-if="String(dataForm.isSpecial) === '2'" type="danger">单一</el-tag>
<el-tag v-else-if="String(dataForm.isSpecial) === '3'" type="info">进口</el-tag>
<el-tag v-else-if="String(dataForm.isSpecial) === '0'" type="info"></el-tag>
<span v-else class="view-text">-</span>
</el-form-item>
</el-col>
<el-col :span="8" class="mb16">
<el-form-item label="品目编码" prop="categoryCode">
<span class="view-text">{{ getCategoryDisplayText() }}</span>
</el-form-item>
</el-col>
</el-row>
<!-- 编辑模式保持原有布局 -->
<el-row v-if="!isView" :gutter="24">
<el-col :span="12" class="mb20">
<el-form-item label="采购项目名称" prop="projectName">
<template v-if="isView">
<span class="view-text">{{ dataForm.projectName || '-' }}</span>
</template>
<el-input
v-else
v-model="dataForm.projectName"
placeholder="请输入采购项目名称"
clearable />
</el-form-item>
</el-col>
<el-col :span="isView ? 8 : 12" :class="isView ? 'mb16' : 'mb20'">
<el-col :span="12" class="mb20">
<el-form-item label="填报日期" prop="applyDate">
<template v-if="isView">
<span class="view-text">{{ dataForm.applyDate || '-' }}</span>
</template>
<el-date-picker
v-else
v-model="dataForm.applyDate"
type="date"
placeholder="请选择填报日期"
@@ -66,13 +108,9 @@
style="width: 100%" />
</el-form-item>
</el-col>
<el-col :span="isView ? 8 : 12" :class="isView ? 'mb16' : 'mb20'">
<el-col :span="12" class="mb20">
<el-form-item label="资金来源" prop="fundSource">
<template v-if="isView">
<span class="view-text">{{ getDictLabel(fundSourceList, dataForm.fundSource) || '-' }}</span>
</template>
<el-select
v-else
v-model="dataForm.fundSource"
placeholder="请选择资金来源"
clearable
@@ -84,12 +122,10 @@
:value="item.value" />
</el-select>
</el-form-item>
</el-col> <el-col :span="isView ? 8 : 12" :class="isView ? 'mb16' : 'mb20'">
</el-col>
<el-col :span="12" class="mb20">
<el-form-item label="预算金额" prop="budget">
<template v-if="isView">
<span class="view-text">{{ dataForm.budget ? Number(dataForm.budget).toLocaleString('zh-CN', { minimumFractionDigits: 2, maximumFractionDigits: 2 }) : '-' }}</span>
</template>
<div v-else class="budget-input-group">
<div class="budget-input-group">
<el-input-number
v-model="budgetInputValue"
:min="0.01"
@@ -109,18 +145,9 @@
</div>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="isView ? 16 : 24">
<el-col :span="isView ? 8 : 12" :class="isView ? 'mb16' : 'mb20'">
<el-col :span="12" class="mb20">
<el-form-item label="是否集采" prop="isCentralized">
<template v-if="isView">
<el-tag v-if="dataForm.isCentralized === '1'" type="success"></el-tag>
<el-tag v-else-if="dataForm.isCentralized === '0'" type="info"></el-tag>
<span v-else class="view-text">-</span>
</template>
<el-select
v-else
v-model="dataForm.isCentralized"
placeholder="请选择是否集采"
clearable
@@ -133,17 +160,9 @@
</el-select>
</el-form-item>
</el-col>
<el-col :span="isView ? 8 : 12" :class="isView ? 'mb16' : 'mb20'">
<el-col :span="12" class="mb20">
<el-form-item label="是否特殊情况" prop="isSpecial">
<template v-if="isView">
<el-tag v-if="String(dataForm.isSpecial) === '1'" type="warning">紧急</el-tag>
<el-tag v-else-if="String(dataForm.isSpecial) === '2'" type="danger">单一</el-tag>
<el-tag v-else-if="String(dataForm.isSpecial) === '3'" type="info">进口</el-tag>
<el-tag v-else-if="String(dataForm.isSpecial) === '0'" type="info"></el-tag>
<span v-else class="view-text">-</span>
</template>
<el-select
v-else
v-model="dataForm.isSpecial"
placeholder="请选择是否特殊情况"
clearable
@@ -156,15 +175,9 @@
</el-select>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="isView ? 16 : 24">
<el-col :span="24" :class="isView ? 'mb16' : 'mb20'">
<el-col :span="24" class="mb20">
<el-form-item label="品目编码" prop="categoryCode">
<template v-if="isView">
<span class="view-text">{{ getCategoryDisplayText() }}</span>
</template>
<el-cascader
v-else
v-model="categoryCodePath"
:options="categoryTreeData"
:props="{ value: 'code', label: 'name', children: 'children', checkStrictly: true }"
@@ -399,9 +412,9 @@
</el-form-item>
</template>
<!-- 其他方式货物类 -->
<!-- 其他方式 -->
<el-form-item
v-if="dataForm.entrustCenterType === 'other' && isGoodsCategory"
v-if="dataForm.entrustCenterType === 'other'"
label="采购需求填报模板"
prop="purchaseRequirementTemplate"
:class="isView ? 'mb16' : 'mb20'">
@@ -976,6 +989,9 @@ const visible = ref(false);
const loading = ref(false);
const dialogType = ref<'add' | 'edit' | 'view'>('add');
// 文件ID到标题的映射用于查看模式显示文件标题
const fileTitleMap = ref<Record<string, string>>({});
// 预算金额输入相关
const budgetUnit = ref<'yuan' | 'thousand' | 'wan'>('yuan');
const budgetInputValue = ref<number | null>(null);
@@ -1598,6 +1614,7 @@ const openDialog = async (type: 'add' | 'edit' | 'view', rowData?: any) => {
// 重置表单
categoryCodePath.value = []; // 重置级联选择器路径
fileTitleMap.value = {}; // 清空文件标题映射
Object.assign(dataForm, {
id: '',
projectName: '',
@@ -1665,14 +1682,17 @@ const openDialog = async (type: 'add' | 'edit' | 'view', rowData?: any) => {
loading.value = true;
Promise.all([
getObj(rowData.id),
type === 'view' ? getApplyFiles(rowData.id).catch(() => ({ data: [] })) : Promise.resolve({ data: [] })
(type === 'view' || type === 'edit') ? getApplyFiles(rowData.id).catch(() => ({ data: [] })) : Promise.resolve({ data: [] })
])
.then(([detailRes, filesRes]) => {
Object.assign(dataForm, detailRes.data || {});
// 查看模式下,根据文件类型分类文件
if (type === 'view' && filesRes.data && Array.isArray(filesRes.data)) {
const filesByType: Record<string, string[]> = {};
// 查看模式和编辑模式下,根据文件类型分类文件
if ((type === 'view' || type === 'edit') && filesRes.data && Array.isArray(filesRes.data)) {
const filesByType: Record<string, any[]> = {};
// 清空文件标题映射
fileTitleMap.value = {};
// 按fileType分类文件
filesRes.data.forEach((file: any) => {
@@ -1684,19 +1704,41 @@ const openDialog = async (type: 'add' | 'edit' | 'view', rowData?: any) => {
// 构建文件URL或ID
const fileId = file.id || file.fileId || file.file_id;
const fileUrl = file.url || file.fileUrl || file.file_url;
const fileTitle = file.fileTitle || file.file_title || '';
// 保存文件ID到标题的映射
if (fileId && fileTitle) {
fileTitleMap.value[fileId] = fileTitle;
}
// 构建文件对象包含ID、URL和标题
const fileObj: any = {
id: fileId,
url: fileUrl,
fileTitle: fileTitle
};
if (fileId) {
filesByType[fileType].push(fileId);
filesByType[fileType].push(fileObj);
} else if (fileUrl) {
filesByType[fileType].push(fileUrl);
filesByType[fileType].push(fileObj);
}
}
});
// 将文件分配到对应字段
// 将文件分配到对应字段(查看模式和编辑模式下存储为对象数组,包含标题信息)
Object.keys(FILE_TYPE_MAP).forEach(field => {
const fileType = FILE_TYPE_MAP[field];
if (filesByType[fileType] && filesByType[fileType].length > 0) {
(dataForm as any)[field] = filesByType[fileType].join(',');
// 将文件对象数组转换为包含name字段的对象数组name字段为fileTitle
const fileObjects = filesByType[fileType].map((file: any) => ({
id: file.id,
url: file.url || '',
name: file.fileTitle || '', // 使用fileTitle作为name这样UploadFile组件会显示标题
fileTitle: file.fileTitle || ''
}));
// 在查看模式和编辑模式下,直接存储对象数组
(dataForm as any)[field] = fileObjects;
}
});
}
@@ -1909,12 +1951,20 @@ const getPurchaseTypeUnionDict = async () => {
}
};
// 处理文件ID字符串转数组
const getFileIdsArray = (fileIds: string | string[]): string[] => {
// 处理文件ID字符串转数组(支持字符串、字符串数组和对象数组)
const getFileIdsArray = (fileIds: string | string[] | any[]): string[] => {
if (!fileIds) return [];
// 如果是对象数组查看模式提取ID
if (Array.isArray(fileIds) && fileIds.length > 0 && typeof fileIds[0] === 'object') {
return fileIds.map((file: any) => file.id || file.fileId || '').filter((id: string) => id);
}
// 如果是字符串数组,直接返回
if (Array.isArray(fileIds)) return fileIds;
const urls = fileIds.split(',').filter(url => url.trim());
// 如果是字符串,按逗号分割并处理
const urls = fileIds.split(',').filter((url: string) => url.trim());
const ids: string[] = [];
urls.forEach(url => {
@@ -2111,6 +2161,12 @@ defineExpose({
.view-form :deep(.el-form-item__label) {
font-weight: bold;
color: #606266;
white-space: nowrap;
overflow: visible;
text-overflow: ellipsis;
line-height: 1.5;
padding-right: 12px;
flex-shrink: 0;
}
/* 所有表单label加粗 */
@@ -2141,6 +2197,30 @@ defineExpose({
margin-bottom: 16px;
}
/* 查看模式下表单项布局优化 */
.view-form :deep(.el-form-item) {
display: flex;
align-items: flex-start;
margin-bottom: 16px;
}
.view-form :deep(.el-form-item__label) {
flex-shrink: 0;
min-width: 160px;
max-width: 200px;
text-align: right;
padding-right: 12px;
white-space: nowrap;
overflow: visible;
}
.view-form :deep(.el-form-item__content) {
flex: 1;
min-width: 0;
word-break: break-word;
line-height: 1.5;
}
/* 预算金额输入组样式 - 并排显示,无缝连接 */
.budget-input-group {
display: flex;

View File

@@ -160,8 +160,10 @@
<span style="margin-left: 4px">是否特殊</span>
</template>
<template #default="scope">
<el-tag v-if="scope.row.isSpecial === '1' || scope.row.isSpecial === 1" type="warning"></el-tag>
<el-tag v-else-if="scope.row.isSpecial === '0' || scope.row.isSpecial === 0" type="info"></el-tag>
<el-tag v-if="String(scope.row.isSpecial) === '1'" type="warning">紧急</el-tag>
<el-tag v-else-if="String(scope.row.isSpecial) === '2'" type="danger">单一</el-tag>
<el-tag v-else-if="String(scope.row.isSpecial) === '3'" type="info">进口</el-tag>
<el-tag v-else-if="String(scope.row.isSpecial) === '0'" type="info"></el-tag>
<span v-else>-</span>
</template>
</el-table-column>
@@ -171,8 +173,8 @@
<span style="margin-left: 4px">是否集采</span>
</template>
<template #default="scope">
<el-tag v-if="scope.row.isCentralized === '1'" type="success"></el-tag>
<el-tag v-else-if="scope.row.isCentralized === '0'" type="info"></el-tag>
<el-tag v-if="String(scope.row.isCentralized) === '1'" type="success"></el-tag>
<el-tag v-else-if="String(scope.row.isCentralized) === '0'" type="info"></el-tag>
<span v-else>-</span>
</template>
</el-table-column>