From 5e0e7ad230dfba76d00e224e27c8488383396e0e Mon Sep 17 00:00:00 2001
From: 陈昶聿 <chychen@nbjetron.com>
Date: 星期日, 20 九月 2026 17:36:00 +0800
Subject: [PATCH] 【景宁】定时发送异常信息-景宁配置

---
 smartor/src/main/java/com/smartor/service/impl/PatMedInhospServiceImpl.java              |    1 
 ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/RyTask.java                             |   79 +++++++++++++++----
 ruoyi-admin/src/main/java/com/ruoyi/web/controller/smartor/ServiceSubtaskController.java |    7 +
 ruoyi-admin/src/main/resources/application-ls.yml                                        |    4 
 ruoyi-common/src/main/java/com/ruoyi/common/utils/TemplateUtils.java                     |  104 ++++++++++++++++++++++++++
 5 files changed, 175 insertions(+), 20 deletions(-)

diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/smartor/ServiceSubtaskController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/smartor/ServiceSubtaskController.java
index 86a1719..c826b55 100644
--- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/smartor/ServiceSubtaskController.java
+++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/smartor/ServiceSubtaskController.java
@@ -960,6 +960,13 @@
         ryTask.dealSubtaskDeadline(orgid, day);
         return AjaxResult.success("銆恉ealSubtaskDeadline銆戝悓姝ヤ换鍔″凡鍚姩锛屽ぉ鏁颁负" + day + "澶╋紝璇风◢鍚庢煡鐪嬬粨鏋�");
     }
+
+    @PostMapping("/sendExceptInfo")
+    public AjaxResult sendExceptInfo() throws Exception {
+        ryTask.sendExceptInfo();
+        return AjaxResult.success("sendExceptInfo");
+    }
+
     /**
      * 甯edis缂撳瓨鐨勭粺璁℃煡璇紝渚沺atItem鍜宲atItemCount鍏辩敤锛屾潯浠朵笉鍙樻椂鐩存帴鍛戒腑缂撳瓨
      */
diff --git a/ruoyi-admin/src/main/resources/application-ls.yml b/ruoyi-admin/src/main/resources/application-ls.yml
index 7678506..b03d3b5 100644
--- a/ruoyi-admin/src/main/resources/application-ls.yml
+++ b/ruoyi-admin/src/main/resources/application-ls.yml
@@ -257,7 +257,9 @@
 isEncryp: 0
 
 #鏂囦欢涓婁紶鍦板潃
-fileUpload: https://9.208.2.190:8092
+#fileUpload: https://9.208.2.190:8092
+#profile: /profile-api
+fileUpload: https://221.12.19.26:8093
 profile: /profile-api
 
 # 椤圭洰鐩稿叧閰嶇疆 涓芥按
diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/TemplateUtils.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/TemplateUtils.java
new file mode 100644
index 0000000..04d0eef
--- /dev/null
+++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/TemplateUtils.java
@@ -0,0 +1,104 @@
+package com.ruoyi.common.utils;
+
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.ObjectMapper;
+
+import java.beans.IntrospectionException;
+import java.beans.PropertyDescriptor;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+public class TemplateUtils {
+    private static final Pattern PATTERN = Pattern.compile("\\$\\{([^}]+)\\}");
+    private static final ObjectMapper OM = new ObjectMapper();
+
+    public static String render(String template, Object bean) {
+        if (template == null || bean == null) {
+            return template;
+        }
+        Matcher matcher = PATTERN.matcher(template);
+        StringBuffer sb = new StringBuffer();
+        while (matcher.find()) {
+            String exp = matcher.group(1);
+            Object val = getValueByExp(bean, exp);
+            String strVal = val == null ? "" : val.toString();
+            matcher.appendReplacement(sb, Matcher.quoteReplacement(strVal));
+        }
+        matcher.appendTail(sb);
+        return sb.toString();
+    }
+
+    private static Object getValueByExp(Object root, String exp) {
+        try {
+            Object curr = root;
+            if (exp.contains("#json.")) {
+                String[] parts = exp.split("#json\\.", 2);
+                String beanField = parts[0];
+                String jsonPath = parts[1];
+
+                Object jsonStrObj = getBeanField(curr, beanField);
+                // ========== Java8 鍏煎淇敼鐐� ==========
+                if (!(jsonStrObj instanceof String)) {
+                    return null;
+                }
+                String jsonStr = (String) jsonStrObj;
+                if (jsonStr.trim().isEmpty()) {
+                    return null;
+                }
+                JsonNode node = OM.readTree(jsonStr);
+                return getJsonNode(node, jsonPath);
+            }
+
+            String[] props = exp.split("\\.");
+            for (String p : props) {
+                curr = getBeanField(curr, p);
+                if (curr == null) {
+                    break;
+                }
+            }
+            return curr;
+        } catch (Exception e) {
+            return null;
+        }
+    }
+
+    private static Object getBeanField(Object bean, String fieldName)
+            throws IntrospectionException, InvocationTargetException, IllegalAccessException {
+        if (bean == null) {
+            return null;
+        }
+        PropertyDescriptor pd = new PropertyDescriptor(fieldName, bean.getClass());
+        Method getter = pd.getReadMethod();
+        return getter.invoke(bean);
+    }
+
+    private static Object getJsonNode(JsonNode node, String path) {
+        String[] arr = path.split("\\.");
+        JsonNode curr = node;
+        for (String k : arr) {
+            curr = curr.get(k);
+            if (curr == null) {
+                return null;
+            }
+        }
+        return curr.isValueNode() ? curr.asText() : curr.toString();
+    }
+
+    // 娴嬭瘯
+    public static void main(String[] args) {
+        class User {
+            private String name = "寮犱笁";
+            private Integer age = 25;
+            private String ext = "{\"phone\":\"13800138000\",\"addr\":{\"city\":\"鏉窞\"}}";
+
+            public String getName() { return name; }
+            public Integer getAge() { return age; }
+            public String getExt() { return ext; }
+        }
+        User u = new User();
+        String tpl = "濮撳悕:${name},骞撮緞:${age},鎵嬫満鍙�:${ext#json.phone},鍩庡競:${ext#json.addr.city}";
+        System.out.println(render(tpl, u));
+    }
+}
diff --git a/ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/RyTask.java b/ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/RyTask.java
index 34ada0f..e86b2f6 100644
--- a/ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/RyTask.java
+++ b/ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/RyTask.java
@@ -8,6 +8,7 @@
 import com.google.gson.Gson;
 import com.ruoyi.common.core.domain.AjaxResult;
 import com.ruoyi.common.core.domain.entity.SysDept;
