Commit 21fa2527 authored by fshenye's avatar fshenye

1. 定时任务,每日12点,24点统计排行科室号源信息,修改原来计算科室号源信息接口

2. bugfix:修复新用户需要完善信息问题
parent b75530da
......@@ -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;
......
......@@ -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<SysUserBaseMapper, SysUs
private UserInfo getBySSBToken(String source, String token) {
WDUserInfo wdUser = SsbUtil.getUserInfo(token);
log.error("ssb.login.wdUser = {}", JSONUtil.toJsonStr(wdUser));
if (ObjectUtil.isNull(wdUser) || StrUtil.isBlank(wdUser.getMobile())) {
return null;
}
......@@ -83,9 +81,9 @@ public class SysUserBaseServiceImpl extends ServiceImpl<SysUserBaseMapper, SysUs
// 未注册用户默认注册
if (user == null) {
user = new SysUserBase();
user.setUserName(wdUser.getMobile());
user.setUserName(wdUser.getUsername());
user.setOpenId(wdUser.getMobile());
user.setName(wdUser.getUsername());
user.setName(wdUser.getName());
user.setIdCard(wdUser.getPersoncard());
user.setSex(wdUser.getGender());
user.setHeadimg(wdUser.getAvatar());
......@@ -94,7 +92,7 @@ public class SysUserBaseServiceImpl extends ServiceImpl<SysUserBaseMapper, SysUs
user.setPasswd(ENCODER.encode(Constant.DEFAULT_PASSWORD));
user.setPhone(wdUser.getMobile());
this.save(user);
List<WDUserCardInfo> cardList = SsbUtil.getUserCardInfoList(token);
// List<WDUserCardInfo> cardList = SsbUtil.getUserCardInfoList(token);
}
UserInfo info = new UserInfo();
......
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<HpgpBusyIdlePrediction> {
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);
}
}
}
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<HpgpBusyIdlePred
* @param deptName 标准科室名称
* @return 忙闲医院科室
*/
List<DeptPredictionVO> busyIdlePrediction(String deptName);
List<HpgpBusyIdlePrediction> busyIdlePrediction(String deptName);
void statisticResourceInfo(HpgpDepartmentRank dept, Date startDate, Date endDate);
}
......@@ -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<HpgpBusyIdlePredictionMapper, HpgpBusyIdlePrediction> implements HpgpBusyIdlePredictionService {
private final HpgpDepartmentRankMapper departmentRankMapper;
private final StringRedisTemplate stringRedisTemplate;
@Override
public List<DeptPredictionVO> busyIdlePrediction(String deptName) {
public List<HpgpBusyIdlePrediction> busyIdlePrediction(String deptName) {
// 查询科室排名
// 组装医院代码、科室代码
// 查询医院忙闲
......@@ -55,79 +46,147 @@ public class HpgpBusyIdlePredictionServiceImpl extends ServiceImpl<HpgpBusyIdleP
return null;
}
DateTime startTime = DateUtil.date();
DateTime endTime = DateUtil.offsetDay(DateUtil.date(), 7);
List<DeptPredictionVO> result = new ArrayList<>();
DateTime endTime = DateUtil.offsetDay(DateUtil.date(), 6);
List<HpgpBusyIdlePrediction> result = new ArrayList<>();
rankList.forEach(rank -> {
List<DeptPredictionVO> 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> outPatInfo = WanDaHttpUtil.getResourceOutPatInfo(deptInfo);
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);
});
}
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))));
// 生成无号源信息
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<OutPatInfo> outList = WanDaHttpUtil.getResourceOutPatInfo(deptInfo);
List<DoctInfo> docList = WanDaHttpUtil.getResourceDoctInfo(deptInfo);
if (CollUtil.isEmpty(outList) && CollUtil.isEmpty(docList)) {
return;
}
Map<String, HpgpBusyIdlePrediction> 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<HpgpBusyIdlePrediction> 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<DoctInfo> docList, Map<String, HpgpBusyIdlePrediction> 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<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) -> {
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<OutPatInfo> outList, Map<String, HpgpBusyIdlePrediction> 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<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) -> {
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);
});
}
});
}
}
}
......@@ -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<HpgpDepartmentRankMapper, HpgpDepartmentRank> implements HpgpDepartmentRankService {
@Override
public void updateResource() {
List<HpgpDepartmentRank> deptList = this.list();
......
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.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<HpDeptInfo> 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<HpgpDepartmentRank> 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();
}
}
......@@ -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<WDUserCardInfo> cardList = SsbUtil.getUserCardInfoList(token);
base = hphyPatientBaseService.saveSSbInfo(current, userInfo, cardList);
hpPatientCardService.save(base, cardList);
......
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<HpgpDepartmentRank> 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<DoctInfo> doctInfos = WanDaHttpUtil.getDoctInfo(new DeptInfo(hosOrgCode));
......
......@@ -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<HpDeptInfoMapper, HpDeptI
return remainDoctors;
}
/**
* 消化内科 42503527600 上海市瑞金医院卢湾分院 1013 3122 消化科 1 1013 3122
* 消化内科 Y0180100700 上海交通大学医学院附属第九人民医院黄浦分院 293 3 消化内科 2 293 3
* 消化内科 42502763900 黄浦区肿瘤防治院 10 0002 消化专科 3 10 0002
* @param args
*/
// public static void main(String[] args) {
//
// DeptInfo info = new DeptInfo();
......@@ -156,34 +147,34 @@ public class HpDeptInfoServiceImpl extends ServiceImpl<HpDeptInfoMapper, HpDeptI
// public static void main(String[] args) {
// NumSourceInfo numSourceInfo = new NumSourceInfo();
// numSourceInfo.setHosOrgCode("Y0180100700");
// numSourceInfo.setOneDeptCode("293");
// numSourceInfo.setDeptCode("3");
// numSourceInfo.setHosOrgCode("E7880343800");
// numSourceInfo.setOneDeptCode("50");
// numSourceInfo.setDeptCode("2006");
// numSourceInfo.setOrderType(WanDaConstant.ORDER_TYPE_OUTP);
// numSourceInfo.setResourceCode("10220");
// numSourceInfo.setResourceCode("0085");
// numSourceInfo.setPatient_type(WanDaConstant.PATIENT_TYPE_NORMAL);
// numSourceInfo.setStartTime("2022-07-15");
// numSourceInfo.setEndTime("2022-07-22");
// numSourceInfo.setOrderNumType("102");
// Date startDate = DateUtil.date();
// Date endDate = DateUtil.offsetDay(startDate, 10);
// numSourceInfo.setStartTime(DateUtil.format(startDate, DatePattern.NORM_DATE_FORMAT));
// numSourceInfo.setEndTime(DateUtil.format(endDate, DatePattern.NORM_DATE_FORMAT));
//
// String orderNumType = numSourceInfo.getOrderNumType();
// if(WanDaConstant.ORDER_TYPE_OUTP.equals(numSourceInfo.getOrderType())){
// numSourceInfo.setOrderNumType(null);
// }
// List<NumSourceInfo> list = WanDaHttpUtil.getOrderNumInfo(numSourceInfo);
// if(WanDaConstant.ORDER_TYPE_OUTP.equals(numSourceInfo.getOrderType())){
// List<NumSourceInfo> 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);
......
......@@ -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<HphyPatientBaseMappe
base.setUserId(current.getId());
base.setOpenId(current.getOpenId());
base.setPhone(userInfo.getMobile());
base.setName(userInfo.getUsername());
base.setName(userInfo.getName());
base.setCertId(userInfo.getPersoncard());
base.setAge(String.valueOf(IdcardUtil.getAgeByIdCard(userInfo.getPersoncard())));
base.setGender(Constant.BYTE_YES.equals(userInfo.getGender()) ? "男" : "女");
......@@ -52,6 +51,7 @@ public class HphyPatientBaseServiceImpl extends ServiceImpl<HphyPatientBaseMappe
}
this.save(base);
return base;
}
return null;
}
......
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