From cf8712a9c0816559f50644f15672e7359028c4c4 Mon Sep 17 00:00:00 2001
From: 陈昶聿 <chychen@nbjetron.com>
Date: 星期三, 11 十一月 2026 14:02:58 +0800
Subject: [PATCH] 妇幼-住院完成生成

---
 ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/RyTask.java |  142 +++++++++++++++++++++++++++++++++++++++++++----
 1 files changed, 130 insertions(+), 12 deletions(-)

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 3f3c482..274ac21 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
@@ -33,6 +33,7 @@
 import com.ruoyi.system.service.ISysUserService;
 import com.ruoyi.message.sms.provider.sltd.ws.MessageSend;
 import com.smartor.common.QwenLLMUtil;
+import com.smartor.common.SpecificArchiveConstants;
 import com.smartor.domain.*;
 import com.ruoyi.task.domain.VO.ServiceSubtaskDetailTraceVO;
 import com.smartor.mapper.*;
@@ -68,8 +69,12 @@
 import com.ruoyi.task.domain.ServiceSubtask;
 import com.ruoyi.task.domain.ServiceSubtaskRecord;
 import com.ruoyi.task.domain.ServiceTask;
+import com.ruoyi.task.domain.ServiceTaskSchedule;
+import com.ruoyi.task.domain.ServiceTaskScheduleDetail;
 import com.ruoyi.task.mapper.ServiceSubtaskMapper;
 import com.ruoyi.task.mapper.ServiceTaskMapper;
+import com.ruoyi.task.mapper.ServiceTaskScheduleMapper;
+import com.ruoyi.task.mapper.ServiceTaskScheduleDetailMapper;
 import com.ruoyi.task.domain.ServiceSubtaskDetailTrace;
 import com.ruoyi.task.domain.VO.ServiceSubtaskDetailTraceVO;
 import com.ruoyi.task.service.IServiceSubtaskDetailTraceService;
@@ -144,6 +149,12 @@
     private ICollectHISService ichService;
 
     @Autowired
+    private IPatSpecificArchiveGenerateService patSpecificArchiveGenerateService;
+
+    @Autowired
+    private com.ruoyi.task.event.FollowupCompletedEventPublisher followupCompletedEventPublisher;
+
+    @Autowired
     private ISysConfigService configService;
 
     @Autowired
@@ -166,6 +177,12 @@
 
     @Autowired
     private ServiceSubtaskMapper serviceSubtaskMapper;
+
+    @Autowired
+    private ServiceTaskScheduleMapper serviceTaskScheduleMapper;
+
+    @Autowired
+    private ServiceTaskScheduleDetailMapper serviceTaskScheduleDetailMapper;
 
     @Autowired
     private RedisCache redisCache;
