tijaodaim
This commit is contained in:
@@ -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;
|
||||
|
||||
@@ -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>
|
||||
|
||||
Reference in New Issue
Block a user