Просмотр исходного кода

Merge branch 'master' of http://222.243.138.146:2000/ygtx/ygtx_worklog

wuhb 3 месяцев назад
Родитель
Сommit
ab4bb255fc
22 измененных файлов с 868 добавлено и 392 удалено
  1. 0 6
      ygtx-gxt/src/main/java/com/ygtx/gxt/controller/GxtOrderScoreDetailController.java
  2. 64 19
      ygtx-gxt/src/main/java/com/ygtx/gxt/controller/GxtUserScoreController.java
  3. 2 2
      ygtx-gxt/src/main/java/com/ygtx/gxt/domain/GxtWorkOrder.java
  4. 2 0
      ygtx-gxt/src/main/java/com/ygtx/gxt/service/impl/GxtMonthScoreServiceImpl.java
  5. 213 102
      ygtx-gxt/src/main/java/com/ygtx/gxt/service/impl/GxtOrderScoreServiceImpl.java
  6. 166 6
      ygtx-gxt/src/main/java/com/ygtx/gxt/task/EquipmentSafeOperationRewardTask.java
  7. 1 1
      ygtx-gxt/src/main/resources/mapper/gxt/GxtMonthFanInspectionMapper.xml
  8. 1 1
      ygtx-gxt/src/main/resources/mapper/gxt/GxtMonthRepairProjectMapper.xml
  9. 2 2
      ygtx-gxt/src/main/resources/mapper/gxt/GxtOrderScoreMapper.xml
  10. 1 0
      ygtx-gxt/src/main/resources/mapper/gxt/GxtRepairOrderMapper.xml
  11. 1 0
      ygtx-gxt/src/main/resources/mapper/gxt/GxtWorkOrderMapper.xml
  12. 41 40
      ygtx-ui/src/components/gxtOrder/finalize.vue
  13. 1 1
      ygtx-ui/src/components/gxtOrder/view.vue
  14. 49 51
      ygtx-ui/src/components/repairOrder/finalize.vue
  15. 1 1
      ygtx-ui/src/components/repairOrder/view.vue
  16. 21 0
      ygtx-ui/src/views/gxt/gxtOrder/index.vue
  17. 139 76
      ygtx-ui/src/views/gxt/monthScore/index.vue
  18. 140 77
      ygtx-ui/src/views/gxt/monthScore/info.vue
  19. 11 0
      ygtx-ui/src/views/gxt/orderMyTodo/index.vue
  20. 5 5
      ygtx-ui/src/views/gxt/orderScore/index.vue
  21. 5 0
      ygtx-ui/src/views/gxt/repairOrder/index.vue
  22. 2 2
      ygtx-ui/src/views/gxt/userScore/userScorePage.vue

+ 0 - 6
ygtx-gxt/src/main/java/com/ygtx/gxt/controller/GxtOrderScoreDetailController.java

@@ -37,7 +37,6 @@ public class GxtOrderScoreDetailController extends BaseController
     /**
      * 查询工单个人分数明细列表
      */