@@ -1168,11 +1185,31 @@
             Optional<Long> currentSort = serviceSubtaskPreachforms.stream().filter(item -> serviceSubtask.getCurrentPreachform().equals(item.getPreachform())).map(ServiceSubtaskPreachform::getSort).findFirst();
             Optional<Long> id = serviceSubtaskPreachforms.stream().filter(item -> serviceSubtask.getCurrentPreachform().equals(item.getPreachform())).map(ServiceSubtaskPreachform::getId).findFirst();
             if (currentSort.isPresent()) {
+                // 鏂规B锛氬彧澶勭悊褰撳墠瀛愪换鍔♀�斺�斿叕浼楀彿宸查鍙�(service_subtask.sendstate=1 + current_preachform=5)
+                // 涓旀湭濉啓鏃讹紝鎸夐粯璁ら�夐」瀹屾垚锛岄伩鍏嶈繘鍏ヤ笅涓�绉嶅彂閫佹柟寮忔垨鏈�鍚庝竴姝ヨ秴鏃躲��
+                // 鍏堢敤鍐呭瓨瀛楁蹇�熻繃婊わ紝鍏朵粬鍖婚櫌/浠诲姟/鍙戦�佹柟寮忎笉浼氳繘鍏ヤ笅闈㈢殑榛樿瀹屾垚閫昏緫銆�
+                if (IServiceSubtaskService.WECHAT_DEFAULT_COMPLETE_ORGID.equals(serviceSubtask.getOrgid())
+                        && "2".equals(serviceSubtask.getType())
+                        && "5".equals(serviceSubtask.getCurrentPreachform())
+                        && Long.valueOf(1L).equals(serviceSubtask.getSendstate())
+                        && !Long.valueOf(1L).equals(serviceSubtask.getSubmit())) {
+                    try {
+                        if (iServiceSubtaskService.completeWechatClaimedByDefault(serviceSubtask)) {
+                            log.info("銆恈ompensateTask銆憇ubid锛歿}锛屽井淇″叕浼楀彿宸查鍙栨湭濉啓锛屾寜榛樿閫夐」瀹屾垚", serviceSubtask.getId());
+                            continue;
+                        }
+                    } catch (Exception e) {
+                        // 鍗曚釜瀛愪换鍔″け璐ヤ笉褰卞搷鍏朵粬浠诲姟锛屽洖婊氬悗缁х画鍘熻ˉ鍋挎祦绋�
+                        log.error("銆恈ompensateTask銆戝井淇″叕浼楀彿榛樿瀹屾垚澶辫触锛宻ubid锛歿}锛岀户缁師琛ュ伩娴佺▼", serviceSubtask.getId(), e);
+                    }
+                }
+
                 //1鍏堟鏌ヤ竴涓嬶紝鏄笉鏄湁鎵ц鐘舵�佹槸瀹屾垚鐨勶紙鎬曚箣鍓嶅凡缁忔湁瀹岀殑浜嗭紝娌℃湁灏唖ervuce_subtask鐨勭姸鎬佹敼鎴愬姛锛岃繖閲屽啀妫�鏌ヤ竴涓嬶級
                 boolean finishState = serviceSubtaskPreachforms.stream().allMatch(item -> item.getSendstate().equals("9"));
                 if (finishState) {
                     serviceSubtask.setSendstate(6L);
                     serviceSubtaskMapper.updateServiceSubtask(serviceSubtask);
+                    followupCompletedEventPublisher.publish(serviceSubtask.getId());
                     continue;
                 }
 
@@ -1379,7 +1416,7 @@
                     serviceOutPath.setOrgid(serviceSubtask.getOrgid());
                     iServiceOutPathService.insertServiceOutPath(serviceOutPath);
                     String url = "";
-                    String format = String.format("%03X", serviceOutPath.getId());
+                    String format = ShortCode.encode(serviceOutPath.getId());
                     //鍏堝垽鏂竴涓嬪彂鐨勬槸涓嶆槸瀹f暀
                     log.info("serviceSubtask.getType鐨勫�间负锛歿}", serviceSubtask.getType());
                     if (!"3".equals(serviceSubtask.getType())) {
@@ -1522,7 +1559,7 @@
                     serviceOutPath.setCreateTime(new Date());
                     serviceOutPath.setOrgid(serviceSubtask.getOrgid());
                     iServiceOutPathService.insertServiceOutPath(serviceOutPath);
-                    String format = String.format("%03X", serviceOutPath.getId());
+                    String format = ShortCode.encode(serviceOutPath.getId());
                     serviceOutPath.setRadix(format);
                     serviceOutPath.setUpdateTime(new Date());
                     serviceOutPath.setUrl(url);
@@ -1685,6 +1722,7 @@
                 //璇存槑锛屽湪鏌愮鏂瑰紡鍙戦�佸け璐ュ悗锛屽張鎴愬姛浜嗭紙渚嬪鐭俊鎴栧叕浼楀彿锛屽湪瑙勫畾鏃堕棿澶栨偅鑰呭仛瀹屼簡锛岃繖涓椂鍊欙紝鐘舵�佹敼鎴愪簡9锛�
                 serviceSubtask.setSendstate(6L);
                 serviceSubtaskMapper.updateServiceSubtask(serviceSubtask);
+                followupCompletedEventPublisher.publish(serviceSubtask.getId());
                 return "-1";
             }
             // 褰搒ort绛変簬鍒楄〃size鏃讹紝骞朵笖鎵�鏈塻endstate閮戒笉绛変簬9锛屽垯杩斿洖-1
@@ -1777,6 +1815,25 @@
             log.info("銆恉ealHisData銆慔IS缁撴潫閲囬泦鏁版嵁");
         } catch (Exception e) {
             log.error("銆恉ealHisData銆慔IS鏁版嵁閲囬泦寮傚父", e);
+        }
+    }
+
+    /**
+     * 閲囬泦涓芥按甯傚骞间繚鍋ラ櫌闂ㄨ瘖鎺ヨ瘖瀹屾垚璁板綍锛屽苟鎸夐厤缃敓鎴愬绉�/鍎跨妗f銆�
+     * 瀹氭椂浠诲姟榛樿閲囬泦鏄ㄥぉ 00:00:00 ~ 浠婂ぉ 00:00:00銆�
+     */
+    public void collectMchArchive() {
+        try {
+            LocalDateTime todayZero = LocalDateTime.now().with(LocalTime.MIN);
+            LocalDateTime yesterdayZero = todayZero.minusDays(1);
+            Date startTime = Date.from(yesterdayZero.atZone(ZoneId.systemDefault()).toInstant());
+            Date endTime = Date.from(todayZero.atZone(ZoneId.systemDefault()).toInstant());
+            log.info("銆恈ollectMchArchive銆戝紑濮嬮噰闆嗕附姘村骞奸棬璇婃帴璇婂畬鎴愯褰�");
+            ichService.collectMchOuthospAndGenerateArchive(
+                    SpecificArchiveConstants.LISHUI_MCH_ORG_ID, startTime, endTime);
+            log.info("銆恈ollectMchArchive銆戜附姘村骞奸棬璇婃帴璇婂畬鎴愯褰曢噰闆嗙粨鏉�");
+        } catch (Exception e) {
+            log.error("銆恈ollectMchArchive銆戜附姘村骞奸棬璇婃帴璇婂畬鎴愯褰曢噰闆嗗紓甯�", e);
         }
     }
 