+import com.ruoyi.common.core.domain.entity.SysUser;
 import com.ruoyi.common.core.redis.RedisCache;
 import com.ruoyi.common.core.service.IDingTalkService;
 import com.ruoyi.common.dx.MessageSend;
@@ -23,6 +24,7 @@
 import com.ruoyi.system.mapper.SysConfigMapper;
 import com.ruoyi.system.service.ISysConfigService;
 import com.ruoyi.system.service.ISysDeptService;
+import com.ruoyi.system.service.ISysUserService;
 import com.smartor.common.LSHospTokenUtil;
 import com.smartor.common.MtSubmitSmUtil;
 import com.smartor.common.QwenLLMUtil;
@@ -108,6 +110,9 @@
 
     @Autowired
     private IDingTalkService dingTalkService;
+
+    @Autowired
+    private ISysUserService userService;
 
 
     @Value("${localIP}")
@@ -283,31 +288,67 @@
         subtaskDetailTraceVO.setHandleFlag("0");
         List<ServiceSubtaskDetailTrace> serviceSubtaskDetailTraces =
                 serviceSubtaskDetailTraceService.selectServiceSubtaskDetailTtraceList(subtaskDetailTraceVO);
-        // 鎶� dutyDeptPersonCode 鏁寸悊鍒� list 涓紙濡傛灉澶氫釜浜虹敤閫楀彿鍒嗗壊锛屽垯灞曞紑骞跺幓閲嶏級
-        List<String> dutyDeptPersonCodeList = serviceSubtaskDetailTraces.stream()
-                .map(ServiceSubtaskDetailTrace::getDutyDeptPersonCode)
-                .filter(StringUtils::isNotBlank)
-                .flatMap(code -> Arrays.stream(code.split(",")))
-                .map(String::trim)
-                .filter(StringUtils::isNotBlank).distinct()  // 鍘婚噸
-                .collect(Collectors.toList());
         // 鑾峰彇鈥滃紓甯稿唴瀹规彁閱�"
         SysConfig sysConfig = sysConfigMapper.checkConfigKeyUnique("send.except.content");
         String exceptContent = sysConfig.getConfigValue();
 
         // 鑾峰彇鈥滃唴瀹规彁閱掓祴璇曚汉宸ュ彿鈥�
