Browse Source

维修工单调整

ouyj 7 months ago
parent
commit
6ee96e2545

+ 1 - 1
ygtx-gxt/src/main/java/com/ygtx/gxt/domain/GxtRepairOrder.java

@@ -27,7 +27,7 @@ public class GxtRepairOrder extends BaseEntity
     @Excel(name = "工单编码")
     private String workOrderProjectNo;
 
-    /** 工单状态:draft-草稿,to_assign-待派单,assigned-待接单,accepted-已接单,processing-处理中,paused-暂停中,to_approve-待审批,suspended-已挂起,to_be_finalized-待结单,completed-已完成,to_issue-待下发,archived-已归档,to_archive-待归档 */
+    /** 工单状态:draft-草稿,to_assign-待派单,assigned-待接单,accepted-已接单,processing-处理中,paused-暂停中,to_approve-待审批,suspended-已挂起,to_be_finalized-待结单(废弃),completed-已完成,to_issue-待下发,archived-已归档,to_archive-待归档,to_finish-待结单 */
     @Excel(name = "工单状态")
     private String workOrderStatus;
 

+ 1 - 1
ygtx-gxt/src/main/java/com/ygtx/gxt/domain/GxtRepairOrderFlow.java

@@ -28,7 +28,7 @@ public class GxtRepairOrderFlow extends BaseEntity
     @Excel(name = "工单编码")
     private String orderCode;
 
-    /** 操作类型:create-创建工单,assign-下发工单,accept-接单,process-处理工单,pause-暂停,suspend-挂起,restart-重启,approve-审批,complete-完成工单,create_to_assign-创建并下发工单,to_approve-申请挂起工单,approved-挂起审批通过,rejected-挂起审批驳回,rating-工单评分,restart-设备恢复运行,archive-工单归档 */
+    /** 操作类型:create-创建工单,assign-下发工单,accept-接单,process-处理工单,pause-暂停,suspend-挂起,restart-重启,approve-审批,complete-完成工单,create_to_assign-创建并下发工单,to_approve-申请挂起工单,approved-挂起审批通过,rejected-挂起审批驳回,rating-工单评分,restart-设备恢复运行,archive-工单归档,to_archive-工单待归档 */
     //@Excel(name = "操作类型:create-创建工单,assign-下发工单,accept-接单,process-处理工单,pause-暂停,suspend-挂起,restart-重启,approve-审批,complete-完成工单,create_to_assign-创建并下发工单,to_approve-申请挂起工单,approved-挂起审批通过,rejected-挂起审批驳回,rating-工单评分")
     private String actionType;
 

+ 37 - 5
ygtx-gxt/src/main/java/com/ygtx/gxt/service/impl/GxtRepairOrderServiceImpl.java

@@ -2,6 +2,7 @@ package com.ygtx.gxt.service.impl;
 
 import java.util.List;
 import com.ygtx.common.utils.DateUtils;
+import com.ygtx.common.utils.DictUtils;
 import com.ygtx.gxt.domain.GxtRepairOrderPerson;
 import com.ygtx.gxt.domain.GxtWorkOrderPerson;
 import com.ygtx.gxt.mapper.GxtRepairOrderPersonMapper;
@@ -229,7 +230,8 @@ public class GxtRepairOrderServiceImpl implements IGxtRepairOrderService
         String nickName = SecurityUtils.getLoginUser().getUser().getNickName();
         GxtRepairOrder oldOrder = gxtRepairOrderMapper.selectGxtRepairOrderById(gxtRepairOrder.getId());
         //gxtRepairOrder.setWorkOrderStatus("accepted");
-        gxtRepairOrder.setWorkOrderStatus("processing");
+        //gxtRepairOrder.setWorkOrderStatus("processing");
+        gxtRepairOrder.setWorkOrderStatus("to_finish");
         gxtRepairOrder.setAcceptTime(DateUtils.getNowDate());
         gxtRepairOrder.setAcceptUserId(SecurityUtils.getUserId());
         gxtRepairOrder.setAcceptUserName(nickName);
@@ -291,7 +293,8 @@ public class GxtRepairOrderServiceImpl implements IGxtRepairOrderService
         /*if(oldOrder.getRealStartTime() != null){
             gxtRepairOrder.setRealStartTime(DateUtils.getNowDate());
         }*/
