已修改18个文件
468 ■■■■ 文件已修改
ruoyi-admin/src/main/java/com/ruoyi/RuoYiApplication.java 19 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/controller/smartor/ServiceSubtaskDetailTraceController.java 13 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/domain/DTO/DetailTraceDealDTO.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/domain/PatArchive.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/domain/PatArchiveVO.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/domain/PatMedInhosp.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/domain/PatMedOperationItem.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/domain/ServiceSLTDInhospReqVO.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/domain/ServiceSubtask.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/service/IServiceSubtaskDetailTraceService.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/service/impl/PatMedInhospServiceImpl.java 291 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/service/impl/ServiceExternalServiceImpl.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/service/impl/ServiceSLTDHealthcareRecordServiceImpl.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/service/impl/ServiceSubtaskDetailTraceServiceImpl.java 67 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/service/impl/ServiceSubtaskServiceImpl.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/service/impl/XHGatherPatArchiveServiceImpl.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/resources/mapper/smartor/PatMedOperationItemMapper.xml 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/resources/mapper/smartor/ServiceSubtaskMapper.xml 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/RuoYiApplication.java
@@ -21,16 +21,15 @@
    public static void main(String[] args) {
        // System.setProperty("spring.devtools.restart.enabled", "false");
        SpringApplication.run(RuoYiApplication.class, args);
        System.out.println("(♥◠‿◠)ノ゙  智慧服务启动成功   ლ(´ڡ`ლ)゙  \n" +
                " .-------.       ____     __        \n" +
                " |  _ _   \\      \\   \\   /  /    \n" +
                " | ( ' )  |       \\  _. /  '       \n" +
                " |(_ o _) /        _( )_ .'         \n" +
                " | (_,_).' __  ___(_ o _)'          \n" +
                " |  |\\ \\  |  ||   |(_,_)'         \n" +
                " |  | \\ `'   /|   `-'  /           \n" +
                " |  |  \\    /  \\      /           \n" +
                " ''-'   `'-'    `-..-'              ");
        System.out.println(" 智慧服务启动成功 \n" +
              " ██╗  ██╗   ██████╗    ██████╗\n" +
              " ██║  ██║   ██╔══██╗   ██╔════╝\n" +
              " ███████║   ██████╔╝   █████╗\n" +
              " ██╔══██║   ██╔══██╗   ╚════██╗\n" +
              " ██║  ██║   ██║  ██║   ██████╔╝\n" +
              " ╚═╝  ╚═╝   ╚═╝  ╚═╝   ╚═════╝\n" +
              "    亥          尔          时\n");
//        //开启SOCKET
//        new SocketCommunication().socketCommunication();
    }
ruoyi-admin/src/main/java/com/ruoyi/web/controller/smartor/ServiceSubtaskDetailTraceController.java
@@ -65,13 +65,20 @@
    public Map<String, Object> tracedeallist(@RequestBody DetailTraceDealVO detailTraceDealVO) {
        Integer offset = PageUtils.getOffset(detailTraceDealVO.getPageNum(), detailTraceDealVO.getPageSize());
        detailTraceDealVO.setPageNum(offset);
        List<DetailTraceDealDTO> list = serviceSubtaskDetailTraceService.tracedeallist(detailTraceDealVO);
        Map<String, Object> result = serviceSubtaskDetailTraceService.tracedeallist(detailTraceDealVO);
        // 查询总数(不分页)
        detailTraceDealVO.setPageNum(null);
        detailTraceDealVO.setPageSize(null);
        List<DetailTraceDealDTO> total = serviceSubtaskDetailTraceService.tracedeallist(detailTraceDealVO);
        Map<String, Object> totalResult = serviceSubtaskDetailTraceService.tracedeallist(detailTraceDealVO);
        List<?> totalRows = (List<?>) totalResult.get("rows");
        return getDataTable3(CollectionUtils.isNotEmpty(total) ? total.size() : 0, list);
        //将总数信息添加到结果中
        result.put("totalException", totalResult.get("totalException"));
        result.put("noDealException", totalResult.get("noDealException"));
        result.put("yesDealException", totalResult.get("yesDealException"));
        return getDataTable3(CollectionUtils.isNotEmpty(totalRows) ? totalRows.size() : 0, result);
    }
    /**
smartor/src/main/java/com/smartor/domain/DTO/DetailTraceDealDTO.java
@@ -29,6 +29,22 @@
    @Excel(name = "问题内容")
    private String questiontext;
    /**
     * 问题ID
     */
    @ApiModelProperty("问题ID")
    @Excel(name = "问题ID")
    private Long scriptid;
    /**
     * 模板类型:1.语音 2.问卷
     */
    @ApiModelProperty("模板类型:1.语音 2.问卷")
    @Excel(name = "模板类型:1.语音 2.问卷")
    private Integer templateType;
    /**
     * [{
     *        "deptName": "科室名称",
smartor/src/main/java/com/smartor/domain/PatArchive.java
@@ -81,7 +81,7 @@
     */
    @ApiModelProperty("来源(1:HIS;2:数据平台;3:文件导入)")
    @Excel(name = " 来源(1:HIS;2:数据平台;3:文件导入) ")
    private Integer sourcefrom;
    private Long sourcefrom;
    /**
     * his系统的患者id
smartor/src/main/java/com/smartor/domain/PatArchiveVO.java
@@ -21,7 +21,7 @@
 */
