Răsfoiți Sursa

Update 优化完善设备工单

Yue 3 luni în urmă
părinte
comite
236f4dcfed

+ 3 - 4
SERVER/ChickenFarmV3/.script/sql/new/init_y.sql

@@ -47,14 +47,13 @@ CREATE TABLE `d_device_order` (
     `complete_time` datetime NULL DEFAULT NULL COMMENT '完成时间',
     `suspend_reason` varchar(500) NULL DEFAULT NULL COMMENT '暂缓原因',
     `suspend_time` datetime NULL DEFAULT NULL COMMENT '暂缓时间',
+    `resume_time` datetime NULL DEFAULT NULL COMMENT '恢复时间',
     `acceptance_time` datetime NULL DEFAULT NULL COMMENT '验收时间',
     `acceptance_result` tinyint NULL DEFAULT NULL COMMENT '验收结果(1:通过 2:拒绝)',
     `acceptance_remark` varchar(500) NULL DEFAULT NULL COMMENT '验收备注',
     `acceptor_id` bigint NULL DEFAULT NULL COMMENT '验收人ID',
-    `plan_start_time` datetime NULL DEFAULT NULL COMMENT '计划开始时间',
-    `plan_end_time` datetime NULL DEFAULT NULL COMMENT '计划结束时间',
-    `actual_start_time` datetime NULL DEFAULT NULL COMMENT '实际开始时间',
-    `actual_end_time` datetime NULL DEFAULT NULL COMMENT '实际结束时间',
+    `fault_duration` float NULL DEFAULT 0 COMMENT '故障耗时(单位:小时)',
+    `suspend_duration` float NULL DEFAULT 0 COMMENT '暂缓时长(单位:小时)',
     `attachment_urls` text COMMENT '附件URL列表(JSON格式)',
     `create_org` bigint NOT NULL COMMENT '创建组织',
     `create_by` bigint NOT NULL COMMENT '创建人',

+ 13 - 0
SERVER/ChickenFarmV3/vb-modules/vb-device/src/main/java/cn/vber/device/controller/DeviceOrderController.java

@@ -14,6 +14,7 @@ import cn.vber.common.web.core.BaseController;
 import cn.vber.device.domain.bo.ChangeAssistantBo;
 import cn.vber.device.domain.bo.DeviceOrderBo;
 import cn.vber.device.domain.bo.OrderFlowBo;
+import cn.vber.device.domain.vo.DeviceOrderAssistantUserVo;
 import cn.vber.device.domain.vo.DeviceOrderFlowVo;
 import cn.vber.device.domain.vo.DeviceOrderVo;
 import cn.vber.device.service.IDeviceOrderService;
@@ -129,6 +130,18 @@ public class DeviceOrderController extends BaseController {
     public R<List<UserSelectDTO>> getAssUsers() {
         return R.ok(deviceOrderService.getAssUsers());
     }
+
+    /**
+     * 修改设备维修工单的助手
+     *
+     */
+    @RepeatSubmit()
+    @GetMapping("/getOrderAssUsers/{orderId}")
+    public R<DeviceOrderAssistantUserVo> getOrderAssUsers(@NotNull(message = "工单ID不能为空") @PathVariable Long orderId) {
+        return R.ok(deviceOrderService.getOrderAssUsers(orderId));
+    }
+
+
     /**
      * 修改设备维修工单的助手
      *

+ 9 - 14
SERVER/ChickenFarmV3/vb-modules/vb-device/src/main/java/cn/vber/device/domain/DeviceOrder.java

@@ -99,6 +99,11 @@ public class DeviceOrder extends BaseEntity {
      */
     private Date suspendTime;
 
+    /**
+     * 恢复时间
+     */
+    private Date resumeTime;
+
     /**
      * 验收时间
      */
@@ -120,24 +125,14 @@ public class DeviceOrder extends BaseEntity {
     private Long acceptorId;
 
     /**
-     * 计划开始时间
-     */
-    private Date planStartTime;
-
-    /**
-     * 计划结束时间
-     */
-    private Date planEndTime;
-
-    /**
-     * 实际开始时间
+     * 故障耗时(单位:小时)
      */
-    private Date actualStartTime;
+    private float faultDuration;
 
     /**
-     * 实际结束时间
+     * 暂缓时长(单位:小时)
      */
-    private Date actualEndTime;
+    private float suspendDuration;
 
     /**
      * 附件列表

+ 13 - 0
SERVER/ChickenFarmV3/vb-modules/vb-device/src/main/java/cn/vber/device/domain/vo/DeviceOrderAssistantUserVo.java

@@ -0,0 +1,13 @@
+package cn.vber.device.domain.vo;
+
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class DeviceOrderAssistantUserVo { 
+    
+    private List<Long> userIds;
+    private String pettyWorkers;
+    
+}

+ 2 - 0
SERVER/ChickenFarmV3/vb-modules/vb-device/src/main/java/cn/vber/device/domain/vo/DeviceOrderVo.java

@@ -13,6 +13,7 @@ import lombok.Data;
 import java.io.Serial;
 import java.io.Serializable;
 import java.util.Date;
+import java.util.List;
 
 
 /**
@@ -142,3 +143,4 @@ public class DeviceOrderVo implements Serializable {
 
 
 }
+

+ 10 - 0
SERVER/ChickenFarmV3/vb-modules/vb-device/src/main/java/cn/vber/device/service/IDeviceOrderService.java

@@ -6,8 +6,10 @@ import cn.vber.common.mybatis.core.page.TableDataInfo;
 import cn.vber.device.domain.bo.ChangeAssistantBo;
 import cn.vber.device.domain.bo.DeviceOrderBo;
 import cn.vber.device.domain.bo.OrderFlowBo;
+import cn.vber.device.domain.vo.DeviceOrderAssistantUserVo;
 import cn.vber.device.domain.vo.DeviceOrderFlowVo;
 import cn.vber.device.domain.vo.DeviceOrderVo;
+import jakarta.validation.constraints.NotNull;
 
 import java.util.Collection;
 import java.util.List;
@@ -91,5 +93,13 @@ public interface IDeviceOrderService {
      */
     Boolean rejectOrder(OrderFlowBo bo);
 
+    /**
+     * 获取设备维修工单的助手(所有可以协助的用户)
+     */
     List<UserSelectDTO> getAssUsers();
+
+    /**
+     * 获取设备维修工单的助手
+     */
+    DeviceOrderAssistantUserVo getOrderAssUsers( Long orderId);
 }

+ 35 - 2
SERVER/ChickenFarmV3/vb-modules/vb-device/src/main/java/cn/vber/device/service/impl/DeviceOrderServiceImpl.java

@@ -26,6 +26,7 @@ import cn.vber.device.domain.DeviceOrderFlow;
 import cn.vber.device.domain.bo.ChangeAssistantBo;
 import cn.vber.device.domain.bo.DeviceOrderBo;
 import cn.vber.device.domain.bo.OrderFlowBo;
+import cn.vber.device.domain.vo.DeviceOrderAssistantUserVo;
 import cn.vber.device.domain.vo.DeviceOrderFlowVo;
 import cn.vber.device.domain.vo.DeviceOrderVo;
 import cn.vber.device.mapper.DeviceOrderAssistantMapper;
@@ -40,6 +41,8 @@ import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
 import java.util.*;
+import java.util.concurrent.TimeUnit;
+import java.util.stream.Collectors;
 
 /**
  * 设备维修工单Service业务层处理
@@ -238,6 +241,18 @@ public class DeviceOrderServiceImpl implements IDeviceOrderService {
         return users;
     }
 
+    @Override
+    public DeviceOrderAssistantUserVo getOrderAssUsers(Long orderId) {
+        DeviceOrder order = baseMapper.selectById(orderId);
+        if (order == null) {
+            throw new ServiceException("未查询到维修工单");
+        }
+        DeviceOrderAssistantUserVo vo = new DeviceOrderAssistantUserVo();
+        vo.setPettyWorkers(order.getPettyWorkers());
+        vo.setUserIds(deviceOrderAssistantMapper.selectList(new LambdaQueryWrapper<DeviceOrderAssistant>().eq(DeviceOrderAssistant::getOrderId, orderId)).stream().map(DeviceOrderAssistant::getUserId).collect(Collectors.toList()));
+        return vo;
+    }
+
     /**
      * 变更设备维修工单协助人
      */
@@ -286,9 +301,15 @@ public class DeviceOrderServiceImpl implements IDeviceOrderService {
         if (WorkOrderStatusEnum.NOT_STARTED.getStatus()==order.getStatus()) {
             throw new ServiceException("当前工单状态不能暂缓");
         }
+        Date now = DateUtils.getNowDate();
+        if(order.getFaultDuration()>0){
+            order.setFaultDuration(order.getFaultDuration() + DateUtils.difference(order.getResumeTime(), now, TimeUnit.HOURS));
+        }else{
+            order.setFaultDuration(DateUtils.difference(order.getCreateTime(), now, TimeUnit.HOURS));
+        }
         order.setStatus(WorkOrderStatusEnum.SUSPENDED.getStatus());
         order.setSuspendReason(bo.getReason());
-        order.setSuspendTime(DateUtils.getNowDate());
+        order.setSuspendTime(now);
         boolean flag = baseMapper.updateById(order) > 0;
         if (flag) {
             String content = "暂缓维修工单:工单编号:" + order.getOrderNo() + ",暂缓原因:" + bo.getReason();
@@ -312,6 +333,10 @@ public class DeviceOrderServiceImpl implements IDeviceOrderService {
         if (WorkOrderStatusEnum.SUSPENDED.getStatus()!=order.getStatus()) {
             throw new ServiceException("当前工单状态不能恢复");
         }
+
+        Date now = DateUtils.getNowDate();
+        order.setResumeTime(now);
+        order.setSuspendDuration(order.getSuspendDuration() + DateUtils.difference(order.getSuspendTime(), now, TimeUnit.HOURS));
         order.setStatus(WorkOrderStatusEnum.PROCESSING.getStatus());
         order.setSuspendReason(null);
         order.setSuspendTime(null);
@@ -363,10 +388,18 @@ public class DeviceOrderServiceImpl implements IDeviceOrderService {
         if (WorkOrderStatusEnum.PENDING_ACCEPTANCE.getStatus()!=order.getStatus()) {
             throw new ServiceException("当前工单状态不能验收");
         }
+        Date now = DateUtils.getNowDate();
+        if(order.getFaultDuration()>0){
+            order.setFaultDuration(order.getFaultDuration() + DateUtils.difference(order.getResumeTime(), now, TimeUnit.HOURS));
+        }else{
+            order.setFaultDuration(DateUtils.difference(order.getCreateTime(), now, TimeUnit.HOURS));
+        }
         order.setStatus(WorkOrderStatusEnum.COMPLETED.getStatus());
         order.setAcceptorId(LoginHelper.getUserId());
+        order.setAcceptanceRemark(bo.getReason());
         order.setAcceptanceResult(WorkOrderAcceptanceResultEnum.PASS.getResult());
-        order.setAcceptanceTime(DateUtils.getNowDate());
+        order.setAcceptanceTime(now);
+        order.setCompleteTime(now);
         boolean flag = baseMapper.updateById(order) > 0;
         if (flag) {
             String content = "验收维修工单:工单编号:" + order.getOrderNo();

+ 17 - 6
SERVER/ChickenFarmV3/vb-modules/vb-system/src/main/java/cn/vber/system/service/impl/SysNoticeServiceImpl.java

@@ -27,6 +27,7 @@ import cn.vber.system.mapper.SysNoticeStatusMapper;
 import cn.vber.system.mapper.SysUserMapper;
 import cn.vber.system.service.ISysNoticeService;
 import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
 import org.jetbrains.annotations.NotNull;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
@@ -40,6 +41,7 @@ import java.util.*;
  */
 @RequiredArgsConstructor
 @Service
+@Slf4j
 public class SysNoticeServiceImpl implements ISysNoticeService, NoticeService {
 
     private final SysNoticeMapper baseMapper;
@@ -271,13 +273,22 @@ public class SysNoticeServiceImpl implements ISysNoticeService, NoticeService {
         msg.setMessageTitle(notice.getNoticeTitle());
         msg.setNoticeType(notice.getNoticeType());
         msg.setMessageTime(notice.getCreateTime());
-        NoticeMessageDetailDto detail = JsonUtils.parseObject(notice.getNoticeContent(), NoticeMessageDetailDto.class);
-        if(detail != null){
-          msg.setBusinessType(detail.getBusinessType());
-          msg.setData(detail.getData());
-          msg.setMessageContent(detail.getContent());
-          msg.setAlertType(detail.getAlertType());
+        if(notice.getNoticeType().equals("1")){
+           try {
+               NoticeMessageDetailDto detail = JsonUtils.parseObject(notice.getNoticeContent(), NoticeMessageDetailDto.class);
+               if(detail != null){
+                   msg.setBusinessType(detail.getBusinessType());
+                   msg.setData(detail.getData());
+                   msg.setMessageContent(detail.getContent());
+                   msg.setAlertType(detail.getAlertType());
+               }
+           }catch (Exception e){
+               log.error("解析通知内容失败", e);
+           }
+        }else{
+           msg.setMessageContent(notice.getNoticeContent());
         }
+
         return msg;
     }
 

+ 5 - 0
UI/VB.VUE/src/api/device/_deviceOrder.ts

@@ -81,6 +81,11 @@ class deviceOrderApi {
 			url: `/device/deviceOrder/getAssUsers`
 		})
 	}
+	getOrderAssUsers = (orderId: any) => {
+		return Rs.get({
+			url: `/device/deviceOrder/getOrderAssUsers/${orderId}`
+		})
+	}
 	// 修改设备维修工单协助人
 	updateAssistant = (data: any) => {
 		return Rs.post({

+ 0 - 1
UI/VB.VUE/src/stores/_notice.ts

@@ -8,7 +8,6 @@ export const useNoticeStore = defineStore("noticeStore", () => {
 
 	function loadNotice() {
 		apis.system.noticeApi.getAllMessage().then((res) => {
-			console.log("NOTICE", res)
 			notices.value = res.data.map((item: any) => {
 				return {
 					title: item.messageTitle,

+ 9 - 8
UI/VB.VUE/src/views/workOrder/_order.vue

@@ -20,7 +20,6 @@ const props = withDefaults(
 			| "detail"
 		)[]
 		customBtns?: ToolBtn[]
-
 		status?: number
 		reporterId?: number
 		receiverId?: number
@@ -424,13 +423,15 @@ function handleAddAssistants() {
 		message.msgError("请选择工单")
 		return
 	}
-	assForm.value = {
-		orderId: row.id,
-		userIds: [],
-		userNames: [],
-		pettyWorkers: ""
-	}
-	assModalRef.value.show()
+	apis.device.deviceOrderApi.getOrderAssUsers(row.id).then((res: any) => {
+		assForm.value = {
+			orderId: row.id,
+			userIds: res.data.userIds,
+			userNames: [],
+			pettyWorkers: res.data.pettyWorkers
+		}
+		assModalRef.value.show()
+	})
 }
 // 提交添加协助人员
 function submitAddAssistantForm() {

+ 1 - 1
UI/VB.VUE/src/views/workOrder/myReceiveR.vue

@@ -13,7 +13,7 @@ const customBtns = [
 		}
 	}
 ]
-const actions = ["update", "detail", "suspend", "resume", "complete"]
+const actions = ["update", "detail", "suspend", "resume", "submit"]
 </script>
 <template>
 	<DOrder