快乐的昕的电脑
2025-11-12 a68880015e0d83939ff90f4d9e943c3d423bd358
components/machine.vue
@@ -9,7 +9,13 @@
      <!-- 中间状态部分,上下结构,包含调机流程的三个步骤 -->
      <view class="middle-section">
         <view class="item" style="height: 100px;">
            <h4>说明:调机开始时间需要手动确认</h4>
            <h4>
               <!--说明:
               1.点击'调机开始'、'送检呼叫'后再点击'保存生效'<br />
               2.主界面首检合格后再点击'保存生效'<br />
               3.首检不合格再点击'保存生效'会清空送检时间<br />
               4.清空送检时间后点击‘检验不合格重新送检呼叫’再保存-->
            </h4>
         </view>
         <view class="item">
            <!-- 调机开始按钮,maStartTime有值时禁用 -->
@@ -19,7 +25,7 @@
               调机开始
            </button>
            <!-- 显示调机开始时间 -->
            <input class="txt-inp" v-model="maStartTime" placeholder="点击按钮带出时间" disabled="true" />
            <input class="txt-inp" v-model="maStartTime" placeholder="点击按钮带出调机时间" disabled="true" />
         </view>
         <view class="item">
            <!-- 送检呼叫按钮,maShoutTime有值时禁用 -->
@@ -29,17 +35,17 @@
               送检呼叫
            </button>
            <!-- 显示送检呼叫时间 -->
            <input class="txt-inp" v-model="maShoutTime" placeholder="点击按钮带出时间" disabled="true" />
            <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>
@@ -47,6 +53,23 @@
            </button>
            <input class="txt-inp" v-model="maEndTime" placeholder="首次首检确认通过写入" disabled="true" />
         </view>
         <!--启用该功能-->
         <!--新增:检验不合格送检呼叫 按钮(功能与送检呼叫一样,仅在特定 remark 下可以点击)-->
         <view class="item">
            <!--检验不合格送检呼叫按钮,仅在 remark 为指定文本 且 当前无送检时间 时可点击-->
            <button :class="canFailResend ? 'btn-blue' : 'btn-disabled'"
                  :disabled="!canFailResend"
                  @click="ReHandleMaShoutTime">
               检验不合格重新送检呼叫
            </button>
            <!--仍复用同一送检时间字段,避免重复状态-->
            <input class="txt-inp"
                  v-model="maShoutTime"
                  placeholder="首检不合格重新呼叫时点击按钮带出送检时间"
                  disabled="true" />
         </view>
      </view>
      <!-- 底部保存/取消按钮 -->
