陈昶聿
9 天以前 af3ec57db40f80fba5903aaedae5e66bf46a7ed9
smartor/src/main/java/com/smartor/service/impl/ServiceSubtaskServiceImpl.java
@@ -116,6 +116,12 @@
    private IServiceSubtaskDetailTraceService traceService;
    @Autowired
    private IServiceTaskScheduleService serviceTaskScheduleService;
    @Autowired
    private com.smartor.common.ScheduleSubtaskBuilder scheduleSubtaskBuilder;
    @Autowired
    private FtpService ftpService;
    @Autowired
@@ -727,6 +733,24 @@
                        serviceTaskoperService.insertServiceTaskoper(serviceTaskoper);
                    }
                } else if (serviceTaskVO.getAppltype().equals("5")) {
                    // 任务组:必须为长期任务(否则 findMatchingTaskIds 扫不到,无法自动纳入新出院患者)
                    if (serviceTaskVO.getLongTask() == null || serviceTaskVO.getLongTask() != 1) {
                        throw new BaseException("appltype=5 任务组必须为长期任务(longTask=1)");
                    }
                    // 保存计划 + 明细
                    ServiceTaskScheduleVO scheduleVO = serviceTaskVO.getServiceTaskScheduleVO();
                    if (scheduleVO == null) {
                        throw new BaseException("appltype=5 任务组:serviceTaskScheduleVO 不能为空");
                    }
                    scheduleVO.setTaskid(serviceTask.getTaskid());
                    scheduleVO.setOrgid(serviceTask.getOrgid());
                    scheduleVO.setCampusid(serviceTask.getCampusid());
                    scheduleVO.setCreateBy(serviceTask.getCreateBy());
                    log.info("----serviceTaskSchedule的值为:{}", scheduleVO);
                    serviceTaskScheduleService.saveScheduleWithDetail(scheduleVO);
                    // 绑定维度写条件表(供 HIS 自动纳入匹配,longtask 恒=1)
                    bindDimensionCondition(serviceTask, serviceTaskVO);
                } else {
                    ServiceTaskdept serviceTaskdept = new ServiceTaskdept();
                    serviceTaskdept.setTaskId(serviceTask.getTaskid());
@@ -812,6 +836,20 @@
                        serviceSubtask.setLongSendTime(patTaskRelevance.getLongSendTime());
                        serviceSubtask.setVisitTime(patTaskRelevance.getVisittime());
                    }
                    // ===== appltype=5 任务组:按 schedule 的 detailList 派生多条 subtask =====
                    if ("5".equals(serviceTaskVO.getAppltype())) {
                        ServiceTaskSchedule schedule = serviceTaskScheduleService.selectByTaskid(serviceTask.getTaskid());
                        if (schedule == null) {
                            throw new BaseException("appltype=5 任务组:未找到 taskid=" + serviceTask.getTaskid() + " 的计划");
                        }
                        List<ServiceTaskScheduleDetail> detailList =
                                serviceTaskScheduleService.selectDetailByScheduleid(schedule.getId());
                        scheduleSubtaskBuilder.buildSubtasksForPatient(
                                serviceTask, serviceTaskVO, schedule, detailList, patTaskRelevance, serviceSubtask);
                        continue;
                    }
                    serviceSubtaskMapper.insertServiceSubtask(serviceSubtask);
                    serviceSubtask.getId().intValue();