-        gxtRepairOrder.setWorkOrderStatus("processing");
+        //gxtRepairOrder.setWorkOrderStatus("processing");
+        gxtRepairOrder.setWorkOrderStatus("to_finish");
         gxtRepairOrder.setUpdateBy(SecurityUtils.getUsername());
         gxtRepairOrder.setUpdateTime(DateUtils.getNowDate());
         int result = gxtRepairOrderMapper.updateGxtRepairOrder(gxtRepairOrder);
@@ -449,6 +452,19 @@ public class GxtRepairOrderServiceImpl implements IGxtRepairOrderService
             flow.setActionTime(DateUtils.getNowDate());
             flow.setActionRemark("对维修工单进行评分。分数:"+gxtRepairOrder.getScore());
             gxtRepairOrderFlowService.insertGxtRepairOrderFlow(flow);
+            if (gxtRepairOrder.getRestartTime() != null) {
+                GxtRepairOrderFlow flowArchive = new GxtRepairOrderFlow();
+                flowArchive.setOrderId(gxtRepairOrder.getId());
+                flowArchive.setOrderCode(gxtRepairOrder.getWorkOrderProjectNo());
+                flowArchive.setActionType("to_archive");
+                flowArchive.setFromStatus(oldOrder.getWorkOrderStatus());
+                flowArchive.setToStatus(gxtRepairOrder.getWorkOrderStatus());
+                flowArchive.setOperatorId(SecurityUtils.getUserId());
+                flowArchive.setOperatorName(nickName);
+                flowArchive.setActionTime(DateUtils.getNowDate());
+                flowArchive.setActionRemark("工单待归档");
+                gxtRepairOrderFlowService.insertGxtRepairOrderFlow(flowArchive);
+            }
         }
         
         return result;
@@ -482,7 +498,9 @@ public class GxtRepairOrderServiceImpl implements IGxtRepairOrderService
             flow.setOperatorId(SecurityUtils.getUserId());
             flow.setOperatorName(nickName);
             flow.setActionTime(DateUtils.getNowDate());
-            flow.setActionRemark("申请挂起维修工单。挂起原因: " + gxtRepairOrder.getSuspendReason());
+            // 修改为从数据字典获取挂起原因的标签
+            String suspendReasonLabel = DictUtils.getDictLabel("gxt_order_suspend_reason", gxtRepairOrder.getSuspendReason());
+            flow.setActionRemark("申请挂起维修工单。挂起原因: " + suspendReasonLabel);
             gxtRepairOrderFlowService.insertGxtRepairOrderFlow(flow);
         }
         
@@ -504,7 +522,8 @@ public class GxtRepairOrderServiceImpl implements IGxtRepairOrderService
         if ("approved".equals(gxtRepairOrder.getApprovalStatus())) {
             gxtRepairOrder.setWorkOrderStatus("suspended");
         }else if ("rejected".equals(gxtRepairOrder.getApprovalStatus())) {
-            gxtRepairOrder.setWorkOrderStatus("processing");
+            //gxtRepairOrder.setWorkOrderStatus("processing");
+            gxtRepairOrder.setWorkOrderStatus("to_finish");
         }
         gxtRepairOrder.setUpdateBy(SecurityUtils.getUsername());
         gxtRepairOrder.setUpdateTime(DateUtils.getNowDate());
@@ -532,7 +551,7 @@ public class GxtRepairOrderServiceImpl implements IGxtRepairOrderService
             if ("approved".equals(gxtRepairOrder.getApprovalStatus())) {
                 actionRemark = "挂起申请审批通过";
             }else if ("rejected".equals(gxtRepairOrder.getApprovalStatus())) {
-                actionRemark = "挂起申请被驳回。驳回原因:"+gxtRepairOrder.getRejectionReason();
+                actionRemark = "挂起申请被驳回。审批意见:"+gxtRepairOrder.getRejectionReason();
             }
             flow.setActionRemark(actionRemark);
             gxtRepairOrderFlowService.insertGxtRepairOrderFlow(flow);
@@ -628,6 +647,19 @@ public class GxtRepairOrderServiceImpl implements IGxtRepairOrderService
             flow.setActionTime(DateUtils.getNowDate());
             flow.setActionRemark("设备恢复运行");
             gxtRepairOrderFlowService.insertGxtRepairOrderFlow(flow);
