Commit c291d99d authored by fshenye's avatar fshenye

实时忙闲预测

parent e396c4ca
package cn.sh.stc.sict.theme.hpgp.dao; package cn.sh.stc.sict.theme.hpgp.dao;
import cn.sh.stc.sict.theme.hpgp.model.HpgpDepartmentRank; import cn.sh.stc.sict.theme.hpgp.model.HpgpDepartmentRank;
import cn.sh.stc.sict.theme.hpgp.vo.DeptRankVO;
import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Param; import org.apache.ibatis.annotations.Param;
...@@ -19,5 +20,5 @@ public interface HpgpDepartmentRankMapper extends BaseMapper<HpgpDepartmentRank> ...@@ -19,5 +20,5 @@ public interface HpgpDepartmentRankMapper extends BaseMapper<HpgpDepartmentRank>
* @param size 查询记录数 默认3条 * @param size 查询记录数 默认3条
* @return * @return
*/ */
List<HpgpDepartmentRank> getRankByStandardDept(@Param("deptName") String deptName, @Param("size") int size); List<DeptRankVO> getRankByStandardDept(@Param("deptName") String deptName, @Param("size") int size);
} }
...@@ -18,24 +18,22 @@ import java.io.Serializable; ...@@ -18,24 +18,22 @@ import java.io.Serializable;
@Data @Data
@EqualsAndHashCode(callSuper = true) @EqualsAndHashCode(callSuper = true)
public class HpgpBusyIdlePrediction extends Model<HpgpBusyIdlePrediction> { public class HpgpBusyIdlePrediction extends Model<HpgpBusyIdlePrediction> {
//医院代码 //医院代码
@ApiModelProperty(hidden = false, value = "医院代码") @ApiModelProperty(hidden = false, value = "医院代码")
private String hospitalCode; private String hospitalCode;
//医院名称 //医院名称
@ApiModelProperty(hidden = false, value = "医院名称") @ApiModelProperty(hidden = false, value = "医院名称")
private String hospitalName; private String hospitalName;
//科室代码 //科室代码
@ApiModelProperty(hidden = false, value = "科室代码") @ApiModelProperty(hidden = false, value = "科室代码")
private String deptCode; private String deptCode;
//科室名称 //科室名称
@ApiModelProperty(hidden = false, value = "科室名称") @ApiModelProperty(hidden = false, value = "科室名称")
private String deptName; private String deptName;
//预测日期 //预测日期
@ApiModelProperty(hidden = false, value = "预测日期") @ApiModelProperty(hidden = false, value = "预测日期")
private Date predictionDate; private Date predictionDate;
//忙闲评分 //忙闲评分
@ApiModelProperty(hidden = false, value = "忙闲评分") @ApiModelProperty(hidden = false, value = "忙闲评分")
private Integer score; private Integer score;
}
}
package cn.sh.stc.sict.theme.hpgp.service; package cn.sh.stc.sict.theme.hpgp.service;
import cn.sh.stc.sict.theme.hpgp.model.HpgpBusyIdlePrediction; import cn.sh.stc.sict.theme.hpgp.model.HpgpBusyIdlePrediction;
import cn.sh.stc.sict.theme.hpgp.vo.DeptPredictionVO;
import com.baomidou.mybatisplus.extension.service.IService; import com.baomidou.mybatisplus.extension.service.IService;
import java.util.List; import java.util.List;
...@@ -19,5 +20,5 @@ public interface HpgpBusyIdlePredictionService extends IService<HpgpBusyIdlePred ...@@ -19,5 +20,5 @@ public interface HpgpBusyIdlePredictionService extends IService<HpgpBusyIdlePred
* @param deptName 标准科室名称 * @param deptName 标准科室名称
* @return 忙闲医院科室 * @return 忙闲医院科室
*/ */
List<HpgpBusyIdlePrediction> busyIdlePrediction(String deptName); List<DeptPredictionVO> busyIdlePrediction(String deptName);
} }
package cn.sh.stc.sict.theme.hpgp.service.impl; package cn.sh.stc.sict.theme.hpgp.service.impl;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.date.DatePattern;
import cn.hutool.core.date.DateTime; import cn.hutool.core.date.DateTime;
import cn.hutool.core.date.DateUtil; import cn.hutool.core.date.DateUtil;
import cn.hutool.db.DaoTemplate;
import cn.hutool.json.JSONArray;
import cn.hutool.json.JSONUtil;
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.HpgpBusyIdlePredictionMapper;
import cn.sh.stc.sict.theme.hpgp.dao.HpgpDepartmentRankMapper; 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.HpgpBusyIdlePrediction;
import cn.sh.stc.sict.theme.hpgp.model.HpgpDepartmentRank; 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.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.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import java.util.List; import java.util.*;
import java.util.Set;
import java.util.stream.Collectors; import java.util.stream.Collectors;
/** /**
...@@ -23,31 +33,81 @@ import java.util.stream.Collectors; ...@@ -23,31 +33,81 @@ import java.util.stream.Collectors;
* @author zhangly * @author zhangly
* @since 2022-01-14 09:56:43 * @since 2022-01-14 09:56:43
*/ */
@Slf4j
@AllArgsConstructor @AllArgsConstructor
@Service("hpgpBusyIdlPredictionService") @Service("hpgpBusyIdlPredictionService")
public class HpgpBusyIdlePredictionServiceImpl extends ServiceImpl<HpgpBusyIdlePredictionMapper, HpgpBusyIdlePrediction> implements HpgpBusyIdlePredictionService { public class HpgpBusyIdlePredictionServiceImpl extends ServiceImpl<HpgpBusyIdlePredictionMapper, HpgpBusyIdlePrediction> implements HpgpBusyIdlePredictionService {
private final HpgpDepartmentRankMapper departmentRankMapper; private final HpgpDepartmentRankMapper departmentRankMapper;
@Override @Override
public List<HpgpBusyIdlePrediction> busyIdlePrediction(String deptName) { public List<DeptPredictionVO> busyIdlePrediction(String deptName) {
// 查询科室排名 // 查询科室排名
// 组装医院代码、科室代码 // 组装医院代码、科室代码
// 查询医院忙闲 // 查询医院忙闲
List<HpgpDepartmentRank> deptRank = departmentRankMapper.getRankByStandardDept(deptName, 3); List<DeptRankVO> rankList = departmentRankMapper.getRankByStandardDept(deptName, 3);
if (CollectionUtil.isEmpty(deptRank)) { if (CollectionUtil.isEmpty(rankList)) {
return null; return null;
} }
Set<String> hospitalCodes = deptRank.stream().map(HpgpDepartmentRank::getHospitalCode).collect(Collectors.toSet()); DateTime startTime = DateUtil.date();
Set<String> deptCodes = deptRank.stream().map(HpgpDepartmentRank::getDeptCode).collect(Collectors.toSet()); DateTime endTime = DateUtil.offsetDay(DateUtil.date(), 7);
List<DeptPredictionVO> result = new ArrayList<>();
DateTime today = DateUtil.date(); rankList.forEach(rank -> {
DateTime nextDay = DateUtil.offsetDay(DateUtil.date(), 7); List<DeptPredictionVO> rankResult = new ArrayList<>();
return this.list( DeptInfo deptInfo = new DeptInfo();
new LambdaQueryWrapper<HpgpBusyIdlePrediction>() deptInfo.setHosOrgCode(rank.getHospitalCode());
.in(HpgpBusyIdlePrediction::getHospitalCode, hospitalCodes) deptInfo.setOneDeptCode(rank.getOneDeptCode());
.in(HpgpBusyIdlePrediction::getDeptCode, deptCodes) deptInfo.setDeptCode(rank.getSubDeptCode());
.gt(HpgpBusyIdlePrediction::getPredictionDate, today) List<OutPatInfo> outPatInfo = WanDaHttpUtil.getResourceOutPatInfo(deptInfo);
.le(HpgpBusyIdlePrediction::getPredictionDate, nextDay) if (CollUtil.isNotEmpty(outPatInfo)) {
); Map<String, DeptPredictionVO> 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<NumSourceInfo> orderNumInfo = WanDaHttpUtil.getOrderNumInfo(numSourceInfo);
if (CollUtil.isNotEmpty(orderNumInfo)) {
Map<String, List<NumSourceInfo>> 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();
result.add(vo);
}
}
result.addAll(rankResult);
});
return result;
} }
} }
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);
}
}
}
package cn.sh.stc.sict.theme.hpgp.vo;
import cn.sh.stc.sict.theme.hpgp.model.HpgpDepartmentRank;
import lombok.Data;
@Data
public class DeptRankVO extends HpgpDepartmentRank {
private String oneDeptCode;
private String subDeptCode;
}
...@@ -6,7 +6,11 @@ import cn.hutool.core.util.RandomUtil; ...@@ -6,7 +6,11 @@ import cn.hutool.core.util.RandomUtil;
import cn.sh.stc.sict.cloud.common.core.constant.Constant; 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.R;
import cn.sh.stc.sict.cloud.common.core.util.ValidateCodeUtil; import cn.sh.stc.sict.cloud.common.core.util.ValidateCodeUtil;
import cn.sh.stc.sict.theme.hpgp.model.HpgpDepartmentRank;
import cn.sh.stc.sict.theme.hpgp.service.HpgpDepartmentRankService;
import cn.sh.stc.sict.theme.hphy.service.HpDeptInfoService;
import cn.sh.stc.sict.theme.hphy.wd.*; import cn.sh.stc.sict.theme.hphy.wd.*;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import io.swagger.annotations.Api; import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam; import io.swagger.annotations.ApiParam;
...@@ -29,6 +33,10 @@ public class WDController { ...@@ -29,6 +33,10 @@ public class WDController {
@Autowired @Autowired
private StringRedisTemplate redisTemplate; private StringRedisTemplate redisTemplate;
@Autowired
private HpgpDepartmentRankService hpgpDepartmentRankService;
@Autowired
private HpDeptInfoService hpDeptInfoService;
/** /**
* 0. 发短信 * 0. 发短信
......
...@@ -9,6 +9,9 @@ import cn.sh.stc.sict.theme.hphy.model.HpDocInfo; ...@@ -9,6 +9,9 @@ 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.model.HpHosInfo;
import cn.sh.stc.sict.theme.hphy.service.HpDeptInfoService; import cn.sh.stc.sict.theme.hphy.service.HpDeptInfoService;
import cn.sh.stc.sict.theme.hphy.vo.DeptDoctorsVO; 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.DoctInfo;
import cn.sh.stc.sict.theme.hphy.wd.WanDaHttpUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
...@@ -57,6 +60,10 @@ public class HpDeptInfoServiceImpl extends ServiceImpl<HpDeptInfoMapper, HpDeptI ...@@ -57,6 +60,10 @@ public class HpDeptInfoServiceImpl extends ServiceImpl<HpDeptInfoMapper, HpDeptI
List<HpDocInfo> doctors = hpDocInfoMapper.selectList(docWrapper); List<HpDocInfo> doctors = hpDocInfoMapper.selectList(docWrapper);
// 查询可预约医生信息
DeptInfo info = new DeptInfo();
List<DoctInfo> resourceDoctInfo = WanDaHttpUtil.getResourceDoctInfo(info);
return new DeptDoctorsVO(hosInfo, deptInfo, doctors); return new DeptDoctorsVO(hosInfo, deptInfo, doctors);
} }
} }
...@@ -31,6 +31,6 @@ public class NumSourceInfo { ...@@ -31,6 +31,6 @@ public class NumSourceInfo {
private String visitCost; private String visitCost;
private String scheduleDate; private String scheduleDate;
private String timeRange; private String timeRange;
private String remainNum; private Integer remainNum;
private String reserveOrderNum; private Integer reserveOrderNum;
} }
...@@ -197,7 +197,6 @@ public class WanDaHttpUtil { ...@@ -197,7 +197,6 @@ public class WanDaHttpUtil {
*/ */
public List<NumSourceInfo> getOrderNumInfo(NumSourceInfo numSourceInfo) { public List<NumSourceInfo> getOrderNumInfo(NumSourceInfo numSourceInfo) {
String xml = WanDaUtil.GetOrderNumInfoServiceXML(numSourceInfo); String xml = WanDaUtil.GetOrderNumInfoServiceXML(numSourceInfo);
System.out.println(xml);
String body = HttpRequest.post(URL) String body = HttpRequest.post(URL)
.body(xml) .body(xml)
.execute() .execute()
...@@ -207,7 +206,7 @@ public class WanDaHttpUtil { ...@@ -207,7 +206,7 @@ public class WanDaHttpUtil {
log.error("号源查询 失败"); log.error("号源查询 失败");
return null; return null;
} }
log.info("号源查询:body = {}", body); // log.info("号源查询:body = {}", body);
String returnXml = getReturn(body, "GetOrderNumInfoService"); String returnXml = getReturn(body, "GetOrderNumInfoService");
if (Constant.STRING_NO.equals(getCode(returnXml))) { if (Constant.STRING_NO.equals(getCode(returnXml))) {
Document document = XmlUtil.readXML(returnXml); Document document = XmlUtil.readXML(returnXml);
...@@ -450,7 +449,7 @@ public class WanDaHttpUtil { ...@@ -450,7 +449,7 @@ public class WanDaHttpUtil {
log.error("查询门诊信息失败"); log.error("查询门诊信息失败");
return null; return null;
} }
log.info("查询门诊信息:body = {}", body); // log.info("查询门诊信息:body = {}", body);
String returnXml = getReturn(body, "GetResourceOutPatInfoService"); String returnXml = getReturn(body, "GetResourceOutPatInfoService");
return serialOutPatInfo(returnXml); return serialOutPatInfo(returnXml);
} }
......
...@@ -63,7 +63,7 @@ ...@@ -63,7 +63,7 @@
<appender-ref ref="error"/> <appender-ref ref="error"/>
</logger> </logger>
<!-- Level: FATAL 0 ERROR 3 WARN 4 INFO 6 DEBUG 7 --> <!-- Level: FATAL 0 ERROR 3 WARN 4 INFO 6 DEBUG 7 -->
<root level="INFO"> <root level="ERROR">
<appender-ref ref="console"/> <appender-ref ref="console"/>
<appender-ref ref="debug"/> <appender-ref ref="debug"/>
</root> </root>
......
...@@ -13,5 +13,6 @@ ...@@ -13,5 +13,6 @@
<sql id="Base_Column_List"> <sql id="Base_Column_List">
hospital_code hospital_code
, hospital_name, dept_code, dept_name, prediction_date, score </sql> , hospital_name, dept_code, dept_name, prediction_date, score
</sql>
</mapper> </mapper>
...@@ -13,9 +13,19 @@ ...@@ -13,9 +13,19 @@
<sql id="Base_Column_List"> standard_dept , hospital_code, hospital_name, dept_code, dept_name, rank_score </sql> <sql id="Base_Column_List"> standard_dept , hospital_code, hospital_name, dept_code, dept_name, rank_score </sql>
<select id="getRankByStandardDept" resultMap="HpgpDepartmentRankMap"> <select id="getRankByStandardDept" resultType="cn.sh.stc.sict.theme.hpgp.vo.DeptRankVO">
select select dr.standard_dept standardDept,
<include refid="Base_Column_List" /> dr.hospital_code hospitalCode,
from hpgp_department_rank where standard_dept = #{deptName} order by rank_score asc limit #{size} dr.hospital_name hospitalName,
dr.dept_code deptCode,
dr.dept_name deptName,
dr.rank_score rankScore,
d.one_dept_code oneDeptCode,
d.dept_code subDeptCode
from hpgp_department_rank dr
left join hp_dept_info d on (dr.hospital_code = d.hos_org_code and dr.dept_code = d.dept_code)
where dr.standard_dept = #{deptName}
order by dr.rank_score asc
limit #{size}
</select> </select>
</mapper> </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