陈昶聿
9 天以前 7245942e7b3801054f42f19f3cf05714a3639a26
【景宁】任务组开发
已修改6个文件
323 ■■■■ 文件已修改
smartor/src/main/java/com/smartor/common/ScheduleSubtaskBuilder.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/domain/PatMedInhosp.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/domain/ServiceTaskSchedule.java 73 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/service/impl/PatMedInhospServiceImpl.java 195 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/service/impl/ServiceSubtaskServiceImpl.java 19 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/resources/mapper/smartor/ServiceTaskScheduleMapper.xml 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/common/ScheduleSubtaskBuilder.java
@@ -107,9 +107,9 @@
     * 把 patTaskRelevance 的基准日字段回填到 baseSubtask 后,委托给解耦入口。
     */
    public void buildSubtasksForPatient(ServiceTask serviceTask,
                                        ServiceTaskVO serviceTaskVO,
                                        List<Map<String, Object>> preachformList,
                                        ServiceTaskSchedule schedule,
                                        List<ServiceTaskScheduleDetail> detailList,
                                        List<ServiceTaskScheduleDetail> scheduleDetailList,
                                        PatTaskRelevance patTaskRelevance,
                                        ServiceSubtask baseSubtask) {
        // 回填基准日字段(手动路径的 baseSubtask 由 VO 拼装,基准日字段可能未填全)
@@ -123,8 +123,7 @@
        if (baseSubtask.getAdmindate() == null) {
            baseSubtask.setAdmindate(patTaskRelevance.getVisittime());
        }
        buildSubtasksForPatient(serviceTask, schedule, detailList, baseSubtask,
                serviceTaskVO.getPreachformList());
        buildSubtasksForPatient(serviceTask, schedule, scheduleDetailList, baseSubtask, preachformList);
    }
    /**
smartor/src/main/java/com/smartor/domain/PatMedInhosp.java
@@ -98,6 +98,11 @@
    private String icd10code;
    /**
     * 入院诊断ICD值编号集合
     */
    @ApiModelProperty(value = "入院诊断ICD值编号集合")
    private List<String> icd10codeList;
    /**
     * 入院诊断名称
     */
    @ApiModelProperty(value = "入院诊断名称")
smartor/src/main/java/com/smartor/domain/ServiceTaskSchedule.java
@@ -99,31 +99,6 @@
    private Date scheduleBenchmarkCustomTime;
    /**
     * 对应科室
     */
    @ApiModelProperty("对应科室")
    private String deptcodes;
    /**
     * 出院病区
     */
    @ApiModelProperty("出院病区")
    private String leavehospitaldistrictcode;
    /**
     * icd10编码
     */
    @ApiModelProperty("icd10编码")
    private String icdcodes;
    /**
     * 手术等级代码
     */
    @ApiModelProperty("手术等级代码")
    @Excel(name = "手术等级代码")
    private String oplevelcodes;
    /**
     * 删除标记(0存在 1删除)
     */
    @ApiModelProperty("删除标记(0存在 1删除)")
