gaoluyang
2026-07-15 b176162c23294d8d1bfb9f09cf6bb759efb0124a
src/views/wls/materialstock/components/stock-adjust-modal.vue
@@ -4,7 +4,6 @@
  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';
@@ -20,9 +19,8 @@
  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,
@@ -44,56 +42,45 @@
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 } },
  ]);
}
@@ -103,10 +90,9 @@
  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;
  }
  // 清空批次相关值
@@ -290,17 +276,77 @@
      },
      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',
@@ -355,7 +401,6 @@
      selectedWarehouse.value = null;
      selectedLocation.value = null;
      batchEnabled.value = false;
      batchConfig.value = null;
      operateType.value = 1;
      modalTitle.value = '库存调整';
      return;
@@ -365,9 +410,13 @@
    // 默认隐藏批次相关字段
    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;
@@ -383,7 +432,7 @@
      if (data.itemId) {
        const itemDetail = await getItem(data.itemId);
        selectedItem.value = itemDetail;
        await loadBatchConfigAndUpdateFields(data.itemId);
        await updateBatchFields();
      }
    }
  },
@@ -399,35 +448,36 @@
  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;
      }
    }
@@ -439,30 +489,34 @@
    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('出库成功');
@@ -481,8 +535,7 @@
    <Form class="mx-4" />
    <BatchConfigDisplay
      ref="batchConfigDisplayRef"
      :item-id="selectedItem?.id"
      :is-batch-managed="batchEnabled"
      :item="selectedItem"
    />
  </Modal>
</template>