| | |
| | | <script lang="ts" setup> |
| | | import type { FormType, PalletOption } from "../data"; |
| | | import type { FormType, PalletOption, TonBagOption } from "../data"; |
| | | |
| | | import type { VxeTableGridOptions } from "#/adapter/vxe-table"; |
| | | import type { MesProBatchApi } from "#/api/mes/pro/batch"; |
| | |
| | | updateBatch, |
| | | } from "#/api/mes/pro/batch"; |
| | | import { getUnboundPalletList } from "#/api/mes/pro/pallet"; |
| | | import { getUnboundTonBags } from "#/api/mes/pro/bagCode"; |
| | | import { $t } from "#/locales"; |
| | | import { UserSelect } from "#/views/system/user/components"; |
| | | |
| | |
| | | |
| | | const formType = ref<FormType>("create"); |
| | | const formData = ref<MesProBatchApi.Batch>(); |
| | | let palletOptions: PalletOption[] = []; |
| | | let tonBagOptions: TonBagOption[] = []; |
| | | async function handlePalletChange(ids: number[] = []) { |
| | | const values = await formApi.getValues(); |
| | | if (ids.length && (values.tonBagIds?.length || formData.value?.bindingMode === 'tonBag')) { |
| | | message.warning('绑定托盘和绑定吨袋只能选择一种'); |
| | | await formApi.setFieldValue('palletIds', []); |
| | | return; |
| | | } |
| | | const selected = palletOptions.filter(option => ids.includes(option.value)); |
| | | const source = formData.value?.itemId ? formData.value : selected[0]; |
| | | if (selected.some(option => !option.itemId || (source?.itemId && option.itemId !== source.itemId))) { |
| | | message.warning('生产批次只能绑定相同品种的托盘'); |
| | | await formApi.setFieldValue('palletIds', selected.filter(option => option.itemId === source?.itemId).map(option => option.value)); |
| | | } |
| | | await formApi.setFieldValue('itemId', source?.itemId); |
| | | await formApi.setFieldValue('itemName', source?.itemName); |
| | | await formApi.setFieldValue('itemCode', source?.itemCode); |
| | | } |
| | | |
| | | async function handleTonBagChange(ids: number[] = []) { |
| | | const values = await formApi.getValues(); |
| | | if (ids.length && (values.palletIds?.length || formData.value?.bindingMode === 'pallet')) { |
| | | message.warning('绑定托盘和绑定吨袋只能选择一种'); |
| | | await formApi.setFieldValue('tonBagIds', []); |
| | | return; |
| | | } |
| | | const selected = tonBagOptions.filter(option => ids.includes(option.value)); |
| | | const source = formData.value?.itemId ? formData.value : selected[0]; |
| | | if (selected.some(option => option.itemId !== source?.itemId)) { |
| | | message.warning('生产批次只能绑定相同品种的吨袋'); |
| | | await formApi.setFieldValue('tonBagIds', selected.filter(option => option.itemId === source?.itemId).map(option => option.value)); |
| | | } |
| | | await formApi.setFieldValue('itemId', source?.itemId); |
| | | await formApi.setFieldValue('itemName', source?.itemName); |
| | | await formApi.setFieldValue('itemCode', source?.itemCode); |
| | | } |
| | | |
| | | const isEditable = computed(() => |
| | | ["create", "update", "fill"].includes(formType.value) |
| | |
| | | modalApi.lock(); |
| | | try { |
| | | const data = (await formApi.getValues()) as MesProBatchApi.Batch; |
| | | if (data.palletIds?.length && data.tonBagIds?.length) { |
| | | message.warning('绑定托盘和绑定吨袋只能选择一种'); |
| | | return; |
| | | } |
| | | if (formType.value === "fill") { |
| | | await fillBatchInfo({ ...data, id: formData.value!.id, workers }); |
| | | } else if (formData.value?.id) { |
| | |
| | | const data = modalApi.getData<{ formType: FormType; id?: number }>(); |
| | | formType.value = data.formType; |
| | | // 新增/补录/编辑态加载未绑定批次的托盘,供「绑定托盘」多选下拉使用 |
| | | let palletOptions: PalletOption[] = []; |
| | | palletOptions = []; |
| | | tonBagOptions = []; |
| | | if (formType.value !== "detail") { |
| | | const pallets = await getUnboundPalletList(); |
| | | const [pallets, tonBags] = await Promise.all([getUnboundPalletList(), getUnboundTonBags()]); |
| | | palletOptions = pallets.map((pallet) => ({ |
| | | label: `${pallet.tempCode ?? `托盘${pallet.id}`}(已装 ${pallet.bagCount ?? 0} 袋)`, |
| | | label: `${pallet.tempCode ?? `托盘${pallet.id}`} · ${pallet.itemName || "待完善品种"}(已装 ${pallet.bagCount ?? 0} 袋)`, |
| | | value: pallet.id as number, |
| | | itemId: pallet.itemId, itemName: pallet.itemName, itemCode: pallet.itemCode, |
| | | })); |
| | | tonBagOptions = tonBags.map((bag) => ({ |
| | | label: `${bag.code ?? `吨袋${bag.id}`} · ${bag.itemName || '待完善品种'}`, |
| | | value: bag.id as number, |
| | | itemId: bag.itemId, itemName: bag.itemName, itemCode: bag.itemCode, |
| | | })); |
| | | } |
| | | formApi.setState({ schema: useFormSchema(formType.value, palletOptions) }); |
| | | formApi.setState({ schema: useFormSchema(formType.value, palletOptions, handlePalletChange, tonBagOptions, handleTonBagChange) }); |
| | | if (formType.value !== "detail") { |
| | | // 清空上次打开时勾选的托盘,避免残留值误触发「批次进入生产中」 |
| | | await formApi.setFieldValue("palletIds", undefined); |
| | | await formApi.setFieldValue("tonBagIds", undefined); |
| | | } |
| | | // 根据表单态切换人员子表列 |
| | | workerGridApi.setGridOptions({ |
| | |
| | | modalApi.lock(); |
| | | try { |
| | | formData.value = await getBatch(data.id); |
| | | const existingBinding = formData.value.bindingMode; |
| | | formApi.setState({ schema: useFormSchema(formType.value, palletOptions, handlePalletChange, tonBagOptions, handleTonBagChange, existingBinding) }); |
| | | await formApi.setValues(formData.value); |
| | | const workers = (formData.value.workers ?? []).map( |
| | | (worker, index) => ({ ...worker, _rowKey: worker.id ?? index }) |