From 955b1d044578fb64597ae22a4f690120270cf1d2 Mon Sep 17 00:00:00 2001 From: wanglei <3085637232@qq.com> Date: Mon, 29 Dec 2025 16:33:53 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E7=BB=B4=E4=BF=AE=E4=BA=BA?= =?UTF-8?q?=E5=91=98=E5=B7=A5=E5=8D=95=E7=9B=B8=E5=85=B3=E7=9A=84=E4=BB=A3?= =?UTF-8?q?=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../water/mapper/WorkOrderRepository.java | 9 +++ .../water/service/WorkOrderServiceImpl.java | 80 +++++++++++++------ 2 files changed, 64 insertions(+), 25 deletions(-) diff --git a/src/main/java/com/campus/water/mapper/WorkOrderRepository.java b/src/main/java/com/campus/water/mapper/WorkOrderRepository.java index f504d28..b3dcd11 100644 --- a/src/main/java/com/campus/water/mapper/WorkOrderRepository.java +++ b/src/main/java/com/campus/water/mapper/WorkOrderRepository.java @@ -46,4 +46,13 @@ public interface WorkOrderRepository extends JpaRepository { //获取处于某些状态的工单 List findByStatusIn(List list); + + /** + * 查询指定维修人员的待处理工单数量 + * @param repairmanId 维修人员ID + * @param statuses 待处理工单状态集合 + * @return 待处理工单数量 + */ + long countByAssignedRepairmanIdAndStatusIn(String repairmanId, List statuses); + } \ No newline at end of file diff --git a/src/main/java/com/campus/water/service/WorkOrderServiceImpl.java b/src/main/java/com/campus/water/service/WorkOrderServiceImpl.java index b5382ea..cb4901d 100644 --- a/src/main/java/com/campus/water/service/WorkOrderServiceImpl.java +++ b/src/main/java/com/campus/water/service/WorkOrderServiceImpl.java @@ -55,9 +55,9 @@ public class WorkOrderServiceImpl implements WorkOrderService { // 检查工单状态是否为"待处理"(只有待处理的工单可被抢单) if (order.getStatus() == WorkOrder.OrderStatus.pending) { - // 查询维修人员是否存在且状态为"空闲" + // 查询维修人员是否存在 Optional repairman = repairmanRepository.findById(repairmanId); - if (repairman.isPresent() && repairman.get().getStatus() == Repairman.RepairmanStatus.idle) { + if (repairman.isPresent()) { // 更新工单状态:改为"已抢单",记录抢单时间和维修人员ID order.setStatus(WorkOrder.OrderStatus.processing); @@ -65,10 +65,8 @@ public class WorkOrderServiceImpl implements WorkOrderService { order.setGrabbedTime(LocalDateTime.now()); workOrderRepository.save(order); - // 更新维修人员状态:改为"忙碌" - Repairman repairmanEntity = repairman.get(); - repairmanEntity.setStatus(Repairman.RepairmanStatus.busy); - repairmanRepository.save(repairmanEntity); + // 改造点1:不再手动设置维修人员为忙碌,改为动态更新状态 + updateRepairmanStatusByPendingOrders(repairmanId); return true; // 抢单成功 } @@ -105,11 +103,8 @@ public class WorkOrderServiceImpl implements WorkOrderService { order.setGrabbedTime(null); workOrderRepository.save(order); - // 重置维修人员状态:改为"空闲" - repairmanRepository.findById(repairmanId).ifPresent(rm -> { - rm.setStatus(Repairman.RepairmanStatus.idle); - repairmanRepository.save(rm); - }); + // 改造点2:拒单后动态更新维修人员状态(而非直接设为空闲) + updateRepairmanStatusByPendingOrders(repairmanId); return true; // 拒单成功 } @@ -147,12 +142,13 @@ public class WorkOrderServiceImpl implements WorkOrderService { order.setImgUrl(imgUrl); workOrderRepository.save(order); - // 更新维修人员状态为"空闲",并增加工作量 + // 改造点3:提交结果后动态更新维修人员状态(而非直接设为空闲) + // 同时保留工作量统计逻辑 repairmanRepository.findById(repairmanId).ifPresent(rm -> { - rm.setStatus(Repairman.RepairmanStatus.idle); rm.setWorkCount(rm.getWorkCount() + 1); repairmanRepository.save(rm); }); + updateRepairmanStatusByPendingOrders(repairmanId); return true; // 提交成功 } @@ -174,16 +170,16 @@ public class WorkOrderServiceImpl implements WorkOrderService { if (approved) { // 审核通过:改为"已完成" order.setStatus(WorkOrder.OrderStatus.completed); + // 改造点4:审核通过后,动态更新维修人员状态 + if (order.getAssignedRepairmanId() != null) { + updateRepairmanStatusByPendingOrders(order.getAssignedRepairmanId()); + } } else { // 审核不通过:退回"处理中" order.setStatus(WorkOrder.OrderStatus.processing); - // 同时将维修人员状态改回忙碌 + // 改造点5:审核不通过后,动态更新维修人员状态(而非直接设为忙碌) if (order.getAssignedRepairmanId() != null) { - repairmanRepository.findById(order.getAssignedRepairmanId()) - .ifPresent(rm -> { - rm.setStatus(Repairman.RepairmanStatus.busy); - repairmanRepository.save(rm); - }); + updateRepairmanStatusByPendingOrders(order.getAssignedRepairmanId()); } } workOrderRepository.save(order); @@ -281,9 +277,9 @@ public class WorkOrderServiceImpl implements WorkOrderService { if (order.getStatus() == WorkOrder.OrderStatus.pending || order.getStatus() == WorkOrder.OrderStatus.timeout) { - // 查询维修人员是否存在且状态为"空闲" + // 查询维修人员是否存在 Optional repairmanOpt = repairmanRepository.findById(repairmanId); - if (repairmanOpt.isPresent() && repairmanOpt.get().getStatus() == Repairman.RepairmanStatus.idle) { + if (repairmanOpt.isPresent()) { // 更新工单状态 order.setStatus(WorkOrder.OrderStatus.processing); order.setAssignedRepairmanId(repairmanId); @@ -300,10 +296,8 @@ public class WorkOrderServiceImpl implements WorkOrderService { } // ============================================== - // 更新维修人员状态 - Repairman repairman = repairmanOpt.get(); - repairman.setStatus(Repairman.RepairmanStatus.busy); - repairmanRepository.save(repairman); + // 改造点6:派单后动态更新维修人员状态(而非直接设为忙碌) + updateRepairmanStatusByPendingOrders(repairmanId); return true; // 派单成功 } @@ -341,4 +335,40 @@ public class WorkOrderServiceImpl implements WorkOrderService { }) .toList(); } + + // ===================== 新增核心辅助方法 ===================== + /** + * 动态更新维修人员状态:根据待处理工单数量自动判定 + * 规则:无待处理工单(pending/processing/reviewing)= 空闲;有待处理工单=忙碌 + * @param repairmanId 维修人员ID + */ + @Transactional + private void updateRepairmanStatusByPendingOrders(String repairmanId) { + // 1. 定义「待处理工单」状态集合(根据业务调整,此处包含待抢、已抢、待审核) + List pendingStatuses = Arrays.asList( + WorkOrder.OrderStatus.pending, + WorkOrder.OrderStatus.processing, + WorkOrder.OrderStatus.reviewing + ); + + // 2. 查询该维修人员的待处理工单数量(需在WorkOrderRepository中定义该方法) + long pendingOrderCount = workOrderRepository.countByAssignedRepairmanIdAndStatusIn(repairmanId, pendingStatuses); + + // 3. 动态更新维修人员状态 + Optional repairmanOpt = repairmanRepository.findById(repairmanId); + if (repairmanOpt.isPresent()) { + Repairman repairman = repairmanOpt.get(); + if (pendingOrderCount <= 0) { + // 无待处理工单 → 空闲状态 + repairman.setStatus(Repairman.RepairmanStatus.idle); + } else { + // 有待处理工单 → 忙碌状态 + repairman.setStatus(Repairman.RepairmanStatus.busy); + } + repairmanRepository.save(repairman); + log.debug("维修人员{}状态更新完成,当前待处理工单数量:{},状态:{}", + repairmanId, pendingOrderCount, repairman.getStatus()); + } + } + } \ No newline at end of file -- 2.34.1