From a8e4132c3e2e9c3b3fcb0360901b35571b6464ea Mon Sep 17 00:00:00 2001
From: hsy <1029150275@qq.com>
Date: 星期五, 28 八月 2026 10:13:01 +0800
Subject: [PATCH] feat: 综合业务模块功能补充与实体拓展

---
 src/main/java/com/ruoyi/approve/service/impl/ApprovalInstanceServiceImpl.java |  108 +++++++++++++++++++++++++++++++++++++++++++++++++++---
 1 files changed, 102 insertions(+), 6 deletions(-)

diff --git a/src/main/java/com/ruoyi/approve/service/impl/ApprovalInstanceServiceImpl.java b/src/main/java/com/ruoyi/approve/service/impl/ApprovalInstanceServiceImpl.java
index 62d083d..6d3b8d6 100644
--- a/src/main/java/com/ruoyi/approve/service/impl/ApprovalInstanceServiceImpl.java
+++ b/src/main/java/com/ruoyi/approve/service/impl/ApprovalInstanceServiceImpl.java
@@ -48,6 +48,11 @@
 import com.ruoyi.sales.pojo.ShippingInfo;
 import com.ruoyi.staff.mapper.HolidayApplicationMapper;
 import com.ruoyi.staff.pojo.HolidayApplication;
+import com.alibaba.fastjson2.JSONObject;
+import com.ruoyi.device.pojo.DeviceStatusChangeRecord;
+import com.ruoyi.device.service.IDeviceStatusChangeRecordService;
+import com.ruoyi.device.pojo.DeviceLedger;
+import com.ruoyi.device.service.IDeviceLedgerService;
 import lombok.RequiredArgsConstructor;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
@@ -94,6 +99,8 @@
     private final EnterpriseNewsMapper enterpriseNewsMapper;
     private final EnterpriseNewsScopeDeptMapper enterpriseNewsScopeDeptMapper;
     private final ApprovalTemplateNodeApproverMapper approvalTemplateNodeApproverMapper;
+    private final IDeviceStatusChangeRecordService deviceStatusChangeRecordService;
+    private final IDeviceLedgerService deviceLedgerService;
 
     @Override
     public R listPage(Page<ApprovalInstanceVo> page, ApprovalInstanceDto approvalInstanceDto) {
@@ -167,6 +174,63 @@
         approvalInstanceDto.setInstanceNo(instanceNo);
         approvalInstanceDto.setStatus("PENDING");
         approvalInstanceDto.setCurrentLevel(1);
+
+        if (approvalInstanceDto.getApplicantId() == null) {
+            approvalInstanceDto.setApplicantId(SecurityUtils.getUserId());
+            LoginUser loginUser = SecurityUtils.getLoginUser();
+            if (loginUser != null && loginUser.getUser() != null) {
+                approvalInstanceDto.setApplicantName(loginUser.getUser().getNickName());
+            }
+        }
+
+        // 鏍¢獙璁惧鐘舵�佸彉鏇村鎵癸細濡傛灉璇ヨ澶囧凡鏈夋鍦ㄥ鎵圭殑浠诲姟锛屾棤娉曞啀娆¤繘琛屽鎵�
+        if (TypeEnums.DEVICE_STATUS_CHANGE_APPROVAL.getCode().equals(approvalInstanceDto.getBusinessType())) {
+            Long deviceId = approvalInstanceDto.getBusinessId();
+
+            long pendingCount = deviceStatusChangeRecordService.count(Wrappers.<DeviceStatusChangeRecord>lambdaQuery()
+                    .eq(DeviceStatusChangeRecord::getDeviceId, deviceId)
+                    .eq(DeviceStatusChangeRecord::getApprovalStatus, "PENDING")
+                    .eq(DeviceStatusChangeRecord::getDeleted, 0)
+            );
+            if (pendingCount > 0) {
+                throw new ServiceException("璇ヨ澶囧凡鏈夋鍦ㄨ繘琛岀殑鐘舵�佸彉鏇村鎵癸紝鏃犳硶鍐嶆鎻愪氦");
+            }
+
+            DeviceLedger device = deviceLedgerService.getById(deviceId);
+            if (device == null) {
+                throw new ServiceException("璁惧涓嶅瓨鍦�");
+            }
+
+            Integer targetStatus = null;
+            String reason = "";
+            if (StringUtils.hasText(approvalInstanceDto.getFormConfig())) {
+                try {
+                    JSONObject formObj = JSONObject.parseObject(approvalInstanceDto.getFormConfig());
+                    if (formObj.containsKey("targetStatus")) {
+                        targetStatus = formObj.getInteger("targetStatus");
+                    } else if (formObj.containsKey("status")) {
+                        targetStatus = formObj.getInteger("status");
+                    }
+                    if (formObj.containsKey("reason")) {
+                        reason = formObj.getString("reason");
+                    }
+                } catch (Exception e) {
+                    log.error("瑙f瀽鐘舵�佸彉鏇磋〃鍗曞け璐�", e);
+                }
+            }
+
+            DeviceStatusChangeRecord record = new DeviceStatusChangeRecord();
+            record.setDeviceId(deviceId);
+            record.setOriginalStatus(Integer.valueOf(device.getStatus()));
+            record.setTargetStatus(targetStatus);
+            record.setReason(reason);
+            record.setApprovalStatus("PENDING");
+            deviceStatusChangeRecordService.save(record);
+
+            // 缁戝畾鍒板叧鑱旇褰曠殑涓婚敭
+            approvalInstanceDto.setBusinessId(record.getId());
+        }
+
         boolean saved = this.save(approvalInstanceDto);
         if (!saved) {
             return false;
@@ -284,7 +348,7 @@
         );
         //瀹℃壒鎷掔粷鐨勫鐞�
         if ("REJECTED".equals(approveAction)) {
-            return rejectCurrentNode(instance, currentNode, now);
+            return rejectCurrentNode(instance, currentNode, approvalInstanceDto.getApproveComment(), now);
         }
         if (!approveProcessConfigNodeUtils.canProceedToNextLevel(instance.getId(), currentNode.getApproveType())) {
             return R.ok("瀹℃壒鎴愬姛锛岀瓑寰呭叾浠栧鎵逛汉澶勭悊");
@@ -333,7 +397,7 @@
                 currentInstance.setStatus("APPROVED");
                 currentInstance.setFinishTime(LocalDateTime.now());
                 this.updateById(currentInstance);
-                handleBusinessAfterApprovalFinished(currentInstance);
+                handleBusinessAfterApprovalFinished(currentInstance, null);
                 return R.ok("瀹℃壒宸插畬鎴�");
             }
 
@@ -410,7 +474,7 @@
         );
     }
 