@@ -73,8 +96,17 @@
            maShoutTime: '',   // 送检呼叫时间
            maStartTime: '',   // 调机开始时间
            maEndTime: '',     // 调机完成时间
            statusForm: {},    // 工单状态表单数据
            statusForm: {},    // 工单状态表单数据(包含 remark 字段)
            flag: -1,          // 操作标记
            failedRemark: '首检不合格,送检时间已清空,请重新送检呼叫生成新的首检单' // 首检不合格后由后端返回的提示
         }
      },
      computed: {
         // 满足首检不合格重新呼叫条件且当前尚未重新生成送检时间 => 按钮可用
         canFailResend() {
            return this.statusForm &&
               this.statusForm.remark === this.failedRemark &&
               !this.maShoutTime;
         }
      },
      created() {
@@ -86,16 +118,22 @@
      },
      methods: {
         // 处理调机开始按钮点击
            handleMaStartTime() {
                if (!this.maStartTime) {
                    this.setMaStartTime();
                    this.flag = -1; // 调机开始按钮按下时回传的flag=-1
                }
            },
         // 处理送检呼叫按钮点击
         handleMaStartTime() {
            if (!this.maStartTime) {
               this.setMaStartTime();
               this.flag = -1; // 调机开始按钮按下时回传的flag=-1
            }
         },
         // 处理送检呼叫按钮点击(不含首检不合格重呼叫)
         handleMaShoutTime() {
            if (!this.maShoutTime) {
               this.stateCheck(1);
            }
         },
         // 首检不合格重呼叫:flag = 2
         ReHandleMaShoutTime() {
            if (!this.maShoutTime && this.canFailResend) {
               this.stateCheck(2);
            }
         },
         // 处理调机完成按钮点击
@@ -113,55 +151,69 @@
            console.log('调机完成按钮被点击');
            this.maEndTime = this.$getDate('yyyy-mm-dd hh24:mi:ss');
         },
         // 刷新工单数据
            refresh() {
                this.findByOrderId();
            }
            findByOrderId() {
                this.$post({
                    url: "/MesOrderSta/FindByOrderNo",
         // 刷新工单数据(局部刷新当前组件)
         refresh() {
            this.findByOrderId();
         },
         // 保存并生效,将时间等信息提交到后端
         // 变更:返回 Promise;成功后局部刷新(调用 findByOrderId)而不是整页 reload
            save() {
                if (!this.statusForm.id) {
                    this.$showMessage("id为空,不允许推送");
                    return Promise.resolve();
                }
                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
                    }
                }).then(res => {
                    this.statusForm = res.data.tbBillList;
                    this.maShoutTime = res.data.tbBillList.maShoutTime;
                    this.maStartTime = res.data.tbBillList.maStartTime;
                    this.maEndTime = res.data.tbBillList.maEndTime;
                    if (res && res.data && res.data.tbBillList) {
                        this.$showMessage("呼叫成功");
                        // 关键修改:清空 flag 的值
                        this.flag = -1; // 或者根据业务需求设置为其他初始值
                        // 方案1:使用uni-app的页面刷新方法
                        // 方法1:触发下拉刷新(如果页面支持)
                        if (uni.startPullDownRefresh) {
                            uni.startPullDownRefresh();
                            // 2秒后停止刷新
                            setTimeout(() => {
                                uni.stopPullDownRefresh();
                            }, 2000);
                        }
                        // 方法2:重新调用页面的onLoad方法(推荐)
                        const pages = getCurrentPages();
                        const currentPage = pages[pages.length - 1];
                        if (currentPage && currentPage.onLoad) {
                            // 保存当前页面参数
                            const pageOptions = currentPage.options || {};
                            // 重新加载页面数据
                            currentPage.onLoad(pageOptions);
                        }
                        // 方法3:同时刷新组件数据
                        this.findByOrderId();
                    } else {
                        this.$showMessage("呼叫失败");
                        this.cancel();
                    }
                    return res;
                }).catch(err => {
                    console.error('保存失败:', err);
                    this.$showMessage("保存时发生错误");
                    throw err;
                });
            },
         // 保存并生效,将时间等信息提交到后端
         save() {
            if (!this.statusForm.id) {
               this.$showMessage("id为空,不允许推送");
               return;
            }
                // 只要送检呼叫有值,flag强制为-1
                if (this.maShoutTime) {
                    this.flag = -1;
                }
            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.refresh(); // 保存后刷新
               } else {
                  this.$showMessage("呼叫失败");
                  this.cancel();
               }
            })
         },
         // 取消操作,恢复为上次保存的数据
         cancel() {
            this.maShoutTime = this.statusForm.maShoutTime;
@@ -169,17 +221,25 @@
            this.maEndTime = this.statusForm.maEndTime;
         },
         // 送检呼叫,item=1时设置送检呼叫时间
         // 送检呼叫与重新送检呼叫以及调机开始对应的 flag 值
         // flag 说明:-1 = 调机开始;1 = 首次送检呼叫;2 = 不合格重新送检呼叫
         stateCheck(item) {
            switch (item) {
               case 0:
                  break;
               case 1:
               case 1:// 首次送检呼叫
                  this.maShoutTime = this.$getDate('yyyy-mm-dd hh24:mi:ss');
                  this.flag = -1; // 送检呼叫有值后,flag始终为-1
                  //this.flag = -1; // 送检呼叫有值后,flag始终为-1
                  break;
               case 2:
               case 2:// 检验不合格重新送检呼叫
                  this.maShoutTime = this.$getDate('yyyy-mm-dd hh24:mi:ss');
                  //this.flag = -1; // 送检呼叫有值后,flag始终为-1
                  break;
               default:
                  // 其它值不处理
                  break;
            }
            this.flag = item;
         },
         // 根据工单号/ID获取工单状态数据
         findByOrderId() {
@@ -196,14 +256,29 @@
               this.maEndTime = res.data.tbBillList.maEndTime;
            })
         }
      }
      },
        mounted() {
            // 页面加载时,启动定时器,每隔30秒自动保存
            this.autoSaveTimer = setInterval(() => {
                // 判断当前工单是否为开工状态,若是则不触发保存
                if (this.statusForm && this.statusForm.status === '开工') {
                    // 已开工不自动保存
                    return;
                }
                this.save(); // 只有非开工状态才自动保存
            }, 1 * 30 * 1000); // 30秒
        },
      beforeDestroy() {
         // 页面卸载时清理定时器
         clearInterval(this.autoSaveTimer);
      },
   };
