打印编码需求变更

This commit is contained in:
zc
2026-06-15 15:34:21 +08:00
parent 225a7a1932
commit 852b446901
8 changed files with 87 additions and 106 deletions

View File

@@ -8,7 +8,6 @@ export interface WorkOrderResp {
orderNo: string
materialName: string
encoding: string
encodingPrint: string
unitWeight: string
materialSpec: string
photoUrl: string
@@ -43,7 +42,6 @@ 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

@@ -12,9 +12,14 @@
<a-input v-model="formData.materialName" placeholder="未获取到物料名称" :disabled="true" />
</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>
</div>
<div class="form-grid-item">
<a-form-item label="打印编码(国产替代)">
<a-input v-model="formData.encodingPrint" placeholder="未获取到打印编码" :disabled="true" />
<a-input v-model="formData.encodingPrint" allow-clear placeholder="请输入打印编码" />
</a-form-item>
</div>
<div class="form-grid-item">
@@ -298,7 +303,7 @@ const generateDetailLabel = async () => {
for (const workOrderInfo of formData.workOrderInfos) {
// 计算二维码数据
const orderNo = formData.orderNo + workOrderInfo.id;
const qrCodeData = `10#${formData.encodingPrint}$11#9DP$12#${formData.batch}$17#${workOrderInfo.quantity}$20#${formattedDate2}$31#${orderNo}$DY`
const qrCodeData = `10#${formData.encodingPrint || formData.encoding}$11#9DP$12#${formData.batch}$17#${workOrderInfo.quantity}$20#${formattedDate2}$31#${orderNo}$DY`;
// 生成二维码图片
const qrCodeImage = await generateQRCode(qrCodeData)
@@ -306,7 +311,7 @@ const generateDetailLabel = async () => {
// 添加标签数据
labelDataList.push({
partName: formData.materialName || '',
partNumber: formData.encodingPrint || '',
partNumber: formData.encodingPrint || formData.encoding || '',
totalCalculatedWeight: workOrderInfo.calculatedWeight || '',
totalWeight: workOrderInfo.weight || '',
productionDate: formattedDate,
@@ -354,7 +359,7 @@ const generateOverallLabel = async () => {
String(now.getDate()).padStart(2, '0')
// 计算二维码数据
const qrCodeData = `10#${formData.encodingPrint}$11#9DP$12#${formData.batch}$17#${formData.totalCount}$20#${formattedDate2}$31#${formData.orderNo}$DY`
const qrCodeData = `10#${formData.encodingPrint || formData.encoding}$11#9DP$12#${formData.batch}$17#${formData.totalCount}$20#${formattedDate2}$31#${formData.orderNo}$DY`
// 生成二维码图片
const qrCodeImage = await generateQRCode(qrCodeData)
@@ -362,7 +367,7 @@ const generateOverallLabel = async () => {
// 直接从 formData 中获取数据
Object.assign(labelData, {
partName: formData.materialName || '',
partNumber: formData.encodingPrint || '',
partNumber: formData.encodingPrint || formData.encoding || '',
totalCalculatedWeight: formData.totalCalculatedWeight || '',
totalWeight: formData.totalWeight || '',
productionDate: formattedDate,
@@ -391,7 +396,6 @@ 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

View File

@@ -1,22 +1,22 @@
<template>
<div class="gi_table_page">
<GiTable
title="整箱领取记录管理"
row-key="id"
:data="dataList"
:columns="columns"
:loading="loading"
:scroll="{ x: '100%', y: '100%', minWidth: 1000 }"
:pagination="pagination"
:disabled-tools="['size']"
:disabled-column-keys="['name']"
@refresh="search"
title="整箱领取记录管理"
row-key="id"
:data="dataList"
:columns="columns"
:loading="loading"
:scroll="{ x: '100%', y: '100%', minWidth: 1000 }"
:pagination="pagination"
:disabled-tools="['size']"
:disabled-column-keys="['name']"
@refresh="search"
>
<template #toolbar-left>
<a-input-search v-model="queryForm.orderNo" placeholder="请输入任务工单号" allow-clear @search="search" />
<a-input-search v-model="queryForm.materialCode" placeholder="请输入物料编码" allow-clear @search="search" />
<a-input-search v-model="queryForm.materialName" placeholder="请输入物料名称" allow-clear @search="search" />
<a-input-search v-model="queryForm.batch" placeholder="请输入批次号" allow-clear @search="search" />
<a-input-search v-model="queryForm.orderNo" placeholder="请输入任务工单号" allow-clear @search="search" />
<a-input-search v-model="queryForm.materialCode" placeholder="请输入物料编码" allow-clear @search="search" />
<a-input-search v-model="queryForm.materialName" placeholder="请输入物料名称" allow-clear @search="search" />
<a-input-search v-model="queryForm.batch" placeholder="请输入批次号" allow-clear @search="search" />
<a-range-picker
v-model="queryForm.createTime"
:show-time="true"
@@ -51,26 +51,26 @@
<template #action="{ record }">
<a-space>
<a-link
@click="onAddDetail(record.id)"
@click="onAddDetail(record.id)"
>
新增
</a-link>
<a-link
@click="onViewDetail(record)"
@click="onViewDetail(record)"
>
详情
</a-link>
<a-link
@click="onPrint(record)"
@click="onPrint(record)"
>
打印
</a-link>
<a-link
v-permission="['fullWorkOrder:fullWorkOrder:delete']"
status="danger"
:disabled="record.disabled"
:title="record.disabled ? '不可删除' : '删除'"
@click="onDelete(record)"
v-permission="['fullWorkOrder:fullWorkOrder:delete']"
status="danger"
:disabled="record.disabled"
:title="record.disabled ? '不可删除' : '删除'"
@click="onDelete(record)"
>
删除
</a-link>
@@ -121,7 +121,6 @@ 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' },
@@ -192,26 +191,26 @@ const onPrint = async (record: FullWorkOrderResp) => {
try {
// 格式化生产日期为 yyyyMMddHHmm 格式
const now = new Date()
const formattedDate = now.getFullYear().toString() +
String(now.getMonth() + 1).padStart(2, '0') +
String(now.getDate()).padStart(2, '0') +
String(now.getHours()).padStart(2, '0') +
String(now.getMinutes()).padStart(2, '0')
const formattedDate = now.getFullYear().toString() +
String(now.getMonth() + 1).padStart(2, '0') +
String(now.getDate()).padStart(2, '0') +
String(now.getHours()).padStart(2, '0') +
String(now.getMinutes()).padStart(2, '0')
const formattedDate2 = now.getFullYear().toString() +
String(now.getMonth() + 1).padStart(2, '0') +
String(now.getDate()).padStart(2, '0')
// 计算二维码数据
const qrCodeData = `10#${record.encodingPrint || record.materialCode || ''}$11#9DP$12#${record.batch || ''}$17#${record.count || ''}$20#${formattedDate2}$31#${record.orderNo || ''}$DY`
const qrCodeData = `10#${record.materialCode || ''}$11#9DP$12#${record.batch || ''}$17#${record.count || ''}$20#${formattedDate2}$31#${record.orderNo || ''}$DY`
// 生成二维码图片
const qrCodeImage = await generateQRCode(qrCodeData)
// 直接生成打印标签
const printWindow = window.open('', '_blank');
if (!printWindow) return;
// 构建打印内容
const printContent = `
<!DOCTYPE html>
@@ -262,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.encodingPrint || record.materialCode || ''}</div>
<div class="label-value">${record.materialCode || ''}</div>
</div>
</td>
<td class="label-cell">
@@ -306,10 +305,10 @@ const onPrint = async (record: FullWorkOrderResp) => {
</body>
</html>
`;
printWindow.document.write(printContent);
printWindow.document.close();
// 等待页面加载完成后打印
printWindow.onload = function() {
setTimeout(() => {

View File

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

View File

@@ -20,7 +20,6 @@
<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>
@@ -120,7 +119,6 @@ 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' },

View File

@@ -10,8 +10,8 @@
</a-form-item>
</div>
<div class="form-grid-item">
<a-form-item label="打印编码(国产替代)">
<a-input v-model="formData.encodingPrint" placeholder="未获取到打印编码" :disabled="true" />
<a-form-item label="物料编码">
<a-input v-model="formData.encoding" placeholder="未获取到物料编码" :disabled="true" />
</a-form-item>
</div>
<div class="form-grid-item">
@@ -201,7 +201,6 @@ const props = withDefaults(defineProps<LabelPrintProps>(), {
const formData = reactive({
workerOrderId: '',
encoding: '',
encodingPrint: '',
materialName: '',
orderNo: '',
totalCalculatedWeight: '',
@@ -256,7 +255,6 @@ 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
@@ -321,14 +319,14 @@ const generateDetailLabel = async () => {
for (const workOrderInfo of formData.workOrderInfos) {
const orderNo = formData.orderNo + workOrderInfo.id;
const qrCodeData = `10#${formData.encodingPrint}$11#9DP$12#${formData.batch}$17#${workOrderInfo.quantity}$20#${formattedDate2}$31#${orderNo}$DY`
const qrCodeData = `10#${formData.encoding}$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.encodingPrint || '',
partNumber: formData.encoding || '',
totalCalculatedWeight: workOrderInfo.calculatedWeight || '',
totalWeight: workOrderInfo.weight || '',
productionDate: formattedDate,
@@ -372,13 +370,13 @@ const generateOverallLabel = async () => {
String(now.getMonth() + 1).padStart(2, '0') +
String(now.getDate()).padStart(2, '0')
const qrCodeData = `10#${formData.encodingPrint}$11#9DP$12#${formData.batch}$17#${formData.totalCount}$20#${formattedDate2}$31#${formData.orderNo}$DY`
const qrCodeData = `10#${formData.encoding}$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.encodingPrint || '',
partNumber: formData.encoding || '',
totalCalculatedWeight: formData.totalCalculatedWeight || '',
totalWeight: formData.totalWeight || '',
productionDate: formattedDate,

View File

@@ -27,7 +27,7 @@
<!-- 左侧表单 -->
<div class="left-section">
<a-image v-if="formData.photoUrl" :src="formData.photoUrl" width="240"/>
<!-- <img v-else :src="formData.photoUrl" class="sample-image square-image" alt="样图">-->
<!-- <img v-else :src="formData.photoUrl" class="sample-image square-image" alt="样图">-->
<a-form :model="formData" layout="vertical">
<div class="form-row">
@@ -83,9 +83,9 @@
<!-- 图片展示 -->
<div class="image-placeholder square-image">
<img
:src="imgData.imgUrl"
alt="图片展示"
style="width: 100%; height: 100%; object-fit: cover; border-radius: 4px;"
:src="imgData.imgUrl"
alt="图片展示"
style="width: 100%; height: 100%; object-fit: cover; border-radius: 4px;"
/>
</div>
</div>
@@ -176,9 +176,9 @@
<!-- 图片展示 -->
<div class="image-placeholder square-image">
<img
:src="weighingImgData.imgUrl"
alt="称重图片"
style="width: 100%; height: 100%; object-fit: cover; border-radius: 4px;"
:src="weighingImgData.imgUrl"
alt="称重图片"
style="width: 100%; height: 100%; object-fit: cover; border-radius: 4px;"
/>
<!-- 错误状态 -->
<div v-if="weighingPageStatus === 'error'" class="video-overlay error">
@@ -225,9 +225,9 @@
<!-- 完成并打印页面 -->
<div v-else-if="activeStep === 3" class="step-content">
<LabelPrint
ref="labelPrintRef"
:worker-order-id="workOrderId"
@previous="handlePrevious2"
ref="labelPrintRef"
:worker-order-id="workOrderId"
@previous="handlePrevious2"
/>
</div>
@@ -295,7 +295,6 @@ const formData = reactive({
inputMaterialCode2: '', // 输入的手动物料编码
id: '', // 物料ID
encoding: '', // 物料编码
encodingPrint: '', // 打印编码(国产替代)
materialName: '', // 物料名称
materialSpec: '', // 物料直径
batch: '', // 批次
@@ -451,7 +450,7 @@ const enterStep2 = () => {
}
})
}, 30 * 60 * 1000) // 30分钟
// 启动电子称连接线程并建立WebSocket连接
weighAHStart().catch(error => {
Message.error('与电子称的连接建立失败')
@@ -470,7 +469,7 @@ const leaveWeighingPage = () => {
clearTimeout(weighingTimeoutTimer)
weighingTimeoutTimer = null
}
// 停用电子称并关闭WebSocket连接
weighAHStop().catch(error => {
console.error('停用电子称失败:', error)
@@ -545,7 +544,6 @@ const workOrderResp = ref<WorkOrderResp>({
orderNo: '',
materialName: '',
encoding: '',
encodingPrint: '',
unitWeight: '',
materialSpec: '',
photoUrl: '',
@@ -563,8 +561,8 @@ const workOrderResp = ref<WorkOrderResp>({
// 称重登记页面数据
const inputQuantity = ref()
// todo
const calculateNumber = ref()
// todo
const ahDeviceWeight = ref('')
const calculatedWeight = ref('')
const weighingCount = ref(1)
@@ -608,7 +606,6 @@ const originalHandleMaterialCodeChange = async () => {
// 无论是否有输入,先重置所有物料相关字段,确保新数据能完全覆盖旧数据
formData.id = ''
formData.encoding = ''
formData.encodingPrint = ''
formData.materialName = ''
formData.materialSpec = ''
formData.unitWeight = 0
@@ -647,13 +644,13 @@ const handleKeyDown = (event: KeyboardEvent) => {
isScanning = false
// 不阻止默认行为,让表单可以正常提交
}
// 检查是否是新的扫码开始
// 检查是否是新的扫码开始
// 当时间间隔大于300ms且不是修饰键且不是功能键时认为是新的扫码开始
else if (timeDiff > 300 && !event.ctrlKey && !event.altKey && !event.metaKey) {
// 清空输入框,准备接收新的扫码数据
formData.inputMaterialCode = ''
// 标记为开始扫描
isScanning = true
// 清空输入框,准备接收新的扫码数据
formData.inputMaterialCode = ''
// 标记为开始扫描
isScanning = true
// }
}
@@ -667,22 +664,21 @@ const handleMaterialCodeChange = debounce(originalHandleMaterialCodeChange, 500)
// 扫码核验获取物料信息
const fetchMaterialData = async (code: string) => {
const res = await getMaterialDetail(code);
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 || ''
formData.materialProcess = res.data?.materialProcess || ''
formData.unitWeight = res.data?.unitWeight || 0
formData.photoUrl = res.data?.photoUrl || ''
formData.batch = res.data?.batch || ''
formData.weightRange = (res.data?.downFloatRatio ?? '-') + '% ~ ' + (res.data?.upFloatRatio ?? '-') + '%'
}
if(res.data && res.data.id) {
await brightness(res.data.id);
}
if (res.code === '0') {
// 更新表单数据
formData.id = res.data?.id || ''
formData.encoding = res.data?.encoding || ''
formData.materialName = res.data?.materialName || ''
formData.materialSpec = res.data?.materialSpec || ''
formData.materialProcess = res.data?.materialProcess || ''
formData.unitWeight = res.data?.unitWeight || 0
formData.photoUrl = res.data?.photoUrl || ''
formData.batch = res.data?.batch || ''
formData.weightRange = (res.data?.downFloatRatio ?? '-') + '% ~ ' + (res.data?.upFloatRatio ?? '-') + '%'
}
if(res.data && res.data.id) {
await brightness(res.data.id);
}
}
@@ -690,7 +686,6 @@ const handleMaterialCodeChange2 = async (code: string) => {
if (!code || code?.trim()=== '') {
formData.id = '';
formData.encoding = '';
formData.encodingPrint = '';
formData.materialName = '';
formData.materialSpec = '';
formData.batch = '';
@@ -705,7 +700,6 @@ 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 || ''
@@ -730,14 +724,13 @@ const handleNext = async () => {
// 准备工作订单数据
const workOrderData = {
materialId: formData.id,
encodingPrint: formData.encodingPrint,
workOrderInfos: weighingList.value,
}
// 调用后端接口
const res = await addWorkOrder(workOrderData)
console.log('工单创建响应:', res)
if (res.code === '0') {
Notification.success({
title: '操作成功',
@@ -886,7 +879,6 @@ 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,
@@ -1000,7 +992,7 @@ const closeWebSocket = () => {
// 播放音频文件
const playAudio = (filename: string) => {
console.log(filename)
console.log(filename)
try {
// 创建音频对象并播放
const audio = new Audio(`/src/assets/wav/${filename}.wav`)

View File

@@ -174,7 +174,6 @@ const columns = ref<TableInstanceColumns[]>(processColumns([
{ 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'},