| | |
| | | MaterialStockAdjustOutParams, |
| | | } from '#/api/mes/wm/materialstock'; |
| | | import type { MdmItemApi } from '#/api/mdm/item'; |
| | | import type { MdmItemBatchConfigApi } from '#/api/mes/md/item-batch-config'; |
| | | import type { VbenFormSchema } from '#/adapter/form'; |
| | | |
| | | import { ref } from 'vue'; |
| | |
| | | adjustMaterialStockOut, |
| | | } from '#/api/mes/wm/materialstock'; |
| | | import { getItem } from '#/api/mdm/item'; |
| | | import { getItemBatchConfigByItemId } from '#/api/mes/md/item-batch-config'; |
| | | import { MdmItemSelect } from '#/views/basicData/mdm/components'; |
| | | import { MdVendorSelect } from '#/views/mes/md/vendor/components'; |
| | | import { ErpSupplierSelect } from '#/views/erp/purchase/supplier/components'; |
| | | import BatchConfigDisplay from './batch-config-display.vue'; |
| | | import { |
| | | WmWarehouseAreaSelect, |
| | |
| | | const batchEnabled = ref(false); |
| | | // 是否手动填写批次号 |
| | | const manualBatchEntry = ref(false); |
| | | // 物料批次配置 |
| | | const batchConfig = ref<MdmItemBatchConfigApi.ItemBatchConfig | null>(null); |
| | | // 批次配置展示组件引用 |
| | | const batchConfigDisplayRef = ref<InstanceType<typeof BatchConfigDisplay>>(); |
| | | |
| | | // 标题 |
| | | const modalTitle = ref('库存调整'); |
| | | |
| | | /** 加载物料批次配置并更新字段显示 */ |
| | | async function loadBatchConfigAndUpdateFields(itemId: number) { |
| | | try { |
| | | const config = await getItemBatchConfigByItemId(itemId); |
| | | batchConfig.value = config; |
| | | } catch { |
| | | batchConfig.value = null; |
| | | } |
| | | await updateBatchFields(); |
| | | } |
| | | |
| | | /** 更新批次字段显示(根据配置展示已启用的属性) */ |
| | | /** 更新批次字段显示(根据物料数据中的批次配置展示已启用的属性) */ |
| | | async function updateBatchFields() { |
| | | const enabled = selectedItem.value?.isBatchManaged === true; |
| | | batchEnabled.value = enabled; |
| | | |
| | | if (!enabled) { |
| | | // 隐藏所有批次相关字段 |
| | | formApi.updateSchema([ |
| | | { fieldName: 'batchCode', dependencies: { show: () => false } }, |
| | | { fieldName: 'manualBatchEntry', dependencies: { show: () => false } }, |
| | | { fieldName: 'produceDate', dependencies: { show: () => false } }, |
| | | { fieldName: 'expireDate', dependencies: { show: () => false } }, |
| | | { fieldName: 'manualBatchEntry', dependencies: { show: () => false } }, |
| | | { fieldName: 'receiptDate', dependencies: { show: () => false } }, |
| | | { fieldName: 'vendorId', dependencies: { show: () => true } }, |
| | | { fieldName: 'purchaseOrderCode', dependencies: { show: () => false } }, |
| | | { fieldName: 'lotNumber', dependencies: { show: () => false } }, |
| | | { fieldName: 'qualityStatus', dependencies: { show: () => false } }, |
| | | ]); |
| | | return; |
| | | } |
| | | |
| | | // 启用批次管理,根据配置显示字段 |
| | | const config = batchConfig.value; |
| | | const item = selectedItem.value; |
| | | const isIn = operateType.value === 1; |
| | | |
| | | // 是否手动填写批次号控制批次号字段的显示 |
| | | const showBatchCode = manualBatchEntry.value; |
| | | const showProduceDate = isIn && !!config?.produceDateFlag; |
| | | const showExpireDate = isIn && !!config?.expireDateFlag; |
| | | |
| | | formApi.updateSchema([ |
| | | { fieldName: 'batchCode', dependencies: { show: () => showBatchCode } }, |
| | | { fieldName: 'produceDate', dependencies: { show: () => showProduceDate } }, |
| | | { fieldName: 'expireDate', dependencies: { show: () => showExpireDate } }, |
| | | { fieldName: 'batchCode', dependencies: { show: () => manualBatchEntry.value } }, |
| | | { fieldName: 'manualBatchEntry', dependencies: { show: () => true } }, |
| | | { fieldName: 'produceDate', dependencies: { show: () => isIn && !!item?.produceDateFlag } }, |
| | | { fieldName: 'expireDate', dependencies: { show: () => isIn && !!item?.expireDateFlag } }, |
| | | { fieldName: 'receiptDate', dependencies: { show: () => isIn && !!item?.receiptDateFlag } }, |
| | | { fieldName: 'vendorId', dependencies: { show: () => !isIn || !!item?.vendorFlag } }, |
| | | { fieldName: 'purchaseOrderCode', dependencies: { show: () => isIn && !!item?.purchaseOrderCodeFlag } }, |
| | | { fieldName: 'lotNumber', dependencies: { show: () => isIn && !!item?.lotNumberFlag } }, |
| | | { fieldName: 'qualityStatus', dependencies: { show: () => isIn && !!item?.qualityStatusFlag } }, |
| | | ]); |
| | | } |
| | | |
| | |
| | | if (item?.id) { |
| | | const itemDetail = await getItem(item.id); |
| | | selectedItem.value = itemDetail; |
| | | // 加载物料批次配置并更新字段 |
| | | await loadBatchConfigAndUpdateFields(item.id); |
| | | // 根据物料数据更新批次字段 |
| | | await updateBatchFields(); |
| | | } else { |
| | | batchConfig.value = null; |
| | | batchEnabled.value = false; |
| | | } |
| | | // 清空批次相关值 |
| | |
| | | }, |
| | | dependencies: { |
| | | triggerFields: ['itemId'], |
| | | show: () => false, // 默认隐藏 |
| | | show: () => false, |
| | | }, |
| | | }, |
| | | // 入库日期(根据批次配置显示,仅入库) |
| | | { |
| | | fieldName: 'receiptDate', |
| | | label: '入库日期', |
| | | component: 'DatePicker', |
| | | componentProps: { |
| | | placeholder: '请选择入库日期', |
| | | format: 'YYYY-MM-DD', |
| | | valueFormat: 'YYYY-MM-DD', |
| | | }, |
| | | dependencies: { |
| | | triggerFields: ['itemId'], |
| | | show: () => false, |
| | | }, |
| | | }, |
| | | { |
| | | fieldName: 'vendorId', |
| | | label: '供应商', |
| | | component: markRaw(MdVendorSelect), |
| | | component: markRaw(ErpSupplierSelect), |
| | | componentProps: { |
| | | placeholder: '请选择供应商', |
| | | }, |
| | | rules: 'selectRequired', |
| | | }, |
| | | // 采购订单号(根据批次配置显示,仅入库) |
| | | { |
| | | fieldName: 'purchaseOrderCode', |
| | | label: '采购订单号', |
| | | component: 'Input', |
| | | componentProps: { |
| | | placeholder: '请输入采购订单号', |
| | | }, |
| | | dependencies: { |
| | | triggerFields: ['itemId'], |
| | | show: () => false, |
| | | }, |
| | | }, |
| | | // 生产批号(根据批次配置显示,仅入库) |
| | | { |
| | | fieldName: 'lotNumber', |
| | | label: '生产批号', |
| | | component: 'Input', |
| | | componentProps: { |
| | | placeholder: '请输入生产批号', |
| | | }, |
| | | dependencies: { |
| | | triggerFields: ['itemId'], |
| | | show: () => false, |
| | | }, |
| | | }, |
| | | // 质量状态(根据批次配置显示,仅入库) |
| | | { |
| | | fieldName: 'qualityStatus', |
| | | label: '质量状态', |
| | | component: 'Select', |
| | | componentProps: { |
| | | placeholder: '请选择质量状态', |
| | | allowClear: true, |
| | | options: [ |
| | | { label: '合格', value: 'QUALIFIED' }, |
| | | { label: '不合格', value: 'UNQUALIFIED' }, |
| | | { label: '待检', value: 'PENDING' }, |
| | | ], |
| | | }, |
| | | dependencies: { |
| | | triggerFields: ['itemId'], |
| | | show: () => false, |
| | | }, |
| | | }, |
| | | { |
| | | fieldName: 'quantity', |
| | |
| | | selectedWarehouse.value = null; |
| | | selectedLocation.value = null; |
| | | batchEnabled.value = false; |
| | | batchConfig.value = null; |
| | | operateType.value = 1; |
| | | modalTitle.value = '库存调整'; |
| | | return; |
| | |
| | | // 默认隐藏批次相关字段 |
| | | formApi.updateSchema([ |
| | | { fieldName: 'batchCode', dependencies: { show: () => false } }, |
| | | { fieldName: 'manualBatchEntry', dependencies: { show: () => false } }, |
| | | { fieldName: 'produceDate', dependencies: { show: () => false } }, |
| | | { fieldName: 'expireDate', dependencies: { show: () => false } }, |
| | | { fieldName: 'manualBatchEntry', dependencies: { show: () => false } }, |
| | | { fieldName: 'receiptDate', dependencies: { show: () => false } }, |
| | | { fieldName: 'purchaseOrderCode', dependencies: { show: () => false } }, |
| | | { fieldName: 'lotNumber', dependencies: { show: () => false } }, |
| | | { fieldName: 'qualityStatus', dependencies: { show: () => false } }, |
| | | ]); |
| | | // 重置手动填写批次号状态 |
| | | manualBatchEntry.value = false; |
| | |
| | | if (data.itemId) { |
| | | const itemDetail = await getItem(data.itemId); |
| | | selectedItem.value = itemDetail; |
| | | await loadBatchConfigAndUpdateFields(data.itemId); |
| | | await updateBatchFields(); |
| | | } |
| | | } |
| | | }, |
| | |
| | | |
| | | const values = await formApi.getValues(); |
| | | |
| | | const { |
| | | itemId, |
| | | warehouseId, |
| | | locationId, |
| | | areaId, |
| | | batchCode, |
| | | produceDate, |
| | | expireDate, |
| | | vendorId, |
| | | quantity, |
| | | reason, |
| | | } = values; |
| | | |
| | | // 启用批次管理时的校验 |
| | | if (batchEnabled.value) { |
| | | // 手动填写批次号时,批次号必填 |
| | | if (manualBatchEntry.value && !batchCode) { |
| | | if (manualBatchEntry.value && !values.batchCode) { |
| | | message.error('请输入批次号'); |
| | | return; |
| | | } |
| | | // 根据批次配置校验必填字段(仅入库) |
| | | if (operateType.value === 1) { |
| | | const config = batchConfig.value; |
| | | if (config?.produceDateFlag && !produceDate) { |
| | | const item = selectedItem.value; |
| | | if (item?.produceDateFlag && !values.produceDate) { |
| | | message.error('请选择生产日期'); |
| | | return; |
| | | } |
| | | if (config?.expireDateFlag && !expireDate) { |
| | | if (item?.expireDateFlag && !values.expireDate) { |
| | | message.error('请选择有效期'); |
| | | return; |
| | | } |
| | | if (item?.receiptDateFlag && !values.receiptDate) { |
| | | message.error('请选择入库日期'); |
| | | return; |
| | | } |
| | | if (item?.purchaseOrderCodeFlag && !values.purchaseOrderCode) { |
| | | message.error('请输入采购订单号'); |
| | | return; |
| | | } |
| | | if (item?.lotNumberFlag && !values.lotNumber) { |
| | | message.error('请输入生产批号'); |
| | | return; |
| | | } |
| | | if (item?.qualityStatusFlag && !values.qualityStatus) { |
| | | message.error('请选择质量状态'); |
| | | return; |
| | | } |
| | | } |
| | |
| | | if (type === 1) { |
| | | // 入库 |
| | | const params: MaterialStockAdjustInParams = { |
| | | itemId, |
| | | warehouseId, |
| | | locationId, |
| | | areaId, |
| | | batchCode, |
| | | produceDate, |
| | | expireDate, |
| | | vendorId, |
| | | quantity, |
| | | reason, |
| | | itemId: values.itemId, |
| | | warehouseId: values.warehouseId, |
| | | locationId: values.locationId, |
| | | areaId: values.areaId, |
| | | batchCode: values.batchCode, |
| | | produceDate: values.produceDate, |
| | | expireDate: values.expireDate, |
| | | receiptDate: values.receiptDate, |
| | | vendorId: values.vendorId, |
| | | purchaseOrderCode: values.purchaseOrderCode, |
| | | lotNumber: values.lotNumber, |
| | | qualityStatus: values.qualityStatus, |
| | | quantity: values.quantity, |
| | | reason: values.reason, |
| | | }; |
| | | await adjustMaterialStockIn(params); |
| | | message.success('入库成功'); |
| | | } else { |
| | | // 出库 |
| | | const params: MaterialStockAdjustOutParams = { |
| | | itemId, |
| | | warehouseId, |
| | | locationId, |
| | | areaId, |
| | | batchCode, |
| | | vendorId, |
| | | quantity, |
| | | reason, |
| | | itemId: values.itemId, |
| | | warehouseId: values.warehouseId, |
| | | locationId: values.locationId, |
| | | areaId: values.areaId, |
| | | batchCode: values.batchCode, |
| | | vendorId: values.vendorId, |
| | | quantity: values.quantity, |
| | | reason: values.reason, |
| | | }; |
| | | await adjustMaterialStockOut(params); |
| | | message.success('出库成功'); |
| | |
| | | <Form class="mx-4" /> |
| | | <BatchConfigDisplay |
| | | ref="batchConfigDisplayRef" |
| | | :item-id="selectedItem?.id" |
| | | :is-batch-managed="batchEnabled" |
| | | :item="selectedItem" |
| | | /> |
| | | </Modal> |
| | | </template> |