From 21fa25279fb121a5b2b35d80830fbe25bbca91af Mon Sep 17 00:00:00 2001 From: fshenye <12345678> Date: Wed, 3 Aug 2022 13:53:40 +0800 Subject: [PATCH] =?UTF-8?q?1.=20=E5=AE=9A=E6=97=B6=E4=BB=BB=E5=8A=A1?= =?UTF-8?q?=EF=BC=8C=E6=AF=8F=E6=97=A512=E7=82=B9=EF=BC=8C24=E7=82=B9?= =?UTF-8?q?=E7=BB=9F=E8=AE=A1=E6=8E=92=E8=A1=8C=E7=A7=91=E5=AE=A4=E5=8F=B7?= =?UTF-8?q?=E6=BA=90=E4=BF=A1=E6=81=AF=EF=BC=8C=E4=BF=AE=E6=94=B9=E5=8E=9F?= =?UTF-8?q?=E6=9D=A5=E8=AE=A1=E7=AE=97=E7=A7=91=E5=AE=A4=E5=8F=B7=E6=BA=90?= =?UTF-8?q?=E4=BF=A1=E6=81=AF=E6=8E=A5=E5=8F=A3=202.=20bugfix=EF=BC=9A?= =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E6=96=B0=E7=94=A8=E6=88=B7=E9=9C=80=E8=A6=81?= =?UTF-8?q?=E5=AE=8C=E5=96=84=E4=BF=A1=E6=81=AF=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cloud/common/core/dto/WDUserInfo.java | 1 + .../service/impl/SysUserBaseServiceImpl.java | 12 +- .../hpgp/model/HpgpBusyIdlePrediction.java | 60 ++++- .../HpgpBusyIdlePredictionService.java | 7 +- .../HpgpBusyIdlePredictionServiceImpl.java | 215 +++++++++++------- .../impl/HpgpDepartmentRankServiceImpl.java | 5 + .../sict/theme/hpgp/vo/DeptPredictionVO.java | 31 --- .../controller/mp/HpDeptInfoController.java | 27 ++- .../mp/HphyPatientBaseController.java | 7 + .../sict/theme/hphy/schedule/RefreshJob.java | 25 ++ .../service/impl/HpDeptInfoServiceImpl.java | 49 ++-- .../impl/HphyPatientBaseServiceImpl.java | 12 +- 12 files changed, 286 insertions(+), 165 deletions(-) delete mode 100644 smart-health-modules/theme-schema/src/main/java/cn/sh/stc/sict/theme/hpgp/vo/DeptPredictionVO.java diff --git a/cloud-common/cloud-common-core/src/main/java/cn/sh/stc/sict/cloud/common/core/dto/WDUserInfo.java b/cloud-common/cloud-common-core/src/main/java/cn/sh/stc/sict/cloud/common/core/dto/WDUserInfo.java index 08042a1..4ddaa6d 100644 --- a/cloud-common/cloud-common-core/src/main/java/cn/sh/stc/sict/cloud/common/core/dto/WDUserInfo.java +++ b/cloud-common/cloud-common-core/src/main/java/cn/sh/stc/sict/cloud/common/core/dto/WDUserInfo.java @@ -12,6 +12,7 @@ public class WDUserInfo { private String token; private String id; private String username; + private String name; private String personcard; private String mobile; private Date birth; diff --git a/smart-health-modules/cloud-upms/cloud-upms-biz/src/main/java/cn/sh/stc/sict/cloud/upms/service/impl/SysUserBaseServiceImpl.java b/smart-health-modules/cloud-upms/cloud-upms-biz/src/main/java/cn/sh/stc/sict/cloud/upms/service/impl/SysUserBaseServiceImpl.java index dcac836..aaf1fef 100644 --- a/smart-health-modules/cloud-upms/cloud-upms-biz/src/main/java/cn/sh/stc/sict/cloud/upms/service/impl/SysUserBaseServiceImpl.java +++ b/smart-health-modules/cloud-upms/cloud-upms-biz/src/main/java/cn/sh/stc/sict/cloud/upms/service/impl/SysUserBaseServiceImpl.java @@ -2,17 +2,16 @@ package cn.sh.stc.sict.cloud.upms.service.impl; import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; +import cn.hutool.json.JSONUtil; import cn.sh.stc.sict.cloud.common.core.constant.Constant; import cn.sh.stc.sict.cloud.common.core.constant.UserConstant; import cn.sh.stc.sict.cloud.common.core.constant.enums.LoginTypeEnum; -import cn.sh.stc.sict.cloud.common.core.dto.WDUserCardInfo; import cn.sh.stc.sict.cloud.common.core.dto.WDUserInfo; import cn.sh.stc.sict.cloud.common.core.util.NumberUtil; import cn.sh.stc.sict.cloud.common.core.util.SsbUtil; import cn.sh.stc.sict.cloud.upms.dao.SysUserBaseMapper; import cn.sh.stc.sict.cloud.upms.dto.UserDTO; import cn.sh.stc.sict.cloud.upms.dto.UserInfo; -import cn.sh.stc.sict.cloud.upms.model.HpUserRole; import cn.sh.stc.sict.cloud.upms.model.SysUserBase; import cn.sh.stc.sict.cloud.upms.service.HpUserRoleService; import cn.sh.stc.sict.cloud.upms.service.SysUserBaseService; @@ -28,8 +27,6 @@ import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.stereotype.Service; -import java.util.List; - @Slf4j @Service("sysUserBaseService") @AllArgsConstructor @@ -74,6 +71,7 @@ public class SysUserBaseServiceImpl extends ServiceImpl cardList = SsbUtil.getUserCardInfoList(token); + // List cardList = SsbUtil.getUserCardInfoList(token); } UserInfo info = new UserInfo(); diff --git a/smart-health-modules/theme-schema/src/main/java/cn/sh/stc/sict/theme/hpgp/model/HpgpBusyIdlePrediction.java b/smart-health-modules/theme-schema/src/main/java/cn/sh/stc/sict/theme/hpgp/model/HpgpBusyIdlePrediction.java index a286e5d..a224dfa 100644 --- a/smart-health-modules/theme-schema/src/main/java/cn/sh/stc/sict/theme/hpgp/model/HpgpBusyIdlePrediction.java +++ b/smart-health-modules/theme-schema/src/main/java/cn/sh/stc/sict/theme/hpgp/model/HpgpBusyIdlePrediction.java @@ -1,13 +1,15 @@ package cn.sh.stc.sict.theme.hpgp.model; -import java.util.Date; - +import cn.sh.stc.sict.cloud.common.core.util.NumberUtil; +import com.baomidou.mybatisplus.annotation.FieldFill; +import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.extension.activerecord.Model; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import lombok.EqualsAndHashCode; import java.io.Serializable; +import java.util.Date; /** * 黄浦全科导诊——忙闲预测(HpgpBusyIdle_ prediction)表实体类 @@ -18,22 +20,64 @@ import java.io.Serializable; @Data @EqualsAndHashCode(callSuper = true) public class HpgpBusyIdlePrediction extends Model { + private Long id; //医院代码 - @ApiModelProperty(hidden = false, value = "医院代码") + @ApiModelProperty( value = "医院代码") private String hospitalCode; //医院名称 - @ApiModelProperty(hidden = false, value = "医院名称") + @ApiModelProperty(value = "医院名称") private String hospitalName; + private String oneDeptCode; //科室代码 - @ApiModelProperty(hidden = false, value = "科室代码") + @ApiModelProperty(value = "科室代码") private String deptCode; //科室名称 - @ApiModelProperty(hidden = false, value = "科室名称") + @ApiModelProperty(value = "科室名称") private String deptName; //预测日期 - @ApiModelProperty(hidden = false, value = "预测日期") + @ApiModelProperty(value = "预测日期") private Date predictionDate; + // 总号源数量 + private Integer reserveOrderNum; + // 可预约号源数量 + private Integer remainNum; //忙闲评分 - @ApiModelProperty(hidden = false, value = "忙闲评分") + @ApiModelProperty(value = "忙闲评分") private Integer score; + @TableField(fill = FieldFill.INSERT) + private Date createTime; + @TableField(fill = FieldFill.UPDATE) + private Date updateTime; + + + /** + * 获取主键值 + * + * @return 主键值 + */ + @Override + protected Serializable pkVal() { + return this.id; + } + + + // 可用号源 / 号源 + // >=0.5 0- 闲 -绿色 + // 0.2-0.5 1-忙碌-黄色 + // <=0.2 2-非常忙碌-红色 + // 无号院 -1 灰色 + public void setScoreByNum() { + if (NumberUtil.isNotNullOrZero(this.reserveOrderNum)) { + double roate = this.remainNum * 1.0 / this.reserveOrderNum; + if (roate >= 0.5) { + this.setScore(0); + } else if (roate > 0.2 && roate < 0.5) { + this.setScore(1); + } else { + this.setScore(2); + } + } else { + this.setScore(-1); + } + } } diff --git a/smart-health-modules/theme-schema/src/main/java/cn/sh/stc/sict/theme/hpgp/service/HpgpBusyIdlePredictionService.java b/smart-health-modules/theme-schema/src/main/java/cn/sh/stc/sict/theme/hpgp/service/HpgpBusyIdlePredictionService.java index b81c3c7..30b266f 100644 --- a/smart-health-modules/theme-schema/src/main/java/cn/sh/stc/sict/theme/hpgp/service/HpgpBusyIdlePredictionService.java +++ b/smart-health-modules/theme-schema/src/main/java/cn/sh/stc/sict/theme/hpgp/service/HpgpBusyIdlePredictionService.java @@ -1,9 +1,10 @@ package cn.sh.stc.sict.theme.hpgp.service; import cn.sh.stc.sict.theme.hpgp.model.HpgpBusyIdlePrediction; -import cn.sh.stc.sict.theme.hpgp.vo.DeptPredictionVO; +import cn.sh.stc.sict.theme.hpgp.model.HpgpDepartmentRank; import com.baomidou.mybatisplus.extension.service.IService; +import java.util.Date; import java.util.List; /** @@ -20,5 +21,7 @@ public interface HpgpBusyIdlePredictionService extends IService busyIdlePrediction(String deptName); + List busyIdlePrediction(String deptName); + + void statisticResourceInfo(HpgpDepartmentRank dept, Date startDate, Date endDate); } 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 b5e6bf0..d543b75 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,31 +5,23 @@ 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; import cn.sh.stc.sict.theme.hpgp.dao.HpgpDepartmentRankMapper; import cn.sh.stc.sict.theme.hpgp.model.HpgpBusyIdlePrediction; import cn.sh.stc.sict.theme.hpgp.model.HpgpDepartmentRank; import cn.sh.stc.sict.theme.hpgp.service.HpgpBusyIdlePredictionService; -import cn.sh.stc.sict.theme.hpgp.vo.DeptPredictionVO; import cn.sh.stc.sict.theme.hpgp.vo.DeptRankVO; 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.data.redis.core.RedisTemplate; -import org.springframework.data.redis.core.StringRedisTemplate; +import org.springframework.scheduling.annotation.Async; import org.springframework.stereotype.Service; import java.util.*; -import java.util.concurrent.TimeUnit; import java.util.stream.Collectors; /** @@ -43,10 +35,9 @@ 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) { + public List busyIdlePrediction(String deptName) { // 查询科室排名 // 组装医院代码、科室代码 // 查询医院忙闲 @@ -55,79 +46,147 @@ public class HpgpBusyIdlePredictionServiceImpl extends ServiceImpl result = new ArrayList<>(); + DateTime endTime = DateUtil.offsetDay(DateUtil.date(), 6); + + List result = new ArrayList<>(); rankList.forEach(rank -> { - List rankResult = new ArrayList<>(); - 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 (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); - }); - } + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(HpgpBusyIdlePrediction::getHospitalCode, rank.getHospitalCode()) + .eq(HpgpBusyIdlePrediction::getOneDeptCode, rank.getOneDeptCode()) + .eq(HpgpBusyIdlePrediction::getDeptCode, rank.getDeptCode()) + .between(HpgpBusyIdlePrediction::getPredictionDate, DateUtil.format(startTime, DatePattern.NORM_DATE_FORMAT), DateUtil.format(endTime, DatePattern.NORM_DATE_FORMAT)) + .orderByAsc(HpgpBusyIdlePrediction::getPredictionDate); + List list = this.list(wrapper); + if (CollUtil.isNotEmpty(list)) { + Map dateMap = list.stream().collect(Collectors.groupingBy(HpgpBusyIdlePrediction::getPredictionDate, Collectors.collectingAndThen(Collectors.toList(), x -> x.get(0)))); // 生成无号源信息 - 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); + for (Date i = startTime; DateUtil.compare(i, endTime) < 1; i = DateUtil.offsetDay(i, 1)) { + Date key = DateUtil.beginOfDay(i); + if (dateMap.containsKey(key)) { + result.add(dateMap.get(key)); + } else { + result.add(this.getNoneSourcePredictionInfo(rank, i)); } } - stringRedisTemplate.opsForValue().set(key, JSONUtil.toJsonStr(rankResult), 4, TimeUnit.HOURS); - result.addAll(rankResult); + } else { + // 生成无号源信息 + for (Date i = startTime; DateUtil.compare(i, endTime) < 1; i = DateUtil.offsetDay(i, 1)) { + result.add(this.getNoneSourcePredictionInfo(rank, i)); + } } }); return result; } + + private HpgpBusyIdlePrediction getNoneSourcePredictionInfo(DeptRankVO rank, Date i) { + HpgpBusyIdlePrediction vo = new HpgpBusyIdlePrediction(); + vo.setDeptCode(rank.getDeptCode()); + vo.setDeptName(rank.getDeptName()); + vo.setHospitalName(rank.getHospitalName()); + vo.setHospitalCode(rank.getHospitalCode()); + vo.setPredictionDate(i); + vo.setScoreByNum(); + return vo; + } + + @Async + @Override + public void statisticResourceInfo(HpgpDepartmentRank dept, Date startDate, Date endDate) { + DeptInfo deptInfo = new DeptInfo(); + deptInfo.setHosOrgCode(dept.getHospitalCode()); + deptInfo.setOneDeptCode(dept.getOneDeptCode()); + deptInfo.setDeptCode(dept.getDeptCode()); + List outList = WanDaHttpUtil.getResourceOutPatInfo(deptInfo); + List docList = WanDaHttpUtil.getResourceDoctInfo(deptInfo); + if (CollUtil.isEmpty(outList) && CollUtil.isEmpty(docList)) { + return; + } + Map dateResultMap = new HashMap<>(); + this.getOutResourceInfo(dept, outList, dateResultMap, startDate, endDate); + this.getDocResourceInfo(dept, docList, dateResultMap, startDate, endDate); + if (CollUtil.isNotEmpty(dateResultMap)) { + dateResultMap.forEach((k, v) -> { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(HpgpBusyIdlePrediction::getHospitalCode, v.getHospitalCode()) + .eq(HpgpBusyIdlePrediction::getOneDeptCode, v.getOneDeptCode()) + .eq(HpgpBusyIdlePrediction::getDeptCode, v.getDeptCode()) + .eq(HpgpBusyIdlePrediction::getPredictionDate, v.getPredictionDate()); + this.saveOrUpdate(v, wrapper); + }); + } + } + + private void getDocResourceInfo(HpgpDepartmentRank + dept, List docList, Map dateResultMap, Date startDate, Date + endDate) { + if (CollUtil.isNotEmpty(docList)) { + docList.forEach(doc -> { + NumSourceInfo numSourceInfo = new NumSourceInfo(); + numSourceInfo.setHosOrgCode(dept.getHospitalCode()); + numSourceInfo.setOneDeptCode(dept.getOneDeptCode()); + numSourceInfo.setDeptCode(dept.getDeptCode()); + numSourceInfo.setStartTime(DateUtil.format(startDate, DatePattern.NORM_DATE_FORMAT)); + numSourceInfo.setEndTime(DateUtil.format(endDate, DatePattern.NORM_DATE_FORMAT)); + numSourceInfo.setOrderType(WanDaConstant.ORDER_TYPE_OUTP); + numSourceInfo.setPatient_type(WanDaConstant.PATIENT_TYPE_NORMAL); + numSourceInfo.setResourceCode(doc.getResourceCode()); + List orderNumInfo = WanDaHttpUtil.getOrderNumInfo(numSourceInfo); + if (CollUtil.isNotEmpty(orderNumInfo)) { + Map> dateMap = orderNumInfo.stream().collect(Collectors.groupingBy(NumSourceInfo::getScheduleDate)); + dateMap.forEach((date, numList) -> { + HpgpBusyIdlePrediction vo = dateResultMap.getOrDefault(date, new HpgpBusyIdlePrediction()); + vo.setDeptCode(dept.getDeptCode()); + vo.setDeptName(dept.getDeptName()); + vo.setHospitalName(dept.getHospitalName()); + vo.setHospitalCode(dept.getHospitalCode()); + vo.setPredictionDate(DateUtil.parseDate(date)); + vo.setOneDeptCode(dept.getOneDeptCode()); + 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); + }); + } + }); + } + } + + private void getOutResourceInfo(HpgpDepartmentRank + dept, List outList, Map dateResultMap, Date startDate, Date + endDate) { + if (CollUtil.isNotEmpty(outList)) { + outList.forEach(pat -> { + NumSourceInfo numSourceInfo = new NumSourceInfo(); + numSourceInfo.setHosOrgCode(dept.getHospitalCode()); + numSourceInfo.setOneDeptCode(dept.getOneDeptCode()); + numSourceInfo.setDeptCode(dept.getDeptCode()); + numSourceInfo.setStartTime(DateUtil.format(startDate, DatePattern.NORM_DATE_FORMAT)); + numSourceInfo.setEndTime(DateUtil.format(endDate, 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) -> { + HpgpBusyIdlePrediction vo = dateResultMap.getOrDefault(date, new HpgpBusyIdlePrediction()); + vo.setDeptCode(dept.getDeptCode()); + vo.setDeptName(dept.getDeptName()); + vo.setHospitalName(dept.getHospitalName()); + vo.setHospitalCode(dept.getHospitalCode()); + vo.setPredictionDate(DateUtil.parseDate(date)); + vo.setOneDeptCode(dept.getOneDeptCode()); + 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); + }); + } + }); + } + } } diff --git a/smart-health-modules/theme-schema/src/main/java/cn/sh/stc/sict/theme/hpgp/service/impl/HpgpDepartmentRankServiceImpl.java b/smart-health-modules/theme-schema/src/main/java/cn/sh/stc/sict/theme/hpgp/service/impl/HpgpDepartmentRankServiceImpl.java index 22217a0..9a35051 100644 --- a/smart-health-modules/theme-schema/src/main/java/cn/sh/stc/sict/theme/hpgp/service/impl/HpgpDepartmentRankServiceImpl.java +++ b/smart-health-modules/theme-schema/src/main/java/cn/sh/stc/sict/theme/hpgp/service/impl/HpgpDepartmentRankServiceImpl.java @@ -2,11 +2,14 @@ package cn.sh.stc.sict.theme.hpgp.service.impl; import cn.hutool.core.collection.CollUtil; import cn.hutool.json.JSONUtil; +import cn.sh.stc.sict.theme.hpgp.model.HpgpBusyIdlePrediction; +import cn.sh.stc.sict.theme.hpgp.service.HpgpBusyIdlePredictionService; import cn.sh.stc.sict.theme.hphy.wd.*; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import cn.sh.stc.sict.theme.hpgp.dao.HpgpDepartmentRankMapper; import cn.sh.stc.sict.theme.hpgp.model.HpgpDepartmentRank; import cn.sh.stc.sict.theme.hpgp.service.HpgpDepartmentRankService; +import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.scheduling.annotation.Async; import org.springframework.stereotype.Service; @@ -20,9 +23,11 @@ import java.util.List; * @since 2022-01-14 09:56:47 */ @Slf4j +@AllArgsConstructor @Service("hpgpDepartmentRankService") public class HpgpDepartmentRankServiceImpl extends ServiceImpl implements HpgpDepartmentRankService { + @Override public void updateResource() { List deptList = this.list(); diff --git a/smart-health-modules/theme-schema/src/main/java/cn/sh/stc/sict/theme/hpgp/vo/DeptPredictionVO.java b/smart-health-modules/theme-schema/src/main/java/cn/sh/stc/sict/theme/hpgp/vo/DeptPredictionVO.java deleted file mode 100644 index 92a5021..0000000 --- a/smart-health-modules/theme-schema/src/main/java/cn/sh/stc/sict/theme/hpgp/vo/DeptPredictionVO.java +++ /dev/null @@ -1,31 +0,0 @@ -package cn.sh.stc.sict.theme.hpgp.vo; - -import cn.sh.stc.sict.cloud.common.core.util.NumberUtil; -import cn.sh.stc.sict.theme.hpgp.model.HpgpBusyIdlePrediction; -import lombok.Data; - -@Data -public class DeptPredictionVO extends HpgpBusyIdlePrediction { - private Integer reserveOrderNum; - private Integer remainNum; - - // 可用号源 / 号源 - // >=0.5 0- 闲 -绿色 - // 0.2-0.5 1-忙碌-黄色 - // <=0.2 2-非常忙碌-红色 - // 无号院 -1 灰色 - public void setScoreByNum() { - if (NumberUtil.isNotNullOrZero(this.reserveOrderNum)) { - double roate = this.remainNum * 1.0 / this.reserveOrderNum; - if (roate >= 0.5) { - this.setScore(0); - } else if (roate > 0.2 && roate < 0.5) { - this.setScore(1); - } else { - this.setScore(2); - } - } else { - this.setScore(-1); - } - } -} diff --git a/smart-health-modules/theme-schema/src/main/java/cn/sh/stc/sict/theme/hphy/controller/mp/HpDeptInfoController.java b/smart-health-modules/theme-schema/src/main/java/cn/sh/stc/sict/theme/hphy/controller/mp/HpDeptInfoController.java index 4f6d31c..2a48987 100644 --- a/smart-health-modules/theme-schema/src/main/java/cn/sh/stc/sict/theme/hphy/controller/mp/HpDeptInfoController.java +++ b/smart-health-modules/theme-schema/src/main/java/cn/sh/stc/sict/theme/hphy/controller/mp/HpDeptInfoController.java @@ -1,9 +1,11 @@ package cn.sh.stc.sict.theme.hphy.controller.mp; +import cn.hutool.core.date.DateUtil; import cn.hutool.core.util.StrUtil; import cn.sh.stc.sict.cloud.common.core.util.R; import cn.sh.stc.sict.theme.hpgp.model.HpgpDepartmentRank; +import cn.sh.stc.sict.theme.hpgp.service.HpgpBusyIdlePredictionService; import cn.sh.stc.sict.theme.hpgp.service.HpgpDepartmentRankService; import cn.sh.stc.sict.theme.hphy.model.HpDeptInfo; import cn.sh.stc.sict.theme.hphy.service.HpDeptInfoService; @@ -14,6 +16,7 @@ import io.swagger.annotations.ApiParam; import lombok.AllArgsConstructor; import org.springframework.web.bind.annotation.*; +import java.util.Date; import java.util.List; /** @@ -32,21 +35,22 @@ public class HpDeptInfoController extends ApiController { */ private final HpDeptInfoService hpDeptInfoService; private final HpgpDepartmentRankService hpgpDepartmentRankService; + private final HpgpBusyIdlePredictionService hpgpBusyIdlePredictionService; @ApiOperation("科室医生查询接口") @GetMapping public R getDeptDoctors(@ApiParam("医院代码") @RequestParam("hospitalCode") String hospitalCode, - @ApiParam("科室代码") @RequestParam("deptCode") String deptCode){ + @ApiParam("科室代码") @RequestParam("deptCode") String deptCode) { return new R<>(hpDeptInfoService.getDeptDoctors(hospitalCode, deptCode)); } @ApiOperation("更新科室号源信息") @PostMapping("/wd/resource") - public R updateDeptResource(){ + public R updateDeptResource() { List deptList = hpDeptInfoService.list(); deptList.forEach(dept -> { - if (StrUtil.isEmpty(dept.getOneDeptCode())||StrUtil.isEmpty(dept.getDeptCode())) { + if (StrUtil.isEmpty(dept.getOneDeptCode()) || StrUtil.isEmpty(dept.getDeptCode())) { return; } hpDeptInfoService.asyncUpdate(dept); @@ -56,8 +60,23 @@ public class HpDeptInfoController extends ApiController { @ApiOperation("更新科室排行表号源信息") @PostMapping("/rank/wd/resource") - public R updateRankDeptResource(){ + public R updateRankDeptResource() { hpgpDepartmentRankService.updateResource(); return new R(); } + + @ApiOperation("定时统计排行科室的号源信息") + @PostMapping("/statistic/rank/wd/resource") + public R statisticRankDeptResourceInfo() { + List deptList = hpgpDepartmentRankService.list(); + deptList.forEach(dept -> { + if (StrUtil.isEmpty(dept.getOneDeptCode()) || StrUtil.isEmpty(dept.getDeptCode())) { + return; + } + Date startDate = DateUtil.date(); + Date endDate = DateUtil.offsetDay(startDate, 10); + hpgpBusyIdlePredictionService.statisticResourceInfo(dept, startDate, endDate); + }); + return new R(); + } } diff --git a/smart-health-modules/theme-schema/src/main/java/cn/sh/stc/sict/theme/hphy/controller/mp/HphyPatientBaseController.java b/smart-health-modules/theme-schema/src/main/java/cn/sh/stc/sict/theme/hphy/controller/mp/HphyPatientBaseController.java index 20f186c..70009f7 100644 --- a/smart-health-modules/theme-schema/src/main/java/cn/sh/stc/sict/theme/hphy/controller/mp/HphyPatientBaseController.java +++ b/smart-health-modules/theme-schema/src/main/java/cn/sh/stc/sict/theme/hphy/controller/mp/HphyPatientBaseController.java @@ -3,6 +3,7 @@ package cn.sh.stc.sict.theme.hphy.controller.mp; import cn.hutool.core.util.IdcardUtil; import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; +import cn.hutool.json.JSONUtil; import cn.sh.stc.sict.cloud.common.core.constant.Constant; import cn.sh.stc.sict.cloud.common.core.constant.enums.LoginTypeEnum; import cn.sh.stc.sict.cloud.common.core.dto.WDUserCardInfo; @@ -103,7 +104,9 @@ public class HphyPatientBaseController { */ @GetMapping public R getInfo() { + log.error("获取患者信息1"); CurrentUser current = SecurityUtils.getCurrentUser(); + log.error("获取患者信息2, current = {}", JSONUtil.toJsonStr(current)); if (StrUtil.isBlank(current.getOpenId())) { log.error("openId 为空"); @@ -115,6 +118,7 @@ public class HphyPatientBaseController { current.setGender(PatientConstant.getGender(base.getGender())); SecurityUtils.updateCurrent(current); } + log.error("获取患者信息2, base = {}", JSONUtil.toJsonStr(base)); return new R(base); } @@ -123,6 +127,7 @@ public class HphyPatientBaseController { @GetMapping("/third-party") public R getInfoByToken(@RequestParam("source") String source, @RequestParam("token") String token) { + log.error("source = {}, token = {}", source, token); CurrentUser current = SecurityUtils.getCurrentUser(); if (StrUtil.isBlank(current.getOpenId())) { @@ -130,9 +135,11 @@ public class HphyPatientBaseController { } // 获取患者信息 HphyPatientBase base = hphyPatientBaseService.getByOpenId(current.getOpenId()); + log.error("third-party.base1 = {}", JSONUtil.toJsonStr(base)); if (ObjectUtil.isNull(base) || NumberUtil.isNullOrZero(base.getId())) { if (LoginTypeEnum.SSB.getType().equals(source)) { WDUserInfo userInfo = SsbUtil.getUserInfo(token); + log.error("wdUser = {}", userInfo); List cardList = SsbUtil.getUserCardInfoList(token); base = hphyPatientBaseService.saveSSbInfo(current, userInfo, cardList); hpPatientCardService.save(base, cardList); diff --git a/smart-health-modules/theme-schema/src/main/java/cn/sh/stc/sict/theme/hphy/schedule/RefreshJob.java b/smart-health-modules/theme-schema/src/main/java/cn/sh/stc/sict/theme/hphy/schedule/RefreshJob.java index 122f41a..b83d0bb 100644 --- a/smart-health-modules/theme-schema/src/main/java/cn/sh/stc/sict/theme/hphy/schedule/RefreshJob.java +++ b/smart-health-modules/theme-schema/src/main/java/cn/sh/stc/sict/theme/hphy/schedule/RefreshJob.java @@ -1,6 +1,11 @@ package cn.sh.stc.sict.theme.hphy.schedule; import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.StrUtil; +import cn.sh.stc.sict.theme.hpgp.model.HpgpDepartmentRank; +import cn.sh.stc.sict.theme.hpgp.service.HpgpBusyIdlePredictionService; +import cn.sh.stc.sict.theme.hpgp.service.HpgpDepartmentRankService; import cn.sh.stc.sict.theme.hphy.constant.DataConstant; import cn.sh.stc.sict.theme.hphy.model.HpDeptInfo; import cn.sh.stc.sict.theme.hphy.model.HpDocInfo; @@ -21,6 +26,7 @@ import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; import java.util.ArrayList; +import java.util.Date; import java.util.List; /** @@ -38,6 +44,8 @@ public class RefreshJob { private final HpHosInfoService hpHosInfoService; private final HpDeptInfoService deptInfoService; private final HpDocInfoService docInfoService; + private final HpgpDepartmentRankService hpgpDepartmentRankService; + private final HpgpBusyIdlePredictionService hpgpBusyIdlePredictionService; /** * 每月一日0点 更新医院信息 @@ -100,6 +108,23 @@ public class RefreshJob { } } + /** + * 每天中午12点,晚上12点,统计号源信息 + */ + // @Scheduled(cron = "0 50 12 * * ? ") + @Scheduled(cron = "0 0 0,12 * * ? ") + public void statisticRankDeptResourceInfo() { + List deptList = hpgpDepartmentRankService.list(); + deptList.forEach(dept -> { + if (StrUtil.isEmpty(dept.getOneDeptCode()) || StrUtil.isEmpty(dept.getDeptCode())) { + return; + } + Date startDate = DateUtil.date(); + Date endDate = DateUtil.offsetDay(startDate, 10); + hpgpBusyIdlePredictionService.statisticResourceInfo(dept, startDate, endDate); + }); + } + private void saveDoctor(String hosOrgCode, MapperFactory factory) { List doctInfos = WanDaHttpUtil.getDoctInfo(new DeptInfo(hosOrgCode)); 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 f974b01..1814726 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 @@ -25,10 +25,7 @@ import lombok.extern.slf4j.Slf4j; import org.springframework.scheduling.annotation.Async; import org.springframework.stereotype.Service; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; -import java.util.Set; +import java.util.*; import java.util.stream.Collectors; /** @@ -119,12 +116,6 @@ public class HpDeptInfoServiceImpl extends ServiceImpl 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)); -// } +// +// log.error("list = {}", JSONUtil.toJsonStr(list)); // } + /** + * 消化内科 42503527600 上海市瑞金医院卢湾分院 1013 3122 消化科 1 1013 3122 + * 消化内科 Y0180100700 上海交通大学医学院附属第九人民医院黄浦分院 293 3 消化内科 2 293 3 + * 消化内科 42502763900 黄浦区肿瘤防治院 10 0002 消化专科 3 10 0002 + * E7880343800 50 2006 + * @param args + */ // public static void main(String[] args) { // String orgCode = "E7880343800"; -// String oneDeptCode = "03"; -// String deptCode = "4023"; +// String oneDeptCode = "50"; +// String deptCode = "2006"; // // HosInfo hosInfo = new HosInfo(); // hosInfo.setHosOrgCode(orgCode); diff --git a/smart-health-modules/theme-schema/src/main/java/cn/sh/stc/sict/theme/hphy/service/impl/HphyPatientBaseServiceImpl.java b/smart-health-modules/theme-schema/src/main/java/cn/sh/stc/sict/theme/hphy/service/impl/HphyPatientBaseServiceImpl.java index fdf1712..edcc41b 100644 --- a/smart-health-modules/theme-schema/src/main/java/cn/sh/stc/sict/theme/hphy/service/impl/HphyPatientBaseServiceImpl.java +++ b/smart-health-modules/theme-schema/src/main/java/cn/sh/stc/sict/theme/hphy/service/impl/HphyPatientBaseServiceImpl.java @@ -7,14 +7,13 @@ import cn.sh.stc.sict.cloud.common.core.constant.Constant; import cn.sh.stc.sict.cloud.common.core.dto.WDUserCardInfo; import cn.sh.stc.sict.cloud.common.core.dto.WDUserInfo; import cn.sh.stc.sict.cloud.upms.dto.CurrentUser; -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import org.springframework.stereotype.Service; -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import lombok.AllArgsConstructor; - import cn.sh.stc.sict.theme.hphy.dao.HphyPatientBaseMapper; import cn.sh.stc.sict.theme.hphy.model.HphyPatientBase; import cn.sh.stc.sict.theme.hphy.service.HphyPatientBaseService; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import lombok.AllArgsConstructor; +import org.springframework.stereotype.Service; import java.util.List; @@ -40,7 +39,7 @@ public class HphyPatientBaseServiceImpl extends ServiceImpl