feat(mes): 添加条码内容生成接口及相关逻辑

新增条码内容生成接口,支持根据业务类型和编码生成条码内容。
同时更新相关服务和前端组件,确保条码内容的自动生成和验证逻辑。
pull/871/MERGE
YunaiV 2026-03-07 17:23:22 +08:00
parent b386c17933
commit 715135fbb1
3 changed files with 123 additions and 14 deletions

View File

@ -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 }
})
}
}

View File

@ -0,0 +1,81 @@
<!-- MES 工具选择器纯下拉前端过滤支持 namecode -->
<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>

View File

@ -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: ''
}