| | |
| | | this.selectedToolNo = tool.no; |
| | | this.toolName = tool.name; |
| | | this.toolModel = tool.model; |
| | | this.activeToolNo = tool.no; // 记录选中 |
| | | this.activeToolNo = tool.no; // 记录选中 |
| | | }, |
| | | confirmTool() { |
| | | this.showToolDialog = false; |
| | |
| | | this.toolList = this.toolList.map(t => t.no === this.selectedToolNo ? { ...t, useLimit: v } : t); |
| | | this.$showMessage('使用上限已设置(仅前端显示)'); |
| | | }, |
| | | // 上刀时传递 sdjs = 当前 currentCjNum |
| | | async handleUpTool() { |
| | | if (!this.workOrderNo) { this.$showMessage('工单号不能为空'); return; } |
| | | if (!this.machineNo) { this.$showMessage('机台号不能为空'); return; } |
| | |
| | | const useLimit = Number(this.useLimitInput); |
| | | if (isNaN(useLimit) || useLimit <= 0) { this.$showMessage('请输入有效的使用上限'); return; } |
| | | |
| | | // 查找当前刀具的 currentCjNum |
| | | const currentTool = this.toolRecords.find(r => r.no === this.selectedToolNo); |
| | | const sdjs = currentTool && currentTool.currentCjNum != null ? Number(currentTool.currentCjNum) : null; |
| | | |
| | | const payload = { |
| | | workOrderNo: this.workOrderNo, |
| | | machineNo: this.machineNo, |
| | | toolNo: this.selectedToolNo, |
| | | type: '上刀', |
| | | useLimit |
| | | useLimit, |
| | | sdjs // 上刀计数(当前数采) |
| | | }; |
| | | try { |
| | | this.submitting = true; |
| | |
| | | this.submitting = false; |
| | | } |
| | | }, |
| | | // 下刀时传递 xdjs = 当前 downCount |
| | | async handleDownTool() { |
| | | if (!this.workOrderNo) { this.$showMessage('工单号不能为空'); return; } |
| | | if (!this.machineNo) { this.$showMessage('机台号不能为空'); return; } |
| | |
| | | const useLimit = Number(this.useLimitInput); |
| | | if (isNaN(useLimit) || useLimit <= 0) { this.$showMessage('请输入有效的使用上限'); return; } |
| | | |
| | | // 查找当前刀具的 downCount |
| | | const currentTool = this.toolRecords.find(r => r.no === this.selectedToolNo); |
| | | const xdjs = currentTool && currentTool.downCount != null ? Number(currentTool.downCount) : null; |
| | | |
| | | const payload = { |
| | | workOrderNo: this.workOrderNo, |
| | | machineNo: this.machineNo, |
| | | toolNo: this.selectedToolNo, |
| | | type: '下刀', |
| | | useLimit |
| | | useLimit, |
| | | xdjs // 下刀计数 |
| | | }; |
| | | try { |
| | | this.submitting = true; |
| | |
| | | |
| | | const formatPercent = n => { |
| | | if (n === null || n === undefined || isNaN(n)) return ''; |
| | | // 如果是小于等于1的小数,按比例放大 |
| | | // 如果是小于等于1的小数,按比例放大 |
| | | if (n <= 1) return `${(n * 100).toFixed(0)}%`; |
| | | return `${Number(n).toFixed(0)}%`; |
| | | }; |
| | |
| | | const upTimeRaw = getField(t, 'uP_TIME', 'UP_TIME', 'uPTime', 'UPTIME', 'UpTime'); |
| | | const downTimeRaw = getField(t, 'dowN_TIME', 'DOWN_TIME', 'downTime', 'DOWNTIME'); |
| | | const lifeWarnRaw = getField(t, 'lifE_WARN', 'LIFE_WARN', 'lifeWarn', 'LIFEWARN'); |
| | | const currentCjNum = getField(t, 'currentCjNum', 'CURRENTCJNUM', 'currentcjnum'); // 当前数采 |
| | | |
| | | // 使用次数和上限 |
| | | // 使用次数和上限 |
| | | const useCount = getField(t, 'usE_COUNT', 'USE_COUNT', 'useCount'); |
| | | const useLimit = getField(t, 'usE_LIMIT', 'USE_LIMIT', 'useLimit'); |
| | | |
| | | // 计算寿命比(使用次数/使用上限) |
| | | // 计算寿命比(使用次数/使用上限) |
| | | let percent = ''; |
| | | if ( |
| | | useCount != null && useLimit != null && |
| | |
| | | percent = ((Number(useCount) / Number(useLimit)) * 100).toFixed(0) + '%'; |
| | | } |
| | | |
| | | // 预警值格式化 |
| | | // 预警值格式化 |
| | | const parseNumber = v => { |
| | | if (v === null || v === undefined || v === '') return null; |
| | | const s = String(v).replace(/[,%%]/g, '').trim(); |
| | |
| | | }; |
| | | const lifeWarnNum = parseNumber(lifeWarnRaw); |
| | | |
| | | // 预警规则:当寿命比 >= 预警值时标记 预警 |
| | | // 预警规则:当寿命比 >= 预警值时标记 预警 |
| | | let warnStatus = getField(t, 'status', 'STATUS') || ''; |
| | | if (lifeWarnNum !== null && useCount != null && useLimit != null && !isNaN(useCount) && !isNaN(useLimit) && Number(useLimit) > 0) { |
| | | const percentNum = Number(useCount) / Number(useLimit); |
| | |
| | | useLimit: useLimit ?? '', |
| | | lifePercent: percent, |
| | | lifeWarn: formatPercent(lifeWarnNum), |
| | | warnStatus |
| | | warnStatus, |
| | | currentCjNum // 当前数采 |
| | | }; |
| | | }); |
| | | |
| | |
| | | } |
| | | }, |
| | | // 自动带出工单刀具信息 |
| | | async fetchDefaultToolFromWorkOrder() { |
| | | if (!this.machineNo) return; // 注意:这里用机台号 |
| | | try { |
| | | const res = await this.$post({ |
| | | url: '/Womdaa/GetWomdaasByShow', |
| | | data: JSON.stringify({ machineNo: this.machineNo }), |
| | | headers: { 'Content-Type': 'application/json' } |
| | | }); |
| | | if (res.status === 0 && Array.isArray(res.data?.tbBillList) && res.data.tbBillList.length > 0) { |
| | | const tool = res.data.tbBillList[0]; |
| | | this.selectedToolNo = tool.cutterId || tool.cutteR_ID || ''; |
| | | this.toolName = tool.cutterName || tool.cutteR_NAME || ''; |
| | | this.toolModel = tool.cutterModel || tool.cutteR_MODEL || ''; |
| | | } |
| | | } catch (e) { |
| | | console.warn('自动带出工单刀具失败', e); |
| | | } |
| | | }, |
| | | async fetchDefaultToolFromWorkOrder() { |
| | | if (!this.machineNo) return; // 注意:这里用机台号 |
| | | try { |
| | | const res = await this.$post({ |
| | | url: '/Womdaa/GetWomdaasByShow', |
| | | data: JSON.stringify({ machineNo: this.machineNo }), |
| | | headers: { 'Content-Type': 'application/json' } |
| | | }); |
| | | if (res.status === 0 && Array.isArray(res.data?.tbBillList) && res.data.tbBillList.length > 0) { |
| | | const tool = res.data.tbBillList[0]; |
| | | this.selectedToolNo = tool.cutterId || tool.cutteR_ID || ''; |
| | | this.toolName = tool.cutterName || tool.cutteR_NAME || ''; |
| | | this.toolModel = tool.cutterModel || tool.cutteR_MODEL || ''; |
| | | } |
| | | } catch (e) { |
| | | console.warn('自动带出工单刀具失败', e); |
| | | } |
| | | }, |
| | | formatDateTime(dateTimeStr) { |
| | | if (!dateTimeStr) return ''; |
| | | try { |