Parcourir la source

Merge remote-tracking branch 'origin/master'

wuhb il y a 5 mois
Parent
commit
7fd00f1628

+ 11 - 0
ygtx-gxt/src/main/java/com/ygtx/gxt/controller/GxtRepairOrderController.java

@@ -339,4 +339,15 @@ public class GxtRepairOrderController extends BaseController
         result.setHasCenter(gxtWorkOrderService.hasCenter());
         return success(result);
     }
+
+    /**
+     * 撤回维修工单
+     */
+    @PreAuthorize("@ss.hasPermi('gxt:repairOrder:revoke')")
+    @Log(title = "维修工单", businessType = BusinessType.UPDATE)
+    @PutMapping("/revoke")
+    public AjaxResult revoke(@RequestBody GxtRepairOrder gxtRepairOrder)
+    {
+        return toAjax(gxtRepairOrderService.revokeGxtRepairOrder(gxtRepairOrder));
+    }
 }

+ 10 - 0
ygtx-gxt/src/main/java/com/ygtx/gxt/domain/GxtOrderData.java

@@ -169,6 +169,16 @@ public class GxtOrderData extends BaseEntity
 
     private String orderCode;
 
+    private Integer restartNum;
+
+    public Integer getRestartNum() {
+        return restartNum;
+    }
+
+    public void setRestartNum(Integer restartNum) {
+        this.restartNum = restartNum;
+    }
+
     public String getOrderCode() {
         return orderCode;
     }

+ 2 - 0
ygtx-gxt/src/main/java/com/ygtx/gxt/service/IGxtRepairOrderService.java

@@ -206,4 +206,6 @@ public interface IGxtRepairOrderService
     public GxtOrderData selectHomePageData();
 
     public int getUnfinishedOrder();
+
+    public int revokeGxtRepairOrder(GxtRepairOrder gxtRepairOrder);
 }

+ 34 - 0
ygtx-gxt/src/main/java/com/ygtx/gxt/service/impl/GxtRepairOrderServiceImpl.java

@@ -229,6 +229,40 @@ public class GxtRepairOrderServiceImpl implements IGxtRepairOrderService
         return result;
     }
 
