| | |
| | | <!-- 中间状态部分,上下结构,包含调机流程的三个步骤 --> |
| | | <view class="middle-section"> |
| | | <view class="item" style="height: 100px;"> |
| | | <h4>说明:先调机,再送检</h4> |
| | | <h4>说明:调机开始时间需要手动确认</h4> |
| | | </view> |
| | | <view class="item"> |
| | | <!-- 调机开始按钮,maStartTime有值时禁用 --> |
| | | <button :class="startLocked ? 'btn-disabled' : 'btn-blue'" |
| | | :disabled="startLocked" |
| | | <button :class="maStartTime ? 'btn-disabled' : 'btn-blue'" |
| | | :disabled="!!maStartTime" |
| | | @click="handleMaStartTime"> |
| | | 调机开始 |
| | | </button> |
| | |
| | | </view> |
| | | <view class="item"> |
| | | <!-- 送检呼叫按钮,maShoutTime有值时禁用 --> |
| | | <!-- 新增逻辑: 只有已填写调机开始时间且送检呼叫时间为空时才允许点击 --> |
| | | <button :class="canShout ? 'btn-blue' : 'btn-disabled'" |
| | | :disabled="!canShout" |
| | | <button :class="maShoutTime ? 'btn-disabled' : 'btn-blue'" |
| | | :disabled="!!maShoutTime" |
| | | @click="handleMaShoutTime"> |
| | | 送检呼叫 |
| | | </button> |
| | |
| | | <input class="txt-inp" v-model="maShoutTime" placeholder="点击按钮带出时间" disabled="true" /> |
| | | </view> |
| | | <!--<view class="item">--> |
| | | <!-- 调机完成按钮,maEndTime有值时禁用 --> |
| | | <!--<button :class="maEndTime ? 'btn-disabled' : 'btn-blue'" |
| | | :disabled="!!maEndTime" |
| | | @click="handleMaEndTime"> |
| | | 调机完成(=检验通过) |
| | | </button>--> |
| | | <!-- 显示调机完成时间 --> |
| | | <!--<input class="txt-inp" v-model="maEndTime" placeholder="首次首检确认通过写入" disabled="true" /> |
| | | <!-- 调机完成按钮,maEndTime有值时禁用 --> |
| | | <!--<button :class="maEndTime ? 'btn-disabled' : 'btn-blue'" |
| | | :disabled="!!maEndTime" |
| | | @click="handleMaEndTime"> |
| | | 调机完成(=检验通过) |
| | | </button>--> |
| | | <!-- 显示调机完成时间 --> |
| | | <!--<input class="txt-inp" v-model="maEndTime" placeholder="首次首检确认通过写入" disabled="true" /> |
| | | </view>--> |
| | | <view class="item"> |
| | | <button class="btn-disabled" disabled> |
| | | 调机完成(=检验通过=开工) |
| | | </button> |
| | | <input class="txt-inp" v-model="maEndTime" placeholder="首次首检确认通过写入" disabled="true" /> |
| | | </view> |
| | | |
| | | <!-- 新增: 首检结果与提示区域(不删除原有注释,仅新增) --> |
| | | <view class="item" style="flex-direction: column;"> |
| | | <label>当前首检结果: {{ latestFirstResult || '未判定' }}</label> |
| | | <label v-if="statusForm.remark" style="color:#00A2E9">{{ statusForm.remark }}</label> |
| | | <label v-if="showForceRebuild" style="color:#d9534f">首检不合格,系统已按后端策略可能自动重建,新单待检。</label> |
| | | </view> |
| | | |
| | | <!-- 新增: 强制重建按钮(可选,传 ForceRebuild=true) --> |
| | | <view class="item" v-if="showForceRebuild"> |
| | | <button :class="forceRebuilding ? 'btn-disabled':'btn-blue'" |
| | | :disabled="forceRebuilding" |
| | | @click="handleForceRebuild"> |
| | | {{ forceRebuilding ? '重建中...' : '强制重建首检单' }} |
| | | </button> |
| | | </view> |
| | | </view> |
| | | |
| | |
| | | maEndTime: '', // 调机完成时间 |
| | | statusForm: {}, // 工单状态表单数据 |
| | | flag: -1, // 操作标记 |
| | | // 新增: 记录原始数据库时间用于对比避免无变化重复提交 |
| | | origMaStartTime: '', |
| | | origMaShoutTime: '', |
| | | origMaEndTime: '', |
| | | // 新增: 最新首检结果(后端需在 FindByOrderNo 返回) |
| | | latestFirstResult: '', |
| | | // 新增: 强制重建状态 |
| | | forceRebuilding: false |
| | | } |
| | | }, |
| | | computed: { |
| | | // 只有调机开始时间已填写且送检呼叫时间为空时允许呼叫 |
| | | canShout() { |
| | | return !!this.maStartTime && !this.maShoutTime; |
| | | }, |
| | | // 新增: 是否显示强制重建按钮 |
| | | showForceRebuild() { |
| | | return this.latestFirstResult === '不合格'; |
| | | } |
| | | }, |
| | | created() { |
| | |
| | | }, |
| | | methods: { |
| | | // 处理调机开始按钮点击 |
| | | handleMaStartTime() { |
| | | if (!this.maStartTime) { |
| | | this.setMaStartTime(); |
| | | this.flag = -1; // 调机开始按钮按下时回传的flag=-1 |
| | | // 新增: 调机开始后立即提交写入(仅当与原值不同) |
| | | this.autoSubmitIfChanged(); |
| | | } |
| | | }, |
| | | handleMaStartTime() { |
| | | if (!this.maStartTime) { |
| | | this.setMaStartTime(); |
| | | this.flag = -1; // 调机开始按钮按下时回传的flag=-1 |
| | | } |
| | | }, |
| | | // 处理送检呼叫按钮点击 |
| | | handleMaShoutTime() { |
| | | // 增加前置校验:必须先有调机开始时间 |
| | | if (!this.maStartTime) { |
| | | this.$showMessage("请先点击调机开始"); |
| | | return; |
| | | } |
| | | if (!this.maShoutTime) { |
| | | this.stateCheck(1); |
| | | // 新增: 送检呼叫生成时间后立即提交(不合格会触发后端重建) |
| | | this.autoSubmitIfChanged(); |
| | | } |
| | | }, |
| | | // 处理调机完成按钮点击 |
| | | handleMaEndTime() { |
| | | if (!this.maEndTime) { |
| | | this.setMaEndTime(); |
| | | // 新增: 完成时间写入后提交 |
| | | this.autoSubmitIfChanged(); |
| | | } |
| | | }, |
| | | // 设置调机开始时间为当前时间 |
| | |
| | | refresh() { |
| | | this.findByOrderId(); |
| | | }, |
| | | // 全界面刷新:清空本地状态后重新拉取(不删除任何原有注释) |
| | | fullReload() { |
| | | // 清空当前显示数据,避免旧数据短暂闪烁 |
| | | this.maShoutTime = ''; |
| | | this.maStartTime = ''; |
| | | this.maEndTime = ''; |
| | | this.statusForm = {}; |
| | | this.flag = -1; |
| | | // 下一帧重新获取 |
| | | this.$nextTick(() => { |
| | | this.findByOrderId(); |
| | | }); |
| | | }, |
| | | // 保存并生效,将时间等信息提交到后端 |
| | | save() { |
| | | if (!this.statusForm.id) { |
| | | this.$showMessage("id为空,不允许推送"); |
| | | return; |
| | | } |
| | | // 新增: 若无变化则不调用后端,避免重复重建 |
| | | if (!this.hasTimeChanged()) { |
| | | this.$showMessage("无时间变化,未提交"); |
| | | return; |
| | | } |
| | | this.postChangeMachineTime().then(ok => { |
| | | if (ok) { |
| | | this.$showMessage("保存成功"); |
| | | this.syncOriginalTimes(); |
| | | this.findByOrderId(); // 刷新显示 |
| | | this.$post({ |
| | | url: "/MesOrderSta/ChangeMachineTime", |
| | | data: { |
| | | maStartTime: this.maStartTime, |
| | | maShoutTime: this.maShoutTime, |
| | | maEndTime: this.maEndTime, |
| | | id: this.statusForm.id, |
| | | orderId: this.orderId, |
| | | machineNo: this.machineNo, |
| | | flag: this.flag |
| | | } |
| | | }).then(res => { |
| | | if (res.data.tbBillList) { |
| | | this.$showMessage("呼叫成功"); |
| | | this.findByOrderId(); |
| | | } else { |
| | | this.$showMessage("呼叫失败"); |
| | | this.cancel(); |
| | | } |
| | | }); |
| | | }) |
| | | }, |
| | | // 取消操作,恢复为上次保存的数据 |
| | | cancel() { |
| | | this.maShoutTime = this.origMaShoutTime; |
| | | this.maStartTime = this.origMaStartTime; |
| | | this.maEndTime = this.origMaEndTime; |
| | | this.maShoutTime = this.statusForm.maShoutTime; |
| | | this.maStartTime = this.statusForm.maStartTime; |
| | | this.maEndTime = this.statusForm.maEndTime; |
| | | }, |
| | | // 送检呼叫,item=1时设置送检呼叫时间 |
| | | stateCheck(item) { |
| | |
| | | } |
| | | this.flag = item; |
| | | }, |
| | | // 新增: 判断时间是否有变化 |
| | | hasTimeChanged() { |
| | | return this.maStartTime !== this.origMaStartTime || |
| | | this.maShoutTime !== this.origMaShoutTime || |
| | | this.maEndTime !== this.origMaEndTime; |
| | | }, |
| | | // 新增: 自动提交(按钮生成时间后调用)仅在有变化时 |
| | | autoSubmitIfChanged() { |
| | | if (!this.statusForm.id) return; |
| | | if (!this.hasTimeChanged()) return; |
| | | this.postChangeMachineTime().then(ok => { |
| | | if (ok) { |
| | | this.$showMessage("提交成功"); |
| | | this.syncOriginalTimes(); |
| | | this.findByOrderId(); |
| | | } |
| | | }); |
| | | }, |
| | | // 新增: 同步原始时间快照 |
| | | syncOriginalTimes() { |
| | | this.origMaStartTime = this.maStartTime; |
| | | this.origMaShoutTime = this.maShoutTime; |
| | | this.origMaEndTime = this.maEndTime; |
| | | }, |
| | | // 新增: 强制重建触发 |
| | | handleForceRebuild() { |
| | | if (!this.statusForm.id) { |
| | | this.$showMessage("id为空,不允许重建"); |
| | | return; |
| | | } |
| | | this.forceRebuilding = true; |
| | | // 强制重建前可以重新生成送检时间(确保首检单新快照) |
| | | this.maShoutTime = this.$getDate('yyyy-mm-dd hh24:mi:ss'); |
| | | this.postChangeMachineTime(true).then(ok => { |
| | | this.forceRebuilding = false; |
| | | if (ok) { |
| | | this.$showMessage("强制重建成功"); |
| | | this.syncOriginalTimes(); |
| | | this.findByOrderId(); |
| | | } else { |
| | | this.$showMessage("强制重建失败"); |
| | | } |
| | | }); |
| | | }, |
| | | // 新增: 封装后端请求(支持 ForceRebuild) |
| | | postChangeMachineTime(forceRebuild = false) { |
| | | return this.$post({ |
| | | url: "/MesOrderSta/ChangeMachineTime", |
| | | data: { |
| | | maStartTime: this.maStartTime, |
| | | maShoutTime: this.maShoutTime, |
| | | maEndTime: this.maEndTime, |
| | | id: this.statusForm.id, |
| | | orderId: this.orderId, |
| | | orderNo: this.orderNo, |
| | | machineNo: this.machineNo, |
| | | flag: this.flag, |
| | | // 可选扩展字段(后端方法中动态接收) |
| | | //ForceRebuild: forceRebuild |
| | | } |
| | | }).then(res => { |
| | | // 后端返回结构假设:{ success:true/false, tbBillList: {...}, latestFirstResult:'合格/不合格' } |
| | | if (res.data) { |
| | | if (res.data.tbBillList) { |
| | | this.statusForm = res.data.tbBillList; |
| | | this.latestFirstResult = res.data.latestFirstResult || ''; |
| | | } |
| | | return res.data.success !== false; // 默认成功 |
| | | } |
| | | return false; |
| | | }).catch(() => false); |
| | | }, |
| | | // 根据工单号/ID获取工单状态数据 |
| | | findByOrderId() { |
| | | this.$post({ |
| | |
| | | this.maShoutTime = res.data.tbBillList.maShoutTime; |
| | | this.maStartTime = res.data.tbBillList.maStartTime; |
| | | this.maEndTime = res.data.tbBillList.maEndTime; |
| | | // 新增: 同步首检结果、原始时间快照 |
| | | this.latestFirstResult = res.data.tbBillList.latestFirstResult || res.data.latestFirstResult || ''; |
| | | this.syncOriginalTimes(); |
| | | }) |
| | | } |
| | | } |