From 25df88d0ab9d7444ed1d162b9efa1259ac2f6f66 Mon Sep 17 00:00:00 2001
From: longz <longzhaoz@qq.com>
Date: 星期一, 27 四月 2026 10:13:53 +0800
Subject: [PATCH] 小程序对接finish

---
 backend/src/main/java/com/sinata/appointment/service/ApprovalFlowViewApplicationService.java |   92 ++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 92 insertions(+), 0 deletions(-)

diff --git a/backend/src/main/java/com/sinata/appointment/service/ApprovalFlowViewApplicationService.java b/backend/src/main/java/com/sinata/appointment/service/ApprovalFlowViewApplicationService.java
index 48d82c5..24e1f0e 100644
--- a/backend/src/main/java/com/sinata/appointment/service/ApprovalFlowViewApplicationService.java
+++ b/backend/src/main/java/com/sinata/appointment/service/ApprovalFlowViewApplicationService.java
@@ -8,6 +8,7 @@
 import com.sinata.appointment.dto.ApprovalFlowGroupVo;
 import com.sinata.appointment.dto.ApprovalFlowNodeVo;
 import com.sinata.appointment.dto.ApprovalFlowTaskUserVo;
+import com.sinata.appointment.dto.MiniVisitedUserVo;
 import com.sinata.appointment.entity.AppointmentOrder;
 import com.sinata.appointment.entity.ApprovalInstance;
 import com.sinata.appointment.entity.ApprovalTask;
@@ -30,6 +31,7 @@
 import java.util.Map;
 import java.util.Objects;
 import java.util.Set;
+import java.util.stream.Collectors;
 import lombok.RequiredArgsConstructor;
 import org.springframework.stereotype.Service;
 import org.springframework.util.StringUtils;
@@ -120,6 +122,7 @@
                     u.setTaskStatus(t.getTaskStatus());
                     u.setComment(t.getComment());
                     u.setActionTime(t.getUpdateTime());
+                    u.setNoticeUsers(loadNoticeUsers(t.getNoticeIds(), userMap, deptNameMap));
                     g.getUsers().add(u);
                 }
                 nodeVo.getGroups().add(g);
@@ -294,17 +297,97 @@
         }
     }
 
+    private List<MiniVisitedUserVo> loadNoticeUsers(
+            String noticeIds, Map<Long, MpUser> existingUserMap, Map<Long, String> existingDeptNameMap) {
+        List<Long> ids = parseCommaSeparatedIds(noticeIds);
+        if (ids.isEmpty()) {
+            return List.of();
+        }
+        Map<Long, MpUser> userMap = existingUserMap;
+        LinkedHashSet<Long> missingIds = ids.stream()
+                .filter(id -> !existingUserMap.containsKey(id))
+                .collect(Collectors.toCollection(LinkedHashSet::new));
+        if (!missingIds.isEmpty()) {
+            List<MpUser> extraUsers =
+                    mpUserMapper.selectList(
+                            new LambdaQueryWrapper<MpUser>()
+                                    .eq(MpUser::getDelFlag, 0)
+                                    .in(MpUser::getId, missingIds));
+            userMap = new LinkedHashMap<>(existingUserMap);
+            for (MpUser extraUser : extraUsers) {
+                userMap.put(extraUser.getId(), extraUser);
+            }
+        }
+
+        Map<Long, String> deptNameMap = existingDeptNameMap;
+        LinkedHashSet<Long> missingDeptIds = ids.stream()
+                .map(userMap::get)
+                .filter(Objects::nonNull)
+                .map(MpUser::getDeptId)
+                .filter(Objects::nonNull)
+                .filter(id -> id > 0 && !existingDeptNameMap.containsKey(id))
+                .collect(Collectors.toCollection(LinkedHashSet::new));
+        if (!missingDeptIds.isEmpty()) {
+            deptNameMap = new LinkedHashMap<>(existingDeptNameMap);
+            List<SysDept> depts =
+                    sysDeptMapper.selectList(
+                            new LambdaQueryWrapper<SysDept>()
+                                    .eq(SysDept::getDelFlag, 0)
+                                    .in(SysDept::getId, missingDeptIds));
+            for (SysDept dept : depts) {
+                deptNameMap.put(dept.getId(), dept.getDeptName());
+            }
+        }
+
+        List<MiniVisitedUserVo> result = new ArrayList<>();
+        for (Long id : ids) {
+            MpUser user = userMap.get(id);
+            if (user == null) {
+                continue;
+            }
+            MiniVisitedUserVo vo = new MiniVisitedUserVo();
+            vo.setId(user.getId());
+            vo.setRealName(resolveUserName(user));
+            vo.setDeptName(user.getDeptId() == null ? null : deptNameMap.get(user.getDeptId()));
+            result.add(vo);
+        }
+        return result;
+    }
+
+    private List<Long> parseCommaSeparatedIds(String raw) {
+        if (!StringUtils.hasText(raw)) {
+            return List.of();
+        }
+        LinkedHashSet<Long> out = new LinkedHashSet<>();
+        for (String part : raw.split(",")) {
+            if (!StringUtils.hasText(part)) {
+                continue;
+            }
+            try {
+                long id = Long.parseLong(part.trim());
+                if (id > 0) {
+                    out.add(id);
+                }
+            } catch (NumberFormatException ignored) {
+            }
+        }
+        return new ArrayList<>(out);
+    }
+
     private String calcNodeStatus(List<ApprovalFlowGroupVo> groups) {
         if (groups.isEmpty()) {
             return ApprovalTaskStatus.WAITING;
         }
         boolean hasRejected = false;
+        boolean hasCancelled = false;
         boolean hasPending = false;
         boolean hasWaiting = false;
         for (ApprovalFlowGroupVo g : groups) {
             String s = g.getGroupStatus();
             if (ApprovalTaskStatus.REJECTED.equals(s)) {
                 hasRejected = true;
+            } else if (ApprovalTaskStatus.CANCELLED.equals(s)) {
+                hasCancelled = true;
             } else if (ApprovalTaskStatus.PENDING.equals(s)) {
                 hasPending = true;
             } else if (ApprovalTaskStatus.WAITING.equals(s)) {
@@ -313,6 +396,9 @@
         }
         if (hasRejected) {
             return ApprovalTaskStatus.REJECTED;
+        }
+        if (hasCancelled) {
+            return ApprovalTaskStatus.CANCELLED;
         }
         if (hasPending) {
             return ApprovalTaskStatus.PENDING;
@@ -328,11 +414,14 @@
             return ApprovalTaskStatus.WAITING;
         }
         boolean hasRejected = false;
+        boolean hasCancelled = false;
         boolean hasPending = false;
         boolean hasWaiting = false;
         for (ApprovalTask t : tasks) {
             if (ApprovalTaskStatus.REJECTED.equals(t.getTaskStatus())) {
                 hasRejected = true;
+            } else if (ApprovalTaskStatus.CANCELLED.equals(t.getTaskStatus())) {
+                hasCancelled = true;
             } else if (ApprovalTaskStatus.PENDING.equals(t.getTaskStatus())) {
                 hasPending = true;
             } else if (ApprovalTaskStatus.WAITING.equals(t.getTaskStatus())) {
@@ -342,6 +431,9 @@
         if (hasRejected) {
             return ApprovalTaskStatus.REJECTED;
         }
+        if (hasCancelled) {
+            return ApprovalTaskStatus.CANCELLED;
+        }
         if (hasPending) {
             return ApprovalTaskStatus.PENDING;
         }

--
Gitblit v1.7.1