@@ -1893,6 +1950,9 @@
         serviceSubtask.setRemark(StringUtils.isNotEmpty(serviceSubtask.getRemark()) ? serviceSubtask.getRemark() + "," + remark : remark);
         log.info("serviceSubtask鐨勫叆鍙傛槸锛歿}",serviceSubtask);
         serviceSubtaskMapper.updateServiceSubtask(serviceSubtask);
+        if (Long.valueOf(6L).equals(serviceSubtask.getSendstate())) {
+            followupCompletedEventPublisher.publish(serviceSubtask.getId());
+        }
         return true;
     }
 
@@ -2013,22 +2073,66 @@
         if (Objects.isNull(serviceSubtask) || CollectionUtils.isEmpty(serviceSubtaskPreachforms)) {
             return false;
         }
-        // 鍩哄噯鏃跺埢锛氬嚭闄㈡椂闂� + 鍙戦�佹棩锛坰endDay 缂虹渷鎸� 1锛夛紝骞跺厹搴曢伩鍏� NPE/鑴忔暟鎹�
-        if (serviceSubtask.getEndtime() == null) {
-            log.warn("銆恑sSubtaskDeadline銆憇ubid锛歿} endtime涓虹┖锛屾棤娉曡绠楄秴鏃讹紝鎸夋湭瓒呮椂澶勭悊", serviceSubtask.getId());
-            return false;
-        }
         ServiceTask serviceTask = serviceTaskMapper.selectServiceTaskByTaskid(serviceSubtask.getTaskid());
-        int sendDay = serviceTask != null && serviceTask.getSendDay() != null ? serviceTask.getSendDay().intValue() : 1;
-        Date deadline = DateUtils.addDays(serviceSubtask.getEndtime(), sendDay);
-        int sumCompensateTime = CollectionUtils.isEmpty(serviceSubtaskPreachforms) ? 0 : serviceSubtaskPreachforms.stream()
+        Date deadline;
+        if (serviceTask != null && "5".equals(serviceTask.getAppltype())) {
+            // 浠诲姟缁勶細鍩哄噯 = schedule_benchmark 瑙f瀽鍑虹殑鏃堕棿 + day_offset锛屼笉鍙犲姞 send_day
+            deadline = resolveTaskGroupDeadlineBase(serviceSubtask);
+            if (deadline == null) {
+                log.warn("銆恑sSubtaskDeadline銆憇ubid锛歿} 浠诲姟缁勫熀鍑嗘椂闂翠负绌猴紝鏃犳硶璁$畻瓒呮椂锛屾寜鏈秴鏃跺鐞�", serviceSubtask.getId());
+                return false;
+            }
+        } else {
+            // 闈炰换鍔$粍锛氬熀鍑� = 鍑洪櫌鏃堕棿 + 鍙戦�佹棩锛坰endDay 缂虹渷鎸� 1锛�
+            if (serviceSubtask.getEndtime() == null) {
+                log.warn("銆恑sSubtaskDeadline銆憇ubid锛歿} endtime涓虹┖锛屾棤娉曡绠楄秴鏃讹紝鎸夋湭瓒呮椂澶勭悊", serviceSubtask.getId());
+                return false;
+            }
+            int sendDay = serviceTask != null && serviceTask.getSendDay() != null ? serviceTask.getSendDay().intValue() : 1;
+            deadline = DateUtils.addDays(serviceSubtask.getEndtime(), sendDay);
+        }
+        int sumCompensateTime = serviceSubtaskPreachforms.stream()
                 .mapToInt(x -> NumberUtils.toInt(x.getCompensateTime(), 0))
                 .sum();
         sumCompensateTime = sumCompensateTime + 1;