@ApiModel(value = "PatArchiveVO", description = "患者档案对象")
@Data
public class PatArchiveVO extends BaseEntity {
public class PatArchiveVO extends PatArchive {
    /**
     * 自增ID
smartor/src/main/java/com/smartor/domain/PatMedInhosp.java
@@ -296,11 +296,6 @@
     */
    @ApiModelProperty(value = "疾病长期任务,是否处理:0未处理   1处理成功    2处理失败 ")
    private String diagcheckFlag;
    /**
     * 手术长期任务,是否处理:0未处理   1处理
     */
    @ApiModelProperty(value = "手术长期任务,是否处理:0未处理   1处理成功    2处理失败 ")
    private String opercheckFlag;
    /**
     * 年龄
smartor/src/main/java/com/smartor/domain/PatMedOperationItem.java
@@ -146,5 +146,14 @@
    @Excel(name = "父ID")
    private Long pid;
    /**
     * 手术长期任务,是否处理:0未处理   1处理
     */
    @ApiModelProperty(value = "手术长期任务,是否处理:0未处理   1处理成功    2处理失败 ")
    private String opercheckFlag;
    @ApiModelProperty("长期任务 ,失败原因")
    @Excel(name = "长期任务 ,失败原因")
    private String longTaskReason;
}
smartor/src/main/java/com/smartor/domain/ServiceSLTDInhospReqVO.java
@@ -16,6 +16,12 @@
    @ApiModelProperty(value = "院区ID")
    private Long campusId;
    @ApiModelProperty(value = "当前页")
    private Long current;
    @ApiModelProperty(value = "每页数量")
    private Long size;
    @ApiModelProperty(value = "患者姓名   必填一个")
    private String patientName;
smartor/src/main/java/com/smartor/domain/ServiceSubtask.java
@@ -669,4 +669,7 @@
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @ApiModelProperty(value = "继续时间下次")
    private Date continueTimeNext;
    @ApiModelProperty(value = "手术记录id 对应pat_med_operation_item.id")
    private Long operationItemId;
}
smartor/src/main/java/com/smartor/service/IServiceSubtaskDetailTraceService.java
@@ -36,9 +36,9 @@
    /**
     * 异常问题处理情况查询
     * @param detailTraceDealVO
     * @return
     * @return 包含分页列表及汇总统计(totalException/noDealException/yesDealException)的Map
     */
    public List<DetailTraceDealDTO> tracedeallist(DetailTraceDealVO detailTraceDealVO);
    public Map<String, Object> tracedeallist(DetailTraceDealVO detailTraceDealVO);
    /**
     * 新增随访任务异常记录跟踪
smartor/src/main/java/com/smartor/service/impl/PatMedInhospServiceImpl.java
@@ -52,6 +52,11 @@
    private ServiceSubtaskMapper serviceSubtaskMapper;
    @Autowired
    private ServiceSubtaskPreachformMapper serviceSubtaskPreachformMapper;
    @Autowired
    private PatMedOperationMapper patMedOperationMapper;
    @Autowired
    private PatMedOperationItemMapper patMedOperationItemMapper;
    @Value("${spring.profiles.active}")
    private String active;
@@ -379,59 +384,47 @@
                }
            }
//            手术随访
//            PatMedInhosp pmss = new PatMedInhosp();
//            //获取需要出院疾病随访,未处理的数据
//            pmss.setOpercheckFlag("0");
//            pmss.setInhospstate("1");
//            pmss.setFuflag("1");
//            List<PatMedInhosp> patMedInhospSSs = patMedInhospMapper.selectPatMedInhospList(pmss);
//            log.info("dealOutHospInfo需要处理的出院疾病患者信息:{}", CollectionUtils.isNotEmpty(patMedInhospSSs) ? patMedInhospSSs.size() : null);
//            for (PatMedInhosp patMedInhosp1 : patMedInhospSSs) {
//                String tagname = patMedInhospMapper.getTagnameBypatid(patMedInhosp1.getPatid());
//                patMedInhosp1.setTagname(tagname);
//            }
//
//            for (PatMedInhosp pmiSS : patMedInhospSSs) {
//                //获取患者信息
//                PatArchive patArchive = patArchiveMapper.selectPatArchiveByPatid(pmiSS.getPatid());
//                if (Objects.isNull(patArchive)) {
//                    pmiSS.setDiagcheckFlag("2");
//                    pmiSS.setLongTaskReason("患者基本信息为空");
//                    patMedInhospMapper.updatePatMedInhosp(pmiSS);
//                    continue;
//                }
//                try {
////                    if (StringUtils.isEmpty(pmiSS.getLeaveicd10code())) {
////                        continue;
////                    }
//                    // 根据患者的疾病,获取该疾病的长期任务
//                    ServiceTaskoper serviceTaskoper = new ServiceTaskoper();
//                    serviceTaskoper.setLongtask(1L);
//                    serviceTaskoper.setOrgid(pmiSS.getOrgid());
//                    //todo
//                    serviceTaskoper.setOplevelcode("");
//
//                    List<ServiceTaskoper> serviceTaskopers = serviceTaskoperMapper.selectServiceTaskoperList(serviceTaskoper);
//                    //如果部门模板为空(将deptIsNull设置为true)
//                    if (CollectionUtils.isEmpty(serviceTaskopers) || serviceTaskopers.size() == 0) {
//                        PatMedInhosp patMedInhosp = patMedInhospMapper.selectPatMedInhospByInhospid(pmiSS.getInhospid());
//                        pmiSS.setOpercheckFlag("2");
//                        pmiSS.setLongTaskReason(patMedInhosp.getLongTaskReason() + "所患的手术未配置长期任务;");
//                        patMedInhospMapper.updatePatMedInhosp(pmiSS);
//                    } else {
//                        for (ServiceTaskoper serviceTaskoper1 : serviceTaskopers) {
//                            writeInSubTask(serviceTaskoper1.getTaskId(), true, pmiSS, patArchive, 3, config);
//                        }
//                    }
//
//                } catch (Exception e) {
//                    e.printStackTrace();
//                    log.error("人员手术处理出异常了:{}", e.getMessage());
//                    pmiSS.setOpercheckFlag("2");
//                    pmiSS.setLongTaskReason("人员手术处理异常:" + e.getMessage());
//                    patMedInhospMapper.updatePatMedInhosp(pmiSS);
//                }
//            }
            PatMedOperationItem pmoi = new PatMedOperationItem();
            //获取需要出院疾病随访,未处理的数据
            pmoi.setOpercheckFlag("0");
            pmoi.setMainFlag("1");
            List<PatMedOperationItem> patMedOperationItems = patMedOperationItemMapper.selectPatMedOperationItemList(pmoi);
            log.info("dealOutHospInfo需要处理的出院手术患者信息:{}", CollectionUtils.isNotEmpty(patMedOperationItems) ? patMedOperationItems.size() : null);
            for (PatMedOperationItem opItem : patMedOperationItems) {
                try {
                    if (StringUtils.isEmpty(opItem.getOplevelcode())) {
                        continue;
                    }
                    // 根据患者的疾病,获取该疾病的长期任务
                    ServiceTaskoper serviceTaskoper = new ServiceTaskoper();
                    serviceTaskoper.setLongtask(1L);
                    serviceTaskoper.setOrgid(opItem.getOrgid());
                    serviceTaskoper.setOplevelcode(opItem.getOplevelcode());
                    List<ServiceTaskoper> serviceTaskopers = serviceTaskoperMapper.selectServiceTaskoperList(serviceTaskoper);
                    //如果部门模板为空(将deptIsNull设置为true)
                    if (CollectionUtils.isEmpty(serviceTaskopers) || serviceTaskopers.size() == 0) {
                        PatMedOperationItem patMedOperationItem = patMedOperationItemMapper.selectPatMedOperationItemById(opItem.getId());
                        patMedOperationItem.setOpercheckFlag("2");
                        patMedOperationItem.setLongTaskReason(patMedOperationItem.getLongTaskReason() + "所患的手术未配置长期任务;");
                        patMedOperationItemMapper.updatePatMedOperationItem(patMedOperationItem);
                    } else {
                        for (ServiceTaskoper serviceTaskoper1 : serviceTaskopers) {
                            writeInSubTaskForOp(serviceTaskoper1.getTaskId(), true, opItem, config);
                        }
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                    log.error("人员手术处理出异常了:{}", e.getMessage());
                    opItem.setOpercheckFlag("2");
                    opItem.setLongTaskReason("人员手术处理异常:" + e.getMessage());
                    patMedOperationItemMapper.updatePatMedOperationItem(opItem);
                }
            }
        }
        //获取未处理在院的数据(如果刚刚出院的患者数据的出院时间,在下面查询出的入院时间之前,那之前的出院患者的数据,也得停掉,因为又入院了)
@@ -958,6 +951,133 @@
        }
    }
    /**
     *
     * @param taskid 任务id
     * @param check 是否需要校验
     * @param patMedOperationItem 手术记录
     * @param config 配置信息 visit.early.day
     */
    //将患者放到subtask中 手术专用
    private void writeInSubTaskForOp(Long taskid, Boolean check, PatMedOperationItem patMedOperationItem, String config) {
        String longTaskReason = patMedOperationItem.getLongTaskReason();
        String orgId = patMedOperationItem.getOrgid();
        if (StringUtils.isEmpty(longTaskReason)) longTaskReason = "";
        ServiceTask st = new ServiceTask();
        st.setTaskid(taskid);
        st.setSendState(2L);
        List<ServiceTask> serviceTasks = serviceTaskMapper.selectServiceTaskList(st);
        ServiceTask serviceTask = null;
        if (CollectionUtils.isEmpty(serviceTasks)) {
            log.info("该手术对应手术等级的长期任务不存在,任务ID为:{}", taskid);
            patMedOperationItem.setOpercheckFlag("2");
            patMedOperationItem.setLongTaskReason(longTaskReason + " & 该手术对应手术等级的长期任务不存在,任务ID为:" + taskid);
            patMedOperationItemMapper.insertPatMedOperationItem(patMedOperationItem);
            return;
        } else {
            serviceTask = serviceTasks.get(0);
        }
        if (Objects.isNull(patMedOperationItem.getOpid())) {
            return;
        }
        if (Objects.isNull(patMedOperationItem.getOplevelcode())) {
            return;
        }
        PatMedOperation patMedOperation = patMedOperationMapper.selectPatMedOperationById(patMedOperationItem.getOpid());
        if (Objects.isNull(patMedOperation)) {
            return;
        }
        PatArchive patArchive = patArchiveMapper.selectPatArchiveByPatid(patMedOperation.getPatid());
        if (Objects.isNull(patArchive)) {
            return;
        }
        //封装serviceSubtask
        ServiceSubtask serviceSubtask = boxedServiceSubtaskForOp(serviceTask, patMedOperation, patMedOperationItem, patArchive, config);
        if (ObjectUtils.isEmpty(serviceSubtask)) {
            return;
        }
        serviceSubtask.setVisitDeptCode(patMedOperation.getReqdeptcode());
        serviceSubtask.setVisitDeptName(patMedOperation.getReqdeptname());
        //记录insertServiceSubtask语句返回状态
        Integer i = 0;
        try {
            //先判断一下,是否需要校验
            if (check && (Objects.isNull(serviceSubtask.getTaskSituation()) || serviceSubtask.getTaskSituation() != 6)) {
                //在新增之前,先通过患者ID,sendstate=2查询一下,在所有长期任务中,是不是还有该患者待执行的任务,有的话,比较之前的endtime是否小于当前的endtaime,如果之前的小于现在的,则直接将之前的停掉(原因再入院)
                ServiceSubtaskEntity subtask = new ServiceSubtaskEntity();
                subtask.setPatid(patArchive.getId());
                subtask.setSendstate(2L);
                subtask.setTaskid(taskid);
                List<ServiceSubtask> selectServiceSubtaskList = serviceSubtaskMapper.selectServiceSubtaskList(subtask);
//                log.info("该患者待执行的任务:{}", CollectionUtils.isNotEmpty(selectServiceSubtaskList) ? selectServiceSubtaskList.size() : null);
                if (CollectionUtils.isNotEmpty(selectServiceSubtaskList) && selectServiceSubtaskList.size() > 0) {
                    for (ServiceSubtask serviceSubtask1 : selectServiceSubtaskList) {
                        if (Objects.isNull(serviceSubtask1.getLongSendTime())) {
                            //不是长期任务,不处理
                            continue;
                        }
                    }
                } else {
                    if (StringUtils.isEmpty(serviceSubtask.getPhone())) {
                        if (StringUtils.isNotEmpty(serviceSubtask.getRemark()))
                            serviceSubtask.setRemark(serviceSubtask.getRemark() + ",手机号为空");
                        else serviceSubtask.setRemark("手机号为空");
                        serviceSubtask.setSendstate(4L);
                        serviceSubtask.setResult("error");
                    }
                    serviceSubtask.setCreateBy(serviceTask.getCreateBy());
                    serviceSubtask.setCreateTime(new Date());
                    i = serviceSubtaskMapper.insertServiceSubtask(serviceSubtask);
                    addServiceSubtaskPreachform(serviceSubtask, null);
                }
            } else if (serviceSubtask.getTaskSituation() == 6) {
                //说明该患者是被过滤的,不用再执行了
                serviceSubtask.setCreateBy(serviceTask.getCreateBy());
                serviceSubtask.setCreateTime(new Date());
                i = serviceSubtaskMapper.insertServiceSubtask(serviceSubtask);
            } else {
                if (StringUtils.isEmpty(serviceSubtask.getPhone())) {
                    if (StringUtils.isNotEmpty(serviceSubtask.getRemark()))
                        serviceSubtask.setRemark(serviceSubtask.getRemark() + ",手机号为空");
                    else serviceSubtask.setRemark("手机号为空");
                    serviceSubtask.setSendstate(4L);
                    serviceSubtask.setResult("error");
                }
                serviceSubtask.setCreateBy(serviceTask.getCreateBy());
                serviceSubtask.setCreateTime(new Date());
                i = serviceSubtaskMapper.insertServiceSubtask(serviceSubtask);
                addServiceSubtaskPreachform(serviceSubtask, null);
            }
            //将check_flag改成1(已处理)
            if (i == 1) {
                PatMedOperationItem patMedOperationItem2 = new PatMedOperationItem();
                patMedOperationItem2.setId(patMedOperationItem.getId());
                patMedOperationItem2.setOpercheckFlag("1");
                patMedOperationItemMapper.updatePatMedOperationItem(patMedOperationItem2);
            } else {
                //生成子任务失败,
                log.info("生成子任务失败serviceSubtask的taskid为:{},patid为:{}", serviceSubtask.getTaskid(), serviceSubtask.getPatid());
                PatMedOperationItem patMedOperationItem2 = new PatMedOperationItem();
                patMedOperationItem2.setId(patMedOperationItem.getId());
                patMedOperationItem2.setOpercheckFlag("2");
                patMedOperationItem2.setRemark("生成子任务失败 4");
                patMedOperationItemMapper.updatePatMedOperationItem(patMedOperationItem2);
            }
        } catch (Exception e) {
            //出错回滚事务
            log.info("生成子任务报错回滚sserviceSubtask的taskid为:{},patid为:{}", serviceSubtask.getTaskid(), serviceSubtask.getPatid());
            PatMedOperationItem patMedOperationItem2 = new PatMedOperationItem();
            patMedOperationItem2.setId(patMedOperationItem.getId());
            patMedOperationItem2.setOpercheckFlag("2");
            patMedOperationItem2.setRemark("生成子任务报错回滚 4");
            patMedOperationItemMapper.updatePatMedOperationItem(patMedOperationItem2);
            e.printStackTrace();
        }
    }
    private Integer addServiceSubtaskPreachform(ServiceSubtask serviceSubtask, String sendstate) {
        //将preachformDesc的json对象,放到list集合中
        ServiceTask serviceTask = serviceTaskMapper.selectServiceTaskByTaskid(serviceSubtask.getTaskid());
@@ -1083,6 +1203,71 @@
        return serviceSubtask;
    }
    //封装serviceSubtask
    private ServiceSubtask boxedServiceSubtaskForOp(ServiceTask serviceTask, PatMedOperation patMedOperation, PatMedOperationItem patMedOperationItem, PatArchive patArchive, String config) {
        ServiceSubtask serviceSubtask = DtoConversionUtils.sourceToTarget(serviceTask, ServiceSubtask.class);
        serviceSubtask.setTaskid(serviceTask.getTaskid());
        if (StringUtils.isNotEmpty(serviceTask.getLibtemplateid()))
            serviceSubtask.setLibtemplateid(Long.valueOf(serviceTask.getLibtemplateid()));
        serviceSubtask.setNurseId(patMedOperation.getNurseId());
        serviceSubtask.setNurseName(patMedOperation.getNurseName());
//        serviceSubtask.setInhospid(patMedInhosp.getInhospid());
        serviceSubtask.setDrcode(patMedOperation.getDrcode());
        serviceSubtask.setDrname(patMedOperation.getDrname());
        serviceSubtask.setDeptcode(patMedOperation.getDeptcode());
        serviceSubtask.setDeptname(patMedOperation.getDeptname());
        serviceSubtask.setTemplateid(serviceTask.getTemplateid());
        serviceSubtask.setTemplatename(serviceTask.getTemplatename());
        serviceSubtask.setPatid(patArchive.getId());
        serviceSubtask.setSendname(patArchive.getName());
        serviceSubtask.setSfzh(patArchive.getIdcardno());
        serviceSubtask.setPhone(patArchive.getTelcode());
        if (StringUtils.isBlank(patArchive.getTelcode())) serviceSubtask.setPhone(patArchive.getRelativetelcode());
        serviceSubtask.setSex(patArchive.getSex());
        serviceSubtask.setAge(patArchive.getAge());
        serviceSubtask.setSendstate(2L);
        serviceSubtask.setManagementDoctor(patMedOperation.getDrname());
        serviceSubtask.setManagementDoctorCode(patMedOperation.getDrcode());
//        serviceSubtask.setStarttime(patMedInhosp.getStarttime());
//        serviceSubtask.setEndtime(patMedInhosp.getEndtime());
        serviceSubtask.setServiceType(serviceTask.getServiceType());
        serviceSubtask.setPreachform(serviceTask.getPreachform());
        serviceSubtask.setHospType("2");
        serviceSubtask.setCreateTime(new Date());
        serviceSubtask.setUpdateTime(new Date());
        serviceSubtask.setCreateBy(patMedOperation.getNurseName());
//        serviceSubtask.setLeavehospitaldistrictcode(patArchive.getLeavehospitaldistrictcode());
//        serviceSubtask.setLeavehospitaldistrictname(patArchive.getLeavehospitaldistrictname());
        serviceSubtask.setOperationItemId(patMedOperationItem.getId());
        serviceSubtask.setUpdateBy(serviceTask.getUpdateBy());
        serviceSubtask.setUpdateTime(new Date());
        //设置发送时间
        if (serviceTask.getSendDay() == null) serviceTask.setSendDay(1L);
        Date newDate = null;
        //todo
        newDate = addDays(patMedOperation.getCreateTime(), serviceTask.getSendDay().intValue());
        serviceSubtask.setLongSendTime(newDate);
        serviceSubtask.setVisitTime(newDate);
        //如果是通知的话,需要提前几天将通过短信发出去(具体几天,这个可以配置在sys_conf表中)
        if ("3".equals(serviceTask.getType())) {
            serviceSubtask.setVisitTime(minusDay(newDate, StringUtils.isNotEmpty(config) ? Integer.parseInt(config) : 0));
        }
        //患者发送时间
        if (StringUtils.isNotEmpty(patArchive.getNotrequiredFlag()) && patArchive.getNotrequiredFlag().equals("1")) {
            String remark = patArchive.getNotrequiredreason();
            serviceSubtask.setRemark(remark);
            serviceSubtask.setResult("error");
            serviceSubtask.setTaskSituation(6);
            //不执行
            serviceSubtask.setSendstate(4L);
        }
        return serviceSubtask;
    }
    /**
     * 减去相应天数
     *
smartor/src/main/java/com/smartor/service/impl/ServiceExternalServiceImpl.java
@@ -1469,7 +1469,7 @@
        patArchive.setPatientno(externalInHospPatientInfo.getJiuZhenKH());
        patArchive.setBirthdate(parse);
        patArchive.setPatidHis(externalInHospPatientInfo.getBingRenID());
        patArchive.setSourcefrom(1);
        patArchive.setSourcefrom(1L);
        patArchive.setPattype("2");
        patArchive.setName(externalInHospPatientInfo.getXingMing());
        if (StringUtils.isNotEmpty(externalInHospPatientInfo.getXingBieDM()))
smartor/src/main/java/com/smartor/service/impl/ServiceSLTDHealthcareRecordServiceImpl.java
@@ -759,7 +759,7 @@
        patArchive.setPatientno("" + dto.getPatientId());
        patArchive.setIdcardno(StringUtils.isEmpty(dto.getIdCardNo()) ? "" + dto.getMedicalCardId() : dto.getIdCardNo().trim());
        patArchive.setName(dto.getPatientName());
        patArchive.setSourcefrom(2);
        patArchive.setSourcefrom(2L);
        patArchive.setPattype("2");
        patArchive.setSex("男".equals(dto.getGender()) ? 1L : 2L);
        patArchive.setNation(dto.getNation());
smartor/src/main/java/com/smartor/service/impl/ServiceSubtaskDetailTraceServiceImpl.java
@@ -71,47 +71,39 @@
    }
    @Override
    public List<DetailTraceDealDTO> tracedeallist(DetailTraceDealVO detailTraceDealVO) {
        // 获取所有需要处理的记录
    public Map<String, Object> tracedeallist(DetailTraceDealVO detailTraceDealVO) {
        // 分页查询
        List<ServiceSubtaskDetailTrace> tracedeallist = serviceSubtaskDetailTraceMapper.tracedeallist(detailTraceDealVO);
        // 按 questiontext 分组
        Map<String, List<ServiceSubtaskDetailTrace>> groupByQuestion = tracedeallist.stream()
                .filter(t -> t.getQuestiontext() != null)
                .collect(Collectors.groupingBy(ServiceSubtaskDetailTrace::getQuestiontext));
        Map<String, List<ServiceSubtaskDetailTrace>> groupByQuestion = tracedeallist.stream().filter(t -> t.getQuestiontext() != null).collect(Collectors.groupingBy(ServiceSubtaskDetailTrace::getQuestiontext));
        List<DetailTraceDealDTO> detailTraceDealDTOList = new ArrayList<>();
        long totalException = 0L;
        long noDealException = 0L;
        long yesDealException = 0L;
        for (Map.Entry<String, List<ServiceSubtaskDetailTrace>> entry : groupByQuestion.entrySet()) {
            List<ServiceSubtaskDetailTrace> group = entry.getValue();
            DetailTraceDealDTO dto = new DetailTraceDealDTO();
            // 问题内容
            dto.setQuestiontext(entry.getKey());
            if (CollectionUtils.isNotEmpty(group)) {
                dto.setScriptid(group.get(0).getScriptid());
                dto.setTemplateType(group.get(0).getTemplateType());
            }
            // 负责科室(去重)
            List<Map<String, Object>> responsibleDept = group.stream()
                    .filter(t -> t.getTodeptcode() != null)
                    .collect(Collectors.collectingAndThen(
                            Collectors.toMap(
                                    ServiceSubtaskDetailTrace::getTodeptcode,
                                    t -> {
                                        Map<String, Object> deptMap = new HashMap<>();
                                        deptMap.put("deptName", t.getTodeptname());
                                        deptMap.put("deptCode", t.getTodeptcode());
                                        return deptMap;
                                    },
                                    (existing, replacement) -> existing
                            ),
                            map -> new ArrayList<>(map.values())
                    ));
            List<Map<String, Object>> responsibleDept = group.stream().filter(t -> t.getTodeptcode() != null).collect(Collectors.collectingAndThen(Collectors.toMap(ServiceSubtaskDetailTrace::getTodeptcode, t -> {
                Map<String, Object> deptMap = new HashMap<>();
                deptMap.put("deptName", t.getTodeptname());
                deptMap.put("deptCode", t.getTodeptcode());
                return deptMap;
            }, (existing, replacement) -> existing), map -> new ArrayList<>(map.values())));
            dto.setResponsibleDept(responsibleDept);
            // 有效填写数:通过组内的 scriptid 去 service_subtask_detail 表查询
            List<Long> scriptIds = group.stream()
                    .map(ServiceSubtaskDetailTrace::getScriptid)
                    .filter(Objects::nonNull)
                    .distinct()
                    .collect(Collectors.toList());
            List<Long> scriptIds = group.stream().map(ServiceSubtaskDetailTrace::getScriptid).filter(Objects::nonNull).distinct().collect(Collectors.toList());
            long effectiveFillNum = 0L;
            if (CollectionUtils.isNotEmpty(scriptIds)) {
                ServiceSubtaskDetail query = new ServiceSubtaskDetail();
@@ -140,19 +132,26 @@
            exceptionQuesNum.put("all", exceptionFillNum);
            dto.setExceptionQuesNum(exceptionQuesNum);
            // 汇总统计累加
            totalException += exceptionFillNum;
            noDealException += noDeal;
            yesDealException += yesDeal;
            // 最新处理人和处理时间(取 handleTime 最新的一条)
            group.stream()
                    .filter(t -> t.getHandleTime() != null)
                    .max(Comparator.comparing(ServiceSubtaskDetailTrace::getHandleTime))
                    .ifPresent(latest -> {
                        dto.setHandleBy(latest.getHandleBy());
                        dto.setHandleTime(latest.getHandleTime());
                    });
            group.stream().filter(t -> t.getHandleTime() != null).max(Comparator.comparing(ServiceSubtaskDetailTrace::getHandleTime)).ifPresent(latest -> {
                dto.setHandleBy(latest.getHandleBy());
                dto.setHandleTime(latest.getHandleTime());
            });
            detailTraceDealDTOList.add(dto);
        }
        return detailTraceDealDTOList;
        Map<String, Object> result = new HashMap<>();
        result.put("detailTraceDealDTOList", detailTraceDealDTOList);
        result.put("totalException", totalException);
        result.put("noDealException", noDealException);
        result.put("yesDealException", yesDealException);
        return result;
    }
    /**
smartor/src/main/java/com/smartor/service/impl/ServiceSubtaskServiceImpl.java
@@ -3839,7 +3839,7 @@
            if (serviceSubtaskPreachform1.getSort() == spSize.size() && failSendstate.equals("4")) {
                serviceSubtask.setCurrentPreachform(preachform);
                serviceSubtask.setSendstate(5L);
                serviceSubtask.setRemark("setFailPreachForm方法 当前的preachform已经是最后一个了,全失败了");
//                serviceSubtask.setRemark("setFailPreachForm方法 当前的preachform已经是最后一个了,全失败了");
                serviceSubtaskMapper.updateServiceSubtask(serviceSubtask);
                return true;
            }
smartor/src/main/java/com/smartor/service/impl/XHGatherPatArchiveServiceImpl.java
@@ -390,7 +390,7 @@
        patArchive.setPatientno(thiedInhospInfo.getPatiMediaNo());
        patArchive.setIdcardno(thiedInhospInfo.getPatiIdCardNo().trim());
        patArchive.setName(thiedInhospInfo.getPatiRecordName());
        patArchive.setSourcefrom(2);
        patArchive.setSourcefrom(2L);
        patArchive.setPattype("2");
        // 性别
smartor/src/main/resources/mapper/smartor/PatMedOperationItemMapper.xml
@@ -27,10 +27,12 @@
            <result property="pguid" column="pguid"/>
            <result property="guid" column="guid"/>
            <result property="pid" column="pid"/>
            <result property="opercheckFlag" column="opercheck_flag"/>
            <result property="longTaskReason" column="long_task_reason"/>
    </resultMap>
    <sql id="selectPatMedOperationItemVo">
        select id, operationid, opid, opcode, opdesc, main_flag, incitypecode, incitypedesc, oplevelcode, opleveldesc, opposition, del_flag, update_by, update_time, create_by, create_time, isupload, upload_time, orgid, pguid, guid, pid
        select id, operationid, opid, opcode, opdesc, main_flag, incitypecode, incitypedesc, oplevelcode, opleveldesc, opposition, del_flag, update_by, update_time, create_by, create_time, isupload, upload_time, orgid, pguid, guid, pid, opercheck_flag, long_task_reason
        from pat_med_operation_item
    </sql>
@@ -141,6 +143,10 @@
                    </if>
                    <if test="pid != null">pid,
                    </if>
                    <if test="opercheckFlag != null">opercheck_flag,
                    </if>
                    <if test="longTaskReason != null">long_task_reason,
                    </if>
        </trim>
        <trim prefix="values (" suffix=")" suffixOverrides=",">
                    <if test="id != null">#{id},
@@ -186,6 +192,10 @@
                    <if test="guid != null">#{guid},
                    </if>
                    <if test="pid != null">#{pid},
                    </if>
                    <if test="opercheckFlag != null">#{opercheckFlag},
                    </if>
                    <if test="longTaskReason != null">#{longTaskReason},
                    </if>
        </trim>
    </insert>
@@ -256,6 +266,12 @@
                    <if test="pid != null">pid =
                        #{pid},
                    </if>
                    <if test="opercheckFlag != null">opercheck_flag =
                        #{opercheckFlag},
                    </if>
                    <if test="longTaskReason != null">long_task_reason =
                        #{longTaskReason},
                    </if>
        </trim>
        where id = #{id}
    </update>
smartor/src/main/resources/mapper/smartor/ServiceSubtaskMapper.xml
@@ -92,6 +92,7 @@
        <result property="continueContent" column="continue_content"/>
        <result property="continueCount" column="continue_count"/>
        <result property="continueTimeNext" column="continue_time_next"/>
        <result property="operationItemId" column="operation_item_id"/>
    </resultMap>
    <resultMap type="com.smartor.domain.ServiceSubtaskCount" id="ServiceSubtaskResult2">
@@ -212,6 +213,7 @@
               continue_content,
               continue_count,
               continue_time_next,
               operation_item_id,
               task_situation
        from service_subtask
    </sql>
@@ -852,6 +854,7 @@
            <if test="continueCount != null ">continue_count,</if>
            <if test="continueTimeNext != null ">continue_time_next,</if>
            <if test="continueContent != null ">continue_content,</if>
            <if test="operationItemId != null ">operation_item_id,</if>
        </trim>
        <trim prefix="values (" suffix=")" suffixOverrides=",">
            <if test="sendname != null">#{sendname},</if>
@@ -943,6 +946,7 @@
            <if test="continueCount != null ">#{continueCount},</if>
            <if test="continueTimeNext != null ">#{continueTimeNext,jdbcType=TIMESTAMP},</if>
            <if test="continueContent != null ">#{continueContent},</if>
            <if test="operationItemId != null ">#{operationItemId},</if>
        </trim>
    </insert>
@@ -1039,6 +1043,7 @@
            <if test="continueCount != null ">continue_count = #{continueCount},</if>
            <if test="continueTimeNext != null ">continue_time_next = #{continueTimeNext,jdbcType=TIMESTAMP},</if>
            <if test="continueContent != null ">continue_content = #{continueContent},</if>
            <if test="operationItemId != null ">operation_item_id = #{operationItemId},</if>
        </trim>
        where id = #{id}
    </update>