-    private R rejectCurrentNode(ApprovalInstance instance, ApprovalInstanceNode currentNode, LocalDateTime now) {
+    private R rejectCurrentNode(ApprovalInstance instance, ApprovalInstanceNode currentNode, String approveComment, LocalDateTime now) {
         if (!updateCurrentNodeStatus(currentNode.getId(), "REJECTED", now)) {
             return R.ok("褰撳墠鑺傜偣宸插鐞嗗畬鎴�");
         }
@@ -420,7 +484,7 @@
         instance.setFinishTime(now);
         this.updateById(instance);
         // 缁熶竴澶勭悊涓氬姟鐘舵�佹洿鏂�
-        handleBusinessAfterApprovalFinished(instance);
+        handleBusinessAfterApprovalFinished(instance, approveComment);
         return R.ok("瀹℃壒宸查┏鍥�");
     }
 
@@ -484,7 +548,7 @@
             instance.setStatus("APPROVED");
             instance.setFinishTime(now);
             this.updateById(instance);
-            handleBusinessAfterApprovalFinished(instance);
+            handleBusinessAfterApprovalFinished(instance, null);
             return R.ok("瀹℃壒宸插畬鎴�");
         }
 
@@ -521,7 +585,7 @@
         );
     }
 
-    private void handleBusinessAfterApprovalFinished(ApprovalInstance instance) {
+    private void handleBusinessAfterApprovalFinished(ApprovalInstance instance, String rejectReason) {
         String status = instance.getStatus();
         Long businessType = instance.getBusinessType();
         if (TypeEnums.PURCHASE_APPROVAL.getCode().equals(businessType)) {
@@ -549,7 +613,39 @@
         }
         if (TypeEnums.ENTERPRISE_NEWS_APPROVAL.getCode().equals(businessType)) {
             handleNewsApprovalFinished(instance, status);
+            return;
         }
+        if (TypeEnums.DEVICE_STATUS_CHANGE_APPROVAL.getCode().equals(businessType)) {
+            handleDeviceStatusChangeApprovalFinished(instance, status, rejectReason);
+            return;
+        }
+    }
+
+    private void handleDeviceStatusChangeApprovalFinished(ApprovalInstance instance, String status, String rejectReason) {
+        if (instance == null || instance.getBusinessId() == null) {
+            return;
+        }
+        DeviceStatusChangeRecord record = deviceStatusChangeRecordService.getById(instance.getBusinessId());
+        if (record == null) {
+            return;
+        }
+        if ("APPROVED".equals(status)) {
+            record.setApprovalStatus("APPROVED");
+            if (record.getTargetStatus() != null) {
+                DeviceLedger device = new DeviceLedger();
+                device.setId(record.getDeviceId());
+                device.setStatus(String.valueOf(record.getTargetStatus()));
+                deviceLedgerService.updateById(device);
+            }
+        } else if ("REJECTED".equals(status)) {
+            record.setApprovalStatus("REJECTED");
+            if (rejectReason != null) {
+                record.setRejectReason(rejectReason);
+            }
+        } else if ("PENDING".equals(status)) {
+            record.setApprovalStatus("PENDING");
+        }
+        deviceStatusChangeRecordService.updateById(record);
     }
 
     private void handleReimbursementApprovalFinished(ApprovalInstance instance, String status) {

--
Gitblit v1.9.3