+    /**
+     * 撤回维修工单
+     *
+     * @param gxtRepairOrder 维修工单
+     * @return 结果
+     */
+    @Override
+    @Transactional
+    public int revokeGxtRepairOrder(GxtRepairOrder gxtRepairOrder)
+    {
+        String nickName = SecurityUtils.getLoginUser().getUser().getNickName();
+        GxtRepairOrder oldOrder = gxtRepairOrderMapper.selectGxtRepairOrderById(gxtRepairOrder.getId());
+        gxtRepairOrder.setUpdateBy(SecurityUtils.getUsername());
+        gxtRepairOrder.setUpdateTime(DateUtils.getNowDate());
+        int result = gxtRepairOrderMapper.updateGxtRepairOrder(gxtRepairOrder);
+
+        // 记录撤回流转信息
+        if (result > 0) {
+            GxtRepairOrderFlow flow = new GxtRepairOrderFlow();
+            flow.setOrderId(oldOrder.getId());
+            flow.setOrderCode(oldOrder.getWorkOrderProjectNo());
+            flow.setActionType("revoke");
+            flow.setFromStatus(oldOrder.getWorkOrderStatus());
+            flow.setToStatus(gxtRepairOrder.getWorkOrderStatus());
+            flow.setOperatorId(SecurityUtils.getUserId());
+            flow.setOperatorName(nickName);
+            flow.setActionTime(DateUtils.getNowDate());
+            flow.setActionRemark("撤回工单");
+            gxtRepairOrderFlowService.insertGxtRepairOrderFlow(flow);
+        }
+
+        return result;
+    }
+
     /**
      * 递归获取部门信息,查找父部门直到level为3
      * @param deptId 部门ID

+ 22 - 13
ygtx-gxt/src/main/resources/mapper/gxt/GxtWorkOrderMapper.xml

@@ -91,6 +91,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         <result property="workOrderNum"    column="workOrderNum" />
         <result property="repairOrderNum"    column="repairOrderNum" />
         <result property="orderCode"    column="order_code" />
+        <result property="restartNum"    column="restart_num" />
     </resultMap>
 
     <sql id="selectGxtWorkOrderVo">
@@ -490,19 +491,22 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         <trim prefix="SELECT" suffixOverrides=",">
             <choose>
                 <when test="(xfsc != null and xfsc == 'true') or (xysc != null and xysc == 'true') or (zbsc != null and zbsc == 'true') or (tjsc != null and tjsc == 'true') or (qjbwsc != null and qjbwsc == 'true') or (clsc != null and clsc == 'true') or (gqsc != null and gqsc == 'true') or (score != null and score == 1)">
-            o.work_order_project_no AS order_code,
-            <if test="workOrderNum != null and workOrderNum == 1">
-                CASE
-                WHEN o.orderType='维保工单' THEN 1
-                ELSE NULL
-                END AS workOrderNum,
-            </if>
-            <if test="repairOrderNum != null and repairOrderNum == 1">
-                CASE
-                WHEN o.orderType='维修工单' THEN 1
-                ELSE NULL
-                END AS repairOrderNum,
-            </if>
+                    o.work_order_project_no AS order_code,
+                    <if test="workOrderNum != null and workOrderNum == 1">
+                        CASE
+                        WHEN o.orderType='维保工单' THEN 1
+                        ELSE NULL
+                        END AS workOrderNum,
+                    </if>
+                    <if test="repairOrderNum != null and repairOrderNum == 1">
+                        CASE
+                        WHEN o.orderType='维修工单' THEN 1
+                        ELSE NULL
+                        END AS repairOrderNum,
+                    </if>
+                    <if test="restartNum != null and restartNum == 1">
+                        o.restart_flag AS restart_num,
+                    </if>
                 </when>
                 <otherwise>
                     <if test="workOrderNum != null and workOrderNum == 1">
@@ -517,6 +521,9 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
                         ELSE NULL
                         END AS repairOrderNum,
                     </if>
+                    <if test="restartNum != null and restartNum == 1">
+                        SUM(o.restart_flag) AS restart_num,
+                    </if>
                 </otherwise>
             </choose>
             <if test="(workOrder != null and workOrder == true) or (repairOrder != null and repairOrder==true)">o.orderType,</if>
@@ -544,6 +551,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
                 wo.pcs_device_name AS `code`,
                 wo.brand,
                 wo.model,
+                IF(wo.repair_method='2', 1, 0) AS restart_flag,
                 wo.mis_no AS `system`,
                 d.dept_name AS pcs,
                 p.dept_name AS center,
@@ -602,6 +610,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
                 wo.pcs_device_name AS `code`,
                 wo.brand,
                 wo.model,
+                IF(wo.repair_method='2', 1, 0) AS restart_flag,
                 NULL AS `system`,
                 d.dept_name AS pcs,
                 p.dept_name AS center,

+ 10 - 1
ygtx-ui/src/api/gxt/repairOrder.js

@@ -116,6 +116,15 @@ export function resumeRepairOrder(data) {
   })
 }
 
+// 恢复维修工单
+export function revokeRepairOrder(data) {
+  return request({
+    url: '/gxt/repairOrder/revoke',
+    method: 'put',
+    data: data
+  })
+}
+
 // 维修工单处理完成(进入待结单状态)
 export function processDoneRepairOrder(data) {
   return request({
@@ -158,4 +167,4 @@ export function selectHomePageData() {
     url: '/gxt/repairOrder/selectHomePageData',
     method: 'get'
   })
-}
+}

+ 30 - 4
ygtx-ui/src/views/gxt/repairOrder/index.vue

@@ -255,6 +255,13 @@
               @click="handleAccept(scope.row)"
               v-hasPermi="['gxt:repairOrder:accept']"
           ><i class="fa fa-check"></i>接单</el-button>
+          <el-button
+              v-if="scope.row.workOrderStatus === 'assigned'"
+              type="warning"
+              link
+              @click="handleRevoke(scope.row)"
+              v-hasPermi="['gxt:repairOrder:revoke']"
+          ><i class="fa fa-reply"></i>撤回</el-button>
           <el-button
               v-if="scope.row.workOrderStatus === 'suspended'"
               type="primary"
@@ -1519,7 +1526,8 @@ import {
   approveSuspendRepairOrder,
   finalizeRepairOrder,
   restartRepairOrder,
-  getRepairOrderByMisOrderNo
+  getRepairOrderByMisOrderNo,
+  revokeRepairOrder
 } from "@/api/gxt/repairOrder";
 import { listDept,getDept } from "@/api/system/dept";
 import { listFaultCodes } from "@/api/gxt/faultCodes"
@@ -1737,10 +1745,10 @@ const loadQuickTeamLeaderList = async () => {
     quickTeamLeaderList.value = allUserList.value;
     return;
   }
-  
+
   // 记录当前维保中心ID
   lastLoadedCenterId.value = acceptForm.value.gxtCenterId;
-  
+
   teamLeaderLoading.value = true
   try {
     // 加载当前部门下的用户列表
@@ -2518,7 +2526,7 @@ function handleAccept(row) {
     if (lastLoadedCenterId.value !== acceptForm.value.gxtCenterId) {
       allUserList.value = [];
     }
-    
+
     // 预加载工作负责人列表
     loadQuickTeamLeaderList()
     acceptDialogVisible.value = true
@@ -2614,6 +2622,24 @@ async function handleResume(row) {
   }).catch(() => {})
 }
 
+/** 撤回工单 */
+async function handleRevoke(row) {
+  ElMessageBox.confirm('确定要撤回工单"' + row.workOrderProjectNo + '"吗?', '提示', {
+    confirmButtonText: '确认撤回',
+    cancelButtonText: '取消',
+    type: 'warning'
+  }).then(function() {
+    const updateData = {
+      id: row.id,
+      workOrderStatus: "to_issue"
+    };
+    revokeRepairOrder(updateData);
+  }).then(() => {
+    getList()
+    proxy.$modal.msgSuccess("撤回成功")
+  }).catch(() => {})
+}
+
 /** 驳回工单 */
 function handleReject(row) {
   approveForm.value = {

+ 0 - 3
ygtx-ui/src/views/gxt/userScore/info.vue

@@ -204,7 +204,6 @@
             <template #default="scope">
               <el-input-number 
                 v-model="scope.row.maintenanceTotalScore" 
-                :min="0" 
                 controls-position="right" 
                 readonly
                 class="full-width-input"
@@ -215,7 +214,6 @@
             <template #default="scope">
               <el-input-number 
                 v-model="scope.row.repairTotalScore" 
-                :min="0" 
                 controls-position="right" 
                 readonly
                 class="full-width-input"
@@ -226,7 +224,6 @@
             <template #default="scope">
               <el-input-number 
                 v-model="scope.row.finalScore" 
-                :min="0" 
                 controls-position="right" 
                 readonly
                 class="full-width-input"

+ 15 - 4
ygtx-ui/src/views/gxt/userScore/scoreSummary.vue

@@ -4,7 +4,7 @@
   <div class="app-container">
     <!-- 页面标题 -->
     <div class="content-header">
-      <h1 class="page-title">月度工分汇总-{{ monthScore.deptName }}</h1>
+      <h1 class="page-title">月度工分汇总<span v-if="!isList" class="dept-name">-{{ monthScore.deptName }}</span></h1>
       <el-select v-if="!isList" style="width: 150px;" v-model="selectedMonth" placeholder="请选择月份" @change="handleMonthChange">
         <el-option
           v-for="item in monthOptions"
@@ -294,7 +294,6 @@
             <template #default="scope">
               <el-input-number 
                 v-model="scope.row.maintenanceTotalScore" 
-                :min="0" 
                 controls-position="right" 
                 readonly
                 class="full-width-input"
@@ -305,7 +304,6 @@
             <template #default="scope">
               <el-input-number 
                 v-model="scope.row.repairTotalScore" 
-                :min="0" 
                 controls-position="right" 
                 readonly
                 class="full-width-input"
@@ -316,7 +314,6 @@
             <template #default="scope">
               <el-input-number 
                 v-model="scope.row.finalScore" 
-                :min="0" 
                 controls-position="right" 
                 readonly
                 class="full-width-input"
@@ -474,6 +471,13 @@ export default {
     }
   },
   watch: {
+    // 监听路由变化,当路由参数发生变化时重新加载数据
+    '$route'() {
+      // 如果是从其他页面返回到当前页面,重新加载数据
+      if(this.$route.name=='ScoreSummary') {
+        this.handleStatusChange();
+      }
+    },
     // 监听 plannedCount 或 actualCount 的变化
     'maintenanceOrderStats.plannedCount': 'calculateDeduction',
     'maintenanceOrderStats.actualCount': 'calculateDeduction'
@@ -935,6 +939,13 @@ export default {
   margin: 0;
 }
 
+.dept-name {
+  font-size: 1.4rem;
+  font-weight: 600;
+  color: #2d3748;
+  font-style: normal;
+}
+
 .card-form {
   border-radius: 10px; /* 统一圆角半径 */
   margin-top: 20px;

+ 14 - 4
ygtx-ui/src/views/index4.vue

@@ -147,7 +147,10 @@
             </div>
             <div id="workorder-content" class="tree-content" :class="{'show': treeExpanded.workorder}">
               <label class="checkbox-item ml-2">
-                <el-checkbox v-model="indicatorFilters.workorder.enabled" label="工单数量" @change="handleWorkorderSelect" />
+                <el-checkbox v-model="indicatorFilters.workorder.workorder" label="工单数量" @change="handleWorkorderSelect" />
+              </label>
+              <label class="checkbox-item ml-2">
+                <el-checkbox v-model="indicatorFilters.workorder.restartNum" label="复位启机数量" @change="handleWorkorderSelect" />
               </label>
             </div>
           </div>
@@ -355,6 +358,7 @@
             <el-table-column v-if="queryParams.chargePerson" prop="chargePerson" label="工作负责人" :width="changeWidth()" header-align="center" align="center"></el-table-column>
             <el-table-column v-if="queryParams.workOrderNum==1" prop="workOrderNum" label="维保工单数" :width="changeWidth()" header-align="center" align="center"></el-table-column>
             <el-table-column v-if="queryParams.repairOrderNum==1" prop="repairOrderNum" label="维修工单数" :width="changeWidth()" header-align="center" align="center"></el-table-column>
+            <el-table-column v-if="queryParams.restartNum==1" prop="restartNum" label="复位启机数量" :width="changeWidth()" header-align="center" align="center"></el-table-column>
             <el-table-column v-if="queryParams.score==1" prop="score" label="工分" :width="changeWidth()" header-align="center" align="center" :formatter="formatScore"></el-table-column>
             <el-table-column v-if="queryParams.tjsc" prop="tjsc" label="停机时长(h)" :width="changeWidth()*1.5" header-align="center" align="center" :formatter="formatScore"></el-table-column>
             <el-table-column v-if="queryParams.xfsc" prop="xfsc" label="下发时长(h)" :width="changeWidth()*1.5" header-align="center" align="center" :formatter="formatScore"></el-table-column>
@@ -416,7 +420,8 @@ export default {
       // 指标筛选数据
       indicatorFilters: {
         workorder: {
-          enabled: false
+          workorder: false,
+          restartNum: false,
         },
         workhour: {
           enabled: false,
@@ -471,6 +476,7 @@ export default {
         chargePerson: false,
         repairOrderNum: null,
         workOrderNum: null,
+        restartNum: null,
         tjsc: false,
         xfsc: false,
         xysc: false,
@@ -614,6 +620,9 @@ export default {
       if (this.queryParams.repairOrderNum==1) {
         num += 1;
       }
+      if (this.queryParams.restartNum==1) {
+        num += 1;
+      }
       if (this.queryParams.score==1) {
         num += 1;
       }
@@ -673,13 +682,14 @@ export default {
       this.queryParams.chargePerson = this.dimensionFilters.other.manager;
 
       // 指标筛选
-      if (this.indicatorFilters.workorder.enabled) {
+      if (this.indicatorFilters.workorder.workorder) {
         this.queryParams.repairOrderNum = 1;
         this.queryParams.workOrderNum = 1;
       }else{
         this.queryParams.repairOrderNum = null;
         this.queryParams.workOrderNum = null;
       }
+      this.queryParams.restartNum = this.indicatorFilters.workorder.restartNum ? 1 : null;
       this.queryParams.tjsc = this.indicatorFilters.workhour.items.tjsc;
       this.queryParams.xfsc = this.indicatorFilters.workhour.items.xfsc;
       this.queryParams.xysc = this.indicatorFilters.workhour.items.xysc;
@@ -793,7 +803,7 @@ export default {
     // 清空除指定类别外的其他指标选择
     clearOtherIndicators(currentCategory) {
       if (currentCategory !== 'workorder') {
-        this.indicatorFilters.workorder.enabled = false;
+        this.indicatorFilters.workorder.workorder = false;
       }
       if (currentCategory !== 'workhour') {
         this.indicatorFilters.workhour.enabled = false;