Commit 203dc631 authored by fshenye's avatar fshenye

优化:

1. 科室号源信息查询添加缓存
2. 医生号源信息查询处理单独查询查不到问题
3. 处理可预约医生多余系统医生问题
parent 0c1c5938
......@@ -79,4 +79,7 @@ public class RedisCacheConstant {
* 验证码前缀
*/
public static final String DEFAULT_CODE_KEY = "SICT_DEFAULT_CODE_KEY_";
public static final String DEPT_NUM_SOURCE_RESULT = "dept_num_source_result";
}
......@@ -4,6 +4,7 @@ import cn.sh.stc.sict.cloud.common.security.annotation.EnableSictFeignClients;
import cn.sh.stc.sict.cloud.common.security.annotation.EnableSictResourceServer;
import cn.sh.stc.sict.cloud.common.swagger.annotation.EnableSictSwagger2;
import org.springframework.boot.SpringApplication;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.cloud.client.SpringCloudApplication;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.transaction.annotation.EnableTransactionManagement;
......@@ -11,6 +12,7 @@ import org.springframework.transaction.annotation.EnableTransactionManagement;
/**
* @author F_xh
*/
@EnableCaching
@EnableScheduling
@EnableSictSwagger2
@SpringCloudApplication
......
......@@ -5,9 +5,11 @@ 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;
......@@ -22,9 +24,12 @@ 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.stereotype.Service;
import java.util.*;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;
/**
......@@ -38,6 +43,7 @@ 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) {
......@@ -53,60 +59,74 @@ public class HpgpBusyIdlePredictionServiceImpl extends ServiceImpl<HpgpBusyIdleP
List<DeptPredictionVO> result = new ArrayList<>();
rankList.forEach(rank -> {
List<DeptPredictionVO> rankResult = new ArrayList<>();
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);
});
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 (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);
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);
});
}
// 生成无号源信息
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);
}
}
stringRedisTemplate.opsForValue().set(key, JSONUtil.toJsonStr(rankResult), 4, TimeUnit.HOURS);
result.addAll(rankResult);
}
result.addAll(rankResult);
});
return result;
}
......
......@@ -3,6 +3,7 @@ package cn.sh.stc.sict.theme.hphy.controller.mp;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.lang.Validator;
import cn.hutool.core.util.RandomUtil;
import cn.hutool.json.JSONUtil;
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.ValidateCodeUtil;
......@@ -21,6 +22,7 @@ import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.web.bind.annotation.*;
import java.util.List;
import java.util.stream.Collectors;
/**
* @author F_xh
......@@ -72,7 +74,18 @@ public class WDController {
@GetMapping("/num/info")
public R getOrderNumberInfo(NumSourceInfo numSourceInfo) {
// 医生查询所有号源能查到,查询指定类型号源差不多,20220715处理:查询所有,过滤
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());
return new R(result);
}else{
return new R(list);
}
// if (CollUtil.isNotEmpty(list)) {
// return R.builder().code(Constant.BYTE_YES).data(list).bizCode(Constant.INT_NO).build();
......@@ -90,7 +103,7 @@ public class WDController {
//
// return new R(list);
// }
return new R().success(list);
// return new R().success(list);
}
@ApiOperation("获取测压亭列表")
......@@ -98,4 +111,5 @@ public class WDController {
public R getPressureStationList(){
return new R();
}
}
package cn.sh.stc.sict.theme.hphy.service.impl;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.date.DatePattern;
import cn.hutool.core.date.DateUtil;
import cn.hutool.json.JSONUtil;
import cn.sh.stc.sict.theme.hphy.constant.DataConstant;
import cn.sh.stc.sict.theme.hphy.dao.HpDeptInfoMapper;
import cn.sh.stc.sict.theme.hphy.dao.HpDocInfoMapper;
......@@ -8,17 +12,21 @@ import cn.sh.stc.sict.theme.hphy.model.HpDeptInfo;
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.service.HpDeptInfoService;
import cn.sh.stc.sict.theme.hphy.service.HpDocInfoService;
import cn.sh.stc.sict.theme.hphy.service.HpHosInfoService;
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.OutPatInfo;
import cn.sh.stc.sict.theme.hphy.wd.WanDaHttpUtil;
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.stereotype.Service;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.stream.Collectors;
/**
* (HpDeptInfo)表服务实现类
......@@ -30,23 +38,23 @@ import java.util.List;
@AllArgsConstructor
@Service("hpDeptInfoService")
public class HpDeptInfoServiceImpl extends ServiceImpl<HpDeptInfoMapper, HpDeptInfo> implements HpDeptInfoService {
private final HpDocInfoMapper hpDocInfoMapper;
private final HpHosInfoMapper hpHosInfoMapper;
private final HpDocInfoService hpDocInfoService;
private final HpHosInfoService hpHosInfoService;
@Override
public DeptDoctorsVO getDeptDoctors(String hospitalCode, String deptCode) {
HpHosInfo hosInfo = hpHosInfoMapper.selectById(hospitalCode);
HpHosInfo hosInfo = hpHosInfoService.getById(hospitalCode);
// 查询科室信息
// 查询医生信息
HpDeptInfo deptInfo = this.getOne(
new LambdaQueryWrapper<HpDeptInfo>()
.eq(HpDeptInfo::getHosOrgCode, hospitalCode)
.and(i -> i.eq(HpDeptInfo::getOneDeptCode, deptCode)
.or().eq(HpDeptInfo::getDeptCode, deptCode))
.or().eq(HpDeptInfo::getDeptCode, deptCode))
.orderByDesc(HpDeptInfo::getDeptLevel)
.last("limit 1")
);
if (deptInfo == null){
if (deptInfo == null) {
log.error("根据医院编码:{} 和科室编码:{} 未查出科室信息", hospitalCode, deptCode);
return null;
}
......@@ -54,22 +62,93 @@ public class HpDeptInfoServiceImpl extends ServiceImpl<HpDeptInfoMapper, HpDeptI
LambdaQueryWrapper<HpDocInfo> docWrapper = new LambdaQueryWrapper<>();
docWrapper.eq(HpDocInfo::getHosOrgCode, hospitalCode);
docWrapper.eq(HpDocInfo::getOneDeptCode, deptInfo.getOneDeptCode());
if (DataConstant.TWO_DEPT.equals(deptInfo.getDeptLevel())){
if (DataConstant.TWO_DEPT.equals(deptInfo.getDeptLevel())) {
docWrapper.eq(HpDocInfo::getDeptCode, deptInfo.getDeptCode());
}
docWrapper.orderByAsc(HpDocInfo::getIndexNo);
List<HpDocInfo> doctors = hpDocInfoMapper.selectList(docWrapper);
List<HpDocInfo> doctors = hpDocInfoService.list(docWrapper);
// 查询可预约医生信息
// DeptInfo info = new DeptInfo();
// List<DoctInfo> resourceDoctInfo = WanDaHttpUtil.getResourceDoctInfo(info);
DeptInfo info = new DeptInfo();
info.setHosOrgCode(deptInfo.getHosOrgCode());
info.setOneDeptCode(deptInfo.getOneDeptCode());
info.setDeptCode(deptInfo.getDeptCode());
List<OutPatInfo> resourceOutPatInfo = WanDaHttpUtil.getResourceOutPatInfo(info);
List<DoctInfo> resourceDoctInfo = WanDaHttpUtil.getResourceDoctInfo(info);
List<HpDocInfo> remainDoctors = this.getRemainDoctList(doctors, resourceDoctInfo);
return new DeptDoctorsVO(hosInfo, deptInfo, resourceOutPatInfo, remainDoctors);
}
private List<HpDocInfo> getRemainDoctList(List<HpDocInfo> doctors, List<DoctInfo> resourceDoctInfo) {
Map<String, HpDocInfo> doctorMap = doctors.stream().collect(Collectors.groupingBy(HpDocInfo::getResourceCode, Collectors.collectingAndThen(Collectors.toList(), x -> x.get(0))));
List<HpDocInfo> remainDoctors = new ArrayList<>();
resourceDoctInfo.forEach(res -> {
if(doctorMap.containsKey(res.getResourceCode())){
remainDoctors.add(doctorMap.get(res.getResourceCode()));
}else{
HpDocInfo doctor = BeanUtil.toBean(res, HpDocInfo.class);
hpDocInfoService.save(doctor);
remainDoctors.add(doctor);
}
});
return new DeptDoctorsVO(hosInfo, deptInfo, resourceOutPatInfo, doctors);
return remainDoctors;
}
// public static void main(String[] args) {
//
// DeptInfo info = new DeptInfo();
// info.setHosOrgCode("42503527600");
// info.setOneDeptCode("1013");
// info.setDeptCode("3122");
// List<OutPatInfo> resourceOutPatInfo = WanDaHttpUtil.getResourceOutPatInfo(info);
// List<DoctInfo> resourceDoctInfo = WanDaHttpUtil.getResourceDoctInfo(info);
// log.error("OutPatInfo = {}", JSONUtil.toJsonStr(resourceOutPatInfo));
// log.error("=========================");
// log.error("DoctInfo = {}", JSONUtil.toJsonStr(resourceDoctInfo));
//
// DoctInfo doctInfo = resourceDoctInfo.get(0);
// NumSourceInfo numSourceInfo = new NumSourceInfo();
// numSourceInfo.setHosOrgCode(doctInfo.getHosOrgCode());
// numSourceInfo.setOneDeptCode(doctInfo.getOneDeptCode());
// numSourceInfo.setDeptCode(doctInfo.getDeptCode());
// numSourceInfo.setOrderType(WanDaConstant.ORDER_TYPE_OUTP);
// numSourceInfo.setResourceCode(doctInfo.getResourceCode());
// numSourceInfo.setPatient_type(WanDaConstant.PATIENT_TYPE_NORMAL);
// numSourceInfo.setStartTime("2022-07-15");
// numSourceInfo.setEndTime("2022-07-22");
// numSourceInfo.setOrderNumType("102");
//
// List<NumSourceInfo> orderNumInfo = WanDaHttpUtil.getOrderNumInfo(numSourceInfo);
// log.error("=========================");
// log.error("numInfo = {}", JSONUtil.toJsonStr(orderNumInfo));
// }
// public static void main(String[] args) {
// NumSourceInfo numSourceInfo = new NumSourceInfo();
// numSourceInfo.setHosOrgCode("42503527600");
// numSourceInfo.setOneDeptCode("1013");
// numSourceInfo.setDeptCode("3122");
// numSourceInfo.setOrderType(WanDaConstant.ORDER_TYPE_OUTP);
// numSourceInfo.setResourceCode("10220");
// numSourceInfo.setPatient_type(WanDaConstant.PATIENT_TYPE_NORMAL);
// numSourceInfo.setStartTime("2022-07-15");
// numSourceInfo.setEndTime("2022-07-22");
// numSourceInfo.setOrderNumType("102");
//
// 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));
// }
// }
}
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