liu
3 天以前 ee7ac8df8bce38add1f75baf876b49de94b9e00a
feat(mes): 赋码管理绑定托盘支持未录入批次的袋码

配套后端「袋码绑定托盘免先录生产批次」:
- bind-pallet.vue 托盘下拉改为双数据源:袋码已录入批次走
simple-list,未录入批次走新增的 bindable-list,选项展示批次号或
「临时托盘」标识,便于在混合列表中分辨
- 生产批次只读框在未录入时显示「未录入批次」
- api/mes/pro/pallet 新增 getPalletBindableList(itemId?)

注:同批次的按钮拦截改动(index.vue)已随 f2e80b9f 一并入库。

Co-Authored-By: Claude <noreply@anthropic.com>
已修改2个文件
43 ■■■■■ 文件已修改
src/api/mes/pro/pallet/index.ts 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/mes/pro/bagCode/modules/bind-pallet.vue 35 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/api/mes/pro/pallet/index.ts
@@ -126,6 +126,14 @@
  );
}
/** 查询袋码绑定托盘时的可选目标托盘列表(未绑批次的临时托盘 + 正式托盘,排除已作废) */
export function getPalletBindableList(itemId?: number) {
  return requestClient.get<MesProPalletApi.Pallet[]>(
    '/mes/pro/pallet/bindable-list',
    { params: { itemId } },
  );
}
/** 查询未绑定批次的临时托盘列表(供批次新增/补录绑定托盘下拉使用) */
export function getUnboundPalletList() {
  return requestClient.get<MesProPalletApi.Pallet[]>(
src/views/mes/pro/bagCode/modules/bind-pallet.vue
@@ -1,5 +1,6 @@
<script lang="ts" setup>
  import type { VbenFormSchema } from "#/adapter/form";
  import type { MesProPalletApi } from "#/api/mes/pro/pallet";
  import { useVbenModal } from "@vben/common-ui";
  import { MesProPalletStatusEnum } from "@vben/constants";
@@ -8,19 +9,30 @@
  import { useVbenForm } from "#/adapter/form";
  import { bindBagCodePallet } from "#/api/mes/pro/bagCode";
  import { getPalletSimpleList } from "#/api/mes/pro/pallet";
  import {
    getPalletBindableList,
    getPalletSimpleList,
  } from "#/api/mes/pro/pallet";
  import { $t } from "#/locales";
  defineOptions({ name: "MesProBagCodeBindPallet" });
  /** 弹窗传入数据 */
  /** 弹窗传入数据(batchId 为空表示所选袋码尚未录入生产批次) */
  interface ModalData {
    batchId: number;
    batchId?: number;
    batchCode?: string;
    itemId?: number;
    ids: number[];
  }
  const emit = defineEmits(["success"]);
  /** 未录入批次时的托盘展示名:正式托盘带批次号、临时托盘回退到临时码,便于在混合列表中分辨 */
  function palletLabel(pallet: MesProPalletApi.Pallet) {
    const code = pallet.code || pallet.tempCode || "-";
    const batchPart = pallet.batchCode ? `批次 ${pallet.batchCode}` : "临时托盘";
    return `${code}(${batchPart} / 已装 ${pallet.bagCount ?? 0} 袋)`;
  }
  /** 构建表单(托盘下拉选项由外部加载注入) */
  function buildSchema(palletOptions: { label: string; value: number }[]): VbenFormSchema[] {
@@ -90,20 +102,23 @@
      const data = modalApi.getData<ModalData>();
      modalApi.lock();
      try {
        // 加载该批次下的托盘(排除已作废)
        const pallets = await getPalletSimpleList(data.batchId);
        // 已录入批次:只列本批次的托盘;未录入批次:列该品种可用的临时托盘与正式托盘,
        // 选到正式托盘时由后端先把这批袋码补录进该批次,再完成绑定
        const pallets = data.batchId
          ? await getPalletSimpleList(data.batchId)
          : await getPalletBindableList(data.itemId);
        const options = pallets
          .filter(
            (pallet) => pallet.status !== MesProPalletStatusEnum.CANCELED
          )
          .filter((pallet) => pallet.status !== MesProPalletStatusEnum.CANCELED)
          .map((pallet) => ({
            label: `${pallet.code}(已装 ${pallet.bagCount ?? 0} 袋)`,
            label: data.batchId
              ? `${pallet.code}(已装 ${pallet.bagCount ?? 0} 袋)`
              : palletLabel(pallet),
            value: pallet.id!,
          }));
        await formApi.setState({ schema: buildSchema(options) });
        await formApi.setValues({
          bagCount: data.ids.length,
          batchCode: data.batchCode,
          batchCode: data.batchCode || "未录入批次",
        });
      } finally {
        modalApi.unlock();