diff --git a/cloud-common/cloud-common-core/src/main/java/cn/sh/stc/sict/cloud/common/core/constant/RedisCacheConstant.java b/cloud-common/cloud-common-core/src/main/java/cn/sh/stc/sict/cloud/common/core/constant/RedisCacheConstant.java index bf722495d09ee978f818d92f7e491a9a4b798aea..80446a30d072e4c21b3589a4acef6cf40a4197d6 100644 --- a/cloud-common/cloud-common-core/src/main/java/cn/sh/stc/sict/cloud/common/core/constant/RedisCacheConstant.java +++ b/cloud-common/cloud-common-core/src/main/java/cn/sh/stc/sict/cloud/common/core/constant/RedisCacheConstant.java @@ -36,6 +36,10 @@ 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"; public static final String DEFAULT_CODE_KEY = APP + "SICT_DEFAULT_CODE_KEY_"; public static final String LOGIN_ERROR_TIMES = APP + "login_error_times"; } diff --git a/cloud-common/cloud-common-core/src/main/java/cn/sh/stc/sict/cloud/common/core/dto/WDUserInfo.java b/cloud-common/cloud-common-core/src/main/java/cn/sh/stc/sict/cloud/common/core/dto/WDUserInfo.java index 08042a1fd26442ec3a5806b921db60fe8c78d8e9..4ddaa6d0f0c670cfbe69840f335ed5410b7715ca 100644 --- a/cloud-common/cloud-common-core/src/main/java/cn/sh/stc/sict/cloud/common/core/dto/WDUserInfo.java +++ b/cloud-common/cloud-common-core/src/main/java/cn/sh/stc/sict/cloud/common/core/dto/WDUserInfo.java @@ -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; diff --git a/smart-health-modules/cloud-upms/cloud-upms-biz/src/main/java/cn/sh/stc/sict/cloud/upms/service/impl/SysUserBaseServiceImpl.java b/smart-health-modules/cloud-upms/cloud-upms-biz/src/main/java/cn/sh/stc/sict/cloud/upms/service/impl/SysUserBaseServiceImpl.java index dcac8369e50f2169a2fd2bacb8765c0a8df941c1..aaf1fef51fc531c335f42f9c53481ee3673e411f 100644 --- a/smart-health-modules/cloud-upms/cloud-upms-biz/src/main/java/cn/sh/stc/sict/cloud/upms/service/impl/SysUserBaseServiceImpl.java +++ b/smart-health-modules/cloud-upms/cloud-upms-biz/src/main/java/cn/sh/stc/sict/cloud/upms/service/impl/SysUserBaseServiceImpl.java @@ -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 cardList = SsbUtil.getUserCardInfoList(token); + // List cardList = SsbUtil.getUserCardInfoList(token); } UserInfo info = new UserInfo(); diff --git a/smart-health-modules/theme-schema/src/main/java/cn/sh/stc/sict/theme/HyThemeApplication.java b/smart-health-modules/theme-schema/src/main/java/cn/sh/stc/sict/theme/HyThemeApplication.java index 1ddee4ca74c2698cf88493c8e3f7e4ccb224c782..da17bf0b71e72d3054e29ae149774d5b79f7ea1b 100644 --- a/smart-health-modules/theme-schema/src/main/java/cn/sh/stc/sict/theme/HyThemeApplication.java +++ b/smart-health-modules/theme-schema/src/main/java/cn/sh/stc/sict/theme/HyThemeApplication.java @@ -4,13 +4,17 @@ 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.EnableAsync; import org.springframework.scheduling.annotation.EnableScheduling; import org.springframework.transaction.annotation.EnableTransactionManagement; /** * @author F_xh */ +@EnableAsync +@EnableCaching @EnableScheduling @EnableSictSwagger2 @SpringCloudApplication 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/controller/mobile/HpgpDiagnosticExperienceController.java b/smart-health-modules/theme-schema/src/main/java/cn/sh/stc/sict/theme/hpgp/controller/mobile/HpgpDiagnosticExperienceController.java index e7ce66de9e9fe6e0e98ed43d98a18734b2691062..30f90484d77a0bb3dd8bf50c96c69aa7cc9ed837 100644 --- a/smart-health-modules/theme-schema/src/main/java/cn/sh/stc/sict/theme/hpgp/controller/mobile/HpgpDiagnosticExperienceController.java +++ b/smart-health-modules/theme-schema/src/main/java/cn/sh/stc/sict/theme/hpgp/controller/mobile/HpgpDiagnosticExperienceController.java @@ -32,13 +32,13 @@ public class HpgpDiagnosticExperienceController extends ApiController { * 分页查询 * * @param page 分页对象 - * @param hpgpDiagnosticExperience 黄浦全科导诊——诊断经验云词 + * @param experience 黄浦全科导诊——诊断经验云词 * @return */ @ApiOperation("分页查询") @GetMapping("/page") - public R getHpgpDiagnosticExperiencePage(Page page, HpgpDiagnosticExperience hpgpDiagnosticExperience) { - page = hpgpDiagnosticExperienceService.page(page, Wrappers.query(hpgpDiagnosticExperience)); + public R getHpgpDiagnosticExperiencePage(Page page, HpgpDiagnosticExperience experience) { + page = hpgpDiagnosticExperienceService.page(page, Wrappers.query(experience)); return new R<>(page); } 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/HpgpBusyIdlePrediction.java b/smart-health-modules/theme-schema/src/main/java/cn/sh/stc/sict/theme/hpgp/model/HpgpBusyIdlePrediction.java index a286e5de00a3dcd293f6853a1887e4e1ae9c311a..a224dfa06ca04b72554279a0612d3874e1508f77 100644 --- a/smart-health-modules/theme-schema/src/main/java/cn/sh/stc/sict/theme/hpgp/model/HpgpBusyIdlePrediction.java +++ b/smart-health-modules/theme-schema/src/main/java/cn/sh/stc/sict/theme/hpgp/model/HpgpBusyIdlePrediction.java @@ -1,13 +1,15 @@ 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 { + 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); + } + } } 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 73f075570ba9f528ab413589ab10a23287786295..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 @@ -16,6 +16,7 @@ import java.io.Serializable; @Data @EqualsAndHashCode(callSuper = true) public class HpgpDepartmentRank extends Model { + private Integer id; //标准科室 @ApiModelProperty(hidden = false, value = "标准科室") private String standardDept; @@ -25,6 +26,9 @@ public class HpgpDepartmentRank extends Model { //医院名称 @ApiModelProperty(hidden = false, value = "医院名称") private String hospitalName; + + @ApiModelProperty(hidden = false, value = "一级科室代码") + private String oneDeptCode; //科室代码 @ApiModelProperty(hidden = false, value = "科室代码") private String deptCode; @@ -36,4 +40,20 @@ public class HpgpDepartmentRank extends Model { private Integer rankScore; private String tag; + + private String resourceOutPatInfo; + + private String resourceDoctInfo; + + + + /** + * 获取主键值 + * + * @return 主键值 + */ + @Override + protected Serializable pkVal() { + return this.id; + } } diff --git a/smart-health-modules/theme-schema/src/main/java/cn/sh/stc/sict/theme/hpgp/model/HpgpDiagnosticExperience.java b/smart-health-modules/theme-schema/src/main/java/cn/sh/stc/sict/theme/hpgp/model/HpgpDiagnosticExperience.java index a55b2a82f36bc1176a31c03ceb92e52f969f69e1..1003515241368a2a4b81b9ba65866ac76a6f5cf4 100644 --- a/smart-health-modules/theme-schema/src/main/java/cn/sh/stc/sict/theme/hpgp/model/HpgpDiagnosticExperience.java +++ b/smart-health-modules/theme-schema/src/main/java/cn/sh/stc/sict/theme/hpgp/model/HpgpDiagnosticExperience.java @@ -22,6 +22,9 @@ public class HpgpDiagnosticExperience extends Model { //医院名称 @ApiModelProperty(hidden = false, value = "医院名称") private String hospitalName; + + @ApiModelProperty(hidden = false, value = "一级科室代码") + private String oneDeptCode; //科室代码 @ApiModelProperty(hidden = false, value = "科室代码") private String deptCode; diff --git a/smart-health-modules/theme-schema/src/main/java/cn/sh/stc/sict/theme/hpgp/model/HpgpInspectionCheck.java b/smart-health-modules/theme-schema/src/main/java/cn/sh/stc/sict/theme/hpgp/model/HpgpInspectionCheck.java index 7211486abdd507694045970fb2241d49924a8221..f4c47c29ec5412752c5b57201ad4fe9f016dcdf9 100644 --- a/smart-health-modules/theme-schema/src/main/java/cn/sh/stc/sict/theme/hpgp/model/HpgpInspectionCheck.java +++ b/smart-health-modules/theme-schema/src/main/java/cn/sh/stc/sict/theme/hpgp/model/HpgpInspectionCheck.java @@ -22,6 +22,9 @@ public class HpgpInspectionCheck extends Model { //医院名称 @ApiModelProperty(hidden = false, value = "医院名称") private String hospitalName; + + @ApiModelProperty(hidden = false, value = "一级科室代码") + private String oneDeptCode; //科室代码 @ApiModelProperty(hidden = false, value = "科室代码") private String deptCode; diff --git a/smart-health-modules/theme-schema/src/main/java/cn/sh/stc/sict/theme/hpgp/model/HpgpLabExperience.java b/smart-health-modules/theme-schema/src/main/java/cn/sh/stc/sict/theme/hpgp/model/HpgpLabExperience.java index 4376e86042b139bb02dee5d48845bff7bb73aea1..2f3818109f9abd1a8cb282ae2b310ce79edccb47 100644 --- a/smart-health-modules/theme-schema/src/main/java/cn/sh/stc/sict/theme/hpgp/model/HpgpLabExperience.java +++ b/smart-health-modules/theme-schema/src/main/java/cn/sh/stc/sict/theme/hpgp/model/HpgpLabExperience.java @@ -19,6 +19,7 @@ public class HpgpLabExperience extends Model { private Integer id; private String hospCode; private String hospName; + private String oneDeptCode; private String deptCode; private String deptName; private String itemName; 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 b81c3c7348ffe3b2f17197c4d259008cbb284bb1..99176c3b8266c9c08b541214c4f099a8e93e3c51 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,9 +1,11 @@ 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.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 +22,9 @@ public interface HpgpBusyIdlePredictionService extends IService busyIdlePrediction(String deptName); + List busyIdlePrediction(String deptName); + + void statisticResourceInfo(HpgpDepartmentRank dept, Date startDate, Date endDate, Byte flag); + + 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 05b51a8547a59b1557554e7da6c615d41dff302a..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)表服务接口 * @@ -11,4 +13,9 @@ 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 ee9e01e2937899109555c3dbf2952c983d52107c..9afa8b320fbf2d18684e21b02747f19854216699 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 @@ -5,23 +5,24 @@ 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.db.DaoTemplate; -import cn.hutool.json.JSONArray; +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.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.model.HpDocInfo; +import cn.sh.stc.sict.theme.hphy.service.HpDocInfoService; 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.scheduling.annotation.Async; import org.springframework.stereotype.Service; import java.util.*; @@ -38,9 +39,10 @@ import java.util.stream.Collectors; @Service("hpgpBusyIdlPredictionService") public class HpgpBusyIdlePredictionServiceImpl extends ServiceImpl implements HpgpBusyIdlePredictionService { private final HpgpDepartmentRankMapper departmentRankMapper; + private final HpDocInfoService hpDocInfoService; @Override - public List busyIdlePrediction(String deptName) { + public List busyIdlePrediction(String deptName) { // 查询科室排名 // 组装医院代码、科室代码 // 查询医院忙闲 @@ -48,66 +50,215 @@ public class HpgpBusyIdlePredictionServiceImpl extends ServiceImpl result = new ArrayList<>(); + DateTime startTime = DateUtil.tomorrow(); + DateTime endTime = DateUtil.offsetDay(startTime, 6); + + List result = new ArrayList<>(); rankList.forEach(rank -> { - List rankResult = new ArrayList<>(); + result.addAll(this.listByDeptRank(rank, startTime, endTime)); + }); + return result; + } + + private HpgpBusyIdlePrediction getNoneSourcePredictionInfo(HpgpDepartmentRank 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, Byte flag) { + try { DeptInfo deptInfo = new DeptInfo(); - deptInfo.setHosOrgCode(rank.getHospitalCode()); - deptInfo.setOneDeptCode(rank.getOneDeptCode()); - deptInfo.setDeptCode(rank.getSubDeptCode()); - List outPatInfo = WanDaHttpUtil.getResourceOutPatInfo(deptInfo); - if (CollUtil.isNotEmpty(outPatInfo)) { - Map 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 orderNumInfo = WanDaHttpUtil.getOrderNumInfo(numSourceInfo); - if (CollUtil.isNotEmpty(orderNumInfo)) { - Map> 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); - }); - } - }); + deptInfo.setHosOrgCode(dept.getHospitalCode()); + deptInfo.setOneDeptCode(dept.getOneDeptCode()); + deptInfo.setDeptCode(dept.getDeptCode()); + List outList = WanDaHttpUtil.getResourceOutPatInfo(deptInfo); + List docList = WanDaHttpUtil.getResourceDoctInfo(deptInfo); + List hpDocList = hpDocInfoService.listByDeptInfo(deptInfo); + if (CollUtil.isEmpty(outList) && CollUtil.isEmpty(docList) && CollUtil.isEmpty(hpDocList)) { + return; + } + Map dateResultMap = new HashMap<>(); + this.getOutResourceInfo(dept, outList, dateResultMap, startDate, endDate); + this.getDocResourceInfo(dept, docList, dateResultMap, startDate, endDate); + if (Constant.BYTE_YES.equals(flag)) { + this.getHpDocResourceInfo(dept, hpDocList, docList, dateResultMap, startDate, endDate); + } + if (CollUtil.isNotEmpty(dateResultMap)) { dateResultMap.forEach((k, v) -> { - rankResult.add(v); + LambdaQueryWrapper 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); }); } + } catch (Exception e) { + log.error("统计号源异常, dept = {}", JSONUtil.toJsonStr(dept)); + log.error(e.getMessage(), e); + } + } + + @Override + public List 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)))); // 生成无号源信息 - 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); + 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)); } } - 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 void getDocResourceInfo(HpgpDepartmentRank + dept, List docList, Map 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 orderNumInfo = WanDaHttpUtil.getOrderNumInfo(numSourceInfo); + if (CollUtil.isNotEmpty(orderNumInfo)) { + hpDocInfoService.updateResource(numSourceInfo, Constant.BYTE_YES); + Map> 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); + }); + } else { + hpDocInfoService.updateResource(numSourceInfo, Constant.BYTE_NO); + } + }); + } + } + + private void getHpDocResourceInfo(HpgpDepartmentRank dept, + List hpDocList, List docList, + Map dateResultMap, + Date startDate, + Date endDate) { + Set resourceCodeSet = CollUtil.isEmpty(docList) ? new HashSet<>() : docList.stream().map(DoctInfo::getResourceCode).collect(Collectors.toSet()); + if (CollUtil.isNotEmpty(hpDocList)) { + hpDocList.forEach(doc -> { + if (StrUtil.isEmpty(doc.getResourceCode()) || resourceCodeSet.contains(doc.getResourceCode())) { + return; + } + 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 orderNumInfo = WanDaHttpUtil.getOrderNumInfo(numSourceInfo); + if (CollUtil.isNotEmpty(orderNumInfo)) { + hpDocInfoService.updateResource(numSourceInfo, Constant.BYTE_YES); + Map> 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); + }); + } else { + hpDocInfoService.updateResource(numSourceInfo, Constant.BYTE_NO); + } + }); + } + } + + private void getOutResourceInfo(HpgpDepartmentRank + dept, List outList, Map 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 orderNumInfo = WanDaHttpUtil.getOrderNumInfo(numSourceInfo); + if (CollUtil.isNotEmpty(orderNumInfo)) { + Map> 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); + }); + } + }); + } + } } 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 1b20e69c87807117b213358753042b78a4e9aa83..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,18 +1,82 @@ 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; 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; +import java.util.List; + /** * 黄浦全科导诊——科室排名(HpgpDepartmentRank)表服务实现类 * * @author zhangly * @since 2022-01-14 09:56:47 */ +@Slf4j +@AllArgsConstructor @Service("hpgpDepartmentRankService") public class HpgpDepartmentRankServiceImpl extends ServiceImpl implements HpgpDepartmentRankService { + + @Override + public void updateResource() { + List deptList = this.list(); + deptList.forEach(dept -> { + if (dept.getOneDeptCode().equals(dept.getDeptCode())) { + return; + } + this.asyncUpdateRank(dept); + }); + } + + @Override + public HpgpDepartmentRank getByCode(String hospCode, String oneDeptCode, String deptCode) { + LambdaQueryWrapper 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(); + deptInfo.setHosOrgCode(dept.getHospitalCode()); + deptInfo.setOneDeptCode(dept.getOneDeptCode()); + deptInfo.setDeptCode(dept.getDeptCode()); + List resourceOutPatInfo = WanDaHttpUtil.getResourceOutPatInfo(deptInfo); + List resourceDoctInfo = WanDaHttpUtil.getResourceDoctInfo(deptInfo); + if (CollUtil.isEmpty(resourceDoctInfo) && CollUtil.isEmpty(resourceOutPatInfo)) { + return; + } + HpgpDepartmentRank update = new HpgpDepartmentRank(); + update.setId(dept.getId()); + update.setResourceDoctInfo(JSONUtil.toJsonStr(resourceDoctInfo)); + update.setResourceOutPatInfo(JSONUtil.toJsonStr(resourceOutPatInfo)); + this.updateById(update); + } + } diff --git a/smart-health-modules/theme-schema/src/main/java/cn/sh/stc/sict/theme/hpgp/vo/DeptPredictionVO.java b/smart-health-modules/theme-schema/src/main/java/cn/sh/stc/sict/theme/hpgp/vo/DeptPredictionVO.java deleted file mode 100644 index 92a5021152493d4fda13e586dcf204710ae91dfe..0000000000000000000000000000000000000000 --- a/smart-health-modules/theme-schema/src/main/java/cn/sh/stc/sict/theme/hpgp/vo/DeptPredictionVO.java +++ /dev/null @@ -1,31 +0,0 @@ -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); - } - } -} diff --git a/smart-health-modules/theme-schema/src/main/java/cn/sh/stc/sict/theme/hphy/controller/mp/HpDeptInfoController.java b/smart-health-modules/theme-schema/src/main/java/cn/sh/stc/sict/theme/hphy/controller/mp/HpDeptInfoController.java index ee3f9e97f4458a070a403da4faa0a94a7d884de2..d2aae49f851a06085435e5c94398ffc8df92c84d 100644 --- a/smart-health-modules/theme-schema/src/main/java/cn/sh/stc/sict/theme/hphy/controller/mp/HpDeptInfoController.java +++ b/smart-health-modules/theme-schema/src/main/java/cn/sh/stc/sict/theme/hphy/controller/mp/HpDeptInfoController.java @@ -1,17 +1,26 @@ 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.constant.Constant; 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; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.api.ApiController; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiParam; import lombok.AllArgsConstructor; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; + +import java.util.Date; +import java.util.List; /** * (HpDeptInfo)维护接口 @@ -28,11 +37,56 @@ 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() { + List deptList = hpDeptInfoService.list(); + deptList.forEach(dept -> { + if (StrUtil.isEmpty(dept.getOneDeptCode()) || StrUtil.isEmpty(dept.getDeptCode())) { + return; + } + hpDeptInfoService.asyncUpdate(dept); + }); + return new R(); + } + + @ApiOperation("更新科室排行表号源信息") + @PostMapping("/rank/wd/resource") + public R updateRankDeptResource() { + hpgpDepartmentRankService.updateResource(); + return new R(); + } + + @ApiOperation("定时统计排行科室的号源信息") + @PostMapping("/statistic/rank/wd/resource") + public R statisticRankDeptResourceInfo(@RequestParam(value = "hospCode", required = false) String hospCode, + @RequestParam(value = "oneDeptCode", required = false) String oneDeptCode, + @RequestParam(value = "dept", required = false) String deptCode, + @RequestParam(value = "flag", required = false, defaultValue = Constant.STRING_NO) Byte flag) { + LambdaQueryWrapper wrapper = Wrappers.lambdaQuery(); + wrapper.eq(StrUtil.isNotEmpty(hospCode), HpgpDepartmentRank::getHospitalCode, hospCode) + .eq(StrUtil.isNotEmpty(oneDeptCode), HpgpDepartmentRank::getOneDeptCode, oneDeptCode) + .eq(StrUtil.isNotEmpty(deptCode), HpgpDepartmentRank::getDeptCode, deptCode); + List deptList = hpgpDepartmentRankService.list(wrapper); + 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, flag); + }); + return new R(); + } } diff --git a/smart-health-modules/theme-schema/src/main/java/cn/sh/stc/sict/theme/hphy/controller/mp/HphyPatientBaseController.java b/smart-health-modules/theme-schema/src/main/java/cn/sh/stc/sict/theme/hphy/controller/mp/HphyPatientBaseController.java index 20f186cddbade1e78748f85fd2374e7f29dd7f84..70009f77f99d27d477a7930c30d6938227d67146 100644 --- a/smart-health-modules/theme-schema/src/main/java/cn/sh/stc/sict/theme/hphy/controller/mp/HphyPatientBaseController.java +++ b/smart-health-modules/theme-schema/src/main/java/cn/sh/stc/sict/theme/hphy/controller/mp/HphyPatientBaseController.java @@ -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 cardList = SsbUtil.getUserCardInfoList(token); base = hphyPatientBaseService.saveSSbInfo(current, userInfo, cardList); hpPatientCardService.save(base, cardList); diff --git a/smart-health-modules/theme-schema/src/main/java/cn/sh/stc/sict/theme/hphy/controller/mp/WDController.java b/smart-health-modules/theme-schema/src/main/java/cn/sh/stc/sict/theme/hphy/controller/mp/WDController.java index dcff87b52a41f5fd309accee8ff716ab47471026..32137ff90f1fbfbf05179ad37180a2d13755b81b 100644 --- a/smart-health-modules/theme-schema/src/main/java/cn/sh/stc/sict/theme/hphy/controller/mp/WDController.java +++ b/smart-health-modules/theme-schema/src/main/java/cn/sh/stc/sict/theme/hphy/controller/mp/WDController.java @@ -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,21 @@ 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 list = WanDaHttpUtil.getOrderNumInfo(numSourceInfo); + if(CollUtil.isEmpty(list)){ + return new R(); + } + if(WanDaConstant.ORDER_TYPE_OUTP.equals(numSourceInfo.getOrderType())){ + List 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 +106,7 @@ public class WDController { // // return new R(list); // } - return new R().success(list); +// return new R().success(list); } @ApiOperation("获取测压亭列表") @@ -98,4 +114,5 @@ public class WDController { public R getPressureStationList(){ return new R(); } + } diff --git a/smart-health-modules/theme-schema/src/main/java/cn/sh/stc/sict/theme/hphy/controller/web/HpDocInfoController.java b/smart-health-modules/theme-schema/src/main/java/cn/sh/stc/sict/theme/hphy/controller/web/HpDocInfoController.java index 81d35b88c391eb089bd8337f4035fce2f01e9591..f1d75a5842a0fd2f40f3ccef72a21eadb8475d42 100644 --- a/smart-health-modules/theme-schema/src/main/java/cn/sh/stc/sict/theme/hphy/controller/web/HpDocInfoController.java +++ b/smart-health-modules/theme-schema/src/main/java/cn/sh/stc/sict/theme/hphy/controller/web/HpDocInfoController.java @@ -23,4 +23,5 @@ public class HpDocInfoController extends ApiController { * 服务对象 */ private final HpDocInfoService hpDocInfoService; + } \ No newline at end of file diff --git a/smart-health-modules/theme-schema/src/main/java/cn/sh/stc/sict/theme/hphy/model/HpDeptInfo.java b/smart-health-modules/theme-schema/src/main/java/cn/sh/stc/sict/theme/hphy/model/HpDeptInfo.java index 8990e66b3cabe2925f247e0b4a77048f62b8426e..a488e6a359820d03b0bad4958c3f3d86dde5ac23 100644 --- a/smart-health-modules/theme-schema/src/main/java/cn/sh/stc/sict/theme/hphy/model/HpDeptInfo.java +++ b/smart-health-modules/theme-schema/src/main/java/cn/sh/stc/sict/theme/hphy/model/HpDeptInfo.java @@ -43,6 +43,10 @@ public class HpDeptInfo extends Model { @ApiModelProperty(hidden = false, value = "显示次序") private String indexNo; + private String resourceOutPatInfo; + + private String resourceDoctInfo; + /** * 获取主键值 diff --git a/smart-health-modules/theme-schema/src/main/java/cn/sh/stc/sict/theme/hphy/model/HpDocInfo.java b/smart-health-modules/theme-schema/src/main/java/cn/sh/stc/sict/theme/hphy/model/HpDocInfo.java index e02c07d7801cc9e434f85408e6391641e4b861fc..dc4ec936aa4195f41522689af38580b5dd819503 100644 --- a/smart-health-modules/theme-schema/src/main/java/cn/sh/stc/sict/theme/hphy/model/HpDocInfo.java +++ b/smart-health-modules/theme-schema/src/main/java/cn/sh/stc/sict/theme/hphy/model/HpDocInfo.java @@ -55,6 +55,8 @@ public class HpDocInfo extends Model { @ApiModelProperty(hidden = false, value = "是否有资源(0有,1无)") private String isResource; + private Byte hasResource; + /** * 获取主键值 diff --git a/smart-health-modules/theme-schema/src/main/java/cn/sh/stc/sict/theme/hphy/schedule/RefreshJob.java b/smart-health-modules/theme-schema/src/main/java/cn/sh/stc/sict/theme/hphy/schedule/RefreshJob.java index 122f41ac1b1cedc07f5cc5142e613c2a2ce0bc10..7ca4c31f26e37c1903c034ab9f3be0b0d3801245 100644 --- a/smart-health-modules/theme-schema/src/main/java/cn/sh/stc/sict/theme/hphy/schedule/RefreshJob.java +++ b/smart-health-modules/theme-schema/src/main/java/cn/sh/stc/sict/theme/hphy/schedule/RefreshJob.java @@ -1,6 +1,12 @@ 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.cloud.common.core.constant.Constant; +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 +27,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 +45,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 +109,23 @@ public class RefreshJob { } } + /** + * 每天中午12点,晚上12点,统计号源信息 + */ + // @Scheduled(cron = "0 50 12 * * ? ") + @Scheduled(cron = "0 0 0,12 * * ? ") + public void statisticRankDeptResourceInfo() { + List 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, Constant.BYTE_NO); + }); + } + private void saveDoctor(String hosOrgCode, MapperFactory factory) { List doctInfos = WanDaHttpUtil.getDoctInfo(new DeptInfo(hosOrgCode)); diff --git a/smart-health-modules/theme-schema/src/main/java/cn/sh/stc/sict/theme/hphy/service/HpDeptInfoService.java b/smart-health-modules/theme-schema/src/main/java/cn/sh/stc/sict/theme/hphy/service/HpDeptInfoService.java index 4cd0a849e1c7d5c8c2c55087f12faf0e5b79cfef..2371ab30dcfe3d675bc9ffa13aa41be1c457a40f 100644 --- a/smart-health-modules/theme-schema/src/main/java/cn/sh/stc/sict/theme/hphy/service/HpDeptInfoService.java +++ b/smart-health-modules/theme-schema/src/main/java/cn/sh/stc/sict/theme/hphy/service/HpDeptInfoService.java @@ -19,4 +19,6 @@ public interface HpDeptInfoService extends IService { * @return */ DeptDoctorsVO getDeptDoctors(String hospitalCode, String deptCode); + + void asyncUpdate(HpDeptInfo dept); } diff --git a/smart-health-modules/theme-schema/src/main/java/cn/sh/stc/sict/theme/hphy/service/HpDocInfoService.java b/smart-health-modules/theme-schema/src/main/java/cn/sh/stc/sict/theme/hphy/service/HpDocInfoService.java index 55752892ab1d66615e799f260fe28a6164440724..ea649d1d9c67c645ca80d7c086df41f4dd3a4f34 100644 --- a/smart-health-modules/theme-schema/src/main/java/cn/sh/stc/sict/theme/hphy/service/HpDocInfoService.java +++ b/smart-health-modules/theme-schema/src/main/java/cn/sh/stc/sict/theme/hphy/service/HpDocInfoService.java @@ -4,6 +4,8 @@ import cn.sh.stc.sict.theme.hphy.model.HpDocInfo; import cn.sh.stc.sict.theme.hphy.model.HphyGuideRecord; import cn.sh.stc.sict.theme.hphy.vo.DoctorMatchVO; import cn.sh.stc.sict.theme.hphy.vo.PythonResult; +import cn.sh.stc.sict.theme.hphy.wd.DeptInfo; +import cn.sh.stc.sict.theme.hphy.wd.NumSourceInfo; import com.baomidou.mybatisplus.extension.service.IService; import java.util.List; @@ -26,4 +28,8 @@ public interface HpDocInfoService extends IService { List getRecommendList(HphyGuideRecord guide, List pythonList); void saveDoctor(List docInfos, String hosOrgCode); + + List listByDeptInfo(DeptInfo deptInfo); + + void updateResource(NumSourceInfo numSourceInfo, Byte hasResource); } \ No newline at end of file diff --git a/smart-health-modules/theme-schema/src/main/java/cn/sh/stc/sict/theme/hphy/service/impl/HpDeptInfoServiceImpl.java b/smart-health-modules/theme-schema/src/main/java/cn/sh/stc/sict/theme/hphy/service/impl/HpDeptInfoServiceImpl.java index 00695a0ef2626e919b7e84669731bde9f39198bf..0bfc12f211aee3703d54217db7d6da2acab2b608 100644 --- a/smart-health-modules/theme-schema/src/main/java/cn/sh/stc/sict/theme/hphy/service/impl/HpDeptInfoServiceImpl.java +++ b/smart-health-modules/theme-schema/src/main/java/cn/sh/stc/sict/theme/hphy/service/impl/HpDeptInfoServiceImpl.java @@ -1,24 +1,33 @@ package cn.sh.stc.sict.theme.hphy.service.impl; +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.collection.CollUtil; +import cn.hutool.json.JSONUtil; +import cn.sh.stc.sict.cloud.common.core.constant.Constant; 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; -import cn.sh.stc.sict.theme.hphy.dao.HpHosInfoMapper; 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.DoctInfo; import cn.sh.stc.sict.theme.hphy.wd.OutPatInfo; import cn.sh.stc.sict.theme.hphy.wd.WanDaHttpUtil; 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.scheduling.annotation.Async; import org.springframework.stereotype.Service; +import java.util.ArrayList; import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; /** * (HpDeptInfo)表服务实现类 @@ -30,46 +39,193 @@ import java.util.List; @AllArgsConstructor @Service("hpDeptInfoService") public class HpDeptInfoServiceImpl extends ServiceImpl 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() .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; } LambdaQueryWrapper docWrapper = new LambdaQueryWrapper<>(); - docWrapper.eq(HpDocInfo::getHosOrgCode, hospitalCode); - docWrapper.eq(HpDocInfo::getOneDeptCode, deptInfo.getOneDeptCode()); - if (DataConstant.TWO_DEPT.equals(deptInfo.getDeptLevel())){ + docWrapper.eq(HpDocInfo::getHosOrgCode, hospitalCode) + .eq(HpDocInfo::getOneDeptCode, deptInfo.getOneDeptCode()) + .eq(HpDocInfo::getHasResource, Constant.BYTE_YES); + + if (DataConstant.TWO_DEPT.equals(deptInfo.getDeptLevel())) { docWrapper.eq(HpDocInfo::getDeptCode, deptInfo.getDeptCode()); } docWrapper.orderByAsc(HpDocInfo::getIndexNo); - List doctors = hpDocInfoMapper.selectList(docWrapper); + List doctors = hpDocInfoService.list(docWrapper); + - // 查询可预约医生信息 - // DeptInfo info = new DeptInfo(); - // List resourceDoctInfo = WanDaHttpUtil.getResourceDoctInfo(info); DeptInfo info = new DeptInfo(); info.setHosOrgCode(deptInfo.getHosOrgCode()); info.setOneDeptCode(deptInfo.getOneDeptCode()); info.setDeptCode(deptInfo.getDeptCode()); List resourceOutPatInfo = WanDaHttpUtil.getResourceOutPatInfo(info); + List resourceDoctInfo = WanDaHttpUtil.getResourceDoctInfo(info); + List remainDoctors = this.getRemainDoctList(doctors, resourceDoctInfo); + + return new DeptDoctorsVO(hosInfo, deptInfo, resourceOutPatInfo, remainDoctors); + } + + @Async + @Override + public void asyncUpdate(HpDeptInfo dept) { + DeptInfo deptInfo = new DeptInfo(); + deptInfo.setHosOrgCode(dept.getHosOrgCode()); + deptInfo.setOneDeptCode(dept.getOneDeptCode()); + deptInfo.setDeptCode(dept.getDeptCode()); + List resourceOutPatInfo = WanDaHttpUtil.getResourceOutPatInfo(deptInfo); + List resourceDoctInfo = WanDaHttpUtil.getResourceDoctInfo(deptInfo); + if (CollUtil.isEmpty(resourceDoctInfo) && CollUtil.isEmpty(resourceOutPatInfo)) { + return; + } + HpDeptInfo update = new HpDeptInfo(); + update.setId(dept.getId()); + update.setResourceDoctInfo(JSONUtil.toJsonStr(resourceDoctInfo)); + update.setResourceOutPatInfo(JSONUtil.toJsonStr(resourceOutPatInfo)); + this.updateById(update); + } + + private List getRemainDoctList(List doctors, List resourceDoctInfo) { + Map doctorMap = doctors.stream().collect(Collectors.groupingBy(HpDocInfo::getResourceCode, Collectors.collectingAndThen(Collectors.toList(), x -> x.get(0)))); + List remainDoctors = new ArrayList<>(); + remainDoctors.addAll(doctors); + resourceDoctInfo.forEach(res -> { + if (!doctorMap.containsKey(res.getResourceCode())) { + 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("Y0180100700"); +// info.setOneDeptCode("293"); +// info.setDeptCode("3"); +// List resourceOutPatInfo = WanDaHttpUtil.getResourceOutPatInfo(info); +// List 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-25"); +// numSourceInfo.setEndTime("2022-08-08"); +// +// List orderNumInfo = WanDaHttpUtil.getOrderNumInfo(numSourceInfo); +// log.error("========================="); +// log.error("numInfo = {}", JSONUtil.toJsonStr(orderNumInfo)); +// } + + +// public static void main(String[] args) { +// NumSourceInfo numSourceInfo = new NumSourceInfo(); +// numSourceInfo.setHosOrgCode("E7880343800"); +// numSourceInfo.setOneDeptCode("50"); +// numSourceInfo.setDeptCode("2006"); +// numSourceInfo.setOrderType(WanDaConstant.ORDER_TYPE_OUTP); +// numSourceInfo.setResourceCode("0085"); +// numSourceInfo.setPatient_type(WanDaConstant.PATIENT_TYPE_NORMAL); +// 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)); +// +// List list = WanDaHttpUtil.getOrderNumInfo(numSourceInfo); +// +// log.error("list = {}", JSONUtil.toJsonStr(list)); + +// NumSourceInfo numSourceInfo = new NumSourceInfo(); +// numSourceInfo.setHosOrgCode(orgCode); +// numSourceInfo.setOneDeptCode(oneDeptCode); +// numSourceInfo.setDeptCode(deptCode); +// numSourceInfo.setOrderType(WanDaConstant.ORDER_TYPE_DOCT); +// numSourceInfo.setResourceCode(docResourceCode); +// numSourceInfo.setPatient_type(WanDaConstant.PATIENT_TYPE_NORMAL); +// numSourceInfo.setStartTime("2022-08-20"); +// numSourceInfo.setEndTime("2022-09-03"); +// List result = WanDaHttpUtil.getOrderNumInfo(numSourceInfo); +// log.error("numSourceInfo = {}", JSONUtil.toJsonStr(result)); + +// NumSourceInfo numSourceInfo = new NumSourceInfo(); +// numSourceInfo.setHosOrgCode(orgCode); +// numSourceInfo.setOneDeptCode(oneDeptCode); +// numSourceInfo.setDeptCode(deptCode); +// numSourceInfo.setOrderType(WanDaConstant.ORDER_TYPE_CLINC); +// numSourceInfo.setResourceCode(deptCode); +// numSourceInfo.setPatient_type(WanDaConstant.PATIENT_TYPE_NORMAL); +// numSourceInfo.setStartTime("2022-08-20"); +// numSourceInfo.setEndTime("2022-09-03"); +// List result = WanDaHttpUtil.getOrderNumInfo(numSourceInfo); +// log.error("numSourceInfo = {}", JSONUtil.toJsonStr(result)); +// } + + + /** + * Y0180100700 293 3 上海交通大学医学院附属第九人民医院黄浦分院 内科 消化内科 03.02 消化内科 + * Y0180100700 293 6 上海交通大学医学院附属第九人民医院黄浦分院 内科 心血管内科 03.04 心血管内科 + * @param args + */ +// public static void main(String[] args) { +// String orgCode = "Y0180100700"; +// String oneDeptCode = "293"; +// String deptCode = "2"; +// String docResourceCode = "175"; // 陈芳 +// +// NumSourceInfo numSourceInfo = new NumSourceInfo(); +// numSourceInfo.setHosOrgCode(orgCode); +// numSourceInfo.setOneDeptCode(oneDeptCode); +// numSourceInfo.setDeptCode(deptCode); +// numSourceInfo.setOrderType(WanDaConstant.ORDER_TYPE_DOCT); +// numSourceInfo.setResourceCode(docResourceCode); +// numSourceInfo.setPatient_type(WanDaConstant.PATIENT_TYPE_NORMAL); +// numSourceInfo.setStartTime("2022-08-20"); +// numSourceInfo.setEndTime("2022-09-03"); +// List result = WanDaHttpUtil.getOrderNumInfo(numSourceInfo); +// log.error("numSourceInfo = {}", JSONUtil.toJsonStr(result)); + +// HosInfo hosInfo = new HosInfo(); +// hosInfo.setHosOrgCode(orgCode); +// List oneDeptInfo = WanDaHttpUtil.getDeptInfoTop(hosInfo); +// log.error("oneDeptInfo = {}", JSONUtil.toJsonStr(oneDeptInfo)); +// DeptInfo deptInfo = new DeptInfo(); +// deptInfo.setHosOrgCode(orgCode); +// deptInfo.setOneDeptCode(oneDeptCode); +// List deptInfoTwo = WanDaHttpUtil.getDeptInfoTwo(deptInfo); +// log.error("deptInfoTwo = {}", JSONUtil.toJsonStr(deptInfoTwo)); +// deptInfo.setDeptCode(deptCode); +// List resourceOutPatInfo = WanDaHttpUtil.getResourceOutPatInfo(deptInfo); +// log.error("resourceOutPatInfo = {}", JSONUtil.toJsonStr(resourceOutPatInfo)); +// List resourceDoctInfo = WanDaHttpUtil.getResourceDoctInfo(deptInfo); +// log.error("resourceDoctInfo = {}", JSONUtil.toJsonStr(resourceDoctInfo)); +// } } diff --git a/smart-health-modules/theme-schema/src/main/java/cn/sh/stc/sict/theme/hphy/service/impl/HpDocInfoServiceImpl.java b/smart-health-modules/theme-schema/src/main/java/cn/sh/stc/sict/theme/hphy/service/impl/HpDocInfoServiceImpl.java index 475f988cffae47d280c8d17e50d3aa0eba4b1790..70c3e6a9c7731471fa8017e690e788fe36e27ad3 100644 --- a/smart-health-modules/theme-schema/src/main/java/cn/sh/stc/sict/theme/hphy/service/impl/HpDocInfoServiceImpl.java +++ b/smart-health-modules/theme-schema/src/main/java/cn/sh/stc/sict/theme/hphy/service/impl/HpDocInfoServiceImpl.java @@ -1,6 +1,7 @@ package cn.sh.stc.sict.theme.hphy.service.impl; import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.StrUtil; import cn.sh.stc.sict.theme.hphy.dao.HpDocInfoMapper; import cn.sh.stc.sict.theme.hphy.model.HpDocInfo; import cn.sh.stc.sict.theme.hphy.model.HphyGuideMatch; @@ -9,7 +10,11 @@ import cn.sh.stc.sict.theme.hphy.service.HpDocInfoService; import cn.sh.stc.sict.theme.hphy.service.HphyGuideMatchService; import cn.sh.stc.sict.theme.hphy.vo.DoctorMatchVO; import cn.sh.stc.sict.theme.hphy.vo.PythonResult; +import cn.sh.stc.sict.theme.hphy.wd.DeptInfo; +import cn.sh.stc.sict.theme.hphy.wd.HosInfo; +import cn.sh.stc.sict.theme.hphy.wd.NumSourceInfo; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import lombok.AllArgsConstructor; import org.springframework.stereotype.Service; @@ -41,7 +46,7 @@ public class HpDocInfoServiceImpl extends ServiceImpl getRecommendList(HphyGuideRecord guide, List pythonList) { List result = new ArrayList<>(); - if(CollUtil.isNotEmpty(pythonList)){ + if (CollUtil.isNotEmpty(pythonList)) { Map matchMap = pythonList.stream().collect(Collectors.toMap(PythonResult::getDoctorId, PythonResult::getMatchScore)); List doctorIdList = pythonList.stream().map(PythonResult::getDoctorId).collect(Collectors.toList()); LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); @@ -82,4 +87,25 @@ public class HpDocInfoServiceImpl extends ServiceImpl().eq(HpDocInfo::getHosOrgCode, hosOrgCode)); this.saveBatch(docInfos); } + + @Override + public List listByDeptInfo(DeptInfo deptInfo) { + LambdaQueryWrapper wrapper = Wrappers.lambdaQuery(); + wrapper.eq(HpDocInfo::getHosOrgCode, deptInfo.getHosOrgCode()) + .eq(HpDocInfo::getOneDeptCode, deptInfo.getOneDeptCode()) + .eq(StrUtil.isNotEmpty(deptInfo.getDeptCode()), HpDocInfo::getDeptCode, deptInfo.getDeptCode()); + return this.list(wrapper); + } + + @Override + public void updateResource(NumSourceInfo num, Byte hasResource) { + LambdaQueryWrapper wrapper = Wrappers.lambdaQuery(); + wrapper.eq(HpDocInfo::getHosOrgCode, num.getHosOrgCode()) + .eq(HpDocInfo::getOneDeptCode, num.getOneDeptCode()) + .eq(StrUtil.isNotEmpty(num.getDeptCode()), HpDocInfo::getDeptCode, num.getDeptCode()) + .eq(HpDocInfo::getResourceCode, num.getResourceCode()); + HpDocInfo update = new HpDocInfo(); + update.setHasResource(hasResource); + this.update(update, wrapper); + } } \ No newline at end of file diff --git a/smart-health-modules/theme-schema/src/main/java/cn/sh/stc/sict/theme/hphy/service/impl/HphyPatientBaseServiceImpl.java b/smart-health-modules/theme-schema/src/main/java/cn/sh/stc/sict/theme/hphy/service/impl/HphyPatientBaseServiceImpl.java index fdf1712d2c3b9a8a8f86ef10e61c7d8743c11344..edcc41b48bed2032104680b2d12ad6b996643be8 100644 --- a/smart-health-modules/theme-schema/src/main/java/cn/sh/stc/sict/theme/hphy/service/impl/HphyPatientBaseServiceImpl.java +++ b/smart-health-modules/theme-schema/src/main/java/cn/sh/stc/sict/theme/hphy/service/impl/HphyPatientBaseServiceImpl.java @@ -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 getOrderNumInfo(NumSourceInfo numSourceInfo) { String xml = WanDaUtil.GetOrderNumInfoServiceXML(numSourceInfo); - String body = HttpRequest.post(URL) - .body(xml) - .execute() - .body(); - - if (StrUtil.isBlank(body)) { - log.error("号源查询 失败"); - return null; - } - // log.info("号源查询:body = {}", body); - String returnXml = getReturn(body, "GetOrderNumInfoService"); - if (Constant.STRING_NO.equals(getCode(returnXml))) { - Document document = XmlUtil.readXML(returnXml); - NodeList nodeList = document.getElementsByTagName("NumSourceInfo"); - List list = new ArrayList<>(); - if (null != nodeList && nodeList.getLength() > 0) { - for (int i = 0; i < nodeList.getLength(); i++) { - list.add(XmlUtil.xmlToBean(nodeList.item(i), NumSourceInfo.class)); + String body = ""; + try { + body = HttpRequest.post(URL) + .body(xml) + .execute() + .body(); + + if (StrUtil.isBlank(body)) { + log.error("号源查询 失败"); + return null; + } + String returnXml = getReturn(body, "GetOrderNumInfoService"); + if (Constant.STRING_NO.equals(getCode(returnXml))) { + Document document = XmlUtil.readXML(returnXml); + NodeList nodeList = document.getElementsByTagName("NumSourceInfo"); + List list = new ArrayList<>(); + if (null != nodeList && nodeList.getLength() > 0) { + for (int i = 0; i < nodeList.getLength(); i++) { + list.add(XmlUtil.xmlToBean(nodeList.item(i), NumSourceInfo.class)); + } } + return list; + } else { + return null; } - return list; - } else { + }catch (Exception e){ + log.error("号源查询失败,num = {}", JSONUtil.toJsonStr(numSourceInfo)); + log.error("号源查询失败,body = {}", body); + log.error(e.getMessage(), e); return null; } } @@ -416,7 +423,7 @@ public class WanDaHttpUtil { */ public List getResourceDoctInfo(DeptInfo deptInfo) { String xml = WanDaUtil.GetResourceDoctInfoServiceXML(deptInfo); - + //log.error("获取可预约医生信息 xml = {}", xml); String body = HttpRequest.post(URL) .body(xml) .execute() @@ -426,7 +433,7 @@ public class WanDaHttpUtil { log.error("获取可预约医生信息 失败"); return null; } - log.info("获取可预约医生信息:body = {}", body); + //log.info("获取可预约医生信息:body = {}", body); String returnXml = getReturn(body, "GetResourceDoctInfoService"); return serialDoctInfo(returnXml); } @@ -439,7 +446,7 @@ public class WanDaHttpUtil { */ public List getResourceOutPatInfo(DeptInfo deptInfo) { String xml = WanDaUtil.GetResourceOutPatInfoServiceXML(deptInfo); - + //log.error("获取可预约门诊信息 xml = {}", xml); String body = HttpRequest.post(URL) .body(xml) .execute() @@ -449,7 +456,7 @@ public class WanDaHttpUtil { log.error("查询门诊信息失败"); return null; } - // log.info("查询门诊信息:body = {}", body); + //log.info("查询门诊信息:body = {}", body); String returnXml = getReturn(body, "GetResourceOutPatInfoService"); return serialOutPatInfo(returnXml); } 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 @@ + + + + + + + + + + + + + + + + + + + diff --git a/smart-health-modules/theme-schema/src/main/resources/mapper/hpgp/HpgpDepartmentRankMapper.xml b/smart-health-modules/theme-schema/src/main/resources/mapper/hpgp/HpgpDepartmentRankMapper.xml index d1fe064a018dc5821d0c4e4639946af893daf6ea..4f1a48f94b81c7c8fbb056fcd812988f3114e3bb 100644 --- a/smart-health-modules/theme-schema/src/main/resources/mapper/hpgp/HpgpDepartmentRankMapper.xml +++ b/smart-health-modules/theme-schema/src/main/resources/mapper/hpgp/HpgpDepartmentRankMapper.xml @@ -23,7 +23,7 @@ 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) + join hp_dept_info d on (dr.hospital_code = d.hos_org_code and dr.one_dept_code = d.one_dept_code and dr.dept_code = d.dept_code) where dr.standard_dept = #{deptName} order by dr.rank_score asc limit #{size}