From 700aa7f13377c21987fa23ad330776a007912cde Mon Sep 17 00:00:00 2001
From: 云 <2163098428@qq.com>
Date: 星期三, 29 七月 2026 13:51:35 +0800
Subject: [PATCH] refactor(srm): 优化投标模块获奖信息获取和文件上传组件
---
src/api/srm/tender/index.ts | 4 +
src/views/erp/purchase/in/modules/form.vue | 6 +-
src/views/erp/finance/payment/modules/form.vue | 6 +-
src/views/erp/sale/return/modules/form.vue | 6 +-
src/views/erp/purchase/return/modules/form.vue | 6 +-
src/views/erp/sale/out/modules/form.vue | 6 +-
src/views/srm/tender/detail.vue | 4
src/views/erp/stock/out/modules/form.vue | 6 +-
src/packages/@core/ui-kit/form-ui/src/form-api.ts | 49 ++++++++++++++++
src/views/erp/finance/receipt/modules/form.vue | 6 +-
src/views/erp/purchase/request/modules/form.vue | 4
src/views/erp/sale/order/modules/form.vue | 6 +-
src/views/erp/purchase/order/modules/form.vue | 4
src/views/erp/stock/check/modules/form.vue | 6 +-
src/views/erp/stock/in/modules/form.vue | 6 +-
src/views/erp/stock/move/modules/form.vue | 6 +-
src/components/upload/file-upload.vue | 44 +-------------
17 files changed, 96 insertions(+), 79 deletions(-)
diff --git a/src/api/srm/tender/index.ts b/src/api/srm/tender/index.ts
index 965eba4..486765f 100644
--- a/src/api/srm/tender/index.ts
+++ b/src/api/srm/tender/index.ts
@@ -223,6 +223,10 @@
return requestClient.get<SrmTenderApi.BidAwardVO>(`/srm/bid-award/get?id=${id}`);
}
+export function getAwardByProject(tenderProjectId: number) {
+ return requestClient.get<SrmTenderApi.BidAwardVO>(`/srm/bid-award/get-by-project?tenderProjectId=${tenderProjectId}`);
+}
+
export function approveAward(id: number) {
return requestClient.put(`/srm/bid-award/approve?id=${id}`);
}
diff --git a/src/components/upload/file-upload.vue b/src/components/upload/file-upload.vue
index 223a299..35c7fe6 100644
--- a/src/components/upload/file-upload.vue
+++ b/src/components/upload/file-upload.vue
@@ -55,22 +55,20 @@
maxSizeRef: maxSize,
});
-/** 璁$畻褰撳墠缁戝畾鐨勫�硷紝浼樺厛浣跨敤 modelValue */
const currentValue = computed(() => {
return props.modelValue === undefined ? props.value : props.modelValue;
});
-/** 鍒ゆ柇鏄惁浣跨敤 modelValue */
const isUsingModelValue = computed(() => {
return props.modelValue !== undefined;
});
const fileList = ref<UploadProps['fileList']>([]);
-const isLtMsg = ref<boolean>(true); // 鏂囦欢澶у皬閿欒鎻愮ず
-const isActMsg = ref<boolean>(true); // 鏂囦欢绫诲瀷閿欒鎻愮ず
-const isFirstRender = ref<boolean>(true); // 鏄惁绗竴娆℃覆鏌�
-const uploadNumber = ref<number>(0); // 涓婁紶鏂囦欢璁℃暟鍣�
-const uploadList = ref<any[]>([]); // 涓存椂涓婁紶鍒楄〃
+const isLtMsg = ref<boolean>(true);
+const isActMsg = ref<boolean>(true);
+const isFirstRender = ref<boolean>(true);
+const uploadNumber = ref<number>(0);
+const uploadList = ref<any[]>([]);
watch(
currentValue,
@@ -149,17 +147,10 @@
function handleUploadError(error: any) {
console.error('涓婁紶閿欒:', error);
message.error($t('ui.upload.uploadError'));
- // 涓婁紶澶辫触鏃跺噺灏戣鏁板櫒
uploadNumber.value = Math.max(0, uploadNumber.value - 1);
}
-/**
- * 涓婁紶鍓嶆牎楠�
- * @param file 寰呬笂浼犵殑鏂囦欢
- * @returns 鏄惁鍏佽涓婁紶
- */
async function beforeUpload(file: File) {
- // 妫�鏌ユ枃浠舵暟閲忛檺鍒�
if (fileList.value!.length >= props.maxNumber) {
message.error($t('ui.upload.maxNumber', [props.maxNumber]));
return Upload.LIST_IGNORE;
@@ -170,7 +161,6 @@
if (!isAct) {
message.error($t('ui.upload.acceptUpload', [accept]));
isActMsg.value = false;
- // 闃叉寮瑰嚭澶氫釜閿欒鎻愮ず
setTimeout(() => (isActMsg.value = true), 1000);
return Upload.LIST_IGNORE;
}
@@ -178,12 +168,10 @@
if (isLt) {
message.error($t('ui.upload.maxSizeMultiple', [maxSize]));
isLtMsg.value = false;
- // 闃叉寮瑰嚭澶氫釜閿欒鎻愮ず
setTimeout(() => (isLtMsg.value = true), 1000);
return Upload.LIST_IGNORE;
}
- // 鍙湁鍦ㄩ獙璇侀�氳繃鍚庢墠澧炲姞璁℃暟鍣�
uploadNumber.value++;
if (props.returnText) {
const fileContent = await file.text();
@@ -192,23 +180,18 @@
return true;
}
-/** 鑷畾涔変笂浼犺姹� */
async function customRequest(info: UploadRequestOption) {
let { api } = props;
if (!api || !isFunction(api)) {
api = useUpload(props.directory).httpRequest;
}
try {
- // 涓婁紶鏂囦欢
const progressEvent: AxiosProgressEvent = (e) => {
const percent = Math.trunc((e.loaded / e.total!) * 100);
info.onProgress!({ percent });
};
const res = await api?.(info.file as File, progressEvent);
-
- // 澶勭悊涓婁紶鎴愬姛鍚庣殑閫昏緫
handleUploadSuccess(res, info.file as File);
-
info.onSuccess!(res);
message.success($t('ui.upload.uploadSuccess'));
} catch (error: any) {
@@ -218,19 +201,12 @@
}
}
-/**
- * 澶勭悊涓婁紶鎴愬姛
- * @param res 涓婁紶鍝嶅簲缁撴灉
- * @param file 涓婁紶鐨勬枃浠�
- */
function handleUploadSuccess(res: any, file: File) {
- // 鍒犻櫎涓存椂鏂囦欢
const index = fileList.value?.findIndex((item) => item.name === file.name);
if (index !== -1) {
fileList.value?.splice(index!, 1);
}
- // 娣诲姞鍒颁复鏃朵笂浼犲垪琛�
const fileUrl = res?.url || res?.data || res;
uploadList.value.push({
name: res?.name || file.name,
@@ -241,13 +217,11 @@
uid: file.name + Date.now(),
});
- // 妫�鏌ユ槸鍚︽墍鏈夋枃浠堕兘涓婁紶瀹屾垚
if (uploadList.value.length >= uploadNumber.value) {
fileList.value?.push(...uploadList.value);
uploadList.value = [];
uploadNumber.value = 0;
- // 鏇存柊鍊�
const value = getValue();
isInnerOperate.value = true;
emit('update:value', value);
@@ -256,10 +230,6 @@
}
}
-/**
- * 鑾峰彇褰撳墠鏂囦欢鍒楄〃鐨勫��
- * @returns 鏂囦欢 URL 鍒楄〃鎴栧瓧绗︿覆
- */
function getValue() {
const list = (fileList.value || [])
.filter((item) => item?.status === UploadResultStatus.DONE)
@@ -276,10 +246,8 @@
return props.valuePrefix ? `${props.valuePrefix}${val}` : val;
});
- // 鍗曚釜鏂囦欢鐨勬儏鍐碉紝鏍规嵁杈撳叆鍙傛暟绫诲瀷鍐冲畾杩斿洖鏍煎紡
if (props.maxNumber === 1) {
const singleValue = list.length > 0 ? list[0] : '';
- // 濡傛灉鍘熷鍊兼槸瀛楃涓叉垨 modelValue 鏄瓧绗︿覆锛岃繑鍥炲瓧绗︿覆
if (
isString(props.value) ||
(isUsingModelValue.value && isString(props.modelValue))
@@ -289,7 +257,6 @@
return singleValue;
}
- // 澶氭枃浠舵儏鍐碉紝鏍规嵁杈撳叆鍙傛暟绫诲瀷鍐冲畾杩斿洖鏍煎紡
if (isUsingModelValue.value) {
return Array.isArray(props.modelValue) ? list : list.join(',');
}
@@ -382,7 +349,6 @@
</style>
<style>
-/* 鏂囦欢涓婁紶鍒楄〃鏄剧ず鎵嬪瀷鍏夋爣鏍峰紡澶辨晥銆備笉鐭ラ亾涓哄暐. 鍏堣繖閲屽姞涓� */
.ant-upload-list-text .ant-upload-list-item {
cursor: pointer;
}
diff --git a/src/packages/@core/ui-kit/form-ui/src/form-api.ts b/src/packages/@core/ui-kit/form-ui/src/form-api.ts
index 920b1b6..862d164 100644
--- a/src/packages/@core/ui-kit/form-ui/src/form-api.ts
+++ b/src/packages/@core/ui-kit/form-ui/src/form-api.ts
@@ -166,7 +166,54 @@
const values = form.values
? this.handleRangeTimeValue(cloneDeep(toRaw(form.values)))
: {};
- return this.handleValueFormat(values) as T;
+ const result = this.handleValueFormat(values);
+ // 鑷姩鎻愬彇 FileUpload/Upload 瀛楁涓殑鏂囦欢 ID锛岄伩鍏嶆彁浜ゆ椂鎼哄甫瀹屾暣鏂囦欢瀵硅薄
+ const currentSchema = this.state?.schema ?? [];
+ for (const schema of currentSchema) {
+ // 鍏煎瀛楃涓茬被鍨嬪拰宸茶В鏋愮殑 Vue Component 瀵硅薄
+ const compName: string =
+ typeof schema.component === 'string'
+ ? schema.component
+ : (schema.component as any)?.name ?? '';
+ if (compName !== 'FileUpload' && compName !== 'Upload') {
+ continue;
+ }
+ if (schema.valueFormat) continue;
+ const fieldName = schema.fieldName;
+ const rawValue = result[fieldName];
+ if (
+ rawValue == null ||
+ !Array.isArray(rawValue) ||
+ rawValue.length === 0
+ ) {
+ continue;
+ }
+ if (
+ typeof rawValue[0] !== 'object' ||
+ !('status' in rawValue[0])
+ ) {
+ continue;
+ }
+ const props = (schema.componentProps || {}) as Record<string, any>;
+ const valueKey = props.valueKey || 'url';
+ const maxNumber = props.maxNumber ?? 1;
+ const resultField = props.resultField;
+ const valuePrefix = props.valuePrefix || '';
+ const list = rawValue
+ .filter((item: any) => item?.status === 'done')
+ .map((item: any) => {
+ if (resultField && item?.response) return item.response;
+ const v =
+ item?.response?.[valueKey] ??
+ item?.[valueKey] ??
+ item?.url ??
+ item?.response?.url ??
+ item?.response;
+ return valuePrefix ? `${valuePrefix}${v}` : v;
+ });
+ result[fieldName] = maxNumber === 1 ? (list[0] ?? '') : list;
+ }
+ return result as T;
}
async isFieldValid(fieldName: string) {
diff --git a/src/views/erp/finance/payment/modules/form.vue b/src/views/erp/finance/payment/modules/form.vue
index 41987a3..9d92bb2 100644
--- a/src/views/erp/finance/payment/modules/form.vue
+++ b/src/views/erp/finance/payment/modules/form.vue
@@ -160,6 +160,8 @@
modalApi.lock();
try {
formData.value = await getFinancePayment(data.id);
+ // 璁剧疆鍒� values
+ await formApi.setValues(formData.value, false);
if (formData.value?.attachmentList?.length) {
const blobIds = formData.value.attachmentList.map((item) => ({
uid: String(item.id),
@@ -168,10 +170,8 @@
status: 'done',
id: item.id,
}));
- formApi.setFieldValue('blobIds', blobIds);
+ await formApi.setFieldValue('blobIds', blobIds);
}
- // 璁剧疆鍒� values
- await formApi.setValues(formData.value, false);
} finally {
modalApi.unlock();
}
diff --git a/src/views/erp/finance/receipt/modules/form.vue b/src/views/erp/finance/receipt/modules/form.vue
index 9435b4c..5860040 100644
--- a/src/views/erp/finance/receipt/modules/form.vue
+++ b/src/views/erp/finance/receipt/modules/form.vue
@@ -174,6 +174,8 @@
modalApi.lock();
try {
formData.value = await getFinanceReceipt(data.id);
+ // 璁剧疆鍒� values
+ await formApi.setValues(formData.value, false);
if (formData.value?.attachmentList?.length) {
const blobIds = formData.value.attachmentList.map((item) => ({
uid: String(item.id),
@@ -182,10 +184,8 @@
status: 'done',
id: item.id,
}));
- formApi.setFieldValue('blobIds', blobIds);
+ await formApi.setFieldValue('blobIds', blobIds);
}
- // 璁剧疆鍒� values
- await formApi.setValues(formData.value, false);
} finally {
modalApi.unlock();
}
diff --git a/src/views/erp/purchase/in/modules/form.vue b/src/views/erp/purchase/in/modules/form.vue
index cfe0b69..4cbe760 100644
--- a/src/views/erp/purchase/in/modules/form.vue
+++ b/src/views/erp/purchase/in/modules/form.vue
@@ -190,6 +190,8 @@
modalApi.lock();
try {
formData.value = await getPurchaseIn(data.id);
+ // 璁剧疆鍒� values
+ await formApi.setValues(formData.value, false);
if (formData.value?.attachmentList?.length) {
const blobIds = formData.value.attachmentList.map((item) => ({
uid: String(item.id),
@@ -198,10 +200,8 @@
status: 'done',
id: item.id,
}));
- formApi.setFieldValue('blobIds', blobIds);
+ await formApi.setFieldValue('blobIds', blobIds);
}
- // 璁剧疆鍒� values
- await formApi.setValues(formData.value, false);
} finally {
modalApi.unlock();
}
diff --git a/src/views/erp/purchase/order/modules/form.vue b/src/views/erp/purchase/order/modules/form.vue
index e9994ea..dec4d8f 100644
--- a/src/views/erp/purchase/order/modules/form.vue
+++ b/src/views/erp/purchase/order/modules/form.vue
@@ -151,6 +151,7 @@
modalApi.lock();
try {
formData.value = await getPurchaseOrder(data.id);
+ await formApi.setValues(formData.value);
if (formData.value?.attachmentList?.length) {
const blobIds = formData.value.attachmentList.map((item) => ({
uid: String(item.id),
@@ -159,9 +160,8 @@
status: 'done',
id: item.id,
}));
- formApi.setFieldValue('blobIds', blobIds);
+ await formApi.setFieldValue('blobIds', blobIds);
}
- await formApi.setValues(formData.value);
} finally {
modalApi.unlock();
}
diff --git a/src/views/erp/purchase/request/modules/form.vue b/src/views/erp/purchase/request/modules/form.vue
index fbfb14c..7444f4e 100644
--- a/src/views/erp/purchase/request/modules/form.vue
+++ b/src/views/erp/purchase/request/modules/form.vue
@@ -113,6 +113,7 @@
modalApi.lock();
try {
formData.value = await getPurchaseRequest(data.id);
+ await formApi.setValues(formData.value);
if (formData.value?.attachmentList?.length) {
const blobIds = formData.value.attachmentList.map((item) => ({
uid: String(item.id),
@@ -121,9 +122,8 @@
status: 'done',
id: item.id,
}));
- formApi.setFieldValue('blobIds', blobIds);
+ await formApi.setFieldValue('blobIds', blobIds);
}
- await formApi.setValues(formData.value);
} finally {
modalApi.unlock();
}
diff --git a/src/views/erp/purchase/return/modules/form.vue b/src/views/erp/purchase/return/modules/form.vue
index 7c811dd..a217d3e 100644
--- a/src/views/erp/purchase/return/modules/form.vue
+++ b/src/views/erp/purchase/return/modules/form.vue
@@ -190,6 +190,8 @@
modalApi.lock();
try {
formData.value = await getPurchaseReturn(data.id);
+ // 璁剧疆鍒� values
+ await formApi.setValues(formData.value, false);
if (formData.value?.attachmentList?.length) {
const blobIds = formData.value.attachmentList.map((item) => ({
uid: String(item.id),
@@ -198,10 +200,8 @@
status: 'done',
id: item.id,
}));
- formApi.setFieldValue('blobIds', blobIds);
+ await formApi.setFieldValue('blobIds', blobIds);
}
- // 璁剧疆鍒� values
- await formApi.setValues(formData.value, false);
} finally {
modalApi.unlock();
}
diff --git a/src/views/erp/sale/order/modules/form.vue b/src/views/erp/sale/order/modules/form.vue
index 300d094..5dac3de 100644
--- a/src/views/erp/sale/order/modules/form.vue
+++ b/src/views/erp/sale/order/modules/form.vue
@@ -132,6 +132,8 @@
modalApi.lock();
try {
formData.value = await getSaleOrder(data.id);
+ // 璁剧疆鍒� values
+ await formApi.setValues(formData.value);
if (formData.value?.attachmentList?.length) {
const blobIds = formData.value.attachmentList.map((item) => ({
uid: String(item.id),
@@ -140,10 +142,8 @@
status: 'done',
id: item.id,
}));
- formApi.setFieldValue('blobIds', blobIds);
+ await formApi.setFieldValue('blobIds', blobIds);
}
- // 璁剧疆鍒� values
- await formApi.setValues(formData.value);
} finally {
modalApi.unlock();
}
diff --git a/src/views/erp/sale/out/modules/form.vue b/src/views/erp/sale/out/modules/form.vue
index 98e9563..4f7c2bb 100644
--- a/src/views/erp/sale/out/modules/form.vue
+++ b/src/views/erp/sale/out/modules/form.vue
@@ -185,6 +185,8 @@
modalApi.lock();
try {
formData.value = await getSaleOut(data.id);
+ // 璁剧疆鍒� values
+ await formApi.setValues(formData.value, false);
if (formData.value?.attachmentList?.length) {
const blobIds = formData.value.attachmentList.map((item) => ({
uid: String(item.id),
@@ -193,10 +195,8 @@
status: 'done',
id: item.id,
}));
- formApi.setFieldValue('blobIds', blobIds);
+ await formApi.setFieldValue('blobIds', blobIds);
}
- // 璁剧疆鍒� values
- await formApi.setValues(formData.value, false);
} finally {
modalApi.unlock();
}
diff --git a/src/views/erp/sale/return/modules/form.vue b/src/views/erp/sale/return/modules/form.vue
index 59437d7..7611a0c 100644
--- a/src/views/erp/sale/return/modules/form.vue
+++ b/src/views/erp/sale/return/modules/form.vue
@@ -190,6 +190,8 @@
modalApi.lock();
try {
formData.value = await getSaleReturn(data.id);
+ // 璁剧疆鍒� values
+ await formApi.setValues(formData.value, false);
if (formData.value?.attachmentList?.length) {
const blobIds = formData.value.attachmentList.map((item) => ({
uid: String(item.id),
@@ -198,10 +200,8 @@
status: 'done',
id: item.id,
}));
- formApi.setFieldValue('blobIds', blobIds);
+ await formApi.setFieldValue('blobIds', blobIds);
}
- // 璁剧疆鍒� values
- await formApi.setValues(formData.value, false);
} finally {
modalApi.unlock();
}
diff --git a/src/views/erp/stock/check/modules/form.vue b/src/views/erp/stock/check/modules/form.vue
index d2d94ce..bd79134 100644
--- a/src/views/erp/stock/check/modules/form.vue
+++ b/src/views/erp/stock/check/modules/form.vue
@@ -105,6 +105,8 @@
modalApi.lock();
try {
formData.value = await getStockCheck(data.id);
+ // 璁剧疆鍒� values
+ await formApi.setValues(formData.value);
if (formData.value?.attachmentList?.length) {
const blobIds = formData.value.attachmentList.map((item) => ({
uid: String(item.id),
@@ -113,10 +115,8 @@
status: 'done',
id: item.id,
}));
- formApi.setFieldValue('blobIds', blobIds);
+ await formApi.setFieldValue('blobIds', blobIds);
}
- // 璁剧疆鍒� values
- await formApi.setValues(formData.value);
} finally {
modalApi.unlock();
}
diff --git a/src/views/erp/stock/in/modules/form.vue b/src/views/erp/stock/in/modules/form.vue
index 335d06c..155b742 100644
--- a/src/views/erp/stock/in/modules/form.vue
+++ b/src/views/erp/stock/in/modules/form.vue
@@ -101,6 +101,8 @@
modalApi.lock();
try {
formData.value = await getStockIn(data.id);
+ // 璁剧疆鍒� values
+ await formApi.setValues(formData.value);
if (formData.value?.attachmentList?.length) {
const blobIds = formData.value.attachmentList.map((item) => ({
uid: String(item.id),
@@ -109,10 +111,8 @@
status: 'done',
id: item.id,
}));
- formApi.setFieldValue('blobIds', blobIds);
+ await formApi.setFieldValue('blobIds', blobIds);
}
- // 璁剧疆鍒� values
- await formApi.setValues(formData.value);
} finally {
modalApi.unlock();
}
diff --git a/src/views/erp/stock/move/modules/form.vue b/src/views/erp/stock/move/modules/form.vue
index 9aa698b..e289c53 100644
--- a/src/views/erp/stock/move/modules/form.vue
+++ b/src/views/erp/stock/move/modules/form.vue
@@ -105,6 +105,8 @@
modalApi.lock();
try {
formData.value = await getStockMove(data.id);
+ // 璁剧疆鍒� values
+ await formApi.setValues(formData.value);
if (formData.value?.attachmentList?.length) {
const blobIds = formData.value.attachmentList.map((item) => ({
uid: String(item.id),
@@ -113,10 +115,8 @@
status: 'done',
id: item.id,
}));
- formApi.setFieldValue('blobIds', blobIds);
+ await formApi.setFieldValue('blobIds', blobIds);
}
- // 璁剧疆鍒� values
- await formApi.setValues(formData.value);
} finally {
modalApi.unlock();
}
diff --git a/src/views/erp/stock/out/modules/form.vue b/src/views/erp/stock/out/modules/form.vue
index 1219649..75884c8 100644
--- a/src/views/erp/stock/out/modules/form.vue
+++ b/src/views/erp/stock/out/modules/form.vue
@@ -105,6 +105,8 @@
modalApi.lock();
try {
formData.value = await getStockOut(data.id);
+ // 璁剧疆鍒� values
+ await formApi.setValues(formData.value);
if (formData.value?.attachmentList?.length) {
const blobIds = formData.value.attachmentList.map((item) => ({
uid: String(item.id),
@@ -113,10 +115,8 @@
status: 'done',
id: item.id,
}));
- formApi.setFieldValue('blobIds', blobIds);
+ await formApi.setFieldValue('blobIds', blobIds);
}
- // 璁剧疆鍒� values
- await formApi.setValues(formData.value);
} finally {
modalApi.unlock();
}
diff --git a/src/views/srm/tender/detail.vue b/src/views/srm/tender/detail.vue
index 4b34190..020af3c 100644
--- a/src/views/srm/tender/detail.vue
+++ b/src/views/srm/tender/detail.vue
@@ -16,7 +16,7 @@
getQuoteList, createQuote, updateQuote,
createBidOpen, getBidOpen,
getEvaluationList, createBidEvaluation, calculateRanking,
- createAward, getAward, approveAward, generatePurchaseOrder,
+ createAward, getAward, getAwardByProject, approveAward, generatePurchaseOrder,
} from '#/api/srm/tender';
import { getSupplierSimpleList } from '#/api/srm/supplier';
import { getItemSimpleList } from '#/api/mdm/item';
@@ -210,7 +210,7 @@
const awardForm = ref<SrmTenderApi.BidAwardVO>({ tenderProjectId: projectId, supplierId: 0, bidId: 0, awardNo: '' });
async function loadAward() {
- try { award.value = await getAward(projectId); } catch { award.value = undefined; }
+ try { award.value = await getAwardByProject(projectId); } catch { award.value = undefined; }
}
async function handleCreateAward() {
await createAward(awardForm.value);
--
Gitblit v1.9.3