打印编码

This commit is contained in:
zc
2026-06-10 10:36:14 +08:00
parent 809c07264f
commit a173cf7044
12 changed files with 63 additions and 49 deletions

View File

@@ -7,6 +7,7 @@ export interface FullWorkOrderResp {
title: string
orderNo: string
materialCode: string
encodingPrint: string
materialName: string
batch: string
mark: string

View File

@@ -6,6 +6,7 @@ export interface MaterialInfoResp {
id: string
materialName: string
encoding: string
encodingPrint: string
unitWeight: string
materialSpec: string
photoUrl: string
@@ -22,6 +23,7 @@ export interface MaterialInfoResp {
export interface MaterialInfoQuery {
materialName: string | undefined
encoding: string | undefined
encodingPrint: string | undefined
batch: string | undefined
mark: string | undefined
sort: Array<string>

View File

@@ -5,6 +5,7 @@ const BASE_URL = '/weighManage/workOrder'
export interface WeighManageResp {
id: string
encoding: string
encodingPrint: string
materialName: string
materialSpec: string
unitWeight: number

View File

@@ -8,6 +8,7 @@ export interface WorkOrderResp {
orderNo: string
materialName: string
encoding: string
encodingPrint: string
unitWeight: string
materialSpec: string
photoUrl: string
@@ -42,6 +43,7 @@ export interface WorkOrderQuery {
materialName: string | undefined
batch: string | undefined
encoding: string | undefined
encodingPrint: string | undefined
userName: string | undefined
carNo: string | undefined
startDate: string | undefined

View File

@@ -13,8 +13,8 @@
</a-form-item>
</div>
<div class="form-grid-item">
<a-form-item label="物料编码">
<a-input v-model="formData.encoding" placeholder="未获取到物料编码" :disabled="true" />
<a-form-item label="打印编码(国产替代)">
<a-input v-model="formData.encodingPrint" placeholder="未获取到打印编码" :disabled="true" />
</a-form-item>
</div>
<div class="form-grid-item">
@@ -199,6 +199,7 @@ const route = useRoute()
const formData = reactive({
workerOrderId: '',
encoding: '',
encodingPrint: '',
materialName: '',
orderNo: '',
totalCalculatedWeight: '',
@@ -297,7 +298,7 @@ const generateDetailLabel = async () => {
for (const workOrderInfo of formData.workOrderInfos) {
// 计算二维码数据
const orderNo = formData.orderNo + workOrderInfo.id;
const qrCodeData = `10#${formData.encoding}$11#9DP$12#${formData.batch}$17#${workOrderInfo.quantity}$20#${formattedDate2}$31#${orderNo}$DY`
const qrCodeData = `10#${formData.encodingPrint}$11#9DP$12#${formData.batch}$17#${workOrderInfo.quantity}$20#${formattedDate2}$31#${orderNo}$DY`
// 生成二维码图片
const qrCodeImage = await generateQRCode(qrCodeData)
@@ -305,7 +306,7 @@ const generateDetailLabel = async () => {
// 添加标签数据
labelDataList.push({
partName: formData.materialName || '',
partNumber: formData.encoding || '',
partNumber: formData.encodingPrint || '',
totalCalculatedWeight: workOrderInfo.calculatedWeight || '',
totalWeight: workOrderInfo.weight || '',
productionDate: formattedDate,
@@ -353,7 +354,7 @@ const generateOverallLabel = async () => {
String(now.getDate()).padStart(2, '0')
// 计算二维码数据
const qrCodeData = `10#${formData.encoding}$11#9DP$12#${formData.batch}$17#${formData.totalCount}$20#${formattedDate2}$31#${formData.orderNo}$DY`
const qrCodeData = `10#${formData.encodingPrint}$11#9DP$12#${formData.batch}$17#${formData.totalCount}$20#${formattedDate2}$31#${formData.orderNo}$DY`
// 生成二维码图片
const qrCodeImage = await generateQRCode(qrCodeData)
@@ -361,7 +362,7 @@ const generateOverallLabel = async () => {
// 直接从 formData 中获取数据
Object.assign(labelData, {
partName: formData.materialName || '',
partNumber: formData.encoding || '',
partNumber: formData.encodingPrint || '',
totalCalculatedWeight: formData.totalCalculatedWeight || '',
totalWeight: formData.totalWeight || '',
productionDate: formattedDate,
@@ -390,6 +391,7 @@ onMounted(() => {
getWorkOrder(workerOrderId).then(res => {
if (res.code == '0') {
formData.encoding = res.data.encoding
formData.encodingPrint = res.data.encodingPrint
formData.materialName = res.data.materialName
formData.orderNo = res.data.orderNo
formData.batch = res.data.batch
@@ -501,7 +503,7 @@ const printLabel = async () => {
.label-row { display: flex; align-items: center; }
.label-field { font-size: 8pt; font-weight: bold; margin-right: 2mm; min-width: 25pt; }
.label-value { font-size: 8pt; font-weight: bold; flex: 1; }
.qr-code img { width: 20mm; height: 20mm; margin: 1mm 0; }
.qr-code img { width: 23mm; height: 23mm; margin: 1mm 0; }
.mark-number { font-size: 8pt; font-weight: bold; margin-top: 1mm; text-align: center; }
.serial-number { font-size: 8pt; font-weight: bold; margin-top: 1mm; }
</style>
@@ -641,9 +643,9 @@ defineOptions({ name: 'print' })
}
.qr-code img {
width: 100px;
height: 100px;
margin: 5px 0;
width: 115px;
height: 120px;
margin: 0 0;
}
.qr-code .loading {

View File

@@ -132,6 +132,7 @@ const weighingPageStatus = ref<'idle' | 'entering' | 'entered' | 'error'>('idle'
const [form, resetForm] = useResetReactive({
materialCode: '',
encodingPrint: '',
imgUrl: '',
materialName: '',
batch: '',
@@ -178,6 +179,7 @@ const originalHandleMaterialCodeChange = async () => {
form.materialName = ''
form.inputMaterialCode2 = ''
form.batch = ''
form.encodingPrint = ''
form.count = undefined
form.mark = undefined
@@ -205,6 +207,7 @@ const fetchMaterialData = async (code: string) => {
if (res.code === '0') {
// 更新表单数据
form.materialCode = res.data?.encoding || ''
form.encodingPrint = res.data?.encodingPrint || ''
form.materialName = res.data?.materialName || ''
form.batch = res.data?.batch || ''
}
@@ -213,6 +216,7 @@ const fetchMaterialData = async (code: string) => {
const handleMaterialCodeChange2 = async (code: string) => {
if (!code || code?.trim()=== '') {
form.materialCode = ''
form.encodingPrint = ''
form.materialName = ''
form.batch = ''
form.mark = undefined
@@ -227,6 +231,7 @@ const handleMaterialCodeChange2 = async (code: string) => {
if (res.code === '0') {
// 更新表单数据
form.materialCode = res.data?.encoding || ''
form.encodingPrint = res.data?.encodingPrint || ''
form.materialName = res.data?.materialName || ''
form.batch = res.data?.batch || ''
}

View File

@@ -121,6 +121,7 @@ const columns = ref<TableInstanceColumns[]>([
{ title: '任务工单号', dataIndex: 'orderNo', slotName: 'orderNo' },
{ title: '物料名称', dataIndex: 'materialName', slotName: 'materialName' },
{ title: '物料编码', dataIndex: 'materialCode', slotName: 'materialCode' },
{ title: '打印编码(国产替代)', dataIndex: 'encodingPrint', slotName: 'encodingPrint' ,width: 120},
{ title: '批次号', dataIndex: 'batch', slotName: 'batch' },
{ title: '数量', dataIndex: 'count', slotName: 'count' },
{ title: '标记号', dataIndex: 'mark', slotName: 'mark' },
@@ -202,7 +203,7 @@ const onPrint = async (record: FullWorkOrderResp) => {
String(now.getDate()).padStart(2, '0')
// 计算二维码数据
const qrCodeData = `10#${record.materialCode || ''}$11#9DP$12#${record.batch || ''}$17#${record.count || ''}$20#${formattedDate2}$31#${record.orderNo || ''}$DY`
const qrCodeData = `10#${record.encodingPrint || record.materialCode || ''}$11#9DP$12#${record.batch || ''}$17#${record.count || ''}$20#${formattedDate2}$31#${record.orderNo || ''}$DY`
// 生成二维码图片
const qrCodeImage = await generateQRCode(qrCodeData)
@@ -227,7 +228,7 @@ const onPrint = async (record: FullWorkOrderResp) => {
.label-row { display: flex; align-items: center; }
.label-field { font-size: 8pt; font-weight: bold; margin-right: 2mm; min-width: 25pt; }
.label-value { font-size: 8pt; font-weight: bold; flex: 1; }
.qr-code img { width: 20mm; height: 20mm; margin: 1mm 0; }
.qr-code img { width: 23mm; height: 23mm; margin: 1mm 0; }
.mark-number { font-size: 8pt; font-weight: bold; margin-top: 1mm; text-align: center; }
.serial-number { font-size: 8pt; font-weight: bold; margin-top: 1mm; }
</style>
@@ -260,7 +261,7 @@ const onPrint = async (record: FullWorkOrderResp) => {
<td class="label-cell">
<div class="label-row">
<div class="label-field">零件号</div>
<div class="label-value">${record.materialCode || ''}</div>
<div class="label-value">${record.encodingPrint || record.materialCode || ''}</div>
</div>
</td>
<td class="label-cell">

View File

@@ -59,6 +59,13 @@ const columns: ColumnItem[] = reactive([
span: 24,
required: true,
},
{
label: '打印编码(国产替代)',
field: 'encodingPrint',
type: 'input',
span: 24,
required: true,
},
{
label: '物料单位重量(g)',
field: 'unitWeight',

View File

@@ -20,6 +20,7 @@
<template #toolbar-left>
<a-input-search v-model="queryForm.materialName" placeholder="请输入物料名称" allow-clear @search="search" />
<a-input-search v-model="queryForm.encoding" placeholder="请输入物料编码" allow-clear @search="search" />
<a-input-search v-model="queryForm.encodingPrint" placeholder="请输入打印编码(国产替代)" allow-clear @search="search" style="width: 240px"/>
<a-input-search v-model="queryForm.batch" placeholder="请输入批次" allow-clear @search="search" />
<a-button @click="reset">
<template #icon><icon-refresh /></template>
@@ -59,9 +60,6 @@
:src="record.photoUrl"
/>
</template>
<!-- <template #lightLevel="{ record }">-->
<!-- <GiCellTag :value="record.lightLevel" :dict="light_level" />-->
<!-- </template>-->
<template #action="{ record }">
<a-space>
@@ -100,12 +98,6 @@ import {Message} from "@arco-design/web-vue";
defineOptions({ name: 'MaterialInfo' })
// const { light_level } = useDict('light_level')
interface MaterialInfoRespWithStatus extends MaterialInfoResp {
photoLoadError?: boolean;
}
const queryForm = reactive<MaterialInfoQuery>({
materialName: undefined,
encoding: undefined,
@@ -128,14 +120,15 @@ const {
const columns = ref<TableInstanceColumns[]>([
{ title: '物料名称', dataIndex: 'materialName', slotName: 'materialName' },
{ title: '物料编码', dataIndex: 'encoding', slotName: 'encoding' },
{ title: '打印编码(国产替代)', dataIndex: 'encodingPrint', slotName: 'encodingPrint' },
{ title: '物料照片', dataIndex: 'photoUrl', slotName: 'photoUrl', width: 120, align: 'center' },
{ title: '物料单位重量(g)', dataIndex: 'unitWeight', slotName: 'unitWeight' },
{ title: '物料品类', dataIndex: 'typeName' },
{ title: '批次', dataIndex: 'batch' },
{ title: '物料直径', dataIndex: 'materialSpec', slotName: 'materialSpec', show: false },
{ title: '物料颜色', dataIndex: 'color', slotName: 'color', show: false },
{ title: '物料流程', dataIndex: 'materialProcess', slotName: 'materialProcess' },
{ title: '灯光等级', dataIndex: 'lightLevel', slotName: 'lightLevel' },
{ title: '物料照片', dataIndex: 'photoUrl', slotName: 'photoUrl', width: 120, align: 'center' },
{ title: '物料流程', dataIndex: 'materialProcess', slotName: 'materialProcess', show: false },
{ title: '灯光等级', dataIndex: 'lightLevel', slotName: 'lightLevel', show: false },
{ title: '创建人', dataIndex: 'createUserString', slotName: 'createUser' },
{ title: '创建时间', dataIndex: 'createTime', slotName: 'createTime' },
{
@@ -177,17 +170,6 @@ const onExport = () => {
useDownload(() => exportMaterialInfo(queryForm))
}
// 【修改点】图片加载处理逻辑
const handleImgLoad = (record: MaterialInfoRespWithStatus) => {
record.photoLoadError = false
}
const handleImgError = (record: MaterialInfoRespWithStatus, e: Event) => {
// 标记为加载错误,触发模板渲染 "照片异常"
record.photoLoadError = true
console.warn(`物料照片加载失败: ${record.photoUrl}`)
}
const MaterialInfoAddModalRef = ref<InstanceType<typeof MaterialInfoAddModal>>()
const onAdd = () => {
MaterialInfoAddModalRef.value?.onAdd()

View File

@@ -10,8 +10,8 @@
</a-form-item>
</div>
<div class="form-grid-item">
<a-form-item label="物料编码">
<a-input v-model="formData.encoding" placeholder="未获取到物料编码" :disabled="true" />
<a-form-item label="打印编码(国产替代)">
<a-input v-model="formData.encodingPrint" placeholder="未获取到打印编码" :disabled="true" />
</a-form-item>
</div>
<div class="form-grid-item">
@@ -201,6 +201,7 @@ const props = withDefaults(defineProps<LabelPrintProps>(), {
const formData = reactive({
workerOrderId: '',
encoding: '',
encodingPrint: '',
materialName: '',
orderNo: '',
totalCalculatedWeight: '',
@@ -255,6 +256,7 @@ const fetchWorkOrderData = async (workerOrderId: string) => {
const res = await getWorkOrder(workerOrderId)
if (res.code == '0') {
formData.encoding = res.data.encoding
formData.encodingPrint = res.data.encodingPrint
formData.materialName = res.data.materialName
formData.orderNo = res.data.orderNo
formData.batch = res.data.batch
@@ -319,14 +321,14 @@ const generateDetailLabel = async () => {
for (const workOrderInfo of formData.workOrderInfos) {
const orderNo = formData.orderNo + workOrderInfo.id;
const qrCodeData = `10#${formData.encoding}$11#9DP$12#${formData.batch}$17#${workOrderInfo.quantity}$20#${formattedDate2}$31#${orderNo}$DY`
const qrCodeData = `10#${formData.encodingPrint}$11#9DP$12#${formData.batch}$17#${workOrderInfo.quantity}$20#${formattedDate2}$31#${orderNo}$DY`
const qrCodeImage = await generateQRCode(qrCodeData)
console.log("========", workOrderInfo.mark);
labelDataList.push({
partName: formData.materialName || '',
partNumber: formData.encoding || '',
partNumber: formData.encodingPrint || '',
totalCalculatedWeight: workOrderInfo.calculatedWeight || '',
totalWeight: workOrderInfo.weight || '',
productionDate: formattedDate,
@@ -370,13 +372,13 @@ const generateOverallLabel = async () => {
String(now.getMonth() + 1).padStart(2, '0') +
String(now.getDate()).padStart(2, '0')
const qrCodeData = `10#${formData.encoding}$11#9DP$12#${formData.batch}$17#${formData.totalCount}$20#${formattedDate2}$31#${formData.orderNo}$DY`
const qrCodeData = `10#${formData.encodingPrint}$11#9DP$12#${formData.batch}$17#${formData.totalCount}$20#${formattedDate2}$31#${formData.orderNo}$DY`
const qrCodeImage = await generateQRCode(qrCodeData)
Object.assign(labelData, {
partName: formData.materialName || '',
partNumber: formData.encoding || '',
partNumber: formData.encodingPrint || '',
totalCalculatedWeight: formData.totalCalculatedWeight || '',
totalWeight: formData.totalWeight || '',
productionDate: formattedDate,
@@ -486,7 +488,7 @@ const printLabel = async () => {
.label-row { display: flex; align-items: center; }
.label-field { font-size: 8pt; font-weight: bold; margin-right: 2mm; min-width: 25pt; }
.label-value { font-size: 8pt; font-weight: bold; flex: 1; }
.qr-code img { width: 20mm; height: 20mm; margin: 1mm 0; }
.qr-code img { width: 23mm; height: 23mm; margin: 1mm 0; }
.mark-number { font-size: 8pt; font-weight: bold; margin-top: 1mm; text-align: center; }
.serial-number { font-size: 8pt; font-weight: bold; margin-top: 1mm; }
</style>
@@ -647,9 +649,9 @@ defineOptions({ name: 'LabelPrint' })
}
.qr-code img {
width: 100px;
height: 100px;
margin: 5px 0;
width: 115px;
height: 120px;
margin: 0 0;
}
.loading {

View File

@@ -295,6 +295,7 @@ const formData = reactive({
inputMaterialCode2: '', // 输入的手动物料编码
id: '', // 物料ID
encoding: '', // 物料编码
encodingPrint: '', // 打印编码(国产替代)
materialName: '', // 物料名称
materialSpec: '', // 物料直径
batch: '', // 批次
@@ -544,6 +545,7 @@ const workOrderResp = ref<WorkOrderResp>({
orderNo: '',
materialName: '',
encoding: '',
encodingPrint: '',
unitWeight: '',
materialSpec: '',
photoUrl: '',
@@ -561,8 +563,8 @@ const workOrderResp = ref<WorkOrderResp>({
// 称重登记页面数据
const inputQuantity = ref()
const calculateNumber = ref()
// todo
const calculateNumber = ref()
const ahDeviceWeight = ref('')
const calculatedWeight = ref('')
const weighingCount = ref(1)
@@ -606,6 +608,7 @@ const originalHandleMaterialCodeChange = async () => {
// 无论是否有输入,先重置所有物料相关字段,确保新数据能完全覆盖旧数据
formData.id = ''
formData.encoding = ''
formData.encodingPrint = ''
formData.materialName = ''
formData.materialSpec = ''
formData.unitWeight = 0
@@ -667,6 +670,7 @@ const fetchMaterialData = async (code: string) => {
if (res.code === '0') {
// 更新表单数据
formData.id = res.data?.id || ''
formData.encodingPrint = res.data?.encodingPrint || ''
formData.encoding = res.data?.encoding || ''
formData.materialName = res.data?.materialName || ''
formData.materialSpec = res.data?.materialSpec || ''
@@ -686,6 +690,7 @@ const handleMaterialCodeChange2 = async (code: string) => {
if (!code || code?.trim()=== '') {
formData.id = '';
formData.encoding = '';
formData.encodingPrint = '';
formData.materialName = '';
formData.materialSpec = '';
formData.batch = '';
@@ -700,6 +705,7 @@ const handleMaterialCodeChange2 = async (code: string) => {
if (res.code === '0') {
// 更新表单数据
formData.id = res.data?.id || ''
formData.encodingPrint = res.data?.encodingPrint || ''
formData.encoding = res.data?.encoding || ''
formData.materialName = res.data?.materialName || ''
formData.materialSpec = res.data?.materialSpec || ''
@@ -724,6 +730,7 @@ const handleNext = async () => {
// 准备工作订单数据
const workOrderData = {
materialId: formData.id,
encodingPrint: formData.encodingPrint,
workOrderInfos: weighingList.value,
}
@@ -879,6 +886,7 @@ const handleConfirm = async () => {
key: (weighingList.value.length + 1).toString(),
weightTime: weighingCount.value,
materialId: formData.id,
encodingPrint: formData.encodingPrint,
quantity: inputQuantity.value,
weight: ahDeviceWeight.value,
mark: formData.mark,

View File

@@ -169,17 +169,18 @@ const processColumns = (columns: TableInstanceColumns[]): TableInstanceColumns[]
// 定义列配置,使用工具函数处理
const columns = ref<TableInstanceColumns[]>(processColumns([
{ title: '标题', dataIndex: 'title', width: 180 },
{ title: '创建人', dataIndex: 'createUserString' },
{ title: '人员卡号', dataIndex: 'cardNo' },
{ title: '任务工单号', dataIndex: 'orderNo' },
{ title: '批次', dataIndex: 'batch' },
{ title: '物料图片', dataIndex: 'photoUrl', slotName: 'photoUrl', minWidth: 180, ellipsis: true, tooltip: true },
{ title: '物料名称', dataIndex: 'materialName' },
{ title: '物料编码', dataIndex: 'encoding' },
{ title: '打印编码(国产替代)', dataIndex: 'encodingPrint',width: 180 },
{ title: '单位克重', dataIndex: 'unitWeight' ,slotName: 'unitWeight'},
{ title: '总数量', dataIndex: 'totalCount' },
{ title: '标准总重量', dataIndex: 'totalCalculatedWeight' ,slotName: 'totalCalculatedWeight'},
{ title: '实际总重量', dataIndex: 'totalWeight' ,slotName: 'totalWeight'},
{ title: '人员卡号', dataIndex: 'cardNo' },
{ title: '创建人', dataIndex: 'createUserString' },
{ title: '创建时间', dataIndex: 'createTime', width: 180 },
{
title: '操作',