diff --git a/src/api/erp/stock/packagingScheme/index.ts b/src/api/erp/stock/packagingScheme/index.ts new file mode 100644 index 00000000..58ecf2ff --- /dev/null +++ b/src/api/erp/stock/packagingScheme/index.ts @@ -0,0 +1,42 @@ +import request from '@/config/axios' + +// ERP 包装方案 VO +export interface PackagingSchemeVO { + id: number // 包装方案编号 + code: string // 方案编码 + name: string // 方案名称 + packageQuantity: number // 每包数量(件) + palletPackageQuantity: number // 每托包数(包) + palletTotalQuantity: number // 每托总数量(件) + remark: string // 备注 + status: number // 状态 + createTime: string // 创建时间 +} + +// ERP 包装方案 API +export const PackagingSchemeApi = { + // 查询包装方案分页 + getPackagingSchemePage: async (params: any) => { + return await request.get({ url: `/erp/packaging-scheme/page`, params }) + }, + + // 查询包装方案详情 + getPackagingScheme: async (id: number) => { + return await request.get({ url: `/erp/packaging-scheme/get?id=` + id }) + }, + + // 新增包装方案 + createPackagingScheme: async (data: PackagingSchemeVO) => { + return await request.post({ url: `/erp/packaging-scheme/create`, data }) + }, + + // 修改包装方案 + updatePackagingScheme: async (data: PackagingSchemeVO) => { + return await request.put({ url: `/erp/packaging-scheme/update`, data }) + }, + + // 删除包装方案 + deletePackagingScheme: async (id: number) => { + return await request.delete({ url: `/erp/packaging-scheme/delete?id=` + id }) + } +} diff --git a/src/api/mes/moldget/index.ts b/src/api/mes/moldget/index.ts index 679539bc..4c902b16 100644 --- a/src/api/mes/moldget/index.ts +++ b/src/api/mes/moldget/index.ts @@ -1,49 +1,49 @@ -import request from '@/config/axios' - -// 模具管理-领模申请 VO -export interface MoldGetVO { - id: number // ID - orderId: number // 领模单号 - code: string // 模具编码 - name: string // 模具名称 - state: string // 状态 - person: string // 领模人 - deviceId: number // 设备id - deviceName: string // 设备名称 - getTime: Date // 领取时间 - principal: string // 库管员 - remark: string // 备注 -} - -// 模具管理-领模申请 API -export const MoldGetApi = { - // 查询模具管理-领模申请分页 - getMoldGetPage: async (params: any) => { - return await request.get({ url: `/mes/mold-get/page`, params }) - }, - - // 查询模具管理-领模申请详情 - getMoldGet: async (id: number) => { - return await request.get({ url: `/mes/mold-get/get?id=` + id }) - }, - - // 新增模具管理-领模申请 - createMoldGet: async (data: MoldGetVO) => { - return await request.post({ url: `/mes/mold-get/create`, data }) - }, - - // 修改模具管理-领模申请 - updateMoldGet: async (data: MoldGetVO) => { - return await request.put({ url: `/mes/mold-get/update`, data }) - }, - - // 删除模具管理-领模申请 - deleteMoldGet: async (id: number) => { - return await request.delete({ url: `/mes/mold-get/delete?id=` + id }) - }, - - // 导出模具管理-领模申请 Excel - exportMoldGet: async (params) => { - return await request.download({ url: `/mes/mold-get/export-excel`, params }) - }, -} \ No newline at end of file +import request from '@/config/axios' + +// 模具管理-领模申请 VO +export interface MoldGetVO { + id: number // ID + orderId: number // 领模单号 + code: string // 模具编码 + name: string // 模具名称 + state: string // 状态 + person: string // 领模人 + deviceId: number // 设备id + deviceName: string // 设备名称 + getTime: Date // 领取时间 + principal: string // 库管员 + remark: string // 备注 +} + +// 模具管理-领模申请 API +export const MoldGetApi = { + // 查询模具管理-领模申请分页 + getMoldGetPage: async (params: any) => { + return await request.get({ url: `/mes/mold-get/page`, params }) + }, + + // 查询模具管理-领模申请详情 + getMoldGet: async (id: number) => { + return await request.get({ url: `/mes/mold-get/get?id=` + id }) + }, + + // 新增模具管理-领模申请 + createMoldGet: async (data: MoldGetVO) => { + return await request.post({ url: `/mes/mold-get/create`, data }) + }, + + // 修改模具管理-领模申请 + updateMoldGet: async (data: MoldGetVO) => { + return await request.put({ url: `/mes/mold-get/update`, data }) + }, + + // 删除模具管理-领模申请 + deleteMoldGet: async (id: number) => { + return await request.delete({ url: `/mes/mold-get/delete?id=` + id }) + }, + + // 导出模具管理-领模申请 Excel + exportMoldGet: async (params) => { + return await request.download({ url: `/mes/mold-get/export-excel`, params }) + }, +} diff --git a/src/api/mes/moldreturn/index.ts b/src/api/mes/moldreturn/index.ts index 7b10ee5f..d3330299 100644 --- a/src/api/mes/moldreturn/index.ts +++ b/src/api/mes/moldreturn/index.ts @@ -1,47 +1,47 @@ -import request from '@/config/axios' - -// 模具管理-模具入库 VO -export interface MoldReturnVO { - id: number // ID - orderId: number // 领模单号 - code: string // 模具编码 - name: string // 模具名称 - state: string // 状态 - person: string // 归还人 - returnTime: Date // 入库时间 - principal: string // 库管员 - remark: string // 备注 -} - -// 模具管理-模具入库 API -export const MoldReturnApi = { - // 查询模具管理-模具入库分页 - getMoldReturnPage: async (params: any) => { - return await request.get({ url: `/mes/mold-return/page`, params }) - }, - - // 查询模具管理-模具入库详情 - getMoldReturn: async (id: number) => { - return await request.get({ url: `/mes/mold-return/get?id=` + id }) - }, - - // 新增模具管理-模具入库 - createMoldReturn: async (data: MoldReturnVO) => { - return await request.post({ url: `/mes/mold-return/create`, data }) - }, - - // 修改模具管理-模具入库 - updateMoldReturn: async (data: MoldReturnVO) => { - return await request.put({ url: `/mes/mold-return/update`, data }) - }, - - // 删除模具管理-模具入库 - deleteMoldReturn: async (id: number) => { - return await request.delete({ url: `/mes/mold-return/delete?id=` + id }) - }, - - // 导出模具管理-模具入库 Excel - exportMoldReturn: async (params) => { - return await request.download({ url: `/mes/mold-return/export-excel`, params }) - }, -} \ No newline at end of file +import request from '@/config/axios' + +// 模具管理-模具入库 VO +export interface MoldReturnVO { + id: number // ID + orderId: number // 领模单号 + code: string // 模具编码 + name: string // 模具名称 + state: string // 状态 + person: string // 归还人 + returnTime: Date // 入库时间 + principal: string // 库管员 + remark: string // 备注 +} + +// 模具管理-模具入库 API +export const MoldReturnApi = { + // 查询模具管理-模具入库分页 + getMoldReturnPage: async (params: any) => { + return await request.get({ url: `/mes/mold-return/page`, params }) + }, + + // 查询模具管理-模具入库详情 + getMoldReturn: async (id: number) => { + return await request.get({ url: `/mes/mold-return/get?id=` + id }) + }, + + // 新增模具管理-模具入库 + createMoldReturn: async (data: MoldReturnVO) => { + return await request.post({ url: `/mes/mold-return/create`, data }) + }, + + // 修改模具管理-模具入库 + updateMoldReturn: async (data: MoldReturnVO) => { + return await request.put({ url: `/mes/mold-return/update`, data }) + }, + + // 删除模具管理-模具入库 + deleteMoldReturn: async (id: number) => { + return await request.delete({ url: `/mes/mold-return/delete?id=` + id }) + }, + + // 导出模具管理-模具入库 Excel + exportMoldReturn: async (params) => { + return await request.download({ url: `/mes/mold-return/export-excel`, params }) + }, +} diff --git a/src/locales/en.ts b/src/locales/en.ts index 262afe9a..392c338a 100644 --- a/src/locales/en.ts +++ b/src/locales/en.ts @@ -541,6 +541,38 @@ export default { validatorFromWarehouseRequired: 'From warehouse is required', validatorToWarehouseRequired: 'To warehouse is required' } + }, + PackagingScheme: { + code: 'Scheme Code', + name: 'Scheme Name', + packageQuantity: 'Package Quantity (pcs)', + palletPackageQuantity: 'Pallet Package Quantity (bags)', + palletTotalQuantity: 'Pallet Total Quantity (pcs)', + remark: 'Remark', + status: 'Status', + createTime: 'Create Time', + placeholderCode: 'Please enter scheme code', + placeholderName: 'Please enter scheme name', + placeholderPackageQuantity: 'Please enter package quantity', + placeholderPalletPackageQuantity: 'Please enter pallet package quantity', + placeholderPalletTotalQuantity: 'Please enter pallet total quantity', + placeholderRemark: 'Please enter remark', + placeholderStatus: 'Please select status', + validatorNameRequired: 'Scheme name is required', + validatorCodeRequired: 'Scheme code is required', + validatorPackageQuantityRequired: 'Package quantity is required', + validatorPalletPackageQuantityRequired: 'Pallet package quantity is required', + validatorStatusRequired: 'Status is required' + } + }, + ErpPurchase: { + Supplier: { + name: 'Supplier Name', + contact: 'Contact', + mobile: 'Mobile', + telephone: 'Telephone', + placeholderName: 'Please enter supplier name', + placeholderMobile: 'Please enter mobile' } }, lock: { @@ -1501,6 +1533,7 @@ export default { projectForm: 'Project Form', startDate: 'Start Date', endDate: 'End Date', + planEndDate: 'Plan End Date', cronExpression: 'Cron Expression', enabled: 'Enabled', creatorName: 'Creator', @@ -2063,6 +2096,20 @@ export default { validatorCategoryTypeRequired: 'Type can not be empty', validatorUnitRequired: 'Unit id can not be empty', validatorStatusRequired: 'Product status can not be empty', + dialogPackagingSchemeLabel: 'Packaging Scheme', + dialogPackagingSchemeTitle: 'Select Packaging Scheme', + dialogPackagingSchemePlaceholder: 'Please select packaging scheme', + dialogDefaultStatusLabel: 'Default Scheme', + validatorPackagingSchemeRequired: 'Packaging scheme is required', + dialogSupplierLabel: 'Supplier', + dialogSupplierTitle: 'Select Supplier', + dialogSupplierPlaceholder: 'Please select supplier', + validatorSupplierRequired: 'Supplier is required', + dialogFragileFlagLabel: 'Fragile', + dialogSparePartLevelLabel: 'Spare Part Level', + dialogPurchaseCycleLabel: 'Purchase Cycle (Days)', + dialogBrandLabel: 'Brand', + dialogBrandPlaceholder: 'Please enter brand', categoryTree: 'Category Tree', addCategory: 'Add Category', refreshTree: 'Refresh' @@ -2548,7 +2595,18 @@ export default { replaceNetRemark: 'Remark', placeholderReplaceNetRemark: 'Please input remark', moldInfo: 'Mold Info', - maintainInfo: 'Maintain Info' + maintainInfo: 'Maintain Info', + inspectionResult: 'Inspection Result', + index: 'Index', + inspectionItemName: 'Inspection Item Name', + inspectionMethod: 'Inspection Method', + judgmentCriteria: 'Judgment Criteria', + pendingInspection: 'Pending', + pass: 'Pass', + notPass: 'Not Pass', + inputValue: 'Input Value', + noInspectionItems: 'No Inspection Items', + pleaseSelectProjectForm: 'Please Select Project Form' }, MoldBrandDetail: { diff --git a/src/locales/zh-CN.ts b/src/locales/zh-CN.ts index e50ae842..bcc9da21 100644 --- a/src/locales/zh-CN.ts +++ b/src/locales/zh-CN.ts @@ -541,6 +541,38 @@ export default { validatorFromWarehouseRequired: '调出仓库不能为空', validatorToWarehouseRequired: '调入仓库不能为空' } + }, + PackagingScheme: { + code: '方案编码', + name: '方案名称', + packageQuantity: '每包数量(件)', + palletPackageQuantity: '每托包数(包)', + palletTotalQuantity: '每托总数量(件)', + remark: '备注', + status: '状态', + createTime: '创建时间', + placeholderCode: '请输入方案编码', + placeholderName: '请输入方案名称', + placeholderPackageQuantity: '请输入每包数量', + placeholderPalletPackageQuantity: '请输入每托包数', + placeholderPalletTotalQuantity: '请输入每托总数量', + placeholderRemark: '请输入备注', + placeholderStatus: '请选择状态', + validatorNameRequired: '方案名称不能为空', + validatorCodeRequired: '方案编码不能为空', + validatorPackageQuantityRequired: '每包数量不能为空', + validatorPalletPackageQuantityRequired: '每托包数不能为空', + validatorStatusRequired: '状态不能为空' + } + }, + ErpPurchase: { + Supplier: { + name: '供应商名称', + contact: '联系人', + mobile: '手机号码', + telephone: '联系电话', + placeholderName: '请输入供应商名称', + placeholderMobile: '请输入手机号码' } }, lock: { @@ -1498,6 +1530,7 @@ export default { projectForm: '项目表单', startDate: '开始日期', endDate: '结束日期', + planEndDate: '计划结束时间', cronExpression: 'cron 表达式', enabled: '启用', creatorName: '创建人', @@ -2045,7 +2078,18 @@ export default { replaceNetRemark: '备注', placeholderReplaceNetRemark: '请输入备注', moldInfo: '模具信息', - maintainInfo: '维护信息' + maintainInfo: '维护信息', + inspectionResult: '检验结果', + index: '序号', + inspectionItemName: '检验项名称', + inspectionMethod: '检验方式', + judgmentCriteria: '判定基准', + pendingInspection: '待检测', + pass: '通过', + notPass: '不通过', + inputValue: '输入值', + noInspectionItems: '暂无检验项', + pleaseSelectProjectForm: '请选择项目表单' }, MoldBrandDetail: { @@ -3216,6 +3260,20 @@ export default { validatorCategoryTypeRequired: '类型不能为空', validatorUnitRequired: '单位编号不能为空', validatorStatusRequired: '产品状态不能为空', + dialogPackagingSchemeLabel: '包装方案', + dialogPackagingSchemeTitle: '选择包装方案', + dialogPackagingSchemePlaceholder: '请选择包装方案', + dialogDefaultStatusLabel: '是否默认方案', + validatorPackagingSchemeRequired: '包装方案不能为空', + dialogSupplierLabel: '供应商', + dialogSupplierTitle: '选择供应商', + dialogSupplierPlaceholder: '请选择供应商', + validatorSupplierRequired: '供应商不能为空', + dialogFragileFlagLabel: '是否易损件', + dialogSparePartLevelLabel: '备件等级', + dialogPurchaseCycleLabel: '采购周期(天)', + dialogBrandLabel: '品牌', + dialogBrandPlaceholder: '请输入品牌', categoryTree: '产品分类树', addCategory: '新增分类', refreshTree: '刷新' diff --git a/src/utils/dict.ts b/src/utils/dict.ts index ec3bbc45..6d70292c 100644 --- a/src/utils/dict.ts +++ b/src/utils/dict.ts @@ -236,6 +236,7 @@ export enum DICT_TYPE { ERP_AUTOCODE_CYCLEMETHOD = "erp_autocode_cyclemethod", ERP_AUTOCODE_PARTTYPE = "erp_autocode_parttype", MATERIAL_CLASSIFICATION_TYPE = 'material_classification_type', + SPARE_PARTS_LEVEL = 'spare_parts_level', // ========== MES - 生产管理模块 ========== diff --git a/src/views/erp/mold/components/MoldMaintainView.vue b/src/views/erp/mold/components/MoldMaintainView.vue index d84c0230..522343f0 100644 --- a/src/views/erp/mold/components/MoldMaintainView.vue +++ b/src/views/erp/mold/components/MoldMaintainView.vue @@ -75,20 +75,127 @@ @@ -505,6 +612,32 @@ const selectedProjectFormId = ref('') // 已确认选中的 id const selectedProjectFormName = ref('') // 已确认选中的名称 const subjectListMap = ref>({}) const subjectLoadingMap = ref>({}) +const ticketResultList = ref([]) +const ticketResultEditable = ref(false) +const ticketResultBackup = ref(null) +const handleTicketResultEditToggle = () => { + if (ticketResultEditable.value) { + // 取消编辑,恢复备份 + if (ticketResultBackup.value) { + ticketResultList.value = JSON.parse(JSON.stringify(ticketResultBackup.value)) + ticketResultBackup.value = null + } + ticketResultEditable.value = false + } else { + // 进入编辑,保存备份 + ticketResultBackup.value = JSON.parse(JSON.stringify(ticketResultList.value)) + ticketResultEditable.value = true + } +} +const ticketResultPageNo = ref(1) +const ticketResultPageSize = 5 +const ticketResultPageData = computed(() => { + const start = (ticketResultPageNo.value - 1) * ticketResultPageSize + return ticketResultList.value.slice(start, start + ticketResultPageSize) +}) +const handleTicketResultPageChange = () => { + // 分页切换,数据由 computed 自动计算 +} const projectFormPageParams = reactive({ pageNo: 1, @@ -541,11 +674,18 @@ const handleProjectFormRadioChange = (row: any) => { tempSelectedProjectForm.value = row } -const confirmProjectFormSelection = () => { +const confirmProjectFormSelection = async () => { if (!tempSelectedProjectForm.value) return selectedProjectFormId.value = String(tempSelectedProjectForm.value.id) selectedProjectFormName.value = tempSelectedProjectForm.value.planName ?? String(tempSelectedProjectForm.value.id) taskFormData.projectForm = selectedProjectFormId.value + if (Array.isArray(tempSelectedProjectForm.value.subjectList)) { + subjectListMap.value[selectedProjectFormId.value] = tempSelectedProjectForm.value.subjectList + } else { + await ensureSubjectListLoaded(selectedProjectFormId.value) + } + setTicketResultList(subjectListMap.value[selectedProjectFormId.value] ?? []) + ticketResultEditable.value = false projectFormDialogVisible.value = false } @@ -563,6 +703,36 @@ const ensureSubjectListLoaded = async (planId: number | string) => { } } +const setTicketResultList = (subjectList: any[]) => { + ticketResultList.value = (subjectList ?? []).map((item: any, index: number) => ({ + id: item.id, + subjectId: item.id, + inspectionItemName: item.subjectName ?? item.inspectionItemName ?? '', + inspectionMethod: item.inspectionMethod ?? '', + judgmentCriteria: item.judgmentCriteria ?? item.subjectStandard ?? '', + valueType: item.valueType ?? '', + textInput: item.textInput ?? '', + inspectionResult: item.inspectionResult ?? '0', + images: item.images ?? '', + remark: item.remark ?? '', + sort: index + 1 + })) + ticketResultPageNo.value = 1 +} + +const parseImages = (value: any): string[] => { + if (!value) return [] + if (Array.isArray(value)) return value.map(String).filter(Boolean) + return String(value) + .split(',') + .map((v) => v.trim()) + .filter(Boolean) +} + +const parseFirstImage = (value: any): string => { + return parseImages(value)[0] || '' +} + const handleProjectFormExpandChange = async (row: any, expandedRows: any[]) => { const isExpanded = expandedRows.some((r) => String(r.id) === String(row.id)) if (!isExpanded) return @@ -649,7 +819,8 @@ const submitForm = async () => { name: taskFormData.name, taskType: String(taskFormData.taskType), moldList: props.mold?.id ? String(props.mold.id) : undefined, - projectForm: taskFormData.projectForm + projectForm: taskFormData.projectForm, + ticketResultsList: ticketResultList.value.map((item: any) => ({ ...item })) }) message.success(t('common.createSuccess')) // 清空已提交的表单数据 @@ -657,6 +828,8 @@ const submitForm = async () => { taskFormData.projectForm = '' selectedProjectFormId.value = '' selectedProjectFormName.value = '' + ticketResultList.value = [] + ticketResultEditable.value = false } else if (isRepair.value) { // 提交维修单 const payload: any = { @@ -847,6 +1020,46 @@ defineExpose({ open }) white-space: nowrap; } +.mold-maintain-inspect-layout { + display: flex; + flex-direction: column; + gap: 20px; + align-items: stretch; +} + +.mold-maintain-inspect-layout__form { + min-width: 0; +} + +.mold-maintain-ticket-results { + min-width: 0; + padding: 14px; + border: 1px solid var(--el-border-color-lighter); + border-radius: 8px; + background: #fafafa; +} + +.mold-maintain-ticket-results__header { + display: flex; + align-items: center; + justify-content: flex-end; + gap: 12px; + margin-bottom: 12px; +} + +.mold-maintain-ticket-results__title { + font-size: 14px; + font-weight: 600; + color: var(--el-text-color-primary); +} + +.mold-maintain-ticket-results :deep(.el-upload) { + margin: 0 auto; +} + +@media (max-width: 1400px) { +} + .mold-maintain-page__form-actions { display: flex; justify-content: flex-end; diff --git a/src/views/erp/product/product/ProductForm.vue b/src/views/erp/product/product/ProductForm.vue index f397106c..4488191a 100644 --- a/src/views/erp/product/product/ProductForm.vue +++ b/src/views/erp/product/product/ProductForm.vue @@ -110,6 +110,61 @@ /> + + + + + + + + + + + + + + + {{ dict.label }} + + + + + + + + {{ t('common.yes') }} + {{ t('common.no') }} + + + + + + + + + + + + + @@ -204,6 +259,99 @@ + + + + + + + + + + {{ t('FactoryModeling.ProductInformation.searchButtonText') }} + {{ t('FactoryModeling.ProductInformation.resetButtonText') }} + + + + + + + + + + + + + +
+ +
+ +
+ + + + + + + + + + {{ t('FactoryModeling.ProductInformation.searchButtonText') }} + {{ t('FactoryModeling.ProductInformation.resetButtonText') }} + + + + + + + + + + + + +
+ +
+ +
diff --git a/src/views/erp/stock/packagingSolution/index.vue b/src/views/erp/stock/packagingSolution/index.vue new file mode 100644 index 00000000..121a067f --- /dev/null +++ b/src/views/erp/stock/packagingSolution/index.vue @@ -0,0 +1,189 @@ + + + + diff --git a/src/views/mes/moldget/MoldGetForm.vue b/src/views/mes/moldget/MoldGetForm.vue index 26021713..d15ba7cc 100644 --- a/src/views/mes/moldget/MoldGetForm.vue +++ b/src/views/mes/moldget/MoldGetForm.vue @@ -93,7 +93,13 @@ - + +