From cc479e6a056785103996cc7ea67dbd5faa3e800e Mon Sep 17 00:00:00 2001
From: liusheng <337615773@qq.com>
Date: 星期一, 19 十月 2026 18:07:22 +0800
Subject: [PATCH] 数据采集模块
---
ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/RyTask.java | 1500 +++++++++++++++++++++++++++++++++++------------------------
1 files changed, 887 insertions(+), 613 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 0d636fa..4c9a20d 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,26 +8,32 @@
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.dx.MessageSend;
-import com.ruoyi.common.enums.MsgLSEnum;
+import com.ruoyi.common.core.service.IDingTalkService;
import com.ruoyi.common.enums.ServiceFromEnum;
-import com.ruoyi.common.enums.WxGZHEnum;
import com.ruoyi.common.utils.*;
import com.ruoyi.common.utils.http.HttpUtils;
-import com.ruoyi.common.utils.sms.smsUtils;
+import com.ruoyi.message.SendResult;
+import com.ruoyi.message.sms.SmsSendRequest;
+import com.ruoyi.message.sms.SmsSenderFactory;
+import com.ruoyi.message.sms.provider.xh.XinHuaSmsSender;
+import com.ruoyi.message.wechat.WechatSendRequest;
+import com.ruoyi.message.wechat.WechatSenderFactory;
+import com.ruoyi.quartz.constant.MzGatherConstant;
+import com.ruoyi.quartz.enums.MzGatherParamEnum;
+import com.ruoyi.quartz.enums.MzGatherSlotEnum;
+import com.ruoyi.quartz.enums.MzGatherStatusEnum;
import com.ruoyi.quartz.service.ICollectHISService;
-import com.ruoyi.quartz.util.CreateDataTable;
import com.ruoyi.system.domain.SysConfig;
import com.ruoyi.system.mapper.SysConfigMapper;
import com.ruoyi.system.service.ISysConfigService;
import com.ruoyi.system.service.ISysDeptService;
-import com.smartor.common.LSHospTokenUtil;
-import com.smartor.common.MtSubmitSmUtil;
+import com.ruoyi.system.service.ISysUserService;
+import com.ruoyi.message.sms.provider.sltd.ws.MessageSend;
import com.smartor.common.QwenLLMUtil;
import com.smartor.domain.*;
-import com.smartor.domain.VO.ServiceSubtaskDetailTraceVO;
-import com.smartor.domain.entity.ServiceSubtaskEntity;
+import com.ruoyi.task.domain.VO.ServiceSubtaskDetailTraceVO;
import com.smartor.mapper.*;
import com.smartor.service.*;
import lombok.extern.slf4j.Slf4j;
@@ -42,7 +48,6 @@
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Paths;
-import java.security.MessageDigest;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
@@ -53,8 +58,24 @@
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;
-import static cn.hutool.core.convert.Convert.toHex;
-
+import com.ruoyi.template.domain.HeLibrary;
+import com.ruoyi.inhospvisit.domain.PatMedInhosp;
+import com.ruoyi.template.api.TemplateFacade;
+import com.ruoyi.common.core.domain.entity.PatArchive;
+import com.ruoyi.task.domain.entity.ServiceSubtaskEntity;
+import com.ruoyi.task.domain.ServiceSubtask;
+import com.ruoyi.task.domain.ServiceSubtaskRecord;
+import com.ruoyi.task.domain.ServiceTask;
+import com.ruoyi.task.mapper.ServiceSubtaskMapper;
+import com.ruoyi.task.mapper.ServiceTaskMapper;
+import com.ruoyi.task.domain.ServiceSubtaskDetailTrace;
+import com.ruoyi.task.domain.VO.ServiceSubtaskDetailTraceVO;
+import com.ruoyi.task.service.IServiceSubtaskDetailTraceService;
+import com.ruoyi.task.domain.ServiceOutPath;
+import com.ruoyi.task.service.IServiceOutPathService;
+import com.ruoyi.task.domain.ServiceSubtaskPreachform;
+import com.ruoyi.task.service.IServiceSubtaskService;
+import com.ruoyi.task.domain.SendMagParam;
/**
* 瀹氭椂浠诲姟璋冨害娴嬭瘯
*
@@ -66,6 +87,12 @@
@Autowired
private IServiceThirdDataService iServiceThirdDataService;
+ /**
+ * 妯℃澘鏁版嵁涓�寰嬬粡 ruoyi-template 鐨勯棬闈㈠彇鐢紙璺ㄦā鍧楁暟鎹闂師鍒欙級銆�
+ */
+ @Autowired
+ private TemplateFacade templateFacade;
+
@Autowired
private IServiceOutPathService iServiceOutPathService;
@@ -75,11 +102,15 @@
@Autowired
private IPatMedInhospService iPatMedInhospService;
+ /**
+ * 鎵嬫湳闅忚妯″潡鐨�<b>甯搁┗闂ㄩ潰</b>锛堝師娉ㄥ叆 {@code IPatMedOperationService}锛夈��
+ * <p>
+ * 鎵嬫湳闅忚缂栨帓宸叉暣浣撹縼鍏� {@code ruoyi-othervisit}锛屾湰绫诲彧鍋氳皟鐢ㄣ��
+ * 鈿狅笍 娉ㄥ叆闂ㄩ潰鑰屼笉鏄ā鍧楀唴閮ㄥ疄鐜帮細闂ㄩ潰姘歌繙瀛樺湪锛屾ā鍧楁湭鎵撹繘搴旂敤鎴�
+ * {@code othervisit.enabled=false} 鏃跺彧鏄檷绾у苟鎵� WARN锛屼笉浼氬惎鍔ㄥけ璐ャ��
+ */
@Autowired
- private IPatMedOuthospService iPatMedOuthospService;
-
- @Autowired
- private IPatMedOperationService iPatMedOperationService;
+ private com.ruoyi.othervisit.api.OtherVisitFacade otherVisitFacade;
@Autowired
private IServiceSubtaskService iServiceSubtaskService;
@@ -87,8 +118,11 @@
@Autowired
private IServicePatientTempService iServicePatientTempService;
- @Autowired
- private IHNGatherPatArchiveService ihnGatherPatArchiveService;
+ // 鈿狅笍 2026-10 绉婚櫎锛氬師 `IHNGatherPatArchiveService ihnGatherPatArchiveService` 瀛楁銆�
+ // 瀹冨湪鏈被閲�**鍙�**琚� dealHisData 鐨勬渤鍗楀垎鏀娇鐢紙姝诲瓧娈垫鏌ワ細鏀瑰墠鍏ㄦ枃浠朵粎 1 澶勪娇鐢級锛�
+ // 璇ュ垎鏀凡闅忔柟娉曚綋鎼繘 ruoyi-datacollection锛屾晠瀛楁杩炲甫鍒犻櫎 鈥斺��
+ // 鐣欑潃瀹冧細璁╀汉璇互涓� smartor 鐨勬渤鍗楅噰闆嗚繕鏈夋湰绫昏繖涓娇鐢ㄦ柟
+ // 锛堢湡姝g殑浣跨敤鏂瑰凡鏄暟鎹噰闆嗘ā鍧楃粡濂戠害 HisGatherApi 璋冪敤鐨� Bridge锛夈��
@Autowired
private IServiceSLTDHealthcareRecordService serviceSLTDHealthcareRecordService;
@@ -97,29 +131,19 @@
private SysUserImportMapper sysUserImportMapper;
@Autowired
- private HeLibraryMapper heLibraryMapper;
-
- @Autowired
private ICollectHISService ichService;
@Autowired
private ISysConfigService configService;
+ @Autowired
+ private IDingTalkService dingTalkService;
+
+ @Autowired
+ private ISysUserService userService;
@Value("${localIP}")
private String localIP;
-
- @Value("${xhsmsPath}")
- private String xhsmsPath;
-
- @Value("${xhsmsAccount}")
- private String xhsmsAccount;
-
- @Value("${xhsmsPwd}")
- private String xhsmsPwd;
- // 铏氭嫙鎺ュ叆鐮�
- @Value("${xhsmsjrm}")
- private String xhsmsjrm;
@Value("${pub_key}")
private String pub_key;
@@ -139,8 +163,9 @@
@Autowired
private IServiceSubtaskRecordService serviceSubtaskRecordService;
- @Autowired
- IIcd10Service iIcd10Service;
+ // 鈿狅笍 2026-10 绉婚櫎锛氬師 `IIcd10Service iIcd10Service` 瀛楁銆�
+ // 瀹冨湪鏈被閲�**鍙�**琚� dealHisData 鐨�"鐤剧梾瀛楀吀澧為噺閲囬泦"涓�琛岃皟鐢紝宸查殢鏂规硶浣撴惉杩�
+ // ruoyi-datacollection锛堢粡濂戠害 HisGatherApi#gatherIcd10 璋冨洖 smartor 鐨勫疄鐜帮級銆�
@Autowired
IPatArchiveService patArchiveService;
@@ -155,12 +180,6 @@
IPatMedOuthospService patMedOuthospService;
@Autowired
- ISvyTaskTemplateService svyTaskTemplateService;
-
- @Autowired
- IIvrTaskTemplateService iIvrTaskTemplateService;
-
- @Autowired
IXHGatherPatArchiveService ixhGatherPatArchiveService;
@Autowired
@@ -169,26 +188,97 @@
@Autowired
ICollectHISService icollectHis;
+ /**
+ * 闂ㄨ瘖鍒嗚〃缁存姢宸叉暣浣撹縼鍏� {@code ruoyi-outpatientvisit}锛岃繖閲屽彧鎸佹湁瀹冪殑甯搁┗闂ㄩ潰銆�
+ * <p>
+ * 鈿狅笍 娉ㄥ叆闂ㄩ潰鑰屼笉鏄唴閮ㄥ疄鐜帮細闂ㄩ潰<b>姘歌繙瀛樺湪</b>锛屽嵆浣挎ā鍧楁病琚墦杩涘簲鐢ㄦ湰绫讳篃涓嶄細鍚姩澶辫触銆�
+ */
@Autowired
- CreateDataTable createDataTable;
+ private com.ruoyi.outpatientvisit.api.OuthospVisitFacade outhospVisitFacade;
+ /**
+ * 鍑哄叆闄㈤殢璁挎ā鍧楃殑<b>甯搁┗闂ㄩ潰</b>銆�
+ * <p>
+ * 鈿狅笍 2025 淇锛氭湰绫荤殑 <b>3 涓殢璁垮叆鍙e師鍏堜笉鍒ゅ紑鍏�</b> 鈥斺��
+ * 瀹冧滑璋冪敤 {@code IPatMedInhospService}锛坰martor 閲岀殑閬楃暀瀹炵幇锛岃
+ * {@code PatMedInhospServiceImpl}锛夛紝鑰岄偅涓疄鐜扮敤闂ㄩ潰<b>鍙槸涓轰簡鍙栨暟鎹�</b>
+ * 锛坽@code selectPatMedInhospList} / {@code updatePatMedInhosp}锛夛紝
+ * <b>浠庝笉璋冪敤闂ㄩ潰鐨勭紪鎺掓柟娉�</b>銆備簬鏄� {@code inhospvisit.enabled} /
+ * {@code publicity.enabled} / {@code othervisit.enabled} 瀵瑰畾鏃朵换鍔�<b>瀹屽叏澶辨晥</b>锛�
+ * 闂ㄩ潰鐨勭紪鎺掑畧鍗紙{@code InhospVisitFacade#dealOutHospInfo} 绛夛級铏界劧鏈夊疄鐜般��
+ * 鏈夋祴璇曪紝鍗村彧鏈� HTTP 鎵嬪姩瑙﹀彂閭d竴鏉¤矾璧板緱鍒般��
+ * <p>
+ * 鐜板湪鏀逛负涓庢墜鏈殢璁匡紙鎵嬫湳闅忚鏃╁凡璧� {@code otherVisitFacade}锛岃 {@link #dealOperationInfo()}锛�
+ * 瀹屽叏鍚屽舰锛氬畾鏃朵换鍔¤蛋闂ㄩ潰锛屽紑鍏冲湪闂ㄩ潰閲岀粺涓�鍒ゃ�傛ā鍧楀疄鐜板唴閮ㄤ細鍥炶皟
+ * {@code PublicityApi} / {@code OtherVisitApi}锛岄偅涓ゅ鍚勮嚜鍒よ嚜宸辩殑寮�鍏筹紝
+ * 鎵�浠ヤ竴娆″垏鎹㈣ 3 涓紑鍏冲悓鏃剁敓鏁堛��
+ * <p>
+ * 鈿狅笍 <b>涓嶈兘娉ㄥ叆 {@code InhospVisitApi} 鎺ュ彛</b>锛氬鍣ㄩ噷鏈変袱涓疄鐜�
+ * 锛堟湰闂ㄩ潰 + 鍐呴儴瀹炵幇 {@code DefaultInhospVisitApi}锛夛紝鎸夌被鍨嬫敞鍏ヤ細姝т箟锛�
+ * 鑰屼笖鍙湁闂ㄩ潰鎵嶅垽寮�鍏炽�俀uartz 渚濊禆鏈ā鍧椼�佷笉瀛樺湪鍙嶅悜渚濊禆锛屾墍浠ョ洿鎺ユ敞鍏ラ棬闈㈡槸瀹夊叏鐨勩��
+ */
+ @Autowired
+ private com.ruoyi.inhospvisit.api.InhospVisitFacade inhospVisitFacade;
- @Value("${appid}")
- private String appid;
+ /**
+ * 瀹f暀妯″潡鐨�<b>甯搁┗闂ㄩ潰</b>锛岀敤浜庡垽 {@code sys_config: publicity.enabled}銆�
+ * <p>
+ * 鈿狅笍 2025 淇锛氭湰绫诲師鏈彧鍦�**鐢熸垚**瀹f暀鏃跺彈寮�鍏崇锛堣蛋 inhospvisit 闂ㄩ潰鍥炶皟 PublicityApi锛夛紝
+ * 浣�**鍙戦��**瀹f暀锛坽@link #sfHandlle} 鐨� {@code type == 3} 鍒嗘敮锛変粠鏉ヤ笉璇诲鏁欏紑鍏� 鈥斺��
+ * 鎵�浠ュ叧鎺� {@code publicity.enabled} 鍚庯紝宸茬敓鎴愮殑瀹f暀瀛愪换鍔$収鏍烽�氳繃
+ * 鐭俊/鍏紬鍙�/鐢佃瘽鍙戝嚭鍘汇��
+ */
+ @Autowired
+ private com.ruoyi.publicity.api.PublicityFacade publicityFacade;
+
+ /**
+ * 鏁版嵁閲囬泦妯″潡鐨�<b>甯搁┗闂ㄩ潰</b>銆�
+ * <p>
+ * 鈿狅笍 2026-10 妯″潡鍖栵細鏈被鐨� {@code dealHisData(String)} 鏂规硶浣擄紙杩炲悓绉佹湁甯墜
+ * {@code collectSegmentData}锛夊凡鏁翠綋鎼繘 {@code ruoyi-datacollection}锛�
+ * 鏈被鍙繚鐣欏畾鏃朵换鍔″叆鍙o紙sys_job 鐨� invoke_target 鏄� {@code ryTask.dealHisData('...')}锛�
+ * 鍏ュ彛鍚嶄笉鑳藉彉锛夈�傜珯鐐瑰垎鏀�佹椂闂寸獥鍙c�佸垎娈靛洖婧�佹棩蹇楁枃妗堥兘鍦ㄦā鍧楅噷锛屼竴琛屾湭鏀广��
+ * <p>
+ * 娉ㄥ叆闂ㄩ潰鑰屼笉鏄ā鍧楀唴閮� Service锛氶棬闈�<b>姘歌繙瀛樺湪</b>锛屼笖鍙湁闂ㄩ潰鍒�
+ * {@code sys_config: datacollection.enabled} 寮�鍏炽��
+ */
+ @Autowired
+ private com.ruoyi.datacollection.api.DataCollectionFacade dataCollectionFacade;
+
+ // 鈿狅笍 2026-10 鍒犻櫎锛氬師 `@Value("${appid}") private String appid;`
+ // 瀹冩槸銆屾柊鍗庡井淇″叕浼楀彿鎺ㄩ�併�嶇殑閬楃暀瀛楁锛堟彁浜� 8590ef6a 寮曞叆锛屽彧琚�
+ // xinHuaWXReq.setAppid(appid) 鐢ㄨ繃锛夈�傝鎺ㄩ�侀�昏緫宸叉惉杩� ruoyi-message
+ // 锛堝叕浼楀彿鍑嵁鏀圭敱 sys_config.wx.mp.config.* 涓嬪彂锛夛紝鏈被閲屽凡鏃犲紩鐢紱
+ // 浣嗗畠鐨� @Value 娌℃湁榛樿鍊硷紝鑰� application-nhfy.yml / -xh.yml / -ls.yml
+ // 閮芥病瀹氫箟 appid 杩欎釜 key锛岃繖浜� profile 鍚姩鏃朵細鐩存帴鎶�
+ // `Could not resolve placeholder 'appid'`銆傜暀鐫�鏄畾鏃剁偢寮癸紝鏁呭垹闄ゃ��
@Value("${server.port}")
private String port;
+ /**
+ * 娑堟伅鍙戦�佹柟宸ュ巶锛堢煭淇�/寰俊鍏紬鍙凤級銆�
+ * <p>
+ * 鍘熸潵鐭俊涓庡叕浼楀彿鐨勫彂閫侀�昏緫鍦ㄦ湰绫婚噷鐢� {@code if (active.equals("xx"))} 纭垎鏀簡绾� 300 琛岋紝
+ * 鐜板凡鏀跺彛鍒� {@code ruoyi-message} 妯″潡锛岃繖閲屽彧璐熻矗鎸� {@code active} 璺敱銆�
+ */
@Autowired
- private MtSubmitSmUtil mtSubmitSmUtil;
+ private SmsSenderFactory smsSenderFactory;
+
+ @Autowired
+ private WechatSenderFactory wechatSenderFactory;
@Value("${spring.profiles.active}")
private String active;
@Autowired
private SysConfigMapper sysConfigMapper;
- @Autowired
- private IServiceTaskScheduleService serviceTaskScheduleService;
+ // 鈿狅笍 2025 绉婚櫎锛氬師 `IServiceTaskScheduleService serviceTaskScheduleService` 瀛楁銆�
+ // 瀹冨湪鏈被閲�**鍙�**琚� rollTaskGroupCycle() 鐢ㄦ潵璋� rollCycleTasks()锛堟瀛楁妫�鏌ワ細
+ // 鏀瑰墠鍏ㄦ枃浠朵粎 1 澶勪娇鐢級銆傝璋冪敤宸插垏鍒� inhospVisitFacade.rollTaskGroupCycle()锛�
+ // 鎵�浠ュ瓧娈佃繛甯﹀け鏁堝苟鍒犻櫎 鈥斺�� 鐣欑潃瀹冧細璁╀汉璇互涓� smartor 鐨� rollCycleTasks 杩樻湁浜虹敤銆�
+ // smartor 渚х殑 ServiceTaskScheduleServiceImpl.rollCycleTasks() 鏈韩**淇濈暀涓嶅垹**
+ // 锛堝畠鍙兘浠嶈鐜扮綉鍏跺畠鍏ュ彛/鎺ュ彛璋冪敤锛屽垹闄ゅ睘鍙︿竴浠朵簨锛夈��
public void ryMultipleParams(String s, Boolean b, Long l, Double d, Integer i) {
System.out.println(StringUtils.format("鎵ц澶氬弬鏂规硶锛� 瀛楃涓茬被鍨媨}锛屽竷灏旂被鍨媨}锛岄暱鏁村瀷{}锛屾诞鐐瑰瀷{}锛屾暣褰}", s, b, l, d, i));
@@ -270,6 +360,79 @@
}
}
+ /**
+ * 瀹氭椂鍙戦�佸紓甯镐俊鎭�-鏅畞
+ */
+ public void sendExceptInfo() throws Exception {
+ //1.鑾峰彇鍙戦�佷汉宸ュ彿
+ ServiceSubtaskDetailTraceVO subtaskDetailTraceVO = new ServiceSubtaskDetailTraceVO();
+ subtaskDetailTraceVO.setHandleFlag("0");
+ List<ServiceSubtaskDetailTrace> serviceSubtaskDetailTraces =
+ serviceSubtaskDetailTraceService.selectServiceSubtaskDetailTtraceList(subtaskDetailTraceVO);
+ // 鑾峰彇鈥滃紓甯稿唴瀹规彁閱�"
+ SysConfig sysConfig = sysConfigMapper.checkConfigKeyUnique("send.except.content");
+ String exceptContent = sysConfig.getConfigValue();
+
+ // 鑾峰彇鈥滃唴瀹规彁閱掓祴璇曚汉宸ュ彿鈥�
+ 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 (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.setUserName(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);
+ }
+ }
+ }
+ }
+ }
+ }
/**
* 瀹氭椂澶勭悊澶栭摼鐨勬暟鎹�
@@ -298,345 +461,449 @@
dealHisData(formattedNow);
}
-
/**
* HIS鏁版嵁閲囬泦
* 瀹氭椂浠诲姟锛氶噰闆嗘偅鑰呬俊鎭�佸嚭闄€�侀棬璇婃暟鎹�
* todayZeroStr 褰撳墠鐨勬椂闂� 渚嬪锛�2026-05-06 00:00:00
+ * <p>
+ * 鈿狅笍 <b>2026-10 妯″潡鍖�</b>锛氭柟娉曚綋锛堣繛鍚岀鏈夊府鎵� {@code collectSegmentData}锛夊凡鏁翠綋鎼繘
+ * {@code ruoyi-datacollection}锛屽疄鐜拌
+ * {@code com.ruoyi.datacollection.service.impl.HisDataCollectionServiceImpl}銆�
+ * 杩欓噷鍙繚鐣�<b>瀹氭椂浠诲姟鍏ュ彛</b>锛歴ys_job 鐨� invoke_target 浠嶆槸
+ * {@code ryTask.dealHisData('...')}锛屽叆鍙e悕涓嶈兘鍙橈紝鎵�浠ユ湰鏂规硶鏄�<b>绾浆鍙�</b>銆�
+ * <p>
+ * 鍏抽棴鏁版嵁閲囬泦妯″潡锛坽@code sys_config: datacollection.enabled=false}锛夋椂闂ㄩ潰浼氭姏
+ * {@link com.ruoyi.datacollection.api.DataCollectionModuleDisabledException}锛�
+ * 鏈叆鍙f崟鑾峰悗鍙墦涓�鏉� WARN 鈥斺�� 閭f槸"妯″潡琚富鍔ㄥ叧鎺�"锛屼笉鏄噰闆嗗け璐ワ紝
+ * 涓嶈璁╁畾鏃朵换鍔¤鎴愭墽琛屽紓甯革紙鍚﹀垯杩愮淮浼氱湅鍒颁竴鐗囩孩鑹插け璐ヨ褰曪級銆�
*/
public void dealHisData(String todayZeroStr) {
- log.info("銆恉ealHisData銆戝紑濮嬫墽琛孒IS鏁版嵁閲囬泦浠诲姟");
- // 鑾峰彇鏄ㄥぉ0鐐瑰埌浠婂ぉ0鐐圭殑鏃堕棿鑼冨洿
- LocalDateTime todayZero = LocalDateTime.now().with(LocalTime.MIN);
- if (StringUtils.isNotBlank(todayZeroStr)) {
- DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
- todayZero = LocalDateTime.parse(todayZeroStr, formatter);
- }
- LocalDateTime yesterdayZero = todayZero.minusDays(1);
- log.info("銆恉ealHisData銆戦噰闆嗘椂闂磋寖鍥达細{} ~ {}", yesterdayZero, todayZero);
-
- if (active.trim().equals("xh")) {
- try {
- // 閲囬泦鍏ラ櫌鏁版嵁
- log.info("銆恉ealHisData銆戞柊鍗庡紑濮嬮噰闆嗗叆闄㈡暟鎹�");
- ixhGatherPatArchiveService.getInHospDataGather("0", yesterdayZero, todayZero);
- log.info("銆恉ealHisData銆戞柊鍗庡叆闄㈡暟鎹噰闆嗗畬鎴�");
-
- // 閲囬泦鍑洪櫌鏁版嵁
- log.info("銆恉ealHisData銆戞柊鍗庡紑濮嬮噰闆嗗嚭闄㈡暟鎹�");
- ixhGatherPatArchiveService.getInHospDataGather("1", yesterdayZero, todayZero);
- log.info("銆恉ealHisData銆戞柊鍗庡嚭闄㈡暟鎹噰闆嗗畬鎴�");
-
- } catch (Exception e) {
- log.error("銆恉ealHisData銆戞柊鍗庢暟鎹噰闆嗗紓甯�", e);
- }
- } else if (active.trim().equals("hn")) {
- try {
- // 娌冲崡鏁版嵁閲囬泦
- HnDataGatherVO hnDataGatherVO = new HnDataGatherVO();
- log.info("銆恉ealHisData銆戞渤鍗楀紑濮嬮噰闆嗘暟鎹�");
- Date startTime = Date.from(yesterdayZero.atZone(ZoneId.systemDefault()).toInstant());
- Date endTime = Date.from(todayZero.atZone(ZoneId.systemDefault()).toInstant());
-
- hnDataGatherVO.setStartTime(startTime);
- hnDataGatherVO.setEndTime(endTime);
- ihnGatherPatArchiveService.hnDataGather(hnDataGatherVO);
- log.info("銆恉ealHisData銆戞渤鍗楃粨鏉熼噰闆嗘暟鎹�");
- } catch (Exception e) {
- log.error("銆恉ealHisData銆戞渤鍗楁暟鎹噰闆嗗紓甯�", e);
- }
- } else if (active.trim().equals("sltd") || active.trim().equals("nhfy")) {
- //鐪佺珛鍚屽痉涓庡崕鍗楅檮涓�鐢ㄥ悓涓�濂楅噰闆嗘柟娉曪紙閮芥槸鏉ユ湭鏉ユ彁渚涳級
-
- try {
- //鑾峰彇鏄惁闇�瑕侀噰闆嗙敤鎴枫�侀儴闂ㄤ俊鎭�
- SysConfig config = new SysConfig();
- config.setConfigKey("sltd.gather.sysuser");
- config.setOrgid("20001001");
- List<SysConfig> sysConfigs = configService.selectConfigList(config);
-
- //鑾峰彇鐪佺珛鍚屽痉瑕侀噰闆嗙殑闄㈠尯
- SysConfig cf = new SysConfig();
- cf.setConfigKey("sltd.gather.campusid");
- cf.setOrgid("20001001");
- List<SysConfig> sysConfigcampusids = configService.selectConfigList(cf);
-
- List<Long> campusidList = new ArrayList<>();
- if (CollectionUtils.isNotEmpty(sysConfigcampusids)) {
- String[] split = sysConfigcampusids.get(0).getConfigValue().split(",");
- campusidList = Arrays.stream(split).map(Long::valueOf).collect(Collectors.toList());
- } else {
- log.error("SysConfig涓殑闄㈠尯ID涓虹┖锛�");
- return;
- }
-
- //configValue = 1 涓嶉渶瑕侀噰闆� configValue = 2闇�瑕侀噰闆�
- if (CollectionUtils.isNotEmpty(sysConfigs) && sysConfigs.get(0).getConfigValue().equals("2")) {
- log.info("銆恉ealHisData銆戠渷绔嬪悓寰封�滈儴闂ㄤ俊鎭�濆紑濮嬮噰闆嗘暟鎹�");
- ServiceSLTDDeptReqVO serviceSLTDDeptReqVO = new ServiceSLTDDeptReqVO();
- serviceSLTDDeptReqVO.setOrgId("20001001");
- serviceSLTDDeptReqVO.setCampusIds(campusidList);
- Boolean aBoolean1 = serviceSLTDHealthcareRecordService.queryDeptWardAreaInfoList(serviceSLTDDeptReqVO);
- log.info("銆恉ealHisData銆戠渷绔嬪悓寰封�滈儴闂ㄤ俊鎭�濈粨鏉熼噰闆嗘暟鎹細{}", aBoolean1);
-
- Boolean aBoolean = false;
- for (Long cid : campusidList) {
- log.info("銆恉ealHisData銆戠渷绔嬪悓寰封�滅敤鎴蜂俊鎭�濆紑濮嬮噰闆嗘暟鎹紝闄㈠尯锛歿}", cid);
- ServiceSLTDInhospReqVO reqVO = new ServiceSLTDInhospReqVO();
- reqVO.setOrgId("20001001");
- reqVO.setCampusId(cid);
- ArrayList<String> statusList = new ArrayList<>();
- statusList.add("1");
- reqVO.setStatusList(statusList);
- aBoolean = serviceSLTDHealthcareRecordService.queryHospUserInfoList(reqVO);
- }
- log.info("銆恉ealHisData銆戠渷绔嬪悓寰封�滅敤鎴蜂俊鎭�濈粨鏉熼噰闆嗘暟鎹細{}", aBoolean);
- //鐤剧梾瀛楀吀閲囬泦
- iIcd10Service.queryAddIcd10();
- }
-
- // nhfy/sltd鍥炴函30澶╁垎娈甸噰闆嗗垽鏂紙姣忔鏈�澶�7澶╋級
- boolean isBackfill = (active.trim().equals("nhfy") || active.trim().equals("sltd")) && StringUtils.isNotBlank(todayZeroStr);
- if (isBackfill) {
- DateTimeFormatter dateFmt = DateTimeFormatter.ofPattern("yyyy-MM-dd");
- LocalDate segStart = todayZero.toLocalDate().minusDays(30);
- LocalDate segEndDate = todayZero.toLocalDate();
- int segCount = 0;
- while (!segStart.isAfter(segEndDate)) {
- LocalDate segEnd = segStart.plusDays(6);
- if (segEnd.isAfter(segEndDate)) {
- segEnd = segEndDate;
- }
- segCount++;
- log.info("銆恉ealHisData銆憑}鍥炴函绗瑊}娈甸噰闆嗭紝鏃ユ湡鑼冨洿锛歿} ~ {}", active.trim(), segCount, segStart.format(dateFmt), segEnd.format(dateFmt));
- for (Long cid : campusidList) {
- collectSegmentData(cid, segStart.format(dateFmt), segEnd.format(dateFmt));
- }
- segStart = segEnd.plusDays(1);
- }
- log.info("銆恉ealHisData銆憑}鍥炴函閲囬泦瀹屾垚锛屽叡{}娈�", active.trim(), segCount);
- }
-
- // 鐪佺珛鍚屽痉鏁版嵁閲囬泦锛堥潪鍥炴函妯″紡鎵嶆墽琛岋級
- if (!isBackfill) {
- for (Long cid : campusidList) {
- log.info("銆恉ealHisData銆戠渷绔嬪悓寰烽鍏ラ櫌寮�濮嬮噰闆嗘暟鎹紝闄㈠尯锛歿}", cid);
- String nowTime = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));
- ServiceSLTDInhospReqVO serviceSLTDInhospReqVO = new ServiceSLTDInhospReqVO();
- serviceSLTDInhospReqVO.setOrgId("20001001");
- serviceSLTDInhospReqVO.setCampusId(cid);
- serviceSLTDInhospReqVO.setEncounterTimeStart(nowTime);
- serviceSLTDInhospReqVO.setEncounterTimeEnd(nowTime);
- if (active.trim().equals("nhfy")) {
- serviceSLTDInhospReqVO.setEncounterTimeStart(yesterdayZero.format(DateTimeFormatter.ofPattern("yyyy-MM-dd")));
- serviceSLTDInhospReqVO.setEncounterTimeEnd(todayZero.format(DateTimeFormatter.ofPattern("yyyy-MM-dd")));
- }
- List<String> list = new ArrayList<>();
- list.add("FH0109.22");
- list.add("FH0109.23");
- list.add("FH0109.53");
- serviceSLTDInhospReqVO.setStatusList(list);
-// log.info("銆恉ealHisData銆戠渷绔嬪悓寰封�滈鍏ラ櫌鈥濋噰闆嗘暟鎹叆鍙傦細{}", serviceSLTDInhospReqVO);
- serviceSLTDHealthcareRecordService.queryHealthcareRecordList(serviceSLTDInhospReqVO);
- log.info("銆恉ealHisData銆戠渷绔嬪悓寰封�滈鍏ラ櫌鈥濈祼鏉熼噰闆嗘暟鎹紝闄㈠尯锛歿}", cid);
-
- log.info("銆恉ealHisData銆戠渷绔嬪悓寰封�滃叆闄⑩�濆紑濮嬮噰闆嗘暟鎹紝闄㈠尯锛歿}", cid);
- serviceSLTDInhospReqVO.setOrgId("20001001");
- serviceSLTDInhospReqVO.setCampusId(cid);
- serviceSLTDInhospReqVO.setEncounterTimeStart(null);
- serviceSLTDInhospReqVO.setEncounterTimeEnd(null);
- serviceSLTDInhospReqVO.setStartHeadTime(nowTime);
- serviceSLTDInhospReqVO.setStartTailTime(nowTime);
- if (active.trim().equals("nhfy")) {
- serviceSLTDInhospReqVO.setStartHeadTime(yesterdayZero.format(DateTimeFormatter.ofPattern("yyyy-MM-dd")));
- serviceSLTDInhospReqVO.setStartTailTime(todayZero.format(DateTimeFormatter.ofPattern("yyyy-MM-dd")));
- }
- List<String> listStr = new ArrayList<>();
- listStr.add("FH0109.24");
- serviceSLTDInhospReqVO.setStatusList(listStr);
-// log.info("銆恉ealHisData銆戠渷绔嬪悓寰封�滃叆闄⑩�濋噰闆嗘暟鎹叆鍙傦細{}", serviceSLTDInhospReqVO);
- serviceSLTDHealthcareRecordService.queryHealthcareRecordList(serviceSLTDInhospReqVO);
- log.info("銆恉ealHisData銆戠渷绔嬪悓寰封�滃叆闄⑩�濈祼鏉熼噰闆嗘暟鎹紝闄㈠尯锛歿}", cid);
-
- log.info("銆恉ealHisData銆戠渷绔嬪悓寰封�滃嚭闄⑩�濆紑濮嬮噰闆嗘暟鎹紝闄㈠尯锛歿}", cid);
- serviceSLTDInhospReqVO.setStartHeadTime(null);
- serviceSLTDInhospReqVO.setStartTailTime(null);
- serviceSLTDInhospReqVO.setEncounterTimeStart(null);
- serviceSLTDInhospReqVO.setEncounterTimeEnd(null);
- serviceSLTDInhospReqVO.setPreOutHospitalHeadDate(nowTime);
- serviceSLTDInhospReqVO.setPreOutHospitalTailDate(nowTime);
- if (active.trim().equals("nhfy")) {
- serviceSLTDInhospReqVO.setPreOutHospitalHeadDate(yesterdayZero.format(DateTimeFormatter.ofPattern("yyyy-MM-dd")));
- serviceSLTDInhospReqVO.setPreOutHospitalTailDate(todayZero.format(DateTimeFormatter.ofPattern("yyyy-MM-dd")));
- }
- serviceSLTDInhospReqVO.setHealthcareRecordTypeList(null);
- List<String> list2 = new ArrayList<>();
-// list2.add("FH0108.02");
- //鍑洪櫌
- list2.add("FH0109.27");
- //棰勫嚭闄�
- list2.add("FH0109.25");
- serviceSLTDInhospReqVO.setStatusList(list2);
-// log.info("銆恉ealHisData銆戠渷绔嬪悓寰封�滃嚭闄⑩�濋噰闆嗘暟鎹叆鍙傦細{}", serviceSLTDInhospReqVO);
- serviceSLTDHealthcareRecordService.queryHealthcareRecordList(serviceSLTDInhospReqVO);
- log.info("銆恉ealHisData銆戠渷绔嬪悓寰封�滃嚭闄⑩�濇潫閲囬泦鏁版嵁锛岄櫌鍖猴細{}", cid);
- }
- }
-
- } catch (Exception e) {
- log.error("銆恉ealHisData銆戠渷绔嬪悓寰锋暟鎹噰闆嗗紓甯�", e);
- }
+ try {
+ dataCollectionFacade.dealHisData(todayZeroStr);
+ } catch (com.ruoyi.datacollection.api.DataCollectionModuleDisabledException e) {
+ log.warn("銆恉ealHisData銆憑}锛堟湰杞畾鏃堕噰闆嗚烦杩囷級", e.getMessage());
}
}
/**
- * 鍒嗘閲囬泦鏁版嵁锛堥鍏ラ櫌銆佸叆闄€�佸嚭闄級
- * 鐢ㄤ簬nhfy/sltd鍥炴函閲囬泦锛屾瘡娆℃渶澶氭煡璇�7澶╂暟鎹�
+ * 鍦ㄩ櫌鎮h��"绉戝 / 鐥呭尯 / 搴婁綅"鍒锋柊锛堝崡鍗庨檮涓�锛屾瘡澶╀竴娆★級銆�
+ * <p>
+ * 鍦ㄩ櫌鎮h�呬細杞銆佽浆鐥呭尯銆佹崲搴婏紝鑰� {@code pat_med_inhosp} 鐨勪綅缃瓧娈靛彧鍦ㄥ叆闄㈡椂鍐欒繃涓�娆★紝
+ * 涔嬪悗涓嶄細鑷繁鏇存柊 鈥斺�� 杩欓噷姣忓ぉ鎸夋偅鑰呮煡涓�閬� HIS 閲�<b>璇ユ偅鑰呭綋鍓嶇殑鍦ㄩ櫌淇℃伅</b>
+ * 锛坽@code dtcQueryHealthcareRecordList}锛屼笌鍏ラ櫌閲囬泦鏄悓涓�涓帴鍙o紝鎸�
+ * {@code healthcareRecordNo} 鍗曟煡 + {@code statusList=["FH0109.24"]}锛夛紝
+ * 涓庡簱鍐呮瘮瀵瑰悗鍙妸鍙樺寲鐨勫瓧娈靛啓鍥炲幓銆傚疄鐜颁笌鍒ゅ畾鍙e緞瑙�
+ * {@code com.ruoyi.datacollection.service.impl.InhospDeptRefreshServiceImpl}銆�
+ * <p>
+ * 涓� {@link #dealHisData(String)} 鍚屾牱鐨勯檷绾у彛寰勶細妯″潡琚叧鎺夛紙
+ * {@code sys_config: datacollection.enabled=false}锛夋椂闂ㄩ潰鎶�
+ * {@link com.ruoyi.datacollection.api.DataCollectionModuleDisabledException}锛�
+ * 杩欓噷鍙墦涓�鏉� WARN 鈥斺�� 閭f槸"妯″潡琚富鍔ㄥ叧鎺�"锛屼笉璇ヨ鎴愬畾鏃朵换鍔℃墽琛屽紓甯搞��
+ * <p>
+ * sys_job 鐨� invoke_target 涓� {@code ryTask.refreshInhospDeptInfo()}锛�
+ * 寤鸿姣忓ぉ 03:30锛堥伩寮� 01:00 鍏ラ櫌閲囬泦涓� 02:00 鍑洪櫌澶勭悊锛夛紝骞跺彂绛栫暐閫�"绂佹骞跺彂"銆�
*
- * @param cid 闄㈠尯ID
- * @param startDateStr 鏃ユ湡寮�濮� yyyy-MM-dd
- * @param endDateStr 鏃ユ湡缁撴潫 yyyy-MM-dd
+ * @return 鏈瀹為檯鏇存柊鐨勫湪闄㈣褰曟潯鏁帮紙0 = 鏃犲彉鍖� / 绔欑偣涓嶅尮閰� / 妯″潡琚叧闂級
*/
- private void collectSegmentData(Long cid, String startDateStr, String endDateStr) {
-// // 棰勫叆闄�
- log.info("銆恉ealHisData銆戦鍏ラ櫌寮�濮嬮噰闆嗘暟鎹紝闄㈠尯锛歿}锛屾椂闂存锛歿} ~ {}", cid, startDateStr, endDateStr);
- ServiceSLTDInhospReqVO reqVO = new ServiceSLTDInhospReqVO();
- reqVO.setOrgId("20001001");
- reqVO.setCampusId(cid);
- reqVO.setEncounterTimeStart(startDateStr);
- reqVO.setEncounterTimeEnd(endDateStr);
- List<String> preAdmitStatus = new ArrayList<>();
- preAdmitStatus.add("FH0109.22");
- preAdmitStatus.add("FH0109.23");
- preAdmitStatus.add("FH0109.53");
- reqVO.setStatusList(preAdmitStatus);
- log.info("銆恉ealHisData銆戦鍏ラ櫌閲囬泦鏁版嵁鍏ュ弬锛歿}", reqVO);
- serviceSLTDHealthcareRecordService.queryHealthcareRecordList(reqVO);
- log.info("銆恉ealHisData銆戦鍏ラ櫌绲備簡閲囬泦鏁版嵁锛岄櫌鍖猴細{}", cid);
-
- // 鍏ラ櫌
- log.info("銆恉ealHisData銆戝叆闄㈠紑濮嬮噰闆嗘暟鎹紝闄㈠尯锛歿}锛屾椂闂存锛歿} ~ {}", cid, startDateStr, endDateStr);
- reqVO = new ServiceSLTDInhospReqVO();
- reqVO.setOrgId("20001001");
- reqVO.setCampusId(cid);
- reqVO.setStartHeadTime(startDateStr);
- reqVO.setStartTailTime(endDateStr);
- List<String> admitStatus = new ArrayList<>();
- admitStatus.add("FH0109.24");
- reqVO.setStatusList(admitStatus);
- log.info("銆恉ealHisData銆戝叆闄㈤噰闆嗘暟鎹叆鍙傦細{}", reqVO);
- serviceSLTDHealthcareRecordService.queryHealthcareRecordList(reqVO);
- log.info("銆恉ealHisData銆戝叆闄㈢祩浜嗛噰闆嗘暟鎹紝闄㈠尯锛歿}", cid);
-
- // 鍑洪櫌
- log.info("銆恉ealHisData銆戝嚭闄㈠紑濮嬮噰闆嗘暟鎹紝闄㈠尯锛歿}锛屾椂闂存锛歿} ~ {}", cid, startDateStr, endDateStr);
- reqVO = new ServiceSLTDInhospReqVO();
- reqVO.setOrgId("20001001");
- reqVO.setCampusId(cid);
- reqVO.setPreOutHospitalHeadDate(startDateStr);
- reqVO.setPreOutHospitalTailDate(endDateStr);
- List<String> dischargeStatus = new ArrayList<>();
- //鍑洪櫌
- dischargeStatus.add("FH0109.27");
- //棰勫嚭闄�
- dischargeStatus.add("FH0109.25");
- reqVO.setStatusList(dischargeStatus);
- log.info("銆恉ealHisData銆戝嚭闄㈤噰闆嗘暟鎹叆鍙傦細{}", reqVO);
- serviceSLTDHealthcareRecordService.queryHealthcareRecordList(reqVO);
- log.info("銆恉ealHisData銆戝嚭闄㈢粨鏉熼噰闆嗘暟鎹紝闄㈠尯锛歿}", cid);
+ public int refreshInhospDeptInfo() {
+ try {
+ return dataCollectionFacade.refreshInhospDeptInfo();
+ } catch (com.ruoyi.datacollection.api.DataCollectionModuleDisabledException e) {
+ log.warn("銆恟efreshInhospDeptInfo銆憑}锛堟湰杞湪闄俊鎭埛鏂拌烦杩囷級", e.getMessage());
+ return 0;
+ }
}
/**
- * HIS鐪佺珛鍚屽痉闂ㄦ�ヨ瘖鏁版嵁閲囬泦锛堣繖涓彧鑳戒竴澶╂墽琛屼竴娆★紝涓嶈兘鍗婁釜灏忔椂鎵ц涓�涓紝鏁版嵁閲忓お澶э紝褰卞搷鎬ц兘锛�
- * 瀹氭椂浠诲姟锛氶棬璇婃暟鎹�
- * todayZeroStr 褰撳墠鐨勬椂闂� 渚嬪锛�2026-05-06 00:00:00
+ * HIS鐪佺珛鍚屽痉闂ㄦ�ヨ瘖鏁版嵁閲囬泦锛堟瘡鍗婂皬鏃朵竴杞紝鎸夊ぉ鍏ㄩ噺鍒锋柊 + 鍒嗛〉鏂偣缁噰锛�
+ * <p>
+ * HIS 渚ч棬鎬ヨ瘖鏁版嵁鍙兘鎸夊ぉ鏌ワ紝姣忚疆鎷夊埌鐨勯兘鏄綋澶╁叏閲忥紙鍒版櫄涓婁竴涓囧鏉★級锛岃繖涓彇鏁版垚鏈敼涓嶄簡锛�
+ * 鑳芥敼鐨勬槸澶勭悊鎴愭湰锛氬綋澶╂暟鎹噷缁濆ぇ澶氭暟涓婁竴杞凡缁忓叆搴擄紝闈�"鏁撮〉鎵归噺鏌ラ噸 + 宸插叆搴撶洿鎺ヨ烦杩�"锛�
+ * 姣忚疆鐪熸闇�瑕佸仛妗f澶勭悊鍜屽叆搴撶殑鍙湁鏂板嚭鐜扮殑閭e嚑鐧炬潯锛屼竴涓囧鏉′篃鑳藉湪寰堢煭鏃堕棿鍐呰窇瀹屻��
+ * <p>
+ * 姣忎竴杞仛涓変欢浜嬶細
+ * <ol>
+ * <li>浠婂ぉ鐨勬暣杞埛鏂帮細绗� 1 椤电炕鍒版渶鍚庝竴椤碉紝鍙鐞嗘柊璁板綍锛�</li>
+ * <li>鏄ㄥぉ鐨勬敹灏鹃噰闆嗭細姣忓ぉ鍙仛涓�娆★紝鍏滀綇 23:xx 涔嬪悗鎵嶅啓鍏� HIS 鐨勮褰曞拰璺ㄩ浂鐐圭殑鏁版嵁锛�</li>
+ * <li>鎵嬪伐鍥炴函锛氫换鍔″叆鍙傜粰浜嗘棩鏈熸椂锛屾妸閭eぉ琛ラ噰涓�娆★紙鍚屼竴澶╁彧琛ヤ竴娆★紝涓嶄細姣忚疆閲嶅琛ワ級銆�</li>
+ * </ol>
+ * 姣忚疆鏈�澶氳窇 {@link MzGatherParamEnum#BUDGET_MINUTES}锛堥粯璁� 20 鍒嗛挓锛夛紝鍒扮偣淇濆瓨椤电爜鏂偣姝e父閫�鍑猴紝涓嬩竴杞粠璇ラ〉缁х画锛�
+ * 姣忛噰瀹屼竴椤甸兘浼氳惤涓�娆℃柇鐐癸紝杩涚▼琚潃涔熶笉浼氫粠澶撮噸鎵��
+ * <p>
+ * 澶辫触涓�寰嬩笉闃绘柇閲囬泦杩涘害锛�
+ * <ul>
+ * <li>鏁版嵁灞傚け璐ワ紙杞崲/妗f/鍏ュ簱锛夎惤 pat_med_outhosp_error 琛ㄤ氦浜哄伐澶勭悊锛�</li>
+ * <li>鎺ュ彛灞傚け璐ワ紙缃戠粶瓒呮椂銆佹潵鏈潵杩斿洖闈� 200锛夋病鏈夋暟鎹彲钀借〃锛屽彧鍐� error 鏃ュ織锛堝惈闄㈠尯銆佹棩鏈熴�侀〉鐮併�佹帴鍙e叆鍙傦級锛�
+ * 璺宠繃璇ラ〉缁х画寰�鍚庨噰锛屾湰杞粨鏉熸椂鎶婃柇鐐圭暀鍦ㄧ涓�涓け璐ラ〉锛涘洜涓烘瘡杞兘鏄暣澶╀粠澶村叏閲忓埛鏂帮紝
+ * 琚烦杩囩殑椤典笅涓�杞繀鐒堕噸鏂伴噰鍒帮紝涓嶄細婕忥紱</li>
+ * <li>杩炵画 {@link MzGatherConstant#MAX_CONSECUTIVE_PAGE_FAIL} 椤垫帴鍙eけ璐ュ垽瀹氫负鎺ュ彛鏁翠綋涓嶅彲鐢紝鏈疆鎻愬墠缁撴潫锛堥伩鍏嶇┖杞嚑鍗侀〉锛夛紝
+ * 鏂偣鐣欏湪绗竴涓け璐ラ〉锛屼笅涓�杞啀璇曘��</li>
+ * </ul>
+ *
+ * @param todayZeroStr 鍙�夛紝鎵嬪伐鎸囧畾瑕佷竴娆℃�у洖婧殑鏃ユ湡锛屾敮鎸� yyyy-MM-dd HH:mm:ss 鎴� yyyy-MM-dd锛涗负绌烘椂鍙埛鏂颁粖澶�+鏀跺熬鏄ㄥぉ
*/
public void dealHisDataMZ(String todayZeroStr) {
- log.info("銆恉ealHisData銆戦棬鎬ヨ瘖鏁版嵁寮�濮嬫墽琛孒IS鏁版嵁閲囬泦浠诲姟");
- // 鑾峰彇鏄ㄥぉ0鐐瑰埌浠婂ぉ0鐐圭殑鏃堕棿鑼冨洿
- LocalDateTime todayZero = LocalDateTime.now().with(LocalTime.MIN);
- if (StringUtils.isNotBlank(todayZeroStr)) {
- DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
- todayZero = LocalDateTime.parse(todayZeroStr, formatter);
+ log.info("銆恉ealHisDataMZ銆戦棬鎬ヨ瘖鏁版嵁閲囬泦寮�濮嬶紝鍏ュ弬锛歿}", todayZeroStr);
+ // 鍗楀崕闄勪竴鐨勫厛涓嶉噰闂ㄦ�ヨ瘖鏁版嵁
+ if (!"sltd".equals(active.trim())) {
+ log.info("銆恉ealHisDataMZ銆戝綋鍓嶇幆澧� {} 涓嶉噰闆嗛棬鎬ヨ瘖鏁版嵁锛岃烦杩�", active.trim());
+ return;
}
- LocalDateTime tomorrowdayZero = todayZero.plusDays(1);
- if (active.trim().equals("sltd") || active.trim().equals("nhfy")) {
- //鐪佺珛鍚屽痉涓庡崕鍗楅檮涓�鐢ㄥ悓涓�濂楅噰闆嗘柟娉曪紙閮芥槸鏉ユ湭鏉ユ彁渚涳級
+ long budgetMinutes = getMzConfigLong(MzGatherParamEnum.BUDGET_MINUTES);
+ long pageSize = getMzConfigLong(MzGatherParamEnum.PAGE_SIZE);
+ long maxPage = getMzConfigLong(MzGatherParamEnum.MAX_PAGE);
+
+ LocalDateTime now = LocalDateTime.now().withNano(0);
+ LocalDateTime deadline = now.plusMinutes(budgetMinutes);
+
+ // 鑾峰彇鐪佺珛鍚屽痉瑕侀噰闆嗙殑闄㈠尯
+ SysConfig cf = new SysConfig();
+ cf.setConfigKey("sltd.gather.campusid");
+ cf.setOrgid(MzGatherConstant.ORG_ID);
+ List<SysConfig> sysConfigcampusids = configService.selectConfigList(cf);
+ if (CollectionUtils.isEmpty(sysConfigcampusids) || StringUtils.isBlank(sysConfigcampusids.get(0).getConfigValue())) {
+ log.error("銆恉ealHisDataMZ銆慡ysConfig涓殑闄㈠尯ID涓虹┖锛�");
+ return;
+ }
+ List<Long> campusidList = Arrays.stream(sysConfigcampusids.get(0).getConfigValue().split(","))
+ .map(String::trim).filter(StringUtils::isNotBlank).map(Long::valueOf).collect(Collectors.toList());
+ log.info("銆恉ealHisDataMZ銆戦櫌鍖猴細{}锛屽崟杞绠楋細{}鍒嗛挓锛屾瘡椤碉細{}鏉�", campusidList, budgetMinutes, pageSize);
+
+ for (Long cid : campusidList) {
+ if (LocalDateTime.now().isAfter(deadline)) {
+ log.warn("銆恉ealHisDataMZ銆戞湰杞椂闂撮绠楀凡鐢ㄥ敖锛屽墿浣欓櫌鍖虹暀鍒颁笅涓�杞户缁紝闄㈠尯锛歿}", cid);
+ break;
+ }
+ // 闃叉涓婁竴杞繕娌¤窇瀹屽氨琚笅涓�杞彔鐫�璺戯紙棰勭畻閰嶇疆杩囧ぇ銆佹垨鎵嬪伐瑙﹀彂鏃跺厹搴曪級
+ String lockKey = "mzRunning:" + cid;
+ if (Boolean.TRUE.equals(redisCache.hasKey(lockKey))) {
+ log.warn("銆恉ealHisDataMZ銆戣闄㈠尯涓婁竴杞噰闆嗗皻鏈粨鏉燂紝鏈疆璺宠繃锛岄櫌鍖猴細{}锛堟柇鐐瑰凡淇濈暀锛屼笅涓�杞户缁級", cid);
+ continue;
+ }
+ redisCache.setCacheObject(lockKey, MzGatherConstant.MINUTE_FMT.format(now), budgetMinutes * 2, TimeUnit.MINUTES);
try {
- //鑾峰彇鐪佺珛鍚屽痉瑕侀噰闆嗙殑闄㈠尯
- SysConfig cf = new SysConfig();
- cf.setConfigKey("sltd.gather.campusid");
- cf.setOrgid("20001001");
- List<SysConfig> sysConfigcampusids = configService.selectConfigList(cf);
-
- List<Long> campusidList = new ArrayList<>();
- if (CollectionUtils.isNotEmpty(sysConfigcampusids)) {
- String[] split = sysConfigcampusids.get(0).getConfigValue().split(",");
- campusidList = Arrays.stream(split).map(Long::valueOf).collect(Collectors.toList());
- } else {
- log.error("SysConfig涓殑闄㈠尯ID涓虹┖锛�");
- return;
- }
-
- // 鐪佺珛鍚屽痉鏁版嵁閲囬泦
- log.info("--campusidList鐨勫�间负锛歿}", campusidList);
- for (Long cid : campusidList) {
- String nowTime = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));
- ServiceSLTDInhospReqVO serviceSLTDInhospReqVO = new ServiceSLTDInhospReqVO();
- serviceSLTDInhospReqVO.setOrgId("20001001");
- serviceSLTDInhospReqVO.setCampusId(cid);
- serviceSLTDInhospReqVO.setEncounterTimeStart(nowTime);
- serviceSLTDInhospReqVO.setEncounterTimeEnd(nowTime);
-
- // 闂ㄦ�ヨ瘖鍒嗛〉閲囬泦锛氭瘡椤�40鏉★紝鐩村埌鏃犳暟鎹负姝�(鍗楀崕闄勪竴鐨勫厛涓嶉噰闂ㄦ�ヨ瘖鏁版嵁)
- if (active.trim().equals("sltd")) {
- log.info("銆恉ealHisData銆戠渷绔嬪悓寰封�滈棬鎬ヨ瘖鈥濆紑濮嬪垎椤甸噰闆嗘暟鎹紝闄㈠尯锛歿}", cid);
- serviceSLTDInhospReqVO.setStartHeadTime(null);
- serviceSLTDInhospReqVO.setStartTailTime(null);
- //鏌ヨ褰撳ぉ鐨勬暟鎹�
- serviceSLTDInhospReqVO.setEncounterTimeEnd(tomorrowdayZero.format(DateTimeFormatter.ofPattern("yyyy-MM-dd")));
- serviceSLTDInhospReqVO.setEncounterTimeStart(todayZero.format(DateTimeFormatter.ofPattern("yyyy-MM-dd")));
- serviceSLTDInhospReqVO.setStatusList(null);
- List<String> list1 = new ArrayList<>();
- list1.add("FH0108.01");
- list1.add("FH0108.03");
- serviceSLTDInhospReqVO.setHealthcareRecordTypeList(list1);
- //浠庣紦瀛橀噷鑾峰彇璧峰椤碉紙闆剁偣鍓�10鍒嗛挓鍐呯敤鏄ㄥぉ鐨勬棩鏈燂紝閬垮厤璺ㄥぉ婕忛噰锛�
- LocalDateTime now = LocalDateTime.now();
- String mzCacheDate = (now.getHour() == 0 && now.getMinute() < 10) ? now.minusDays(1).format(DateTimeFormatter.ofPattern("yyyy-MM-dd")) : now.format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));
- Long outpPage = redisCache.getCacheObject("mzCurrent" + cid + mzCacheDate);
- if (outpPage == null) outpPage = 1L;
- //閭h竟鏆傛椂鍙兘璁剧疆40
- final long OUTP_PAGE_SIZE = 500L;
- while (true) {
- serviceSLTDInhospReqVO.setCurrent(outpPage);
- serviceSLTDInhospReqVO.setSize(OUTP_PAGE_SIZE);
- log.info("銆恉ealHisData銆戠渷绔嬪悓寰封�滈棬鎬ヨ瘖鈥濋噰闆嗙{}椤垫暟鎹紝闄㈠尯锛歿}", outpPage, cid);
- List<ServiceSLTDInhospResDTO> outpResult = serviceSLTDHealthcareRecordService.queryHealthcareRecordList(serviceSLTDInhospReqVO);
- if (CollectionUtils.isEmpty(outpResult)) {
- log.info("銆恉ealHisData銆戠渷绔嬪悓寰封�滈棬鎬ヨ瘖鈥濈{}椤垫棤鏁版嵁锛岄噰闆嗙粨鏉燂紝闄㈠尯锛歿}", outpPage, cid);
- break;
- }
- log.info("銆恉ealHisData銆戠渷绔嬪悓寰封�滈棬鎬ヨ瘖鈥濈{}椤甸噰闆唟}鏉★紝闄㈠尯锛歿}", outpPage, outpResult.size(), cid);
- if (outpResult.size() < OUTP_PAGE_SIZE) {
- //璁剧疆涓�涓紦瀛橈紝鐢ㄦ潵瀛樺湪涓嬫鐨勮捣濮嬮〉
- redisCache.setCacheObject("mzCurrent" + cid + mzCacheDate, outpPage, 24, TimeUnit.HOURS);
- log.info("銆恉ealHisData銆戠渷绔嬪悓寰封�滈棬鎬ヨ瘖鈥濈殑缂撳瓨key:{}涓嬫鐨勮捣濮嬮〉{}锛岄櫌鍖猴細{}", "mzCurrent" + cid + mzCacheDate, outpPage, cid);
- break;
- }
- outpPage++;
- }
- // 娓呴櫎鍒嗛〉鍙傛暟锛岄伩鍏嶅奖鍝嶅悗缁嚭鍏ラ櫌鏌ヨ
- serviceSLTDInhospReqVO.setCurrent(null);
- serviceSLTDInhospReqVO.setSize(null);
- log.info("銆恉ealHisData銆戠渷绔嬪悓寰封�滈棬鎬ヨ瘖鈥濆垎椤甸噰闆嗗畬鎴愶紝闄㈠尯锛歿}", cid);
- }
- }
+ collectOutpatientDaily(cid, todayZeroStr, pageSize, maxPage, deadline);
} catch (Exception e) {
- log.error("銆恉ealHisData銆戠渷绔嬪悓寰锋暟鎹棬鎬ヨ瘖閲囬泦寮傚父", e);
+ log.error("銆恉ealHisDataMZ銆戦棬鎬ヨ瘖閲囬泦寮傚父锛岄櫌鍖猴細{}锛屾柇鐐瑰凡淇濈暀锛屼笅涓�杞粠鏂偣缁х画", cid, e);
+ } finally {
+ redisCache.deleteObject(lockKey);
}
}
+ log.info("銆恉ealHisDataMZ銆戦棬鎬ヨ瘖閲囬泦鏈疆缁撴潫锛岃�楁椂锛歿}绉�",
+ java.time.Duration.between(now, LocalDateTime.now()).getSeconds());
+ }
+
+ /**
+ * 閲囬泦鏌愪釜闄㈠尯锛氬厛琛ヤ竴娆℃�у洖婧棩鏈燂紝鍐嶅仛鏄ㄥぉ鐨勬敹灏鹃噰闆嗭紝鏈�鍚庢暣杞埛鏂颁粖澶�
+ */
+ private void collectOutpatientDaily(Long cid, String backfillParam, long pageSize, long maxPage,
+ LocalDateTime deadline) {
+ String cursorKey = "mzDayCursor:" + cid;
+ MzDayCursor cursor = loadMzDayCursor(cursorKey);
+ LocalDate today = LocalDate.now();
+ LocalDate yesterday = today.minusDays(1);
+
+ // 鎵嬪伐鍏ュ弬鎸囧畾鐨勪竴娆℃�у洖婧細鍚屼竴涓棩鏈熷彧琛ヤ竴娆★紝閬垮厤瀹氭椂浠诲姟姣忚疆閲嶅琛�
+ LocalDateTime backfillTime = parseMzStartTime(backfillParam);
+ if (backfillTime != null) {
+ LocalDate backfillDay = backfillTime.toLocalDate();
+ if (backfillDay.toString().equals(cursor.backfillDone)) {
+ log.info("銆恉ealHisDataMZ銆戝叆鍙傛棩鏈� {} 宸插畬鎴愬洖婧紝璺宠繃锛岄櫌鍖猴細{}", backfillDay, cid);
+ } else if (backfillDay.equals(today)) {
+ // 鍏ュ弬灏辨槸浠婂ぉ锛屼氦缁欎笅闈㈢殑鏁磋疆鍒锋柊澶勭悊鍗冲彲
+ cursor.backfillDone = backfillDay.toString();
+ saveMzDayCursor(cursorKey, cursor);
+ } else {
+ cursor.backfillDay = backfillDay.toString();
+ cursor.backfillPage = 1L;
+ saveMzDayCursor(cursorKey, cursor);
+ log.info("銆恉ealHisDataMZ銆戝緟鍥炴函鏃ユ湡锛歿}锛岄櫌鍖猴細{}", backfillDay, cid);
+ }
+ }
+
+ // 1) 涓�娆℃�у洖婧�
+ if (cursor.backfillDay != null) {
+ LocalDate day = LocalDate.parse(cursor.backfillDay);
+ MzGatherStatusEnum status = runDayPass(cid, cursorKey, cursor, MzGatherSlotEnum.BACKFILL, day,
+ cursor.backfillPage, pageSize, maxPage, deadline);
+ if (status != MzGatherStatusEnum.DONE) {
+ log.warn("銆恉ealHisDataMZ銆戝洖婧棩鏈� {} 鏈疆鏈畬鎴愶紙{}锛夛紝鏂偣宸蹭繚鐣欙紝闄㈠尯锛歿}", day, status.getDesc(), cid);
+ return;
+ }
+ cursor.backfillDone = cursor.backfillDay;
+ cursor.backfillDay = null;
+ cursor.backfillPage = 1L;
+ saveMzDayCursor(cursorKey, cursor);
+ }
+
+ // 2) 鏄ㄥぉ鏀跺熬閲囬泦锛氭瘡澶╀竴娆★紝鍏滀綇 23:xx 涔嬪悗鎵嶅啓杩� HIS 鐨勮褰曞拰璺ㄩ浂鐐圭殑鏁版嵁
+ if (!yesterday.toString().equals(cursor.finalDay)) {
+ MzGatherStatusEnum status = runDayPass(cid, cursorKey, cursor, MzGatherSlotEnum.FINAL, yesterday,
+ cursor.finalPage, pageSize, maxPage, deadline);
+ if (status != MzGatherStatusEnum.DONE) {
+ log.warn("銆恉ealHisDataMZ銆戞槰鏃ユ敹灏鹃噰闆� {} 鏈疆鏈畬鎴愶紙{}锛夛紝鏂偣宸蹭繚鐣欙紝闄㈠尯锛歿}", yesterday, status.getDesc(), cid);
+ return;
+ }
+ cursor.finalDay = yesterday.toString();
+ cursor.finalPage = 1L;
+ saveMzDayCursor(cursorKey, cursor);
+ }
+
+ // 3) 浠婂ぉ鐨勬暣杞埛鏂�
+ if (!today.toString().equals(cursor.day)) {
+ cursor.day = today.toString();
+ cursor.page = 1L;
+ saveMzDayCursor(cursorKey, cursor);
+ }
+ MzGatherStatusEnum status = runDayPass(cid, cursorKey, cursor, MzGatherSlotEnum.TODAY, today,
+ cursor.page, pageSize, maxPage, deadline);
+ if (status == MzGatherStatusEnum.DONE) {
+ // 鏁磋疆鍒锋柊瀹屾垚锛岄〉鐮佸綊浣嶏紝涓嬩竴杞噸鏂颁粠绗竴椤垫暣杞埛鏂�
+ cursor.page = 1L;
+ saveMzDayCursor(cursorKey, cursor);
+ log.info("銆恉ealHisDataMZ銆憑} 闂ㄦ�ヨ瘖鏁磋疆鍒锋柊瀹屾垚锛岄櫌鍖猴細{}", today, cid);
+ }
+ }
+
+ /**
+ * 鍏ㄩ噺閲囬泦鏌愪竴澶╋紙鍒嗛〉鐩村埌閲囧畬锛夛紝姣忛噰瀹屼竴椤电珛鍗宠惤涓�娆℃柇鐐�
+ *
+ * @param slot 鏂偣妲戒綅锛堜粖澶╂暣杞埛鏂� / 鏄ㄦ棩鏀跺熬 / 鎵嬪伐鍥炴函锛夛紝鍐冲畾涓柇椤电爜璁板埌鍝釜瀛楁
+ * @return {@link MzGatherStatusEnum} 閲囬泦瀹屾垚 / 棰勭畻鐢ㄥ敖 / 鎺ュ彛杩炵画澶辫触鎻愬墠缁撴潫
+ */
+ private MzGatherStatusEnum runDayPass(Long cid, String cursorKey, MzDayCursor cursor, MzGatherSlotEnum slot,
+ LocalDate day, long startPage, long pageSize, long maxPage,
+ LocalDateTime deadline) {
+ String startStr = day.format(MzGatherConstant.DAY_FMT);
+ String endStr = day.plusDays(1).format(MzGatherConstant.DAY_FMT);
+
+ ServiceSLTDInhospReqVO reqVO = new ServiceSLTDInhospReqVO();
+ reqVO.setOrgId(MzGatherConstant.ORG_ID);
+ reqVO.setCampusId(cid);
+ reqVO.setStartHeadTime(null);
+ reqVO.setStartTailTime(null);
+ reqVO.setStatusList(null);
+ // 鎺ュ彛鍙敮鎸佹寜澶╂煡锛岃捣姝㈤兘浼犳棩鏈�
+ reqVO.setEncounterTimeStart(startStr);
+ reqVO.setEncounterTimeEnd(endStr);
+ List<String> typeList = new ArrayList<>();
+ typeList.add("FH0108.01"); // 闂ㄨ瘖
+ typeList.add("FH0108.03"); // 鎬ヨ瘖
+ reqVO.setHealthcareRecordTypeList(typeList);
+ reqVO.setSize(pageSize);
+
+ long page = startPage < 1L ? 1L : startPage;
+ long total = 0L;
+ long pageCount = 0L;
+ // 鎺ュ彛灞傚け璐ヨ烦杩囩殑椤垫暟銆佺涓�涓け璐ラ〉銆佽繛缁け璐ラ〉鏁�
+ long skippedPages = 0L;
+ long firstFailPage = -1L;
+ int consecutiveFail = 0;
+ while (true) {
+ if (LocalDateTime.now().isAfter(deadline)) {
+ // 鏈疆鏈夎烦杩囩殑椤垫椂锛屾柇鐐瑰洖鍒扮涓�涓け璐ラ〉锛屼繚璇佷笅涓�杞厛鎶婅繖浜涢〉琛ュ洖鏉�
+ long resumePage = (skippedPages > 0 && firstFailPage > 0) ? firstFailPage : page;
+ saveMzDayPage(cursorKey, cursor, slot, resumePage);
+ log.warn("銆恉ealHisDataMZ銆戞湰杞椂闂撮绠楃敤灏斤紝{} 鏈疆宸查噰{}椤祘}鏉}锛屼笅娆′粠绗瑊}椤电户缁紝闄㈠尯锛歿}",
+ day, pageCount, total, skippedLog(skippedPages), resumePage, cid);
+ return MzGatherStatusEnum.BUDGET_UP;
+ }
+ reqVO.setCurrent(page);
+ log.info("銆恉ealHisDataMZ銆戦噰闆嗛棬鎬ヨ瘖鏁版嵁锛岄櫌鍖猴細{}锛屾棩鏈燂細{}锛岀{}椤�", cid, day, page);
+
+ List<ServiceSLTDInhospResDTO> pageData = null;
+ Exception lastError = null;
+ for (int attempt = 1; attempt <= MzGatherConstant.PAGE_RETRY_TIMES; attempt++) {
+ try {
+ pageData = serviceSLTDHealthcareRecordService.queryHealthcareRecordList(reqVO);
+ lastError = null;
+ break;
+ } catch (Exception e) {
+ lastError = e;
+ log.error("銆恉ealHisDataMZ銆戦棬鎬ヨ瘖绗瑊}椤电{}娆¢噰闆嗗け璐ワ紝闄㈠尯锛歿}锛屾棩鏈燂細{}", page, attempt, cid, day, e);
+ if (attempt < MzGatherConstant.PAGE_RETRY_TIMES) {
+ try {
+ Thread.sleep(MzGatherConstant.PAGE_RETRY_SLEEP_MS);
+ } catch (InterruptedException ie) {
+ Thread.currentThread().interrupt();
+ break;
+ }
+ }
+ }
+ }
+ if (lastError != null) {
+ // 鎺ュ彛灞傚け璐ワ紙缃戠粶瓒呮椂 / 鏉ユ湭鏉ヨ繑鍥為潪200锛夋病鏈夋暟鎹彲浠ヨ惤琛紝鍙啓 error 鏃ュ織锛岀劧鍚庤烦杩囪椤电户缁線鍚庨噰锛屼笉闃绘柇杩涘害銆�
+ // 姣忚疆閮芥槸鏁村ぉ浠庡ご鍏ㄩ噺鍒锋柊锛岃璺宠繃鐨勯〉涓嬩竴杞繀鐒堕噸鏂伴噰鍒帮紝鎵�浠ヤ笉浼氭紡鏁版嵁銆�
+ skippedPages++;
+ if (firstFailPage < 0) {
+ firstFailPage = page;
+ }
+ consecutiveFail++;
+ log.error("銆恉ealHisDataMZ銆戞帴鍙e眰閲囬泦澶辫触锛屽凡璁� error 鏃ュ織骞惰烦杩囪椤碉紝鏈疆缁х画寰�鍚庨噰锛�"
+ + "闄㈠尯锛歿}锛屾棩鏈燂細{}锛岀{}椤碉紝鎺ュ彛鍏ュ弬锛歿}锛屽紓甯革細{}",
+ cid, day, page, new Gson().toJson(reqVO), lastError.getMessage(), lastError);
+ if (consecutiveFail >= MzGatherConstant.MAX_CONSECUTIVE_PAGE_FAIL) {
+ // 杩炵画澶氶〉鎺ュ彛澶辫触锛屽垽瀹氭潵鏈潵鎺ュ彛鏁翠綋涓嶅彲鐢紝鏈疆鎻愬墠缁撴潫锛堜笉鍐嶇┖杞悗闈㈠嚑鍗侀〉锛夛紝鏂偣鐣欏湪绗竴涓け璐ラ〉
+ log.error("銆恉ealHisDataMZ銆戣繛缁瓄}椤垫帴鍙eけ璐ワ紝鍒ゅ畾鏉ユ湭鏉ユ帴鍙d笉鍙敤锛屾湰杞彁鍓嶇粨鏉燂紱闄㈠尯锛歿}锛屾棩鏈燂細{}锛屾柇鐐逛繚鐣欏湪绗瑊}椤�",
+ consecutiveFail, cid, day, firstFailPage);
+ saveMzDayPage(cursorKey, cursor, slot, firstFailPage);
+ return MzGatherStatusEnum.FAILED;
+ }
+ page++;
+ continue;
+ }
+ consecutiveFail = 0;
+
+ if (CollectionUtils.isEmpty(pageData)) {
+ log.info("銆恉ealHisDataMZ銆憑} 绗瑊}椤垫棤鏁版嵁锛岄噰闆嗙粨鏉燂紝闄㈠尯锛歿}锛屾湰杞畕}椤靛叡{}鏉}",
+ day, page, cid, pageCount, total, skippedLog(skippedPages));
+ return MzGatherStatusEnum.DONE;
+ }
+ pageCount++;
+ total += pageData.size();
+ log.info("銆恉ealHisDataMZ銆憑} 绗瑊}椤甸噰闆唟}鏉★紝闄㈠尯锛歿}", day, page, pageData.size(), cid);
+ if (pageData.size() < pageSize) {
+ log.info("銆恉ealHisDataMZ銆憑} 閲囬泦缁撴潫锛岄櫌鍖猴細{}锛屾湰杞畕}椤靛叡{}鏉}", day, cid, pageCount, total, skippedLog(skippedPages));
+ return MzGatherStatusEnum.DONE;
+ }
+ page++;
+ if (page > maxPage) {
+ log.error("銆恉ealHisDataMZ銆憑} 宸茬炕鍒扮{}椤碉紝瓒呰繃鍗曟棩涓婇檺{}椤碉紝鎸夐噰瀹屽鐞嗭紝闄㈠尯锛歿}", day, page, maxPage, cid);
+ return MzGatherStatusEnum.DONE;
+ }
+ // 姣忛噰瀹屼竴椤电珛鍗宠惤鏂偣锛氳繘绋嬭閲嶅惎/寮烘潃涔熻兘浠庤繖涓�椤电户缁紝涓嶄粠澶撮噸鎵紝涔熶笉浼氭紡
+ saveMzDayPage(cursorKey, cursor, slot, page);
+ }
+ }
+
+ /** 鎸夋Ы浣嶄繚瀛樹腑鏂〉鐮� */
+ private void saveMzDayPage(String cursorKey, MzDayCursor cursor, MzGatherSlotEnum slot, long page) {
+ if (slot == MzGatherSlotEnum.FINAL) {
+ cursor.finalPage = page;
+ } else if (slot == MzGatherSlotEnum.BACKFILL) {
+ cursor.backfillPage = page;
+ } else {
+ cursor.page = page;
+ }
+ saveMzDayCursor(cursorKey, cursor);
+ }
+
+ /** 鏃ュ織閲屾彁绀烘帴鍙e眰澶辫触璺宠繃浜嗗嚑椤碉紙涓嬩竴杞暣杞埛鏂颁細閲嶆柊閲囧埌锛� */
+ private String skippedLog(long skippedPages) {
+ return skippedPages > 0L ? "锛屾帴鍙eけ璐ヨ烦杩�" + skippedPages + "椤碉紙涓嬩竴杞暣杞埛鏂颁細閲嶆柊閲囧埌锛�" : "";
+ }
+
+ /** 璇诲彇 sys_config 閲岀殑闂ㄦ�ヨ瘖閲囬泦鍙傛暟锛堟満鏋� orgid=20001001锛夛紝鍙栦笉鍒版垨瓒呰寖鍥存椂鐢ㄦ灇涓鹃噷鐨勯粯璁ゅ�� */
+ private long getMzConfigLong(MzGatherParamEnum param) {
+ try {
+ SysConfig config = new SysConfig();
+ config.setConfigKey(param.getKey());
+ config.setOrgid(MzGatherConstant.ORG_ID);
+ List<SysConfig> configs = configService.selectConfigList(config);
+ if (CollectionUtils.isNotEmpty(configs) && StringUtils.isNotBlank(configs.get(0).getConfigValue())) {
+ long value = Long.parseLong(configs.get(0).getConfigValue().trim());
+ if (value >= param.getMin() && value <= param.getMax()) {
+ return value;
+ }
+ log.warn("銆恉ealHisDataMZ銆戦厤缃畕}鐨勫�納}瓒呭嚭鑼冨洿[{},{}]锛屼娇鐢ㄩ粯璁ゅ�納}",
+ param.getKey(), value, param.getMin(), param.getMax(), param.getDefaultValue());
+ }
+ } catch (Exception e) {
+ log.warn("銆恉ealHisDataMZ銆戣鍙栭厤缃畕}澶辫触锛屼娇鐢ㄩ粯璁ゅ�納}", param.getKey(), param.getDefaultValue(), e);
+ }
+ return param.getDefaultValue();
+ }
+
+ /** 瑙f瀽浠诲姟鍏ュ弬锛堣涓�娆℃�у洖婧殑鏃ユ湡锛夛紝鏀寔 yyyy-MM-dd HH:mm:ss 涓� yyyy-MM-dd */
+ private LocalDateTime parseMzStartTime(String text) {
+ LocalDateTime time = parseMzTimeQuiet(text);
+ if (time == null && StringUtils.isNotBlank(text)) {
+ log.warn("銆恉ealHisDataMZ銆戝叆鍙� {} 鏃犳硶瑙f瀽涓烘棩鏈燂紝鎸夋湭鎸囧畾澶勭悊", text);
+ }
+ return time;
+ }
+
+ /** 闈欓粯瑙f瀽鏃ユ湡锛屾敮鎸� yyyy-MM-dd HH:mm:ss 涓� yyyy-MM-dd锛屾牸寮忎笉绗﹁繑鍥� null锛堜笉鍒锋棩蹇楋級 */
+ private LocalDateTime parseMzTimeQuiet(String text) {
+ if (StringUtils.isBlank(text)) {
+ return null;
+ }
+ String value = text.trim();
+ try {
+ return LocalDateTime.parse(value, MzGatherConstant.MINUTE_FMT);
+ } catch (Exception ignore) {
+ // 鍏煎鍙紶鏃ユ湡鐨勬儏鍐碉紝钀藉埌涓嬮潰鎸夋棩鏈熻В鏋�
+ }
+ try {
+ return LocalDate.parse(value).atStartOfDay();
+ } catch (Exception ignore) {
+ return null;
+ }
+ }
+
+ /** 淇濆瓨闂ㄦ�ヨ瘖閲囬泦鏂偣锛堝悇杞涓柇鐨勯〉鐮侊級 */
+ private void saveMzDayCursor(String cursorKey, MzDayCursor cursor) {
+ JSONObject json = new JSONObject();
+ json.put("day", cursor.day);
+ json.put("page", cursor.page);
+ json.put("finalDay", cursor.finalDay);
+ json.put("finalPage", cursor.finalPage);
+ json.put("backfillDay", cursor.backfillDay);
+ json.put("backfillPage", cursor.backfillPage);
+ json.put("backfillDone", cursor.backfillDone);
+ json.put("updateTime", MzGatherConstant.MINUTE_FMT.format(LocalDateTime.now().withNano(0)));
+ redisCache.setCacheObject(cursorKey, json.toJSONString(), MzGatherConstant.CACHE_TTL_HOURS, TimeUnit.HOURS);
+ }
+
+ /** 璇诲彇闂ㄦ�ヨ瘖閲囬泦鏂偣锛岃涓嶅埌鎴栬В鏋愬け璐ユ椂杩斿洖绌烘柇鐐癸紙绛変环浜庝粠绗竴椤靛紑濮嬫暣杞埛鏂帮級 */
+ private MzDayCursor loadMzDayCursor(String cursorKey) {
+ MzDayCursor cursor = new MzDayCursor();
+ try {
+ String json = redisCache.getCacheObject(cursorKey);
+ if (StringUtils.isBlank(json)) {
+ return cursor;
+ }
+ JSONObject obj = JSONObject.parseObject(json);
+ cursor.day = obj.getString("day");
+ cursor.page = obj.getLongValue("page");
+ cursor.finalDay = obj.getString("finalDay");
+ cursor.finalPage = obj.getLongValue("finalPage");
+ cursor.backfillDay = obj.getString("backfillDay");
+ cursor.backfillPage = obj.getLongValue("backfillPage");
+ cursor.backfillDone = obj.getString("backfillDone");
+ if (cursor.page < 1L) {
+ cursor.page = 1L;
+ }
+ if (cursor.finalPage < 1L) {
+ cursor.finalPage = 1L;
+ }
+ if (cursor.backfillPage < 1L) {
+ cursor.backfillPage = 1L;
+ }
+ return cursor;
+ } catch (Exception e) {
+ log.warn("銆恉ealHisDataMZ銆戣鍙栨柇鐐箋}澶辫触锛屾寜绌烘柇鐐瑰鐞�", cursorKey, e);
+ return new MzDayCursor();
+ }
+ }
+
+ /**
+ * 闂ㄦ�ヨ瘖閲囬泦鏂偣锛氭瘡澶╀竴杞叏閲忓埛鏂帮紝杩欓噷鍒嗗埆璁板綍涓変釜杞涓柇鍦ㄧ鍑犻〉
+ * 锛堥〉鐮佷负 1 琛ㄧず璇ヨ疆娆′笅涓�杞粠绗竴椤垫暣杞紑濮嬶級
+ */
+ private static class MzDayCursor {
+ /** 浠婂ぉ鐨勬暣杞埛鏂� */
+ private String day;
+ private long page = 1L;
+ /** 鏄ㄥぉ鐨勬敹灏鹃噰闆� */
+ private String finalDay;
+ private long finalPage = 1L;
+ /** 寰呭仛鐨勪竴娆℃�у洖婧� */
+ private String backfillDay;
+ private long backfillPage = 1L;
+ /** 宸茬粡琛ヨ繃鐨勫洖婧棩鏈燂紝閬垮厤瀹氭椂浠诲姟姣忚疆閲嶅琛ュ悓涓�澶� */
+ private String backfillDone;
}
/**
@@ -675,7 +942,6 @@
}
}
}
-
public void dealHisDataSLTD() {
log.info("銆恉ealHisData銆戝紑濮嬫墽琛孒IS鏁版嵁閲囬泦浠诲姟");
@@ -734,27 +1000,50 @@
/**
* 澶勭悊鎮h�呬俊鎭紝杩涘叆瀛愪换鍔¤〃
+ * <p>
+ * 鈿狅笍 2025 淇锛堝紑鍏冲け鏁堬級锛氭湰鏂规硶鍘熻蛋 {@code iPatMedInhospService.dealOutHospInfo(config)}锛�
+ * 閭f槸 smartor 閲岀殑閬楃暀瀹炵幇锛�**涓嶅垽浠讳綍妯″潡寮�鍏�** 鈥斺�� 浜庢槸锛�
+ * <ul>
+ * <li>鍏� {@code inhospvisit.enabled} 鐓ф牱鐢熸垚鍑洪櫌/闀挎湡闅忚锛�</li>
+ * <li>鍏� {@code publicity.enabled} 鐓ф牱鍙戝叆闄㈠鏁欎笌鑽搧瀹f暀锛�</li>
+ * <li>鍏� {@code othervisit.enabled} 鐓ф牱鐢熸垚鎵嬫湳闅忚銆�</li>
+ * </ul>
+ * 鐜版敼璧版ā鍧楅棬闈細闂ㄩ潰鍒� {@code inhospvisit.enabled}锛屾ā鍧楀疄鐜板唴閮ㄥ啀鍥炶皟
+ * {@code PublicityApi} / {@code OtherVisitApi}锛屼笁澶勫悇鑷垽鑷繁鐨勫紑鍏炽��
*/
public void dealOutHospInfo() {
String config = configService.selectConfigByKey("visit.early.day");
if (port.equals("8095")) {
- //鍑洪櫌琛�
- iPatMedInhospService.dealOutHospInfo(config);
+ //鍑洪櫌琛紙鍚叆闄㈠鏁� / 鑽搧瀹f暀 / 鎵嬫湳闅忚 鈥斺�� 鍧囩敱妯″潡瀹炵幇鍥炶皟瀵瑰簲妯″潡闂ㄩ潰锛�
+ inhospVisitFacade.dealOutHospInfo(config);
//闂ㄨ瘖琛�(鏂板崕鐨勬殏鏃朵笉鍋氶棬璇婇殢璁�)
if (!active.equals("xh")) {
- iPatMedOuthospService.dealOutpatientInfo();
+ // 銆愰棬鎬ヨ瘖妯″潡鍖栧垏鎹€�戦棬闈㈠唴閮ㄥ垽 sys_config: outpatientvisit.enabled锛堣繍琛屾椂鐑锛夛紝
+ // 鍏抽棴鏃惰繑鍥� 0 骞舵墦 WARN銆�
+ //
+ // 鈿狅笍 2025 淇锛氳繖閲屽師鍏堟槸 iPatMedOuthospService.dealOutpatientInfo()锛�
+ // 瀹冪粡 IPatMedOuthospService 鈫� PatMedOuthospServiceDelegatingImpl
+ // 鈫� OuthospDataFacade.dealOutpatientInfo()锛岃��**閭f潯璺笂娌℃湁寮�鍏冲畧鍗�** 鈥斺��
+ // OuthospVisitFacade.dealOutpatientInfo() 鎵嶆槸甯﹀畧鍗殑鍏ュ彛锛屽嵈鍏ㄤ粨闆惰皟鐢ㄨ�呫��
+ // 缁撴灉鏄� outpatientvisit.enabled=false 瀵瑰畾鏃朵换鍔�**瀹屽叏澶辨晥**銆�
+ // 鐜板湪涓庝笅闈� dealOperationInfo() 璧� otherVisitFacade 鐨勫舰鐘朵竴鑷淬��
+ outhospVisitFacade.dealOutpatientInfo();
}
}
}
/**
* 澶勭悊鎮h�呬俊鎭紝杩涘叆瀛愪换鍔¤〃(浠诲姟缁�)
+ * <p>
+ * 鈿狅笍 2025 淇锛堝紑鍏冲け鏁堬級锛氬師璧� smartor 閬楃暀瀹炵幇锛屼笉鍒ゅ紑鍏筹紙鍚� {@link #dealOutHospInfo()}锛夈��
+ * 鐜拌蛋妯″潡闂ㄩ潰銆傛敞鎰忔ā鍧椾晶鐨� {@code dealOutHospInfoBySchedule} 鍐呴儴浠嶄細杞彂鍥� smartor
+ * 锛坽@code OtherVisitApiBridge}锛岃璇ョ被娉ㄩ噴锛夛紝浣�<b>寮�鍏冲湪闂ㄩ潰杩欎竴灞傚垽</b>锛屾墍浠ュ叧闂椂涓嶄細璧板埌閭i噷銆�
*/
public void dealOutHospInfoBySchedule() {
String config = configService.selectConfigByKey("visit.early.day");
if (port.equals("8095")) {
//鍑洪櫌琛�
- iPatMedInhospService.dealOutHospInfoBySchedule(config);
+ inhospVisitFacade.dealOutHospInfoBySchedule(config);
//闂ㄨ瘖琛�(鏂板崕鐨勬殏鏃朵笉鍋氶棬璇婇殢璁�)
// if (!active.equals("xh")) {
// //iPatMedOuthospService.dealOutpatientInfo();
@@ -762,12 +1051,13 @@
}
}
-
/**
* 澶勭悊鎵嬫湳淇℃伅锛岃繘鍏ュ瓙浠诲姟琛�
*/
public void dealOperationInfo() {
- if (port.equals("8095")) iPatMedOperationService.dealOperationInfo();
+ // 銆愭墜鏈ā鍧楀寲鍒囨崲銆戝嚭鍙f敼涓鸿皟鐢� ruoyi-othervisit 鐨勫父椹婚棬闈€��
+ // 闂ㄩ潰鍐呴儴鍒� sys_config: othervisit.enabled锛堣繍琛屾椂鐑锛夛紝鍏抽棴鏃惰繑鍥� 0 骞舵墦 WARN銆�
+ if (port.equals("8095")) otherVisitFacade.dealOperationInfo();
}
@@ -781,7 +1071,10 @@
*/
public void createOuthospQuarterTable() {
log.info("銆恈reateOuthospQuarterTable銆戝紑濮嬫墽琛岄棬璇婂垎琛ㄤ换鍔�");
- createDataTable.createOuthospQuarterTable();
+ // 銆愰棬璇婃ā鍧楀寲銆慍reateDataTable 宸叉暣浣撹縼鍏� ruoyi-outpatientvisit
+ // 锛堝疄鐜颁负 OuthospPartitionMaintainer锛岀粡 OuthospVisitFacade 鏆撮湶锛夈��
+ // 杩欓噷鍙仛璋冪敤锛涘缓琛ㄩ�昏緫涓�琛屾湭鍔ㄣ��
+ outhospVisitFacade.createOuthospQuarterTable();
}
/**
@@ -794,7 +1087,6 @@
List<ServicePatientTemp> servicePatientTemps = iServicePatientTempService.selectServicePatientTempList(new ServicePatientTemp());
}
}
-
/**
* 闀挎湡浠诲姟鍙戦��
@@ -893,7 +1185,6 @@
if (StringUtils.isNotEmpty(failDay)) iServiceSubtaskService.setFailSubTaskDefalutVal(Long.valueOf(failDay));
}
-
/**
* 鍒ゆ柇鏃ユ湡鏄惁鏄粖澶�
*
@@ -945,6 +1236,22 @@
}
String descByCode = ServiceFromEnum.getDescByCode(Integer.valueOf(sendPreachform));
+
+ // 鈿狅笍 2025 淇锛堝鏁欏紑鍏冲け鏁堬級锛歵ype == 3 鏄�**瀹f暀/閫氱煡**锛堢函鍙戦�併�佹棤浣滅瓟 鈥斺��
+ // 瑙� setSuccessPreachForm 閲屻�屽鏁欐垨閫氱煡鈥︾洿鎺ユ敼鎴� 9銆嶃�佷互鍙婃湰鏂规硶鍚庨潰
+ // 銆屽鏁欐垨閫氱煡锛屽彂閫佹垚鍔熷垯鐩存帴鏀规垚 6L銆嶇殑鍒ゅ畾锛夛紝鏁存潯娲惧彂鐨勬墍鏈夐�氶亾
+ // 锛堢數璇�/鐭俊/鍏紬鍙�/浜哄伐锛夊彂鐨勯兘鏄鏁欏唴瀹广�傚叧鎺� publicity.enabled 鏃跺簲**涓�涓�氶亾閮戒笉鍙�**銆�
+ //
+ // 鈿狅笍 鍒绘剰**涓嶆帹杩� subtask 鐘舵�併�佷篃涓嶈澶辫触**锛堜笌 RedisMqReceiver 鍚屽彛寰勶級锛�
+ // 鍏抽棴鏄�"鏆傛椂涓嶅彂"锛屼笉鏄�"杩欎釜鎮h�呬笉闇�瑕佸鏁�"銆傛爣鎴愬け璐�/涓嶉渶瑕佷細璁╄繖鏉″鏁�
+ // 鍦ㄥ紑鍏虫仮澶嶅悗姘歌繙涓㈠け銆備繚鎸� sendstate 涓嶅姩锛屽紑鍏虫墦寮�鍚庝笅涓�娆� longTaskSend/compensateTask
+ // 浼氱収甯告妸瀹冩崬鍑烘潵鍙戝嚭銆�
+ if ("3".equals(serviceSubtask.getType()) && !publicityFacade.isEnabled()) {
+ log.warn("銆愬鏁欍�戞ā鍧楁湭鍚敤锛堝弬鏁伴厤缃� publicity.enabled=false锛夛紝璺宠繃瀹f暀鍙戦�併�俿ubtaskId={}, patid={}",
+ serviceSubtask.getId(), serviceSubtask.getPatid());
+ return;
+ }
+
if (descByCode.equals("鐢佃瘽")) {
List<String> list = new ArrayList<>();
ServiceTask ivrTask = serviceTaskMapper.selectServiceTaskByTaskid(serviceSubtask.getTaskid());
@@ -1027,18 +1334,17 @@
serviceOutPath.setCreateTime(new Date());
serviceOutPath.setOrgid(serviceSubtask.getOrgid());
iServiceOutPathService.insertServiceOutPath(serviceOutPath);
+ String url = "";
String format = String.format("%03X", serviceOutPath.getId());
- serviceOutPath.setRadix(format);
- serviceOutPath.setUpdateTime(new Date());
- iServiceOutPathService.updateServiceOutPath(serviceOutPath);
//鍏堝垽鏂竴涓嬪彂鐨勬槸涓嶆槸瀹f暀
if (!"3".equals(serviceSubtask.getType())) {
sendMagParam.setPhone(serviceSubtask.getPhone());
-
- sendMagParam.setUrl(StringUtils.isNotEmpty(req_path) ? localIP + ":" + req_path + "/wt?p=" + format : localIP + "/wt?p=" + format);
+ url = StringUtils.isNotEmpty(req_path) ? localIP + ":" + req_path + "/wt?p=" + format : localIP + "/wt?p=" + format;
+ sendMagParam.setUrl(url);
//濡傛灉type鏄闊抽殢璁跨殑璇濓紙璇存槑琛ュ伩鍙戦�佹柟寮忎腑鏈夌數璇濋殢璁跨殑鏂瑰紡锛岃繖閲岀殑澶栭摼灏卞湴鍧�鍙兘鐢�/sf锛�
if (serviceSubtask.getType().equals("1"))
- sendMagParam.setUrl(StringUtils.isNotEmpty(req_path) ? localIP + ":" + req_path + "/sf?p=" + format : localIP + "/sf?p=" + format);
+ url = StringUtils.isNotEmpty(req_path) ? localIP + ":" + req_path + "/sf?p=" + format : localIP + "/sf?p=" + format;
+ sendMagParam.setUrl(url);
// SysConfig sysConfig = sysConfigMapper.checkConfigKeyUnique("wj.sms.template");
SysConfig sysConfig = new SysConfig();
@@ -1055,10 +1361,18 @@
sendMagParam.setContent(smsContemt.replace("${wjurl}", sendMagParam.getUrl()));
}
} else {
- HeLibrary heLibrary = heLibraryMapper.selectHeLibraryById(serviceSubtask.getLibtemplateid());
+ // 鈿狅笍 杩欓噷**鍒绘剰涓�**涓� TemplateModuleDisabledException 鍋氶檷绾э細
+ // 妯℃澘妯″潡鍏抽棴锛坰ys_config: template.enabled=false锛夋椂锛屽鏁欏唴瀹圭‘瀹炲彇涓嶅埌锛�
+ // 鐭俊涔熷氨纭疄鍙戜笉鍑哄幓銆傚灞� try-catch 浼氬瀹炶涓�"鐭俊鍙戦�佸け璐�"锛�
+ // 骞堕�氳繃 setSuccessPreachForm(..., "5") 鎸夋棦鏈夋満鍒跺崌绾у埌涓嬩竴涓�氶亾锛堝叕浼楀彿/浜哄伐锛夈��
+ // 鑻ュ湪杩欓噷纭鎴�"鍙戦�佹垚鍔�"锛岀瓑浜庣敤涓�鏉″亣璁板綍鎺╃洊"娌″彂鍑哄幓"锛�
+ // 浜嬪悗浠庝换鍔¤褰曚笂瀹屽叏鐪嬩笉鍑洪棶棰� 鈥斺�� 閭f槸鏇村潖鐨勯檷绾с��
+ HeLibrary heLibrary = templateFacade.findHeLibraryById(serviceSubtask.getLibtemplateid());
if (heLibrary.getHetype().equals("1")) {
sendMagParam.setPhone(serviceSubtask.getPhone());
- sendMagParam.setUrl(StringUtils.isNotEmpty(req_path) ? localIP + ":" + req_path + "/xj?p=" + format : localIP + "/xj?p=" + format);
+ url = StringUtils.isNotEmpty(req_path) ? localIP + ":" + req_path + "/xj?p=" + format : localIP + "/xj?p=" + format;
+
+ sendMagParam.setUrl(url);
SysConfig sysConfig = sysConfigMapper.checkConfigKeyUnique("xj.sms.template");
if (!Objects.isNull(sysConfig)) {
@@ -1076,124 +1390,16 @@
}
}
- String isSuccess = null;
+
+ serviceOutPath.setRadix(format);
+ serviceOutPath.setUpdateTime(new Date());
+ serviceOutPath.setUrl(url);
+ iServiceOutPathService.updateServiceOutPath(serviceOutPath);
+ //鐭俊鍙戦�侊細鍚勭珯鐐瑰鎺ユ柟寮忓樊寮傝緝澶э紙鎶ユ枃/绛惧悕/token/杩斿洖鍒ゅ畾閮戒笉鍚岋級锛�
+ //宸叉敹鍙e埌 ruoyi-message 妯″潡锛岃繖閲屽彧璐熻矗缁勮鍏ュ弬骞惰矾鐢�
log.info("active鐨勫�间负锛歿}", active);
- if (active.equals("xh")) {
- Map<String, String> req = new HashMap<>();
-// req.put("phone", sendMagParam.getPhone());
-// req.put("content", sendMagParam.getContent());
- Map<String, String> map2 = new HashMap<String, String>();
- map2.put("action", "send");
- map2.put("account", xhsmsAccount);
- map2.put("password", xhsmsPwd);
- map2.put("mobile", sendMagParam.getPhone());
- map2.put("content", sendMagParam.getContent());
- map2.put("extno", xhsmsjrm);
- map2.put("rt", "json");
- StringBuilder encodedParams = new StringBuilder();
-
- for (Map.Entry<String, String> entry : map2.entrySet()) {
- if (encodedParams.length() > 0) {
- encodedParams.append("&");
- }
- // 瀵归敭鍜屽�艰繘琛孶RL缂栫爜
- String encodedKey = URLEncoder.encode(entry.getKey(), "UTF-8");
- String encodedValue = URLEncoder.encode(entry.getValue(), "UTF-8");
- encodedParams.append(encodedKey).append("=").append(encodedValue);
- }
- Boolean result = HttpUtils.sendPost(xhsmsPath, new Gson().toJson(req));
- if (result) isSuccess = "true";
- } else if (active.equals("ls")) {
-// String url = configService.selectConfigByKey("token.360", serviceSubtask.getOrgid());
-// //涓芥按鐨勭煭淇″彂閫佹柟寮�
-// Map<String, String> map = MsgLSEnum.getAddressByCode(serviceSubtask.getOrgid());
- SysConfig config = new SysConfig();
- config.setConfigKey("ls.msg.info");
- config.setOrgid(serviceSubtask.getOrgid());
- List<SysConfig> sysConfigs = configService.selectConfigList(config);
- Map<String, String> msgInfo = new HashMap<>();
- if (CollectionUtils.isNotEmpty(sysConfigs)) {
- String configValue = sysConfigs.get(0).getConfigValue();
- ObjectMapper objectMapper = new ObjectMapper();
- if (StringUtils.isNotEmpty(configValue)) {
- msgInfo = objectMapper.readValue(configValue, Map.class);
- }
- }
- log.info("-----------map鐨勫�间负锛歿}", msgInfo);
- String token = LSHospTokenUtil.getToken(serviceSubtask.getOrgid(), msgInfo.get("tokenUrl"));
- if (ObjectUtils.isNotEmpty(msgInfo) && StringUtils.isEmpty(msgInfo.get("address"))) {
- setSuccessPreachForm(serviceSubtask, sendPreachform, "鐭俊鍙戦�佸け璐�,璇ユ満鏋勬病鏈夐厤缃煭淇″湴鍧�, 鏃堕棿:" + now, "5");
- return;
- }
- log.info("銆恠fHandlle銆戜附姘寸煭淇″彂閫侊紝鍦板潃锛歿}锛屽弬鏁帮細{}锛屾満鏋処D锛歿}", msgInfo.get("address"), sendMagParam, serviceSubtask.getOrgid());
- String dxCode = getDXCode(msgInfo.get("address"), sendMagParam.getPhone(), sendMagParam.getContent(), msgInfo.get("sendPersonId"), msgInfo.get("sendPersonName"), MsgLSEnum.getHeaderByCode(msgInfo), token);
- log.info("銆恠fHandlle銆戜附姘寸煭淇″彂閫佺粨鏋滐細{}", dxCode);
- ObjectMapper objectMapper = new ObjectMapper();
- Map<String, Object> textParam = objectMapper.readValue(dxCode, Map.class);
- String code = textParam.get("Code").toString();
- if (code.equals("0")) {
- isSuccess = "true";
- }
- } else if (active.equals("sltd") || active.equals("nhfy")) {
- log.info("sltd杩涙潵浜嗗悧锛焮} ,---sendMagParam.getContent()鐨勫弬鏁颁负锛歿}", active, sendMagParam.getContent());
- if (active.equals("sltd")) {
- //鐪佺珛鍚屽痉鐨勭煭淇″彂閫佹柟寮�
- String data = MessageSend.sendMsg(sendMagParam.getContent(), "6", sendMagParam.getPhone(), LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss")));
- if (StringUtils.isNotEmpty(data)) {
- // 瑙f瀽 result=0&description=鎴愬姛&faillist= 鏍煎紡锛坮esult=0鎴愬姛锛�1澶辫触锛�
- log.info("銆恠fHandlle銆戠渷绔嬪悓寰风煭淇″彂閫佽繑鍥烇細{}", data);
- String[] pairs = data.split("&");
- String resultVal = null;
- for (String pair : pairs) {
- String[] kv = pair.split("=", 2);
- if ("result".equals(kv[0])) {
- resultVal = kv.length > 1 ? kv[1] : null;
- break;
- }
- }
- if ("0".equals(resultVal)) {
- isSuccess = "true";
- }
- }
- } else if (active.equals("nhfy")) {
- Map<String, Object> smsResult = mtSubmitSmUtil.submitSm(sendMagParam.getPhone(), sendMagParam.getContent());
- if (smsResult != null && smsResult.get("result") != null && smsResult.get("result").toString().equals("0")) {
- isSuccess = "true";
- }
- }
- } else if (active.equals("hzszlyy")) {//甯備竴鍖婚櫌
- String content = sendMagParam.getContent().replace("銆愭柊鍗庡尰闄€��", "");
-
- SysDept sysDeptVo = new SysDept();
- List<SysDept> sysDepts = new ArrayList<>();
- if (ObjectUtils.isNotEmpty(serviceSubtask.getDeptcode())) {
- sysDeptVo.setDeptType("1");
- sysDeptVo.setOrgid(serviceSubtask.getOrgid());
- sysDeptVo.setDeptCode(serviceSubtask.getDeptcode());
- sysDeptService.selectDeptList(sysDeptVo);
- } else if (ObjectUtils.isNotEmpty(serviceSubtask.getLeavehospitaldistrictcode())) {
- sysDeptVo.setDeptType("2");
- sysDeptVo.setOrgid(serviceSubtask.getOrgid());
- sysDeptVo.setDeptCode(serviceSubtask.getLeavehospitaldistrictcode());
- sysDeptService.selectDeptList(sysDeptVo);
- }
- SysDept sysDept = CollectionUtils.isNotEmpty(sysDepts) ? sysDepts.get(0) : new SysDept();
- String campusid = ObjectUtils.isNotEmpty(sysDept) ? sysDept.getCampusid() : "2";
- //婀栨花鍗曠嫭鍙戦�佹柟寮�
- if ("1".equals(campusid)) {
- String result = smsUtils.sendSms1(xhsmsPath, xhsmsAccount, xhsmsPwd, sendMagParam.getPhone(), content);
- //杩欓噷闇�瑕佹牴鎹畆esult杩斿洖鐨勫�煎幓鍒ゆ柇锛屾槸鍚︽垚鍔燂紝鐒跺悗灏嗗�艰祴鍊肩粰isSuccess
- if (StringUtils.isNotEmpty(result) && result.contains("澶勭悊鎴愬姛")) {
- isSuccess = "true";
- }
- } else {
- String result = smsUtils.sendSms(xhsmsPath, xhsmsAccount, xhsmsPwd, sendMagParam.getPhone(), content);
- //杩欓噷闇�瑕佹牴鎹畆esult杩斿洖鐨勫�煎幓鍒ゆ柇锛屾槸鍚︽垚鍔燂紝鐒跺悗灏嗗�艰祴鍊肩粰isSuccess
- if (StringUtils.isNotEmpty(result) && result.contains("澶勭悊鎴愬姛")) {
- isSuccess = "true";
- }
- }
- }
+ SendResult smsSendResult = sendSmsByActive(serviceSubtask, sendMagParam);
+ String isSuccess = smsSendResult.asLegacyFlag();
//浠诲姟鍙戦�佽褰�
ServiceSubtaskRecord serviceSubtaskRecord = new ServiceSubtaskRecord();
serviceSubtaskRecord.setTaskid(serviceSubtask.getTaskid().toString());
@@ -1249,31 +1455,14 @@
String format = String.format("%03X", serviceOutPath.getId());
serviceOutPath.setRadix(format);
serviceOutPath.setUpdateTime(new Date());
+ serviceOutPath.setUrl(url);
iServiceOutPathService.updateServiceOutPath(serviceOutPath);
- //鑾峰彇寰俊鍏紬鍙疯姹備俊鎭牴鎹満鏋処D
- List<String> wxqqxx = WxGZHEnum.getDescByCode(patArchive.getOrgid());
- //甯備竴鍖婚櫌 涓嶆牎楠�
+ //寰俊鍏紬鍙峰彂閫侊細甯備竴涓庢柊鍗庢槸涓ゅ瀹屽叏涓嶅悓鐨勭綉鍏充笌鍒ゅ畾鏍囧噯锛�
+ //鏈烘瀯閰嶇疆鏍¢獙銆丠IS鎮h�匢D鏍¢獙閮藉凡鏀跺彛鍒� ruoyi-message 鐨勫彂閫佹柟瀹炵幇閲�
+ SendResult wechatSendResult = sendWechatByActive(serviceSubtask, patArchive, url);
+ Boolean wxCodeSuccess = wechatSendResult.isOk();
- if (CollectionUtils.isEmpty(wxqqxx) || wxqqxx.size() < 4) {
- setSuccessPreachForm(serviceSubtask, sendPreachform, "銆愬叕浼楀彿銆戣鏈烘瀯鐨勫叕浼楀彿閰嶇疆淇℃伅涓嶅叏锛屾棤娉曢�氳繃鍏紬鍙峰彂閫�", "4");
- return;
- }
-
- if (StringUtils.isEmpty(patArchive.getPatidHis())) {
- setSuccessPreachForm(serviceSubtask, sendPreachform, "銆愬叕浼楀彿銆戝叕浼楀彿鍙戦�佸け璐�,his绯荤粺鐨勬偅鑰卛d涓虹┖", "5");
- return;
- }
- String wxCode = "";
- //甯備竴鍖婚櫌
- if (active.equals("hzszlyy")) {
- //澶勭悊涓枃涔辩爜闂
- wxCode = smsUtils.sendChat(url, patArchive.getTelcode(), serviceSubtask.getSfzh());
- } else {
- wxCode = getWXCode(serviceSubtask.getSfzh(), url, serviceSubtask.getTaskName(), serviceSubtask.getTaskDesc(), patArchive.getTelcode(), serviceSubtask.getSendname(), patArchive.getPatidHis(), wxqqxx);
- }
-
- Map map = JSONObject.parseObject(wxCode, Map.class);
//浠诲姟鍙戦�佽褰�
ServiceSubtaskRecord serviceSubtaskRecord = new ServiceSubtaskRecord();
serviceSubtaskRecord.setTaskid(serviceSubtask.getTaskid().toString());
@@ -1282,22 +1471,7 @@
serviceSubtaskRecord.setPreachform("4");
serviceSubtaskRecord.setStartTime(System.currentTimeMillis());
serviceSubtaskRecord.setResult("success");
- Boolean wxCodeSuccess = false;
- if (active.equals("hzszlyy")) {
- if (!map.isEmpty() && map.get("success") != null) {
- Integer wxCodeSuccessShiyi = (Integer) map.get("success");
- if (ObjectUtils.isNotEmpty(wxCodeSuccessShiyi) && wxCodeSuccessShiyi == 1) {
- wxCodeSuccess = true;
- } else {
- wxCodeSuccess = false;
- }
- }
- } else {
- if (!map.isEmpty() && map.get("succ") != null) {
- wxCodeSuccess = (boolean) map.get("succ");
- }
- }
- if (!map.isEmpty() && !wxCodeSuccess) serviceSubtaskRecord.setResult("error");
+ if (!wxCodeSuccess) serviceSubtaskRecord.setResult("error");
serviceSubtaskRecordService.insertServiceSubtaskRecord(serviceSubtaskRecord);
//鍙戦�佸畬鎴愬悗锛屼慨鏀圭姸鎬�
@@ -1306,7 +1480,7 @@
serviceSubtask.setResult("success");
setSuccessPreachForm(serviceSubtask, sendPreachform, "銆愬叕浼楀彿銆戝叕浼楀彿鍙戦�佹垚鍔�", "2");
} else {
- log.error("銆恠fHandlle銆戝叕浼楀彿鍙戦�佸け璐ワ紝鎮h�呬俊鎭細{}锛岄敊璇俊鎭細{}", serviceSubtask, map.get("msg"));
+ log.error("銆恠fHandlle銆戝叕浼楀彿鍙戦�佸け璐ワ紝鎮h�呬俊鎭細{}锛岄敊璇俊鎭細{}", serviceSubtask, wechatSendResult.getMessage());
setSuccessPreachForm(serviceSubtask, sendPreachform, "銆愬叕浼楀彿銆戝叕浼楀彿鍙戦�佸け璐�", "5");
}
} catch (Exception e) {
@@ -1321,6 +1495,71 @@
}
+ /**
+ * 鎸� {@code active}锛堢珯鐐癸級璺敱鍒板搴旂殑鐭俊鍙戦�佹柟銆�
+ * <p>
+ * 鍚勭珯鐐瑰樊寮傝 {@code ruoyi-message} 妯″潡鍚勫疄鐜扮被锛涙湰鏂规硶鍙仛銆屽叆鍙傜粍瑁� + 璺敱 + 鏃ュ織銆嶃��
+ * <p>
+ * 鈿狅笍 鏂板崕锛坽@code xh}锛夌珯鐐逛粛璧般�屾棫瀹炵幇锛堝彂閫佺┖鎶ユ枃锛夈�嶏紝涓庡師 {@code RyTask} 琛屼负涓�瀛椾笉宸紝
+ * 纭缃戝叧鎶ユ枃鏍煎紡鍚庡簲鏀逛负 {@code XinHuaSmsSender#sendForm}銆傝瑙佽绫荤殑 TODO 璇存槑銆�
+ */
+ private SendResult sendSmsByActive(ServiceSubtask serviceSubtask, SendMagParam sendMagParam) {
+ SmsSendRequest request = SmsSendRequest.of(sendMagParam.getPhone(), sendMagParam.getContent(), serviceSubtask.getOrgid());
+ //甯備竴鍖哄垎婀栨花/鍚村北涓ゅ鐭俊绛惧悕
+ if ("hzszlyy".equals(active)) {
+ request.setCampus(resolveShiyiCampus(serviceSubtask));
+ }
+ if ("xh".equals(active)) {
+ XinHuaSmsSender xinHuaSmsSender = (XinHuaSmsSender) smsSenderFactory.get(active);
+ return xinHuaSmsSender.sendJsonLegacy(request);
+ }
+ return smsSenderFactory.send(active, request);
+ }
+
+ /**
+ * 鎸� {@code active}锛堢珯鐐癸級璺敱鍒板搴旂殑寰俊鍏紬鍙峰彂閫佹柟銆�
+ * <p>
+ * 鈿狅笍 鏂板崕鍏紬鍙峰繀椤讳紶鎮h�呬俊鎭紙濮撳悕 + HIS 鎮h�匢D锛夛紝涓庡師
+ * {@code getWXCode(...)} 鐨勫叆鍙備繚鎸佷竴涓�瀵瑰簲銆�
+ */
+ private SendResult sendWechatByActive(ServiceSubtask serviceSubtask, PatArchive patArchive, String url) {
+ WechatSendRequest request = new WechatSendRequest();
+ request.setOrgid(patArchive.getOrgid());
+ request.setIdCard(serviceSubtask.getSfzh());
+ request.setUrl(url);
+ request.setTitle(serviceSubtask.getTaskName());
+ request.setContent(serviceSubtask.getTaskDesc());
+ request.setPhone(patArchive.getTelcode());
+ request.setPatientName(serviceSubtask.getSendname());
+ request.setPatidHis(patArchive.getPatidHis());
+ return wechatSenderFactory.send(active, request);
+ }
+
+ /**
+ * 鏌ヨ鎮h�呮墍鍦ㄩ櫌鍖猴紙1=婀栨花锛屽叾浠�=鍚村北锛夈��
+ * <p>
+ * TODO 寰呯‘璁わ細鍘熷疄鐜板苟鏈妸 {@code sysDeptService.selectDeptList(...)} 鐨勮繑鍥炲�艰祴缁�
+ * {@code sysDepts}锛屽洜姝� {@code sysDepts} 鎭掍负绌哄垪琛ㄣ�亄@code campusid} 鎭掍负 {@code "2"}锛�
+ * 婀栨花闄㈠尯瀹為檯涓婃案杩滆蛋涓嶅埌 {@code sendSms1}銆傛湰娆¢噸鏋�<b>淇濇寔璇ヨ涓轰笉鍙�</b>锛�
+ * 璇峰湪涓氬姟纭鍚庡啀鍐冲畾鏄惁淇垚 {@code sysDepts = sysDeptService.selectDeptList(...)}銆�
+ */
+ private String resolveShiyiCampus(ServiceSubtask serviceSubtask) {
+ SysDept sysDeptVo = new SysDept();
+ List<SysDept> sysDepts = new ArrayList<>();
+ if (ObjectUtils.isNotEmpty(serviceSubtask.getDeptcode())) {
+ sysDeptVo.setDeptType("1");
+ sysDeptVo.setOrgid(serviceSubtask.getOrgid());
+ sysDeptVo.setDeptCode(serviceSubtask.getDeptcode());
+ sysDeptService.selectDeptList(sysDeptVo);
+ } else if (ObjectUtils.isNotEmpty(serviceSubtask.getLeavehospitaldistrictcode())) {
+ sysDeptVo.setDeptType("2");
+ sysDeptVo.setOrgid(serviceSubtask.getOrgid());
+ sysDeptVo.setDeptCode(serviceSubtask.getLeavehospitaldistrictcode());
+ sysDeptService.selectDeptList(sysDeptVo);
+ }
+ SysDept sysDept = CollectionUtils.isNotEmpty(sysDepts) ? sysDepts.get(0) : new SysDept();
+ return ObjectUtils.isNotEmpty(sysDept) ? sysDept.getCampusid() : "2";
+ }
private Date getNextVisitTime(Long subid, Long taskid, Date visitTime) {
ServiceSubtaskPreachform serviceSubtaskPreachform = new ServiceSubtaskPreachform();
@@ -1455,74 +1694,10 @@
return 0;
}
- private String getDXCode(String address, String ShouJiHM, String FaSongNR, String FaSongRID, String FaSongRXM, Map<String, Object> headerMap, String token) {
- Map<String, Object> map = new LinkedHashMap<>();
-
- Map<String, Object> YeWuXX = new LinkedHashMap<>();
- Map<String, Object> DuanXinXX = new LinkedHashMap<>();
- DuanXinXX.put("ShouJiHM", ShouJiHM);
- DuanXinXX.put("FaSongNR", FaSongNR);
- DuanXinXX.put("FaSongRID", FaSongRID);
- DuanXinXX.put("FaSongRXM", FaSongRXM);
- YeWuXX.put("DuanXinXX", DuanXinXX);
-
- map.put("XiaoXiTou", headerMap);
- map.put("YeWuXX", YeWuXX);
-
- String body = new Gson().toJson(map);
-
-// String result = HttpUtils.sendPost(address, body);
- String result = null;
- try {
- result = OkHttpExample.sendPostRequest(address, body, token);
- } catch (IOException e) {
- e.printStackTrace();
- }
- log.info("銆恎etDXCode銆戠煭淇″彂閫佺粨鏋滐細{}", result);
-
- JSONObject jsonObject = JSONObject.parseObject(result);
- String code = (String) jsonObject.toString();
- return code;
- }
-
-
- private String getWXCode(String idcard, String url, String taskName, String taskDesc, String phone, String setPatientname, String setPatientid, List<String> wxqqxx) {
- XinHuaWXReq xinHuaWXReq = new XinHuaWXReq();
- xinHuaWXReq.setIdcard(idcard);
- xinHuaWXReq.setUrl(url);
- xinHuaWXReq.setPatientid(setPatientid);
- xinHuaWXReq.setPatientname(setPatientname);
- xinHuaWXReq.setMobile(phone);
- xinHuaWXReq.setMedcardno(null);
- xinHuaWXReq.setTitlename(taskName);
- xinHuaWXReq.setContent(taskDesc);
- xinHuaWXReq.setAppid(wxqqxx.get(1));
- log.info("銆恎etWXCode銆戝井淇″叕浼楀彿璇锋眰鍙傛暟锛歿}", xinHuaWXReq);
- String body = new Gson().toJson(xinHuaWXReq);
- String encode = encode(wxqqxx.get(2).concat(body));
- Map<String, String> headerMap = new HashMap<>();
- headerMap.put("sign", encode);
- String result = HttpUtils.sendPostByHeader(wxqqxx.get(3), body, headerMap);
- log.info("銆恎etWXCode銆戝井淇″叕浼楀彿杩斿洖鍙傛暟锛歿}", result);
- JSONObject jsonObject = JSONObject.parseObject(result);
- String code = (String) jsonObject.toString();
- return code;
- }
-
-
- public String encode(String arg) {
- if (arg == null) {
- arg = "";
- }
- MessageDigest md5 = null;
- try {
- md5 = MessageDigest.getInstance("MD5");
- md5.update(arg.getBytes("UTF-8"));
- } catch (Exception e) {
- e.printStackTrace();
- }
- return toHex(md5.digest());
- }
+ // ---------------------------------------------------------------------
+ // 璇存槑锛氬師 getDXCode / getWXCode / encode 涓変釜绉佹湁鏂规硶宸查殢鍙戦�佹柟涓�璧锋敹鍙e埌
+ // ruoyi-message 妯″潡锛圠ishuiSmsSender / XinHuaMpApi锛夛紝姝ゅ宸插垹闄わ紝閬垮厤閲嶅瀹炵幇銆�
+ // ---------------------------------------------------------------------
public void collectHIS() {
try {
@@ -1557,19 +1732,20 @@
public void collectHISDaysBefore(Long daysBefore) {
try {
- // 鑾峰彇鏄ㄥぉ0鐐瑰埌浠婂ぉ0鐐圭殑鏃堕棿鑼冨洿
+ // 鑾峰彇daysBefore 0鐐瑰埌daysBefore-1 0鐐圭殑鏃堕棿鑼冨洿
LocalDateTime todayZero = LocalDateTime.now().with(LocalTime.MIN);
- LocalDateTime daysBeforeZero = todayZero.minusDays(daysBefore);
+ LocalDateTime daysBeforeZeroStart = todayZero.minusDays(daysBefore);
+ LocalDateTime daysBeforeZeroEnd = todayZero.minusDays(daysBefore-1L);
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
- String startTime = daysBeforeZero.format(formatter);
- String endTime = todayZero.format(formatter);
+ String startTime = daysBeforeZeroStart.format(formatter);
+ String endTime = daysBeforeZeroEnd.format(formatter);
// HIS鏁版嵁閲囬泦
- log.info("銆恈ollectHISDaysBefore銆慔IS寮�濮嬮噰闆嗘暟鎹�");
+ log.info("銆恈ollectHISDaysBefore銆慔IS寮�濮嬮噰闆嗘暟鎹�: startTime:{}, endtime:{}",startTime, endTime);
// 绔嬪嵆杩斿洖锛屽悗鍙板紓姝ユ墽琛�
CompletableFuture.runAsync(() -> {
ichService.syncMedInhosp(startTime, endTime);
});
- log.info("銆恈ollectHISDaysBefore銆慔IS缁撴潫閲囬泦鏁版嵁");
+ log.info("銆恈ollectHISDaysBefore銆慔IS缁撴潫閲囬泦鏁版嵁: startTime:{}, endtime:{}",startTime, endTime);
} catch (Exception e) {
log.error("銆恈ollectHISDaysBefore銆慔IS鏁版嵁閲囬泦寮傚父", e);
}
@@ -1710,7 +1886,9 @@
}
try {
String config = configService.selectConfigByKey("visit.early.day");
- iPatMedInhospService.dealOutHospInfoBySchedule(config);
+ // 鈿狅笍 2025 淇锛堝紑鍏冲け鏁堬級锛氬師璧� smartor 閬楃暀瀹炵幇锛屼笉鍒ゅ紑鍏筹紙鍚� dealOutHospInfo锛夈��
+ // 鐜拌蛋妯″潡闂ㄩ潰锛屼笌 RyTask#dealOutHospInfo 涓�鑷淬��
+ inhospVisitFacade.dealOutHospInfoBySchedule(config);
log.info("銆恉ealTaskGroupOutHosp銆戜换鍔$粍棣栬疆绾冲叆鎵弿瀹屾垚");
} catch (Exception e) {
log.error("銆恉ealTaskGroupOutHosp銆戜换鍔$粍鎵弿寮傚父", e);
@@ -1728,7 +1906,18 @@
public void rollTaskGroupCycle() {
log.info("銆恟ollTaskGroupCycle銆戝紑濮嬫壂鎻忓惊鐜换鍔$粍");
try {
- int rolled = serviceTaskScheduleService.rollCycleTasks();
+ // 鈿狅笍 2025 淇锛堝紑鍏冲け鏁堬級锛氬師璧� smartor 鐨� ServiceTaskScheduleServiceImpl.rollCycleTasks()锛�
+ // 涓嶅垽寮�鍏� 鈥斺�� 鍏虫帀 inhospvisit.enabled 鐓ф牱銆屾帹杩涜疆娆� + 鏂板缓 subtask銆嶃��
+ //
+ // 鐜拌蛋妯″潡闂ㄩ潰锛屽畬鎴愭ā鍧楀寲鏂规閲岀 10 姝ヤ竴鐩存病鍋氱殑閭d竴姝ュ垏鎹細
+ // InhospVisitFacade#rollTaskGroupCycle锛堝垽寮�鍏筹級
+ // 鈫� DefaultInhospVisitApi#rollTaskGroupCycle
+ // 鈫� TaskGroupCycleRoller#rollCycleTasks锛堥�愯鎼嚜鍘� L170-190锛�
+ // 鈫� ScheduleRollPortBridge锛坰martor 渚х鍙e疄鐜帮紝116 瀛楁娣辨嫹璐濈瓑鐣欏湪瀹炵幇渚э級
+ // 璇ョ被鐨勬敞閲婃槑纭啓浜嗐�岀 10 姝ュ垏杩囨潵涔嬪墠涓嶈兘琚寕鍒颁换浣曡皟搴︿笂锛屽惁鍒欏弻璺戙�嶁�斺��
+ // 鏈灏辨槸閭d釜鍒囨崲鐐癸紝鍒囧畬鑰佺殑 rollCycleTasks 鍗抽��褰癸紙鍏ㄤ粨鍙湁鏈柟娉曡皟瀹冿級銆�
+ int rolled = inhospVisitFacade.rollTaskGroupCycle();
+ // 闂ㄩ潰鍐呴儴鐨� TaskGroupCycleRoller 宸叉墦銆屾湰娆℃帹杩� N 涓鍒掋�嶏紝杩欓噷鍙ˉ涓�鍙ユ�昏
log.info("銆恟ollTaskGroupCycle銆戞湰娆℃帹杩� {} 涓鍒�", rolled);
} catch (Exception e) {
log.error("銆恟ollTaskGroupCycle銆戞粴鍔ㄨ皟搴﹀紓甯�", e);
@@ -1765,4 +1954,89 @@
// 鍑洪櫌(鍙戦��)鏃堕棿 + 鏈琛ュ伩鏃堕棿 灏忎簬褰撳墠鏃堕棿 -> 瓒呮椂
return deadline.getTime() < new Date().getTime();
}
+
+ /**
+ * 澶勭悊瓒呮椂闅忚浠诲姟锛堥殢璁胯秴鏃� 鈫� 鐢熸垚"鍐嶆闅忚"锛�
+ * <p>
+ * 鈿狅笍 2025 淇锛堝紑鍏冲け鏁堬級锛氭湰鏂规硶鍘熶笉鍒や换浣曟ā鍧楀紑鍏� 鈥斺��
+ * 鍏虫帀 {@code inhospvisit.enabled} 鐓ф牱寤�"鍐嶆闅忚"瀛愪换鍔°��
+ * <p>
+ * <b>涓轰粈涔堣繖閲屾槸"鍏ュ彛鍒ゅ紑鍏�"鑰屼笉鏄儚 {@link #dealOutHospInfo()} 閭f牱鍒囧埌闂ㄩ潰</b>锛�
+ * 妯″潡渚у彧鎻愪緵浜� {@code InhospVisitApi#buildAgainVisitDraft}锛堢粍瑁呰崏绋匡級锛�
+ * <b>娌℃湁</b>瀹屾暣鐨�"鎵弿瓒呮椂 鈫� 钀藉簱 鈫� 鍥炲啓鍘熶换鍔$姸鎬�"鍏ュ彛锛�
+ * 鑰屾湰鏂规硶鑷繁缁勮骞� insert锛堣涓嬫柟 {@code insertServiceSubtask}锛夈��
+ * 閫犱竴涓ā鍧楀叆鍙e睘浜庢柊澧炶兘鍔涖�佽秴鍑�"鍙В鍐冲紑鍏�"鐨勮寖鍥达紝鎵�浠ュ彇鏈�灏忔敼鍔細鍏ュ彛瀹堝崼銆�
+ * <p>
+ * 鈿狅笍 鍏ㄤ粨鍙湁 {@code ServiceSubtaskController#dealSubtaskDeadline} 涓�涓皟鐢ㄨ�呫��
+ */
+ public void dealSubtaskDeadline(String orgid, Integer deadlineDay){
+ // 鈿狅笍 寮�鍏冲畧鍗細鍏堝垽鍐嶅共娲伙紝涓� dealOutHospInfo / rollTaskGroupCycle 鍚屽彛寰勩��
+ // 鍏抽棴鏃剁洿鎺ヨ繑鍥烇紝涓嶆壂鎻忋�佷笉寤�"鍐嶆闅忚"瀛愪换鍔°��
+ if (!inhospVisitFacade.isEnabled()) {
+ log.warn("銆恉ealSubtaskDeadline銆戞ā鍧楁湭鍚敤锛堝弬鏁伴厤缃� inhospvisit.enabled=false锛夛紝璺宠繃瓒呮椂闅忚澶勭悊銆俹rgid={}", orgid);
+ return;
+ }
+ //鑾峰彇浠诲姟淇℃伅
+ ServiceTask st = new ServiceTask();
+ st.setDelFlag("0");
+ st.setLongTask(1);
+ st.setNexttaskflag("1");
+ st.setOrgid(orgid);
+ List<ServiceTask> serviceTasks = serviceTaskMapper.selectServiceTaskList(st);
+ for (ServiceTask serviceTask : serviceTasks) {
+ deadlineDay = -deadlineDay;
+ Date deadline = DateUtils.addDays(new Date(), deadlineDay);
+ //閫氳繃浠诲姟ID鎷垮埌鎮h�呬俊鎭�,骞朵笖闅忚鏃堕棿寰楁槸浠婂ぉ涔嬪墠鐨�
+ ServiceSubtaskEntity serviceSubtaskVO = new ServiceSubtaskEntity();
+ serviceSubtaskVO.setOrgid(orgid);
+ serviceSubtaskVO.setSendstate(7L);
+ //鍙壂鎻忛娆¢殢璁跨殑
+ serviceSubtaskVO.setVisitCount(1);
+ serviceSubtaskVO.setTaskid(serviceTask.getTaskid());
+ serviceSubtaskVO.setEndOutHospTime(deadline);
+ List<ServiceSubtask> serviceSubtaskList
+ = serviceSubtaskMapper.selectServiceSubtaskList(serviceSubtaskVO);
+ log.info("銆恉ealSubtaskDeadline銆戣幏鍙栧埌{}涓秴鏃朵换鍔�, taskid={}", serviceSubtaskList.size(), serviceTask.getTaskid());
+ for (ServiceSubtask serviceSubtask : serviceSubtaskList) {
+ PatMedInhosp patMedInhospVo = new PatMedInhosp();
+ patMedInhospVo.setOrgid(serviceSubtask.getOrgid());
+ patMedInhospVo.setInhospid(serviceSubtask.getInhospid());
+ patMedInhospVo.setCry(1);
+ List<PatMedInhosp> patMedInhospList = iPatMedInhospService.selectPatMedInhospList(patMedInhospVo);
+ PatMedInhosp patMedInhosp = new PatMedInhosp();
+ if (!patMedInhospList.isEmpty()) {
+ patMedInhosp = patMedInhospList.get(0);
+ }else {
+ continue;
+ }
+ if(ObjectUtils.isEmpty(serviceTask.getNexttaskid())){
+ continue;
+ }
+ ServiceTask nextServiceTask = serviceTaskMapper.selectServiceTaskByTaskid(serviceTask.getNexttaskid());
+ PatArchive patArchive = patArchiveService.selectPatArchiveByPatid(serviceSubtask.getPatid());
+ String config = configService.selectConfigByKey("visit.early.day");
+ Integer type = 1;
+
+ //鏂板鍐嶆闅忚浠诲姟
+ ServiceSubtask serviceSubtaskAgain = iPatMedInhospService.boxedServiceSubtask(nextServiceTask,
+ patMedInhosp, patArchive, config, type);
+ serviceSubtaskAgain.setId(null);
+ serviceSubtaskAgain.setUpid(serviceSubtask.getId().intValue());
+ serviceSubtaskAgain.setVisitCount(serviceSubtask.getVisitCount() + 1);
+ serviceSubtaskAgain.setSendstate(2L);
+ serviceSubtaskAgain.setCreateTime(new Date());
+ serviceSubtaskAgain.setUpdateTime(new Date());
+ serviceSubtaskAgain.setVisitType(serviceSubtask.getVisitType());
+ serviceSubtaskAgain.setVisitDeptCode(serviceSubtask.getVisitDeptCode());
+ serviceSubtaskAgain.setVisitDeptName(serviceSubtask.getVisitDeptName());
+ int i = serviceSubtaskMapper.insertServiceSubtask(serviceSubtaskAgain);
+ if (i == 1) {
+ //鍐嶆闅忚浠诲姟鍒涘缓鎴愬姛鍚庯紝鍘熶换鍔℃敼涓哄け璐ョ姸鎬�
+ serviceSubtask.setSendstate(5L);
+ serviceSubtaskMapper.updateServiceSubtask(serviceSubtask);
+ }
+ }
+ }
+ }
+
}
--
Gitblit v1.9.3