1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
<script lang="ts" setup>
import type { MdmItemBatchConfigApi } from '#/api/mes/md/item-batch-config';
 
import { computed, ref, watch } from 'vue';
 
import { Checkbox, Divider } from 'ant-design-vue';
 
import {
  getItemBatchConfigByItemId,
  saveItemBatchConfig,
} from '#/api/mes/md/item-batch-config';
 
const props = defineProps<{
  itemId?: number;
  isBatchManaged?: boolean;
}>();
 
const emit = defineEmits<{
  change: [config: Partial<MdmItemBatchConfigApi.ItemBatchConfig>];
}>();
 
// 批次配置数据
const config = ref<Partial<MdmItemBatchConfigApi.ItemBatchConfig>>({
  produceDateFlag: false,
  expireDateFlag: false,
  receiptDateFlag: false,
  vendorFlag: false,
  purchaseOrderCodeFlag: false,
  lotNumberFlag: false,
  qualityStatusFlag: false,
});
 
// 是否加载中
const loading = ref(false);
 
// 是否显示配置(启用批次管理时显示)
const visible = computed(() => props.isBatchManaged === true);
 
// 批次配置选项(仅保留7个字段)
const configOptions = [
  { key: 'produceDateFlag', label: '生产日期' },
  { key: 'expireDateFlag', label: '有效期' },
  { key: 'receiptDateFlag', label: '入库日期' },
  { key: 'vendorFlag', label: '供应商' },
  { key: 'purchaseOrderCodeFlag', label: '采购订单号' },
  { key: 'lotNumberFlag', label: '生产批号' },
  { key: 'qualityStatusFlag', label: '质量状态' },
] as const;
 
/** 加载批次配置 */
async function loadConfig() {
  if (!props.itemId || !props.isBatchManaged) {
    return;
  }
  loading.value = true;
  try {
    const data = await getItemBatchConfigByItemId(props.itemId);
    if (data) {
      config.value = { ...config.value, ...data };
    }
  } catch {
    // 无配置时不报错
  } finally {
    loading.value = false;
  }
}
 
/** 保存批次配置 */
async function saveConfig(): Promise<number | undefined> {
  if (!props.itemId || !props.isBatchManaged) {
    return undefined;
  }
  const data: MdmItemBatchConfigApi.ItemBatchConfig = {
    ...config.value as MdmItemBatchConfigApi.ItemBatchConfig,
    itemId: props.itemId,
  };
  const id = await saveItemBatchConfig(data);
  config.value.id = id;
  return id;
}
 
/** 获取当前配置 */
function getConfig(): Partial<MdmItemBatchConfigApi.ItemBatchConfig> {
  return { ...config.value };
}
 
/** 重置配置 */
function resetConfig() {
  config.value = {
    produceDateFlag: false,
    expireDateFlag: false,
    receiptDateFlag: false,
    vendorFlag: false,
    purchaseOrderCodeFlag: false,
    lotNumberFlag: false,
    qualityStatusFlag: false,
  };
}
 
// 监听 itemId 变化,加载配置
watch(
  () => [props.itemId, props.isBatchManaged],
  () => {
    if (props.itemId && props.isBatchManaged) {
      loadConfig();
    } else {
      resetConfig();
    }
  },
  { immediate: true },
);
 
// 监听配置变化,触发 change 事件
watch(
  config,
  () => {
    emit('change', getConfig());
  },
  { deep: true },
);
 
defineExpose({
  saveConfig,
  getConfig,
  loadConfig,
  resetConfig,
});
</script>
 
<template>
  <div v-if="visible" class="mt-4">
    <Divider orientation="left">批次属性配置</Divider>
    <div class="grid grid-cols-4 gap-4 px-4">
      <Checkbox
        v-for="option in configOptions"
        :key="option.key"
        v-model:checked="config[option.key]"
        :disabled="loading"
      >
        {{ option.label }}
      </Checkbox>
    </div>
    <p class="mt-2 px-4 text-xs text-gray-500">
      勾选表示创建批次时该字段必填
    </p>
  </div>
</template>