fix: 解耦 Webhook 身份证与库存序列号,恢复批号入库纯净
- 前端:新增临时字段 form.track_id 存 16位身份证,Batch 时 form.serial_number 清空 - 前端:submitForm 不再把身份证补进 payload.serial_number,改为透传 payload.track_id - 后端:StockSemi 仅存 serial_number(Batch 为空),notify_track 优先用 track_id
This commit is contained in:
@ -252,11 +252,13 @@ class SemiInboundService:
|
|||||||
)
|
)
|
||||||
|
|
||||||
# 真实扫码入库成功,异步通知 Track 系统(Webhook)
|
# 真实扫码入库成功,异步通知 Track 系统(Webhook)
|
||||||
|
# ★ 优先用前端透传的 track_id(16位身份证)通知 Track,绝不写入库存序列号(保证批号入库纯净)
|
||||||
|
webhook_sn = (data.get('track_id') or '').strip() or (new_stock.serial_number or '')
|
||||||
notify_track({
|
notify_track({
|
||||||
'event': 'inbound.created',
|
'event': 'inbound.created',
|
||||||
'source_table': 'stock_semi',
|
'source_table': 'stock_semi',
|
||||||
'sku': material.spec_model or material.name,
|
'sku': material.spec_model or material.name,
|
||||||
'serial_number': new_stock.serial_number,
|
'serial_number': webhook_sn,
|
||||||
'quantity': float(new_stock.in_quantity or 0),
|
'quantity': float(new_stock.in_quantity or 0),
|
||||||
'operator': get_current_operator(),
|
'operator': get_current_operator(),
|
||||||
})
|
})
|
||||||
|
|||||||
@ -983,7 +983,7 @@ const defaultColumns = ['company_name', 'material_name', 'spec_model', 'unit', '
|
|||||||
const form = reactive({
|
const form = reactive({
|
||||||
id: undefined, base_id: undefined as number | undefined,
|
id: undefined, base_id: undefined as number | undefined,
|
||||||
company_name: '',
|
company_name: '',
|
||||||
material_name: '', spec_model: '', category: '', unit: '', material_type: '', sku: '', barcode: '', in_date: '', serial_number: '', batch_number: '', status: '在库', quality_status: '合格', in_quantity: 1, stock_quantity: 1, available_quantity: 1, print_copies: 1, warehouse_location: '', bom_code: '', bom_version: '', work_order_code: '',
|
material_name: '', spec_model: '', category: '', unit: '', material_type: '', sku: '', barcode: '', in_date: '', serial_number: '', batch_number: '', status: '在库', quality_status: '合格', in_quantity: 1, stock_quantity: 1, available_quantity: 1, print_copies: 1, warehouse_location: '', bom_code: '', bom_version: '', work_order_code: '', track_id: '',
|
||||||
raw_material_cost: undefined as number | undefined,
|
raw_material_cost: undefined as number | undefined,
|
||||||
unit_total_cost: undefined as number | undefined,
|
unit_total_cost: undefined as number | undefined,
|
||||||
total_price: undefined as number | undefined,
|
total_price: undefined as number | undefined,
|
||||||
@ -1499,15 +1499,14 @@ const handleScannerConfirm = (result: string) => {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 扫码获取的 Track 16 位身份证:SN 模式展示、Batch 模式随提交载荷供 Webhook 通知
|
// 扫码获取的 Track 16 位身份证:SN 模式展示、Batch 模式随提交载荷供 Webhook 通知
|
||||||
let scannedTrackSerial = ''
|
|
||||||
|
|
||||||
// Track 扫码入库:扫码面板扫到身份证后,自动带出物料基础信息 + 序列号
|
// Track 扫码入库:扫码面板扫到身份证后,自动带出物料基础信息 + 序列号
|
||||||
const handleTrackScanFill = async (data: { track: any; material: any }) => {
|
const handleTrackScanFill = async (data: { track: any; material: any }) => {
|
||||||
const { track, material } = data
|
const { track, material } = data
|
||||||
// 选择物料:触发原生联动(基础信息/历史库位/历史模式与批号自增)
|
// 选择物料:触发原生联动(基础信息/历史库位/历史模式与批号自增)
|
||||||
await onMaterialSelected(material)
|
await onMaterialSelected(material)
|
||||||
|
|
||||||
scannedTrackSerial = track.serial_number || ''
|
// ★ 16 位身份证存到临时字段 track_id(不进数据库,仅供 Webhook 通知 Track)
|
||||||
|
form.track_id = track.serial_number || ''
|
||||||
if (track.external_serial) {
|
if (track.external_serial) {
|
||||||
// 序列号管理产品:切 SN,填真实外部业务序列号
|
// 序列号管理产品:切 SN,填真实外部业务序列号
|
||||||
entryMode.value = 'serial'
|
entryMode.value = 'serial'
|
||||||
@ -1520,7 +1519,7 @@ const handleTrackScanFill = async (data: { track: any; material: any }) => {
|
|||||||
modeLocked.value = false
|
modeLocked.value = false
|
||||||
// 批号兜底:无历史/历史为 SN 时确保有默认批号,避免阻断校验
|
// 批号兜底:无历史/历史为 SN 时确保有默认批号,避免阻断校验
|
||||||
if (!form.batch_number) form.batch_number = '000001'
|
if (!form.batch_number) form.batch_number = '000001'
|
||||||
// Batch 界面序列号留空(不显示身份证),身份证随提交载荷供 Webhook 精准通知 Track
|
// ★ 批号入库:序列号必须清空,绝不写入身份证,确保批号自增逻辑不受干扰
|
||||||
form.serial_number = ''
|
form.serial_number = ''
|
||||||
}
|
}
|
||||||
ElMessage.success('扫码入库信息已自动填充,请核对后补充库位/数量等')
|
ElMessage.success('扫码入库信息已自动填充,请核对后补充库位/数量等')
|
||||||
@ -1560,10 +1559,8 @@ const submitForm = async () => {
|
|||||||
production_end_time: form.production_time_range?.[1] || null
|
production_end_time: form.production_time_range?.[1] || null
|
||||||
}
|
}
|
||||||
delete payload.production_time_range
|
delete payload.production_time_range
|
||||||
// Batch 模式下序列号界面为空,补回 Track 身份证供 Webhook 精准通知 Track
|
// ★ 透传 Track 身份证到后端(仅 Webhook 通知 Track 用,绝不写入库存序列号,保证批号入库纯净)
|
||||||
if (entryMode.value === 'batch' && scannedTrackSerial && !payload.serial_number) {
|
if (form.track_id) payload.track_id = form.track_id
|
||||||
payload.serial_number = scannedTrackSerial
|
|
||||||
}
|
|
||||||
// Update 模式:无成本权限则剥离成本字段,防止库管修改已入库的成本数据
|
// Update 模式:无成本权限则剥离成本字段,防止库管修改已入库的成本数据
|
||||||
// Create 模式:保留成本字段,确保 BOM 自动计算的值能正确提交
|
// Create 模式:保留成本字段,确保 BOM 自动计算的值能正确提交
|
||||||
if (dialogStatus.value === 'update') {
|
if (dialogStatus.value === 'update') {
|
||||||
|
|||||||
Reference in New Issue
Block a user