✨ feat(mes): 添加条码内容生成接口及相关逻辑
新增条码内容生成接口,支持根据业务类型和编码生成条码内容。 同时更新相关服务和前端组件,确保条码内容的自动生成和验证逻辑。pull/871/MERGE
parent
b386c17933
commit
715135fbb1
|
|
@ -53,5 +53,13 @@ export const WmBarcodeApi = {
|
|||
// 导出条码 Excel
|
||||
exportBarcode: async (params: any) => {
|
||||
return await request.download({ url: '/mes/wm/barcode/export-excel', params })
|
||||
},
|
||||
|
||||
// 生成条码内容
|
||||
generateBarcodeContent: async (bizType: number, bizCode: string) => {
|
||||
return await request.get({
|
||||
url: '/mes/wm/barcode/generate-content',
|
||||
params: { bizType, bizCode }
|
||||
})
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,81 @@
|
|||
<!-- MES 工具选择器:纯下拉,前端过滤(支持 name、code) -->
|
||||
<template>
|
||||
<el-select
|
||||
v-model="selectValue"
|
||||
:placeholder="placeholder"
|
||||
:disabled="disabled"
|
||||
:clearable="clearable"
|
||||
filterable
|
||||
:filter-method="handleFilter"
|
||||
class="!w-1/1"
|
||||
@change="handleChange"
|
||||
>
|
||||
<el-option v-for="item in filteredList" :key="item.id" :label="item.name" :value="item.id">
|
||||
<div class="flex items-center gap-8px">
|
||||
<span>{{ item.name }}</span>
|
||||
<el-tag v-if="item.code" size="small" type="info" class="ml-4px">
|
||||
编号: {{ item.code }}
|
||||
</el-tag>
|
||||
</div>
|
||||
</el-option>
|
||||
</el-select>
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
import { TmToolApi, TmToolVO } from '@/api/mes/tm/tool'
|
||||
|
||||
defineOptions({ name: 'TmToolSelect' })
|
||||
|
||||
const props = withDefaults(
|
||||
defineProps<{
|
||||
modelValue?: number
|
||||
disabled?: boolean
|
||||
clearable?: boolean
|
||||
placeholder?: string
|
||||
}>(),
|
||||
{
|
||||
disabled: false,
|
||||
clearable: true,
|
||||
placeholder: '请选择工具'
|
||||
}
|
||||
)
|
||||
|
||||
const emit = defineEmits<{
|
||||
'update:modelValue': [value: number | undefined]
|
||||
change: [item: TmToolVO | undefined]
|
||||
}>()
|
||||
|
||||
const allList = ref<TmToolVO[]>([])
|
||||
const filteredList = ref<TmToolVO[]>([])
|
||||
|
||||
const selectValue = computed({
|
||||
get: () => props.modelValue,
|
||||
set: (val) => emit('update:modelValue', val)
|
||||
})
|
||||
|
||||
/** 前端过滤(name + code) */
|
||||
const handleFilter = (query: string) => {
|
||||
if (!query) {
|
||||
filteredList.value = allList.value
|
||||
return
|
||||
}
|
||||
const keyword = query.toLowerCase()
|
||||
filteredList.value = allList.value.filter(
|
||||
(item) =>
|
||||
item.name?.toLowerCase().includes(keyword) ||
|
||||
item.code?.toLowerCase().includes(keyword)
|
||||
)
|
||||
}
|
||||
|
||||
/** 选中变化 */
|
||||
const handleChange = (val: number | undefined) => {
|
||||
const item = allList.value.find((o) => o.id === val)
|
||||
emit('change', item)
|
||||
}
|
||||
|
||||
/** 加载工具列表 */
|
||||
onMounted(async () => {
|
||||
allList.value = await TmToolApi.getToolSimpleList()
|
||||
filteredList.value = allList.value
|
||||
})
|
||||
</script>
|
||||
|
|
@ -55,7 +55,11 @@
|
|||
/>
|
||||
</div>
|
||||
</el-form-item>
|
||||
<el-form-item v-else-if="formData.bizType === BarcodeBizTypeEnum.AREA" label="库位" prop="bizId">
|
||||
<el-form-item
|
||||
v-else-if="formData.bizType === BarcodeBizTypeEnum.AREA"
|
||||
label="库位"
|
||||
prop="bizId"
|
||||
>
|
||||
<div class="space-y-2">
|
||||
<WmWarehouseSelect
|
||||
v-model="areaWarehouseId"
|
||||
|
|
@ -153,18 +157,13 @@
|
|||
/>
|
||||
</el-form-item>
|
||||
<el-form-item label="业务编码" prop="bizCode">
|
||||
<el-input
|
||||
v-model="formData.bizCode"
|
||||
placeholder="请输入业务编码"
|
||||
disabled
|
||||
/>
|
||||
<el-input v-model="formData.bizCode" placeholder="请输入业务编码" disabled />
|
||||
</el-form-item>
|
||||
<el-form-item label="业务名称" prop="bizName">
|
||||
<el-input
|
||||
v-model="formData.bizName"
|
||||
placeholder="请输入业务名称"
|
||||
disabled
|
||||
/>
|
||||
<el-input v-model="formData.bizName" placeholder="请输入业务名称" disabled />
|
||||
</el-form-item>
|
||||
<el-form-item label="条码内容" prop="content">
|
||||
<el-input v-model="formData.content" placeholder="请输入条码内容或自动生成" />
|
||||
</el-form-item>
|
||||
<el-form-item label="状态" prop="status">
|
||||
<el-radio-group v-model="formData.status">
|
||||
|
|
@ -189,7 +188,7 @@
|
|||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
import { getIntDictOptions, DICT_TYPE } from '@/utils/dict'
|
||||
import { DICT_TYPE, getIntDictOptions } from '@/utils/dict'
|
||||
import { CommonStatusEnum } from '@/utils/constants'
|
||||
import { WmBarcodeApi, type WmBarcodeVO } from '@/api/mes/wm/barcode'
|
||||
import { BarcodeBizTypeEnum } from '@/views/mes/utils/constants'
|
||||
|
|
@ -222,6 +221,7 @@ const formData = ref<WmBarcodeVO>({
|
|||
bizId: undefined,
|
||||
bizCode: undefined,
|
||||
bizName: undefined,
|
||||
content: undefined,
|
||||
status: CommonStatusEnum.ENABLE,
|
||||
remark: ''
|
||||
})
|
||||
|
|
@ -230,7 +230,8 @@ const formRules = reactive({
|
|||
bizType: [{ required: true, message: '业务类型不能为空', trigger: 'change' }],
|
||||
bizId: [{ required: true, message: '业务编号不能为空', trigger: 'blur' }],
|
||||
bizCode: [{ required: true, message: '业务编码不能为空', trigger: 'blur' }],
|
||||
bizName: [{ required: true, message: '业务名称不能为空', trigger: 'blur' }]
|
||||
bizName: [{ required: true, message: '业务名称不能为空', trigger: 'blur' }],
|
||||
content: [{ required: true, message: '条码内容不能为空', trigger: 'blur' }]
|
||||
})
|
||||
const formRef = ref()
|
||||
|
||||
|
|
@ -239,16 +240,30 @@ const areaWarehouseId = ref<number>() // 库位选择器的临时数据:选择
|
|||
const areaLocationId = ref<number>() // 库位选择器的临时数据:选择库区后,传给库位选择器
|
||||
|
||||
/** 业务 Select 选中回调:自动填充 bizId、bizCode、bizName */
|
||||
const handleBizSelect = (item: any) => {
|
||||
const handleBizSelect = async (item: any) => {
|
||||
if (!item) {
|
||||
formData.value.bizId = undefined
|
||||
formData.value.bizCode = undefined
|
||||
formData.value.bizName = undefined
|
||||
formData.value.content = undefined
|
||||
return
|
||||
}
|
||||
formData.value.bizId = item.id
|
||||
formData.value.bizCode = item.code || item.username
|
||||
formData.value.bizName = item.name || item.nickname
|
||||
|
||||
// 自动生成条码内容
|
||||
if (formData.value.bizType && formData.value.bizCode) {
|
||||
try {
|
||||
formData.value.content = await WmBarcodeApi.generateBarcodeContent(
|
||||
formData.value.bizType,
|
||||
formData.value.bizCode
|
||||
)
|
||||
} catch (error) {
|
||||
console.error('生成条码内容失败:', error)
|
||||
formData.value.content = undefined
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/** 库区仓库选择回调:清空库区 */
|
||||
|
|
@ -256,6 +271,7 @@ const handleLocationWarehouseChange = () => {
|
|||
formData.value.bizId = undefined
|
||||
formData.value.bizCode = undefined
|
||||
formData.value.bizName = undefined
|
||||
formData.value.content = undefined
|
||||
}
|
||||
|
||||
/** 库位仓库选择回调:清空库区和库位 */
|
||||
|
|
@ -264,6 +280,7 @@ const handleAreaWarehouseChange = () => {
|
|||
formData.value.bizId = undefined
|
||||
formData.value.bizCode = undefined
|
||||
formData.value.bizName = undefined
|
||||
formData.value.content = undefined
|
||||
}
|
||||
|
||||
/** 库位库区选择回调:清空库位 */
|
||||
|
|
@ -271,6 +288,7 @@ const handleAreaLocationChange = () => {
|
|||
formData.value.bizId = undefined
|
||||
formData.value.bizCode = undefined
|
||||
formData.value.bizName = undefined
|
||||
formData.value.content = undefined
|
||||
}
|
||||
|
||||
/** bizType 切换时,清空业务字段 */
|
||||
|
|
@ -280,6 +298,7 @@ watch(
|
|||
formData.value.bizId = undefined
|
||||
formData.value.bizCode = undefined
|
||||
formData.value.bizName = undefined
|
||||
formData.value.content = undefined
|
||||
// 清空仓库层级的临时数据
|
||||
locationWarehouseId.value = undefined
|
||||
areaWarehouseId.value = undefined
|
||||
|
|
@ -334,6 +353,7 @@ const resetForm = () => {
|
|||
bizId: undefined,
|
||||
bizCode: undefined,
|
||||
bizName: undefined,
|
||||
content: undefined,
|
||||
status: CommonStatusEnum.ENABLE,
|
||||
remark: ''
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue