Commit e31be677 authored by fshenye's avatar fshenye

1. 调整号源忙闲预测从明日开始

2. 新增接口:根据患者身份证号查找历史科室并忙闲预测
3. 无历史就诊记录则推送三个热门科室
parent 21fa2527
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<HpgpBusyIdlePrediction> result = hpHzjlService.listByCertId(patient.getCertId());
return new R(result);
}
}
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<HpHzjl> {
}
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<HpHzjl> {
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;
}
......@@ -39,6 +39,8 @@ public class HpgpDepartmentRank extends Model<HpgpDepartmentRank> {
@ApiModelProperty(hidden = false, value = "科室排名")
private Integer rankScore;
private String tag;
private String resourceOutPatInfo;
private String resourceDoctInfo;
......
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<HpHzjl> {
List<HpgpBusyIdlePrediction> listByCertId(String certId);
}
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<HpgpBusyIdlePred
List<HpgpBusyIdlePrediction> busyIdlePrediction(String deptName);
void statisticResourceInfo(HpgpDepartmentRank dept, Date startDate, Date endDate);
List<HpgpBusyIdlePrediction> listByDeptRank(HpgpDepartmentRank dept, DateTime startTime, DateTime endTime);
}
......@@ -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<HpgpDepartmentRank> {
void updateResource();
HpgpDepartmentRank getByCode(String hospCode, String oneDeptCode, String deptCode);
List<HpgpDepartmentRank> listHotDept();
}
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<HpHzjlMapper, HpHzjl> implements HpHzjlService {
private final HpgpDepartmentRankService hpgpDepartmentRankService;
private final HpgpBusyIdlePredictionService hpgpBusyIdlePredictionService;
/**
* 根据身份证号查找最后三次不同科室就诊记录,并计算忙闲
* 如果未找到,则推送三个热门科室
*
* @param certId
* @return
*/
@Override
public List<HpgpBusyIdlePrediction> listByCertId(String certId) {
List<HpgpBusyIdlePrediction> result = new ArrayList<>();
DateTime startTime = DateUtil.tomorrow();
DateTime endTime = DateUtil.offsetDay(startTime, 6);
LambdaQueryWrapper<HpHzjl> wrapper = Wrappers.lambdaQuery();
wrapper.eq(HpHzjl::getZjhm, certId)
.groupBy(HpHzjl::getJzksbm)
.orderByDesc(HpHzjl::getJzksrq)
.last("limit 10");
List<HpHzjl> 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<HpgpDepartmentRank> rankList = hpgpDepartmentRankService.listHotDept();
rankList.forEach(rank -> {
result.addAll(hpgpBusyIdlePredictionService.listByDeptRank(rank, startTime, endTime));
});
}
return result;
}
}
......@@ -45,40 +45,17 @@ public class HpgpBusyIdlePredictionServiceImpl extends ServiceImpl<HpgpBusyIdleP
if (CollectionUtil.isEmpty(rankList)) {
return null;
}
DateTime startTime = DateUtil.date();
DateTime endTime = DateUtil.offsetDay(DateUtil.date(), 6);
DateTime startTime = DateUtil.tomorrow();
DateTime endTime = DateUtil.offsetDay(startTime, 6);
List<HpgpBusyIdlePrediction> result = new ArrayList<>();
rankList.forEach(rank -> {
LambdaQueryWrapper<HpgpBusyIdlePrediction> 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<HpgpBusyIdlePrediction> list = this.list(wrapper);
if (CollUtil.isNotEmpty(list)) {
Map<Date, HpgpBusyIdlePrediction> 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<HpgpBusyIdleP
}
}
@Override
public List<HpgpBusyIdlePrediction> listByDeptRank(HpgpDepartmentRank rank, DateTime startTime, DateTime endTime) {
List<HpgpBusyIdlePrediction> result = new ArrayList<>();
LambdaQueryWrapper<HpgpBusyIdlePrediction> 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<HpgpBusyIdlePrediction> list = this.list(wrapper);
if (CollUtil.isNotEmpty(list)) {
Map<Date, HpgpBusyIdlePrediction> 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<DoctInfo> docList, Map<String, HpgpBusyIdlePrediction> dateResultMap, Date startDate, Date
endDate) {
......
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<HpgpDepartmentRan
});
}
@Override
public HpgpDepartmentRank getByCode(String hospCode, String oneDeptCode, String deptCode) {
LambdaQueryWrapper<HpgpDepartmentRank> 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<HpgpDepartmentRank> listHotDept() {
LambdaQueryWrapper<HpgpDepartmentRank> wrapper = Wrappers.lambdaQuery();
wrapper.eq(HpgpDepartmentRank::getTag, Constant.STRING_YES);
return this.list(wrapper);
}
@Async
void asyncUpdateRank(HpgpDepartmentRank dept) {
DeptInfo deptInfo = new DeptInfo();
......
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="cn.sh.stc.sict.theme.hpgp.dao.HpHzjlMapper">
<resultMap type="cn.sh.stc.sict.theme.hpgp.model.HpHzjl" id="HpHzjlMap">
<result property="zjhm" column="ZJHM"/>
<result property="zjlx" column="ZJLX"/>
<result property="xm" column="XM"/>
<result property="yljgdm" column="YLJGDM"/>
<result property="jzlx" column="JZLX"/>
<result property="txbz" column="TXBZ"/>
<result property="jzksbm" column="JZKSBM"/>
<result property="jzksmc" column="JZKSMC"/>
<result property="jzksrq" column="JZKSRQ"/>
<result property="zzysgh" column="ZZYSGH"/>
<result property="zzysxm" column="ZZYSXM"/>
<result property="jzzdsm" column="JZZDSM"/>
</resultMap>
</mapper>
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment