| | |
| | | } |
| | | |
| | | /** |
| | | * 取逗号串里的第一个值(任务上科室/病区是多选,而 {@code service_subtask} 上都是单值列)。 |
| | | */ |
| | | private String firstValue(String value) { |
| | | if (StringUtils.isEmpty(value)) { |
| | | return null; |
| | | } |
| | | for (String item : value.split(",")) { |
| | | if (StringUtils.isNotEmpty(item.trim())) { |
| | | return item.trim(); |
| | | } |
| | | } |
| | | return null; |
| | | } |
| | | |
| | | /** |
| | | * 任务配置({@link ServiceTaskVO})→ 子任务({@link ServiceSubtask})的字段搬运。 |
| | | * <p> |
| | | * <b>为什么不能直接 {@code DtoConversionUtils.sourceToTarget(serviceTaskVO, ServiceSubtask.class)}:</b> |
| | | * 它是纯同名拷贝,而两边同名的 {@code deptcode / deptname} <b>语义不同</b>: |
| | | * <ul> |
| | | * <li>{@code ServiceTaskVO.deptcode / deptname} = 任务的「适用科室」, |
| | | * 出院随访(serviceType=2)/ 出院宣教(4)/ 门诊随访(3)等场景下就是<b>离院科室</b>;</li> |
| | | * <li>{@code ServiceSubtask.deptcode / deptname} = <b>在院科室</b> |
| | | * (2026-11 由原 sendlimitpbegin/pend 复用而来,见 {@code ServiceSubtask} 字段注释)。</li> |
| | | * </ul> |
| | | * 于是纯同名拷贝会把「离院科室」写进「在院科室」列,后果有两个: |
| | | * <ol> |
| | | * <li>按在院维度筛({@code deptcodes} → {@code service_subtask.deptcode})会误命中这些子任务;</li> |
| | | * <li>按离院维度筛({@code leaveldeptcodes} → {@code service_subtask.leaveldeptcode})时, |
| | | * 患者自己没带科室的那些(前端手动勾选患者很常见)会因为 {@code leaveldeptcode} 为空而查不到。</li> |
| | | * </ol> |
| | | * 因此这里按项目既定口径({@code doc/service_subtask_字段改名_改动清单.md} §8:这几条 |
| | | * 「长期任务 / 任务组 / 手动建任务」路径<b>不填在院维度</b>)统一处理: |
| | | * <b>在院维度 4 列清空</b>(在院科室/在院病区只有 HIS 链路能从 {@code pat_med_inhosp} 拿到), |
| | | * <b>科室 / 病区一律落离院维度</b>({@code leaveldeptcode/name}、{@code leavehospitaldistrictcode/name})。 |
| | | * |
| | | * @param serviceTaskVO 建任务入参 |
| | | * @return 已按离院维度归位的子任务对象(在院维度为空) |
| | | */ |
| | | private ServiceSubtask toSubtaskFromTaskVO(ServiceTaskVO serviceTaskVO) { |
| | | ServiceSubtask serviceSubtask = DtoConversionUtils.sourceToTarget(serviceTaskVO, ServiceSubtask.class); |
| | | // ① 在院维度必须清空:任务配置的科室不是患者本人的在院科室 |
| | | serviceSubtask.setDeptcode(null); |
| | | serviceSubtask.setDeptname(null); |
| | | serviceSubtask.setHospitaldistrictcode(null); |
| | | serviceSubtask.setHospitaldistrictname(null); |
| | | // ② 科室 / 病区 → 离院维度(多选串取第一个,子任务是单值列) |
| | | serviceSubtask.setLeaveldeptcode(firstValue(serviceTaskVO.getDeptcode())); |
| | | serviceSubtask.setLeaveldeptname(firstValue(serviceTaskVO.getDeptname())); |
| | | serviceSubtask.setLeavehospitaldistrictcode(firstValue(serviceTaskVO.getLeavehospitaldistrictcode())); |
| | | serviceSubtask.setLeavehospitaldistrictname(firstValue(serviceTaskVO.getLeavehospitaldistrictname())); |
| | | return serviceSubtask; |
| | | } |
| | | |
| | | /** |
| | | * 单一任务 |
| | | * |
| | | * @return 结果 |
| | |
| | | // } |
| | | |
| | | //将任务信息放到服务表中 |
| | | ServiceSubtask serviceSubtask = DtoConversionUtils.sourceToTarget(serviceTaskVO, ServiceSubtask.class); |
| | | // 科室/病区按「离院维度」归位(出院随访的科室病区就是离院科室/病区),见 toSubtaskFromTaskVO |
| | | ServiceSubtask serviceSubtask = toSubtaskFromTaskVO(serviceTaskVO); |
| | | serviceSubtask.setTaskid(serviceTask.getTaskid().longValue()); |
| | | serviceSubtask.setTemplatename(ObjectUtils.isNotEmpty(tempid) ? tempName : serviceTask.getTemplatename()); |
| | | serviceSubtask.setTemplateid(ObjectUtils.isNotEmpty(tempid) ? tempid : serviceTask.getTemplateid()); |
| | |
| | | serviceSubtask.setInhospid(patTaskRelevance.getHospid()); |
| | | //新建完成就是待发送状态 |
| | | serviceSubtask.setSendstate(2L); |
| | | String subtaskDeptCode = patTaskRelevance.getDeptcode(); |
| | | if (StringUtils.isEmpty(subtaskDeptCode) && StringUtils.isNotEmpty(serviceTaskVO.getDeptcode())) { |
| | | // service_subtask.leaveldeptcode 为单值字段,不能写入任务的多科室拼接串,取第一个科室兜底 |
| | | subtaskDeptCode = serviceTaskVO.getDeptcode().split(",")[0].trim(); |
| | | } |
| | | serviceSubtask.setLeaveldeptcode(subtaskDeptCode); |
| | | serviceSubtask.setLeaveldeptname(StringUtils.isNotEmpty(patTaskRelevance.getDeptName()) ? patTaskRelevance.getDeptName() : serviceTaskVO.getDeptname()); |
| | | serviceSubtask.setLeavehospitaldistrictcode(patTaskRelevance.getLeavehospitaldistrictcode()); |
| | | serviceSubtask.setLeavehospitaldistrictname(patTaskRelevance.getLeavehospitaldistrictname()); |
| | | // 离院维度(出院随访 = 出院科室 / 出院病区): |
| | | // 患者自带的出院科室/病区优先,患者侧没带(前端手动勾选很常见)时回退到任务配置, |
| | | // 不能无条件覆盖 —— 否则会把 toSubtaskFromTaskVO 按任务配置兜好的离院维度抹成 null, |
| | | // 结果「任务配了科室病区、生成出来的子任务离院科室/病区却是空」。 |
| | | serviceSubtask.setLeaveldeptcode(firstNonBlank(patTaskRelevance.getDeptcode(), |
| | | firstValue(serviceTaskVO.getDeptcode()))); |
| | | serviceSubtask.setLeaveldeptname(firstNonBlank(patTaskRelevance.getDeptName(), |
| | | firstValue(serviceTaskVO.getDeptname()))); |
| | | serviceSubtask.setLeavehospitaldistrictcode(firstNonBlank(patTaskRelevance.getLeavehospitaldistrictcode(), |
| | | firstValue(serviceTaskVO.getLeavehospitaldistrictcode()))); |
| | | serviceSubtask.setLeavehospitaldistrictname(firstNonBlank(patTaskRelevance.getLeavehospitaldistrictname(), |
| | | firstValue(serviceTaskVO.getLeavehospitaldistrictname()))); |
| | | serviceSubtask.setType(serviceTaskVO.getType()); |
| | | serviceSubtask.setHospType(patTaskRelevance.getHospType()); |
| | | serviceSubtask.setOpenid(patTaskRelevance.getOpenid()); |
| | |
| | | } |
| | | if (CollectionUtils.isNotEmpty(serviceTaskVO.getPatTaskRelevances())) { |
| | | for (PatTaskRelevance patTaskRelevance : serviceTaskVO.getPatTaskRelevances()) { |
| | | ServiceSubtask serviceSubtask = DtoConversionUtils.sourceToTarget(serviceTaskVO, ServiceSubtask.class); |
| | | // 科室/病区按「离院维度」归位(出院随访的科室病区就是离院科室/病区),见 toSubtaskFromTaskVO |
| | | ServiceSubtask serviceSubtask = toSubtaskFromTaskVO(serviceTaskVO); |
| | | serviceSubtask.setLibtemplateid(ObjectUtils.isEmpty(serviceTaskVO.getLibtemplateid()) ? null : Long.valueOf(serviceTaskVO.getLibtemplateid())); |
| | | serviceSubtask.setLibtemplatename(serviceTaskVO.getLibtemplatename()); |
| | | serviceSubtask.setTemplateid(serviceTask.getTemplateid()); |
| | |
| | | serviceSubtask.setAddr(patTaskRelevance.getAddr()); |
| | | serviceSubtask.setPatid(patTaskRelevance.getPatid()); |
| | | serviceSubtask.setOpenid(patTaskRelevance.getOpenid()); |
| | | serviceSubtask.setLeaveldeptcode(patTaskRelevance.getDeptcode()); |
| | | serviceSubtask.setLeavehospitaldistrictname(patTaskRelevance.getLeavehospitaldistrictname()); |
| | | serviceSubtask.setLeavehospitaldistrictcode(patTaskRelevance.getLeavehospitaldistrictcode()); |
| | | serviceSubtask.setLeaveldeptname(patTaskRelevance.getDeptName()); |
| | | // 离院维度:患者自带的出院科室/病区优先,没带时回退到任务配置(否则会把 |
| | | // toSubtaskFromTaskVO 按任务配置兜好的值抹成 null,出院随访就成「离院科室/病区为空」) |
| | | serviceSubtask.setLeaveldeptcode(firstNonBlank(patTaskRelevance.getDeptcode(), |
| | | firstValue(serviceTaskVO.getDeptcode()))); |
| | | serviceSubtask.setLeaveldeptname(firstNonBlank(patTaskRelevance.getDeptName(), |
| | | firstValue(serviceTaskVO.getDeptname()))); |
| | | serviceSubtask.setLeavehospitaldistrictcode(firstNonBlank(patTaskRelevance.getLeavehospitaldistrictcode(), |
| | | firstValue(serviceTaskVO.getLeavehospitaldistrictcode()))); |
| | | serviceSubtask.setLeavehospitaldistrictname(firstNonBlank(patTaskRelevance.getLeavehospitaldistrictname(), |
| | | firstValue(serviceTaskVO.getLeavehospitaldistrictname()))); |
| | | serviceSubtask.setType(serviceTaskVO.getType()); |
| | | serviceSubtask.setCreateTime(DateUtils.getNowDate()); |
| | | serviceSubtask.setDrname(patTaskRelevance.getDrname()); |