-    @PreAuthorize("@ss.hasPermi('gxt:orderScoreDetail:list')")
     @GetMapping("/list")
     public TableDataInfo list(GxtOrderScoreDetail gxtOrderScoreDetail)
     {
@@ -49,7 +48,6 @@ public class GxtOrderScoreDetailController extends BaseController
     /**
      * 导出工单个人分数明细列表
      */
-    @PreAuthorize("@ss.hasPermi('gxt:orderScoreDetail:export')")
     @Log(title = "工单个人分数明细", businessType = BusinessType.EXPORT)
     @PostMapping("/export")
     public void export(HttpServletResponse response, GxtOrderScoreDetail gxtOrderScoreDetail)
@@ -62,7 +60,6 @@ public class GxtOrderScoreDetailController extends BaseController
     /**
      * 获取工单个人分数明细详细信息
      */
-    @PreAuthorize("@ss.hasPermi('gxt:orderScoreDetail:query')")
     @GetMapping(value = "/{id}")
     public AjaxResult getInfo(@PathVariable("id") Long id)
     {
@@ -72,7 +69,6 @@ public class GxtOrderScoreDetailController extends BaseController
     /**
      * 新增工单个人分数明细
      */
-    @PreAuthorize("@ss.hasPermi('gxt:orderScoreDetail:add')")
     @Log(title = "工单个人分数明细", businessType = BusinessType.INSERT)
     @PostMapping
     public AjaxResult add(@RequestBody GxtOrderScoreDetail gxtOrderScoreDetail)
@@ -83,7 +79,6 @@ public class GxtOrderScoreDetailController extends BaseController
     /**
      * 修改工单个人分数明细
      */
-    @PreAuthorize("@ss.hasPermi('gxt:orderScoreDetail:edit')")
     @Log(title = "工单个人分数明细", businessType = BusinessType.UPDATE)
     @PutMapping
     public AjaxResult edit(@RequestBody GxtOrderScoreDetail gxtOrderScoreDetail)
@@ -94,7 +89,6 @@ public class GxtOrderScoreDetailController extends BaseController
     /**
      * 删除工单个人分数明细
      */
-    @PreAuthorize("@ss.hasPermi('gxt:orderScoreDetail:remove')")
     @Log(title = "工单个人分数明细", businessType = BusinessType.DELETE)
 	@DeleteMapping("/{ids}")
     public AjaxResult remove(@PathVariable Long[] ids)

+ 64 - 19
ygtx-gxt/src/main/java/com/ygtx/gxt/controller/GxtUserScoreController.java

@@ -8,7 +8,10 @@ import java.util.stream.Collectors;
 import javax.servlet.http.HttpServletResponse;
 
 import com.github.pagehelper.util.StringUtil;
+import com.ygtx.common.constant.HttpStatus;
 import com.ygtx.common.core.domain.entity.SysDept;
+import com.ygtx.common.core.page.PageDomain;
+import com.ygtx.common.core.page.TableSupport;
 import com.ygtx.gxt.domain.*;
 import com.ygtx.gxt.domain.GxtUserScoreSubmissionDTO;
 import com.ygtx.gxt.service.*;
@@ -156,13 +159,57 @@ public class GxtUserScoreController extends BaseController
     }
 
     @GetMapping("/getWorkOrderByMonth")
-    public AjaxResult getWorkOrderByMonth(GxtWorkOrder workOrder) {
-        return success(gxtMonthScoreService.getWorkOrderByMonth(workOrder.getModel(),workOrder.getInspectionType(),workOrder.getPcsStationPid(),workOrder.getMonthPeriod()));
+    public TableDataInfo getWorkOrderByMonth(GxtWorkOrder workOrder) {
+        PageDomain pageDomain = TableSupport.buildPageRequest();
+        Integer pageNum = pageDomain.getPageNum();
+        Integer pageSize = pageDomain.getPageSize();
+        List<GxtWorkOrder> list = gxtMonthScoreService.getWorkOrderByMonth(workOrder.getModel(),workOrder.getInspectionType(),workOrder.getPcsStationPid(),workOrder.getMonthPeriod());
+        List<GxtWorkOrder> result = new ArrayList<>();
+        int total = list.size();
+        if (pageNum!=null&&pageSize!=null) {
+            if (pageNum!=null && pageSize!=null) {
+                int from = (pageNum-1) * pageSize;
+                int to = pageNum * pageSize;
+                if (to>=total) {
+                    result.addAll(list.subList(from,total));
+                }else {
+                    result.addAll(list.subList(from, to));
+                }
+            }
+        }
+        TableDataInfo dataInfo = new TableDataInfo();
+        dataInfo.setCode(HttpStatus.SUCCESS);
+        dataInfo.setMsg("查询成功");
+        dataInfo.setTotal(total);
+        dataInfo.setRows(result);
+        return dataInfo;
     }
 
     @GetMapping("/getRepairOrderByMonth")
-    public AjaxResult getRepairOrderByMonth(GxtRepairOrder repairOrder) {
-        return success(gxtMonthScoreService.getRepairOrderByMonth(repairOrder.getMaintenanceType(),repairOrder.getPcsStationPid(),repairOrder.getMonthPeriod()));
+    public TableDataInfo getRepairOrderByMonth(GxtRepairOrder repairOrder) {
+        PageDomain pageDomain = TableSupport.buildPageRequest();
+        Integer pageNum = pageDomain.getPageNum();
+        Integer pageSize = pageDomain.getPageSize();
+        List<GxtRepairOrder> list = gxtMonthScoreService.getRepairOrderByMonth(repairOrder.getMaintenanceType(),repairOrder.getPcsStationPid(),repairOrder.getMonthPeriod());
+        List<GxtRepairOrder> result = new ArrayList<>();
+        int total = list.size();
+        if (pageNum!=null&&pageSize!=null) {
+            if (pageNum!=null && pageSize!=null) {
+                int from = (pageNum-1) * pageSize;
+                int to = pageNum * pageSize;
+                if (to>=total) {
+                    result.addAll(list.subList(from,total));
+                }else {
+                    result.addAll(list.subList(from, to));
+                }
+            }
+        }
+        TableDataInfo dataInfo = new TableDataInfo();
+        dataInfo.setCode(HttpStatus.SUCCESS);
+        dataInfo.setMsg("查询成功");
+        dataInfo.setTotal(total);
+        dataInfo.setRows(result);
+        return dataInfo;
     }
 
     @ApiOperation("根据ID获取月度工分汇总")
@@ -235,23 +282,21 @@ public class GxtUserScoreController extends BaseController
         monthScore.setDeptId(deptId);
         List<GxtMonthScore> monthScoreList = gxtMonthScoreService.selectGxtMonthScoreList(monthScore);
         if (!monthScoreList.isEmpty()) {
+            Collections.sort(monthScoreList, new Comparator<GxtMonthScore>() {
+                @Override
+                public int compare(GxtMonthScore o1, GxtMonthScore o2) {
+                    return o2.getMonthPeriod().compareTo(o1.getMonthPeriod());
+                }
+            });
+            dictList.clear();
             for (GxtMonthScore monthScore1:monthScoreList) {
                 String monthValue = monthScore1.getMonthPeriod();
-                boolean isOld = false;
-                for (Map<String, String> dict:dictList) {
-                    if (dict.get("value").equals(monthValue)) {
-                        isOld = true;
-                        break;
-                    }
-                }
-                if (!isOld) {
-                    String[] months = monthValue.split("-");
-                    String monthLabel = months[0] + "年" + months[1] + "月";
-                    dictList.add(new HashMap<String, String>() {{
-                        put("value", monthValue);
-                        put("label", monthLabel);
-                    }});
-                }
+                String[] months = monthValue.split("-");
+                String monthLabel = months[0] + "年" + months[1] + "月";
+                dictList.add(new HashMap<String, String>() {{
+                    put("value", monthValue);
+                    put("label", monthLabel);
+                }});
             }
         }
         AjaxResult ajax = AjaxResult.success();

+ 2 - 2
ygtx-gxt/src/main/java/com/ygtx/gxt/domain/GxtWorkOrder.java

@@ -32,8 +32,8 @@ public class GxtWorkOrder extends BaseEntity
     @Excel(name = "风机编号")
     private String pcsDeviceName;
 
-    /** 工单状态:draft-草稿,to_assign-待派单,assigned-已派单,accepted-已接单,processing-处理中,paused-暂停中,to_approve-待审批,suspended-已挂起,completed-已完成 */
-    @Excel(name = "工单状态", readConverterExp = "draft=草稿,to_assign=待派单,assigned=已派单,accepted=已接单,processing=处理中,paused=暂停中,to_approve=待审批,suspended=已挂起,completed=已完成,to_finish=待结单,to_archive=待归档,archived=已归档")
+    /** 工单状态:draft-草稿,to_assign-待派单,assigned-待接单,accepted-已接单,processing-处理中,paused-暂停中,to_approve-待审批,suspended-已挂起,completed-已完成 */
+    @Excel(name = "工单状态", readConverterExp = "draft=草稿,to_assign=待派单,assigned=待接单,accepted=已接单,processing=处理中,paused=暂停中,to_approve=待审批,suspended=已挂起,completed=已完成,to_finish=待结单,to_archive=待归档,archived=已归档")
     private String workOrderStatus;
 
     /** 工单录入类别(1默认,2补录工单) */

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

@@ -113,6 +113,7 @@ public class GxtMonthScoreServiceImpl implements IGxtMonthScoreService
         workOrder.setInspectionType(inspectionTypeId);
         workOrder.setPcsStationPid(pid);
         workOrder.setMonthPeriod(monthPeriod);
+        workOrder.setWorkOrderStatus("archived");
         addBusinessDataScopeFilter(workOrder);
         return gxtWorkOrderMapper.selectGxtWorkOrderListByMonth(workOrder);
     }
@@ -489,6 +490,7 @@ public class GxtMonthScoreServiceImpl implements IGxtMonthScoreService
         repairOrder.setMaintenanceType(maintenanceType);
         repairOrder.setPcsStationPid(pid);
         repairOrder.setMonthPeriod(monthPeriod);
+        repairOrder.setWorkOrderStatus("archived");
         addBusinessDataScopeFilter(repairOrder);
         return gxtRepairOrderMapper.selectGxtRepairOrderListByMonth(repairOrder);
     }

+ 213 - 102
ygtx-gxt/src/main/java/com/ygtx/gxt/service/impl/GxtOrderScoreServiceImpl.java

@@ -13,6 +13,7 @@ import com.ygtx.framework.web.service.SysPermissionService;
 import com.ygtx.gxt.domain.*;
 import com.ygtx.gxt.mapper.GxtOrderScoreMapper;
 import com.ygtx.gxt.mapper.GxtRepairOrderMapper;
+import com.ygtx.gxt.mapper.GxtUserScoreMapper;
 import com.ygtx.gxt.mapper.GxtWorkOrderMapper;
 import com.ygtx.gxt.service.*;
 import com.ygtx.system.mapper.SysDeptMapper;
@@ -88,6 +89,12 @@ public class GxtOrderScoreServiceImpl implements IGxtOrderScoreService {
     @Autowired
     private GxtWorkOrderMapper gxtWorkOrderMapper;
 
+    @Autowired
+    private IGxtOrderScoreDetailService gxtOrderScoreDetailService;
+
+    @Autowired
+    private GxtUserScoreMapper gxtUserScoreMapper;
+
     /**
      * 查询合并的工单列表(维修工单和维保工单)
      *
@@ -177,115 +184,44 @@ public class GxtOrderScoreServiceImpl implements IGxtOrderScoreService {
      */
     @Override
     public Map<String, Object> getOrderScoreStatistics(GxtRepairOrder repairOrder, GxtWorkOrder workOrder, String month) {
-        // 添加业务特定的数据权限过滤
-        addBusinessDataScopeFilter(repairOrder, workOrder);
-
-        // 设置创建人,用于数据权限过滤
-        if(!Constants.SUPER_ADMIN.equals(SecurityUtils.getUsername())){
-            if (repairOrder.getCreateBy() == null || repairOrder.getCreateBy().isEmpty()) {
-                repairOrder.setCreateBy(SecurityUtils.getUsername());
-            }
-
-            if (workOrder.getCreateBy() == null || workOrder.getCreateBy().isEmpty()) {
-                workOrder.setCreateBy(SecurityUtils.getUsername());
-            }
-        }
-
         Map<String, Object> result = new HashMap<>();
-        Long currentUserId = SecurityUtils.getUserId();
-        if(currentUserId != null){
-            // 添加用户ID参数用于Mapper查询
-            repairOrder.getParams().put("currentUserId", currentUserId);
-            workOrder.getParams().put("currentUserId", currentUserId);
-
-            Map<String, Object> statistics = gxtOrderScoreMapper.selectOrderScoreStatistics(repairOrder, workOrder, month);
-
-            // 计算总工分
-            Object maintenanceScoreObj = statistics.get("maintenanceScore");
-            Object repairScoreObj = statistics.get("repairScore");
-
-            double maintenanceScore = maintenanceScoreObj != null ? ((Number) maintenanceScoreObj).doubleValue() : 0.0;
-            double repairScore = repairScoreObj != null ? ((Number) repairScoreObj).doubleValue() : 0.0;
-            double totalScore = maintenanceScore + repairScore;
+        String userName = SecurityUtils.getUsername();
+        if(StringUtils.isNotEmpty(userName)){
+            // 添加用户ID参数用于Mapper查询 gxtUserScoreMapper
+            GxtUserScore gxtUserScore = new GxtUserScore();
+            gxtUserScore.setUserName(userName);
+            gxtUserScore.setMonthPeriod( month);
+            List<GxtUserScore> gxtUserScores = gxtUserScoreMapper.selectGxtUserScoreList(gxtUserScore);
+            
+            // 计算工分并赋值给result中的totalScore、maintenanceScore、repairScore
+            BigDecimal totalScore = BigDecimal.ZERO;
+            BigDecimal maintenanceScore = BigDecimal.ZERO;
+            BigDecimal repairScore = BigDecimal.ZERO;
+            
+            for (GxtUserScore userScore : gxtUserScores) {
+                // 累加维护总分
+                if (userScore.getMaintenanceTotalScore() != null) {
+                    maintenanceScore = maintenanceScore.add(userScore.getMaintenanceTotalScore());
+                }
+                // 累加维修总分
+                if (userScore.getRepairTotalScore() != null) {
+                    repairScore = repairScore.add(userScore.getRepairTotalScore());
+                }
+                // 累加最终得分
+                if (userScore.getFinalScore() != null) {
+                    totalScore = totalScore.add(userScore.getFinalScore());
+                }
+            }
+            
+            /*result.put("totalScore", totalScore.doubleValue());
+            result.put("maintenanceScore", maintenanceScore.doubleValue());
+            result.put("repairScore", repairScore.doubleValue());*/
 
             result.put("totalScore", totalScore);
             result.put("maintenanceScore", maintenanceScore);
             result.put("repairScore", repairScore);
-            result.put("maintenanceCount", statistics.get("maintenanceCount"));
-            result.put("repairCount", statistics.get("repairCount"));
         }
         return result;
-        /*// 如果用户的数据权限是"仅本人数据",则只统计本人的工分
-        if (isCurrentUserDataScopeSelf()) {
-            Long currentUserId = SecurityUtils.getUserId();
-            if (currentUserId != null) {
-                // 添加用户ID参数用于Mapper查询
-                repairOrder.getParams().put("currentUserId", currentUserId);
-                workOrder.getParams().put("currentUserId", currentUserId);
-
-                // 直接使用Mapper查询,避免加载大量数据到内存
-                Map<String, Object> statistics = gxtOrderScoreMapper.selectOrderScoreStatistics(repairOrder, workOrder, month);
-
-                // 计算总工分
-                Object maintenanceScoreObj = statistics.get("maintenanceScore");
-                Object repairScoreObj = statistics.get("repairScore");
-
-                double maintenanceScore = maintenanceScoreObj != null ? ((Number) maintenanceScoreObj).doubleValue() : 0.0;
-                double repairScore = repairScoreObj != null ? ((Number) repairScoreObj).doubleValue() : 0.0;
-                double totalScore = maintenanceScore + repairScore;
-
-                result.put("totalScore", totalScore);
-                result.put("maintenanceScore", maintenanceScore);
-                result.put("repairScore", repairScore);
-                result.put("maintenanceCount", statistics.get("maintenanceCount"));
-                result.put("repairCount", statistics.get("repairCount"));
-
-                // 计算排名
-                int rank = calculateUserRankInStation(repairOrder, workOrder, month);
-                result.put("rank", rank);
-
-                // 计算场站总人数
-                LoginUser loginUser = SecurityUtils.getLoginUser();
-                if (loginUser != null && loginUser.getUser() != null) {
-                    Long deptId = loginUser.getUser().getDeptId();
-                    if (deptId != null) {
-                        List<Long> stationUserIds = getStationUserIds(deptId);
-                        // 确保至少包含当前用户
-                        if (stationUserIds.isEmpty() && currentUserId != null) {
-                            stationUserIds = new ArrayList<>();
-                            stationUserIds.add(currentUserId);
-                        }
-                        result.put("totalRankingUsers", stationUserIds.size());
-                    } else {
-                        // 如果没有部门信息,至少当前用户参与排名
-                        result.put("totalRankingUsers", 1);
-                    }
-                } else {
-                    // 如果无法获取用户信息,至少当前用户参与排名
-                    result.put("totalRankingUsers", 1);
-                }
-
-                return result;
-            }
-        }
-
-        // 获取统计信息(非"仅本人数据"权限用户或其他情况)
-        Map<String, Object> statistics = gxtOrderScoreMapper.selectOrderScoreStatistics(repairOrder, workOrder, month);
-        result.putAll(statistics);
-
-        // 计算总工分
-        Object maintenanceScoreObj = statistics.get("maintenanceScore");
-        Object repairScoreObj = statistics.get("repairScore");
-
-        double maintenanceScore = maintenanceScoreObj != null ? ((Number) maintenanceScoreObj).doubleValue() : 0.0;
-        double repairScore = repairScoreObj != null ? ((Number) repairScoreObj).doubleValue() : 0.0;
-        double totalScore = maintenanceScore + repairScore;
-
-        result.put("totalScore", totalScore);
-        result.put("maintenanceScore", maintenanceScore);
-        result.put("repairScore", repairScore);
-
-        return result;*/
     }
 
     /**
@@ -766,6 +702,9 @@ public class GxtOrderScoreServiceImpl implements IGxtOrderScoreService {
                 if ("to_archive".equals(order.getScoringStatus()) || "archived".equals(order.getScoringStatus())) {
                     // 更新月度统计数据
                     updateMonthlyScoreData(orderScoreInfo);
+                    
+                    // 添加工单个人分数明细数据
+                    addOrderScoreDetails(orderScoreInfo, order);
                 }
                 return result;
             } else if (orderScoreInfo.getOrderType() == 2) {
@@ -868,6 +807,9 @@ public class GxtOrderScoreServiceImpl implements IGxtOrderScoreService {
                 if ("to_archive".equals(order.getScoringStatus()) || "archived".equals(order.getScoringStatus())) {
                     // 更新月度统计数据
                     updateMonthlyScoreData(orderScoreInfo);
+                    
+                    // 添加工单个人分数明细数据
+                    addOrderScoreDetails(orderScoreInfo, order);
                 }
                 return result;
             }
@@ -2538,4 +2480,173 @@ public class GxtOrderScoreServiceImpl implements IGxtOrderScoreService {
             }
         }
     }
+    
+    /**
+     * 添加工单个人分数明细数据
+     * 将工单个人分数明细保存到GxtOrderScoreDetail表
+     * 
+     * @param orderScoreInfo 工单评分信息
+     * @param order 工单对象
+     */
+    private void addOrderScoreDetails(OrderScoreInfo orderScoreInfo, Object order) {
+        try {
+            if (orderScoreInfo.getScorePersonList() != null && !orderScoreInfo.getScorePersonList().isEmpty()) {
+                for (OrderScorePerson person : orderScoreInfo.getScorePersonList()) {
+                    GxtOrderScoreDetail detail = new GxtOrderScoreDetail();
+                    
+                    // 设置基础信息
+                    detail.setUserId(person.getUserId());
+                    detail.setNickName(person.getNickName());
+                    detail.setOrderType(orderScoreInfo.getOrderType());
+                    
+                    // 设置工单相关信息
+                    /*if (orderScoreInfo.getOrderType() == 1) { // 维修工单
+                        GxtRepairOrder repairOrder = (GxtRepairOrder) order;
+                        detail.setOrderId(repairOrder.getId());
+                        detail.setOrderCode(repairOrder.getWorkOrderProjectNo());
+                    } else if (orderScoreInfo.getOrderType() == 2) { // 维保工单
+                        GxtWorkOrder workOrder = (GxtWorkOrder) order;
+                        detail.setOrderId(workOrder.getId());
+                        detail.setOrderCode(workOrder.getWorkOrderProjectNo());
+                    }*/
+                    detail.setOrderId(orderScoreInfo.getId());
+                    detail.setOrderCode(orderScoreInfo.getWorkOrderProjectNo());
+                    // 设置分数类型和分数(这里可以根据实际需要调整)
+                    detail.setScoreType(1); // 工单得分
+                    
+                    // 设置具体分数(工单得分)
+                    if (person.getTotalScore() != null) {
+                        detail.setScore(BigDecimal.valueOf(person.getTotalScore()));
+                        detail.setRateScore(BigDecimal.valueOf(person.getTotalScore()));
+                    }
+                    detail.setCreateBy(SecurityUtils.getLoginUser().getUser().getUserName());
+                    detail.setCreateTime(new Date());
+                    // 保存到数据库
+                    gxtOrderScoreDetailService.insertGxtOrderScoreDetail(detail);
+                }
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
+    /**
+     * 获取工单评分统计信息V0
+     *
+     * @param repairOrder 维修工单查询条件
+     * @param workOrder 维保工单查询条件
+     * @param month 月份筛选条件
+     * @return 统计信息
+     */
+    public Map<String, Object> getOrderScoreStatisticsV0(GxtRepairOrder repairOrder, GxtWorkOrder workOrder, String month) {
+        // 添加业务特定的数据权限过滤
+        addBusinessDataScopeFilter(repairOrder, workOrder);
+
+        // 设置创建人,用于数据权限过滤
+        if(!Constants.SUPER_ADMIN.equals(SecurityUtils.getUsername())){
+            if (repairOrder.getCreateBy() == null || repairOrder.getCreateBy().isEmpty()) {
+                repairOrder.setCreateBy(SecurityUtils.getUsername());
+            }
+
+            if (workOrder.getCreateBy() == null || workOrder.getCreateBy().isEmpty()) {
+                workOrder.setCreateBy(SecurityUtils.getUsername());
+            }
+        }
+
+        Map<String, Object> result = new HashMap<>();
+        Long currentUserId = SecurityUtils.getUserId();
+        if(currentUserId != null){
+            // 添加用户ID参数用于Mapper查询
+            repairOrder.getParams().put("currentUserId", currentUserId);
+            workOrder.getParams().put("currentUserId", currentUserId);
+
+            Map<String, Object> statistics = gxtOrderScoreMapper.selectOrderScoreStatistics(repairOrder, workOrder, month);
+
+            // 计算总工分
+            Object maintenanceScoreObj = statistics.get("maintenanceScore");
+            Object repairScoreObj = statistics.get("repairScore");
+
+            double maintenanceScore = maintenanceScoreObj != null ? ((Number) maintenanceScoreObj).doubleValue() : 0.0;
+            double repairScore = repairScoreObj != null ? ((Number) repairScoreObj).doubleValue() : 0.0;
+            double totalScore = maintenanceScore + repairScore;
+
+            result.put("totalScore", totalScore);
+            result.put("maintenanceScore", maintenanceScore);
+            result.put("repairScore", repairScore);
+            result.put("maintenanceCount", statistics.get("maintenanceCount"));
+            result.put("repairCount", statistics.get("repairCount"));
+        }
+        return result;
+        /*// 如果用户的数据权限是"仅本人数据",则只统计本人的工分
+        if (isCurrentUserDataScopeSelf()) {
+            Long currentUserId = SecurityUtils.getUserId();
+            if (currentUserId != null) {
+                // 添加用户ID参数用于Mapper查询
+                repairOrder.getParams().put("currentUserId", currentUserId);
+                workOrder.getParams().put("currentUserId", currentUserId);
+
+                // 直接使用Mapper查询,避免加载大量数据到内存
+                Map<String, Object> statistics = gxtOrderScoreMapper.selectOrderScoreStatistics(repairOrder, workOrder, month);
+
+                // 计算总工分
+                Object maintenanceScoreObj = statistics.get("maintenanceScore");
+                Object repairScoreObj = statistics.get("repairScore");
+
+                double maintenanceScore = maintenanceScoreObj != null ? ((Number) maintenanceScoreObj).doubleValue() : 0.0;
+                double repairScore = repairScoreObj != null ? ((Number) repairScoreObj).doubleValue() : 0.0;
+                double totalScore = maintenanceScore + repairScore;
+
+                result.put("totalScore", totalScore);
+                result.put("maintenanceScore", maintenanceScore);
+                result.put("repairScore", repairScore);
+                result.put("maintenanceCount", statistics.get("maintenanceCount"));
+                result.put("repairCount", statistics.get("repairCount"));
+
+                // 计算排名
+                int rank = calculateUserRankInStation(repairOrder, workOrder, month);
+                result.put("rank", rank);
+
+                // 计算场站总人数
+                LoginUser loginUser = SecurityUtils.getLoginUser();
+                if (loginUser != null && loginUser.getUser() != null) {
+                    Long deptId = loginUser.getUser().getDeptId();
+                    if (deptId != null) {
+                        List<Long> stationUserIds = getStationUserIds(deptId);
+                        // 确保至少包含当前用户
+                        if (stationUserIds.isEmpty() && currentUserId != null) {
+                            stationUserIds = new ArrayList<>();
+                            stationUserIds.add(currentUserId);
+                        }
+                        result.put("totalRankingUsers", stationUserIds.size());
+                    } else {
+                        // 如果没有部门信息,至少当前用户参与排名
+                        result.put("totalRankingUsers", 1);
+                    }
+                } else {
+                    // 如果无法获取用户信息,至少当前用户参与排名
+                    result.put("totalRankingUsers", 1);
+                }
+
+                return result;
+            }
+        }
+
+        // 获取统计信息(非"仅本人数据"权限用户或其他情况)
+        Map<String, Object> statistics = gxtOrderScoreMapper.selectOrderScoreStatistics(repairOrder, workOrder, month);
+        result.putAll(statistics);
+
+        // 计算总工分
+        Object maintenanceScoreObj = statistics.get("maintenanceScore");
+        Object repairScoreObj = statistics.get("repairScore");
+
+        double maintenanceScore = maintenanceScoreObj != null ? ((Number) maintenanceScoreObj).doubleValue() : 0.0;
+        double repairScore = repairScoreObj != null ? ((Number) repairScoreObj).doubleValue() : 0.0;
+        double totalScore = maintenanceScore + repairScore;
+
+        result.put("totalScore", totalScore);
+        result.put("maintenanceScore", maintenanceScore);
+        result.put("repairScore", repairScore);
+
+        return result;*/
+    }
 }

+ 166 - 6
ygtx-gxt/src/main/java/com/ygtx/gxt/task/EquipmentSafeOperationRewardTask.java

@@ -9,12 +9,7 @@ import com.ygtx.framework.web.service.SysPermissionService;
 import com.ygtx.gxt.domain.*;
 import com.ygtx.gxt.mapper.GxtRepairOrderMapper;
 import com.ygtx.gxt.mapper.GxtWorkOrderMapper;
-import com.ygtx.gxt.service.IGxtEquipmentService;
-import com.ygtx.gxt.service.IGxtMonthScoreService;
-import com.ygtx.gxt.service.IGxtRepairOrderService;
-import com.ygtx.gxt.service.IGxtSafeOperationRewardService;
-import com.ygtx.gxt.service.IGxtUserScoreService;
-import com.ygtx.gxt.service.IGxtWorkOrderService;
+import com.ygtx.gxt.service.*;
 import com.ygtx.system.mapper.SysUserMapper;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -63,6 +58,9 @@ public class EquipmentSafeOperationRewardTask {
     @Autowired
     private SysUserMapper userMapper;
 
+    @Autowired
+    private IGxtOrderScoreDetailService orderScoreDetailService;
+
     @Autowired
     private SysPermissionService permissionService;
 
@@ -630,6 +628,9 @@ public class EquipmentSafeOperationRewardTask {
             // 批量更新人员得分
             int result = repairOrderService.updateRepairOrderPersonList(updatedPersons);
             log.info("维修工单 {} 共更新 {} 名人员的运行得分和总得分", repairOrder.getWorkOrderProjectNo(), updatedPersons.size());
+            
+            // 添加工单个人分数明细数据
+            addOrderScoreDetailsForRunScoreRepair(repairOrder, persons, rewardScore, 2); // 2代表运行得分
 
             /*double totalScore = persons.stream()
                     .mapToDouble(person -> person.getTotalScore() != null ? person.getTotalScore() : 0.0)
@@ -682,6 +683,9 @@ public class EquipmentSafeOperationRewardTask {
             // 批量更新人员得分
             int result = workOrderService.updateWorkOrderPersonList(updatedPersons);
             log.info("维保工单 {} 共更新 {} 名人员的运行得分和总得分", workOrder.getWorkOrderProjectNo(), updatedPersons.size());
+            
+            // 添加工单个人分数明细数据
+            addOrderScoreDetailsForRunScoreWork(workOrder, persons, rewardScore, 2); // 2代表运行得分
 
             /*double totalScore = persons.stream()
                     .mapToDouble(person -> person.getTotalScore() != null ? person.getTotalScore() : 0.0)
@@ -734,6 +738,9 @@ public class EquipmentSafeOperationRewardTask {
             // 批量更新人员得分
             int result = repairOrderService.updateRepairOrderPersonList(updatedPersons);
             log.info("维修工单 {} 共更新 {} 名人员的停机扣分和总得分", repairOrder.getWorkOrderProjectNo(), updatedPersons.size());
+            
+            // 添加工单个人分数明细数据
+            addOrderScoreDetailsForStopScoreRepair(repairOrder, persons, deductionScore, 3); // 3代表停机扣分
         } catch (Exception e) {
             log.error("更新维修工单 {} 人员停机扣分时发生异常", repairOrder.getWorkOrderProjectNo(), e);
         }
@@ -779,6 +786,9 @@ public class EquipmentSafeOperationRewardTask {
             // 批量更新人员得分
             int result = workOrderService.updateWorkOrderPersonList(updatedPersons);
             log.info("维保工单 {} 共更新 {} 名人员的停机扣分和总得分", workOrder.getWorkOrderProjectNo(), updatedPersons.size());
+            
+            // 添加工单个人分数明细数据
+            addOrderScoreDetailsForStopScoreWork(workOrder, persons, deductionScore, 3); // 3代表停机扣分
         } catch (Exception e) {
             log.error("更新维保工单 {} 人员停机扣分时发生异常", workOrder.getWorkOrderProjectNo(), e);
         }
@@ -1079,4 +1089,154 @@ public class EquipmentSafeOperationRewardTask {
     }
     
 
+    /**
+     * 添加运行得分的工单个人分数明细数据
+     * 
+     * @param repairOrder 维修工单
+     * @param persons 更新的人员列表
+     * @param rewardScore 奖励分数
+     * @param scoreType 分数类型
+     */
+    private void addOrderScoreDetailsForRunScoreRepair(GxtRepairOrder repairOrder, List<GxtRepairOrderPerson> persons, BigDecimal rewardScore, int scoreType) {
+        try {
+            for (GxtRepairOrderPerson person : persons) {
+                GxtOrderScoreDetail detail = new GxtOrderScoreDetail();
+                
+                // 设置基础信息
+                detail.setUserId(person.getUserId());
+                detail.setNickName(person.getNickName());
+                detail.setOrderType(1); // 维修工单
+                
+                // 设置工单相关信息
+                detail.setOrderId(repairOrder.getId());
+                detail.setOrderCode(repairOrder.getWorkOrderProjectNo());
+                
+                // 设置分数类型和分数
+                detail.setScoreType(scoreType); // 运行得分
+                detail.setScore(rewardScore);
+                detail.setRunScore(rewardScore);
+
+                detail.setCreateBy(SecurityUtils.getLoginUser().getUser().getUserName());
+                detail.setCreateTime(new Date());
+                // 保存到数据库
+                orderScoreDetailService.insertGxtOrderScoreDetail(detail);
+            }
+        } catch (Exception e) {
+            log.error("添加维修工单运行得分明细时发生异常", e);
+        }
+    }
+    
+    /**
+     * 添加运行得分的工单个人分数明细数据
+     * 
+     * @param workOrder 维保工单
+     * @param persons 更新的人员列表
+     * @param rewardScore 奖励分数
+     * @param scoreType 分数类型
+     */
+    private void addOrderScoreDetailsForRunScoreWork(GxtWorkOrder workOrder, List<GxtWorkOrderPerson> persons, BigDecimal rewardScore, int scoreType) {
+        try {
+            for (GxtWorkOrderPerson person : persons) {
+                GxtOrderScoreDetail detail = new GxtOrderScoreDetail();
+                
+                // 设置基础信息
+                detail.setUserId(person.getUserId());
+                detail.setNickName(person.getNickName());
+                detail.setOrderType(2); // 维保工单
+                
+                // 设置工单相关信息
+                detail.setOrderId(workOrder.getId());
+                detail.setOrderCode(workOrder.getWorkOrderProjectNo());
+                
+                // 设置分数类型和分数
+                detail.setScoreType(scoreType); // 运行得分
+                detail.setScore(rewardScore);
+                detail.setRunScore(rewardScore);
+
+                detail.setCreateBy(SecurityUtils.getLoginUser().getUser().getUserName());
+                detail.setCreateTime(new Date());
+                
+                // 保存到数据库
+                orderScoreDetailService.insertGxtOrderScoreDetail(detail);
+            }
+        } catch (Exception e) {
+            log.error("添加维保工单运行得分明细时发生异常", e);
+        }
+    }
+    
+    /**
+     * 添加停机扣分的工单个人分数明细数据
+     * 
+     * @param repairOrder 维修工单
+     * @param persons 更新的人员列表
+     * @param deductionScore 扣分分数
+     * @param scoreType 分数类型
+     */
+    private void addOrderScoreDetailsForStopScoreRepair(GxtRepairOrder repairOrder, List<GxtRepairOrderPerson> persons, BigDecimal deductionScore, int scoreType) {
+        try {
+            for (GxtRepairOrderPerson person : persons) {
+                GxtOrderScoreDetail detail = new GxtOrderScoreDetail();
+                
+                // 设置基础信息
+                detail.setUserId(person.getUserId());
+                detail.setNickName(person.getNickName());
+                detail.setOrderType(1); // 维修工单
+                
+                // 设置工单相关信息
+                detail.setOrderId(repairOrder.getId());
+                detail.setOrderCode(repairOrder.getWorkOrderProjectNo());
+                
+                // 设置分数类型和分数
+                detail.setScoreType(scoreType); // 停机扣分
+                detail.setScore(deductionScore);
+                detail.setStopScore(deductionScore);
+
+                detail.setCreateBy(SecurityUtils.getLoginUser().getUser().getUserName());
+                detail.setCreateTime(new Date());
+                
+                // 保存到数据库
+                orderScoreDetailService.insertGxtOrderScoreDetail(detail);
+            }
+        } catch (Exception e) {
+            log.error("添加维修工单停机扣分明细时发生异常", e);
+        }
+    }
+    
+    /**
+     * 添加停机扣分的工单个人分数明细数据
+     * 
+     * @param workOrder 维保工单
+     * @param persons 更新的人员列表
+     * @param deductionScore 扣分分数
+     * @param scoreType 分数类型
+     */
+    private void addOrderScoreDetailsForStopScoreWork(GxtWorkOrder workOrder, List<GxtWorkOrderPerson> persons, BigDecimal deductionScore, int scoreType) {
+        try {
+            for (GxtWorkOrderPerson person : persons) {
+                GxtOrderScoreDetail detail = new GxtOrderScoreDetail();
+                
+                // 设置基础信息
+                detail.setUserId(person.getUserId());
+                detail.setNickName(person.getNickName());
+                detail.setOrderType(2); // 维保工单
+                
+                // 设置工单相关信息
+                detail.setOrderId(workOrder.getId());
+                detail.setOrderCode(workOrder.getWorkOrderProjectNo());
+                
+                // 设置分数类型和分数
+                detail.setScoreType(scoreType); // 停机扣分
+                detail.setScore(deductionScore);
+                detail.setStopScore(deductionScore);
+
+                detail.setCreateBy(SecurityUtils.getLoginUser().getUser().getUserName());
+                detail.setCreateTime(new Date());
+                
+                // 保存到数据库
+                orderScoreDetailService.insertGxtOrderScoreDetail(detail);
+            }
+        } catch (Exception e) {
+            log.error("添加维保工单停机扣分明细时发生异常", e);
+        }
+    }
 }

+ 1 - 1
ygtx-gxt/src/main/resources/mapper/gxt/GxtMonthFanInspectionMapper.xml

@@ -61,7 +61,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         <where>
             <if test="deptId != null "> and pcs_station_pid = #{deptId}</if>
             <if test="monthPeriod != null  and monthPeriod != ''"> and DATE_FORMAT( create_time, '%Y-%m' ) = #{monthPeriod}</if>
-            AND inspection_type IS NOT NULL AND work_order_status != 'invalid'
+            AND inspection_type IS NOT NULL AND work_order_status = 'archived'
         </where>
         GROUP BY
         model,

+ 1 - 1
ygtx-gxt/src/main/resources/mapper/gxt/GxtMonthRepairProjectMapper.xml

@@ -43,7 +43,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         <where>
             <if test="deptId != null "> and pcs_station_pid = #{deptId}</if>
             <if test="monthPeriod != null  and monthPeriod != ''"> and DATE_FORMAT( occur_time, '%Y-%m' ) = #{monthPeriod}</if>
-            AND maintenance_type IS NOT NULL AND work_order_status != 'invalid'
+            AND maintenance_type IS NOT NULL AND work_order_status = 'archived'
         </where>
         GROUP BY
         maintenance_type

+ 2 - 2
ygtx-gxt/src/main/resources/mapper/gxt/GxtOrderScoreMapper.xml

@@ -294,7 +294,7 @@
         FROM gxt_repair_order t
         <where>
             <if test="keyword != null and keyword != ''">
-                and (work_order_project_no like concat('%', #{keyword}, '%') or pcs_device_name like concat('%', #{keyword}, '%') or mis_order_no like concat('%', #{keyword}, '%'))
+                and (work_order_project_no like concat('%', #{keyword}, '%') or pcs_device_name like concat('%', #{keyword}, '%') or mis_order_no = #{keyword} or work_permit_num = #{keyword})
             </if>
             <if test="repairOrder.workOrderProjectNo != null and repairOrder.workOrderProjectNo != ''"> and work_order_project_no = #{repairOrder.workOrderProjectNo}</if>
             <if test="repairOrder.workOrderStatus != null and repairOrder.workOrderStatus != ''"> and work_order_status in
@@ -391,7 +391,7 @@
         FROM gxt_work_order t
         <where>
             <if test="keyword != null and keyword != ''">
-                and (work_order_project_no like concat('%', #{keyword}, '%') or pcs_device_name like concat('%', #{keyword}, '%') or mis_no like concat('%', #{keyword}, '%'))
+                and (work_order_project_no like concat('%', #{keyword}, '%') or pcs_device_name like concat('%', #{keyword}, '%') or mis_no = #{keyword} or work_permit_num = #{keyword})
             </if>
             <if test="workOrder.workOrderProjectNo != null and workOrder.workOrderProjectNo != ''"> and work_order_project_no = #{workOrder.workOrderProjectNo}</if>
             <if test="workOrder.workOrderStatus != null and workOrder.workOrderStatus != ''"> and work_order_status in

+ 1 - 0
ygtx-gxt/src/main/resources/mapper/gxt/GxtRepairOrderMapper.xml

@@ -249,6 +249,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         order_id
         ) p ON p.order_id = t.id
         <where>
+            <if test="workOrderStatus != null  and workOrderStatus != ''"> and work_order_status = #{workOrderStatus}</if>
             <if test="pcsStationPid != null "> and pcs_station_pid = #{pcsStationPid}</if>
             <if test="maintenanceType != null and maintenanceType != ''"> and maintenance_type = #{maintenanceType}</if>
             <if test="monthPeriod != null"> and DATE_FORMAT(occur_time, '%Y-%m') = #{monthPeriod}</if>

+ 1 - 0
ygtx-gxt/src/main/resources/mapper/gxt/GxtWorkOrderMapper.xml

@@ -200,6 +200,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         order_id
         ) p ON p.order_id = t.id
         <where>
+            <if test="workOrderStatus != null  and workOrderStatus != ''"> and work_order_status = #{workOrderStatus}</if>
             <if test="model != null and model != ''"> and t.model = #{model}</if>
             <if test="inspectionType != null and inspectionType != ''"> and FIND_IN_SET(#{inspectionType}, inspection_type) > 0</if>
             <if test="pcsStationPid != null"> and pcs_station_pid = #{pcsStationPid}</if>

+ 41 - 40
ygtx-ui/src/components/gxtOrder/finalize.vue

@@ -80,6 +80,14 @@
           </el-form-item>
         </el-col>
       </el-row>
+      <!-- 维保详情 -->
+      <el-row :gutter="20">
+        <el-col :span="24">
+          <el-form-item label="维保内容">
+            <el-input v-model="formData.content" type="textarea" :rows="3" maxlength="500" disabled show-word-limit />
+          </el-form-item>
+        </el-col>
+      </el-row>
       <el-row>
         <el-col :span="12">
           <el-form-item label="信息录入" prop="infoEntry">
@@ -94,6 +102,8 @@
             </el-radio-group>
           </el-form-item>
         </el-col>
+      </el-row>
+      <el-row>
         <el-col :span="12" v-if="formData.infoEntry == 1">
           <el-form-item label="MIS工单编码" prop="misNo" >
             <el-input
@@ -174,48 +184,9 @@
           </el-form-item>
         </el-col>
       </el-row>
-      <el-row>
-        <el-col :span="12">
-          <el-form-item label="外委人员数(人)" prop="wwryNum">
-            <el-input-number
-              v-model="formData.wwryNum"
-              placeholder="请输入外委人员数"
-              controls-position="right"
-              style="width: 100%"
-              class="input-number-left"
-              :min="0"
-              :step="1"
-              :precision="0"
-            />
-          </el-form-item>
-        </el-col>
-        <el-col :span="12">
-          <el-form-item label="外来人员数(人)" prop="wlryNum">
-            <el-input-number
-              v-model="formData.wlryNum"
-              placeholder="请输入外来人员数"
-              controls-position="right"
-              style="width: 100%"
-              class="input-number-left"
-              :min="0"
-              :step="1"
-              :precision="0"
-            />
-          </el-form-item>
-        </el-col>
-      </el-row>
-      <!-- 维保详情 -->
-      <el-row :gutter="20">
-        <el-col :span="24">
-          <el-form-item label="维保内容" prop="content">
-            <el-input v-model="formData.content" type="textarea" :rows="3" maxlength="500" readonly show-word-limit />
-          </el-form-item>
-        </el-col>
-      </el-row>
       <el-row>
         <el-col :span="12">
           <el-form-item label="工作负责人" prop="teamLeaderName">
-<!--            <el-input v-model="formData.teamLeaderName" disabled />-->
             <el-input
                 v-model="formData.teamLeaderName"
                 placeholder="请输入工作负责人姓名或点击选择"
@@ -265,6 +236,36 @@
           </el-form-item>
         </el-col>
       </el-row>
+      <el-row>
+        <el-col :span="12">
+          <el-form-item label="外委人员数(人)" prop="wwryNum">
+            <el-input-number
+                v-model="formData.wwryNum"
+                placeholder="请输入外委人员数"
+                controls-position="right"
+                style="width: 100%"
+                class="input-number-left"
+                :min="0"
+                :step="1"
+                :precision="0"
+            />
+          </el-form-item>
+        </el-col>
+        <el-col :span="12">
+          <el-form-item label="外来人员数(人)" prop="wlryNum">
+            <el-input-number
+                v-model="formData.wlryNum"
+                placeholder="请输入外来人员数"
+                controls-position="right"
+                style="width: 100%"
+                class="input-number-left"
+                :min="0"
+                :step="1"
+                :precision="0"
+            />
+          </el-form-item>
+        </el-col>
+      </el-row>
       <el-row>
         <el-col :span="24">
           <el-form-item label="附件(可选)">
@@ -423,7 +424,7 @@ const finishRules = ref({
     }
   ],
   workGroupMemberName: [
-    { required: false, message: "请输入工作班成员", trigger: "change" },
+    { required: true, message: "请输入工作班成员", trigger: "change" },
     {
       validator: async (rule, value, callback) => {
         // 如果值为空、关联MIS,直接通过验证

+ 1 - 1
ygtx-ui/src/components/gxtOrder/view.vue

@@ -285,7 +285,7 @@ const formattedInspectionType = computed(() => {
   padding: 15px;
   /* background-color: #f9f9f9; */
   border-radius: 4px;
-  max-height: 600px;
+  //max-height: 800px;
   overflow-y: auto;
 }
 .flow-item h4 {

+ 49 - 51
ygtx-ui/src/components/repairOrder/finalize.vue

@@ -63,42 +63,6 @@
         <el-col :span="12">
           <el-form-item label="接单时间"><el-input v-model="formData.acceptTime" disabled /> </el-form-item>
         </el-col>
-        <el-col :span="12">
-          <el-form-item label="工作负责人" prop="teamLeaderName">
-<!--            <el-input v-model="formData.teamLeaderName" disabled /> -->
-            <el-input
-                v-model="formData.teamLeaderName"
-                placeholder="请输入工作负责人姓名或点击选择"
-                clearable
-                @focus="handleTeamLeaderInputFocus"
-                @blur="handleTeamLeaderInputBlur"
-                @input="handleTeamLeaderInput"
-                @clear="handleTeamLeaderClear"
-            >
-            </el-input>
-            <!-- 快速检索下拉框 -->
-            <div class="quick-select-dropdown" v-show="showTeamLeaderQuickSelect && quickTeamLeaderList.length > 0">
-              <div
-                  v-for="item in quickTeamLeaderList"
-                  :key="item.userId"
-                  class="quick-select-item"
-                  @click="handleTeamLeaderQuickSelect(item)">
-                <span class="user-name">{{ item.nickName }}</span>
-                <span class="user-name">{{ item.dept.deptName }}</span>
-              </div>
-            </div>
-            <div class="quick-select-dropdown no-data" v-show="showTeamLeaderQuickSelect && quickTeamLeaderList.length === 0 && formData.teamLeaderName && !teamLeaderLoading">
-              <div>未找到匹配的人员</div>
-            </div>
-            <div class="quick-select-dropdown no-data" v-show="showTeamLeaderQuickSelect && teamLeaderLoading">
-              <div>
-                <i class="el-icon-loading"></i>
-                搜索中...
-              </div>
-            </div>
-
-          </el-form-item>
-        </el-col>
       </el-row>
       <el-row>
         <el-col :span="12">
@@ -151,21 +115,6 @@
             <el-input v-model="workPermitNumProxy" maxlength="20" show-word-limit :readonly="formData.infoEntry == '1'" />
           </el-form-item>
         </el-col>
-        <el-col :span="12">
-          <el-form-item label="开始时间" prop="realStartTime">
-            <el-date-picker
-                v-model="formData.realStartTime"
-                type="datetime"
-                format="YYYY-MM-DD HH:mm"
-                value-format="YYYY-MM-DD HH:mm"
-                placeholder="请选择开始时间"
-                style="width: 100%"
-                :disabled-date="disabledStartDate"
-                @change="handleStartTimeChange"
-                :readonly="formData.infoEntry == '1'"
-            />
-          </el-form-item>
-        </el-col>
         <el-col :span="12">
           <el-form-item label="工作部位" prop="workArea">
             <el-select
@@ -183,6 +132,21 @@
             </el-select>
           </el-form-item>
         </el-col>
+        <el-col :span="12">
+          <el-form-item label="开始时间" prop="realStartTime">
+            <el-date-picker
+                v-model="formData.realStartTime"
+                type="datetime"
+                format="YYYY-MM-DD HH:mm"
+                value-format="YYYY-MM-DD HH:mm"
+                placeholder="请选择开始时间"
+                style="width: 100%"
+                :disabled-date="disabledStartDate"
+                @change="handleStartTimeChange"
+                :readonly="formData.infoEntry == '1'"
+            />
+          </el-form-item>
+        </el-col>
         <el-col :span="12">
           <el-form-item label="结束时间" prop="realEndTime">
             <el-date-picker
@@ -211,6 +175,40 @@
             />
           </el-form-item>
         </el-col>
+        <el-col :span="12">
+          <el-form-item label="工作负责人" prop="teamLeaderName">
+            <el-input
+                v-model="formData.teamLeaderName"
+                placeholder="请输入工作负责人姓名或点击选择"
+                clearable
+                @focus="handleTeamLeaderInputFocus"
+                @blur="handleTeamLeaderInputBlur"
+                @input="handleTeamLeaderInput"
+                @clear="handleTeamLeaderClear"
+            >
+            </el-input>
+            <!-- 快速检索下拉框 -->
+            <div class="quick-select-dropdown" v-show="showTeamLeaderQuickSelect && quickTeamLeaderList.length > 0">
+              <div
+                  v-for="item in quickTeamLeaderList"
+                  :key="item.userId"
+                  class="quick-select-item"
+                  @click="handleTeamLeaderQuickSelect(item)">
+                <span class="user-name">{{ item.nickName }}</span>
+                <span class="user-name">{{ item.dept.deptName }}</span>
+              </div>
+            </div>
+            <div class="quick-select-dropdown no-data" v-show="showTeamLeaderQuickSelect && quickTeamLeaderList.length === 0 && formData.teamLeaderName && !teamLeaderLoading">
+              <div>未找到匹配的人员</div>
+            </div>
+            <div class="quick-select-dropdown no-data" v-show="showTeamLeaderQuickSelect && teamLeaderLoading">
+              <div>
+                <i class="el-icon-loading"></i>
+                搜索中...
+              </div>
+            </div>
+          </el-form-item>
+        </el-col>
         <el-col :span="12">
           <el-form-item label="工作班成员" prop="workGroupMemberName">
             <el-input

+ 1 - 1
ygtx-ui/src/components/repairOrder/view.vue

@@ -351,7 +351,7 @@ const parseTime = (time, pattern) => {
   padding: 15px;
   //background-color: #f9f9f9;
   border-radius: 4px;
-  max-height: 600px;
+  //max-height: 800px;
   overflow-y: auto;
 }
 

+ 21 - 0
ygtx-ui/src/views/gxt/gxtOrder/index.vue

@@ -621,6 +621,18 @@
                 <el-input v-model="acceptForm.model" disabled />
               </el-form-item>
             </el-col>
+            <el-col :span="12" v-if="acceptForm.inspectionType">
+              <el-form-item label="维保类型">
+                <el-select v-model="acceptForm.inspectionType" multiple disabled>
+                  <el-option
+                      v-for="dict in gxt_inspection_type"
+                      :key="dict.value"
+                      :label="dict.label"
+                      :value="dict.value"
+                  />
+                </el-select>
+              </el-form-item>
+            </el-col>
           </el-row>
 <!--          <el-row :gutter="20">-->
 <!--            <el-col :span="12" v-if="acceptForm.infoEntry == '1'">-->
@@ -2485,6 +2497,15 @@ function handleAccept(row) {
     acceptForm.value.teamLeaderId = undefined
     acceptForm.value.teamLeaderName = undefined
     if (row.gxtCenterId) {
+      // 关键:处理 inspectionType 逗号字符串 -> 数组,支持多选回填
+      if (acceptForm.value.inspectionType) {
+        // 1. 分割字符串为数组(去除首尾空格,避免空值)
+        acceptForm.value.inspectionType = acceptForm.value.inspectionType
+            .toString() // 确保是字符串类型,防止报错
+            .trim() // 去除首尾空格
+            .split(',') // 按逗号分割为数组
+            .filter(item => item) // 过滤空字符串(避免分割后出现 [""] 无效值)
+      }
       if (lastLoadedCenterId.value !== acceptForm.value.gxtCenterId) {
         allUserList.value = [];
       }

+ 139 - 76
ygtx-ui/src/views/gxt/monthScore/index.vue

@@ -3,8 +3,8 @@
     <div class="user-score-container">
   <div class="app-container">
     <!-- 页面标题 -->
-    <div class="content-header">
-      <h1 class="page-title">月度工分汇总<span v-if="!isList" class="dept-name">-{{ monthScore.deptName }}</span></h1>
+    <div v-if="!isList" class="content-header">
+      <h1 class="page-title">{{ monthScore.deptName }}</h1>
       <el-select v-if="!isList" style="width: 150px;" v-model="selectedMonth" placeholder="请选择月份" @change="handleMonthChange">
         <el-option
           v-for="item in monthOptions"
@@ -84,7 +84,7 @@
       <el-col :span="8">
         <el-card class="card-form-left" shadow="hover">
           <div slot="header" class="clearfix">
-            <span style="font-weight: bold;">本月维保机型类型统计</span>
+            <span style="font-weight: bold;">维保工单统计</span>
           </div>
           <div class="form-content" style="margin-top: 20px;">
             <!-- 维保机型类型统计表格 -->
@@ -99,21 +99,27 @@
       <el-col :span="16">
         <el-card class="card-form-right" shadow="hover">
           <div slot="header" class="clearfix">
-            <span style="font-weight: bold;">机型:{{ currentSelectedModel }} 维保类型: {{ currentSelectedInspectionType }} [维保数量:{{ workOrderList.length }}]</span>
+            <span style="font-weight: bold;">维保工单明细</span>
           </div>
           <div class="form-content" style="margin-top: 20px;">
-            <el-table :data="workOrderList" style="width: 100%">
+            <el-table :data="workOrderList" style="width: 100%" class="custom-header-table">
               <el-table-column label="工单编号">
                 <template #default="scope">
                   <el-button link type="primary" @click="handleWorkOrderClick(scope.row)">{{ scope.row.workOrderProjectNo }}</el-button>
                 </template>
               </el-table-column>
-              <el-table-column prop="model" label="机型"></el-table-column>
               <el-table-column prop="leader" label="工作负责人"></el-table-column>
               <el-table-column prop="acceptUserName" label="接单人"></el-table-column>
               <el-table-column prop="realStartTime" label="停机时间"></el-table-column>
               <el-table-column prop="restartTime" label="恢复运行时间"></el-table-column>
             </el-table>
+            <pagination style="margin-top: 20px;"
+              v-show="wbtotal>0"
+              :total="wbtotal"
+              v-model:page="wbqueryParams.pageNum"
+              v-model:limit="wbqueryParams.pageSize"
+              @pagination="handlePaginationwb"
+            />
           </div>
         </el-card>
       </el-col>
@@ -123,7 +129,7 @@
       <el-col :span="8">
         <el-card class="card-form-left" shadow="hover">
           <div slot="header" class="clearfix">
-            <span style="font-weight: bold;">本月维修工单统计</span>
+            <span style="font-weight: bold;">维修工单统计</span>
           </div>
           <div class="form-content" style="margin-top: 20px;">
             <!-- 维修工单详情表格 -->
@@ -137,10 +143,10 @@
       <el-col :span="16">
         <el-card class="card-form-right" shadow="hover">
           <div slot="header" class="clearfix">
-            <span style="font-weight: bold;">检修类型:{{ currentSelectedRepairType }} [工单数量:{{ repairOrderList.length }}]</span>
+            <span style="font-weight: bold;">维修工单明细</span>
           </div>
           <div class="form-content" style="margin-top: 20px;">
-            <el-table :data="repairOrderList" style="width: 100%">
+            <el-table :data="repairOrderList" style="width: 100%" class="custom-header-table">
               <el-table-column label="工单编号">
                 <template #default="scope">
                   <el-button link type="primary" @click="handleRepairOrderClick(scope.row)">{{ scope.row.workOrderProjectNo }}</el-button>
@@ -152,6 +158,13 @@
               <el-table-column prop="occurTime" label="停机时间"></el-table-column>
               <el-table-column prop="restartTime" label="恢复运行时间"></el-table-column>
             </el-table>
+            <pagination style="margin-top: 20px;"
+              v-show="wxtotal>0"
+              :total="wxtotal"
+              v-model:page="wxqueryParams.pageNum"
+              v-model:limit="wxqueryParams.pageSize"
+              @pagination="handlePaginationwx"
+            />
           </div>
         </el-card>
       </el-col>
@@ -160,8 +173,9 @@
     <!-- 第五个表单:组员考核得分 -->
     <el-card v-if="!isList" class="card-form" style="margin-bottom: 20px;" shadow="hover">
       <div slot="header" class="clearfix">
-        <span style="font-weight: bold;">组员考核得分</span>
-        <el-input 
+        <span v-if="isInfo" style="font-weight: bold;">员工考核得分</span>
+        <span v-else style="font-weight: bold;">个人工分汇总</span>
+        <el-input v-if="isInfo"
           v-model="userFilterText" 
           placeholder="请输入组员姓名" 
           style="width: 200px; float: right; margin-top: 5px; margin-left: 10px;" 
@@ -174,35 +188,12 @@
       <div class="form-content" style="margin-top: 20px;">
         <!-- 组员考核得分表格 -->
         <el-table :data="userScoreList" style="width: 100%">
-          <el-table-column prop="nickName" label="组员姓名"></el-table-column>
-          <el-table-column label="维保工分">
-            <template #default="scope">
-              <el-input-number 
-                v-model="scope.row.maintenanceTotalScore" 
-                controls-position="right" 
-                readonly
-                class="full-width-input"
-              ></el-input-number>
-            </template>
-          </el-table-column>
-          <el-table-column label="维修工分">
-            <template #default="scope">
-              <el-input-number 
-                v-model="scope.row.repairTotalScore" 
-                controls-position="right" 
-                readonly
-                class="full-width-input"
-              ></el-input-number>
-            </template>
-          </el-table-column>
-          <el-table-column label="总工分">
+          <el-table-column v-if="isInfo" prop="nickName" label="组员姓名"></el-table-column>
+          <el-table-column prop="maintenanceTotalScore" label="维保工分"></el-table-column>
+          <el-table-column prop="repairTotalScore" label="维修工分"></el-table-column>
+          <el-table-column prop="finalScore" label="总工分">
             <template #default="scope">
-              <el-input-number 
-                v-model="scope.row.finalScore" 
-                controls-position="right" 
-                readonly
-                class="full-width-input"
-              ></el-input-number>
+              <span :style="{ color: getScoreColor(scope.row.finalScore) }">{{ scope.row.finalScore }}</span>
             </template>
           </el-table-column>
         </el-table>
@@ -272,6 +263,23 @@ export default {
         deptName: null,
         parentName: null,
         monthPeriod: null
+      },
+      wbtotal: 0,
+      wbqueryParams: {
+        pageNum: 1,
+        pageSize: 5,
+        model: null,
+        inspectionType: null,
+        pcsStationPid: null,
+        monthPeriod: null
+      },
+      wxtotal: 0,
+      wxqueryParams: {
+        pageNum: 1,
+        pageSize: 5,
+        maintenanceType: null,
+        pcsStationPid: null,
+        monthPeriod: null
       }
     }
   },
@@ -422,10 +430,22 @@ export default {
           }
 
           if (monthScoreGet.workOrderList) {
-            this.workOrderList = monthScoreGet.workOrderList;
+            const wbSize = monthScoreGet.workOrderList.length;
+            this.wbtotal = wbSize;
+            if (this.wbqueryParams.pageSize>=wbSize) {
+              this.workOrderList = monthScoreGet.workOrderList;
+            }else{
+              this.workOrderList = monthScoreGet.workOrderList.slice(0, this.wbqueryParams.pageSize);
+            }
             if (monthScoreGet.monthFanInspections && monthScoreGet.monthFanInspections.length>0) {
+              const firstItem = monthScoreGet.monthFanInspections[0];
+              this.wbqueryParams.pageNum = 1;
+              this.wbqueryParams.model = firstItem.model;
+              this.wbqueryParams.inspectionType = firstItem.inspectionType;
+              this.wbqueryParams.pcsStationPid = this.monthScore.deptId;
+              this.wbqueryParams.monthPeriod = this.selectedMonth;
               this.currentSelectedModel = monthScoreGet.monthFanInspections[0].model;
-              this.currentSelectedInspectionType = this.getInspectionTypeLabel(monthScoreGet.monthFanInspections[0].inspectionTypeId);
+              this.currentSelectedInspectionType = this.getInspectionTypeLabel(firstItem.inspectionTypeId);
               // 默认选中第一行
               this.currentRowIndex = 0;
             }else{
@@ -446,9 +466,20 @@ export default {
           }
 
           if (monthScoreGet.repairOrderList) {
-            this.repairOrderList = monthScoreGet.repairOrderList;
+            const wxSize = monthScoreGet.repairOrderList.length;
+            this.wxtotal = wxSize;
+            if (this.wxqueryParams.pageSize>=wxSize) {
+              this.repairOrderList = monthScoreGet.repairOrderList;
+            }else{
+              this.repairOrderList = monthScoreGet.repairOrderList.slice(0, this.wxqueryParams.pageSize);
+            }
             if (monthScoreGet.monthRepairProjects && monthScoreGet.monthRepairProjects.length>0) {
-              this.currentSelectedRepairType = this.getMaintenanceTypeLabel(monthScoreGet.monthRepairProjects[0].maintenanceType);
+              const firstItem = monthScoreGet.monthRepairProjects[0];
+              this.wxqueryParams.pageNum = 1;
+              this.wxqueryParams.maintenanceType = firstItem.maintenanceType;
+              this.wxqueryParams.pcsStationPid = this.monthScore.deptId;
+              this.wxqueryParams.monthPeriod = this.selectedMonth;
+              this.currentSelectedRepairType = this.getMaintenanceTypeLabel(firstItem.maintenanceType);
               // 默认选中维修工单统计表格的第一行
               this.currentRepairRowIndex = 0;
             }else{
@@ -573,25 +604,14 @@ export default {
       this.currentSelectedInspectionType = row.inspectionType;
       
       // 构造请求参数
-      const params = {
-        model: row.model,
-        inspectionType: this.getInspectionTypeValue(row.inspectionType), // 需要将显示文本转换为实际值
-        pcsStationPid: this.monthScore.deptId, // 使用当前页面的部门ID
-        monthPeriod: this.selectedMonth // 使用当前选中的月份
-      };
+      this.wbqueryParams.pageNum = 1;
+      this.wbqueryParams.model = row.model;
+      this.wbqueryParams.inspectionType = this.getInspectionTypeValue(row.inspectionType);
+      this.wbqueryParams.pcsStationPid = this.monthScore.deptId;
+      this.wbqueryParams.monthPeriod = this.selectedMonth;
       
       // 调用后端接口
-      getWorkOrderByMonth(params).then(response => {
-        if (response.code === 200) {
-          // 将返回结果赋值给workOrderList
-          this.workOrderList = response.data || [];
-        } else {
-          this.$message.error('获取维保工单数据失败:' + response.msg);
-        }
-      }).catch(error => {
-        console.error('获取维保工单数据异常:', error);
-        this.$message.error('获取维保工单数据异常');
-      });
+      this.queryWbList();
     },
     
     // 处理维修工单统计表格行点击事件
@@ -605,24 +625,13 @@ export default {
       this.currentSelectedRepairType = row.repairType;
       
       // 构造请求参数
-      const params = {
-        maintenanceType: this.getMaintenanceTypeValue(row.repairType), // 需要将显示文本转换为实际值
-        pcsStationPid: this.monthScore.deptId, // 使用当前页面的部门ID
-        monthPeriod: this.selectedMonth // 使用当前选中的月份
-      };
+      this.wxqueryParams.pageNum = 1;
+      this.wxqueryParams.maintenanceType = this.getMaintenanceTypeValue(row.repairType);
+      this.wxqueryParams.pcsStationPid = this.monthScore.deptId;
+      this.wxqueryParams.monthPeriod = this.selectedMonth;
       
       // 调用后端接口
-      getRepairOrderByMonth(params).then(response => {
-        if (response.code === 200) {
-          // 将返回结果赋值给repairOrderList
-          this.repairOrderList = response.data || [];
-        } else {
-          this.$message.error('获取维修工单数据失败:' + response.msg);
-        }
-      }).catch(error => {
-        console.error('获取维修工单数据异常:', error);
-        this.$message.error('获取维修工单数据异常');
-      });
+      this.queryWxList();
     },
     
     // 根据显示标签获取字典值(维修类型)
@@ -667,6 +676,55 @@ export default {
         );
       }
     },
+    
+    // 根据分数返回对应颜色
+    getScoreColor(score) {
+      if (score > 0) {
+        return '#1890FF'; // 蓝色
+      } else if (score < 0) {
+        return '#F56C6C'; // 红色
+      } else {
+        return '#000000'; // 黑色
+      }
+    },
+
+    queryWbList() {
+      getWorkOrderByMonth(this.wbqueryParams).then(response => {
+        if (response.code === 200) {
+          // 将返回结果赋值给workOrderList
+          this.workOrderList = response.rows || [];
+          this.wbtotal = response.total;
+        } else {
+          this.$message.error('获取维保工单数据失败:' + response.msg);
+        }
+      }).catch(error => {
+        console.error('获取维保工单数据异常:', error);
+        this.$message.error('获取维保工单数据异常');
+      });
+    },
+
+    queryWxList() {
+      getRepairOrderByMonth(this.wxqueryParams).then(response => {
+        if (response.code === 200) {
+          // 将返回结果赋值给repairOrderList
+          this.repairOrderList = response.rows || [];
+          this.wxtotal = response.total;
+        } else {
+          this.$message.error('获取维修工单数据失败:' + response.msg);
+        }
+      }).catch(error => {
+        console.error('获取维修工单数据异常:', error);
+        this.$message.error('获取维修工单数据异常');
+      });
+    },
+
+    
+    handlePaginationwb() {
+      this.queryWbList();
+    },
+    handlePaginationwx() {
+      this.queryWxList();
+    },
   }
 }
 </script>
@@ -761,4 +819,9 @@ export default {
 :deep(.el-table .el-table__body tr.el-table__row:hover > td) {
   background-color: #f5f7fa;
 }
+
+/* 自定义表头背景色 */
+:deep(.custom-header-table .el-table__header th) {
+  background-color: #e6f7ff !important;
+}
 </style>

+ 140 - 77
ygtx-ui/src/views/gxt/monthScore/info.vue

@@ -4,7 +4,7 @@
   <div class="app-container">
     <!-- 页面标题 -->
     <div class="content-header">
-      <h1 class="page-title">月度工分汇总-{{ monthScore.deptName }}</h1>
+      <h1 class="page-title">{{ monthScore.deptName }}</h1>
       <el-select style="width: 150px;" v-model="selectedMonth" placeholder="请选择月份" @change="handleMonthChange">
         <el-option
           v-for="item in monthOptions"
@@ -19,7 +19,7 @@
       <el-col :span="8">
         <el-card class="card-form-left" shadow="hover">
           <div slot="header" class="clearfix">
-            <span style="font-weight: bold;">本月维保机型类型统计</span>
+            <span style="font-weight: bold;">维保工单统计</span>
           </div>
           <div class="form-content" style="margin-top: 20px;">
             <!-- 维保机型类型统计表格 -->
@@ -34,21 +34,27 @@
       <el-col :span="16">
         <el-card class="card-form-right" shadow="hover">
           <div slot="header" class="clearfix">
-            <span style="font-weight: bold;">机型:{{ currentSelectedModel }} 维保类型: {{ currentSelectedInspectionType }} [维保数量:{{ workOrderList.length }}]</span>
+            <span style="font-weight: bold;">维保工单明细</span>
           </div>
           <div class="form-content" style="margin-top: 20px;">
-            <el-table :data="workOrderList" style="width: 100%">
+            <el-table :data="workOrderList" style="width: 100%" class="custom-header-table">
               <el-table-column label="工单编号">
                 <template #default="scope">
                   <el-button link type="primary" @click="handleWorkOrderClick(scope.row)">{{ scope.row.workOrderProjectNo }}</el-button>
                 </template>
               </el-table-column>
-              <el-table-column prop="model" label="机型"></el-table-column>
               <el-table-column prop="leader" label="工作负责人"></el-table-column>
               <el-table-column prop="acceptUserName" label="接单人"></el-table-column>
               <el-table-column prop="realStartTime" label="停机时间"></el-table-column>
               <el-table-column prop="restartTime" label="恢复运行时间"></el-table-column>
             </el-table>
+            <pagination style="margin-top: 20px;"
+              v-show="wbtotal>0"
+              :total="wbtotal"
+              v-model:page="wbqueryParams.pageNum"
+              v-model:limit="wbqueryParams.pageSize"
+              @pagination="handlePaginationwb"
+            />
           </div>
         </el-card>
       </el-col>
@@ -59,7 +65,7 @@
       <el-col :span="8">
         <el-card class="card-form-left" shadow="hover">
           <div slot="header" class="clearfix">
-            <span style="font-weight: bold;">本月维修工单统计</span>
+            <span style="font-weight: bold;">维修工单统计</span>
           </div>
           <div class="form-content" style="margin-top: 20px;">
             <!-- 维修工单详情表格 -->
@@ -73,10 +79,10 @@
       <el-col :span="16">
         <el-card class="card-form-right" shadow="hover">
           <div slot="header" class="clearfix">
-            <span style="font-weight: bold;">检修类型:{{ currentSelectedRepairType }} [工单数量:{{ repairOrderList.length }}]</span>
+            <span style="font-weight: bold;">维修工单明细</span>
           </div>
           <div class="form-content" style="margin-top: 20px;">
-            <el-table :data="repairOrderList" style="width: 100%">
+            <el-table :data="repairOrderList" style="width: 100%" class="custom-header-table">
               <el-table-column label="工单编号">
                 <template #default="scope">
                   <el-button link type="primary" @click="handleRepairOrderClick(scope.row)">{{ scope.row.workOrderProjectNo }}</el-button>
@@ -88,6 +94,13 @@
               <el-table-column prop="occurTime" label="停机时间"></el-table-column>
               <el-table-column prop="restartTime" label="恢复运行时间"></el-table-column>
             </el-table>
+            <pagination style="margin-top: 20px;"
+              v-show="wxtotal>0"
+              :total="wxtotal"
+              v-model:page="wxqueryParams.pageNum"
+              v-model:limit="wxqueryParams.pageSize"
+              @pagination="handlePaginationwx"
+            />
           </div>
         </el-card>
       </el-col>
@@ -96,8 +109,9 @@
     <!-- 第五个表单:组员考核得分 -->
     <el-card class="card-form" shadow="hover">
       <div slot="header" class="clearfix">
-        <span style="font-weight: bold;">组员考核得分</span>
-        <el-input 
+        <span v-if="isInfo" style="font-weight: bold;">员工考核得分</span>
+        <span v-else style="font-weight: bold;">个人工分汇总</span>
+        <el-input v-if="isInfo"
           v-model="userFilterText" 
           placeholder="请输入组员姓名" 
           style="width: 200px; float: right; margin-top: 5px; margin-left: 10px;" 
@@ -110,35 +124,12 @@
       <div class="form-content" style="margin-top: 20px;">
         <!-- 组员考核得分表格 -->
         <el-table :data="userScoreList" style="width: 100%">
-          <el-table-column prop="nickName" label="组员姓名"></el-table-column>
-          <el-table-column label="维保工分">
-            <template #default="scope">
-              <el-input-number 
-                v-model="scope.row.maintenanceTotalScore" 
-                controls-position="right" 
-                readonly
-                class="full-width-input"
-              ></el-input-number>
-            </template>
-          </el-table-column>
-          <el-table-column label="维修工分">
+          <el-table-column v-if="isInfo" prop="nickName" label="组员姓名"></el-table-column>
+          <el-table-column prop="maintenanceTotalScore" label="维保工分"></el-table-column>
+          <el-table-column prop="repairTotalScore" label="维修工分"></el-table-column>
+          <el-table-column prop="finalScore" label="总工分">
             <template #default="scope">
-              <el-input-number 
-                v-model="scope.row.repairTotalScore" 
-                controls-position="right" 
-                readonly
-                class="full-width-input"
-              ></el-input-number>
-            </template>
-          </el-table-column>
-          <el-table-column label="总工分">
-            <template #default="scope">
-              <el-input-number 
-                v-model="scope.row.finalScore" 
-                controls-position="right" 
-                readonly
-                class="full-width-input"
-              ></el-input-number>
+              <span :style="{ color: getScoreColor(scope.row.finalScore) }">{{ scope.row.finalScore }}</span>
             </template>
           </el-table-column>
         </el-table>
@@ -201,7 +192,24 @@ export default {
       repairOrderList: [],
       // 用户筛选相关
       userFilterText: '',
-      originalUserScoreList: []
+      originalUserScoreList: [],
+      wbtotal: 0,
+      wbqueryParams: {
+        pageNum: 1,
+        pageSize: 5,
+        model: null,
+        inspectionType: null,
+        pcsStationPid: null,
+        monthPeriod: null
+      },
+      wxtotal: 0,
+      wxqueryParams: {
+        pageNum: 1,
+        pageSize: 5,
+        maintenanceType: null,
+        pcsStationPid: null,
+        monthPeriod: null
+      }
     }
   },
   created() {
@@ -309,10 +317,22 @@ export default {
           }
 
           if (monthScoreGet.workOrderList) {
-            this.workOrderList = monthScoreGet.workOrderList;
+            const wbSize = monthScoreGet.workOrderList.length;
+            this.wbtotal = wbSize;
+            if (this.wbqueryParams.pageSize>=wbSize) {
+              this.workOrderList = monthScoreGet.workOrderList;
+            }else{
+              this.workOrderList = monthScoreGet.workOrderList.slice(0, this.wbqueryParams.pageSize);
+            }
             if (monthScoreGet.monthFanInspections && monthScoreGet.monthFanInspections.length>0) {
-              this.currentSelectedModel = monthScoreGet.monthFanInspections[0].model;
-              this.currentSelectedInspectionType = this.getInspectionTypeLabel(monthScoreGet.monthFanInspections[0].inspectionTypeId);
+              const firstItem = monthScoreGet.monthFanInspections[0];
+              this.wbqueryParams.pageNum = 1;
+              this.wbqueryParams.model = firstItem.model;
+              this.wbqueryParams.inspectionType = firstItem.inspectionType;
+              this.wbqueryParams.pcsStationPid = this.monthScore.deptId;
+              this.wbqueryParams.monthPeriod = this.selectedMonth;
+              this.currentSelectedModel = firstItem.model;
+              this.currentSelectedInspectionType = this.getInspectionTypeLabel(firstItem.inspectionTypeId);
               // 默认选中第一行
               this.currentRowIndex = 0;
             }else{
@@ -333,9 +353,20 @@ export default {
           }
 
           if (monthScoreGet.repairOrderList) {
-            this.repairOrderList = monthScoreGet.repairOrderList;
+            const wxSize = monthScoreGet.repairOrderList.length;
+            this.wxtotal = wxSize;
+            if (this.wxqueryParams.pageSize>=wxSize) {
+              this.repairOrderList = monthScoreGet.repairOrderList;
+            }else{
+              this.repairOrderList = monthScoreGet.repairOrderList.slice(0, this.wxqueryParams.pageSize);
+            }
             if (monthScoreGet.monthRepairProjects && monthScoreGet.monthRepairProjects.length>0) {
-              this.currentSelectedRepairType = this.getMaintenanceTypeLabel(monthScoreGet.monthRepairProjects[0].maintenanceType);
+              const firstItem = monthScoreGet.monthRepairProjects[0];
+              this.wxqueryParams.pageNum = 1;
+              this.wxqueryParams.maintenanceType = firstItem.maintenanceType;
+              this.wxqueryParams.pcsStationPid = this.monthScore.deptId;
+              this.wxqueryParams.monthPeriod = this.selectedMonth;
+              this.currentSelectedRepairType = this.getMaintenanceTypeLabel(firstItem.maintenanceType);
               // 默认选中维修工单统计表格的第一行
               this.currentRepairRowIndex = 0;
             }else{
@@ -429,25 +460,14 @@ export default {
       this.currentSelectedInspectionType = row.inspectionType;
       
       // 构造请求参数
-      const params = {
-        model: row.model,
-        inspectionType: this.getInspectionTypeValue(row.inspectionType), // 需要将显示文本转换为实际值
-        pcsStationPid: this.monthScore.deptId, // 使用当前页面的部门ID
-        monthPeriod: this.selectedMonth // 使用当前选中的月份
-      };
+      this.wbqueryParams.pageNum = 1;
+      this.wbqueryParams.model = row.model;
+      this.wbqueryParams.inspectionType = this.getInspectionTypeValue(row.inspectionType);
+      this.wbqueryParams.pcsStationPid = this.monthScore.deptId;
+      this.wbqueryParams.monthPeriod = this.selectedMonth;
       
       // 调用后端接口
-      getWorkOrderByMonth(params).then(response => {
-        if (response.code === 200) {
-          // 将返回结果赋值给workOrderList
-          this.workOrderList = response.data || [];
-        } else {
-          this.$message.error('获取维保工单数据失败:' + response.msg);
-        }
-      }).catch(error => {
-        console.error('获取维保工单数据异常:', error);
-        this.$message.error('获取维保工单数据异常');
-      });
+      this.queryWbList();
     },
     
     // 根据显示标签获取字典值
@@ -486,24 +506,13 @@ export default {
       this.currentSelectedRepairType = row.repairType;
       
       // 构造请求参数
-      const params = {
-        maintenanceType: this.getMaintenanceTypeValue(row.repairType), // 需要将显示文本转换为实际值
-        pcsStationPid: this.monthScore.deptId, // 使用当前页面的部门ID
-        monthPeriod: this.selectedMonth // 使用当前选中的月份
-      };
+      this.wxqueryParams.pageNum = 1;
+      this.wxqueryParams.maintenanceType = this.getMaintenanceTypeValue(row.repairType);
+      this.wxqueryParams.pcsStationPid = this.monthScore.deptId;
+      this.wxqueryParams.monthPeriod = this.selectedMonth;
       
       // 调用后端接口
-      getRepairOrderByMonth(params).then(response => {
-        if (response.code === 200) {
-          // 将返回结果赋值给repairOrderList
-          this.repairOrderList = response.data || [];
-        } else {
-          this.$message.error('获取维修工单数据失败:' + response.msg);
-        }
-      }).catch(error => {
-        console.error('获取维修工单数据异常:', error);
-        this.$message.error('获取维修工单数据异常');
-      });
+      this.queryWxList();
     },
     
     // 处理工单编号点击事件
@@ -540,6 +549,55 @@ export default {
         );
       }
     },
+    
+    // 根据分数返回对应颜色
+    getScoreColor(score) {
+      if (score > 0) {
+        return '#1890FF'; // 蓝色
+      } else if (score < 0) {
+        return '#F56C6C'; // 红色
+      } else {
+        return '#000000'; // 黑色
+      }
+    },
+
+    queryWbList() {
+      getWorkOrderByMonth(this.wbqueryParams).then(response => {
+        if (response.code === 200) {
+          // 将返回结果赋值给workOrderList
+          this.workOrderList = response.rows || [];
+          this.wbtotal = response.total;
+        } else {
+          this.$message.error('获取维保工单数据失败:' + response.msg);
+        }
+      }).catch(error => {
+        console.error('获取维保工单数据异常:', error);
+        this.$message.error('获取维保工单数据异常');
+      });
+    },
+
+    queryWxList() {
+      getRepairOrderByMonth(this.wxqueryParams).then(response => {
+        if (response.code === 200) {
+          // 将返回结果赋值给repairOrderList
+          this.repairOrderList = response.rows || [];
+          this.wxtotal = response.total;
+        } else {
+          this.$message.error('获取维修工单数据失败:' + response.msg);
+        }
+      }).catch(error => {
+        console.error('获取维修工单数据异常:', error);
+        this.$message.error('获取维修工单数据异常');
+      });
+    },
+
+    
+    handlePaginationwb() {
+      this.queryWbList();
+    },
+    handlePaginationwx() {
+      this.queryWxList();
+    },
   }
 }
 </script>
@@ -653,4 +711,9 @@ export default {
   background-color: #f5f7fa;
 }
 
+/* 自定义表头背景色 */
+:deep(.custom-header-table .el-table__header th) {
+  background-color: #e6f7ff !important;
+}
+
 </style>

+ 11 - 0
ygtx-ui/src/views/gxt/orderMyTodo/index.vue

@@ -1286,6 +1286,16 @@
         :info-entry-disabled = "false"
     />
 
+    <!-- 补录结单对话框组件 -->
+    <BackfillFinalizeDialog
+        v-model="backfillFinishDialogVisible"
+        :data="finishForm"
+        :work-order-status-options="gxt_work_order_status"
+        :list-user-data="listUserData"
+        :on-submit="submitFinishFromParent"
+        @success="handleFinishSuccess"
+    />
+
     <!-- 维修挂起对话框 -->
     <SuspendDialog
         v-model="suspendRepairDialogVisible"
@@ -1351,6 +1361,7 @@ import ApproveRepairDialog from "@/components/repairOrder/approve.vue";
 import ApproveDialog from "@/components/gxtOrder/approve.vue";
 import ShutdownDialog from "@/components/gxtOrder/shutdown.vue";
 import {ElMessageBox} from "element-plus";
+import BackfillFinalizeDialog from "@/components/gxtOrder/backfillFinalize.vue";
 
 
 const { proxy } = getCurrentInstance();

+ 5 - 5
ygtx-ui/src/views/gxt/orderScore/index.vue

@@ -299,7 +299,7 @@
           <el-col :span="24">
             <el-form-item label="得分明细">
               <el-table :data="viewForm.scorePersonList" border style="width: 100%;">
-                <el-table-column label="检修员" align="center" prop="nickName">
+                <el-table-column label="工作班成员" align="center" prop="nickName">
                   <template #default="scope">
                     <span>{{ scope.row.nickName }}<span v-if="scope.row.isLeader == 1"> (工作负责人)</span></span>
                   </template>
@@ -509,7 +509,7 @@
         </el-row>
         <el-form-item :label="'得分明细 (' + (isMixedZeroNonZeroInspectionTypesForSelfEvaluation() ? '最少可评总分: ' : '可自评总分: ') + (getSelfEvaluationTotalScore() === 0 ? '未规定' : getSelfEvaluationTotalScore().toFixed(2) + '分') + ', 已自评总分: ' + getSelfEvaluatedTotalScore().toFixed(2) + '分)'">
           <el-table :data="selfEvaluationForm.scorePersonList" border style="width: 100%;">
-            <el-table-column label="检修员" align="center" prop="nickName"  style="width: 33%;">
+            <el-table-column label="工作班成员" align="center" prop="nickName"  style="width: 33%;">
               <template #default="scope">
                 <span>{{ scope.row.nickName }}<span v-if="scope.row.isLeader == 1"> (工作负责人)</span></span>
               </template>
@@ -812,7 +812,7 @@
         </el-row>
         <el-form-item :label="'得分明细 (' + (isMixedZeroNonZeroInspectionTypesForReview() ? '最少可评总分: ' : '可复评总分: ') + (getReviewEvaluationTotalScore() === 0 ? '未规定' : getReviewEvaluationTotalScore().toFixed(2) + '分') + ', 已复评总分: ' + getReviewedTotalScore().toFixed(2) + '分)'">
           <el-table :data="reviewForm.scorePersonList" border style="width: 100%;">
-            <el-table-column label="检修员" align="center" prop="nickName"  style="width: 33%;">
+            <el-table-column label="工作班成员" align="center" prop="nickName"  style="width: 33%;">
               <template #default="scope">
                 <span>{{ scope.row.nickName }}<span v-if="scope.row.isLeader == 1"> (工作负责人)</span></span>
               </template>
@@ -1037,7 +1037,7 @@
             </el-row>
             <el-form-item label="得分明细">
               <el-table :data="finalEvaluationForm.scorePersonList" border style="width: 100%;">
-                <el-table-column label="检修员" align="center" prop="nickName"  style="width: 50%;">
+                <el-table-column label="工作班成员" align="center" prop="nickName"  style="width: 50%;">
                   <template #default="scope">
                     <span>{{ scope.row.nickName }}<span v-if="scope.row.isLeader == 1"> (工作负责人)</span></span>
                   </template>
@@ -1304,7 +1304,7 @@
         </el-row>
         <el-form-item label="得分明细">
           <el-table :data="scorePersonList" border style="width: 100%;">
-            <el-table-column label="检修员" align="center" prop="nickName">
+            <el-table-column label="工作班成员" align="center" prop="nickName">
               <template #default="scope">
                 <span>{{ scope.row.nickName }}<span v-if="scope.row.isLeader == 1"> (工作负责人)</span></span>
               </template>

+ 5 - 0
ygtx-ui/src/views/gxt/repairOrder/index.vue

@@ -1747,6 +1747,7 @@ const loadAllFaultInfoList = async () => {
 // 故障代码快速检索方法
 /** 故障代码输入框获取焦点 */
 const handleFaultCodeInputFocus = async () => {
+  if (form.value.faultCode) return
   showFaultCodeQuickSelect.value = true;
 
   // 加载所有故障信息
@@ -1820,6 +1821,9 @@ const handleFaultCodeClear = () => {
 // 故障条文快速检索方法
 /** 故障条文输入框获取焦点 */
 const handleFaultBarcodeInputFocus = async () => {
+  if (form.value.faultBarcode) {
+    return
+  }
   showFaultBarcodeQuickSelect.value = true;
 
   // 加载所有故障信息
@@ -1893,6 +1897,7 @@ const handleFaultBarcodeClear = () => {
 // 故障描述快速检索方法
 /** 故障描述输入框获取焦点 */
 const handleFaultDescInputFocus = async () => {
+  if (form.value.faultDesc) return
   showFaultDescQuickSelect.value = true;
 
   // 加载所有故障信息

+ 2 - 2
ygtx-ui/src/views/gxt/userScore/userScorePage.vue

@@ -110,7 +110,7 @@
               </el-table>
             </div>
 
-            <h3 class="module-subtitle" style="margin-bottom: 1rem;">检修员得分列表</h3>
+            <h3 class="module-subtitle" style="margin-bottom: 1rem;">工作班成员得分列表</h3>
             <div class="table-responsive">
               <el-table :data="maintenanceUserScoreData" class="data-table">
                 <el-table-column prop="userName" label="组员姓名"></el-table-column>
@@ -165,7 +165,7 @@
             <h3 class="module-subtitle" style="margin-bottom: 1rem;">维修员最终得分</h3>
             <div class="table-responsive" style="margin-bottom: 1.5rem;">
               <el-table :data="repairUserScoreData" class="data-table">
-                <el-table-column prop="userName" label="检修员"></el-table-column>
+                <el-table-column prop="userName" label="工作班成员"></el-table-column>
                 <el-table-column prop="repairTotalScore" label="实际考核得分">
                   <template #default="scope">
                     <el-input-number v-model="scope.row.repairTotalScore" :min="0" controls-position="right" :readonly="isReadOnly" />