| | |
| | | @AddOrgId(field = "orgid", paramIndex = 0, campusField = "campusid") |
| | | @PostMapping("/tracedeallist") |
| | | public Map<String, Object> tracedeallist(@RequestBody DetailTraceDealVO detailTraceDealVO) { |
| | | // PageUtils.getOffset è¿åçæ¯ offsetï¼SQL éæ limit/offset ä½¿ç¨ |
| | | Integer offset = PageUtils.getOffset(detailTraceDealVO.getPageNum(), detailTraceDealVO.getPageSize()); |
| | | detailTraceDealVO.setPageNum(offset); |
| | | // 䏿¬¡æ¥è¯¢åæ¶è¿ååé¡µæ°æ®ãé®é¢æ»æ°åå
¨éæ±æ» |
| | | // ï¼åæ¥ä¸ºäºæ¿æ»æ°æ method åå
¨éè·äºä¸éï¼N+1 ä¹è·çè·ç¬¬äºéï¼ |
| | | Map<String, Object> result = serviceSubtaskDetailTraceService.tracedeallist(detailTraceDealVO); |
| | | |
| | | // æ¥è¯¢æ»æ°ï¼ä¸åé¡µï¼ |
| | | detailTraceDealVO.setPageNum(null); |
| | | detailTraceDealVO.setPageSize(null); |
| | | Map<String, Object> totalResult = serviceSubtaskDetailTraceService.tracedeallist(detailTraceDealVO); |
| | | List<?> totalRows = (List<?>) totalResult.get("detailTraceDealDTOList"); |
| | | |
| | | //å°æ»æ°ä¿¡æ¯æ·»å å°ç»æä¸ |
| | | result.put("totalException", totalResult.get("totalException")); |
| | | result.put("noDealException", totalResult.get("noDealException")); |
| | | result.put("yesDealException", totalResult.get("yesDealException")); |
| | | |
| | | return getDataTable3(CollectionUtils.isNotEmpty(totalRows) ? totalRows.size() : 0, result); |
| | | Object questionTotal = result.get("questionTotal"); |
| | | long total = questionTotal == null ? 0L : Long.parseLong(String.valueOf(questionTotal)); |
| | | return getDataTable3(total, result); |
| | | } |
| | | |
| | | /** |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package com.ruoyi.quartz.enums; |
| | | |
| | | /** |
| | | * çç«å德鍿¥è¯ééåæ°ï¼sys_configï¼æºæ orgid=20001001ï¼ |
| | | * <p> |
| | | * æé
ç½® keyãé»è®¤å¼ãåå¼èå´ç»å¨ä¸èµ·ï¼è¯»åæ¶åªè¦ä¼ æä¸¾æ¬èº«ï¼ |
| | | * é¿å
key åé»è®¤å¼åæ£å¨ä»»å¡éãæ¹ä¸ä¸ªæ¼ä¸ä¸ª |
| | | * |
| | | * @author smartor |
| | | */ |
| | | public enum MzGatherParamEnum { |
| | | |
| | | /** |
| | | * åè½®ééæ¶é´é¢ç®ï¼åéï¼ |
| | | * å¿
é¡»å°äºè°åº¦é´éï¼ä¿è¯ 30 åéä¸è°æ¶æ¬è½®è½èµ¶å¨ä¸ä¸è½®ä¹åç»æ |
| | | */ |
| | | BUDGET_MINUTES("sltd.gather.mz.budget.minutes", 20L, 1L, 24L * 60L), |
| | | |
| | | /** å页æ¯é¡µæ¡æ° */ |
| | | PAGE_SIZE("sltd.gather.mz.page.size", 500L, 1L, 5000L), |
| | | |
| | | /** 忥æå¤ç¿»é¡µæ°ï¼é²æ¢æ¥å£å¼å¸¸ä¸ç´è¿åæ»¡é¡µå¯¼è´æ»å¾ªç¯ */ |
| | | MAX_PAGE("sltd.gather.mz.max.page", 2000L, 1L, 100000L); |
| | | |
| | | /** sys_config.config_key */ |
| | | private final String key; |
| | | /** é
置缺失æè¶
èå´æ¶ä½¿ç¨çé»è®¤å¼ */ |
| | | private final long defaultValue; |
| | | /** å
许çæå°å¼ï¼å«ï¼ */ |
| | | private final long min; |
| | | /** å
许çæå¤§å¼ï¼å«ï¼ */ |
| | | private final long max; |
| | | |
| | | MzGatherParamEnum(String key, long defaultValue, long min, long max) { |
| | | this.key = key; |
| | | this.defaultValue = defaultValue; |
| | | this.min = min; |
| | | this.max = max; |
| | | } |
| | | |
| | | public String getKey() { |
| | | return key; |
| | | } |
| | | |
| | | public long getDefaultValue() { |
| | | return defaultValue; |
| | | } |
| | | |
| | | public long getMin() { |
| | | return min; |
| | | } |
| | | |
| | | public long getMax() { |
| | | return max; |
| | | } |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package com.ruoyi.quartz.enums; |
| | | |
| | | /** |
| | | * çç«å德鍿¥è¯ééï¼æç¹æ§½ä½ |
| | | * <p> |
| | | * æ¯å¤©ä¸è½®å
¨éå·æ°ï¼åæ¶è¿æ"æ¨å¤©æ¶å°¾"å"æå·¥å溯"ä¸¤ä¸ªè½®æ¬¡ï¼ |
| | | * æ¯è½®åèªå¯è½è¢«é¢ç®ææ¥å£å¤±è´¥ææï¼æä»¥æç¹åæ§½ä½ä¿åï¼äºä¸è¦ç |
| | | * |
| | | * @author smartor |
| | | */ |
| | | public enum MzGatherSlotEnum { |
| | | |
| | | /** ä»å¤©çæ´è½®å·æ° */ |
| | | TODAY("1", "ä»å¤©æ´è½®å·æ°"), |
| | | |
| | | /** æ¨å¤©çæ¶å°¾ééï¼æ¯å¤©åªå䏿¬¡ï¼å
ä½ 23:xx ååå
¥ HIS çè®°å½åè·¨é¶ç¹æ°æ® */ |
| | | FINAL("2", "æ¨æ¥æ¶å°¾éé"), |
| | | |
| | | /** ä»»å¡å
¥åæå®æ¥æç䏿¬¡æ§å溯 */ |
| | | BACKFILL("3", "æå·¥å溯"); |
| | | |
| | | private final String code; |
| | | private final String desc; |
| | | |
| | | MzGatherSlotEnum(String code, String desc) { |
| | | this.code = code; |
| | | this.desc = desc; |
| | | } |
| | | |
| | | public String getCode() { |
| | | return code; |
| | | } |
| | | |
| | | public String getDesc() { |
| | | return desc; |
| | | } |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package com.ruoyi.quartz.enums; |
| | | |
| | | /** |
| | | * çç«å德鍿¥è¯ééï¼åæ¥ééç»æ |
| | | * <p> |
| | | * ç¨äº {@code RyTask#runDayPass} çè¿åå¼ï¼åè¯è°ç¨æ¹è¿ä¸å¤©æ¯éå®äºãé¢ç®ç¨å°½äºï¼è¿æ¯æ¥å£æäº |
| | | * |
| | | * @author smartor |
| | | */ |
| | | public enum MzGatherStatusEnum { |
| | | |
| | | /** è¯¥æ¥æå·²ä»ç¬¬ä¸é¡µéå°æåä¸é¡µï¼æ´è½®å®æ */ |
| | | DONE("0", "éé宿"), |
| | | |
| | | /** æ¬è½®æ¶é´é¢ç®ç¨å°½ï¼é¡µç æç¹å·²ä¿åï¼ä¸ä¸è½®ä»è¯¥é¡µç»§ç» */ |
| | | BUDGET_UP("1", "æ¬è½®é¢ç®ç¨å°½"), |
| | | |
| | | /** æ¥å£å±è¿ç»å¤±è´¥ï¼æ¬è½®æåç»æï¼é¡µç æç¹ä¿çå¨ç¬¬ä¸ä¸ªå¤±è´¥é¡µ */ |
| | | FAILED("2", "æ¥å£è¿ç»å¤±è´¥"); |
| | | |
| | | private final String code; |
| | | private final String desc; |
| | | |
| | | MzGatherStatusEnum(String code, String desc) { |
| | | this.code = code; |
| | | this.desc = desc; |
| | | } |
| | | |
| | | public String getCode() { |
| | | return code; |
| | | } |
| | | |
| | | public String getDesc() { |
| | | return desc; |
| | | } |
| | | } |
| | |
| | | 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; |
| | |
| | | } |
| | | |
| | | /** |
| | | * HISçç«å德鍿¥è¯æ°æ®ééï¼è¿ä¸ªåªè½ä¸å¤©æ§è¡ä¸æ¬¡ï¼ä¸è½åä¸ªå°æ¶æ§è¡ä¸ä¸ªï¼æ°æ®é太大ï¼å½±åæ§è½ï¼ |
| | | * 宿¶ä»»å¡ï¼é¨è¯æ°æ® |
| | | * todayZeroStr å½åçæ¶é´ ä¾å¦ï¼2026-05-06 00:00:00 |
| | | * HISçç«å德鍿¥è¯æ°æ®ééï¼æ¯åå°æ¶ä¸è½®ï¼æå¤©å
¨éå·æ° + å页æç¹ç»éï¼ |
| | | * <p> |
| | | * HIS 侧鍿¥è¯æ°æ®åªè½æå¤©æ¥ï¼æ¯è½®æå°ç齿¯å½å¤©å
¨éï¼å°æä¸ä¸ä¸å¤æ¡ï¼ï¼è¿ä¸ªåæ°ææ¬æ¹ä¸äºï¼ |
| | | * è½æ¹çæ¯å¤çææ¬ï¼å½å¤©æ°æ®éç»å¤§å¤æ°ä¸ä¸è½®å·²ç»å
¥åºï¼é "æ´é¡µæ¹éæ¥é + å·²å
¥åºç´æ¥è·³è¿"ï¼ |
| | | * æ¯è½®çæ£éè¦åæ¡£æ¡å¤çåå
¥åºçåªææ°åºç°çé£å ç¾æ¡ï¼ä¸ä¸å¤æ¡ä¹è½å¨å¾çæ¶é´å
è·å®ã |
| | | * <p> |
| | | * æ¯ä¸è½®åä¸ä»¶äºï¼ |
| | | * <ol> |
| | | * <li>ä»å¤©çæ´è½®å·æ°ï¼ç¬¬ 1 é¡µç¿»å°æåä¸é¡µï¼åªå¤çæ°è®°å½ï¼</li> |
| | | * <li>æ¨å¤©çæ¶å°¾ééï¼æ¯å¤©åªå䏿¬¡ï¼å
ä½ 23:xx ä¹åæåå
¥ HIS çè®°å½åè·¨é¶ç¹çæ°æ®ï¼</li> |
| | | * <li>æå·¥å溯ï¼ä»»å¡å
¥åç»äºæ¥ææ¶ï¼æé£å¤©è¡¥é䏿¬¡ï¼åä¸å¤©åªè¡¥ä¸æ¬¡ï¼ä¸ä¼æ¯è½®éå¤è¡¥ï¼ã</li> |
| | | * </ol> |
| | | * æ¯è½®æå¤è· {@link MzGatherParamEnum#BUDGET_MINUTES}ï¼é»è®¤ 20 åéï¼ï¼å°ç¹ä¿åé¡µç æç¹æ£å¸¸éåºï¼ä¸ä¸è½®ä»è¯¥é¡µç»§ç»ï¼ |
| | | * æ¯éå®ä¸é¡µé½ä¼è½ä¸æ¬¡æç¹ï¼è¿ç¨è¢«æä¹ä¸ä¼ä»å¤´éæ«ã |
| | | * <p> |
| | | * 失败ä¸å¾ä¸é»æééè¿åº¦ï¼ |
| | | * <ul> |
| | | * <li>æ°æ®å±å¤±è´¥ï¼è½¬æ¢/æ¡£æ¡/å
¥åºï¼è½ pat_med_outhosp_error 表交人工å¤çï¼</li> |
| | | * <li>æ¥å£å±å¤±è´¥ï¼ç½ç»è¶
æ¶ãæ¥æªæ¥è¿åé 200ï¼æ²¡ææ°æ®å¯è½è¡¨ï¼åªå error æ¥å¿ï¼å«é¢åºãæ¥æã页ç ãæ¥å£å
¥åï¼ï¼ |
| | | * è·³è¿è¯¥é¡µç»§ç»å¾åéï¼æ¬è½®ç»ææ¶ææç¹çå¨ç¬¬ä¸ä¸ªå¤±è´¥é¡µï¼å 为æ¯è½®é½æ¯æ´å¤©ä»å¤´å
¨éå·æ°ï¼ |
| | | * 被跳è¿ç页ä¸ä¸è½®å¿
ç¶éæ°éå°ï¼ä¸ä¼æ¼ï¼</li> |
| | | * <li>è¿ç» {@link MzGatherConstant#MAX_CONSECUTIVE_PAGE_FAIL} 页æ¥å£å¤±è´¥å¤å®ä¸ºæ¥å£æ´ä½ä¸å¯ç¨ï¼æ¬è½®æåç»æï¼é¿å
空转å å页ï¼ï¼ |
| | | * æç¹çå¨ç¬¬ä¸ä¸ªå¤±è´¥é¡µï¼ä¸ä¸è½®åè¯ã</li> |
| | | * </ul> |
| | | * |
| | | * @param todayZeroStr å¯éï¼æå·¥æå®è¦ä¸æ¬¡æ§åæº¯çæ¥æï¼æ¯æ yyyy-MM-dd HH:mm:ss æ yyyy-MM-ddï¼ä¸ºç©ºæ¶åªå·æ°ä»å¤©+æ¶å°¾æ¨å¤© |
| | | */ |
| | | public void dealHisDataMZ(String todayZeroStr) { |
| | | log.info("ãdealHisDataã鍿¥è¯æ°æ®å¼å§æ§è¡HISæ°æ®ééä»»å¡"); |
| | | // è·åæ¨å¤©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("ãdealHisDataMZã鍿¥è¯æ°æ®ééå¼å§ï¼å
¥åï¼{}", todayZeroStr); |
| | | // ååéä¸çå
ä¸é鍿¥è¯æ°æ® |
| | | if (!"sltd".equals(active.trim())) { |
| | | log.info("ãdealHisDataMZãå½åç¯å¢ {} ä¸éé鍿¥è¯æ°æ®ï¼è·³è¿", 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("ãdealHisDataMZãSysConfigä¸çé¢åº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("ãdealHisDataMZãé¢åºï¼{}ï¼åè½®é¢ç®ï¼{}åéï¼æ¯é¡µï¼{}æ¡", campusidList, budgetMinutes, pageSize); |
| | | |
| | | for (Long cid : campusidList) { |
| | | if (LocalDateTime.now().isAfter(deadline)) { |
| | | log.warn("ãdealHisDataMZãæ¬è½®æ¶é´é¢ç®å·²ç¨å°½ï¼å©ä½é¢åºçå°ä¸ä¸è½®ç»§ç»ï¼é¢åºï¼{}", cid); |
| | | break; |
| | | } |
| | | // 鲿¢ä¸ä¸è½®è¿æ²¡è·å®å°±è¢«ä¸ä¸è½®å çè·ï¼é¢ç®é
ç½®è¿å¤§ãææå·¥è§¦åæ¶å
åºï¼ |
| | | String lockKey = "mzRunning:" + cid; |
| | | if (Boolean.TRUE.equals(redisCache.hasKey(lockKey))) { |
| | | log.warn("ãdealHisDataMZã该é¢åºä¸ä¸è½®ééå°æªç»æï¼æ¬è½®è·³è¿ï¼é¢åºï¼{}ï¼æç¹å·²ä¿çï¼ä¸ä¸è½®ç»§ç»ï¼", 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("ãdealHisDataãçç«åå¾·â鍿¥è¯âå¼å§å页ééæ°æ®ï¼é¢åºï¼{}", 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; |
| | | //é£è¾¹ææ¶åªè½è®¾ç½®40 |
| | | final long OUTP_PAGE_SIZE = 500L; |
| | | while (true) { |
| | | serviceSLTDInhospReqVO.setCurrent(outpPage); |
| | | serviceSLTDInhospReqVO.setSize(OUTP_PAGE_SIZE); |
| | | log.info("ãdealHisDataãçç«åå¾·â鍿¥è¯âéé第{}é¡µæ°æ®ï¼é¢åºï¼{}", outpPage, cid); |
| | | List<ServiceSLTDInhospResDTO> outpResult = serviceSLTDHealthcareRecordService.queryHealthcareRecordList(serviceSLTDInhospReqVO); |
| | | if (CollectionUtils.isEmpty(outpResult)) { |
| | | log.info("ãdealHisDataãçç«åå¾·â鍿¥è¯â第{}é¡µæ æ°æ®ï¼ééç»æï¼é¢åºï¼{}", outpPage, cid); |
| | | break; |
| | | } |
| | | log.info("ãdealHisDataãçç«åå¾·â鍿¥è¯â第{}页éé{}æ¡ï¼é¢åºï¼{}", outpPage, outpResult.size(), cid); |
| | | if (outpResult.size() < OUTP_PAGE_SIZE) { |
| | | //设置ä¸ä¸ªç¼åï¼ç¨æ¥åå¨ä¸æ¬¡çèµ·å§é¡µ |
| | | redisCache.setCacheObject("mzCurrent" + cid + mzCacheDate, outpPage, 24, TimeUnit.HOURS); |
| | | log.info("ãdealHisDataãçç«åå¾·â鍿¥è¯âçç¼åkey:{}䏿¬¡çèµ·å§é¡µ{}ï¼é¢åºï¼{}", "mzCurrent" + cid + mzCacheDate, outpPage, cid); |
| | | break; |
| | | } |
| | | outpPage++; |
| | | } |
| | | // æ¸
é¤å页忰ï¼é¿å
å½±ååç»åºå
¥é¢æ¥è¯¢ |
| | | serviceSLTDInhospReqVO.setCurrent(null); |
| | | serviceSLTDInhospReqVO.setSize(null); |
| | | log.info("ãdealHisDataãçç«åå¾·â鍿¥è¯âå页éé宿ï¼é¢åºï¼{}", cid); |
| | | } |
| | | } |
| | | collectOutpatientDaily(cid, todayZeroStr, pageSize, maxPage, deadline); |
| | | } catch (Exception e) { |
| | | log.error("ãdealHisDataãçç«åå¾·æ°æ®é¨æ¥è¯ééå¼å¸¸", e); |
| | | log.error("ãdealHisDataMZã鍿¥è¯ééå¼å¸¸ï¼é¢åºï¼{}ï¼æç¹å·²ä¿çï¼ä¸ä¸è½®ä»æç¹ç»§ç»", cid, e); |
| | | } finally { |
| | | redisCache.deleteObject(lockKey); |
| | | } |
| | | } |
| | | log.info("ãdealHisDataMZã鍿¥è¯ééæ¬è½®ç»æï¼èæ¶ï¼{}ç§", |
| | | 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("ãdealHisDataMZãå
¥åæ¥æ {} å·²å®æåæº¯ï¼è·³è¿ï¼é¢åºï¼{}", 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("ãdealHisDataMZãå¾
åæº¯æ¥æï¼{}ï¼é¢åºï¼{}", 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("ãdealHisDataMZãåæº¯æ¥æ {} æ¬è½®æªå®æï¼{}ï¼ï¼æç¹å·²ä¿çï¼é¢åºï¼{}", 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("ãdealHisDataMZãæ¨æ¥æ¶å°¾éé {} æ¬è½®æªå®æï¼{}ï¼ï¼æç¹å·²ä¿çï¼é¢åºï¼{}", 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("ãdealHisDataMZã{} 鍿¥è¯æ´è½®å·æ°å®æï¼é¢åºï¼{}", 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("ãdealHisDataMZãæ¬è½®æ¶é´é¢ç®ç¨å°½ï¼{} æ¬è½®å·²é{}页{}æ¡{}ï¼ä¸æ¬¡ä»ç¬¬{}页继ç»ï¼é¢åºï¼{}", |
| | | day, pageCount, total, skippedLog(skippedPages), resumePage, cid); |
| | | return MzGatherStatusEnum.BUDGET_UP; |
| | | } |
| | | reqVO.setCurrent(page); |
| | | log.info("ãdealHisDataMZãéé鍿¥è¯æ°æ®ï¼é¢åºï¼{}ï¼æ¥æï¼{}ï¼ç¬¬{}页", 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("ãdealHisDataMZã鍿¥è¯ç¬¬{}页第{}次éé失败ï¼é¢åºï¼{}ï¼æ¥æï¼{}", 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("ãdealHisDataMZãæ¥å£å±éé失败ï¼å·²è®° error æ¥å¿å¹¶è·³è¿è¯¥é¡µï¼æ¬è½®ç»§ç»å¾åéï¼" |
| | | + "é¢åºï¼{}ï¼æ¥æï¼{}ï¼ç¬¬{}é¡µï¼æ¥å£å
¥åï¼{}ï¼å¼å¸¸ï¼{}", |
| | | cid, day, page, new Gson().toJson(reqVO), lastError.getMessage(), lastError); |
| | | if (consecutiveFail >= MzGatherConstant.MAX_CONSECUTIVE_PAGE_FAIL) { |
| | | // è¿ç»å¤é¡µæ¥å£å¤±è´¥ï¼å¤å®æ¥æªæ¥æ¥å£æ´ä½ä¸å¯ç¨ï¼æ¬è½®æåç»æï¼ä¸å空转åé¢å å页ï¼ï¼æç¹çå¨ç¬¬ä¸ä¸ªå¤±è´¥é¡µ |
| | | log.error("ãdealHisDataMZãè¿ç»{}页æ¥å£å¤±è´¥ï¼å¤å®æ¥æªæ¥æ¥å£ä¸å¯ç¨ï¼æ¬è½®æåç»æï¼é¢åºï¼{}ï¼æ¥æï¼{}ï¼æç¹ä¿çå¨ç¬¬{}页", |
| | | consecutiveFail, cid, day, firstFailPage); |
| | | saveMzDayPage(cursorKey, cursor, slot, firstFailPage); |
| | | return MzGatherStatusEnum.FAILED; |
| | | } |
| | | page++; |
| | | continue; |
| | | } |
| | | consecutiveFail = 0; |
| | | |
| | | if (CollectionUtils.isEmpty(pageData)) { |
| | | log.info("ãdealHisDataMZã{} 第{}é¡µæ æ°æ®ï¼ééç»æï¼é¢åºï¼{}ï¼æ¬è½®{}页å
±{}æ¡{}", |
| | | day, page, cid, pageCount, total, skippedLog(skippedPages)); |
| | | return MzGatherStatusEnum.DONE; |
| | | } |
| | | pageCount++; |
| | | total += pageData.size(); |
| | | log.info("ãdealHisDataMZã{} 第{}页éé{}æ¡ï¼é¢åºï¼{}", day, page, pageData.size(), cid); |
| | | if (pageData.size() < pageSize) { |
| | | log.info("ãdealHisDataMZã{} ééç»æï¼é¢åºï¼{}ï¼æ¬è½®{}页å
±{}æ¡{}", day, cid, pageCount, total, skippedLog(skippedPages)); |
| | | return MzGatherStatusEnum.DONE; |
| | | } |
| | | page++; |
| | | if (page > maxPage) { |
| | | log.error("ãdealHisDataMZã{} 已翻å°ç¬¬{}页ï¼è¶
è¿åæ¥ä¸é{}é¡µï¼æéå®å¤çï¼é¢åºï¼{}", 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); |
| | | } |
| | | |
| | | /** æ¥å¿éæç¤ºæ¥å£å±å¤±è´¥è·³è¿äºå 页ï¼ä¸ä¸è½®æ´è½®å·æ°ä¼éæ°éå°ï¼ */ |
| | | private String skippedLog(long skippedPages) { |
| | | return skippedPages > 0L ? "ï¼æ¥å£å¤±è´¥è·³è¿" + 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("ãdealHisDataMZãé
ç½®{}çå¼{}è¶
åºèå´[{},{}]ï¼ä½¿ç¨é»è®¤å¼{}", |
| | | param.getKey(), value, param.getMin(), param.getMax(), param.getDefaultValue()); |
| | | } |
| | | } catch (Exception e) { |
| | | log.warn("ãdealHisDataMZã读åé
ç½®{}失败ï¼ä½¿ç¨é»è®¤å¼{}", param.getKey(), param.getDefaultValue(), e); |
| | | } |
| | | return param.getDefaultValue(); |
| | | } |
| | | |
| | | /** è§£æä»»å¡å
¥åï¼è¦ä¸æ¬¡æ§åæº¯çæ¥æï¼ï¼æ¯æ 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("ãdealHisDataMZãå
¥å {} æ æ³è§£æä¸ºæ¥æï¼ææªæå®å¤ç", text); |
| | | } |
| | | return time; |
| | | } |
| | | |
| | | /** éé»è§£ææ¥æï¼æ¯æ 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("ãdealHisDataMZã读åæç¹{}å¤±è´¥ï¼æç©ºæç¹å¤ç", 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; |
| | | } |
| | | |
| | | /** |
| | |
| | | @Excel(name = "é®é¢ID") |
| | | private Long scriptid; |
| | | |
| | | |
| | | /** |
| | | * é®é¢ID |
| | | */ |
| | | @ApiModelProperty("é®é¢IDéå") |
| | | @Excel(name = "é®é¢IDéå") |
| | | private List<Long> scriptids; |
| | | |
| | | /** |
| | | * 模æ¿ç±»åï¼1.è¯é³ 2.é®å· |
| | |
| | | @ApiModelProperty(value = "åºé¢æ¶é´-ç»ææ¶é´ yyyy-MM-dd") |
| | | private String preOutHospitalTailDate; |
| | | |
| | | @ApiModelProperty(value = "å°±è¯æ¶é´-å¼å§æ¶é´ : é¨è¯è¯çè®°å½ä¸ºå·æºæ¶é´ ä½é¢è¯çè®°å½ä¸ºå
¥é¢ç»è®°æ¶é´ yyyy-MM-dd") |
| | | @ApiModelProperty(value = "å°±è¯æ¶é´-å¼å§æ¶é´ : é¨è¯è¯çè®°å½ä¸ºå·æºæ¶é´ ä½é¢è¯çè®°å½ä¸ºå
¥é¢ç»è®°æ¶é´ yyyy-MM-dd æ yyyy-MM-dd HH:mm:ssï¼é¨æ¥è¯å¢ééé精确å°ç§ï¼") |
| | | private String encounterTimeStart; |
| | | |
| | | @ApiModelProperty(value = "å°±è¯æ¶é´-ç»ææ¶é´ yyyy-MM-dd") |
| | | @ApiModelProperty(value = "å°±è¯æ¶é´-ç»ææ¶é´ yyyy-MM-dd æ yyyy-MM-dd HH:mm:ssï¼é¨æ¥è¯å¢ééé精确å°ç§ï¼") |
| | | private String encounterTimeEnd; |
| | | |
| | | @ApiModelProperty(value = "åºé¢ç»ç®æ¶é´-å¼å§æ¶é´ yyyy-MM-dd") |
| | |
| | | @ApiModelProperty(value = "å»é¢æºæid") |
| | | private Integer seqno; |
| | | |
| | | /** |
| | | * é®é¢ç±»åï¼ä¾å¦,é¨è¯æ»¡æåº¦ï¼mzmyd ä½é¢æ»¡æåº¦ï¼zymyd ...ï¼ |
| | | */ |
| | | @Excel(name = "é®é¢ç±»åï¼ä¾å¦,é¨è¯æ»¡æåº¦ï¼mzmyd ä½é¢æ»¡æåº¦ï¼zymyd ...ï¼") |
| | | @ApiModelProperty("é®é¢ç±»åï¼ä¾å¦,é¨è¯æ»¡æåº¦ï¼mzmyd ä½é¢æ»¡æåº¦ï¼zymyd ...ï¼") |
| | | private String type; |
| | | |
| | | } |
| | |
| | | package com.smartor.mapper; |
| | | |
| | | import java.util.Collection; |
| | | import java.util.List; |
| | | import java.util.Map; |
| | | |
| | |
| | | // æ¥è¯¢ææ pat_med_outhosp å¼å¤´ç表å |
| | | List<String> getAllOuthospTableNames(); |
| | | |
| | | /** |
| | | * æ¹éæ¥è¯¢æå®å表ä¸å·²åå¨ç serialnumï¼ä¸æ¬¡ SQL 代æ¿éæ¡ countBySerialnumï¼ |
| | | * |
| | | * @param tableName å表å |
| | | * @param serialnums å¾
æ¥è¯¢çè¯çè®°å½å· |
| | | * @return å·²åå¨ç serialnum éå |
| | | */ |
| | | List<String> selectExistingSerialnums(@Param("tableName") String tableName, @Param("serialnums") Collection<String> serialnums); |
| | | |
| | | // æ¥è¯¢æå®è¡¨çåæ®µåè¡¨ï¼æ ordinal_position æåºï¼ |
| | | List<String> getTableColumns(@Param("tableName") String tableName); |
| | | |
| | |
| | | */ |
| | | public List<Map<String, Object>> selectSatisfactionFillStatByMatchedtext(SatisfactionStatQuery query); |
| | | |
| | | /** |
| | | * 满æåº¦æ±ç¶å¾ï¼ä¸æ¬¡æ§ç»è®¡æ¬æ¬¡è¯·æ±å
¨é¨æ¨¡æ¿çãåæ¶äººæ°ã |
| | | * ï¼æ libtemplateid åç»ï¼count(distinct sub_id)ï¼åä¸ä¸ªäººçäºå¤éé¢åªç®ä¸äººï¼ |
| | | * <p> |
| | | * satisfactionGraph / satisfactionGraphDimension çåæ¶äººæ°å¿
é¡»æ¯äººæ°å£å¾ï¼ |
| | | * ä¸è½å selectSatisfactionFillStat 飿 ·æé¢ç®æ±æ»çæ¡è¡æ°ï¼é£æ¯é¢éå£å¾ï¼ |
| | | * |
| | | * @param query èåæ¥è¯¢æ¡ä»¶ |
| | | * @return æ¯è¡å« libtemplateidãcntï¼è¯¥æ¨¡æ¿å·²åæ¶ç份æ°/人æ°ï¼ |
| | | */ |
| | | public List<Map<String, Object>> selectSatisfactionFillPersonCount(SatisfactionStatQuery query); |
| | | |
| | | /** |
| | | * æ scriptid æ¹éç»è®¡å¡«åè®°å½æ°ï¼ä¸æ¬¡ SQL æ¿ä»£é个 scriptid æ¥æç»ï¼ |
| | | * <p> |
| | | * å£å¾ä¸åæ¥ãquery.setScriptid(scriptId) å selectServiceSubtaskDetailList(...).size()ãä¸è´ï¼ |
| | | * åªæ scriptid è¿æ»¤ï¼ä¸å¸¦ del_flagï¼å SQL é并没æ del_flag æ¡ä»¶ï¼ã |
| | | * |
| | | * @param scriptIds é®é¢IDéå |
| | | * @return æ¯è¡å« scriptidãcnt |
| | | */ |
| | | public List<Map<String, Object>> countDetailByScriptIds(@Param("scriptIds") List<Long> scriptIds); |
| | | |
| | | public ServiceSubtaskDetailDTO isExistServiceSubtaskDetail(@Param("subid") Long subid, @Param("scriptid") Long scriptid); |
| | | |
| | | /** |
| | |
| | | package com.smartor.mapper; |
| | | |
| | | import java.util.List; |
| | | import java.util.Map; |
| | | |
| | | import com.smartor.domain.VO.DetailTraceDealVO; |
| | | import com.smartor.domain.VO.ServiceSubtaskDetailTraceVO; |
| | | import org.apache.ibatis.annotations.Mapper; |
| | | import org.apache.ibatis.annotations.Param; |
| | | import com.smartor.domain.ServiceSubtaskDetailTrace; |
| | | |
| | | /** |
| | |
| | | public List<ServiceSubtaskDetailTrace> selectServiceSubtaskDetailTtraceList(ServiceSubtaskDetailTraceVO ServiceSubtaskDetailTtrace); |
| | | |
| | | |
| | | public List<ServiceSubtaskDetailTrace> tracedeallist(DetailTraceDealVO detailTraceDealVO); |
| | | /** |
| | | * å¼å¸¸é®é¢å¤çæ
嵿¥è¯¢ï¼å½å页çé®é¢åç»èåï¼ä¸ä¸ª SQL æ¿å°æ¬é¡µæ¯ä¸ªé®é¢çå¼å¸¸æ°ãå·²å¤ç/æªå¤çæ°ï¼ |
| | | * <p> |
| | | * å页æãé®é¢ãç»´åº¦ä¸æ¨ï¼ä¸åææ´è¡¨ trace æç»æå Java ååç» |
| | | * |
| | | * @param vo æ¥è¯¢æ¡ä»¶ï¼pageNum 为 offsetï¼ä¸ PageUtils.getOffset ä¸è´ï¼ |
| | | * @return æ¯è¡å« questiontextãscriptidãtemplateTypeãexceptionFillNumãyesDealãnoDeal |
| | | */ |
| | | public List<Map<String, Object>> selectTraceDealGroups(@Param("vo") DetailTraceDealVO vo); |
| | | |
| | | /** |
| | | * å¼å¸¸é®é¢å¤çæ
嵿¥è¯¢ï¼é®é¢æ»æ°ï¼å页 totalï¼æ questiontext å»éï¼ |
| | | */ |
| | | public long countTraceDealQuestions(@Param("vo") DetailTraceDealVO vo); |
| | | |
| | | /** |
| | | * å¼å¸¸é®é¢å¤çæ
嵿¥è¯¢ï¼å
¨éæ±æ»ï¼ä¸åå页影åï¼ |
| | | * |
| | | * @return totalException å¼å¸¸æ»æ°ãyesDeal å·²å¤çæ° |
| | | */ |
| | | public Map<String, Object> sumTraceDeal(@Param("vo") DetailTraceDealVO vo); |
| | | |
| | | /** |
| | | * å¼å¸¸é®é¢å¤çæ
嵿¥è¯¢ï¼å½å页é®é¢çè´è´£ç§å®¤ï¼æ todeptcode å»éï¼ |
| | | */ |
| | | public List<Map<String, Object>> selectTraceDealDepts(@Param("vo") DetailTraceDealVO vo, |
| | | @Param("questiontexts") List<String> questiontexts); |
| | | |
| | | /** |
| | | * å¼å¸¸é®é¢å¤çæ
嵿¥è¯¢ï¼å½å页é®é¢çææ°å¤ç人åå¤çæ¶é´ï¼handle_time æå¤§ç䏿¡ï¼ |
| | | */ |
| | | public List<Map<String, Object>> selectTraceDealLatestHandle(@Param("vo") DetailTraceDealVO vo, |
| | | @Param("questiontexts") List<String> questiontexts); |
| | | |
| | | /** |
| | | * æ°å¢é访任å¡å¼å¸¸è®°å½è·è¸ª |
| | |
| | | package com.smartor.service; |
| | | |
| | | import java.util.Collection; |
| | | import java.util.Date; |
| | | import java.util.List; |
| | | import java.util.Set; |
| | | |
| | | import com.ruoyi.common.core.page.TableDataInfo; |
| | | import com.smartor.domain.*; |
| | |
| | | public int insertPatMedOuthosp(PatMedOuthosp patMedOuthosp); |
| | | |
| | | /** |
| | | * æ¹éæ¥è¯¢å·²å
¥åºç serialnumï¼å
é¨æå°±è¯æ¥æå®ä½å表ï¼ä¸æ¬¡ SQL å®æï¼ |
| | | * <p> |
| | | * 鍿¥è¯æå¤©å
¨éééæ¶ï¼æ¯åå°æ¶ä¼æå½å¤©ä¸ä¸ä¸ªè¯çè®°å½éæ°æä¸éï¼ |
| | | * ç¨è¿ä¸ªæ¹æ³ä¸æ¬¡æ¥åºå·²ç»å
¥åºçï¼ç´æ¥è·³è¿ï¼é¿å
对é夿°æ®ååä¸éæ¡£æ¡å¤çåå
¥åº |
| | | * |
| | | * @param admitDateStr å°±è¯æ¥æ yyyy-MM-ddï¼ä¸ºç©ºæè§£æå¤±è´¥æ¶æä¸»è¡¨æ¥è¯¢ |
| | | * @param serialnums å¾
æ¥è¯¢çè¯çè®°å½å·éå |
| | | * @return å·²åå¨ç serialnum éå |
| | | */ |
| | | public Set<String> selectExistingSerialnums(String admitDateStr, Collection<String> serialnums); |
| | | |
| | | /** |
| | | * ä¿®æ¹æ£è
é¨è¯è®°å½ |
| | | * |
| | | * @param patMedOuthosp æ£è
é¨è¯è®°å½ |
| | |
| | | patMedOuthosp.setUpdateTime(DateUtils.getNowDate()); |
| | | patMedOuthosp.setGuid(UUID.randomUUID().toString()); |
| | | log.info("[insert] è·¯ç±å°å表: {}", targetTable); |
| | | return patMedOuthospMapper.insertIntoTable(targetTable, patMedOuthosp); |
| | | try { |
| | | return patMedOuthospMapper.insertIntoTable(targetTable, patMedOuthosp); |
| | | } catch (org.springframework.dao.DuplicateKeyException e) { |
| | | // å äº serialnum å¯ä¸ç´¢å¼åï¼æç«¯å¹¶åæéå¤ééä¼è¢«æ°æ®åºç´æ¥æ¦ä¸ï¼ |
| | | // è¿å±äº"è®°å½å·²åå¨"ï¼ææ£å¸¸è·³è¿å¤çï¼è¿å0ï¼ï¼ä¸è¦å½æå
¥åºå¤±è´¥åè¿é误表 |
| | | log.info("[insert] serialnum={} å·²åå¨äºè¡¨ {}ï¼å¯ä¸ç´¢å¼æ¦æªï¼ï¼è·³è¿æå
¥", patMedOuthosp.getSerialnum(), targetTable); |
| | | return 0; |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * æ¹éæ¥è¯¢å·²å
¥åºç serialnumï¼æå°±è¯æ¥æå®ä½å表ï¼ä¸æ¬¡ IN æ¥è¯¢æ¥åºæ´é¡µå·²åå¨çè®°å½ |
| | | * <p> |
| | | * åæ¥æ¯æ¡è®°å½é½è¦ countBySerialnum 䏿¬¡ï¼ä¸é¡µ 500 æ¡å°±æ¯ 500 次 SQLï¼ |
| | | * 鍿¥è¯æå¤©å
¨éééæ¶æ¯å¤©è¦è¿ä¹è· 48 è½®ï¼è¿éåå¹¶æ 1 次æ¥è¯¢ |
| | | */ |
| | | @Override |
| | | public Set<String> selectExistingSerialnums(String admitDateStr, Collection<String> serialnums) { |
| | | Set<String> existing = new HashSet<>(); |
| | | if (CollectionUtils.isEmpty(serialnums)) { |
| | | return existing; |
| | | } |
| | | Date admitDate = null; |
| | | if (StringUtils.isNotBlank(admitDateStr)) { |
| | | try { |
| | | admitDate = new java.text.SimpleDateFormat("yyyy-MM-dd").parse(admitDateStr); |
| | | } catch (java.text.ParseException e) { |
| | | log.warn("[selectExistingSerialnums] å°±è¯æ¥æè§£æå¤±è´¥ï¼{}ï¼æä¸»è¡¨æ¥è¯¢", admitDateStr); |
| | | } |
| | | } |
| | | // 䏿å
¥æ¶çè·¯ç±è§åä¿æä¸è´ï¼ä¿è¯æ¥éæ¥çå°±æ¯è¦åå
¥çé£å¼ 表 |
| | | String targetTable = admitDate == null ? null : resolveTargetTable(admitDate); |
| | | if (targetTable == null) { |
| | | targetTable = "pat_med_outhosp"; |
| | | } |
| | | List<String> existed = patMedOuthospMapper.selectExistingSerialnums(targetTable, serialnums); |
| | | if (!CollectionUtils.isEmpty(existed)) { |
| | | existing.addAll(existed); |
| | | } |
| | | log.info("[selectExistingSerialnums] æ¥æ={}ï¼å表={}ï¼å¾
æ¥{}æ¡ï¼å·²åå¨{}æ¡", |
| | | admitDateStr, targetTable, serialnums.size(), existing.size()); |
| | | return existing; |
| | | } |
| | | |
| | | /** |
| | |
| | | //2 åè·å该é®é¢æ»¡æåº¦åç±»ä¸çIvrLibaTemplateScriptçéå |
| | | List<IvrLibaTemplateScript> ivrLibaTemplateScripts = ivrLibaTemplateScriptMapper.queryLibTemplateIds(mydIdList); |
| | | |
| | | //2.1 䏿¬¡æ§ææ¬æ¬¡è¯·æ±å
¨é¨æ¨¡æ¿çåééãå¡«æ¥éæ¥åæ¥ï¼åæ¥æ¯æ¯ä¸ªæ¨¡æ¿é®é¢åæ¥ä¸¤æ¬¡ï¼ |
| | | //2.1 䏿¬¡æ§ææ¬æ¬¡è¯·æ±å
¨é¨æ¨¡æ¿çåééãåæ¶äººæ°æ¥åæ¥ï¼åæ¥æ¯æ¯ä¸ªæ¨¡æ¿é®é¢åæ¥ä¸¤æ¬¡ï¼ |
| | | SatisfactionStatQuery statQuery = buildSatisfactionStatQuery(patSatisfactionReqVO, "1", |
| | | ivrLibaTemplateScripts.stream().map(IvrLibaTemplateScript::getTemplateid).collect(Collectors.toList())); |
| | | Map<Long, Long> sendCountMap = mapSatisfactionSendCount(statQuery); |
| | | SatisfactionFillStat fillStat = querySatisfactionFillStat(statQuery); |
| | | Map<Long, Long> fillPersonCountMap = mapSatisfactionFillPersonCount(statQuery); |
| | | |
| | | //3 æscriptAssortnameåç»,å¹¶è·åæ¯ä¸ªéåè¿è¡éåï¼è®¡ç®æ¯ä¸ªåç±»çæ»äººæ°åå¡«æ¥äººæ° |
| | | Map<String, List<IvrLibaTemplateScript>> scriptGroupByAssortName = ivrLibaTemplateScripts.stream().filter(item -> item.getScriptAssortname() != null).collect(Collectors.groupingBy(IvrLibaTemplateScript::getScriptAssortname)); |
| | | if (scriptGroupByAssortName != null && !scriptGroupByAssortName.isEmpty()) { |
| | | for (String assortNameKey : scriptGroupByAssortName.keySet()) { |
| | | //è®°å½æ»äººæ° |
| | | Double subidAll = 0.0; |
| | | //è®°å½æ»çå¡«æ¥äººæ° |
| | | Double fillCountAll = 0.0; |
| | | //è·å该åç±»çå¡«æ¥æ»æ°é |
| | | // 该åç±»æ¶åçå»é模æ¿ï¼åé人æ°/åæ¶äººæ°é½ææ¨¡æ¿ç»è®¡ï¼ |
| | | // æé¢ç®å¾ªç¯ç´¯å 伿åä¸ä¸ªæ¨¡æ¿çééå¤è®¡æãé¢éã |
| | | Set<Long> categoryTemplateIds = new LinkedHashSet<>(); |
| | | //è·å该åç±»çå¡«æ¥æ»æ°éï¼åªç¨äºç®å¹³ååï¼æé¢ç®èåçè¡æ°ï¼ |
| | | List<ScoreCount> allFillCountList = new ArrayList<>(); |
| | | |
| | | List<IvrLibaTemplateScript> ivrLibaTemplateScriptList = scriptGroupByAssortName.get(assortNameKey); |
| | | for (IvrLibaTemplateScript ivrLibaTemplateScript : ivrLibaTemplateScriptList) { |
| | | //éè¿æ¨¡æ¿idåé®é¢åéæ»éï¼åæ¥æ¯æå
¨é¨ sub_id æ¥å Java åå sizeï¼ |
| | | subidAll += sendCountMap.getOrDefault(ivrLibaTemplateScript.getTemplateid(), 0L); |
| | | //è·åå¡«æ¥æ°éï¼åæ¥æ¯ææç»è¡å
¨é¨æ¥å Java åå sizeï¼ |
| | | List<ScoreCount> fillCount = fillStat.get(ivrLibaTemplateScript.getTemplateid(), ivrLibaTemplateScript.getScriptContent()); |
| | | Long templateId = ivrLibaTemplateScript.getTemplateid(); |
| | | if (templateId != null) { |
| | | categoryTemplateIds.add(templateId); |
| | | } |
| | | //è·åå¡«æ¥åå¼åå¸ï¼åªç¨äºå¹³ååï¼ |
| | | List<ScoreCount> fillCount = fillStat.get(templateId, ivrLibaTemplateScript.getScriptContent()); |
| | | if (CollectionUtils.isNotEmpty(fillCount)) allFillCountList.addAll(fillCount); |
| | | fillCountAll += countFillRows(fillCount); |
| | | } |
| | | |
| | | //è®°å½åéæ»äººæ°ãåæ¶æ»äººæ° |
| | | Double subidAll = 0.0; |
| | | Double fillCountAll = 0.0; |
| | | for (Long templateId : categoryTemplateIds) { |
| | | subidAll += sendCountMap.getOrDefault(templateId, 0L); |
| | | fillCountAll += fillPersonCountMap.getOrDefault(templateId, 0L); |
| | | } |
| | | |
| | | // è¿éå
è®°å½ä¸ä¸æ¯ä¸ªåç±»çæ»äººæ°åå¡«æ¥äººæ° |
| | |
| | | //2 åè·å该é®é¢æ»¡æåº¦åç±»ä¸çIvrLibaTemplateScriptçéå |
| | | List<SvyLibTemplateScript> svyLibTemplateScripts = svyLibTemplateScriptMapper.querySvyLibTemplateIds(mydIdList); |
| | | |
| | | //2.1 䏿¬¡æ§ææ¬æ¬¡è¯·æ±å
¨é¨æ¨¡æ¿çåééãå¡«æ¥éæ¥åæ¥ï¼åæ¥æ¯æ¯ä¸ªæ¨¡æ¿é®é¢åæ¥ä¸¤æ¬¡ï¼ |
| | | //2.1 䏿¬¡æ§ææ¬æ¬¡è¯·æ±å
¨é¨æ¨¡æ¿çåééãåæ¶äººæ°æ¥åæ¥ï¼åæ¥æ¯æ¯ä¸ªæ¨¡æ¿é®é¢åæ¥ä¸¤æ¬¡ï¼ |
| | | SatisfactionStatQuery statQuery = buildSatisfactionStatQuery(patSatisfactionReqVO, "2", |
| | | svyLibTemplateScripts.stream().map(SvyLibTemplateScript::getSvyid).collect(Collectors.toList())); |
| | | Map<Long, Long> sendCountMap = mapSatisfactionSendCount(statQuery); |
| | | SatisfactionFillStat fillStat = querySatisfactionFillStat(statQuery); |
| | | Map<Long, Long> fillPersonCountMap = mapSatisfactionFillPersonCount(statQuery); |
| | | |
| | | //3 æscriptAssortnameåç»,å¹¶è·åæ¯ä¸ªéåè¿è¡éåï¼è®¡ç®æ¯ä¸ªåç±»çæ»äººæ°åå¡«æ¥äººæ° |
| | | Map<String, List<SvyLibTemplateScript>> scriptGroupByatCegoryName = svyLibTemplateScripts.stream().filter(item -> item.getCategoryName() != null).collect(Collectors.groupingBy(SvyLibTemplateScript::getCategoryName)); |
| | | if (scriptGroupByatCegoryName != null && !scriptGroupByatCegoryName.isEmpty()) { |
| | | for (String categoryNameKey : scriptGroupByatCegoryName.keySet()) { |
| | | //è®°å½æ»äººæ° |
| | | Double subidAll = 0.0; |
| | | //è®°å½æ»çå¡«æ¥äººæ° |
| | | Double fillCountAll = 0.0; |
| | | //è·å该åç±»çå¡«æ¥æ»æ°é |
| | | // 该åç±»æ¶åçå»é模æ¿ï¼åé人æ°/åæ¶äººæ°é½ææ¨¡æ¿ç»è®¡ï¼ |
| | | // æé¢ç®å¾ªç¯ç´¯å 伿åä¸ä¸ªæ¨¡æ¿çééå¤è®¡æãé¢éã |
| | | Set<Long> categoryTemplateIds = new LinkedHashSet<>(); |
| | | //è·å该åç±»çå¡«æ¥æ»æ°éï¼åªç¨äºç®å¹³ååï¼æé¢ç®èåçè¡æ°ï¼ |
| | | List<ScoreCount> allFillCountList = new ArrayList<>(); |
| | | |
| | | List<SvyLibTemplateScript> svyLibTemplateScriptList = scriptGroupByatCegoryName.get(categoryNameKey); |
| | | for (SvyLibTemplateScript svyLibTemplateScript : svyLibTemplateScriptList) { |
| | | //éè¿æ¨¡æ¿idåé®é¢åéæ»éï¼åæ¥æ¯æå
¨é¨ sub_id æ¥å Java åå sizeï¼ |
| | | subidAll += sendCountMap.getOrDefault(svyLibTemplateScript.getSvyid(), 0L); |
| | | //è·åå¡«æ¥æ°éï¼åæ¥æ¯ææç»è¡å
¨é¨æ¥å Java åå sizeï¼ |
| | | List<ScoreCount> fillCount = fillStat.get(svyLibTemplateScript.getSvyid(), svyLibTemplateScript.getScriptContent()); |
| | | Long templateId = svyLibTemplateScript.getSvyid(); |
| | | if (templateId != null) { |
| | | categoryTemplateIds.add(templateId); |
| | | } |
| | | //è·åå¡«æ¥åå¼åå¸ï¼åªç¨äºå¹³ååï¼ |
| | | List<ScoreCount> fillCount = fillStat.get(templateId, svyLibTemplateScript.getScriptContent()); |
| | | if (CollectionUtils.isNotEmpty(fillCount)) allFillCountList.addAll(fillCount); |
| | | fillCountAll += countFillRows(fillCount); |
| | | } |
| | | |
| | | //è®°å½åéæ»äººæ°ãåæ¶æ»äººæ° |
| | | Double subidAll = 0.0; |
| | | Double fillCountAll = 0.0; |
| | | for (Long templateId : categoryTemplateIds) { |
| | | subidAll += sendCountMap.getOrDefault(templateId, 0L); |
| | | fillCountAll += fillPersonCountMap.getOrDefault(templateId, 0L); |
| | | } |
| | | |
| | | |
| | |
| | | Map<String, List<IvrLibaTemplateScript>> groupByDimension = dimensionScripts.stream().collect(Collectors.groupingBy(IvrLibaTemplateScript::getDimension)); |
| | | |
| | | if (groupByDimension != null && !groupByDimension.isEmpty()) { |
| | | //3.1 䏿¬¡æ§ææ¬æ¬¡è¯·æ±å
¨é¨æ¨¡æ¿çåééãå¡«æ¥éæ¥åæ¥ï¼åæ¥æ¯æ¯ä¸ªæ¨¡æ¿é®é¢åæ¥ä¸¤æ¬¡ï¼ |
| | | //3.1 䏿¬¡æ§ææ¬æ¬¡è¯·æ±å
¨é¨æ¨¡æ¿çåééãåæ¶äººæ°æ¥åæ¥ï¼åæ¥æ¯æ¯ä¸ªæ¨¡æ¿é®é¢åæ¥ä¸¤æ¬¡ï¼ |
| | | SatisfactionStatQuery statQuery = buildSatisfactionStatQuery(patSatisfactionReqVO, "1", |
| | | dimensionScripts.stream().map(IvrLibaTemplateScript::getTemplateid).collect(Collectors.toList())); |
| | | Map<Long, Long> sendCountMap = mapSatisfactionSendCount(statQuery); |
| | | SatisfactionFillStat fillStat = querySatisfactionFillStat(statQuery); |
| | | Map<Long, Long> fillPersonCountMap = mapSatisfactionFillPersonCount(statQuery); |
| | | |
| | | for (String dimension : groupByDimension.keySet()) { |
| | | //è®°å½æ»äººæ° |
| | | Double subidAll = 0.0; |
| | | //è®°å½æ»çå¡«æ¥äººæ° |
| | | Double fillCountAll = 0.0; |
| | | //è·å该维度çå¡«æ¥æ»æ°é |
| | | // 该维度æ¶åçå»é模æ¿ï¼åé人æ°/åæ¶äººæ°é½ææ¨¡æ¿ç»è®¡ï¼æé¢ç®ç´¯å ä¼åæé¢é |
| | | Set<Long> dimensionTemplateIds = new LinkedHashSet<>(); |
| | | //è·å该维度çå¡«æ¥åå¼åå¸ï¼åªç¨äºç®å¹³ååï¼ |
| | | List<ScoreCount> allFillCountList = new ArrayList<>(); |
| | | |
| | | List<IvrLibaTemplateScript> ivrLibaTemplateScriptList = groupByDimension.get(dimension); |
| | | for (IvrLibaTemplateScript ivrLibaTemplateScript : ivrLibaTemplateScriptList) { |
| | | //éè¿æ¨¡æ¿idåé®é¢åéæ»éï¼åæ¥æ¯æå
¨é¨ sub_id æ¥å Java åå sizeï¼ |
| | | subidAll += sendCountMap.getOrDefault(ivrLibaTemplateScript.getTemplateid(), 0L); |
| | | //è·åå¡«æ¥æ°éï¼åæ¥æ¯ææç»è¡å
¨é¨æ¥å Java åå sizeï¼ |
| | | List<ScoreCount> fillCount = fillStat.get(ivrLibaTemplateScript.getTemplateid(), ivrLibaTemplateScript.getScriptContent()); |
| | | Long templateId = ivrLibaTemplateScript.getTemplateid(); |
| | | if (templateId != null) { |
| | | dimensionTemplateIds.add(templateId); |
| | | } |
| | | //è·åå¡«æ¥åå¼åå¸ï¼åªç¨äºå¹³ååï¼ |
| | | List<ScoreCount> fillCount = fillStat.get(templateId, ivrLibaTemplateScript.getScriptContent()); |
| | | if (CollectionUtils.isNotEmpty(fillCount)) allFillCountList.addAll(fillCount); |
| | | fillCountAll += countFillRows(fillCount); |
| | | } |
| | | |
| | | //è®°å½åéæ»äººæ°ãåæ¶æ»äººæ° |
| | | Double subidAll = 0.0; |
| | | Double fillCountAll = 0.0; |
| | | for (Long templateId : dimensionTemplateIds) { |
| | | subidAll += sendCountMap.getOrDefault(templateId, 0L); |
| | | fillCountAll += fillPersonCountMap.getOrDefault(templateId, 0L); |
| | | } |
| | | |
| | | // è¿éå
è®°å½ä¸ä¸æ¯ä¸ªåç±»çæ»äººæ°åå¡«æ¥äººæ° |
| | |
| | | List<SvyLibTemplateScript> dimensionScripts = svyLibTemplateScripts.stream().filter(item -> item.getDimension() != null).collect(Collectors.toList()); |
| | | Map<String, List<SvyLibTemplateScript>> groupByDimension = dimensionScripts.stream().collect(Collectors.groupingBy(SvyLibTemplateScript::getDimension)); |
| | | if (groupByDimension != null && !groupByDimension.isEmpty()) { |
| | | //3.1 䏿¬¡æ§ææ¬æ¬¡è¯·æ±å
¨é¨æ¨¡æ¿çåééãå¡«æ¥éæ¥åæ¥ï¼åæ¥æ¯æ¯ä¸ªæ¨¡æ¿é®é¢åæ¥ä¸¤æ¬¡ï¼ |
| | | //3.1 䏿¬¡æ§ææ¬æ¬¡è¯·æ±å
¨é¨æ¨¡æ¿çåééãåæ¶äººæ°æ¥åæ¥ï¼åæ¥æ¯æ¯ä¸ªæ¨¡æ¿é®é¢åæ¥ä¸¤æ¬¡ï¼ |
| | | SatisfactionStatQuery statQuery = buildSatisfactionStatQuery(patSatisfactionReqVO, "2", |
| | | dimensionScripts.stream().map(SvyLibTemplateScript::getSvyid).collect(Collectors.toList())); |
| | | Map<Long, Long> sendCountMap = mapSatisfactionSendCount(statQuery); |
| | | SatisfactionFillStat fillStat = querySatisfactionFillStat(statQuery); |
| | | Map<Long, Long> fillPersonCountMap = mapSatisfactionFillPersonCount(statQuery); |
| | | |
| | | for (String dimension : groupByDimension.keySet()) { |
| | | //è®°å½æ»äººæ° |
| | | Double subidAll = 0.0; |
| | | //è®°å½æ»çå¡«æ¥äººæ° |
| | | Double fillCountAll = 0.0; |
| | | //è·å该åç±»çå¡«æ¥æ»æ°é |
| | | // 该维度æ¶åçå»é模æ¿ï¼åé人æ°/åæ¶äººæ°é½ææ¨¡æ¿ç»è®¡ï¼æé¢ç®ç´¯å ä¼åæé¢é |
| | | Set<Long> dimensionTemplateIds = new LinkedHashSet<>(); |
| | | //è·å该åç±»çå¡«æ¥åå¼åå¸ï¼åªç¨äºç®å¹³ååï¼ |
| | | List<ScoreCount> allFillCountList = new ArrayList<>(); |
| | | |
| | | List<SvyLibTemplateScript> svyLibTemplateScriptList = groupByDimension.get(dimension); |
| | | for (SvyLibTemplateScript svyLibTemplateScript : svyLibTemplateScriptList) { |
| | | //éè¿æ¨¡æ¿idåé®é¢åéæ»éï¼åæ¥æ¯æå
¨é¨ sub_id æ¥å Java åå sizeï¼ |
| | | subidAll += sendCountMap.getOrDefault(svyLibTemplateScript.getSvyid(), 0L); |
| | | //è·åå¡«æ¥æ°éï¼åæ¥æ¯ææç»è¡å
¨é¨æ¥å Java åå sizeï¼ |
| | | List<ScoreCount> fillCount = fillStat.get(svyLibTemplateScript.getSvyid(), svyLibTemplateScript.getScriptContent()); |
| | | Long templateId = svyLibTemplateScript.getSvyid(); |
| | | if (templateId != null) { |
| | | dimensionTemplateIds.add(templateId); |
| | | } |
| | | //è·åå¡«æ¥åå¼åå¸ï¼åªç¨äºå¹³ååï¼ |
| | | List<ScoreCount> fillCount = fillStat.get(templateId, svyLibTemplateScript.getScriptContent()); |
| | | if (CollectionUtils.isNotEmpty(fillCount)) allFillCountList.addAll(fillCount); |
| | | fillCountAll += countFillRows(fillCount); |
| | | } |
| | | |
| | | //è®°å½åéæ»äººæ°ãåæ¶æ»äººæ° |
| | | Double subidAll = 0.0; |
| | | Double fillCountAll = 0.0; |
| | | for (Long templateId : dimensionTemplateIds) { |
| | | subidAll += sendCountMap.getOrDefault(templateId, 0L); |
| | | fillCountAll += fillPersonCountMap.getOrDefault(templateId, 0L); |
| | | } |
| | | |
| | | |
| | |
| | | } |
| | | |
| | | /** |
| | | * 䏿¬¡æ¥åºå
¨é¨æ¨¡æ¿çãåæ¶äººæ°ãï¼ææ¨¡æ¿å»éï¼åä¸ä¸ªäººçå¤éé¢åªç®ä¸äººï¼ |
| | | * |
| | | * @return key=模æ¿idï¼value=åæ¶äººæ° |
| | | */ |
| | | private Map<Long, Long> mapSatisfactionFillPersonCount(SatisfactionStatQuery statQuery) { |
| | | Map<Long, Long> fillPersonCountMap = new HashMap<>(); |
| | | if (statQuery == null || CollectionUtils.isEmpty(statQuery.getLibTemplateIds())) return fillPersonCountMap; |
| | | List<Map<String, Object>> rows = serviceSubtaskDetailMapper.selectSatisfactionFillPersonCount(statQuery); |
| | | if (CollectionUtils.isEmpty(rows)) return fillPersonCountMap; |
| | | for (Map<String, Object> row : rows) { |
| | | Long templateId = toLong(row.get("libtemplateid")); |
| | | if (templateId == null) continue; |
| | | fillPersonCountMap.put(templateId, toLong(row.get("cnt"), 0L)); |
| | | } |
| | | return fillPersonCountMap; |
| | | } |
| | | |
| | | /** |
| | | * 䏿¬¡æ¥åºå
¨é¨æ¨¡æ¿çå¡«æ¥éï¼æ 模æ¿+é®é¢+åå¼ åç»ï¼ |
| | | */ |
| | | private SatisfactionFillStat querySatisfactionFillStat(SatisfactionStatQuery statQuery) { |
| | |
| | | fillStat.add(templateId, questiontextValue == null ? null : String.valueOf(questiontextValue), scoreCount); |
| | | } |
| | | return fillStat; |
| | | } |
| | | |
| | | /** |
| | | * åå¡«æ¥æç»è¡æ°ï¼å fillCount.size()ï¼ |
| | | */ |
| | | private long countFillRows(List<ScoreCount> fillCount) { |
| | | if (CollectionUtils.isEmpty(fillCount)) return 0L; |
| | | long rows = 0L; |
| | | for (ScoreCount scoreCount : fillCount) { |
| | | rows += scoreCount.getCount(); |
| | | } |
| | | return rows; |
| | | } |
| | | |
| | | /** |
| | |
| | | @Autowired |
| | | private PatMedInhospMapper patMedInhospMapper; |
| | | |
| | | @Autowired |
| | | private PatMedOuthospErrorMapper patMedOuthospErrorMapper; |
| | | |
| | | @Override |
| | | public List<ServiceSLTDInhospResDTO> queryHealthcareRecordList(ServiceSLTDInhospReqVO reqVO) { |
| | | try { |
| | |
| | | log.info("ãparseResponseDataãæåè§£ædataList:{}æ¡å¥åº·è®°å½æ°æ®", dataList.size()); |
| | | List<ServiceSLTDInhospResDTO> resultList = new ArrayList<>(); |
| | | for (Map<String, Object> dataItem : dataList) { |
| | | resultList.add(convertToDTO(dataItem)); |
| | | try { |
| | | resultList.add(convertToDTO(dataItem)); |
| | | } catch (Exception e) { |
| | | // åæ¡æ°æ®è½¬æ¢å¤±è´¥ä¸å让æ´é¡µå¤±è´¥ï¼åé误表交ç»äººå·¥å¤çï¼å
¶ä½è®°å½ç
§å¸¸å
¥åº |
| | | saveOuthospError(dataItem, "CONVERT", e.getMessage(), new Gson().toJson(dataItem), e); |
| | | } |
| | | } |
| | | log.info("ãparseResponseDataãæåè§£æresultList:{}æ¡å¥åº·è®°å½æ°æ®", resultList.size()); |
| | | |
| | |
| | | } |
| | | |
| | | private Boolean outHospitalDate(List<ServiceSLTDInhospResDTO> resultList) { |
| | | List<PatMedOuthosp> batchList = new ArrayList<>(); |
| | | |
| | | // 鍿¥è¯å¨ HIS ä¾§åªè½æå¤©æ¥ï¼éé任塿¯åå°æ¶é½ä¼æå½å¤©ä¸ä¸ä¸ªè¯çè®°å½éæ°æä¸éï¼ |
| | | // å
¶ä¸ç»å¤§å¤æ°ä¸ä¸è½®å·²ç»å
¥åºãè¿éå
æ´é¡µæ¹éæ¥éï¼æå·²å
¥åºçç´æ¥è·³è¿ï¼ |
| | | // åªå¯¹æ°å¢è®°å½å"æ¡£æ¡å¤ç + å
¥åº"ï¼å¦åæ¯æ¡é夿°æ®é½è¦èµ°ä¸é |
| | | // Rediså é + æ¡£æ¡æ¥é + æ¡£æ¡æ´æ° + countBySerialnum + insertï¼ä¸ä¸æ¡å°±æ¯å 䏿¬¡ SQLï¼åå°æ¶è·ä¸å®ã |
| | | Set<String> pageSerialnums = new HashSet<>(); |
| | | List<ServiceSLTDInhospResDTO> uniqueList = new ArrayList<>(); |
| | | List<ServiceSLTDInhospResDTO> noSerialnumList = new ArrayList<>(); |
| | | Map<String, List<String>> serialnumsByDate = new LinkedHashMap<>(); |
| | | for (ServiceSLTDInhospResDTO dto : resultList) { |
| | | if (Objects.isNull(dto)) { |
| | | continue; |
| | | } |
| | | PatArchive patArchive = processPatientArchive(dto); |
| | | PatMedOuthosp patMedOuthosp = buildPatMedOuthosp(dto, patArchive); |
| | | batchList.add(patMedOuthosp); |
| | | String serialnum = dto.getHealthcareRecordNo(); |
| | | if (StringUtils.isEmpty(serialnum)) { |
| | | // 没æè¯çè®°å½å·å°±æ²¡æ³æ¥éï¼ä¿æåæè¡ä¸ºç
§å¸¸å¤çï¼å
¥åºç¯èè¿ä¼åå
䏿¬¡ï¼ |
| | | log.warn("ãoutHospitalDateãè¯çè®°å½å·ä¸ºç©ºï¼æ æ³æ¥éï¼ææ°å¢å¤çï¼patientName={}", dto.getPatientName()); |
| | | noSerialnumList.add(dto); |
| | | continue; |
| | | } |
| | | if (!pageSerialnums.add(serialnum)) { |
| | | // åä¸é¡µå
éå¤çè®°å½ï¼åªå¤ç䏿¡ |
| | | continue; |
| | | } |
| | | uniqueList.add(dto); |
| | | // æå°±è¯æ¥æåç»ï¼è·¨é¶ç¹æ¶æå¤ä¸¤ä¸ªæ¥æï¼ï¼ä¿è¯æ¥éçå表åå
¥åºæ¶å表路ç±ä¸è´ |
| | | String admitDateStr = formatAdmitDate(dto.getLastEncounterTime()); |
| | | serialnumsByDate.computeIfAbsent(admitDateStr == null ? "" : admitDateStr, k -> new ArrayList<>()).add(serialnum); |
| | | } |
| | | |
| | | // 䏿¬¡ SQL æ¥åºè¿ä¸é¡µéå·²ç»å
¥åºç serialnumï¼å代鿡 countBySerialnumï¼ |
| | | Set<String> existingSerialnums = new HashSet<>(); |
| | | for (Map.Entry<String, List<String>> entry : serialnumsByDate.entrySet()) { |
| | | try { |
| | | existingSerialnums.addAll(patMedOuthospService.selectExistingSerialnums(entry.getKey(), entry.getValue())); |
| | | } catch (Exception e) { |
| | | // æ¹éæ¥é失败ä¸å½±åæ£ç¡®æ§ï¼ä¸é¢å
¥åºæ¶æ¯æ¡è¿ä¼åæ¥ä¸æ¬¡éï¼åªæ¯æ
¢ä¸äº |
| | | log.error("ãoutHospitalDateãæ¹éæ¥é失败ï¼éåä¸ºéæ¡æ¥éï¼å°±è¯æ¥æï¼{}", entry.getKey(), e); |
| | | } |
| | | } |
| | | |
| | | List<PatMedOuthosp> batchList = new ArrayList<>(); |
| | | int existSkipCount = 0; |
| | | for (ServiceSLTDInhospResDTO dto : uniqueList) { |
| | | if (existingSerialnums.contains(dto.getHealthcareRecordNo())) { |
| | | existSkipCount++; |
| | | continue; |
| | | } |
| | | PatMedOuthosp patMedOuthosp = buildNewOuthosp(dto); |
| | | if (patMedOuthosp != null) { |
| | | batchList.add(patMedOuthosp); |
| | | } |
| | | } |
| | | for (ServiceSLTDInhospResDTO dto : noSerialnumList) { |
| | | PatMedOuthosp patMedOuthosp = buildNewOuthosp(dto); |
| | | if (patMedOuthosp != null) { |
| | | batchList.add(patMedOuthosp); |
| | | } |
| | | } |
| | | log.info("ãoutHospitalDateãæ¬é¡µ{}æ¡ï¼å»éå{}æ¡ï¼å·²å
¥åºè·³è¿{}æ¡ï¼å¾
å
¥åº{}æ¡", |
| | | resultList.size(), uniqueList.size(), existSkipCount, batchList.size()); |
| | | |
| | | // æ¹éæå
¥ï¼èªå¨å¿½ç¥éå¤ |
| | | if (CollectionUtils.isNotEmpty(batchList)) { |
| | | try { |
| | | //è¿éç¨èªå¨å¿½ç¥éå¤ä¼æé®é¢ï¼å¦æè¡¨éæ°å»ºï¼serialnumç´¢å¼ä¼ä¸¢å¤±ãå°±æ æ³å»éï¼æä»¥è¿æ¯éè¦å
åéå»é |
| | | batchList = DistinctByProperty.distinctByProperty(batchList, PatMedOuthosp::getSerialnum); |
| | | Integer insertCount = 0; |
| | | for (PatMedOuthosp patMedOuthosp : batchList) { |
| | | insertCount += patMedOuthospService.insertPatMedOuthosp(patMedOuthosp); |
| | | //è¿éç¨èªå¨å¿½ç¥éå¤ä¼æé®é¢ï¼å¦æè¡¨éæ°å»ºï¼serialnumç´¢å¼ä¼ä¸¢å¤±ãå°±æ æ³å»éï¼æä»¥è¿æ¯éè¦å
åéå»é |
| | | batchList = DistinctByProperty.distinctByProperty(batchList, PatMedOuthosp::getSerialnum); |
| | | int insertCount = 0; |
| | | int skipCount = 0; |
| | | List<String> failSerialnums = new ArrayList<>(); |
| | | for (PatMedOuthosp patMedOuthosp : batchList) { |
| | | try { |
| | | int inserted = patMedOuthospService.insertPatMedOuthosp(patMedOuthosp); |
| | | if (inserted > 0) { |
| | | insertCount += inserted; |
| | | } else { |
| | | // è¿å0表示已åå¨ï¼éå¤ééï¼æå°±è¯æ¶é´ä¸ºç©ºï¼å±äºæ£å¸¸è·³è¿ï¼ä¸ç®å¤±è´¥ |
| | | skipCount++; |
| | | } |
| | | } catch (Exception e) { |
| | | // åæ¡å
¥åºå¤±è´¥ä¸å䏿ééï¼è½é误表交ç»äººå·¥å¤çï¼ééæç¹ç
§å¸¸æ¨è¿ |
| | | failSerialnums.add(patMedOuthosp.getSerialnum()); |
| | | saveOuthospError(null, patMedOuthosp, "INSERT", e.getMessage(), new Gson().toJson(patMedOuthosp), e); |
| | | } |
| | | } |
| | | log.info("æ¹éæå
¥é¨æ¥è¯è®°å½ï¼æ»æ°ï¼{}, å®é
æå
¥ï¼{}, è·³è¿ï¼å·²åå¨/æ å°±è¯æ¶é´ï¼ï¼{}, è½é误表ï¼{}", |
| | | batchList.size(), insertCount, skipCount, failSerialnums.size()); |
| | | |
| | | log.info("æ¹éæå
¥é¨æ¥è¯è®°å½ï¼æ»æ°ï¼{}, å®é
æå
¥ï¼{}", batchList.size(), insertCount); |
| | | |
| | | } catch (Exception e) { |
| | | log.error("æ¹éæå
¥é¨æ¥è¯è®°å½å¤±è´¥", e); |
| | | if (!failSerialnums.isEmpty()) { |
| | | // 失败æç»å·²éæ¡åè¿ pat_med_outhosp_errorï¼è¿éåªæç¤ºï¼ä¸åæå¼å¸¸é»æéé |
| | | log.error("鍿¥è¯è®°å½å
¥åºå¤±è´¥ {} æ¡ï¼å·²åå
¥ pat_med_outhosp_error ç人工å¤çï¼serialnumï¼{}", |
| | | failSerialnums.size(), failSerialnums); |
| | | } |
| | | } |
| | | return true; |
| | | } |
| | | |
| | | /** |
| | | * å¤çåæ¡æ°å¢è®°å½çæ£è
æ¡£æ¡å¹¶æå»ºé¨æ¥è¯è®°å½ï¼ |
| | | * 失败æ¶åé误表交ç»äººå·¥å¤çå¹¶è¿å nullï¼ä¸å½±ååä¸é¡µéå
¶ä»è®°å½ |
| | | */ |
| | | private PatMedOuthosp buildNewOuthosp(ServiceSLTDInhospResDTO dto) { |
| | | try { |
| | | PatArchive patArchive = processPatientArchive(dto); |
| | | return buildPatMedOuthosp(dto, patArchive); |
| | | } catch (Exception e) { |
| | | saveOuthospError(dto, null, "ARCHIVE", e.getMessage(), new Gson().toJson(dto), e); |
| | | return null; |
| | | } |
| | | } |
| | | |
| | | /** éé失败çåå§è®°å½æ¥èªæ¥å£è¿åç Mapï¼æ°æ®è½¬æ¢å¤±è´¥æ¶è¿æ²¡æ DTOï¼ */ |
| | | private void saveOuthospError(Map<String, Object> dataItem, String errorType, String errorMsg, |
| | | String rawData, Throwable cause) { |
| | | PatMedOuthospError error = new PatMedOuthospError(); |
| | | error.setSerialnum(getStringValue(dataItem, "healthcareRecordNo")); |
| | | error.setOuthospno(getStringValue(dataItem, "healthcareRecordNo")); |
| | | error.setPatname(getStringValue(dataItem, "patientName")); |
| | | error.setPatno(getStringValue(dataItem, "medicalRecordNo")); |
| | | error.setCampusid(getStringValue(dataItem, "campusId")); |
| | | error.setOrgid(getStringValue(dataItem, "orgId")); |
| | | doSaveOuthospError(error, errorType, errorMsg, rawData, cause); |
| | | } |
| | | |
| | | /** éé失败çåå§è®°å½æ¥èª DTO / å¾
å
¥åºç PatMedOuthosp */ |
| | | private void saveOuthospError(ServiceSLTDInhospResDTO dto, PatMedOuthosp patMedOuthosp, String errorType, |
| | | String errorMsg, String rawData, Throwable cause) { |
| | | PatMedOuthospError error = new PatMedOuthospError(); |
| | | if (dto != null) { |
| | | error.setSerialnum(dto.getHealthcareRecordNo()); |
| | | error.setOuthospno(dto.getHealthcareRecordNo()); |
| | | error.setPatname(dto.getPatientName()); |
| | | error.setPatno(dto.getMedicalRecordNo()); |
| | | error.setCampusid(dto.getCampusId()); |
| | | error.setOrgid(dto.getOrgId()); |
| | | error.setAdmitdate(parseDate(dto.getLastEncounterTime())); |
| | | } |
| | | if (patMedOuthosp != null) { |
| | | if (StringUtils.isEmpty(error.getSerialnum())) { |
| | | error.setSerialnum(patMedOuthosp.getSerialnum()); |
| | | } |
| | | error.setOuthospno(patMedOuthosp.getOuthospno()); |
| | | error.setPatname(patMedOuthosp.getPatname()); |
| | | error.setPatno(patMedOuthosp.getPatno()); |
| | | error.setCampusid(patMedOuthosp.getCampusid()); |
| | | error.setOrgid(patMedOuthosp.getOrgid()); |
| | | error.setAdmitdate(patMedOuthosp.getAdmitdate()); |
| | | } |
| | | doSaveOuthospError(error, errorType, errorMsg, rawData, cause); |
| | | } |
| | | |
| | | /** |
| | | * å鍿¥è¯éé失败记å½è¡¨ï¼äº¤ç»äººå·¥å¤çã |
| | | * è¿éå
ä½ä¸åå¼å¸¸ï¼è¿é误表é½åä¸è¿å»æ¶åªææ¥å¿ï¼å¸¦åå§æ°æ®ï¼ï¼ç»ä¸å 为åé误表失败è䏿éé |
| | | */ |
| | | private void doSaveOuthospError(PatMedOuthospError error, String errorType, String errorMsg, |
| | | String rawData, Throwable cause) { |
| | | error.setErrorType(errorType); |
| | | error.setErrorMsg(truncate(errorMsg == null || errorMsg.isEmpty() ? String.valueOf(cause) : errorMsg, 1000)); |
| | | error.setRawData(rawData); |
| | | error.setFailCount(1); |
| | | error.setHandleStatus("0"); |
| | | error.setGatherDate(new SimpleDateFormat("yyyy-MM-dd").format(new Date())); |
| | | error.setCreateTime(DateUtils.getNowDate()); |
| | | try { |
| | | patMedOuthospErrorMapper.insertPatMedOuthospError(error); |
| | | log.error("ã鍿¥è¯ééã{} 失败ï¼å·²åå
¥ pat_med_outhosp_error ç人工å¤çï¼serialnum={}ï¼æ£è
={}ï¼åå ={}", |
| | | errorType, error.getSerialnum(), error.getPatname(), error.getErrorMsg(), cause); |
| | | } catch (Exception ex) { |
| | | log.error("ã鍿¥è¯ééã{} 失败ï¼ä¸åå
¥é误表ä¹å¤±è´¥ï¼serialnum={}ï¼åå§æ°æ®ï¼{}", |
| | | errorType, error.getSerialnum(), rawData, ex); |
| | | } |
| | | } |
| | | |
| | | /** æªæè¶
é¿ææ¬ï¼é¿å
è¶
åºéè¯¯è¡¨åæ®µé¿åº¦å¯¼è´è½è¡¨å¤±è´¥ */ |
| | | private String truncate(String text, int maxLength) { |
| | | if (text == null) { |
| | | return null; |
| | | } |
| | | return text.length() <= maxLength ? text : text.substring(0, maxLength); |
| | | } |
| | | |
| | | private PatMedOuthosp buildPatMedOuthosp(ServiceSLTDInhospResDTO dto, PatArchive patArchive) { |
| | |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * åå°±è¯æ¥æç yyyy-MM-dd é¨åï¼ä¸ buildPatMedOuthosp éç admitdate ä¿æå®å
¨ä¸è´çè§£æè§åï¼ |
| | | * ä¿è¯æ¹éæ¥éç¨çå表åå
¥åºæ¶è·¯ç±å°çå表æ¯åä¸å¼ |
| | | */ |
| | | private String formatAdmitDate(String lastEncounterTime) { |
| | | Date admitDate = parseDate(lastEncounterTime); |
| | | if (admitDate == null) { |
| | | return null; |
| | | } |
| | | return new SimpleDateFormat("yyyy-MM-dd").format(admitDate); |
| | | } |
| | | |
| | | private Boolean inHospitalDate(List<ServiceSLTDInhospResDTO> resultList, String cry) { |
| | | for (ServiceSLTDInhospResDTO dto : resultList) { |
| | | if (Objects.isNull(dto)) continue; |
| | |
| | | |
| | | @Override |
| | | public Map<String, Object> tracedeallist(DetailTraceDealVO detailTraceDealVO) { |
| | | // å页æ¥è¯¢ |
| | | List<ServiceSubtaskDetailTrace> tracedeallist = serviceSubtaskDetailTraceMapper.tracedeallist(detailTraceDealVO); |
| | | |
| | | // æ questiontext åç» |
| | | Map<String, List<ServiceSubtaskDetailTrace>> groupByQuestion = tracedeallist.stream().filter(t -> t.getQuestiontext() != null).collect(Collectors.groupingBy(ServiceSubtaskDetailTrace::getQuestiontext)); |
| | | // ä¼ååï¼â è¿æ¡ SQL 没æ limitï¼æ¯æ¬¡é½ææ´è¡¨ traceï¼å« patdesc/recordurl 大忮µï¼æå Java ååç»ï¼ |
| | | // â¡ æ¯ä¸ªé®é¢é½æ¿ scriptid å» service_subtask_detail æ¥ä¸æ¬¡å
¨è¡¨åªä¸ºå sizeï¼N+1ï¼ï¼ |
| | | // ⢠controller æè¿ä¸ªæ¹æ³è°äºä¸¤éï¼ç¬¬äºéä¸ºäºæ»æ°ï¼ï¼çäºä¸é¢ä¸¤æ¥åè·ä¸¤æ¬¡ã |
| | | // ä¼ååï¼åºå®ç 5 æ¡èå SQLï¼DB åªå¤çå½å页çé¢ç®ã |
| | | // 1) å½å页çé®é¢åç»èåï¼å页䏿¨å° SQLï¼ |
| | | List<Map<String, Object>> groupRows = serviceSubtaskDetailTraceMapper.selectTraceDealGroups(detailTraceDealVO); |
| | | // 2) é®é¢æ»æ°ï¼å页 totalï¼å
¨éå£å¾ï¼ |
| | | long questionTotal = serviceSubtaskDetailTraceMapper.countTraceDealQuestions(detailTraceDealVO); |
| | | // 3) æ±æ»ç»è®¡ï¼å
¨éå£å¾ï¼ä¸åå页影åï¼ |
| | | Map<String, Object> sumRow = serviceSubtaskDetailTraceMapper.sumTraceDeal(detailTraceDealVO); |
| | | long totalException = toLong(sumRow == null ? null : sumRow.get("totalException"), 0L); |
| | | long yesDealException = toLong(sumRow == null ? null : sumRow.get("yesDeal"), 0L); |
| | | long noDealException = totalException - yesDealException; |
| | | |
| | | List<DetailTraceDealDTO> detailTraceDealDTOList = new ArrayList<>(); |
| | | long totalException = 0L; |
| | | long noDealException = 0L; |
| | | long yesDealException = 0L; |
| | | if (CollectionUtils.isNotEmpty(groupRows)) { |
| | | // æ¬é¡µæ¶åçé®é¢ææ¬ï¼åé¢ 3 æ¡æ¥è¯¢é½æå®è¿æ»¤ |
| | | List<String> questiontexts = groupRows.stream() |
| | | .map(row -> row.get("questiontext")) |
| | | .filter(Objects::nonNull) |
| | | .map(String::valueOf) |
| | | .distinct() |
| | | .collect(Collectors.toList()); |
| | | |
| | | for (Map.Entry<String, List<ServiceSubtaskDetailTrace>> entry : groupByQuestion.entrySet()) { |
| | | List<ServiceSubtaskDetailTrace> group = entry.getValue(); |
| | | DetailTraceDealDTO dto = new DetailTraceDealDTO(); |
| | | // 4) æ¬é¡µé®é¢çè´è´£ç§å®¤ï¼æç§å®¤ç¼å·å»éï¼ |
| | | Map<String, List<Map<String, Object>>> deptMap = new HashMap<>(); |
| | | // 5) æ¬é¡µé®é¢çææ°å¤ç人/å¤çæ¶é´ |
| | | Map<String, Map<String, Object>> latestHandleMap = new HashMap<>(); |
| | | if (CollectionUtils.isNotEmpty(questiontexts)) { |
| | | for (Map<String, Object> row : serviceSubtaskDetailTraceMapper.selectTraceDealDepts(detailTraceDealVO, questiontexts)) { |
| | | String questiontext = row.get("questiontext") == null ? null : String.valueOf(row.get("questiontext")); |
| | | if (questiontext == null) continue; |
| | | Map<String, Object> deptMapItem = new HashMap<>(); |
| | | deptMapItem.put("deptName", row.get("deptName")); |
| | | deptMapItem.put("deptCode", row.get("deptCode")); |
| | | deptMap.computeIfAbsent(questiontext, key -> new ArrayList<>()).add(deptMapItem); |
| | | } |
| | | |
| | | // é®é¢å
容 |
| | | dto.setQuestiontext(entry.getKey()); |
| | | if (CollectionUtils.isNotEmpty(group)) { |
| | | dto.setScriptid(group.get(0).getScriptid()); |
| | | dto.setTemplateType(group.get(0).getTemplateType()); |
| | | } |
| | | // è´è´£ç§å®¤ï¼å»éï¼ |
| | | List<Map<String, Object>> responsibleDept = group.stream().filter(t -> t.getTodeptcode() != null).collect(Collectors.collectingAndThen(Collectors.toMap(ServiceSubtaskDetailTrace::getTodeptcode, t -> { |
| | | Map<String, Object> deptMap = new HashMap<>(); |
| | | deptMap.put("deptName", t.getTodeptname()); |
| | | deptMap.put("deptCode", t.getTodeptcode()); |
| | | return deptMap; |
| | | }, (existing, replacement) -> existing), map -> new ArrayList<>(map.values()))); |
| | | dto.setResponsibleDept(responsibleDept); |
| | | |
| | | // ææå¡«åæ°ï¼éè¿ç»å
ç scriptid å» service_subtask_detail 表æ¥è¯¢ |
| | | List<Long> scriptIds = group.stream().map(ServiceSubtaskDetailTrace::getScriptid).filter(Objects::nonNull).distinct().collect(Collectors.toList()); |
| | | long effectiveFillNum = 0L; |
| | | if (CollectionUtils.isNotEmpty(scriptIds)) { |
| | | ServiceSubtaskDetail query = new ServiceSubtaskDetail(); |
| | | query.setDelFlag("0"); |
| | | for (Long scriptId : scriptIds) { |
| | | query.setScriptid(scriptId); |
| | | List<ServiceSubtaskDetail> details = serviceSubtaskDetailMapper.selectServiceSubtaskDetailList(query); |
| | | effectiveFillNum += CollectionUtils.isEmpty(details) ? 0 : details.size(); |
| | | for (Map<String, Object> row : serviceSubtaskDetailTraceMapper.selectTraceDealLatestHandle(detailTraceDealVO, questiontexts)) { |
| | | String questiontext = row.get("questiontext") == null ? null : String.valueOf(row.get("questiontext")); |
| | | if (questiontext == null) continue; |
| | | // åä¸ä¸ªæå¤§å¤çæ¶é´å¯è½æå¤æ¡ï¼ä¿çç¬¬ä¸æ¡å³å¯ï¼åå®ç°åç»å
handle_time æå¤§ç飿¡ï¼ |
| | | latestHandleMap.putIfAbsent(questiontext, row); |
| | | } |
| | | } |
| | | |
| | | // å¼å¸¸å¡«åæ° = å½ååç»ç List æ°é |
| | | long exceptionFillNum = group.size(); |
| | | // 6) æ¬é¡µé®é¢çææå¡«åæ°ï¼ä¸æ¬¡ group by æ¥åï¼æ¿ä»£é个 scriptid æ¥è¯¢ |
| | | // ä¸ä¸ªé®é¢å¯è½å¯¹åºå¤ä¸ª scriptidï¼æä»¥å
æ questiontext -> scriptid å表解å¼ï¼ |
| | | // åæè¯¥é®é¢ææ scriptid çå¡«åæ°ç¸å ï¼ä¸åå®ç° for 循ç¯ç´¯å çå£å¾ä¸è´ï¼ |
| | | Map<String, List<Long>> questionScriptIds = new LinkedHashMap<>(); |
| | | Set<Long> scriptIdSet = new LinkedHashSet<>(); |
| | | for (Map<String, Object> row : groupRows) { |
| | | String questiontext = row.get("questiontext") == null ? null : String.valueOf(row.get("questiontext")); |
| | | if (questiontext == null) continue; |
| | | List<Long> ids = parseScriptIds(row.get("scriptids")); |
| | | questionScriptIds.put(questiontext, ids); |
| | | scriptIdSet.addAll(ids); |
| | | } |
| | | Map<Long, Long> effectiveFillMap = new HashMap<>(); |
| | | if (CollectionUtils.isNotEmpty(scriptIdSet)) { |
| | | for (Map<String, Object> row : serviceSubtaskDetailMapper.countDetailByScriptIds(new ArrayList<>(scriptIdSet))) { |
| | | Long scriptId = toLongObj(row.get("scriptid")); |
| | | if (scriptId == null) continue; |
| | | effectiveFillMap.put(scriptId, toLong(row.get("cnt"), 0L)); |
| | | } |
| | | } |
| | | |
| | | Map<String, Object> fillSituation = new HashMap<>(); |
| | | fillSituation.put("effectiveFillNum", effectiveFillNum); |
| | | fillSituation.put("exceptionFillNum", exceptionFillNum); |
| | | dto.setFillSituation(fillSituation); |
| | | // 7) ç»è£
è¿åç»æï¼é¡ºåº = SQL ç order by questiontextï¼ä¿è¯å页稳å®ï¼ |
| | | for (Map<String, Object> row : groupRows) { |
| | | String questiontext = row.get("questiontext") == null ? null : String.valueOf(row.get("questiontext")); |
| | | if (questiontext == null) continue; |
| | | |
| | | // å¼å¸¸é®é¢å¤çæ°éï¼ä» handleFlag ç»è®¡ |
| | | long yesDeal = group.stream().filter(t -> "1".equals(t.getHandleFlag())).count(); |
| | | long noDeal = group.stream().filter(t -> !"1".equals(t.getHandleFlag())).count(); |
| | | Map<String, Object> exceptionQuesNum = new HashMap<>(); |
| | | exceptionQuesNum.put("yesDeal", yesDeal); |
| | | exceptionQuesNum.put("noDeal", noDeal); |
| | | exceptionQuesNum.put("all", exceptionFillNum); |
| | | dto.setExceptionQuesNum(exceptionQuesNum); |
| | | DetailTraceDealDTO dto = new DetailTraceDealDTO(); |
| | | dto.setQuestiontext(questiontext); |
| | | Long scriptId = toLongObj(row.get("scriptid")); |
| | | dto.setScriptid(scriptId); |
| | | dto.setScriptids(parseScriptIds(row.get("scriptids"))); |
| | | Object templateType = row.get("templateType"); |
| | | dto.setTemplateType(templateType == null ? null : Integer.valueOf(String.valueOf(templateType))); |
| | | dto.setResponsibleDept(deptMap.getOrDefault(questiontext, new ArrayList<>())); |
| | | |
| | | // æ±æ»ç»è®¡ç´¯å |
| | | totalException += exceptionFillNum; |
| | | noDealException += noDeal; |
| | | yesDealException += yesDeal; |
| | | long exceptionFillNum = toLong(row.get("exceptionFillNum"), 0L); |
| | | // 该é®é¢ä¸ææ scriptid çææå¡«åæ°ä¹åï¼ä¸ä¸ª questiontext å¯è½å¯¹åºå¤ä¸ª scriptidï¼ |
| | | long effectiveFillNum = 0L; |
| | | for (Long sid : questionScriptIds.getOrDefault(questiontext, new ArrayList<>())) { |
| | | effectiveFillNum += effectiveFillMap.getOrDefault(sid, 0L); |
| | | } |
| | | Map<String, Object> fillSituation = new HashMap<>(); |
| | | fillSituation.put("effectiveFillNum", effectiveFillNum); |
| | | fillSituation.put("exceptionFillNum", exceptionFillNum); |
| | | dto.setFillSituation(fillSituation); |
| | | |
| | | // ææ°å¤ç人åå¤çæ¶é´ï¼å handleTime ææ°ç䏿¡ï¼ |
| | | group.stream().filter(t -> t.getHandleTime() != null).max(Comparator.comparing(ServiceSubtaskDetailTrace::getHandleTime)).ifPresent(latest -> { |
| | | dto.setHandleBy(latest.getHandleBy()); |
| | | dto.setHandleTime(latest.getHandleTime()); |
| | | }); |
| | | long yesDeal = toLong(row.get("yesDeal"), 0L); |
| | | long noDeal = toLong(row.get("noDeal"), 0L); |
| | | Map<String, Object> exceptionQuesNum = new HashMap<>(); |
| | | exceptionQuesNum.put("yesDeal", yesDeal); |
| | | exceptionQuesNum.put("noDeal", noDeal); |
| | | exceptionQuesNum.put("all", exceptionFillNum); |
| | | dto.setExceptionQuesNum(exceptionQuesNum); |
| | | |
| | | detailTraceDealDTOList.add(dto); |
| | | Map<String, Object> latestHandle = latestHandleMap.get(questiontext); |
| | | if (latestHandle != null) { |
| | | dto.setHandleBy(latestHandle.get("handleBy") == null ? null : String.valueOf(latestHandle.get("handleBy"))); |
| | | Object handleTime = latestHandle.get("handleTime"); |
| | | dto.setHandleTime(handleTime instanceof Date ? (Date) handleTime : null); |
| | | } |
| | | |
| | | detailTraceDealDTOList.add(dto); |
| | | } |
| | | } |
| | | |
| | | Map<String, Object> result = new HashMap<>(); |
| | |
| | | result.put("totalException", totalException); |
| | | result.put("noDealException", noDealException); |
| | | result.put("yesDealException", yesDealException); |
| | | // åé¡µæ»æ°ï¼æé®é¢ç»´åº¦ï¼ï¼controller ç´æ¥ç¨å®ï¼ä¸ç¨åå
¨éæ¥ä¸é |
| | | result.put("questionTotal", questionTotal); |
| | | return result; |
| | | } |
| | | |
| | | private static Long toLongObj(Object value) { |
| | | if (value == null) return null; |
| | | if (value instanceof Number) return ((Number) value).longValue(); |
| | | String text = String.valueOf(value).trim(); |
| | | return text.isEmpty() ? null : Long.valueOf(text); |
| | | } |
| | | |
| | | private static long toLong(Object value, long defaultValue) { |
| | | Long result = toLongObj(value); |
| | | return result == null ? defaultValue : result; |
| | | } |
| | | |
| | | /** |
| | | * è§£æ group_concat(distinct scriptid) çç»æï¼å¦ "101,102"ï¼ä¸º scriptid å表 |
| | | */ |
| | | private static List<Long> parseScriptIds(Object value) { |
| | | List<Long> scriptIds = new ArrayList<>(); |
| | | if (value == null) return scriptIds; |
| | | for (String item : String.valueOf(value).split(",")) { |
| | | Long scriptId = toLongObj(item); |
| | | if (scriptId != null && !scriptIds.contains(scriptId)) { |
| | | scriptIds.add(scriptId); |
| | | } |
| | | } |
| | | return scriptIds; |
| | | } |
| | | |
| | | /** |
| | | * æ°å¢é访任å¡å¼å¸¸è®°å½è·è¸ª |
| | | * |
| | |
| | | WHERE serialnum = #{serialnum} |
| | | </select> |
| | | |
| | | <!-- æ¹éæ¥è¯¢æå®å表ä¸å·²åå¨ç serialnumï¼ä¸æ¬¡ SQL 宿æ´é¡µå»éï¼é¿å
éæ¡ countBySerialnum --> |
| | | <select id="selectExistingSerialnums" resultType="java.lang.String"> |
| | | SELECT serialnum |
| | | FROM ${tableName} |
| | | WHERE serialnum IN |
| | | <foreach collection="serialnums" item="serialnum" open="(" separator="," close=")"> |
| | | #{serialnum} |
| | | </foreach> |
| | | </select> |
| | | |
| | | <update id="updateInTable" parameterType="map"> |
| | | update ${tableName} |
| | | <trim prefix="SET" suffixOverrides=","> |
| | |
| | | |
| | | </select> |
| | | |
| | | <!-- |
| | | å¼å¸¸é®é¢å¤çæ
嵿¥è¯¢ï¼tracedeallistï¼çãææå¡«åæ°ãï¼ |
| | | 忥坹æ¯ä¸ª scriptid 齿§è¡ä¸æ¬¡ selectServiceSubtaskDetailListï¼æ¥åå
¨é¨ååå» sizeï¼ï¼ |
| | | ä¸ä¸ªé®é¢ä¸æ¬¡ãè䏿´ä¸ªæ¥å£ä¼è¢«è°ç¨ä¸¤éï¼å åä¸ç¾ä¸ªé®é¢å°±æ¯ä¸ç¾æ¬¡å¤§è¡¨æ«æï¼ |
| | | è¿éåå¹¶æä¸æ¡ group byã |
| | | 注æï¼ä¸ºä¸åå£å¾å®å
¨ä¸è´ï¼è¿éä¸å del_flag æ¡ä»¶ï¼å selectServiceSubtaskDetailList |
| | | è½ç¶ Java é setDelFlag("0")ï¼ä½ SQL é并没æ del_flag è¿æ»¤ï¼ã |
| | | --> |
| | | <select id="countDetailByScriptIds" resultType="java.util.Map"> |
| | | select scriptid as scriptid, count(*) as cnt |
| | | from service_subtask_detail |
| | | where scriptid in |
| | | <foreach collection="scriptIds" item="scriptId" open="(" separator="," close=")"> |
| | | #{scriptId} |
| | | </foreach> |
| | | group by scriptid |
| | | </select> |
| | | |
| | | <select id="getServiceSubtaskDetails" parameterType="com.smartor.domain.ServiceSubtaskDetailVO" |
| | | resultType="java.util.HashMap"> |
| | | select |
| | |
| | | group by ss.libtemplateid, ssd.questiontext, ssd.score |
| | | </select> |
| | | |
| | | <select id="selectSatisfactionFillPersonCount" parameterType="com.smartor.domain.entity.SatisfactionStatQuery" |
| | | resultType="java.util.Map"> |
| | | select ss.libtemplateid as libtemplateid, |
| | | count(distinct ssd.sub_id) as cnt |
| | | from service_subtask_detail ssd |
| | | join service_subtask ss on ss.id = ssd.sub_id |
| | | where ssd.del_flag = 0 |
| | | and ss.del_flag = 0 |
| | | <if test="orgid != null and orgid != ''"> |
| | | and ss.orgid = #{orgid} |
| | | </if> |
| | | <if test="campusid != null and campusid != ''"> |
| | | and ss.campusid = #{campusid} |
| | | </if> |
| | | <if test="type != null and type != ''">and ss.type = #{type}</if> |
| | | <if test="startTime != null"> |
| | | and ss.visit_time >= #{startTime} |
| | | </if> |
| | | <if test="endTime != null"> |
| | | and ss.visit_time < date_add(#{endTime}, interval 1 day) |
| | | </if> |
| | | <if test="libTemplateIds != null and libTemplateIds.size() > 0"> |
| | | and ss.libtemplateid IN |
| | | <foreach collection="libTemplateIds" item="libTemplateId" open="(" separator="," close=")"> |
| | | #{libTemplateId} |
| | | </foreach> |
| | | </if> |
| | | <if test="(hospitaldistrictcodes != null and hospitaldistrictcodes.size() > 0) or (deptcodes != null and deptcodes.size() > 0)"> |
| | | AND ( |
| | | <if test="hospitaldistrictcodes != null and hospitaldistrictcodes.size() > 0"> |
| | | ss.leavehospitaldistrictcode IN |
| | | <foreach collection="hospitaldistrictcodes" item="hospitaldistrictcode" open="(" |
| | | separator="," |
| | | close=")"> |
| | | #{hospitaldistrictcode} |
| | | </foreach> |
| | | </if> |
| | | <if test="hospitaldistrictcodes != null and hospitaldistrictcodes.size() > 0 and deptcodes != null and deptcodes.size() > 0"> |
| | | OR |
| | | </if> |
| | | <if test="deptcodes != null and deptcodes.size() > 0"> |
| | | ss.deptcode IN |
| | | <foreach collection="deptcodes" item="deptcode" open="(" separator="," close=")"> |
| | | #{deptcode} |
| | | </foreach> |
| | | </if> |
| | | ) |
| | | </if> |
| | | group by ss.libtemplateid |
| | | </select> |
| | | |
| | | <!-- |
| | | 满æåº¦ç»è®¡ï¼statistics / statisticsByDimensionï¼ï¼ä¸æ¬¡æ§ç»è®¡æ¬æ¬¡è¯·æ±å
¨é¨é®é¢çå¡«æ¥éã |
| | | çä»·äºå¯¹æ¯ä¸ªé®é¢æ§è¡ queryFillCount(subids, questiontext)ï¼åºå«æ¯ï¼ |
| | |
| | | <if test="pageSize != null and pageNum != null">limit ${pageSize} OFFSET ${pageNum}</if> |
| | | </select> |
| | | |
| | | <select id="tracedeallist" parameterType="com.smartor.domain.VO.DetailTraceDealVO" |
| | | resultMap="ServiceSubtaskDetailTtraceResult"> |
| | | <include refid="selectServiceSubtaskDetailTtraceVo"/> |
| | | where del_flag=0 |
| | | <!-- |
| | | å¼å¸¸é®é¢å¤çæ
嵿¥è¯¢ï¼tracedeallistï¼çå
Œ
±è¿æ»¤æ¡ä»¶ã |
| | | ä¸é¢ 5 æ¡ SQL å
±ç¨æ¬ç段ï¼ä¿è¯ãåé¡µæ°æ®ãé®é¢æ»æ°ãå
¨éæ±æ»ãçå£å¾å®å
¨ä¸è´ã |
| | | 注æï¼questiontext 为空çè¡åå®ç°é被 stream().filter(questiontext != null) 丢æäºï¼ |
| | | æä»¥è¿éç»ä¸æé¤ï¼æ±æ»æ°æå忥ä¸è´ã |
| | | --> |
| | | <sql id="traceDealWhere"> |
| | | and del_flag = 0 |
| | | and questiontext is not null |
| | | <if test="vo.templateid != null and vo.templateid != ''"> |
| | | and templateid = #{vo.templateid} |
| | | </if> |
| | | <if test="vo.todeptcode != null and vo.todeptcode != ''"> |
| | | and FIND_IN_SET(#{vo.todeptcode}, todeptcode) |
| | | </if> |
| | | <if test="vo.todeptname != null and vo.todeptname != ''"> |
| | | and todeptname like concat('%', #{vo.todeptname}, '%') |
| | | </if> |
| | | <if test="vo.handleStartTime != null and vo.handleEndTime != null"> |
| | | and handle_time between #{vo.handleStartTime} and #{vo.handleEndTime} |
| | | </if> |
| | | <if test="vo.orgid != null and vo.orgid != ''"> |
| | | and orgid = #{vo.orgid} |
| | | </if> |
| | | <if test="vo.type != null and vo.type != ''"> |
| | | and type = #{vo.type} |
| | | </if> |
| | | <if test="vo.templateType != null"> |
| | | and template_type = #{vo.templateType} |
| | | </if> |
| | | <if test="vo.isMydException != null "> |
| | | and is_myd_exception = #{vo.isMydException} |
| | | </if> |
| | | <if test="vo.dimension != null and vo.dimension != ''"> |
| | | and dimension = #{vo.dimension} |
| | | </if> |
| | | <if test="vo.dutyDeptPersonName != null and vo.dutyDeptPersonName != ''"> |
| | | and duty_dept_person_name like concat('%', #{vo.dutyDeptPersonName}, '%') |
| | | </if> |
| | | <if test="vo.dutyDeptPersonCode != null and vo.dutyDeptPersonCode != ''"> |
| | | and duty_dept_person_code like concat('%', #{vo.dutyDeptPersonCode}, '%') |
| | | </if> |
| | | <if test="vo.reportDeptPersonName != null and vo.reportDeptPersonName != ''"> |
| | | and report_dept_person_name like concat('%', #{vo.reportDeptPersonName}, '%') |
| | | </if> |
| | | <if test="vo.reportDeptPersonCode != null and vo.reportDeptPersonCode != ''"> |
| | | and report_dept_person_code like concat('%', #{vo.reportDeptPersonCode}, '%') |
| | | </if> |
| | | <if test="vo.circulationDeptPersonCode != null and vo.circulationDeptPersonCode != ''"> |
| | | and circulation_dept_person_code like concat('%', #{vo.circulationDeptPersonCode}, '%') |
| | | </if> |
| | | <if test="vo.circulationDeptPersonName != null and vo.circulationDeptPersonName != ''"> |
| | | and circulation_dept_person_name like concat('%', #{vo.circulationDeptPersonName}, '%') |
| | | </if> |
| | | <if test="vo.circulationDeptCode != null and vo.circulationDeptCode != ''"> |
| | | and circulation_dept_code like concat('%', #{vo.circulationDeptCode}, '%') |
| | | </if> |
| | | <if test="vo.circulationDeptName != null and vo.circulationDeptName != ''"> |
| | | and circulation_dept_name like concat('%', #{vo.circulationDeptName}, '%') |
| | | </if> |
| | | <if test="vo.circulationExplain != null and vo.circulationExplain != ''"> |
| | | and circulation_explain like concat('%', #{vo.circulationExplain}, '%') |
| | | </if> |
| | | <if test="vo.circulationTime != null "> |
| | | and circulation_time = #{vo.circulationTime} |
| | | </if> |
| | | <if test="vo.circulationStatus != null "> |
| | | and circulation_status = #{vo.circulationStatus} |
| | | </if> |
| | | <if test="vo.circulationPersonName != null and vo.circulationPersonName != ''"> |
| | | and circulation_person_name like concat('%', #{vo.circulationPersonName}, '%') |
| | | </if> |
| | | <if test="vo.circulationPersonCode != null and vo.circulationPersonCode != ''"> |
| | | and circulation_person_code = #{vo.circulationPersonCode} |
| | | </if> |
| | | </sql> |
| | | |
| | | <if test="templateid != null and templateid != ''"> |
| | | and templateid = #{templateid} |
| | | </if> |
| | | <if test="todeptcode != null and todeptcode != ''"> |
| | | and FIND_IN_SET(#{todeptcode}, todeptcode) |
| | | </if> |
| | | <if test="todeptname != null and todeptname != ''"> |
| | | and todeptname like concat('%', #{todeptname}, '%') |
| | | </if> |
| | | <if test="handleStartTime != null and handleEndTime != null"> |
| | | and handle_time between #{handleStartTime} and #{handleEndTime} |
| | | </if> |
| | | <!-- |
| | | å½å页çé®é¢åç»èåï¼å页æé®é¢ç»´åº¦ä¸æ¨å° SQLã |
| | | åæ¥æ¯æ service_subtask_detail_trace å
¨è¡¨ï¼å« patdesc/recordurl ç大忮µï¼æå Java ååç»ï¼ |
| | | pageSize å®å
¨æ²¡çæï¼ç°å¨ DB åªå¤çå½å页çé¢ç®ã |
| | | |
| | | <if test="orgid != null and orgid != ''"> |
| | | and orgid = #{orgid} |
| | | 注æåç»ç»´åº¦å¿
é¡»æ¯ questiontextï¼æ¥å£ææ¡£çº¦å®ãæ¯ä¸ªé®é¢å¯¹åºä¸æ¡è®°å½ãï¼ï¼ |
| | | ä¸ä¸ª questiontext å¯è½å¯¹åºå¤ä¸ª scriptidï¼è¿æ¶è¦æè¯¥é®é¢ææ scriptid çææå¡«åæ°å èµ·æ¥ï¼ |
| | | æä»¥è¿éç¨ group_concat(distinct scriptid) æ scriptid å表带å Javaï¼scriptid åæå°å¼ç¨äºå±ç¤ºï¼ã |
| | | å¦ææ¹æ group by questiontext, scriptidï¼åä¸ä¸ªé®é¢ä¼ææå¤è¡ï¼ |
| | | ä¸ countTraceDealQuestionsï¼æ questiontext å»éï¼ãtotalãè´è´£ç§å®¤ãææ°å¤ç人çå£å¾é½ä¼ä¸ä¸è´ã |
| | | --> |
| | | <select id="selectTraceDealGroups" resultType="java.util.Map"> |
| | | select questiontext as questiontext, |
| | | min(scriptid) as scriptid, |
| | | group_concat(distinct scriptid) as scriptids, |
| | | min(template_type) as templateType, |
| | | count(*) as exceptionFillNum, |
| | | sum(case when handle_flag = '1' then 1 else 0 end) as yesDeal, |
| | | sum(case when handle_flag = '1' then 0 else 1 end) as noDeal |
| | | from service_subtask_detail_trace |
| | | where 1 = 1 |
| | | <include refid="traceDealWhere"/> |
| | | group by questiontext |
| | | order by questiontext |
| | | <if test="vo.pageSize != null and vo.pageNum != null"> |
| | | limit ${vo.pageSize} offset ${vo.pageNum} |
| | | </if> |
| | | </select> |
| | | |
| | | <if test="type != null and type != ''"> |
| | | and type = #{type} |
| | | </if> |
| | | <if test="templateType != null"> |
| | | and template_type = #{templateType} |
| | | </if> |
| | | <if test="isMydException != null "> |
| | | and is_myd_exception = #{isMydException} |
| | | </if> |
| | | <if test="dimension != null and dimension != ''"> |
| | | and dimension = #{dimension} |
| | | </if> |
| | | <if test="dutyDeptPersonName != null and dutyDeptPersonName != ''"> |
| | | and duty_dept_person_name like concat('%', #{dutyDeptPersonName}, '%') |
| | | </if> |
| | | <if test="dutyDeptPersonCode != null and dutyDeptPersonCode != ''"> |
| | | and duty_dept_person_code like concat('%', #{dutyDeptPersonCode}, '%') |
| | | </if> |
| | | <if test="reportDeptPersonName != null and reportDeptPersonName != ''"> |
| | | and report_dept_person_name like concat('%', #{reportDeptPersonName}, '%') |
| | | </if> |
| | | <if test="reportDeptPersonCode != null and reportDeptPersonCode != ''"> |
| | | and report_dept_person_code like concat('%', #{reportDeptPersonCode}, '%') |
| | | </if> |
| | | <if test="circulationDeptPersonCode != null and circulationDeptPersonCode != ''"> |
| | | and circulation_dept_person_code like concat('%', #{circulationDeptPersonCode}, '%') |
| | | </if> |
| | | <if test="circulationDeptPersonName != null and circulationDeptPersonName != ''"> |
| | | and circulation_dept_person_name like concat('%', #{circulationDeptPersonName}, '%') |
| | | </if> |
| | | <if test="circulationDeptCode != null and circulationDeptCode != ''"> |
| | | and circulation_dept_code like concat('%', #{circulationDeptCode}, '%') |
| | | </if> |
| | | <if test="circulationDeptName != null and circulationDeptName != ''"> |
| | | and circulation_dept_name like concat('%', #{circulationDeptName}, '%') |
| | | </if> |
| | | <if test="circulationExplain != null and circulationExplain != ''"> |
| | | and circulation_explain like concat('%', #{circulationExplain}, '%') |
| | | </if> |
| | | <if test="circulationTime != null "> |
| | | and circulation_time = #{circulationTime} |
| | | </if> |
| | | <if test="circulationStatus != null "> |
| | | and circulation_status = #{circulationStatus} |
| | | </if> |
| | | <if test="circulationPersonName != null and circulationPersonName != ''"> |
| | | and circulation_person_name like concat('%', #{circulationPersonName}, '%') |
| | | </if> |
| | | <if test="circulationPersonCode != null and circulationPersonCode != ''"> |
| | | and circulation_person_code =#{circulationPersonCode} |
| | | </if> |
| | | <!-- é®é¢æ»æ°ï¼å页 totalï¼æé®é¢ç»´åº¦ï¼ --> |
| | | <select id="countTraceDealQuestions" resultType="long"> |
| | | select count(distinct questiontext) |
| | | from service_subtask_detail_trace |
| | | where 1 = 1 |
| | | <include refid="traceDealWhere"/> |
| | | </select> |
| | | |
| | | <!-- å
¨éæ±æ»ï¼ä¸åå页影åï¼ï¼æ»æ° + å·²å¤çæ°ï¼æªå¤çæ°å¨ Java éç¸å --> |
| | | <select id="sumTraceDeal" resultType="java.util.Map"> |
| | | select count(*) as totalException, |
| | | sum(case when handle_flag = '1' then 1 else 0 end) as yesDeal |
| | | from service_subtask_detail_trace |
| | | where 1 = 1 |
| | | <include refid="traceDealWhere"/> |
| | | </select> |
| | | |
| | | <!-- å½å页é®é¢çè´è´£ç§å®¤ï¼æç§å®¤ç¼å·å»éï¼åç§°åç»å
é空çä¸ä¸ªï¼ --> |
| | | <select id="selectTraceDealDepts" resultType="java.util.Map"> |
| | | select questiontext as questiontext, |
| | | todeptcode as deptCode, |
| | | min(todeptname) as deptName |
| | | from service_subtask_detail_trace |
| | | where 1 = 1 |
| | | <include refid="traceDealWhere"/> |
| | | and todeptcode is not null and todeptcode != '' |
| | | and questiontext in |
| | | <foreach collection="questiontexts" item="qt" open="(" separator="," close=")"> |
| | | #{qt} |
| | | </foreach> |
| | | group by questiontext, todeptcode |
| | | </select> |
| | | |
| | | <!-- å½å页é®é¢çææ°å¤ç人åå¤çæ¶é´ï¼handle_time æå¤§ç䏿¡ï¼ --> |
| | | <select id="selectTraceDealLatestHandle" resultType="java.util.Map"> |
| | | select t.questiontext as questiontext, |
| | | t.handle_by as handleBy, |
| | | t.handle_time as handleTime |
| | | from service_subtask_detail_trace t |
| | | inner join (select questiontext, max(handle_time) as maxHandleTime |
| | | from service_subtask_detail_trace |
| | | where 1 = 1 |
| | | <include refid="traceDealWhere"/> |
| | | and handle_time is not null |
| | | and questiontext in |
| | | <foreach collection="questiontexts" item="qt" open="(" separator="," close=")"> |
| | | #{qt} |
| | | </foreach> |
| | | group by questiontext) m |
| | | on m.questiontext = t.questiontext and m.maxHandleTime = t.handle_time |
| | | where t.del_flag = 0 |
| | | </select> |
| | | |
| | | |
| | |
| | | <result property="updateBy" column="update_by"/> |
| | | <result property="updateTime" column="update_time"/> |
| | | <result property="orgid" column="orgid"/> |
| | | <result property="type" column="type"/> |
| | | <result property="seqno" column="seqno"/> |
| | | </resultMap> |
| | | |
| | |
| | | update_by, |
| | | update_time, |
| | | orgid, |
| | | type, |
| | | seqno |
| | | from svy_lib_template_category |
| | | </sql> |
| | |
| | | <if test="guid != null and guid != ''">and guid = #{guid}</if> |
| | | <if test="orgid != null ">and orgid = #{orgid}</if> |
| | | <if test="seqno != null ">and seqno = #{seqno}</if> |
| | | <if test="type != null ">and type = #{type}</if> |
| | | |
| | | </select> |
| | | |
| | |
| | | <if test="updateTime != null">update_time,</if> |
| | | <if test="orgid != null">orgid,</if> |
| | | <if test="seqno != null">seqno,</if> |
| | | <if test="type != null">type,</if> |
| | | </trim> |
| | | <trim prefix="values (" suffix=")" suffixOverrides=","> |
| | | <if test="name != null">#{name},</if> |
| | |
| | | <if test="updateTime != null">#{updateTime},</if> |
| | | <if test="orgid != null">#{orgid},</if> |
| | | <if test="seqno != null">#{seqno},</if> |
| | | <if test="type != null">#{type},</if> |
| | | </trim> |
| | | </insert> |
| | | |
| | |
| | | <if test="updateTime != null">update_time = #{updateTime},</if> |
| | | <if test="orgid != null">orgid = #{orgid},</if> |
| | | <if test="seqno != null">seqno = #{seqno},</if> |
| | | <if test="type != null">type = #{type},</if> |
| | | </trim> |
| | | where id = #{id} |
| | | </update> |