diff --git a/smart-health-modules/theme-schema/src/main/java/cn/sh/stc/sict/theme/hpgp/controller/mobile/HpHzjlController.java b/smart-health-modules/theme-schema/src/main/java/cn/sh/stc/sict/theme/hpgp/controller/mobile/HpHzjlController.java new file mode 100644 index 0000000000000000000000000000000000000000..61a6ed07ea31a301f4920914e8b5455f9f2ee9b6 --- /dev/null +++ b/smart-health-modules/theme-schema/src/main/java/cn/sh/stc/sict/theme/hpgp/controller/mobile/HpHzjlController.java @@ -0,0 +1,62 @@ +package cn.sh.stc.sict.theme.hpgp.controller.mobile; + + + +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import cn.hutool.json.JSONUtil; +import cn.sh.stc.sict.cloud.common.security.util.SecurityUtils; +import cn.sh.stc.sict.cloud.upms.dto.CurrentUser; +import cn.sh.stc.sict.theme.hpgp.model.HpgpBusyIdlePrediction; +import cn.sh.stc.sict.theme.hphy.model.HphyPatientBase; +import cn.sh.stc.sict.theme.hphy.service.HphyPatientBaseService; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import cn.sh.stc.sict.cloud.common.core.util.R; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import cn.sh.stc.sict.theme.hpgp.model.HpHzjl; +import cn.sh.stc.sict.theme.hpgp.service.HpHzjlService; +import org.springframework.web.bind.annotation.*; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; + +import javax.annotation.Resource; +import java.io.Serializable; +import java.util.List; + +/** + * (HpHzjl)表控制层 + * + * @author F_xh + * @since 2022-08-15 14:14:33 + */ +@Slf4j +@RestController +@AllArgsConstructor +@Api(tags = "患者就诊记录") +@RequestMapping("/hpHzjl") +public class HpHzjlController { + /** + * 服务对象 + */ + private final HpHzjlService hpHzjlService; + private final HphyPatientBaseService hphyPatientBaseService; + + @GetMapping("/history/dept/list") + public R historyDeptList(){ + CurrentUser current = SecurityUtils.getCurrentUser(); + if(ObjectUtil.isEmpty(current)|| StrUtil.isBlank(current.getOpenId())){ + log.error("current = {}", JSONUtil.toJsonStr(current)); + return new R().error("当前的登录人信息异常"); + } + HphyPatientBase patient = hphyPatientBaseService.getByOpenId(current.getOpenId()); + if(ObjectUtil.isEmpty(patient)||StrUtil.isBlank(patient.getCertId())){ + log.error("patient = {}", JSONUtil.toJsonStr(patient)); + return new R().error("患者信息异常!"); + } + List result = hpHzjlService.listByCertId(patient.getCertId()); + + return new R(result); + } +} diff --git a/smart-health-modules/theme-schema/src/main/java/cn/sh/stc/sict/theme/hpgp/dao/HpHzjlMapper.java b/smart-health-modules/theme-schema/src/main/java/cn/sh/stc/sict/theme/hpgp/dao/HpHzjlMapper.java new file mode 100644 index 0000000000000000000000000000000000000000..f16a8dcfa8c16ccdabcb9edc5c16caae9a9704fa --- /dev/null +++ b/smart-health-modules/theme-schema/src/main/java/cn/sh/stc/sict/theme/hpgp/dao/HpHzjlMapper.java @@ -0,0 +1,14 @@ +package cn.sh.stc.sict.theme.hpgp.dao; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import cn.sh.stc.sict.theme.hpgp.model.HpHzjl; + +/** + * (HpHzjl)表数据库访问层 + * + * @author F_xh + * @since 2022-08-15 14:14:33 + */ +public interface HpHzjlMapper extends BaseMapper { + +} diff --git a/smart-health-modules/theme-schema/src/main/java/cn/sh/stc/sict/theme/hpgp/model/HpHzjl.java b/smart-health-modules/theme-schema/src/main/java/cn/sh/stc/sict/theme/hpgp/model/HpHzjl.java new file mode 100644 index 0000000000000000000000000000000000000000..bae39a3593a605dc4348695705c1b6174771d8e7 --- /dev/null +++ b/smart-health-modules/theme-schema/src/main/java/cn/sh/stc/sict/theme/hpgp/model/HpHzjl.java @@ -0,0 +1,34 @@ +package cn.sh.stc.sict.theme.hpgp.model; + +import java.util.Date; +import io.swagger.annotations.ApiModelProperty; +import com.baomidou.mybatisplus.extension.activerecord.Model; +import java.io.Serializable; +import lombok.Data; +import lombok.EqualsAndHashCode; +import io.swagger.annotations.Api; + +/** + * (HpHzjl)表实体类 + * + * @author F_xh + * @since 2022-08-15 14:14:33 + */ +@Data +@SuppressWarnings("serial") +@EqualsAndHashCode(callSuper = true) +public class HpHzjl extends Model { + private String zjhm; + private String zjlx; + private String xm; + private String yljgdm; + private String jzlx; + private String txbz; + private String jzksbm; + private String jzksmc; + private Date jzksrq; + private String zzysgh; + private String zzysxm; + private String jzzdsm; + +} diff --git a/smart-health-modules/theme-schema/src/main/java/cn/sh/stc/sict/theme/hpgp/model/HpgpDepartmentRank.java b/smart-health-modules/theme-schema/src/main/java/cn/sh/stc/sict/theme/hpgp/model/HpgpDepartmentRank.java index 61a7f292ae0ade3790dd72dadc55cb3892e0c86b..7efe1f211791bb48704822039a5dc45210017e6b 100644 --- a/smart-health-modules/theme-schema/src/main/java/cn/sh/stc/sict/theme/hpgp/model/HpgpDepartmentRank.java +++ b/smart-health-modules/theme-schema/src/main/java/cn/sh/stc/sict/theme/hpgp/model/HpgpDepartmentRank.java @@ -39,6 +39,8 @@ public class HpgpDepartmentRank extends Model { @ApiModelProperty(hidden = false, value = "科室排名") private Integer rankScore; + private String tag; + private String resourceOutPatInfo; private String resourceDoctInfo; diff --git a/smart-health-modules/theme-schema/src/main/java/cn/sh/stc/sict/theme/hpgp/service/HpHzjlService.java b/smart-health-modules/theme-schema/src/main/java/cn/sh/stc/sict/theme/hpgp/service/HpHzjlService.java new file mode 100644 index 0000000000000000000000000000000000000000..66faeecdfe46600c541a9aff7121e44c8c641c8b --- /dev/null +++ b/smart-health-modules/theme-schema/src/main/java/cn/sh/stc/sict/theme/hpgp/service/HpHzjlService.java @@ -0,0 +1,18 @@ +package cn.sh.stc.sict.theme.hpgp.service; + +import cn.sh.stc.sict.theme.hpgp.model.HpgpBusyIdlePrediction; +import com.baomidou.mybatisplus.extension.service.IService; +import cn.sh.stc.sict.theme.hpgp.model.HpHzjl; + +import java.util.List; + +/** + * (HpHzjl)表服务接口 + * + * @author F_xh + * @since 2022-08-15 14:14:33 + */ +public interface HpHzjlService extends IService { + + List listByCertId(String certId); +} 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 30b266f9931b173f14e65b3dfd6a1b063623e804..151586f10ca4ca3cf9c075eea8a50db78dda96b7 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,5 +1,6 @@ package cn.sh.stc.sict.theme.hpgp.service; +import cn.hutool.core.date.DateTime; import cn.sh.stc.sict.theme.hpgp.model.HpgpBusyIdlePrediction; import cn.sh.stc.sict.theme.hpgp.model.HpgpDepartmentRank; import com.baomidou.mybatisplus.extension.service.IService; @@ -24,4 +25,6 @@ public interface HpgpBusyIdlePredictionService extends IService busyIdlePrediction(String deptName); void statisticResourceInfo(HpgpDepartmentRank dept, Date startDate, Date endDate); + + List listByDeptRank(HpgpDepartmentRank dept, DateTime startTime, DateTime endTime); } diff --git a/smart-health-modules/theme-schema/src/main/java/cn/sh/stc/sict/theme/hpgp/service/HpgpDepartmentRankService.java b/smart-health-modules/theme-schema/src/main/java/cn/sh/stc/sict/theme/hpgp/service/HpgpDepartmentRankService.java index a886294834dc72e8c182442e940024029fb39a37..655c2d2b60cd6ca1e9a4a4bd96f2ad891caed2e6 100644 --- a/smart-health-modules/theme-schema/src/main/java/cn/sh/stc/sict/theme/hpgp/service/HpgpDepartmentRankService.java +++ b/smart-health-modules/theme-schema/src/main/java/cn/sh/stc/sict/theme/hpgp/service/HpgpDepartmentRankService.java @@ -3,6 +3,8 @@ package cn.sh.stc.sict.theme.hpgp.service; import com.baomidou.mybatisplus.extension.service.IService; import cn.sh.stc.sict.theme.hpgp.model.HpgpDepartmentRank; +import java.util.List; + /** * 黄浦全科导诊——科室排名(HpgpDepartmentRank)表服务接口 * @@ -12,4 +14,8 @@ import cn.sh.stc.sict.theme.hpgp.model.HpgpDepartmentRank; public interface HpgpDepartmentRankService extends IService { void updateResource(); + + HpgpDepartmentRank getByCode(String hospCode, String oneDeptCode, String deptCode); + + List listHotDept(); } diff --git a/smart-health-modules/theme-schema/src/main/java/cn/sh/stc/sict/theme/hpgp/service/impl/HpHzjlServiceImpl.java b/smart-health-modules/theme-schema/src/main/java/cn/sh/stc/sict/theme/hpgp/service/impl/HpHzjlServiceImpl.java new file mode 100644 index 0000000000000000000000000000000000000000..db0da6ce8f37966828aaf672138c422e917c3e06 --- /dev/null +++ b/smart-health-modules/theme-schema/src/main/java/cn/sh/stc/sict/theme/hpgp/service/impl/HpHzjlServiceImpl.java @@ -0,0 +1,78 @@ +package cn.sh.stc.sict.theme.hpgp.service.impl; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.date.DateTime; +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.ObjectUtil; +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.service.HpgpDepartmentRankService; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import cn.sh.stc.sict.theme.hpgp.dao.HpHzjlMapper; +import cn.sh.stc.sict.theme.hpgp.model.HpHzjl; +import cn.sh.stc.sict.theme.hpgp.service.HpHzjlService; +import lombok.AllArgsConstructor; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.List; + +/** + * (HpHzjl)表服务实现类 + * + * @author F_xh + * @since 2022-08-15 14:14:33 + */ +@AllArgsConstructor +@Service("hpHzjlService") +public class HpHzjlServiceImpl extends ServiceImpl implements HpHzjlService { + + private final HpgpDepartmentRankService hpgpDepartmentRankService; + private final HpgpBusyIdlePredictionService hpgpBusyIdlePredictionService; + + /** + * 根据身份证号查找最后三次不同科室就诊记录,并计算忙闲 + * 如果未找到,则推送三个热门科室 + * + * @param certId + * @return + */ + @Override + public List listByCertId(String certId) { + List result = new ArrayList<>(); + DateTime startTime = DateUtil.tomorrow(); + DateTime endTime = DateUtil.offsetDay(startTime, 6); + + LambdaQueryWrapper wrapper = Wrappers.lambdaQuery(); + wrapper.eq(HpHzjl::getZjhm, certId) + .groupBy(HpHzjl::getJzksbm) + .orderByDesc(HpHzjl::getJzksrq) + .last("limit 10"); + List recordList = this.list(wrapper); + if (CollUtil.isNotEmpty(recordList)) { + for (HpHzjl record : recordList) { + if (result.size() >= 20) { + break; + } + // 查找科室 + HpgpDepartmentRank dept = hpgpDepartmentRankService.getByCode(record.getYljgdm(), null, record.getJzksbm()); + if (ObjectUtil.isEmpty(dept)) { + continue; + } + // 忙闲预测 + result.addAll(hpgpBusyIdlePredictionService.listByDeptRank(dept, startTime, endTime)); + } + } + if (CollUtil.isEmpty(result)) { + List rankList = hpgpDepartmentRankService.listHotDept(); + rankList.forEach(rank -> { + result.addAll(hpgpBusyIdlePredictionService.listByDeptRank(rank, startTime, endTime)); + }); + } + + return result; + } +} 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 d543b755d886151fe0cb8300eb91c117aa20266e..489df2dde0e3a57d1adb86479567da4d08b992db 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 @@ -45,40 +45,17 @@ public class HpgpBusyIdlePredictionServiceImpl extends ServiceImpl result = new ArrayList<>(); rankList.forEach(rank -> { - 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)))); - // 生成无号源信息 - 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)); - } - } - } else { - // 生成无号源信息 - for (Date i = startTime; DateUtil.compare(i, endTime) < 1; i = DateUtil.offsetDay(i, 1)) { - result.add(this.getNoneSourcePredictionInfo(rank, i)); - } - } + result.addAll(this.listByDeptRank(rank, startTime, endTime)); }); return result; } - private HpgpBusyIdlePrediction getNoneSourcePredictionInfo(DeptRankVO rank, Date i) { + private HpgpBusyIdlePrediction getNoneSourcePredictionInfo(HpgpDepartmentRank rank, Date i) { HpgpBusyIdlePrediction vo = new HpgpBusyIdlePrediction(); vo.setDeptCode(rank.getDeptCode()); vo.setDeptName(rank.getDeptName()); @@ -116,6 +93,38 @@ public class HpgpBusyIdlePredictionServiceImpl extends ServiceImpl listByDeptRank(HpgpDepartmentRank rank, DateTime startTime, DateTime endTime) { + List result = new ArrayList<>(); + + 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)))); + // 生成无号源信息 + 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)); + } + } + } else { + // 生成无号源信息 + for (Date i = startTime; DateUtil.compare(i, endTime) < 1; i = DateUtil.offsetDay(i, 1)) { + result.add(this.getNoneSourcePredictionInfo(rank, i)); + } + } + + return result; + } + private void getDocResourceInfo(HpgpDepartmentRank dept, List docList, Map dateResultMap, Date startDate, Date endDate) { 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 9a35051d3fee9e79e3fac6bac962da2496b5a654..274ecb7f8f4e5bcdd7e11bfd6765dfd758b6c7f8 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 @@ -1,10 +1,15 @@ package cn.sh.stc.sict.theme.hpgp.service.impl; import cn.hutool.core.collection.CollUtil; +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.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.core.conditions.Wrapper; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; 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; @@ -39,6 +44,23 @@ public class HpgpDepartmentRankServiceImpl extends ServiceImpl wrapper = Wrappers.lambdaQuery(); + wrapper.eq(HpgpDepartmentRank::getHospitalCode, hospCode) + .eq(StrUtil.isNotEmpty(oneDeptCode), HpgpDepartmentRank::getOneDeptCode, oneDeptCode) + .eq(StrUtil.isNotEmpty(deptCode), HpgpDepartmentRank::getDeptCode, deptCode) + .last("limit 1"); + return this.getOne(wrapper); + } + + @Override + public List listHotDept() { + LambdaQueryWrapper wrapper = Wrappers.lambdaQuery(); + wrapper.eq(HpgpDepartmentRank::getTag, Constant.STRING_YES); + return this.list(wrapper); + } + @Async void asyncUpdateRank(HpgpDepartmentRank dept) { DeptInfo deptInfo = new DeptInfo(); diff --git a/smart-health-modules/theme-schema/src/main/resources/mapper/HpHzjlMapper.xml b/smart-health-modules/theme-schema/src/main/resources/mapper/HpHzjlMapper.xml new file mode 100644 index 0000000000000000000000000000000000000000..457c9569f90967598ced6f5dc1eb958072575d75 --- /dev/null +++ b/smart-health-modules/theme-schema/src/main/resources/mapper/HpHzjlMapper.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + +