feat: 附件存储加入业务模块和业务记录id冗余,方便追踪文件来源
This commit is contained in:
parent
e7cdafc6f1
commit
4d281cd1cf
|
@ -1,5 +1,3 @@
|
|||
// @ts-ignore
|
||||
/* eslint-disable */
|
||||
import { request, type RequestOptions } from '@/utils/request';
|
||||
|
||||
/** 上传 POST /api/tools/upload */
|
||||
|
|
|
@ -315,6 +315,10 @@ declare namespace API {
|
|||
type FileUploadDto = {
|
||||
/** 文件 */
|
||||
file: Buffer;
|
||||
/** 业务模块 */
|
||||
bussinessModule?: string;
|
||||
/** 业务记录ID */
|
||||
bussinessRecordId?: number;
|
||||
};
|
||||
|
||||
type FlowInfo = {
|
||||
|
@ -928,6 +932,10 @@ declare namespace API {
|
|||
createdAt: string;
|
||||
/** 上传者 */
|
||||
username: string;
|
||||
/** 关联模块 */
|
||||
bussinessModule: string;
|
||||
/** 关联模块记录ID */
|
||||
bussinessRecordId: string;
|
||||
};
|
||||
|
||||
type StorageListParams = {
|
||||
|
|
|
@ -26,11 +26,18 @@
|
|||
name: 'AttachmentUpload',
|
||||
});
|
||||
const emit = defineEmits(['close']);
|
||||
const { afterUploadCallback } = defineProps({
|
||||
const { afterUploadCallback, bussinessModule, bussinessRecordId } = defineProps({
|
||||
afterUploadCallback: {
|
||||
type: Function,
|
||||
default: () => ({}),
|
||||
},
|
||||
bussinessModule: {
|
||||
type: String,
|
||||
default: '',
|
||||
},
|
||||
bussinessRecordId: {
|
||||
type: Number,
|
||||
},
|
||||
});
|
||||
const [DynamicTable] = useTable();
|
||||
|
||||
|
@ -67,13 +74,17 @@
|
|||
const res = await Promise.all(
|
||||
uploadFileList.map(async (item) => {
|
||||
try {
|
||||
const itemRes = await Api.toolsUpload.uploadUpload({ file: item.file }, undefined, {
|
||||
const itemRes = await Api.toolsUpload.uploadUpload(
|
||||
{ file: item.file, bussinessModule, bussinessRecordId },
|
||||
undefined,
|
||||
{
|
||||
onUploadProgress(progressEvent) {
|
||||
const complete = ((progressEvent.loaded / progressEvent.total!) * 100) | 0;
|
||||
item.percent = complete;
|
||||
item.status = UploadResultStatus.UPLOADING;
|
||||
},
|
||||
});
|
||||
},
|
||||
);
|
||||
item.status = UploadResultStatus.SUCCESS;
|
||||
return itemRes;
|
||||
} catch (error) {
|
||||
|
|
|
@ -0,0 +1,7 @@
|
|||
export enum StorageBussinessModuleEnum {
|
||||
Contract = 'contract',
|
||||
Company = 'company',
|
||||
MaterialsInOut = 'materialsInOut',
|
||||
Product = 'product',
|
||||
Project = 'project',
|
||||
}
|
|
@ -101,6 +101,8 @@
|
|||
content: () => {
|
||||
return (
|
||||
<AttachmentUpload
|
||||
bussinessModule="contract"
|
||||
bussinessRecordId={record.id}
|
||||
onClose={handleUploadClose}
|
||||
afterUploadCallback={(files) => {
|
||||
afterUploadCallback(files, record.id);
|
||||
|
|
|
@ -99,6 +99,8 @@
|
|||
content: () => {
|
||||
return (
|
||||
<AttachmentUpload
|
||||
bussinessModule="company"
|
||||
bussinessRecordId={record.id}
|
||||
onClose={handleUploadClose}
|
||||
afterUploadCallback={(files) => {
|
||||
afterUploadCallback(files, record.id);
|
||||
|
|
|
@ -2,6 +2,8 @@ import type { TableColumn } from '@/components/core/dynamic-table';
|
|||
import { MaterialsInOutEnum } from '@/enums/materialsInventoryEnum';
|
||||
import { formatToDate } from '@/utils/dateUtil';
|
||||
import { Tag } from 'ant-design-vue';
|
||||
import { getProjectOptions } from './formSchemas';
|
||||
import { debounce } from 'lodash-es';
|
||||
|
||||
export type TableListItem = API.MaterialsInOutEntity;
|
||||
export type TableQueryItem = API.MaterialsInOutListParams;
|
||||
|
@ -22,10 +24,50 @@ export const baseColumns: TableColumnItem[] = [
|
|||
{
|
||||
title: '项目',
|
||||
width: 80,
|
||||
dataIndex: 'project',
|
||||
dataIndex: 'projectId',
|
||||
customRender: ({ record }) => {
|
||||
return record?.project?.name || '';
|
||||
},
|
||||
formItemProps: {
|
||||
component:'Select',
|
||||
componentProps: ({ formInstance, schema, formModel }) => ({
|
||||
showSearch: true,
|
||||
filterOption: false,
|
||||
fieldNames: {
|
||||
label: 'label',
|
||||
value: 'value',
|
||||
},
|
||||
getPopupContainer: () => document.body,
|
||||
defaultActiveFirstOption: true,
|
||||
onClear: async () => {
|
||||
const newSchema = {
|
||||
field: schema.field,
|
||||
componentProps: {
|
||||
options: [] as LabelValueOptions,
|
||||
},
|
||||
};
|
||||
const options = await getProjectOptions().finally(() => (schema.loading = false));
|
||||
newSchema.componentProps.options = options;
|
||||
formInstance?.updateSchema([newSchema]);
|
||||
},
|
||||
request: () => {
|
||||
return getProjectOptions();
|
||||
},
|
||||
onSearch: debounce(async (keyword) => {
|
||||
schema.loading = true;
|
||||
const newSchema = {
|
||||
field: schema.field,
|
||||
componentProps: {
|
||||
options: [] as LabelValueOptions,
|
||||
},
|
||||
};
|
||||
formInstance?.updateSchema([newSchema]);
|
||||
const options = await getProjectOptions(keyword).finally(() => (schema.loading = false));
|
||||
newSchema.componentProps.options = options;
|
||||
formInstance?.updateSchema([newSchema]);
|
||||
}, 500),
|
||||
}),
|
||||
},
|
||||
},
|
||||
{
|
||||
title: '所属公司',
|
||||
|
|
|
@ -237,7 +237,7 @@ export const formSchemas = (isEdit?: boolean): FormSchema<API.MaterialsInOutEnti
|
|||
},
|
||||
];
|
||||
|
||||
const getProjectOptions = async (keyword?: string): Promise<LabelValueOptions> => {
|
||||
export const getProjectOptions = async (keyword?: string): Promise<LabelValueOptions> => {
|
||||
const { items: result } = await Api.project.projectList({ pageSize: 100, name: keyword });
|
||||
return (
|
||||
result?.map((item) => ({
|
||||
|
|
|
@ -145,6 +145,8 @@
|
|||
return (
|
||||
<AttachmentUpload
|
||||
onClose={handleUploadClose}
|
||||
bussinessModule="materialsInOut"
|
||||
bussinessRecordId={record.id}
|
||||
afterUploadCallback={(files) => {
|
||||
afterUploadCallback(files, record.id);
|
||||
}}
|
||||
|
|
|
@ -101,6 +101,8 @@
|
|||
content: () => {
|
||||
return (
|
||||
<AttachmentUpload
|
||||
bussinessModule="product"
|
||||
bussinessRecordId={record.id}
|
||||
onClose={handleUploadClose}
|
||||
afterUploadCallback={(files) => {
|
||||
afterUploadCallback(files, record.id);
|
||||
|
|
|
@ -100,6 +100,8 @@
|
|||
content: () => {
|
||||
return (
|
||||
<AttachmentUpload
|
||||
bussinessModule="project"
|
||||
bussinessRecordId={record.id}
|
||||
onClose={handleUploadClose}
|
||||
afterUploadCallback={(files) => {
|
||||
afterUploadCallback(files, record.id);
|
||||
|
|
|
@ -3,6 +3,7 @@ import type { TableColumn } from '@/components/core/dynamic-table';
|
|||
import type { FormSchema } from '@/components/core/schema-form';
|
||||
import { formatToDateTime } from '@/utils/dateUtil';
|
||||
import { baseApiUrl } from '@/utils/request';
|
||||
import { StorageBussinessModuleEnum } from '@/enums/storageBussinessModuleEnum';
|
||||
|
||||
export type TableListItem = API.StorageInfo;
|
||||
export type TableColumnItem = TableColumn<TableListItem>;
|
||||
|
@ -75,12 +76,26 @@ export const baseColumns: TableColumnItem[] = [
|
|||
dataIndex: 'username',
|
||||
width: 120,
|
||||
},
|
||||
|
||||
{
|
||||
title: '创建时间',
|
||||
dataIndex: 'createdAt',
|
||||
width: 160,
|
||||
customRender: ({ record }) => formatToDateTime(record.createdAt),
|
||||
},
|
||||
{
|
||||
title: '关联业务模块',
|
||||
dataIndex: 'bussinessModule',
|
||||
width: 120,
|
||||
customRender: ({ record }) => {
|
||||
return formatBussinessModules(record.bussinessModule) || '';
|
||||
},
|
||||
},
|
||||
{
|
||||
title: '关联业务ID',
|
||||
dataIndex: 'bussinessRecordId',
|
||||
width: 80,
|
||||
},
|
||||
];
|
||||
|
||||
export const fileListColumns: TableColumn<FileItem>[] = [
|
||||
|
@ -151,3 +166,19 @@ export const searchFormSchema: FormSchema[] = [
|
|||
colProps: { span: 8 },
|
||||
},
|
||||
];
|
||||
|
||||
const formatBussinessModules = (moduleName: string) => {
|
||||
switch (moduleName) {
|
||||
case StorageBussinessModuleEnum.Contract:
|
||||
return '合同审核';
|
||||
case StorageBussinessModuleEnum.Company:
|
||||
return '乙方公司管理';
|
||||
case StorageBussinessModuleEnum.MaterialsInOut:
|
||||
return '原材料出入库记录';
|
||||
case StorageBussinessModuleEnum.Product:
|
||||
return '产品管理';
|
||||
case StorageBussinessModuleEnum.Project:
|
||||
return '项目管理';
|
||||
default:
|
||||
}
|
||||
};
|
||||
|
|
|
@ -103,6 +103,8 @@
|
|||
content: () => {
|
||||
return (
|
||||
<AttachmentUpload
|
||||
bussinessModule="vehicleUsage"
|
||||
bussinessRecordId={record.id}
|
||||
onClose={handleUploadClose}
|
||||
afterUploadCallback={(files) => {
|
||||
afterUploadCallback(files, record.id);
|
||||
|
|
Loading…
Reference in New Issue