fix: support multiple copies printing natively in backend print service
This commit is contained in:
@ -1252,6 +1252,14 @@ watch(() => [form.in_quantity, form.unit_price], () => {
|
|||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
|
// 联动优化:当入库数量变化时,自动同步打印份数(除非用户已手动修改过)
|
||||||
|
watch(() => form.in_quantity, (newQty) => {
|
||||||
|
if (dialogStatus.value === 'create' && newQty && newQty > 0) {
|
||||||
|
// 仅在创建模式下自动同步
|
||||||
|
form.print_copies = newQty
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
const fetchData = async () => {
|
const fetchData = async () => {
|
||||||
loading.value = true
|
loading.value = true
|
||||||
try {
|
try {
|
||||||
|
|||||||
@ -337,6 +337,11 @@
|
|||||||
<el-input-number v-model="form.in_quantity" :min="1" style="width:100%" />
|
<el-input-number v-model="form.in_quantity" :min="1" style="width:100%" />
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
</el-col>
|
</el-col>
|
||||||
|
<el-col :span="12" v-if="dialogStatus === 'create'">
|
||||||
|
<el-form-item label="打印份数" prop="print_copies">
|
||||||
|
<el-input-number v-model="form.print_copies" :min="1" :max="999" style="width:100%" />
|
||||||
|
</el-form-item>
|
||||||
|
</el-col>
|
||||||
</el-row>
|
</el-row>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@ -514,7 +519,12 @@
|
|||||||
<img v-if="previewUrl" :src="previewUrl" alt="Label Preview" style="width: 100%; border: 1px solid #ccc;"/>
|
<img v-if="previewUrl" :src="previewUrl" alt="Label Preview" style="width: 100%; border: 1px solid #ccc;"/>
|
||||||
<div v-else class="empty-preview">正在生成预览...</div>
|
<div v-else class="empty-preview">正在生成预览...</div>
|
||||||
</div>
|
</div>
|
||||||
<div style="margin-top: 20px; font-size: 14px; color: #666;"><p>打印机 IP: 192.168.9.205</p><p>尺寸: 40mm x 30mm</p></div>
|
<div style="margin-top: 20px; font-size: 14px; color: #666;"><p>打印机 IP: 192.168.9.205</p><p>尺寸: 40mm x 30mm</p>
|
||||||
|
<div style="margin-top: 15px; display: flex; align-items: center; justify-content: center; gap: 10px;">
|
||||||
|
<span style="font-weight: bold; color: #303133;">打印份数:</span>
|
||||||
|
<el-input-number v-model="printCopies" :min="1" :max="100" size="default" style="width: 120px;" />
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<template #footer>
|
<template #footer>
|
||||||
<div class="dialog-footer">
|
<div class="dialog-footer">
|
||||||
@ -668,6 +678,7 @@ const printVisible = ref(false)
|
|||||||
const printLoading = ref(false)
|
const printLoading = ref(false)
|
||||||
const printing = ref(false)
|
const printing = ref(false)
|
||||||
const previewUrl = ref('')
|
const previewUrl = ref('')
|
||||||
|
const printCopies = ref(1)
|
||||||
const currentPrintData = ref<any>({})
|
const currentPrintData = ref<any>({})
|
||||||
|
|
||||||
// 图片/拍照相关
|
// 图片/拍照相关
|
||||||
@ -804,7 +815,7 @@ const form = reactive({
|
|||||||
company_name: '', // [新增]
|
company_name: '', // [新增]
|
||||||
material_name: '', spec_model: '', material_type: '', category: '', unit: '',
|
material_name: '', spec_model: '', material_type: '', category: '', unit: '',
|
||||||
sku: '', barcode: '', serial_number: '', in_date: '',
|
sku: '', barcode: '', serial_number: '', in_date: '',
|
||||||
in_quantity: 1, stock_quantity: 1, available_quantity: 1,
|
in_quantity: 1, stock_quantity: 1, available_quantity: 1, print_copies: 1,
|
||||||
warehouse_location: '', status: '在库', quality_status: '合格',
|
warehouse_location: '', status: '在库', quality_status: '合格',
|
||||||
bom_code: '', bom_version: '', work_order_code: '', order_id: '',
|
bom_code: '', bom_version: '', work_order_code: '', order_id: '',
|
||||||
production_manager: '', production_time_range: [] as string[],
|
production_manager: '', production_time_range: [] as string[],
|
||||||
@ -1247,7 +1258,7 @@ const submitForm = async () => {
|
|||||||
const res: any = await createProductInbound(payload)
|
const res: any = await createProductInbound(payload)
|
||||||
ElMessage.success('入库成功')
|
ElMessage.success('入库成功')
|
||||||
const newItem = res.data
|
const newItem = res.data
|
||||||
if (newItem) { ElMessage.info('发送打印...'); try { await executePrint(newItem); ElMessage.success('指令已发送') } catch (e: any) { ElMessage.warning('打印失败') } }
|
if (newItem) { ElMessage.info('发送打印...'); try { await executePrint({ ...newItem, copies: form.print_copies }); ElMessage.success(`指令已发送 (x${form.print_copies})`) } catch (e: any) { ElMessage.warning('打印失败') } }
|
||||||
} else { await updateProductInbound(form.id!, payload); ElMessage.success('更新成功') }
|
} else { await updateProductInbound(form.id!, payload); ElMessage.success('更新成功') }
|
||||||
visible.value = false; fetchData()
|
visible.value = false; fetchData()
|
||||||
} catch(e:any) {
|
} catch(e:any) {
|
||||||
@ -1263,10 +1274,10 @@ const handlePrint = async (row: any) => {
|
|||||||
currentPrintData.value = { global_print_id: row.global_print_id, material_name: row.material_name, spec_model: row.spec_model, category: row.category, material_type: row.material_type, warehouse_loc: row.warehouse_loc, serial_number: row.serial_number, sku: row.sku }
|
currentPrintData.value = { global_print_id: row.global_print_id, material_name: row.material_name, spec_model: row.spec_model, category: row.category, material_type: row.material_type, warehouse_loc: row.warehouse_loc, serial_number: row.serial_number, sku: row.sku }
|
||||||
try { const res: any = await getLabelPreview(currentPrintData.value); previewUrl.value = res.data } catch (e) { ElMessage.error('预览失败') } finally { printLoading.value = false }
|
try { const res: any = await getLabelPreview(currentPrintData.value); previewUrl.value = res.data } catch (e) { ElMessage.error('预览失败') } finally { printLoading.value = false }
|
||||||
}
|
}
|
||||||
const confirmPrint = async () => { printing.value = true; try { await executePrint(currentPrintData.value); ElMessage.success('已发送'); printVisible.value = false } catch (e: any) { ElMessage.error('打印失败') } finally { printing.value = false } }
|
const confirmPrint = async () => { printing.value = true; try { await executePrint({ ...currentPrintData.value, copies: printCopies.value }); ElMessage.success(`已发送 (x${printCopies.value})`); printVisible.value = false } catch (e: any) { ElMessage.error('打印失败') } finally { printing.value = false } }
|
||||||
const resetForm = () => {
|
const resetForm = () => {
|
||||||
materialOptions.value = []; bomOptions.value = []; productPhotoList.value = []; qualityFileList.value = []; inspectionFileList.value = []; quality_url.value = ''; inspection_url.value = ''
|
materialOptions.value = []; bomOptions.value = []; productPhotoList.value = []; qualityFileList.value = []; inspectionFileList.value = []; quality_url.value = ''; inspection_url.value = ''
|
||||||
Object.assign(form, { id: undefined, base_id: undefined, material_name: '', spec_model: '', material_type: '', category: '', unit: '', sku: '', barcode: '', serial_number: '', in_date: '', in_quantity: 1, stock_quantity: 1, available_quantity: 1, warehouse_location: '', status: '在库', quality_status: '合格', bom_code: '', bom_version: '', work_order_code: '', order_id: '', production_manager: '', production_time_range: [], raw_material_cost: undefined, unit_total_cost: undefined, total_price: undefined, sale_price: undefined, quality_report_link: [], inspection_report_link: [], product_photo: [], detail_link: '' })
|
Object.assign(form, { id: undefined, base_id: undefined, material_name: '', spec_model: '', material_type: '', category: '', unit: '', sku: '', barcode: '', serial_number: '', in_date: '', in_quantity: 1, stock_quantity: 1, available_quantity: 1, print_copies: 1, warehouse_location: '', status: '在库', quality_status: '合格', bom_code: '', bom_version: '', work_order_code: '', order_id: '', production_manager: '', production_time_range: [], raw_material_cost: undefined, unit_total_cost: undefined, total_price: undefined, sale_price: undefined, quality_report_link: [], inspection_report_link: [], product_photo: [], detail_link: '' })
|
||||||
}
|
}
|
||||||
const getStatusType = (s:string) => ({'在库':'success','出库':'info','借库':'warning','损耗':'danger'}[s]||'warning')
|
const getStatusType = (s:string) => ({'在库':'success','出库':'info','借库':'warning','损耗':'danger'}[s]||'warning')
|
||||||
const getQualityType = (s:string) => ({'合格':'success','不合格':'danger','待检':'info'}[s]||'info')
|
const getQualityType = (s:string) => ({'合格':'success','不合格':'danger','待检':'info'}[s]||'info')
|
||||||
|
|||||||
@ -421,6 +421,12 @@
|
|||||||
</el-form-item>
|
</el-form-item>
|
||||||
</el-col>
|
</el-col>
|
||||||
|
|
||||||
|
<el-col :span="6" v-if="dialogStatus === 'create'">
|
||||||
|
<el-form-item label="打印份数" prop="print_copies">
|
||||||
|
<el-input-number v-model="form.print_copies" :min="1" :max="999" controls-position="right" style="width:100%"/>
|
||||||
|
</el-form-item>
|
||||||
|
</el-col>
|
||||||
|
|
||||||
<template v-if="dialogStatus === 'update'">
|
<template v-if="dialogStatus === 'update'">
|
||||||
<el-col :span="6"><el-form-item label="当前库存" prop="stock_quantity"><el-input-number v-model="form.stock_quantity" disabled style="width:100%" :controls="false"/></el-form-item></el-col>
|
<el-col :span="6"><el-form-item label="当前库存" prop="stock_quantity"><el-input-number v-model="form.stock_quantity" disabled style="width:100%" :controls="false"/></el-form-item></el-col>
|
||||||
<el-col :span="6"><el-form-item label="当前可用" prop="available_quantity"><el-input-number v-model="form.available_quantity" disabled style="width:100%" :controls="false"/></el-form-item></el-col>
|
<el-col :span="6"><el-form-item label="当前可用" prop="available_quantity"><el-input-number v-model="form.available_quantity" disabled style="width:100%" :controls="false"/></el-form-item></el-col>
|
||||||
@ -586,7 +592,12 @@
|
|||||||
<img v-if="previewUrl" :src="previewUrl" alt="Label Preview" style="width: 100%; border: 1px solid #ccc;"/>
|
<img v-if="previewUrl" :src="previewUrl" alt="Label Preview" style="width: 100%; border: 1px solid #ccc;"/>
|
||||||
<div v-else class="empty-preview">正在生成预览...</div>
|
<div v-else class="empty-preview">正在生成预览...</div>
|
||||||
</div>
|
</div>
|
||||||
<div style="margin-top: 20px; font-size: 14px; color: #666;"><p>打印机 IP: 192.168.9.205</p><p>尺寸: 40mm x 30mm</p></div>
|
<div style="margin-top: 20px; font-size: 14px; color: #666;"><p>打印机 IP: 192.168.9.205</p><p>尺寸: 40mm x 30mm</p>
|
||||||
|
<div style="margin-top: 15px; display: flex; align-items: center; justify-content: center; gap: 10px;">
|
||||||
|
<span style="font-weight: bold; color: #303133;">打印份数:</span>
|
||||||
|
<el-input-number v-model="printCopies" :min="1" :max="100" size="default" style="width: 120px;" />
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<template #footer>
|
<template #footer>
|
||||||
<div class="dialog-footer"><el-button @click="printVisible = false">取消</el-button><el-button type="primary" :loading="printing" @click="confirmPrint"><el-icon><Printer/></el-icon>确认打印</el-button></div>
|
<div class="dialog-footer"><el-button @click="printVisible = false">取消</el-button><el-button type="primary" :loading="printing" @click="confirmPrint"><el-icon><Printer/></el-icon>确认打印</el-button></div>
|
||||||
@ -737,6 +748,7 @@ const printVisible = ref(false)
|
|||||||
const printLoading = ref(false)
|
const printLoading = ref(false)
|
||||||
const printing = ref(false)
|
const printing = ref(false)
|
||||||
const previewUrl = ref('')
|
const previewUrl = ref('')
|
||||||
|
const printCopies = ref(1)
|
||||||
const currentPrintData = ref<any>({})
|
const currentPrintData = ref<any>({})
|
||||||
|
|
||||||
// 图片/拍照相关
|
// 图片/拍照相关
|
||||||
@ -881,7 +893,7 @@ watch(visibleColumnProps, (newVal) => {
|
|||||||
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, 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: '',
|
||||||
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,
|
||||||
@ -1370,7 +1382,7 @@ const submitForm = async () => {
|
|||||||
const newItem = res.data
|
const newItem = res.data
|
||||||
if (newItem) {
|
if (newItem) {
|
||||||
ElMessage.info('正在发送打印指令...')
|
ElMessage.info('正在发送打印指令...')
|
||||||
try { await executePrint(newItem); ElMessage.success('打印指令已发送') }
|
try { await executePrint({ ...newItem, copies: form.print_copies }); ElMessage.success(`打印指令已发送 (x${form.print_copies})`) }
|
||||||
catch (printErr: any) { ElMessage.warning('入库成功,但自动打印失败:' + (printErr.msg || '未知错误')) }
|
catch (printErr: any) { ElMessage.warning('入库成功,但自动打印失败:' + (printErr.msg || '未知错误')) }
|
||||||
}
|
}
|
||||||
} else { await updateSemiInbound(form.id!, payload); ElMessage.success('更新成功') }
|
} else { await updateSemiInbound(form.id!, payload); ElMessage.success('更新成功') }
|
||||||
@ -1388,13 +1400,13 @@ const handlePrint = async (row: any) => {
|
|||||||
currentPrintData.value = { global_print_id: row.global_print_id, material_name: row.material_name, spec_model: row.spec_model, category: row.category, material_type: row.material_type, warehouse_loc: row.warehouse_loc, serial_number: row.serial_number, batch_number: row.batch_number, sku: row.sku }
|
currentPrintData.value = { global_print_id: row.global_print_id, material_name: row.material_name, spec_model: row.spec_model, category: row.category, material_type: row.material_type, warehouse_loc: row.warehouse_loc, serial_number: row.serial_number, batch_number: row.batch_number, sku: row.sku }
|
||||||
try { const res: any = await getLabelPreview(currentPrintData.value); previewUrl.value = res.data } catch (e) { ElMessage.error('预览生成失败') } finally { printLoading.value = false }
|
try { const res: any = await getLabelPreview(currentPrintData.value); previewUrl.value = res.data } catch (e) { ElMessage.error('预览生成失败') } finally { printLoading.value = false }
|
||||||
}
|
}
|
||||||
const confirmPrint = async () => { printing.value = true; try { await executePrint(currentPrintData.value); ElMessage.success('指令已发送'); printVisible.value = false } catch (e: any) { ElMessage.error(e.msg || '打印失败') } finally { printing.value = false } }
|
const confirmPrint = async () => { printing.value = true; try { await executePrint({ ...currentPrintData.value, copies: printCopies.value }); ElMessage.success(`指令已发送 (x${printCopies.value})`); printVisible.value = false } catch (e: any) { ElMessage.error(e.msg || '打印失败') } finally { printing.value = false } }
|
||||||
const resetForm = () => {
|
const resetForm = () => {
|
||||||
materialOptions.value = []; bomOptions.value = []; arrivalFileList.value = []; reportFileList.value = []; quality_report_url.value = ''
|
materialOptions.value = []; bomOptions.value = []; arrivalFileList.value = []; reportFileList.value = []; quality_report_url.value = ''
|
||||||
Object.assign(form, {
|
Object.assign(form, {
|
||||||
id: undefined, base_id: undefined,
|
id: undefined, base_id: 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, 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: '',
|
||||||
raw_material_cost: undefined, unit_total_cost: undefined, total_price: undefined,
|
raw_material_cost: undefined, unit_total_cost: undefined, total_price: undefined,
|
||||||
production_manager: '', production_time_range: [], arrival_photo: [], quality_report_link: [], detail_link: '' })
|
production_manager: '', production_time_range: [], arrival_photo: [], quality_report_link: [], detail_link: '' })
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user