@@ -1026,6 +1064,23 @@
                            }
                        }
                    }
                } else if (serviceTaskVO.getAppltype().equals("5")) {
                    // 任务组修改:删旧 schedule + 明细,重建。subtask 上面已批量清理。
                    if (serviceTaskVO.getLongTask() == null || serviceTaskVO.getLongTask() != 1) {
                        throw new BaseException("appltype=5 任务组必须为长期任务(longTask=1)");
                    }
                    ServiceTaskScheduleVO scheduleVO = serviceTaskVO.getServiceTaskScheduleVO();
                    if (scheduleVO == null) {
                        throw new BaseException("appltype=5 任务组:serviceTaskScheduleVO 不能为空");
                    }
                    scheduleVO.setTaskid(serviceTask.getTaskid());
                    scheduleVO.setOrgid(serviceTask.getOrgid());
                    scheduleVO.setCampusid(serviceTask.getCampusid());
                    scheduleVO.setCreateBy(serviceTask.getUpdateBy());
                    serviceTaskScheduleService.saveScheduleWithDetail(scheduleVO);
                    // 先清旧维度条件表,再按最新入参重写(防过期维度残留导致误纳入)
                    clearDimensionCondition(serviceTask.getTaskid());
                    bindDimensionCondition(serviceTask, serviceTaskVO);
                }
            }
            if (ObjectUtils.isNotEmpty(serviceTaskVO.getIvrTaskTemplateVO())) {
@@ -1079,6 +1134,20 @@
                    serviceSubtask.setVisitTime(patTaskRelevance.getVisittime());
                    serviceSubtask.setTextParam(new Gson().toJson(serviceTaskVO.getTextParam()));
                    if (patTaskRelevance.getIsoperation() != null) {
                        // appltype=5 任务组:追加患者(isoperation=1)走计划派生;修改(2)/删除(3)仍走原逻辑
                        if ("5".equals(serviceTaskVO.getAppltype()) && patTaskRelevance.getIsoperation() == 1) {
                            ServiceTaskSchedule schedule = serviceTaskScheduleService.selectByTaskid(serviceTask.getTaskid());
                            if (schedule == null) {
                                throw new BaseException("appltype=5 任务组:未找到 taskid=" + serviceTask.getTaskid() + " 的计划");
                            }
                            List<ServiceTaskScheduleDetail> detailList =
                                    serviceTaskScheduleService.selectDetailByScheduleid(schedule.getId());
                            serviceSubtask.setUpdateBy(serviceTask.getUpdateBy());
                            serviceSubtask.setCreateBy(serviceTask.getUpdateBy());
                            scheduleSubtaskBuilder.buildSubtasksForPatient(
                                    serviceTask, serviceTaskVO, schedule, detailList, patTaskRelevance, serviceSubtask);
                            continue;
                        }
                        if (patTaskRelevance.getIsoperation() == 2) {
                            serviceSubtask.setUpdateBy(serviceTask.getUpdateBy());
                            serviceSubtaskMapper.updateServiceSubtaskByCondition(serviceSubtask);
@@ -1132,6 +1201,85 @@
        return map;
    }
    /**
     * 任务组(appltype=5)绑定维度写条件表,供 HIS 自动纳入匹配。
     * longtask 恒=1(否则独立扫描/主扫描按 longtask=1 查不到)。
     * 复用现有 service_taskdept(科室deptType=1/病区deptType=2)、service_taskdiag(疾病)。
     * 手术维度本期不写(暂不支持自动纳入)。
     */
    private void bindDimensionCondition(ServiceTask serviceTask, ServiceTaskVO vo) {
        // 科室
        if (StringUtils.isNotEmpty(vo.getDeptcode())) {
            for (String deptCode : vo.getDeptcode().split(",")) {
                if (StringUtils.isEmpty(deptCode)) continue;
                ServiceTaskdept d = new ServiceTaskdept();
                d.setTaskId(serviceTask.getTaskid());
                d.setTaskName(serviceTask.getTaskName());
                d.setOrgid(serviceTask.getOrgid());
                d.setLongtask(1L);
                d.setDeptCode(deptCode);
                d.setDeptType("1");
                d.setServiceType(vo.getServiceType());
                serviceTaskdeptService.insertServiceTaskdept(d);
            }
        }
        // 病区
        if (StringUtils.isNotEmpty(vo.getLeavehospitaldistrictcode())) {
            for (String wardCode : vo.getLeavehospitaldistrictcode().split(",")) {
                if (StringUtils.isEmpty(wardCode)) continue;
                ServiceTaskdept d = new ServiceTaskdept();
                d.setTaskId(serviceTask.getTaskid());
                d.setTaskName(serviceTask.getTaskName());
                d.setOrgid(serviceTask.getOrgid());
                d.setLongtask(1L);
                d.setDeptCode(wardCode);
                d.setDeptType("2");
                d.setServiceType(vo.getServiceType());
                serviceTaskdeptService.insertServiceTaskdept(d);
            }
        }
        // 疾病(用 split(","),勿照抄 appltype=3 现网的 split("$") bug)
        if (StringUtils.isNotEmpty(vo.getIcd10code())) {
            String[] codes = vo.getIcd10code().split(",");
            String[] names = StringUtils.isNotEmpty(vo.getIcd10name()) ? vo.getIcd10name().split(",") : new String[0];
            for (int i = 0; i < codes.length; i++) {
                if (StringUtils.isEmpty(codes[i])) continue;
                ServiceTaskdiag dg = new ServiceTaskdiag();
                dg.setTaskId(serviceTask.getTaskid());
                dg.setTaskName(serviceTask.getTaskName());
                dg.setOrgid(serviceTask.getOrgid());
                dg.setLongtask(1L);
                dg.setServiceType(vo.getServiceType());
                dg.setIcd10code(codes[i]);
                dg.setIcd10name(i < names.length ? names[i] : null);
                dg.setGuid(serviceTask.getGuid());
                dg.setCreateTime(new Date());
                serviceTaskdiagService.insertServiceTaskdiag(dg);
            }
        }
    }
    /**
     * 任务组修改时,先软删该 task 旧的维度条件表记录(防过期维度残留导致误纳入)。
     */
    private void clearDimensionCondition(Long taskId) {
        ServiceTaskdept dq = new ServiceTaskdept();
        dq.setTaskId(taskId);
        List<ServiceTaskdept> depts = serviceTaskdeptService.selectServiceTaskdeptList(dq);
        if (CollectionUtils.isNotEmpty(depts)) {
            for (ServiceTaskdept d : depts) {
                serviceTaskdeptService.deleteServiceTaskdeptById(d.getId());
            }
        }
        ServiceTaskdiag gq = new ServiceTaskdiag();
        gq.setTaskId(taskId);
        List<ServiceTaskdiag> diags = serviceTaskdiagService.selectServiceTaskdiagList(gq);
        if (CollectionUtils.isNotEmpty(diags)) {
            for (ServiceTaskdiag g : diags) {
                serviceTaskdiagService.deleteServiceTaskdiagById(g.getId());
            }
        }
    }
    @Override
    public void phoneCallBack(PhoneCallBackVO phoneCallBackVO) {