@@ -140,4 +115,52 @@
     */
    @ApiModelProperty("院区ID")
    private String campusid;
    /**
     * 绑定科室代码(逗号分隔),任务组自动纳入匹配用
     */
    @ApiModelProperty("绑定科室代码(逗号分隔),自动纳入用")
    private String deptCodes;
    /**
     * 绑定病区代码(逗号分隔),任务组自动纳入匹配用
     */
    @ApiModelProperty("绑定病区代码(逗号分隔),自动纳入用")
    private String wardCodes;
    /**
     * 绑定疾病ICD10代码(逗号分隔),任务组自动纳入匹配用
     */
    @ApiModelProperty("绑定疾病ICD10代码(逗号分隔),自动纳入用")
    private String icd10Codes;
    /**
     * 绑定手术类型代码(逗号分隔),任务组自动纳入匹配用(本期暂不用)
     */
    @ApiModelProperty("绑定手术类型代码(逗号分隔),自动纳入用(本期暂不用)")
    private String oplevelCodes;
    /**
     * 绑定科室代码
     */
    @ApiModelProperty("绑定科室代码")
    private String deptCode;
    /**
     * 绑定病区代码
     */
    @ApiModelProperty("绑定病区代码")
    private String wardCode;
    /**
     * 绑定疾病ICD10代码
     */
    @ApiModelProperty("绑定疾病ICD10代码")
    private String icd10Code;
    /**
     * 绑定手术类型代码
     */
    @ApiModelProperty("绑定手术类型代码")
    private String oplevelCode;
}
smartor/src/main/java/com/smartor/service/impl/PatMedInhospServiceImpl.java
@@ -9,6 +9,7 @@
import com.ruoyi.common.utils.DtoConversionUtils;
import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.common.utils.StringUtils;
import com.smartor.common.ScheduleSubtaskBuilder;
import com.smartor.domain.*;
import com.smartor.domain.entity.ServiceSubtaskEntity;
import com.smartor.mapper.*;
@@ -64,6 +65,13 @@
    private String active;
    @Autowired
    private IConfigService iSysConfigService;
    @Autowired
    private ServiceTaskScheduleMapper serviceTaskScheduleMapper;
    @Autowired
    private ScheduleSubtaskBuilder scheduleSubtaskBuilder;
    @Autowired
    private ServiceTaskScheduleDetailMapper serviceTaskScheduleDetailMapper;
    /**
@@ -336,133 +344,82 @@
     */
    public int dealOutHospInfoBySchedule(String config) {
        // 一次性查出所有需要处理的出院患者(三个维度任意一个未完成)
        List<PatMedInhosp> patList = patMedInhospMapper.selectNeedProcessList();
        log.info("【统一扫描】待处理患者数:{}", patList.size());
        ServiceTask serviceTaskVo = new ServiceTask();
        serviceTaskVo.setLongTask(1);
        serviceTaskVo.setAppltype("5");
        List<ServiceTask> serviceTasks = serviceTaskMapper.selectServiceTaskList(serviceTaskVo);
        for (PatMedInhosp patMedInhosp1 : patList) {
            PatArchive patArchive = patArchiveMapper.selectPatArchiveByPatid(patMedInhosp1.getPatid());
        if (CollectionUtils.isEmpty(serviceTasks)) {
            for (ServiceTask serviceTask : serviceTasks) {
                if(!ObjectUtils.isEmpty(serviceTask.getTaskid())){
                    ServiceTaskSchedule serviceTaskSchedule = new ServiceTaskSchedule();
                    ServiceTaskSchedule taskSchedule = new ServiceTaskSchedule();
                    taskSchedule.setTaskid(serviceTask.getTaskid());
                    List<ServiceTaskSchedule> serviceTaskSchedules = serviceTaskScheduleMapper.selectServiceTaskScheduleList(taskSchedule);
                    if(CollectionUtils.isNotEmpty(serviceTaskSchedules)){
                        serviceTaskSchedule = serviceTaskSchedules.get(0);
                        String deptCodes = serviceTaskSchedule.getDeptCodes();
                        String wardCodes = serviceTaskSchedule.getWardCodes();
                        String icd10Codes = serviceTaskSchedule.getIcd10Codes();
                        String opLevelCodes = serviceTaskSchedule.getOplevelCodes();
                        List<String> icd10CodeList = new ArrayList<>();
                        List<String> opLevelList = new ArrayList<>();
                        List<String> deptCodeList = new ArrayList<>();
                        List<String> wardCodeList = new ArrayList<>();
                        Integer type = 1;
                        if (StringUtils.isNotEmpty(deptCodes)) {
                            type = 1;
                            deptCodeList = Arrays.asList(deptCodes.split(","));
                        }
                        if(StringUtils.isNotEmpty(wardCodes)) {
                            type = 2;
                            wardCodeList = Arrays.asList(wardCodes.split(","));
                        }
                        if(StringUtils.isNotEmpty(icd10Codes)) {
                            type = 3;
                            icd10CodeList = Arrays.asList(icd10Codes.split(","));
                        }
                        if (StringUtils.isNotEmpty(opLevelCodes)) {
                            opLevelList = Arrays.asList(opLevelCodes.split(","));
                        }
                        PatMedInhosp patMedInhospVo = new PatMedInhosp();
                        patMedInhospVo.setDeptcodeList(deptCodeList);
                        patMedInhospVo.setLeavehospitaldistrictcodes(wardCodeList);
                        patMedInhospVo.setIcd10codeList(icd10CodeList);
                        List<PatMedInhosp> patList = patMedInhospMapper.selectPatMedInhospList(patMedInhospVo);
                        log.info("dealOutHospInfoBySchedule 任务组随访, taskid = {}, 扫描患者人数 {}", serviceTask.getTaskid(), patList.size());
                        for(PatMedInhosp patMedInhosp : patList){
                            ServiceTaskScheduleDetail scheduleDetailVo = new ServiceTaskScheduleDetail();
                            scheduleDetailVo.setTaskid(serviceTask.getTaskid());
                            scheduleDetailVo.setScheduleid(serviceTaskSchedule.getId());
                            List<ServiceTaskScheduleDetail> serviceTaskScheduleDetails = serviceTaskScheduleDetailMapper.selectServiceTaskScheduleDetailList(scheduleDetailVo);
                            List<ServiceSubtaskPreachform> serviceSubtaskPreachformList = new ArrayList<>();
                            PatArchive patArchive = patArchiveMapper.selectPatArchiveByPatid(patMedInhosp.getPatid());
            if (Objects.isNull(patArchive)) {
                // 三个维度都标记为失败
                markAllFlagsAsError(patMedInhosp1, "患者基本信息为空");
                continue;
                                break;
            }
            // ── 维度1:科室 ──
            if ("0".equals(patMedInhosp1.getDeptcheckFlag())) {
                processTasksByDimension(patMedInhosp1, patArchive, config, 1);
                            //封装serviceSubtask
                            ServiceSubtask serviceSubtask = boxedServiceSubtask(serviceTask, patMedInhosp, patArchive, config, type);
                            List<Map<String, Object>> preachformList = new ArrayList<>();
                            if(StringUtils.isNotEmpty(serviceTask.getPreachformDesc())){
                                try {
                                    ObjectMapper objectMapper = new ObjectMapper();
                                    preachformList = objectMapper.readValue(serviceTask.getPreachformDesc(), List.class);
                                }catch (Exception e){
                                    break;
            }
            // ── 维度2:病区 ──(新华医院跳过)
            if (!active.equals("xh") && "0".equals(patMedInhosp1.getWardcheckFlag())) {
                processTasksByDimension(patMedInhosp1, patArchive, config, 2);
            }
            // ── 维度3:疾病 ──(新华医院跳过)
            if (!active.equals("xh") && "0".equals(patMedInhosp1.getDiagcheckFlag())) {
                processTasksByDimension(patMedInhosp1, patArchive, config, 3);
                            scheduleSubtaskBuilder.buildSubtasksForPatient(serviceTask, serviceTaskSchedule, serviceTaskScheduleDetails, serviceSubtask, preachformList);
                        }
                    }
                }
            }
        }
        return 1;
    }
    /**
     * 按维度找到所有匹配长期任务,批量生成 subtask
     * type: 1=科室, 2=病区, 3=疾病
     */
    private void processTasksByDimension(PatMedInhosp patMedInhosp1, PatArchive patArchive, String config, int type) {
        List<Long> matchedTaskIds = findMatchingTaskIds(patMedInhosp1, type);
        if (CollectionUtils.isEmpty(matchedTaskIds)) {
            String reason = getDimensionReason(type);
            markFlagAsNoConfig(patMedInhosp1, type, reason);
            return;
        }
        // 一条 inhosp 记录 → 多个匹配任务 → 多条 subtask
        for (Long taskId : matchedTaskIds) {
            writeInSubTask(taskId, true, patMedInhosp1, patArchive, type, config);
        }
    }
    private String getDimensionReason(int type) {
        switch (type) {
            case 1: { // 科室
                return "未找到科室匹配的长期任务";
            }
            case 2: { // 病区
                return "未找到病区匹配的长期任务";
            }
            case 3: { // 疾病
                return "未找到疾病匹配的长期任务";
            }
        }
        return "多维长期任务-匹配类型为空";
    }
    private void markFlagAsNoConfig(PatMedInhosp patMedInhosp, int type, String reason) {
        switch (type) {
            case 1: { // 科室
                patMedInhosp.setDeptcheckFlag("2");
                patMedInhosp.setRemark(reason);
                patMedInhospMapper.updatePatMedInhosp(patMedInhosp);
                break;
            }
            case 2: { // 病区
                patMedInhosp.setWardcheckFlag("2");
                patMedInhosp.setRemark(reason);
                patMedInhospMapper.updatePatMedInhosp(patMedInhosp);
                break;
            }
            case 3: { // 疾病
                patMedInhosp.setDiagcheckFlag("2");
                patMedInhosp.setRemark(reason);
                patMedInhospMapper.updatePatMedInhosp(patMedInhosp);
                break;
            }
        }
    }
    private void markAllFlagsAsError(PatMedInhosp patMedInhosp, String reason) {
        patMedInhosp.setDeptcheckFlag("2");
        patMedInhosp.setWardcheckFlag("2");
        patMedInhosp.setDiagcheckFlag("2");
        patMedInhosp.setRemark(reason);
        patMedInhospMapper.updatePatMedInhosp(patMedInhosp);
    }
    /**
     * 根据维度类型查询匹配的长期任务 ID 列表
     */
    private List<Long> findMatchingTaskIds(PatMedInhosp patMedInhosp1, int type) {
        switch (type) {
            case 1: { // 科室
                ServiceTaskdept query = new ServiceTaskdept();
                query.setLongtask(1L);
                query.setDeptCode(patMedInhosp1.getLeaveldeptcode());
                query.setDeptType("1");
                query.setOrgid(patMedInhosp1.getOrgid());
                return serviceTaskdeptMapper.selectServiceTaskdeptList(query).stream().map(ServiceTaskdept::getTaskId).collect(Collectors.toList());
            }
            case 2: { // 病区
                ServiceTaskdept query = new ServiceTaskdept();
                query.setLongtask(1L);
                query.setDeptCode(patMedInhosp1.getLeavehospitaldistrictcode());
                query.setDeptType("2");
                query.setOrgid(patMedInhosp1.getOrgid());
                return serviceTaskdeptMapper.selectServiceTaskdeptList(query).stream().map(ServiceTaskdept::getTaskId).collect(Collectors.toList());
            }
            case 3: { // 疾病
                if (StringUtils.isEmpty(patMedInhosp1.getLeaveicd10code())) return Collections.emptyList();
                ServiceTaskdiag query = new ServiceTaskdiag();
                query.setLongtask(1L);
                query.setIcd10code(patMedInhosp1.getLeaveicd10code());
                query.setOrgid(patMedInhosp1.getOrgid());
                return serviceTaskdiagMapper.selectServiceTaskdiagList(query).stream().map(ServiceTaskdiag::getTaskId).collect(Collectors.toList());
            }
        }
        return Collections.emptyList();
    }
smartor/src/main/java/com/smartor/service/impl/ServiceSubtaskServiceImpl.java
@@ -16,6 +16,7 @@
import com.ruoyi.system.mapper.SysConfigMapper;
import com.smartor.common.FtpService;
import com.smartor.common.MtSubmitSmUtil;
import com.smartor.common.ScheduleSubtaskBuilder;
import com.smartor.config.PhoneUtils;
import com.smartor.domain.DTO.ServiceSubtaskDetailDTO;
import com.smartor.domain.*;
@@ -119,7 +120,7 @@
    private IServiceTaskScheduleService serviceTaskScheduleService;
    @Autowired
    private com.smartor.common.ScheduleSubtaskBuilder scheduleSubtaskBuilder;
    private ScheduleSubtaskBuilder scheduleSubtaskBuilder;
    @Autowired
    private FtpService ftpService;
@@ -747,8 +748,12 @@
                    scheduleVO.setOrgid(serviceTask.getOrgid());
                    scheduleVO.setCampusid(serviceTask.getCampusid());
                    scheduleVO.setCreateBy(serviceTask.getCreateBy());
                    scheduleVO.setDeptcodes(serviceTask.getDeptcode());
                    scheduleVO.setLeavehospitaldistrictcode(serviceTask.getLeavehospitaldistrictcode());
                    scheduleVO.setDeptCodes(serviceTaskVO.getDeptcode());
                    scheduleVO.setWardCodes(serviceTaskVO.getLeavehospitaldistrictcode());
                    scheduleVO.setIcd10Codes(serviceTaskVO.getIcd10code());
                    scheduleVO.setOplevelCodes(serviceTaskVO.getOplevelcode());
                    log.info("----serviceTaskSchedule的值为:{}", scheduleVO);
                    serviceTaskScheduleService.saveScheduleWithDetail(scheduleVO);
                } else {
@@ -846,7 +851,7 @@
                        List<ServiceTaskScheduleDetail> detailList =
                                serviceTaskScheduleService.selectDetailByScheduleid(schedule.getId());
                        scheduleSubtaskBuilder.buildSubtasksForPatient(
                                serviceTask, serviceTaskVO, schedule, detailList, patTaskRelevance, serviceSubtask);
                                serviceTask, serviceTaskVO.getPreachformList(), schedule, detailList, patTaskRelevance, serviceSubtask);
                        continue;
                    }
@@ -1076,6 +1081,10 @@
                    scheduleVO.setTaskid(serviceTask.getTaskid());
                    scheduleVO.setOrgid(serviceTask.getOrgid());
                    scheduleVO.setCampusid(serviceTask.getCampusid());
                    scheduleVO.setDeptCodes(serviceTaskVO.getDeptcode());
                    scheduleVO.setWardCodes(serviceTaskVO.getLeavehospitaldistrictcode());
                    scheduleVO.setIcd10Codes(serviceTaskVO.getIcd10code());
                    scheduleVO.setOplevelCodes(serviceTaskVO.getOplevelcode());
                    scheduleVO.setCreateBy(serviceTask.getUpdateBy());
                    serviceTaskScheduleService.saveScheduleWithDetail(scheduleVO);
                }
@@ -1142,7 +1151,7 @@
                            serviceSubtask.setUpdateBy(serviceTask.getUpdateBy());
                            serviceSubtask.setCreateBy(serviceTask.getUpdateBy());
                            scheduleSubtaskBuilder.buildSubtasksForPatient(
                                    serviceTask, serviceTaskVO, schedule, detailList, patTaskRelevance, serviceSubtask);
                                    serviceTask, serviceTaskVO.getPreachformList(), schedule, detailList, patTaskRelevance, serviceSubtask);
                            continue;
                        }
                        if (patTaskRelevance.getIsoperation() == 2) {
smartor/src/main/resources/mapper/smartor/ServiceTaskScheduleMapper.xml
@@ -17,6 +17,10 @@
        <result property="nextExecuteTime" column="next_execute_time"/>
        <result property="scheduleBenchmark" column="schedule_benchmark"/>
        <result property="scheduleBenchmarkCustomTime" column="schedule_benchmark_custom_time"/>
        <result property="deptCodes" column="dept_codes"/>
        <result property="wardCodes" column="ward_codes"/>
        <result property="icd10Codes" column="icd10_codes"/>
        <result property="oplevelCodes" column="remark"/>
        <result property="remark" column="remark"/>
        <result property="delFlag" column="del_flag"/>
        <result property="createBy" column="create_by"/>
@@ -40,6 +44,10 @@
               next_execute_time,
               schedule_benchmark,
               schedule_benchmark_custom_time,
               deptCodes,
               wardCodes,
               icd10Codes,
               oplevelCodes,
               remark,
               del_flag,
               create_by,
@@ -69,6 +77,10 @@
        where del_flag = '0'
        <if test="taskid != null">and taskid = #{taskid}</if>
        <if test="scheduleStyle != null">and schedule_style = #{scheduleStyle}</if>
        <if test="deptCode != null">and INSTR(dept_codes,  #{deptCode}) > 0</if>
        <if test="wardCode != null">and INSTR(ward_codes,  #{wardCode}) > 0</if>
        <if test="icd10Code != null">and INSTR(icd10_codes,  #{icd10Code}) > 0</if>
        <if test="oplevelCode != null">and INSTR(oplevel_codes,  #{oplevelCode}) > 0</if>
        <if test="orgid != null and orgid != ''">and orgid = #{orgid}</if>
        <if test="campusid != null and campusid != ''">and campusid = #{campusid}</if>
        order by id desc
@@ -89,6 +101,10 @@
            <if test="nextExecuteTime != null">next_execute_time,</if>
            <if test="scheduleBenchmark != null">schedule_benchmark,</if>
            <if test="scheduleBenchmarkCustomTime != null">schedule_benchmark_custom_time,</if>
            <if test="deptCodes != null">dept_codes,</if>
            <if test="wardCodes != null">ward_codes,</if>
            <if test="icd10Codes != null">icd10_codes,</if>
            <if test="oplevelCodes != null">oplevel_codes,</if>
            <if test="remark != null">remark,</if>
            <if test="delFlag != null">del_flag,</if>
            <if test="createBy != null">create_by,</if>
@@ -110,6 +126,10 @@
            <if test="nextExecuteTime != null">#{nextExecuteTime},</if>
            <if test="scheduleBenchmark != null">#{scheduleBenchmark},</if>
            <if test="scheduleBenchmarkCustomTime != null">#{scheduleBenchmarkCustomTime},</if>
            <if test="deptCodes != null">#{deptCodes},</if>
            <if test="wardCodes != null">#{wardCodes},</if>
            <if test="icd10Codes != null">#{icd10Codes},</if>
            <if test="oplevelCodes != null">#{oplevelCodes},</if>
            <if test="remark != null">#{remark},</if>
            <if test="delFlag != null">#{delFlag},</if>
            <if test="createBy != null">#{createBy},</if>
@@ -137,6 +157,10 @@
            <if test="scheduleBenchmarkCustomTime != null">
                schedule_benchmark_custom_time = #{scheduleBenchmarkCustomTime},
            </if>
            <if test="deptCodes != null">dept_codes = #{deptCodes},</if>
            <if test="wardCodes != null">ward_codes = #{wardCodes},</if>
            <if test="icd10Codes != null">icd10_codes = #{icd10Codes},</if>
            <if test="oplevelCodes != null">oplevel_codes = #{oplevelCodes},</if>
            <if test="remark != null">remark = #{remark},</if>
            <if test="delFlag != null">del_flag = #{delFlag},</if>
            <if test="updateBy != null">update_by = #{updateBy},</if>