-        // 鍙ˉ鍋挎渶鍚庝竴姝ヨ嚜韬殑琛ュ伩鏃堕棿锛堝ぉ锛夛紝鑴忓�间竴寰嬫寜 0 鍏滃簳
+        // 琛ュ伩鏃堕棿鑴忓�间竴寰嬫寜 0 鍏滃簳锛屾渶鍚庡啀鍔� 1 澶╁闄�
         deadline = DateUtils.addDays(deadline, sumCompensateTime);
-        // 鍑洪櫌(鍙戦��)鏃堕棿 + 鏈琛ュ伩鏃堕棿 灏忎簬褰撳墠鏃堕棿 -> 瓒呮椂
         return deadline.getTime() < new Date().getTime();
+    }
+
+    /**
+     * 浠诲姟缁勫熀鍑嗘椂闂达細鎸� schedule_benchmark 瑙f瀽鍚庡姞 day_offset銆�
+     * 0/鍏跺畠-鑷畾涔夋椂闂� 1-鍏ラ櫌 2-鍑洪櫌 3-灏辫瘖 4-鍏ョ粍
+     */
+    private Date resolveTaskGroupDeadlineBase(ServiceSubtask serviceSubtask) {
+        if (serviceSubtask.getScheduleId() == null || serviceSubtask.getScheduleDetailId() == null) {
+            return null;
+        }
+        ServiceTaskSchedule schedule = serviceTaskScheduleMapper.selectServiceTaskScheduleById(serviceSubtask.getScheduleId());
+        ServiceTaskScheduleDetail detail = serviceTaskScheduleDetailMapper.selectServiceTaskScheduleDetailById(serviceSubtask.getScheduleDetailId());
+        if (schedule == null || detail == null || detail.getDayOffset() == null) {
+            return null;
+        }
+        Date base;
+        Integer benchmark = schedule.getScheduleBenchmark() == null ? 0 : schedule.getScheduleBenchmark();
+        switch (benchmark) {
+            case 1:
+                base = serviceSubtask.getStarttime();
+                break;
+            case 2:
+                base = serviceSubtask.getEndtime();
+                break;
+            case 3:
+                base = serviceSubtask.getAdmindate();
+                break;
+            case 4:
+                base = serviceSubtask.getCreateTime();
+                break;
+            default:
+                base = schedule.getScheduleBenchmarkCustomTime();
+                break;
+        }
+        return base == null ? null : DateUtils.addDays(base, detail.getDayOffset());
     }
 
     /**
@@ -2104,4 +2208,18 @@
         }
     }
 
+    /**
+     * 浣忛櫌闅忚瀹屾垚鐢熸垚涓撶妗f琛ュ伩浠诲姟銆�
+     *
+     * <p>鎵弿杩� 7 澶╁凡瀹屾垚浣嗘湭鐢熸垚鏃ュ織鐨勪綇闄㈤殢璁匡紝鎸夐厤缃ˉ鐢熸垚濡囩/鍎跨妗f銆�</p>
+     */
+    public void generateInhospFollowupArchive() {
+        try {
+            int generated = patSpecificArchiveGenerateService.compensateInhospFollowups();
+            log.info("銆恎enerateInhospFollowupArchive銆戜綇闄㈤殢璁夸笓绉戞。妗堣ˉ鍋垮畬鎴愶紝鐢熸垚鏁伴噺={}", generated);
+        } catch (Exception e) {
+            log.error("銆恎enerateInhospFollowupArchive銆戜綇闄㈤殢璁夸笓绉戞。妗堣ˉ鍋垮け璐�", e);
+        }
+    }
+
 }

--
Gitblit v1.9.3