From bffd7a06664fe8dda5b8814bcbec02dc68a610dc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=A0=82=E7=B3=96?= Date: Tue, 25 Nov 2025 16:57:59 +0800 Subject: [PATCH] =?UTF-8?q?feat(hand-factory):=20=E6=96=B0=E5=A2=9E?= =?UTF-8?q?=E7=A7=BB=E5=BA=93=E5=92=8C=E6=9F=A5=E7=9C=8B=E9=92=A2=E5=8D=B7?= =?UTF-8?q?=E5=8A=9F=E8=83=BD=E5=B9=B6=E4=BC=98=E5=8C=96UI?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 新增移库操作流程,包括扫描钢卷和目标库区 - 添加查看存储钢卷功能,支持快速查看库区钢卷信息 - 优化material-picker组件,显示物料类型信息 - 更新版本号至1.3.13并调整API基础地址 - 改进UI样式,包括按钮布局和扫码界面 - 修复更新弹窗取消按钮文本问题 --- .../klp-material-picker.vue | 10 +- apps/hand-factory/config.js | 4 +- apps/hand-factory/manifest.json | 2 +- apps/hand-factory/pages.json | 14 + apps/hand-factory/pages/easycode/easycode.vue | 1037 ++++++++++------- apps/hand-factory/pages/easycode/editby.vue | 556 +++++++++ apps/hand-factory/pages/easycode/tranfer.vue | 45 + apps/hand-factory/utils/update.js | 4 +- apps/hand-factory/version.json | 2 +- 9 files changed, 1263 insertions(+), 411 deletions(-) create mode 100644 apps/hand-factory/pages/easycode/editby.vue create mode 100644 apps/hand-factory/pages/easycode/tranfer.vue diff --git a/apps/hand-factory/components/klp-material-picker/klp-material-picker.vue b/apps/hand-factory/components/klp-material-picker/klp-material-picker.vue index fbf4582..f9601f6 100644 --- a/apps/hand-factory/components/klp-material-picker/klp-material-picker.vue +++ b/apps/hand-factory/components/klp-material-picker/klp-material-picker.vue @@ -49,7 +49,7 @@ - {{ product.productName }}【{{ product.specification || '暂无规格' }}】 + {{ product.productName }}【{{ product.specification || '暂无规格' }}】({{ product.material }}) @@ -75,7 +75,7 @@ - {{ material.rawMaterialName }}【{{ material.specification || '暂无规格' }}】 + {{ material.rawMaterialName }}【{{ material.specification || '暂无规格' }}】({{ material.material }}) @@ -122,6 +122,10 @@ type: [String, Number], default: undefined }, + materialType: { + type: String, + default: undefined + }, disabled: { type: Boolean, default: false @@ -270,6 +274,7 @@ this.$emit('update:itemId', product.productId); this.$emit('update:itemType', 'product'); + this.$emit('update:materialType', '成品') this.selectedName = product.productName; uni.showToast({ title: `已选择产品:${product.productName}`, icon: 'success' }); this.closeProductPicker(); @@ -282,6 +287,7 @@ this.$emit('update:itemId', material.rawMaterialId); this.$emit('update:itemType', 'raw_material'); + this.$emit('update:materialType', '原料') this.selectedName = material.rawMaterialName; uni.showToast({ title: `已选择原材料:${material.rawMaterialName}`, icon: 'success' }); this.closeRawMaterialPicker(); diff --git a/apps/hand-factory/config.js b/apps/hand-factory/config.js index d9f1751..cc41aeb 100644 --- a/apps/hand-factory/config.js +++ b/apps/hand-factory/config.js @@ -1,7 +1,7 @@ // 应用全局配置 module.exports = { - baseUrl: 'http://192.168.31.116:8080', - // baseUrl: 'http://140.143.206.120:8080', + // baseUrl: 'http://192.168.31.116:8080', + baseUrl: 'http://140.143.206.120:8080', // baseUrl: 'http://localhost:8080', // 应用信息 appInfo: { diff --git a/apps/hand-factory/manifest.json b/apps/hand-factory/manifest.json index 5133b46..13a5c13 100644 --- a/apps/hand-factory/manifest.json +++ b/apps/hand-factory/manifest.json @@ -2,7 +2,7 @@ "name" : "科伦普", "appid" : "__UNI__E781B49", "description" : "", - "versionName" : "1.3.12", + "versionName" : "1.3.13", "versionCode" : 1, "transformPx" : false, "app-plus" : { diff --git a/apps/hand-factory/pages.json b/apps/hand-factory/pages.json index de46b11..109fb1a 100644 --- a/apps/hand-factory/pages.json +++ b/apps/hand-factory/pages.json @@ -55,6 +55,20 @@ { "navigationBarTitleText" : "扫码结果" } + }, + { + "path" : "pages/easycode/tranfer", + "style" : + { + "navigationBarTitleText" : "移库操作" + } + }, + { + "path" : "pages/easycode/editby", + "style" : + { + "navigationBarTitleText" : "查看钢卷" + } } // { // "path": "pages/register", diff --git a/apps/hand-factory/pages/easycode/easycode.vue b/apps/hand-factory/pages/easycode/easycode.vue index d7e3413..dc2996d 100644 --- a/apps/hand-factory/pages/easycode/easycode.vue +++ b/apps/hand-factory/pages/easycode/easycode.vue @@ -7,10 +7,7 @@ 分条操作 - @@ -24,10 +21,7 @@ 其他操作 - @@ -41,13 +35,14 @@ 快捷操作 - + + - + @@ -70,21 +65,40 @@ 当前库区 - {{ coilDetail.actualWarehouseName }} + {{ coilDetail.actualWarehouseName || '-' }} + + - 真实库区 - + 目标库区 + + + + + 📷 + + 扫描库区码 + 请扫描目标库区的二维码 + + + + + + 已选中: + {{ targetWarehouse.actualWarehouseName }} + + + - - + + @@ -109,11 +123,17 @@ } from '@/api/wms/code.js' import { getMaterialCoil, - updateMaterialCoilSimple + updateMaterialCoilSimple, + listMaterialCoil, + updateMaterialCoil } from '@/api/wms/coil.js' import { addPendingAction } from '@/api/wms/pendingAction.js' + // 导入获取库区详情的接口(需确保接口存在,若接口名不同请调整) + import { + getActualWarehouse + } from '@/api/wms/actualWarehouse.js' export default { data() { @@ -121,7 +141,9 @@ types: [], loading: false, coilDetail: {}, - form: {} + form: {}, + targetWarehouse: null, // 存储选中的目标库区信息 + bomDialogShow: false // BOM参数弹窗控制(原有功能补充) } }, computed: { @@ -148,413 +170,450 @@ }) }) }, - - // 扫码并创建待操作 - handleScan(actionType) { + + handleSee() { uni.scanCode({ - success: async (res) => { - console.log('=== 开始扫码流程 ==='); - console.log('扫码结果:', res.result); - console.log('操作类型:', actionType); - uni.showLoading({ - title: '处理中...' - }); - - try { - const qrcodeId = res.result; - // 1. 通过二维码ID获取二维码详情 - console.log('1. 获取二维码详情,ID:', qrcodeId); - const qrcodeRes = await getGenerateRecord(qrcodeId); - console.log('二维码响应:', qrcodeRes); - - if (qrcodeRes.code !== 200) { - throw new Error('未找到二维码记录'); - } - - // 2. 解析二维码的content,获取coil_id - const qrcodeRecord = qrcodeRes.data; - console.log('2. 二维码记录:', qrcodeRecord); - - // 检查二维码状态(0=失效,1=有效) - if (qrcodeRecord.status === 0) { - uni.hideLoading(); - uni.showModal({ - title: '提示', - content: '该二维码已失效,无法创建待操作任务', - showCancel: false - }); - return; - } - - const content = JSON.parse(qrcodeRecord.content); - console.log('解析后的内容:', content); - - // 优先使用current_coil_id(当前有效的钢卷ID),如果没有则使用coil_id(兼容旧数据) - let coilId = content.current_coil_id && content.current_coil_id !== 'null' ? content - .current_coil_id : null; - if (!coilId) { - coilId = content.coil_id && content.coil_id !== 'null' ? content.coil_id : null; - } - - console.log('提取钢卷ID - current_coil_id:', content.current_coil_id, 'coil_id:', content.coil_id, - '最终使用:', coilId); - - if (!coilId) { - throw new Error('二维码中未包含有效的钢卷ID'); - } - - // 3. 直接通过钢卷ID获取钢卷详情 - console.log('3. 获取钢卷详情,钢卷ID:', coilId); - const coilRes = await getMaterialCoil(coilId); - console.log('钢卷详情响应:', coilRes); - - if (coilRes.code !== 200) { - throw new Error(coilRes.msg || '查询钢卷信息失败'); - } - - if (!coilRes.data) { - throw new Error('未找到钢卷信息'); - } - - const coilData = coilRes.data; - console.log('4. 钢卷数据:', coilData); - - // 4. 创建待操作记录 - const pendingData = { - coilId: coilData.coilId, - currentCoilNo: coilData.currentCoilNo, - actionType: parseInt(actionType), - actionStatus: 0, // 待处理 - sourceType: 'scan', // 扫码来源 - scanTime: new Date().toISOString(), - scanDevice: this.getDeviceInfo(), - warehouseId: coilData.warehouseId, - priority: 0, // 默认普通优先级 - remark: `移动端扫码创建-${this.getActionTypeName(actionType)}` - }; - - console.log('5. 创建待操作记录,数据:', pendingData); - - const addRes = await addPendingAction(pendingData); - console.log('创建待操作响应:', addRes); - - if (addRes.code !== 200) { - throw new Error(addRes.msg || '创建待操作失败'); - } - - uni.hideLoading(); - console.log('=== 扫码流程完成 ==='); - uni.navigateTo({ - url: '/pages/scansuccess/scansuccess' - }) - // uni.showToast({ - // title: '创建成功', - // icon: 'success', - // duration: 2000 - // }); - - // // 延迟后返回或跳转 - // setTimeout(() => { - // // 可以跳转到待操作列表或返回上一页 - // uni.navigateBack(); - // }, 2000); - - } catch (err) { - console.error('=== 扫码处理失败 ==='); - console.error('错误信息:', err); - console.error('错误堆栈:', err.stack); - uni.hideLoading(); - uni.showToast({ - title: err.message || '处理失败', - icon: 'none', - duration: 3000 - }); - } - }, - fail: (err) => { - console.error('扫码失败:', err); - uni.showToast({ - title: '扫码失败,请重试', - icon: 'none' - }); - } - }); - }, - - handleShip() { - uni.scanCode({ - success: async (res) => { - console.log('=== 开始扫码流程 ==='); - console.log('扫码结果:', res.result); - // console.log('操作类型:', actionType); - uni.showLoading({ - title: '处理中...' - }); - - try { - const qrcodeId = res.result; - // 1. 通过二维码ID获取二维码详情 - console.log('1. 获取二维码详情,ID:', qrcodeId); - const qrcodeRes = await getGenerateRecord(qrcodeId); - console.log('二维码响应:', qrcodeRes); - - if (qrcodeRes.code !== 200) { - throw new Error('未找到二维码记录'); - } - - // 2. 解析二维码的content,获取coil_id - const qrcodeRecord = qrcodeRes.data; - console.log('2. 二维码记录:', qrcodeRecord); - - // 检查二维码状态(0=失效,1=有效) - if (qrcodeRecord.status === 0) { - uni.hideLoading(); - uni.showModal({ - title: '提示', - content: '该二维码已失效,无法创建待操作任务', - showCancel: false - }); - return; - } - - const content = JSON.parse(qrcodeRecord.content); - console.log('解析后的内容:', content); - - // 优先使用current_coil_id(当前有效的钢卷ID),如果没有则使用coil_id(兼容旧数据) - let coilId = content.current_coil_id && content.current_coil_id !== 'null' ? content - .current_coil_id : null; - if (!coilId) { - coilId = content.coil_id && content.coil_id !== 'null' ? content.coil_id : null; - } - - console.log('提取钢卷ID - current_coil_id:', content.current_coil_id, 'coil_id:', content.coil_id, - '最终使用:', coilId); - - if (!coilId) { - throw new Error('二维码中未包含有效的钢卷ID'); - } - - - // 3. 直接通过钢卷ID获取钢卷详情 - console.log('3. 获取钢卷详情,钢卷ID:', coilId); - const coilRes = await getMaterialCoil(coilId); - console.log('钢卷详情响应:', coilRes); - - if (coilRes.code !== 200) { - throw new Error(coilRes.msg || '查询钢卷信息失败'); - } - - if (!coilRes.data) { - throw new Error('未找到钢卷信息'); - } - - const coilData = coilRes.data; - - if (coilRes.data.status == 1) { + success(scanRes) { + // 查询真实库区在此处的钢卷 + listMaterialCoil({ actualWarehouseId: scanRes.result, dataType: 1 }).then(res => { + if (res.total == 0) { uni.showToast({ - title: '钢卷已经发货,无需再次发货' - }) - return; - } - - uni.showModal({ - cancelText: '取消', - confirmText: '确认', - title: '确定要将钢卷号为:' + coilRes.data.currentCoilNo + '发货吗?', - showCancel: true, - success: async () => { - try { - // 1. 更新钢卷状态为已发货 - await updateMaterialCoilSimple({ - ...coilRes.data, - status: 1, - }); - - // 2. 插入一条已完成的待操作记录 - await addPendingAction({ - coilId: coilRes.data.coilId, - currentCoilNo: coilRes.data.currentCoilNo, - actionType: 4, // 4=发货 - actionStatus: 2, // 2=已完成 - scanTime: new Date(), - scanDevice: this.getDeviceInfo(), - priority: 0, // 0=普通 - sourceType: 'scan', - warehouseId: coilRes.data.warehouseId, - processTime: new Date(), - completeTime: new Date() - }); - - uni.showToast({ - title: '发货成功', - icon: 'none' - }); - } catch (error) { - console.error('发货失败:', error); - uni.showToast({ - title: error.message || '发货失败', - icon: 'none' - }); - } - }, - fail() { - uni.showToast({ - title: '已取消发货', - icon: 'none' - }) - } - }); - uni.hideLoading(); - } catch (err) { - console.error('=== 扫码处理失败 ==='); - console.error('错误信息:', err); - console.error('错误堆栈:', err.stack); - uni.hideLoading(); - uni.showToast({ - title: err.message || '处理失败', - icon: 'none', - duration: 3000 - }); - } - }, - fail: (err) => { - console.error('扫码失败:', err); - uni.showToast({ - title: '扫码失败,请重试', - icon: 'none' - }); - } - }); - }, - - handleTranfer() { - uni.scanCode({ - success: async (res) => { - console.log('=== 开始扫码流程 ==='); - console.log('扫码结果:', res.result); - // console.log('操作类型:', actionType); - uni.showLoading({ - title: '处理中...' - }); - - try { - const qrcodeId = res.result; - // 1. 通过二维码ID获取二维码详情 - console.log('1. 获取二维码详情,ID:', qrcodeId); - const qrcodeRes = await getGenerateRecord(qrcodeId); - console.log('二维码响应:', qrcodeRes); - - if (qrcodeRes.code !== 200) { - throw new Error('未找到二维码记录'); - } - - // 2. 解析二维码的content,获取coil_id - const qrcodeRecord = qrcodeRes.data; - console.log('2. 二维码记录:', qrcodeRecord); - - // 检查二维码状态(0=失效,1=有效) - if (qrcodeRecord.status === 0) { - uni.hideLoading(); - uni.showModal({ - title: '提示', - content: '该二维码已失效,无法创建待操作任务', - showCancel: false + title: '该库区未发现钢卷', + icon: 'none' }); return; } - - const content = JSON.parse(qrcodeRecord.content); - console.log('解析后的内容:', content); - - // 优先使用current_coil_id(当前有效的钢卷ID),如果没有则使用coil_id(兼容旧数据) - let coilId = content.current_coil_id && content.current_coil_id !== 'null' ? content - .current_coil_id : null; - if (!coilId) { - coilId = content.coil_id && content.coil_id !== 'null' ? content.coil_id : null; + if (res.rows.length == 1) { + const coilId = res.rows[0].coilId; + uni.navigateTo({ + url: '/pages/easycode/editby?coilId=' + coilId + }) + } else { + uni.showToast({ + title: '数据异常', + icon: 'none' + }) } + }) + } + }) + }, - console.log('提取钢卷ID - current_coil_id:', content.current_coil_id, 'coil_id:', content.coil_id, - '最终使用:', coilId); + // 扫码并创建待操作(原有方法不变) + async handleScan(actionType) { + const content = await this.getQRCodeContent() - if (!coilId) { - throw new Error('二维码中未包含有效的钢卷ID'); + // 优先使用current_coil_id(当前有效的钢卷ID),如果没有则使用coil_id(兼容旧数据) + let coilId = content.current_coil_id && content.current_coil_id !== 'null' ? content + .current_coil_id : null; + if (!coilId) { + coilId = content.coil_id && content.coil_id !== 'null' ? content.coil_id : null; + } + + console.log('提取钢卷ID - current_coil_id:', content.current_coil_id, 'coil_id:', content.coil_id, + '最终使用:', coilId); + + if (!coilId) { + throw new Error('二维码中未包含有效的钢卷ID'); + } + + // 3. 直接通过钢卷ID获取钢卷详情 + console.log('3. 获取钢卷详情,钢卷ID:', coilId); + const coilRes = await getMaterialCoil(coilId); + console.log('钢卷详情响应:', coilRes); + + if (coilRes.code !== 200) { + throw new Error(coilRes.msg || '查询钢卷信息失败'); + } + + if (!coilRes.data) { + throw new Error('未找到钢卷信息'); + } + + const coilData = coilRes.data; + console.log('4. 钢卷数据:', coilData); + + // 4. 创建待操作记录 + const pendingData = { + coilId: coilData.coilId, + currentCoilNo: coilData.currentCoilNo, + actionType: parseInt(actionType), + actionStatus: 0, // 待处理 + sourceType: 'scan', // 扫码来源 + scanTime: new Date().toISOString(), + scanDevice: this.getDeviceInfo(), + warehouseId: coilData.warehouseId, + priority: 0, // 默认普通优先级 + remark: `移动端扫码创建-${this.getActionTypeName(actionType)}` + }; + + console.log('5. 创建待操作记录,数据:', pendingData); + + const addRes = await addPendingAction(pendingData); + console.log('创建待操作响应:', addRes); + + if (addRes.code !== 200) { + throw new Error(addRes.msg || '创建待操作失败'); + } + + uni.hideLoading(); + console.log('=== 扫码流程完成 ==='); + uni.navigateTo({ + url: '/pages/scansuccess/scansuccess' + }) + }, + + // 通用扫码获取二维码内容(原有方法不变) + async getQRCodeContent() { + return new Promise((resolve, reject) => { + uni.scanCode({ + success: async (res) => { + console.log('=== 开始扫码流程 ==='); + console.log('扫码结果:', res.result); + uni.showLoading({ + title: '处理中...' + }); + + try { + const qrcodeId = res.result; + // 1. 通过二维码ID获取二维码详情 + console.log('1. 获取二维码详情,ID:', qrcodeId); + const qrcodeRes = await getGenerateRecord(qrcodeId); + console.log('二维码响应:', qrcodeRes); + + if (qrcodeRes.code !== 200) { + throw new Error('未找到二维码记录'); + } + + // 2. 解析二维码的content,获取coil_id + const qrcodeRecord = qrcodeRes.data; + console.log('2. 二维码记录:', qrcodeRecord); + + // 检查二维码状态(0=失效,1=有效) + if (qrcodeRecord.status === 0) { + uni.hideLoading(); + uni.showModal({ + title: '提示', + content: '该二维码已失效,无法创建待操作任务', + showCancel: false + }); + return; + } + + const content = JSON.parse(qrcodeRecord.content); + console.log('解析后的内容:', content); + resolve(content) + } catch (err) { + console.error('=== 扫码处理失败 ==='); + console.error('错误信息:', err); + console.error('错误堆栈:', err.stack); + uni.hideLoading(); + uni.showToast({ + title: err.message || '处理失败', + icon: 'none', + duration: 3000 + }); + reject() } - - - // 3. 直接通过钢卷ID获取钢卷详情 - console.log('3. 获取钢卷详情,钢卷ID:', coilId); - const coilRes = await getMaterialCoil(coilId); - console.log('钢卷详情响应:', coilRes); - - if (coilRes.code !== 200) { - throw new Error(coilRes.msg || '查询钢卷信息失败'); - } - - if (!coilRes.data) { - throw new Error('未找到钢卷信息'); - } - - this.coilDetail = coilRes.data; - this.form = coilRes.data; - - this.$refs.tranferPopup.open(); - uni.hideLoading() - } catch (err) { - console.error('=== 扫码处理失败 ==='); - console.error('错误信息:', err); - console.error('错误堆栈:', err.stack); - uni.hideLoading(); + }, + fail: (err) => { uni.showToast({ - title: err.message || '处理失败', - icon: 'none', - duration: 3000 + title: '扫码失败,请重试', + icon: 'none' + }); + reject(); + } + }); + }) + }, + + // 发货操作(原有方法不变) + async handleShip() { + const content = await this.getQRCodeContent(); + + // 优先使用current_coil_id(当前有效的钢卷ID),如果没有则使用coil_id(兼容旧数据) + let coilId = content.current_coil_id && content.current_coil_id !== 'null' ? content + .current_coil_id : null; + if (!coilId) { + coilId = content.coil_id && content.coil_id !== 'null' ? content.coil_id : null; + } + + console.log('提取钢卷ID - current_coil_id:', content.current_coil_id, 'coil_id:', content.coil_id, + '最终使用:', coilId); + + if (!coilId) { + throw new Error('二维码中未包含有效的钢卷ID'); + } + + // 3. 直接通过钢卷ID获取钢卷详情 + console.log('3. 获取钢卷详情,钢卷ID:', coilId); + const coilRes = await getMaterialCoil(coilId); + console.log('钢卷详情响应:', coilRes); + + if (coilRes.code !== 200) { + throw new Error(coilRes.msg || '查询钢卷信息失败'); + } + + if (!coilRes.data) { + throw new Error('未找到钢卷信息'); + } + + const coilData = coilRes.data; + + if (coilRes.data.status == 1) { + uni.showToast({ + title: '钢卷已经发货,无需再次发货' + }) + return; + } + + uni.showModal({ + cancelText: '取消', + confirmText: '确认', + title: '确定要将钢卷号为:' + coilRes.data.currentCoilNo + '发货吗?', + showCancel: true, + success: async () => { + try { + // 1. 更新钢卷状态为已发货 + await updateMaterialCoilSimple({ + ...coilRes.data, + status: 1, + }); + + // 2. 插入一条已完成的待操作记录 + await addPendingAction({ + coilId: coilRes.data.coilId, + currentCoilNo: coilRes.data.currentCoilNo, + actionType: 402, // 402=发货 + actionStatus: 2, // 直接标记为完成状态 + scanTime: new Date(), + scanDevice: this.getDeviceInfo(), + priority: 0, // 0=普通 + sourceType: 'scan', + warehouseId: coilRes.data.warehouseId, + processTime: new Date(), + completeTime: new Date() + }); + + uni.showToast({ + title: '发货成功', + icon: 'none' + }); + } catch (error) { + console.error('发货失败:', error); + uni.showToast({ + title: error.message || '发货失败', + icon: 'none' }); } }, - fail: (err) => { - console.error('扫码失败:', err); + fail() { uni.showToast({ - title: '扫码失败,请重试', + title: '已取消发货', icon: 'none' - }); + }) } }); + uni.hideLoading(); }, - async handleConfirm() { + // 移库操作:第一步 - 扫描钢卷,打开移库弹窗(原有方法优化) + async handleTranfer() { try { - // 1. 更新钢卷信息(移库) - await updateMaterialCoilSimple(this.form); - - // 2. 插入一条已完成的待操作记录 - await addPendingAction({ - coilId: this.form.coilId, - currentCoilNo: this.form.currentCoilNo, - actionType: 5, // 5=移库 - actionStatus: 2, // 2=已完成 - scanTime: new Date(), - scanDevice: this.getDeviceInfo(), - priority: 0, // 0=普通 - sourceType: 'scan', - warehouseId: this.form.warehouseId, - processTime: new Date(), - completeTime: new Date() - }); - - uni.showToast({ - title: '移库成功', - icon: 'none' - }); - this.$refs.tranferPopup.close(); + const content = await this.getQRCodeContent() + // 优先使用current_coil_id(当前有效的钢卷ID),如果没有则使用coil_id(兼容旧数据) + let coilId = content.current_coil_id && content.current_coil_id !== 'null' ? content + .current_coil_id : null; + if (!coilId) { + coilId = content.coil_id && content.coil_id !== 'null' ? content.coil_id : null; + } + + console.log('提取钢卷ID - current_coil_id:', content.current_coil_id, 'coil_id:', content.coil_id, + '最终使用:', coilId); + + if (!coilId) { + throw new Error('二维码中未包含有效的钢卷ID'); + } + + // 3. 直接通过钢卷ID获取钢卷详情 + console.log('3. 获取钢卷详情,钢卷ID:', coilId); + const coilRes = await getMaterialCoil(coilId); + console.log('钢卷详情响应:', coilRes); + + if (coilRes.code !== 200) { + throw new Error(coilRes.msg || '查询钢卷信息失败'); + } + + if (!coilRes.data) { + throw new Error('未找到钢卷信息'); + } + + // 重置移库状态 + this.targetWarehouse = null; + this.coilDetail = coilRes.data; + this.form = { ...coilRes.data }; + + // 打开移库弹窗 + this.$refs.tranferPopup.open(); + uni.hideLoading() } catch (error) { - console.error('移库失败:', error); + uni.hideLoading(); uni.showToast({ - title: error.message || '移库失败', - icon: 'none' + title: error.message || '打开移库失败', + icon: 'none', + duration: 2000 }); } }, - // 获取设备信息 + + // 移库操作:第二步 - 扫描目标库区码(核心补充) + async handleScanWarehouseCode() { + try { + uni.showLoading({ title: '扫码中...' }); + // 扫描库区二维码 + const scanRes = await new Promise((resolve, reject) => { + uni.scanCode({ + success: resolve, + fail: (err) => { + reject(new Error('扫码取消或失败')); + } + }); + }); + uni.hideLoading(); + + const warehouseQrCode = scanRes.result; + if (!warehouseQrCode) { + throw new Error('未识别到库区信息'); + } + + // 解析库区二维码(假设二维码内容是库区ID,若为JSON格式需调整解析逻辑) + const targetWarehouseId = warehouseQrCode; + console.log('扫描到的目标库区ID:', targetWarehouseId); + + // 调用接口获取库区详情(关键:通过库区ID查询名称等信息) + uni.showLoading({ title: '验证库区...' }); + const warehouseRes = await getActualWarehouse(targetWarehouseId); + uni.hideLoading(); + + if (warehouseRes.code !== 200 || !warehouseRes.data) { + throw new Error('获取库区信息失败,请确认库区码有效'); + } + + const targetWarehouse = warehouseRes.data; + // 校验:目标库区不能与原库区相同 + if (targetWarehouse.actualWarehouseId === this.coilDetail.actualWarehouseId) { + throw new Error('目标库区不能与当前库区相同'); + } + + // 存储目标库区信息(用于回显和提交) + this.targetWarehouse = targetWarehouse; + // 更新表单中的目标库区ID(提交时需要) + this.form.actualWarehouseId = targetWarehouse.actualWarehouseId; + this.form.actualWarehouseName = targetWarehouse.actualWarehouseName; + + uni.showToast({ + title: `已选中库区:${targetWarehouse.actualWarehouseName}`, + icon: 'none', + duration: 1500 + }); + } catch (error) { + uni.hideLoading(); + uni.showToast({ + title: error.message || '扫描库区失败', + icon: 'none', + duration: 2500 + }); + } + }, + + // 移库操作:重新扫描目标库区 + handleReScan() { + this.targetWarehouse = null; + this.form.warehouseId = this.coilDetail.warehouseId; // 重置为原库区ID + this.form.actualWarehouseName = this.coilDetail.actualWarehouseName; + }, + + // 移库操作:关闭弹窗 + handleClosePopup() { + this.$refs.tranferPopup.close(); + // 重置状态 + this.targetWarehouse = null; + this.form = {}; + this.coilDetail = {}; + }, + + // 移库操作:第三步 - 确认移库(核心补充) + async handleConfirm() { + try { + // 再次校验:防止异常场景 + if (!this.targetWarehouse || !this.form.warehouseId) { + uni.showToast({ title: '请先选择目标库区', icon: 'none' }); + return; + } + if (this.targetWarehouse.actualWarehouseId === this.coilDetail.warehouseId) { + uni.showToast({ title: '目标库区不能与当前库区相同', icon: 'none' }); + return; + } + + this.loading = true; + uni.showLoading({ title: '移库中...' }); + + // 1. 核心:更新钢卷的库区信息 + const updateRes = await updateMaterialCoilSimple(this.form); + + if (updateRes.code !== 200) { + throw new Error(updateRes.msg || '更新钢卷库区失败'); + } + + // 2. 创建移库操作记录(标记为已完成) + const pendingData = { + coilId: this.form.coilId, + currentCoilNo: this.form.currentCoilNo, + actionType: 403, // 403=移库(需与字典表action_type的移库编码一致) + actionStatus: 2, // 2=已完成 + scanTime: new Date().toISOString(), + scanDevice: this.getDeviceInfo(), + priority: 0, // 普通优先级 + sourceType: 'scan', // 扫码来源 + processTime: new Date().toISOString(), + completeTime: new Date().toISOString(), + remark: `移库操作:${this.coilDetail.actualWarehouseName} → ${this.form.actualWarehouseName}` + }; + + const addRes = await addPendingAction(pendingData); + if (addRes.code !== 200) { + throw new Error(addRes.msg || '创建移库记录失败'); + } + + // 操作成功 + uni.hideLoading(); + uni.showToast({ title: '移库成功', icon: 'success', duration: 1500 }); + + // 关闭弹窗并重置状态 + setTimeout(() => { + this.handleClosePopup(); + }, 1500); + } catch (error) { + this.loading = false; + uni.hideLoading(); + console.error('移库失败详情:', error); + uni.showToast({ + title: error.message || '移库失败,请重试', + icon: 'none', + duration: 3000 + }); + } finally { + this.loading = false; + } + }, + + // 显示BOM参数弹窗(原有功能补充实现) + showBomDialog() { + this.bomDialogShow = true; + // 可扩展BOM参数弹窗内容,此处省略弹窗组件实现 + }, + + // 获取设备信息(原有方法不变) getDeviceInfo() { try { const systemInfo = uni.getSystemInfoSync(); @@ -564,7 +623,7 @@ } }, - // 获取操作类型名称 + // 获取操作类型名称(原有方法不变) getActionTypeName(actionType) { const type = this.types.find(t => t.dictValue === String(actionType)); return type ? type.dictLabel : '未知操作'; @@ -658,7 +717,7 @@ /* 按钮网格布局 */ .btn-grid { - display: grid; + display: grid; grid-template-columns: repeat(3, 1fr); gap: 15rpx; } @@ -673,7 +732,7 @@ height: 120rpx; font-size: 28rpx; } - + /* 操作类型按钮样式 - 工业化简洁风格 */ .type-btn { width: 100%; @@ -723,6 +782,12 @@ color: #e6a23c; border-color: #e6a23c; } + + .see-btn { + background-color: #6fd2ff; + color: #0777ff; + border-color: #0777ff; + } .move-btn:active { background-color: #fff3cc; @@ -836,4 +901,168 @@ } } } + + /* 扫码按钮样式 */ + .scan-btn-wrapper { + display: flex; + flex-direction: column; + align-items: center; + gap: 20rpx; + + .scan-icon { + width: 160rpx; + height: 160rpx; + border-radius: 50%; + background: linear-gradient(135deg, #34c759 0%, #30b350 100%); + display: flex; + align-items: center; + justify-content: center; + box-shadow: 0 8rpx 24rpx rgba(52, 199, 89, 0.3); + + &:active { + transform: scale(0.95); + } + } + + .icon-camera { + font-size: 70rpx; + color: #fff; + } + + .scan-tip { + font-size: 28rpx; + color: #666; + } + + .scan-hint { + font-size: 24rpx; + color: #999; + } + } + + /* 已选中库区样式 */ + .selected-warehouse { + display: flex; + flex-direction: column; + align-items: center; + gap: 15rpx; + padding: 20rpx; + background-color: #f0f9ff; + border-radius: 12rpx; + width: 100%; + box-sizing: border-box; + } + + .warehouse-info { + display: flex; + align-items: center; + gap: 10rpx; + font-size: 28rpx; + } + + .warehouse-label { + color: #666; + } + + .warehouse-value { + color: #1976d2; + font-weight: 600; + } + + .re-scan-btn { + padding: 10rpx 30rpx; + font-size: 24rpx; + color: #409eff; + background-color: transparent; + border: 2rpx solid #409eff; + border-radius: 8rpx; + } + + /* 操作按钮组样式 */ + .action-buttons { + display: flex; + gap: 20rpx; + margin-top: 40rpx; + } + + .btn { + flex: 1; + height: 80rpx; + line-height: 80rpx; + font-size: 28rpx; + border-radius: 12rpx; + border: none; + } + + .btn-secondary { + background-color: #f5f5f5; + color: #666; + } + + .btn-primary { + background-color: #409eff; + color: #fff; + } + + .btn:disabled { + opacity: 0.6; + } + + /* 信息网格样式 */ + .info-grid { + display: flex; + flex-direction: column; + gap: 20rpx; + margin-top: 20rpx; + } + + .info-item { + display: flex; + justify-content: space-between; + align-items: center; + padding: 10rpx 0; + border-bottom: 2rpx solid #f5f5f5; + } + + .item-label { + font-size: 26rpx; + color: #666; + width: 30%; + } + + .item-value { + font-size: 26rpx; + color: #333; + width: 70%; + text-align: right; + word-break: break-all; + } + + /* 卡片标题样式 */ + .card-title { + display: flex; + align-items: center; + justify-content: space-between; + } + + .title-dot { + display: inline-block; + width: 12rpx; + height: 12rpx; + background-color: #409eff; + border-radius: 50%; + margin-right: 10rpx; + } + + .more-btn { + display: flex; + align-items: center; + gap: 5rpx; + color: #409eff; + font-size: 24rpx; + } + + .icon-more { + font-size: 26rpx; + } \ No newline at end of file diff --git a/apps/hand-factory/pages/easycode/editby.vue b/apps/hand-factory/pages/easycode/editby.vue new file mode 100644 index 0000000..1eb2921 --- /dev/null +++ b/apps/hand-factory/pages/easycode/editby.vue @@ -0,0 +1,556 @@ + + + + + diff --git a/apps/hand-factory/pages/easycode/tranfer.vue b/apps/hand-factory/pages/easycode/tranfer.vue new file mode 100644 index 0000000..fb7d03b --- /dev/null +++ b/apps/hand-factory/pages/easycode/tranfer.vue @@ -0,0 +1,45 @@ + + + + + diff --git a/apps/hand-factory/utils/update.js b/apps/hand-factory/utils/update.js index b8a4b07..1b98d04 100644 --- a/apps/hand-factory/utils/update.js +++ b/apps/hand-factory/utils/update.js @@ -155,13 +155,15 @@ function checkUpdate(forceCheck = false) { title: '发现新版本', content: `检测到新版本(${remoteVersion}),是否立即下载并更新?`, confirmText: '立即更新', - cancelText: '暂不更新', + cancelText: '退出', showCancel: true, success: (modalRes) => { if (modalRes.confirm) { // 用户确认更新:检查存储空间 -> 下载 -> 安装 handleConfirmUpdate(wgtUrl, remoteVersion); } else { + // 直接退出 + // 用户取消更新:询问是否忽略该版本 handleCancelUpdate(remoteVersion); } diff --git a/apps/hand-factory/version.json b/apps/hand-factory/version.json index d5e8568..63301f0 100644 --- a/apps/hand-factory/version.json +++ b/apps/hand-factory/version.json @@ -1,5 +1,5 @@ { - "version": "klp 1.3.11", + "version": "klp 1.3.13", "wgtUrl": "http://49.232.154.205:10900/fadapp-update/klp/klp.wgt", "apkUrl": "http://49.232.154.205:10900/fadapp-update/klp/klp.apk" } \ No newline at end of file