+            if (gxtRepairOrder.getScore() != null) {
+                GxtRepairOrderFlow flowArchive = new GxtRepairOrderFlow();
+                flowArchive.setOrderId(gxtRepairOrder.getId());
+                flowArchive.setOrderCode(gxtRepairOrder.getWorkOrderProjectNo());
+                flowArchive.setActionType("to_archive");
+                flowArchive.setFromStatus(oldOrder.getWorkOrderStatus());
+                flowArchive.setToStatus(gxtRepairOrder.getWorkOrderStatus());
+                flowArchive.setOperatorId(SecurityUtils.getUserId());
+                flowArchive.setOperatorName(nickName);
+                flowArchive.setActionTime(DateUtils.getNowDate());
+                flowArchive.setActionRemark("工单待归档");
+                gxtRepairOrderFlowService.insertGxtRepairOrderFlow(flowArchive);
+            }
         }
         return result;
     }

+ 14 - 2
ygtx-gxt/src/main/java/com/ygtx/gxt/task/RepairOrderArchiveTask.java

@@ -73,7 +73,7 @@ public class RepairOrderArchiveTask {
      * @return 是否满足归档条件
      */
     private boolean shouldArchive(GxtRepairOrder order) {
-        // 获取工单的复运时间和评分时间
+        /*// 获取工单的复运时间和评分时间
         Date restartTime = order.getRestartTime();
         Date scoreTime = null;
         
@@ -94,8 +94,20 @@ public class RepairOrderArchiveTask {
         }
 
         // 取复运时间和评分时间中较晚的一个作为基准时间
-        Date lastOperationTime = restartTime.after(scoreTime) ? restartTime : scoreTime;
+        Date lastOperationTime = restartTime.after(scoreTime) ? restartTime : scoreTime;*/
+        Date lastOperationTime = null;
+        GxtRepairOrderFlow flowQuery = new GxtRepairOrderFlow();
+        flowQuery.setOrderId(order.getId());
+        flowQuery.setActionType("to_archive");
+        List<GxtRepairOrderFlow> flows = repairOrderFlowService.selectGxtRepairOrderFlowList(flowQuery);
 
+        if (!flows.isEmpty()) {
+            // 获取最后一次评分的时间
+            lastOperationTime = flows.get(flows.size() - 1).getActionTime();
+        }
+        if (lastOperationTime == null) {
+            return false;
+        }
         // 检查最后操作时间是否已过去3天
         Date now = DateUtils.getNowDate();
         Date threeDaysAfterLastOperation = DateUtils.addDays(lastOperationTime, 3);

+ 66 - 33
ygtx-ui/src/views/gxt/repairOrder/index.vue

@@ -95,6 +95,7 @@
           />
         </el-select>-->
         <el-select v-model="queryParams.faultCode" placeholder="请选择故障代码" clearable>
+          <el-option label="无" value="无" />
           <el-option
               v-for="item in faultCodeOptions"
               :key="item.faultCode"
@@ -213,9 +214,9 @@
               link
               @click="handleStart(scope.row)"
               v-hasPermi="['gxt:repairOrder:start']"
-          ><i class="fa fa-play"></i>开始</el-button>
+          ><i class="fa fa-play"></i>恢复</el-button>
           <el-button
-              v-if="scope.row.workOrderStatus === 'processing'"
+              v-if="scope.row.workOrderStatus === 'to_finish'"
               type="danger"
               link
               @click="handleSuspend(scope.row)"
@@ -234,7 +235,7 @@
                       @click="handleProcessDone(scope.row)"
                     >结束</el-button>-->
           <el-button
-              v-if="scope.row.workOrderStatus === 'processing'"
+              v-if="scope.row.workOrderStatus === 'to_finish'"
               type="success"
               link
               @click="handleFinalize(scope.row)"
@@ -377,6 +378,7 @@
                 />
               </el-select>-->
               <el-select v-model="form.faultCode" placeholder="请选择故障代码" @change="handleFaultCodeChange" style="width: 100%">
+                <el-option label="无" value="无" />
                 <el-option
                     v-for="item in faultCodeOptions"
                     :key="item.faultCode"
@@ -388,7 +390,7 @@
           </el-col>
           <el-col :span="12">
             <el-form-item label="故障条纹" prop="faultBarcode">
-              <el-input v-model="form.faultBarcode" placeholder="请输入故障条纹" readonly />
+              <el-input v-model="form.faultBarcode" placeholder="请输入故障条纹" :readonly="form.faultCode!=='无'" />
             </el-form-item>
           </el-col>
         </el-row>
@@ -563,7 +565,7 @@
           <el-col :span="12">
             <el-form-item label="MIS工单编码">{{ acceptForm.misOrderNo }}</el-form-item>
           </el-col>
-          <el-col :span="24">
+          <el-col :span="12">
             <el-form-item label="故障描述">{{ acceptForm.faultDesc || '无' }}</el-form-item>
           </el-col>
           <!--          <el-col v-if="acceptForm.relatedOrderCode" :span="12">
@@ -620,8 +622,9 @@
     </el-dialog>
 
     <!-- 挂起对话框 -->
-    <el-dialog title="挂起工单" v-model="suspendDialogVisible" width="500px" append-to-body @close="closeSuspendDialog">
+    <el-dialog title="申请挂起工单" v-model="suspendDialogVisible" width="500px" append-to-body @close="closeSuspendDialog">
       <el-form ref="suspendFormRef" :model="suspendForm" :rules="suspendRules" label-width="120px" label-position="top">
+        <el-alert type="warning" :closable="false" title="请选择挂起原因,提交后需等待班长审批。" show-icon />
         <el-row>
           <el-col :span="12">
             <el-form-item label="工单编号">
@@ -634,7 +637,10 @@
             </el-form-item>
           </el-col>
           <el-col :span="24">
-            <el-form-item label="挂起原因" prop="suspendReason">
+            <el-form-item label="故障描述">{{ suspendForm.faultDesc || '无' }}</el-form-item>
+          </el-col>
+          <el-col :span="12">
+<!--            <el-form-item label="挂起原因" prop="suspendReason">
               <el-input
                   v-model="suspendForm.suspendReason"
                   type="textarea"
@@ -643,17 +649,20 @@
                   show-word-limit
                   :rows="3"
               />
+            </el-form-item>-->
+            <el-form-item label="挂起原因" prop="suspendReason">
+              <el-select v-model="suspendForm.suspendReason" placeholder="请选择挂起原因" style="width: 100%">
+                <el-option
+                    v-for="dict in gxt_order_suspend_reason"
+                    :key="dict.value"
+                    :label="dict.label"
+                    :value="dict.value"
+                />
+              </el-select>
             </el-form-item>
           </el-col>
         </el-row>
-        <!--        <el-form-item label="挂起原因" prop="suspendReason">
-                  <el-select v-model="suspendForm.suspendReason" placeholder="请选择挂起原因" style="width: 100%">
-                    <el-option label="天气异常" value="天气异常" />
-                    <el-option label="缺备件" value="缺备件" />
-                    <el-option label="风机非停时间" value="风机非停时间" />
-                    <el-option label="其他" value="其他" />
-                  </el-select>
-                </el-form-item>
+        <!--
                 <el-form-item label="详细说明" prop="suspendDescription">
                   <el-input
                     v-model="suspendForm.suspendDescription"
@@ -728,21 +737,21 @@
           </el-col>
           <el-col :span="12">
             <el-form-item label="挂起原因">
-              {{ approveForm.suspendReason || '无' }}
+              <dict-tag :options="gxt_order_suspend_reason" :value="approveForm.suspendReason" />
             </el-form-item>
           </el-col>
         </el-row>
-        <el-form-item label="审批决定" prop="approvalStatus">
+<!--        <el-form-item label="审批决定" prop="approvalStatus">
           <el-radio-group v-model="approveForm.approvalStatus" @change="toggleRejectionReason">
             <el-radio label="approved">通过</el-radio>
             <el-radio label="rejected">驳回</el-radio>
           </el-radio-group>
-        </el-form-item>
-        <el-form-item label="驳回原因" prop="rejectionReason" v-if="approveForm.approvalStatus === 'rejected'">
+        </el-form-item>-->
+        <el-form-item label="审批意见" prop="rejectionReason">
           <el-input
               v-model="approveForm.rejectionReason"
               type="textarea"
-              placeholder="请输入驳回原因"
+              placeholder="请输入审批已经"
               maxlength="100"
               show-word-limit
               :rows="3"
@@ -752,7 +761,8 @@
       <template #footer>
         <div class="dialog-footer">
           <el-button @click="closeApproveDialog">取 消</el-button>
-          <el-button type="primary" @click="submitApprove">确认审批</el-button>
+          <el-button type="primary" @click="submitApprove('rejected')">驳 回</el-button>
+          <el-button type="primary" @click="submitApprove('approved')">通 过</el-button>
         </div>
       </template>
     </el-dialog>
@@ -1240,9 +1250,10 @@ import { listFaultCodes } from "@/api/gxt/faultCodes"
 import { listGxtOrder } from "@/api/gxt/gxtOrder";
 import { listUser } from "@/api/system/user";
 import EquipmentSelectSingle from "@/components/equipmentSelect/single.vue"
+import { ElMessage, ElMessageBox, ElNotification, ElLoading } from 'element-plus'
 
 const { proxy } = getCurrentInstance()
-const { gxt_maintenance_type, gxt_work_order_status, gxt_order_priority_type,gxt_repair_order_flow_action_type } = proxy.useDict("gxt_maintenance_type", "gxt_work_order_status", "gxt_order_priority_type","gxt_repair_order_flow_action_type")
+const { gxt_maintenance_type, gxt_work_order_status, gxt_order_priority_type,gxt_repair_order_flow_action_type,gxt_order_suspend_reason } = proxy.useDict("gxt_maintenance_type", "gxt_work_order_status", "gxt_order_priority_type","gxt_repair_order_flow_action_type","gxt_order_suspend_reason")
 
 // 数据列表相关
 const repairOrderList = ref([])
@@ -1417,7 +1428,7 @@ const acceptRules = ref({
 // 挂起表单验证规则
 const suspendRules = ref({
   suspendReason: [
-    { required: true, message: "请输入挂起原因", trigger: "blur" }
+    { required: true, message: "请选择挂起原因", trigger: "change" }
   ],
   /*suspendDescription: [
     { required: true, message: "请输入详细说明", trigger: "blur" }
@@ -1426,12 +1437,12 @@ const suspendRules = ref({
 
 // 审批表单验证规则
 const approveRules = ref({
-  approvalStatus: [
+  /*approvalStatus: [
     { required: true, message: "请选择审批决定", trigger: "change" }
   ],
   rejectionReason: [
     { required: true, message: "请输入驳回原因", trigger: "blur" }
-  ]
+  ]*/
 })
 
 // 结单表单验证规则
@@ -1776,14 +1787,21 @@ function handleExport() {
 
 /** 故障代码变化处理 */
 function handleFaultCodeChange(value) {
-  const selectedFaultCode = faultCodeOptions.value.find(item => item.faultCode === value);
-  if (selectedFaultCode) {
-    form.value.faultBarcode = selectedFaultCode.faultBarcode || "";
+  if (value === '无') {
+    // 当选择"无"时,故障条纹设置为"-"并允许手动输入
+    form.value.faultBarcode = "-";
   } else {
-    form.value.faultBarcode = "";
+    // 当选择具体的故障代码时,自动填充故障条纹并设为只读
+    const selectedFaultCode = faultCodeOptions.value.find(item => item.faultCode === value);
+    if (selectedFaultCode) {
+      form.value.faultBarcode = selectedFaultCode.faultBarcode || "";
+    } else {
+      form.value.faultBarcode = "";
+    }
   }
 }
 
+
 /** 获取字典标签文本 */
 function getDictLabel(dictOptions, value) {
   const dict = dictOptions.find(item => item.value === value);
@@ -1918,12 +1936,22 @@ async function submitAccept() {
 
 /** 开始操作 */
 function handleStart(row) {
-  startForm.value = {
+  /*startForm.value = {
     id: row.id,
     workOrderProjectNo: row.workOrderProjectNo,
     pcsDeviceName: row.pcsDeviceName
   }
-  startDialogVisible.value = true
+  startDialogVisible.value = true*/
+  ElMessageBox.confirm('确定要恢复工单"' + row.workOrderProjectNo + '"吗?', '提示', {
+    confirmButtonText: '确认恢复',
+    cancelButtonText: '取消',
+    type: 'warning'
+  }).then(function() {
+    startRepairOrder(row);
+  }).then(() => {
+    getList()
+    proxy.$modal.msgSuccess("恢复成功")
+  }).catch(() => {})
 }
 
 /** 提交开始处理 */
@@ -2131,7 +2159,7 @@ function toggleRejectionReason() {
 }
 
 /** 提交审批 */
-async function submitApprove() {
+async function submitApprove(approvalStatusValue) {
   proxy.$refs["approveFormRef"].validate(async valid => {
     if (valid) {
       try {
@@ -2157,8 +2185,13 @@ async function submitApprove() {
           actionType = "驳回";
           actionRemark = "挂起申请被驳回: " + approveForm.value.rejectionReason;
         }*/
-        if (approveForm.value.approvalStatus === 'approved') {
+        approveForm.value.approvalStatus = approvalStatusValue
+        /*if (approveForm.value.approvalStatus === 'approved') {
           approveForm.value.rejectionReason = undefined;
+        }*/
+        if (approveForm.value.approvalStatus === 'rejected' && !approveForm.value.rejectionReason) {
+          proxy.$modal.msgError("驳回时审批意见不能为空");
+          return;
         }
         await approveSuspendRepairOrder(approveForm.value);