-        String testPerson = sysConfigMapper.checkConfigKeyUnique("send.test.person").getConfigValue();
-        if (StringUtils.isNotBlank(testPerson)) {
-            String[] split = testPerson.split(",");
-            if (CollectionUtils.isEmpty(dutyDeptPersonCodeList)) dutyDeptPersonCodeList = Arrays.asList(split);
-            else dutyDeptPersonCodeList.addAll(Arrays.asList(split));
-        }
+        SysConfig testPersonConfig = sysConfigMapper.checkConfigKeyUnique("send.test.person");
+        String testPerson = ObjectUtils.isNotEmpty(testPersonConfig) ? testPersonConfig.getConfigValue() : "";
+        if(CollectionUtils.isNotEmpty(serviceSubtaskDetailTraces)){
+            for (ServiceSubtaskDetailTrace serviceSubtaskDetailTrace : serviceSubtaskDetailTraces) {
+                List<String> dutyDeptPersonCodeList = new ArrayList<>();
+                        // 鎶� dutyDeptPersonCode 鏁寸悊鍒� list 涓紙濡傛灉澶氫釜浜虹敤閫楀彿鍒嗗壊锛屽垯灞曞紑骞跺幓閲嶏級
+                String dutyDeptPersonCodeStr = serviceSubtaskDetailTrace.getDutyDeptPersonCode();
+                if(StringUtils.isNotEmpty(dutyDeptPersonCodeStr)){
+                    String[] dutyDeptPersonCodeSplit = dutyDeptPersonCodeStr.split(",");
+                    if (CollectionUtils.isEmpty(dutyDeptPersonCodeList)) {
+                        dutyDeptPersonCodeList = new ArrayList<>(Arrays.asList(dutyDeptPersonCodeSplit));
+                    } else {
+                        dutyDeptPersonCodeList.addAll(Arrays.asList(dutyDeptPersonCodeSplit));
+                    }
 
-        if (CollectionUtils.isNotEmpty(dutyDeptPersonCodeList)) {
-            for (String dutyDeptPersonCode : dutyDeptPersonCodeList) {
-                log.info("銆恠endExceptInfo銆戝彂閫佷汉宸ュ彿锛歿}", dutyDeptPersonCode);
-                String dutyDeptPerson = dingTalkService.getDingTalkUserByMobile(dutyDeptPersonCode);
-                dingTalkService.sendDingTalkText(exceptContent, dutyDeptPerson);
+                }
+
+                if (StringUtils.isNotBlank(testPerson)) {
+                    String[] split = testPerson.split(",");
+                    if (CollectionUtils.isEmpty(dutyDeptPersonCodeList)) {
+                        dutyDeptPersonCodeList = new ArrayList<>(Arrays.asList(split));
+                    } else {
+                        dutyDeptPersonCodeList.addAll(Arrays.asList(split));
+                    }
+                }
+
+                if (CollectionUtils.isNotEmpty(dutyDeptPersonCodeList)) {
+                    for (String dutyDeptPersonCode : dutyDeptPersonCodeList) {
+                        log.info("銆恠endExceptInfo銆戝彂閫佷汉宸ュ彿锛歿}", dutyDeptPersonCode);
+                        SysUser sysUser = new SysUser();
+                        SysUser sysUserVo = new SysUser();
+                        sysUserVo.setUserCode(dutyDeptPersonCode);
+//                        sysUserVo.setOrgid(serviceSubtaskDetailTrace.getOrgid());
+                        List<SysUser> users = userService.getUserList(sysUserVo);
+                        String phoneNumber = "";
+                        if(ObjectUtils.isNotEmpty(users)){
+                            sysUser = users.get(0);
+                            phoneNumber = sysUser.getPhonenumber();
+                        }else {
+                            continue;
+                        }
+
+                        if(StringUtils.isEmpty(phoneNumber)){
+                            continue;
+                        }
+                        String dutyDeptPerson = dingTalkService.getDingTalkUserByMobile(phoneNumber);
+                        if(StringUtils.isNotBlank(dutyDeptPerson)){
+                            String context = TemplateUtils.render(exceptContent, serviceSubtaskDetailTrace);
+                            dingTalkService.sendDingTalkText(context, dutyDeptPerson);
+                            //鏇存柊鐘舵��
+                            serviceSubtaskDetailTrace.setHandleFlag("1");
+                            serviceSubtaskDetailTrace.setUpdateTime(new Date());
+                            serviceSubtaskDetailTraceService.updateServiceSubtaskDetailTtrace(serviceSubtaskDetailTrace);
+                        }
+                    }
+                }
             }
         }
     }
diff --git a/smartor/src/main/java/com/smartor/service/impl/PatMedInhospServiceImpl.java b/smartor/src/main/java/com/smartor/service/impl/PatMedInhospServiceImpl.java
index 53166aa..c4d03e0 100644
--- a/smartor/src/main/java/com/smartor/service/impl/PatMedInhospServiceImpl.java
+++ b/smartor/src/main/java/com/smartor/service/impl/PatMedInhospServiceImpl.java
@@ -260,6 +260,7 @@
         pmks.setDeptcheckFlag("0");
         pmks.setInhospstate("1");
         pmks.setFuflag("1");
+        pmks.setPatid(16685L);
         List<PatMedInhosp> patMedInhosps = patMedInhospMapper.selectPatMedInhospList(pmks);
 
         //1.鍏ラ櫌瀹f暀

--
Gitblit v1.9.3