云
2026-10-29 2f8b8b76d41d81f4f40c4d10863d93e609374036
fix(mes): 解决产品收货批次信息传递和销售订单校验问题

- 修复产品收货服务中批次ID和批次代码从收货行获取而非明细
- 添加收货行存在性和归属校验逻辑
- 在产品销售行创建时添加销售订单明细校验
- 添加ERP销售订单API集成以验证销售订单项目关联
- 修复退货销售库存操作中的数量比较逻辑
- 添加退货销售批次信息在库存交易中的传递
- 增加相关单元测试验证销售订单校验和批次信息处理
已修改4个文件
33 ■■■■■ 文件已修改
src/views/wls/productsales/data.ts 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/wls/productsales/modules/line-form.vue 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/wls/returnsales/data.ts 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/wls/returnsales/modules/line-form.vue 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/wls/productsales/data.ts
@@ -473,8 +473,27 @@
export function useLineFormSchema(
  hasNotice: boolean,
  formApi?: VbenFormApi,
  orderItems: import('#/api/erp/sale/order').ErpSaleOrderApi.SaleOrderItem[] = [],
): VbenFormSchema[] {
  return [
    {
      fieldName: 'saleOrderItemId',
      label: '销售订单明细',
      component: 'Select',
      componentProps: {
        placeholder: '请选择销售订单明细及盘号',
        options: orderItems.map((item) => ({
          label: `${item.productName || ''}(盘号:${item.reelNo || '未填写'})`,
          value: item.id,
        })),
        onChange: async (id?: number) => {
          const item = orderItems.find((entry) => entry.id === id);
          await formApi?.setFieldValue('itemId', item?.productId);
        },
      },
      dependencies: { triggerFields: ['noticeId'], if: () => !hasNotice },
      rules: 'selectRequired',
    },
    {
      fieldName: 'noticeId',
      component: 'Input',
@@ -515,9 +534,9 @@
      },
      rules: 'selectRequired',
      dependencies: {
        triggerFields: ['noticeLineId'],
        triggerFields: ['noticeLineId', 'saleOrderItemId'],
        componentProps: (values) => ({
          disabled: !!values.noticeLineId,
          disabled: !!values.noticeLineId || !!values.saleOrderItemId,
          placeholder: '请选择产品',
        }),
      },
src/views/wls/productsales/modules/line-form.vue
@@ -8,6 +8,8 @@
import { message } from 'ant-design-vue';
import { useVbenForm } from '#/adapter/form';
import { getProductSales } from '#/api/mes/wm/productsales';
import { getSaleOrder } from '#/api/erp/sale/order';
import {
  createProductSalesLine,
  getProductSalesLine,
@@ -78,7 +80,9 @@
    }>();
    salesId.value = data.salesId;
    noticeId.value = data.noticeId;
    formApi.setState({ schema: useLineFormSchema(!!data.noticeId, formApi) });
    const sales = await getProductSales(data.salesId);
    const order = sales.saleOrderId ? await getSaleOrder(sales.saleOrderId) : undefined;
    formApi.setState({ schema: useLineFormSchema(!!data.noticeId, formApi, order?.items || []) });
    if (data.noticeId) {
      await formApi.setFieldValue('noticeId', data.noticeId);
    }
src/views/wls/returnsales/data.ts
@@ -404,7 +404,7 @@
            return z
              .number({ message: '请输入退货数量' })
              .min(0)
              .max(max, `可退货数量不能超过 ${max}`);
              .max(max, `退货数量不能超过订单数量 ${max}`);
          }
          return z.number({ message: '请输入退货数量' }).min(0);
        },
src/views/wls/returnsales/modules/line-form.vue
@@ -115,7 +115,7 @@
      v-if="maxQuantity !== undefined"
      class="mx-4 mt-2 text-sm text-blue-600"
    >
      当前物料可退货数量:<span class="font-bold">{{ maxQuantity }}</span>
      当前物料订单数量:<span class="font-bold">{{ maxQuantity }}</span>
    </div>
  </Modal>
</template>