</script>
<style scoped>
   /* 页面整体布局 */
   .page {
      padding: 2vh;
      padding: 8px;
      display: flex;
      flex-direction: column;
      justify-content: space-between;
@@ -214,54 +289,56 @@
   /* 右上角刷新按钮 */
   .top-right {
      position: absolute;
      top: 10px;
      right: 50px;
      top: 8px;
      right: 40px;
      width: 200px;
      z-index: 1000;
   }
   .refresh-btn {
      padding: 10px;
      padding: 8px 16px;
      background-color: #00A2E9;
      color: white;
      border: none;
      font-size: 1.5vw;
      font-size: 16px;
      border-radius: 5px;
   }
   label {
      margin-right: 1vw;
      font-size: 1.6vw;
   }
   input {
      padding: 1vh;
      font-size: 1.5vw;
      border: 1px solid #ccc;
      width: 100%;
      margin-top: 1vh;
      box-sizing: border-box;
      margin-right: 10px;
      font-size: 16px;
   }
   /* 中间状态部分布局 */
   .middle-section {
      display: flex;
      flex-direction: column;
      margin-bottom: 4vh;
      margin-bottom: 8px;
   }
   .item {
      display: flex;
      flex-direction: row;
      align-items: flex-start;
      margin-bottom: 2vh;
      align-items: center;
      margin-bottom: 10px;
      gap: 10px;
   }
   .item h4 {
      font-size: 14px;
      line-height: 1.4;
      margin: 0;
      padding: 5px 0;
   }
   button {
      width: 100%;
      padding: 1.5vh;
      font-size: 1.5vw;
      width: 50%;
      flex-shrink: 0;
      padding: 10px;
      font-size: 16px;
      border: none;
      text-align: center;
      min-height: 40px;
   }
   .btn-disabled {
@@ -275,36 +352,86 @@
   }
   input {
      margin-top: 10px;
      padding: 10px;
      font-size: 14px;
      margin-top: 0;
      padding: 8px;
      font-size: 15px;
      border: 1px solid #ccc;
      width: 100%;
      width: 50%;
      flex-grow: 1;
      box-sizing: border-box;
   }
   /* 底部保存/取消按钮布局 */
   .bottom-section {
      display: flex;
      justify-content: space-between;
      margin-top: 4vh;
      margin-top: 10px;
      padding-top: 10px;
   }
   .save-btn,
   .cancel-btn {
      width: 48%;
      padding: 1.5vh;
      padding: 12px;
      background-color: #00A2E9;
      color: white;
      font-size: 1.6vw;
      font-size: 18px;
      border: none;
      text-align: center;
      min-height: 45px;
   }
   .txt-inp {
      height: 8vh;
      padding: 1vh;
      font-size: 1.5vw;
      width: 100%;
      height: 40px;
      padding: 8px;
      font-size: 15px;
      width: 50%;
      flex-grow: 1;
      box-sizing: border-box;
      margin-top: 0;
   }
   /* 针对1280*717屏幕的特定优化 */
   @media screen and (max-width: 1280px) and (max-height: 800px) {
      .page {
         padding: 6px;
      }
      .middle-section {
         margin-bottom: 6px;
      }
      .item {
         margin-bottom: 8px;
      }
      .item h4 {
         font-size: 13px;
         padding: 3px 0;
      }
      button {
         padding: 8px;
         font-size: 15px;
         min-height: 38px;
      }
      .txt-inp {
         height: 38px;
         padding: 6px;
         font-size: 14px;
      }
      .bottom-section {
         margin-top: 8px;
         padding-top: 8px;
      }
      .save-btn,
      .cancel-btn {
         padding: 10px;
         font-size: 17px;
         min-height: 42px;
      }
   }
</style>