diff --git a/cloud-common/cloud-common-core/src/main/java/cn/sh/stc/sict/cloud/common/core/constant/RedisCacheConstant.java b/cloud-common/cloud-common-core/src/main/java/cn/sh/stc/sict/cloud/common/core/constant/RedisCacheConstant.java index 2a2244ac062685e4e2fdd05991ca4f03d94abd89..f14b8b3b5cc7146cf8d6bcb748a68f564784e03e 100644 --- a/cloud-common/cloud-common-core/src/main/java/cn/sh/stc/sict/cloud/common/core/constant/RedisCacheConstant.java +++ b/cloud-common/cloud-common-core/src/main/java/cn/sh/stc/sict/cloud/common/core/constant/RedisCacheConstant.java @@ -79,4 +79,7 @@ public class RedisCacheConstant { * 验证码前缀 */ public static final String DEFAULT_CODE_KEY = "SICT_DEFAULT_CODE_KEY_"; + + + public static final String DEPT_NUM_SOURCE_RESULT = "dept_num_source_result"; } diff --git a/smart-health-modules/theme-schema/src/main/java/cn/sh/stc/sict/theme/HyThemeApplication.java b/smart-health-modules/theme-schema/src/main/java/cn/sh/stc/sict/theme/HyThemeApplication.java index 1ddee4ca74c2698cf88493c8e3f7e4ccb224c782..ec88bab7935932a8863cbce8709a26764051bacd 100644 --- a/smart-health-modules/theme-schema/src/main/java/cn/sh/stc/sict/theme/HyThemeApplication.java +++ b/smart-health-modules/theme-schema/src/main/java/cn/sh/stc/sict/theme/HyThemeApplication.java @@ -4,6 +4,7 @@ import cn.sh.stc.sict.cloud.common.security.annotation.EnableSictFeignClients; import cn.sh.stc.sict.cloud.common.security.annotation.EnableSictResourceServer; import cn.sh.stc.sict.cloud.common.swagger.annotation.EnableSictSwagger2; import org.springframework.boot.SpringApplication; +import org.springframework.cache.annotation.EnableCaching; import org.springframework.cloud.client.SpringCloudApplication; import org.springframework.scheduling.annotation.EnableScheduling; import org.springframework.transaction.annotation.EnableTransactionManagement; @@ -11,6 +12,7 @@ import org.springframework.transaction.annotation.EnableTransactionManagement; /** * @author F_xh */ +@EnableCaching @EnableScheduling @EnableSictSwagger2 @SpringCloudApplication diff --git a/smart-health-modules/theme-schema/src/main/java/cn/sh/stc/sict/theme/hpgp/service/impl/HpgpBusyIdlePredictionServiceImpl.java b/smart-health-modules/theme-schema/src/main/java/cn/sh/stc/sict/theme/hpgp/service/impl/HpgpBusyIdlePredictionServiceImpl.java index ee9e01e2937899109555c3dbf2952c983d52107c..b5e6bf020e5adbaa3899c50015937480f8e1c651 100644 --- a/smart-health-modules/theme-schema/src/main/java/cn/sh/stc/sict/theme/hpgp/service/impl/HpgpBusyIdlePredictionServiceImpl.java +++ b/smart-health-modules/theme-schema/src/main/java/cn/sh/stc/sict/theme/hpgp/service/impl/HpgpBusyIdlePredictionServiceImpl.java @@ -5,9 +5,11 @@ import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.date.DatePattern; import cn.hutool.core.date.DateTime; import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.StrUtil; import cn.hutool.db.DaoTemplate; import cn.hutool.json.JSONArray; import cn.hutool.json.JSONUtil; +import cn.sh.stc.sict.cloud.common.core.constant.RedisCacheConstant; import cn.sh.stc.sict.cloud.common.core.util.NumberUtil; import cn.sh.stc.sict.cloud.common.core.util.R; import cn.sh.stc.sict.theme.hpgp.dao.HpgpBusyIdlePredictionMapper; @@ -22,9 +24,12 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.data.redis.core.StringRedisTemplate; import org.springframework.stereotype.Service; import java.util.*; +import java.util.concurrent.TimeUnit; import java.util.stream.Collectors; /** @@ -38,6 +43,7 @@ import java.util.stream.Collectors; @Service("hpgpBusyIdlPredictionService") public class HpgpBusyIdlePredictionServiceImpl extends ServiceImpl implements HpgpBusyIdlePredictionService { private final HpgpDepartmentRankMapper departmentRankMapper; + private final StringRedisTemplate stringRedisTemplate; @Override public List busyIdlePrediction(String deptName) { @@ -53,60 +59,74 @@ public class HpgpBusyIdlePredictionServiceImpl extends ServiceImpl result = new ArrayList<>(); rankList.forEach(rank -> { List rankResult = new ArrayList<>(); - DeptInfo deptInfo = new DeptInfo(); - deptInfo.setHosOrgCode(rank.getHospitalCode()); - deptInfo.setOneDeptCode(rank.getOneDeptCode()); - deptInfo.setDeptCode(rank.getSubDeptCode()); - List outPatInfo = WanDaHttpUtil.getResourceOutPatInfo(deptInfo); - if (CollUtil.isNotEmpty(outPatInfo)) { - Map dateResultMap = new HashMap<>(); - outPatInfo.forEach(pat -> { - NumSourceInfo numSourceInfo = new NumSourceInfo(); - numSourceInfo.setHosOrgCode(rank.getHospitalCode()); - numSourceInfo.setOneDeptCode(rank.getOneDeptCode()); - numSourceInfo.setDeptCode(rank.getSubDeptCode()); - numSourceInfo.setStartTime(DateUtil.format(startTime, DatePattern.NORM_DATE_FORMAT)); - numSourceInfo.setEndTime(DateUtil.format(endTime, DatePattern.NORM_DATE_FORMAT)); - numSourceInfo.setOrderType(WanDaConstant.ORDER_TYPE_CLINC); - numSourceInfo.setPatient_type(WanDaConstant.PATIENT_TYPE_NORMAL); - numSourceInfo.setResourceCode(pat.getResourceCode()); - List orderNumInfo = WanDaHttpUtil.getOrderNumInfo(numSourceInfo); - if (CollUtil.isNotEmpty(orderNumInfo)) { - Map> dateMap = orderNumInfo.stream().collect(Collectors.groupingBy(NumSourceInfo::getScheduleDate)); - dateMap.forEach((date, numList) -> { - DeptPredictionVO vo = dateResultMap.getOrDefault(date, new DeptPredictionVO()); - vo.setDeptCode(rank.getDeptCode()); - vo.setDeptName(rank.getDeptName()); - vo.setHospitalName(rank.getHospitalName()); - vo.setHospitalCode(rank.getHospitalCode()); - vo.setPredictionDate(DateUtil.parseDate(date)); - int reserveOrderNum = numList.stream().mapToInt(NumSourceInfo::getReserveOrderNum).sum(); - vo.setReserveOrderNum(NumberUtil.isNullOrZero(vo.getReserveOrderNum()) ? reserveOrderNum : vo.getReserveOrderNum() + reserveOrderNum); - int remain = numList.stream().mapToInt(NumSourceInfo::getRemainNum).sum(); - vo.setRemainNum(NumberUtil.isNullOrZero(vo.getRemainNum()) ? remain : vo.getRemainNum() + remain); - vo.setScoreByNum(); - dateResultMap.put(date, vo); - }); - } - }); - dateResultMap.forEach((k, v) -> { - rankResult.add(v); - }); + String key = RedisCacheConstant.DEPT_NUM_SOURCE_RESULT + ":" + rank.getHospitalCode(); + if (StrUtil.isNotBlank(rank.getOneDeptCode())) { + key = key + ":" + rank.getOneDeptCode(); + } + if (StrUtil.isNotBlank(rank.getSubDeptCode())) { + key = key + ":" + rank.getSubDeptCode(); } - // 生成无号源信息 - if (CollUtil.isEmpty(rankResult)) { - for (Date i = DateUtil.offsetDay(startTime, 1); DateUtil.compare(i, endTime) < 1; i = DateUtil.offsetDay(i, 1)) { - DeptPredictionVO vo = new DeptPredictionVO(); - vo.setDeptCode(rank.getDeptCode()); - vo.setDeptName(rank.getDeptName()); - vo.setHospitalName(rank.getHospitalName()); - vo.setHospitalCode(rank.getHospitalCode()); - vo.setPredictionDate(i); - vo.setScoreByNum(); - result.add(vo); + if (stringRedisTemplate.hasKey(key)) { + String str = stringRedisTemplate.opsForValue().get(key); + JSONArray array = JSONUtil.parseArray(str); + result.addAll(JSONUtil.toList(array, DeptPredictionVO.class)); + } else { + DeptInfo deptInfo = new DeptInfo(); + deptInfo.setHosOrgCode(rank.getHospitalCode()); + deptInfo.setOneDeptCode(rank.getOneDeptCode()); + deptInfo.setDeptCode(rank.getSubDeptCode()); + List outPatInfo = WanDaHttpUtil.getResourceOutPatInfo(deptInfo); + if (CollUtil.isNotEmpty(outPatInfo)) { + Map dateResultMap = new HashMap<>(); + outPatInfo.forEach(pat -> { + NumSourceInfo numSourceInfo = new NumSourceInfo(); + numSourceInfo.setHosOrgCode(rank.getHospitalCode()); + numSourceInfo.setOneDeptCode(rank.getOneDeptCode()); + numSourceInfo.setDeptCode(rank.getSubDeptCode()); + numSourceInfo.setStartTime(DateUtil.format(startTime, DatePattern.NORM_DATE_FORMAT)); + numSourceInfo.setEndTime(DateUtil.format(endTime, DatePattern.NORM_DATE_FORMAT)); + numSourceInfo.setOrderType(WanDaConstant.ORDER_TYPE_CLINC); + numSourceInfo.setPatient_type(WanDaConstant.PATIENT_TYPE_NORMAL); + numSourceInfo.setResourceCode(pat.getResourceCode()); + List orderNumInfo = WanDaHttpUtil.getOrderNumInfo(numSourceInfo); + if (CollUtil.isNotEmpty(orderNumInfo)) { + Map> dateMap = orderNumInfo.stream().collect(Collectors.groupingBy(NumSourceInfo::getScheduleDate)); + dateMap.forEach((date, numList) -> { + DeptPredictionVO vo = dateResultMap.getOrDefault(date, new DeptPredictionVO()); + vo.setDeptCode(rank.getDeptCode()); + vo.setDeptName(rank.getDeptName()); + vo.setHospitalName(rank.getHospitalName()); + vo.setHospitalCode(rank.getHospitalCode()); + vo.setPredictionDate(DateUtil.parseDate(date)); + int reserveOrderNum = numList.stream().mapToInt(NumSourceInfo::getReserveOrderNum).sum(); + vo.setReserveOrderNum(NumberUtil.isNullOrZero(vo.getReserveOrderNum()) ? reserveOrderNum : vo.getReserveOrderNum() + reserveOrderNum); + int remain = numList.stream().mapToInt(NumSourceInfo::getRemainNum).sum(); + vo.setRemainNum(NumberUtil.isNullOrZero(vo.getRemainNum()) ? remain : vo.getRemainNum() + remain); + vo.setScoreByNum(); + dateResultMap.put(date, vo); + }); + } + }); + dateResultMap.forEach((k, v) -> { + rankResult.add(v); + }); + } + // 生成无号源信息 + if (CollUtil.isEmpty(rankResult)) { + for (Date i = DateUtil.offsetDay(startTime, 1); DateUtil.compare(i, endTime) < 1; i = DateUtil.offsetDay(i, 1)) { + DeptPredictionVO vo = new DeptPredictionVO(); + vo.setDeptCode(rank.getDeptCode()); + vo.setDeptName(rank.getDeptName()); + vo.setHospitalName(rank.getHospitalName()); + vo.setHospitalCode(rank.getHospitalCode()); + vo.setPredictionDate(i); + vo.setScoreByNum(); + rankResult.add(vo); + } } + stringRedisTemplate.opsForValue().set(key, JSONUtil.toJsonStr(rankResult), 4, TimeUnit.HOURS); + result.addAll(rankResult); } - result.addAll(rankResult); }); return result; } diff --git a/smart-health-modules/theme-schema/src/main/java/cn/sh/stc/sict/theme/hphy/controller/mp/WDController.java b/smart-health-modules/theme-schema/src/main/java/cn/sh/stc/sict/theme/hphy/controller/mp/WDController.java index dcff87b52a41f5fd309accee8ff716ab47471026..593ff3ae1ad84e6bcfd038305927129e20738e8b 100644 --- a/smart-health-modules/theme-schema/src/main/java/cn/sh/stc/sict/theme/hphy/controller/mp/WDController.java +++ b/smart-health-modules/theme-schema/src/main/java/cn/sh/stc/sict/theme/hphy/controller/mp/WDController.java @@ -3,6 +3,7 @@ package cn.sh.stc.sict.theme.hphy.controller.mp; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.lang.Validator; import cn.hutool.core.util.RandomUtil; +import cn.hutool.json.JSONUtil; import cn.sh.stc.sict.cloud.common.core.constant.Constant; import cn.sh.stc.sict.cloud.common.core.util.R; import cn.sh.stc.sict.cloud.common.core.util.ValidateCodeUtil; @@ -21,6 +22,7 @@ import org.springframework.data.redis.core.StringRedisTemplate; import org.springframework.web.bind.annotation.*; import java.util.List; +import java.util.stream.Collectors; /** * @author F_xh @@ -72,7 +74,18 @@ public class WDController { @GetMapping("/num/info") public R getOrderNumberInfo(NumSourceInfo numSourceInfo) { + // 医生查询所有号源能查到,查询指定类型号源差不多,20220715处理:查询所有,过滤 + String orderNumType = numSourceInfo.getOrderNumType(); + if(WanDaConstant.ORDER_TYPE_OUTP.equals(numSourceInfo.getOrderType())){ + numSourceInfo.setOrderNumType(null); + } List list = WanDaHttpUtil.getOrderNumInfo(numSourceInfo); + if(WanDaConstant.ORDER_TYPE_OUTP.equals(numSourceInfo.getOrderType())){ + List result = list.stream().filter(i -> orderNumType.equals(i.getOrderNumType())).collect(Collectors.toList()); + return new R(result); + }else{ + return new R(list); + } // if (CollUtil.isNotEmpty(list)) { // return R.builder().code(Constant.BYTE_YES).data(list).bizCode(Constant.INT_NO).build(); @@ -90,7 +103,7 @@ public class WDController { // // return new R(list); // } - return new R().success(list); +// return new R().success(list); } @ApiOperation("获取测压亭列表") @@ -98,4 +111,5 @@ public class WDController { public R getPressureStationList(){ return new R(); } + } diff --git a/smart-health-modules/theme-schema/src/main/java/cn/sh/stc/sict/theme/hphy/service/impl/HpDeptInfoServiceImpl.java b/smart-health-modules/theme-schema/src/main/java/cn/sh/stc/sict/theme/hphy/service/impl/HpDeptInfoServiceImpl.java index 00695a0ef2626e919b7e84669731bde9f39198bf..0dfe947354f1cec098795e3a6bcbe0266e689233 100644 --- a/smart-health-modules/theme-schema/src/main/java/cn/sh/stc/sict/theme/hphy/service/impl/HpDeptInfoServiceImpl.java +++ b/smart-health-modules/theme-schema/src/main/java/cn/sh/stc/sict/theme/hphy/service/impl/HpDeptInfoServiceImpl.java @@ -1,5 +1,9 @@ package cn.sh.stc.sict.theme.hphy.service.impl; +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.date.DatePattern; +import cn.hutool.core.date.DateUtil; +import cn.hutool.json.JSONUtil; import cn.sh.stc.sict.theme.hphy.constant.DataConstant; import cn.sh.stc.sict.theme.hphy.dao.HpDeptInfoMapper; import cn.sh.stc.sict.theme.hphy.dao.HpDocInfoMapper; @@ -8,17 +12,21 @@ import cn.sh.stc.sict.theme.hphy.model.HpDeptInfo; import cn.sh.stc.sict.theme.hphy.model.HpDocInfo; import cn.sh.stc.sict.theme.hphy.model.HpHosInfo; import cn.sh.stc.sict.theme.hphy.service.HpDeptInfoService; +import cn.sh.stc.sict.theme.hphy.service.HpDocInfoService; +import cn.sh.stc.sict.theme.hphy.service.HpHosInfoService; import cn.sh.stc.sict.theme.hphy.vo.DeptDoctorsVO; -import cn.sh.stc.sict.theme.hphy.wd.DeptInfo; -import cn.sh.stc.sict.theme.hphy.wd.OutPatInfo; -import cn.sh.stc.sict.theme.hphy.wd.WanDaHttpUtil; +import cn.sh.stc.sict.theme.hphy.wd.*; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; +import java.util.ArrayList; import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.stream.Collectors; /** * (HpDeptInfo)表服务实现类 @@ -30,23 +38,23 @@ import java.util.List; @AllArgsConstructor @Service("hpDeptInfoService") public class HpDeptInfoServiceImpl extends ServiceImpl implements HpDeptInfoService { - private final HpDocInfoMapper hpDocInfoMapper; - private final HpHosInfoMapper hpHosInfoMapper; + private final HpDocInfoService hpDocInfoService; + private final HpHosInfoService hpHosInfoService; @Override public DeptDoctorsVO getDeptDoctors(String hospitalCode, String deptCode) { - HpHosInfo hosInfo = hpHosInfoMapper.selectById(hospitalCode); + HpHosInfo hosInfo = hpHosInfoService.getById(hospitalCode); // 查询科室信息 // 查询医生信息 HpDeptInfo deptInfo = this.getOne( new LambdaQueryWrapper() .eq(HpDeptInfo::getHosOrgCode, hospitalCode) .and(i -> i.eq(HpDeptInfo::getOneDeptCode, deptCode) - .or().eq(HpDeptInfo::getDeptCode, deptCode)) + .or().eq(HpDeptInfo::getDeptCode, deptCode)) .orderByDesc(HpDeptInfo::getDeptLevel) .last("limit 1") ); - if (deptInfo == null){ + if (deptInfo == null) { log.error("根据医院编码:{} 和科室编码:{} 未查出科室信息", hospitalCode, deptCode); return null; } @@ -54,22 +62,93 @@ public class HpDeptInfoServiceImpl extends ServiceImpl docWrapper = new LambdaQueryWrapper<>(); docWrapper.eq(HpDocInfo::getHosOrgCode, hospitalCode); docWrapper.eq(HpDocInfo::getOneDeptCode, deptInfo.getOneDeptCode()); - if (DataConstant.TWO_DEPT.equals(deptInfo.getDeptLevel())){ + if (DataConstant.TWO_DEPT.equals(deptInfo.getDeptLevel())) { docWrapper.eq(HpDocInfo::getDeptCode, deptInfo.getDeptCode()); } docWrapper.orderByAsc(HpDocInfo::getIndexNo); - List doctors = hpDocInfoMapper.selectList(docWrapper); + List doctors = hpDocInfoService.list(docWrapper); + - // 查询可预约医生信息 - // DeptInfo info = new DeptInfo(); - // List resourceDoctInfo = WanDaHttpUtil.getResourceDoctInfo(info); DeptInfo info = new DeptInfo(); info.setHosOrgCode(deptInfo.getHosOrgCode()); info.setOneDeptCode(deptInfo.getOneDeptCode()); info.setDeptCode(deptInfo.getDeptCode()); List resourceOutPatInfo = WanDaHttpUtil.getResourceOutPatInfo(info); + List resourceDoctInfo = WanDaHttpUtil.getResourceDoctInfo(info); + List remainDoctors = this.getRemainDoctList(doctors, resourceDoctInfo); + + return new DeptDoctorsVO(hosInfo, deptInfo, resourceOutPatInfo, remainDoctors); + } + + private List getRemainDoctList(List doctors, List resourceDoctInfo) { + Map doctorMap = doctors.stream().collect(Collectors.groupingBy(HpDocInfo::getResourceCode, Collectors.collectingAndThen(Collectors.toList(), x -> x.get(0)))); + List remainDoctors = new ArrayList<>(); + resourceDoctInfo.forEach(res -> { + if(doctorMap.containsKey(res.getResourceCode())){ + remainDoctors.add(doctorMap.get(res.getResourceCode())); + }else{ + HpDocInfo doctor = BeanUtil.toBean(res, HpDocInfo.class); + hpDocInfoService.save(doctor); + remainDoctors.add(doctor); + } + }); - return new DeptDoctorsVO(hosInfo, deptInfo, resourceOutPatInfo, doctors); + return remainDoctors; } + +// public static void main(String[] args) { +// +// DeptInfo info = new DeptInfo(); +// info.setHosOrgCode("42503527600"); +// info.setOneDeptCode("1013"); +// info.setDeptCode("3122"); +// List resourceOutPatInfo = WanDaHttpUtil.getResourceOutPatInfo(info); +// List resourceDoctInfo = WanDaHttpUtil.getResourceDoctInfo(info); +// log.error("OutPatInfo = {}", JSONUtil.toJsonStr(resourceOutPatInfo)); +// log.error("========================="); +// log.error("DoctInfo = {}", JSONUtil.toJsonStr(resourceDoctInfo)); +// +// DoctInfo doctInfo = resourceDoctInfo.get(0); +// NumSourceInfo numSourceInfo = new NumSourceInfo(); +// numSourceInfo.setHosOrgCode(doctInfo.getHosOrgCode()); +// numSourceInfo.setOneDeptCode(doctInfo.getOneDeptCode()); +// numSourceInfo.setDeptCode(doctInfo.getDeptCode()); +// numSourceInfo.setOrderType(WanDaConstant.ORDER_TYPE_OUTP); +// numSourceInfo.setResourceCode(doctInfo.getResourceCode()); +// numSourceInfo.setPatient_type(WanDaConstant.PATIENT_TYPE_NORMAL); +// numSourceInfo.setStartTime("2022-07-15"); +// numSourceInfo.setEndTime("2022-07-22"); +// numSourceInfo.setOrderNumType("102"); +// +// List orderNumInfo = WanDaHttpUtil.getOrderNumInfo(numSourceInfo); +// log.error("========================="); +// log.error("numInfo = {}", JSONUtil.toJsonStr(orderNumInfo)); +// } + + +// public static void main(String[] args) { +// NumSourceInfo numSourceInfo = new NumSourceInfo(); +// numSourceInfo.setHosOrgCode("42503527600"); +// numSourceInfo.setOneDeptCode("1013"); +// numSourceInfo.setDeptCode("3122"); +// numSourceInfo.setOrderType(WanDaConstant.ORDER_TYPE_OUTP); +// numSourceInfo.setResourceCode("10220"); +// numSourceInfo.setPatient_type(WanDaConstant.PATIENT_TYPE_NORMAL); +// numSourceInfo.setStartTime("2022-07-15"); +// numSourceInfo.setEndTime("2022-07-22"); +// numSourceInfo.setOrderNumType("102"); +// +// String orderNumType = numSourceInfo.getOrderNumType(); +// if(WanDaConstant.ORDER_TYPE_OUTP.equals(numSourceInfo.getOrderType())){ +// numSourceInfo.setOrderNumType(null); +// } +// List list = WanDaHttpUtil.getOrderNumInfo(numSourceInfo); +// if(WanDaConstant.ORDER_TYPE_OUTP.equals(numSourceInfo.getOrderType())){ +// List result = list.stream().filter(i -> orderNumType.equals(i.getOrderNumType())).collect(Collectors.toList()); +// log.error("result = {}", JSONUtil.toJsonStr(result)); +// }else{ +// log.error("list = {}", JSONUtil.toJsonStr(list)); +// } +// } }