From 33e1839c6214ad72cc5a76ae254ce0bb542e9263 Mon Sep 17 00:00:00 2001
From: liusheng <337615773@qq.com>
Date: 星期六, 10 十月 2026 09:31:11 +0800
Subject: [PATCH] 提交
---
ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/RyTask.java | 490 ++++++++++++++++++++++++++++++++++++++++++++---------
1 files changed, 404 insertions(+), 86 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 6ca2935..5a6cae9 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
@@ -18,6 +18,10 @@
import com.ruoyi.common.utils.*;
import com.ruoyi.common.utils.http.HttpUtils;
import com.ruoyi.common.utils.sms.smsUtils;
+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;
@@ -324,7 +328,7 @@
log.info("銆恠endExceptInfo銆戝彂閫佷汉宸ュ彿锛歿}", dutyDeptPersonCode);
SysUser sysUser = new SysUser();
SysUser sysUserVo = new SysUser();
- sysUserVo.setUserCode(dutyDeptPersonCode);
+ sysUserVo.setUserName(dutyDeptPersonCode);
sysUserVo.setOrgid(serviceSubtaskDetailTrace.getOrgid());
List<SysUser> users = userService.getUserList(sysUserVo);
String phoneNumber = "";
@@ -594,7 +598,12 @@
preAdmitStatus.add("FH0109.53");
reqVO.setStatusList(preAdmitStatus);
log.info("銆恉ealHisData銆戦鍏ラ櫌閲囬泦鏁版嵁鍏ュ弬锛歿}", reqVO);
- serviceSLTDHealthcareRecordService.queryHealthcareRecordList(reqVO);
+ try {
+ serviceSLTDHealthcareRecordService.queryHealthcareRecordList(reqVO);
+ } catch (Exception e) {
+ // 鍗曠被鏁版嵁澶辫触涓嶅啀鍚戜笂鎶涳細鍚﹀垯涓�娈靛け璐ヤ細璁╂湰娆″洖婧悗闈㈢殑鎵�鏈夋閮戒笉鎵ц
+ log.error("銆恉ealHisData銆戦鍏ラ櫌閲囬泦澶辫触锛岃烦杩囪绫荤户缁�傞櫌鍖猴細{}锛屾椂闂存锛歿} ~ {}", cid, startDateStr, endDateStr, e);
+ }
log.info("銆恉ealHisData銆戦鍏ラ櫌绲備簡閲囬泦鏁版嵁锛岄櫌鍖猴細{}", cid);
// 鍏ラ櫌
@@ -608,7 +617,12 @@
admitStatus.add("FH0109.24");
reqVO.setStatusList(admitStatus);
log.info("銆恉ealHisData銆戝叆闄㈤噰闆嗘暟鎹叆鍙傦細{}", reqVO);
- serviceSLTDHealthcareRecordService.queryHealthcareRecordList(reqVO);
+ try {
+ serviceSLTDHealthcareRecordService.queryHealthcareRecordList(reqVO);
+ } catch (Exception e) {
+ // 鍗曠被鏁版嵁澶辫触涓嶅啀鍚戜笂鎶涳細鍚﹀垯涓�娈靛け璐ヤ細璁╂湰娆″洖婧悗闈㈢殑鎵�鏈夋閮戒笉鎵ц
+ log.error("銆恉ealHisData銆戝叆闄㈤噰闆嗗け璐ワ紝璺宠繃璇ョ被缁х画銆傞櫌鍖猴細{}锛屾椂闂存锛歿} ~ {}", cid, startDateStr, endDateStr, e);
+ }
log.info("銆恉ealHisData銆戝叆闄㈢祩浜嗛噰闆嗘暟鎹紝闄㈠尯锛歿}", cid);
// 鍑洪櫌
@@ -625,101 +639,405 @@
dischargeStatus.add("FH0109.25");
reqVO.setStatusList(dischargeStatus);
log.info("銆恉ealHisData銆戝嚭闄㈤噰闆嗘暟鎹叆鍙傦細{}", reqVO);
- serviceSLTDHealthcareRecordService.queryHealthcareRecordList(reqVO);
+ try {
+ serviceSLTDHealthcareRecordService.queryHealthcareRecordList(reqVO);
+ } catch (Exception e) {
+ // 鍗曠被鏁版嵁澶辫触涓嶅啀鍚戜笂鎶涳細鍚﹀垯涓�娈靛け璐ヤ細璁╂湰娆″洖婧悗闈㈢殑鎵�鏈夋閮戒笉鎵ц
+ log.error("銆恉ealHisData銆戝嚭闄㈤噰闆嗗け璐ワ紝璺宠繃璇ョ被缁х画銆傞櫌鍖猴細{}锛屾椂闂存锛歿} ~ {}", cid, startDateStr, endDateStr, e);
+ }
log.info("銆恉ealHisData銆戝嚭闄㈢粨鏉熼噰闆嗘暟鎹紝闄㈠尯锛歿}", cid);
}
/**
- * 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;
}
/**
--
Gitblit v1.9.3