【丽水】/smartor/patinhosp/addManualVisit 人工处理,接口完成删除未完成的任务,再次生成随访任务
已修改5个文件
165 ■■■■■ 文件已修改
ruoyi-admin/src/main/java/com/ruoyi/web/controller/smartor/PatMedInhospController.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/mapper/ServiceSubtaskMapper.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/service/IPatMedInhospService.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/service/impl/PatMedInhospServiceImpl.java 118 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/resources/mapper/smartor/ServiceSubtaskMapper.xml 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/controller/smartor/PatMedInhospController.java
@@ -12,6 +12,7 @@
import com.ruoyi.common.utils.PageUtils;
import com.ruoyi.common.utils.poi.ExcelUtil;
import com.ruoyi.system.service.ISysConfigService;
import com.smartor.domain.DTO.ManualVisitDTO;
import com.smartor.domain.DTO.PatMedInhospDTO;
import com.smartor.domain.PatMedInhosp;
import com.smartor.domain.PatMedInhospVO;
@@ -268,6 +269,15 @@
    }
    /**
     * 患者人工随访:删除未完成随访任务并按指定任务重新生成
     */
    @ApiOperation("addManualVisit")
    @PostMapping("/addManualVisit")
    public AjaxResult addManualVisit(@RequestBody ManualVisitDTO manualVisitDTO) {
        return success(patMedInhospService.addManualVisit(manualVisitDTO));
    }
    /**
     * 处理患者信息,进入子任务表
     */
    @ApiOperation("dealOutHospInfoBySchedule")
smartor/src/main/java/com/smartor/mapper/ServiceSubtaskMapper.java
@@ -156,6 +156,18 @@
    public int deleteServiceSubtaskByCondition(@Param("taskid") Long id, @Param("patid") Long patid);
    /**
     * 删除患者出院记录对应的未完成随访任务
     *
     * @param patid      患者ID
     * @param inhospids  出院记录ID集合
     * @param sendstates 未完成状态集合
     * @return 删除条数
     */
    public int deleteUnfinishedServiceSubtaskByInhospids(@Param("patid") Long patid,
                                                         @Param("inhospids") List<Long> inhospids,
                                                         @Param("sendstates") List<Long> sendstates);
    /**
     * 删除单一任务(随访)
     *
     * @return 结果
smartor/src/main/java/com/smartor/service/IPatMedInhospService.java
@@ -3,6 +3,7 @@
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.core.page.TableDataInfo;
import com.smartor.domain.*;
import com.smartor.domain.DTO.ManualVisitDTO;
import com.smartor.domain.DTO.PatMedInhospDTO;
import org.springframework.web.bind.annotation.RequestBody;
@@ -135,6 +136,14 @@
     */
    public void dealIcd10Subtask(PatMedInhosp patMedInhospVo, String config);
    /**
     * 人工随访:删除患者出院记录对应的未完成随访任务,并按指定任务重新生成
     *
     * @param manualVisitDTO 患者patid集合及人工随访任务taskid
     * @return 处理结果
     */
    public Map<String, Object> addManualVisit(ManualVisitDTO manualVisitDTO);
    public ServiceSubtask boxedServiceSubtask(ServiceTask serviceTask, PatMedInhosp patMedInhosp1, PatArchive patArchive, String config, Integer type);
    /**
smartor/src/main/java/com/smartor/service/impl/PatMedInhospServiceImpl.java
@@ -5,12 +5,14 @@
import com.fasterxml.jackson.databind.ObjectMapper;
import com.ruoyi.common.core.domain.entity.SysDept;
import com.ruoyi.common.core.service.IConfigService;
import com.ruoyi.common.exception.base.BaseException;
import com.ruoyi.common.utils.DateUtils;
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.DTO.ManualVisitDTO;
import com.smartor.domain.DTO.PatMedInhospDTO;
import com.smartor.domain.entity.ServiceSubtaskEntity;
import com.smartor.mapper.*;
@@ -20,6 +22,7 @@
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.ObjectUtils;
import java.io.IOException;
@@ -2004,4 +2007,119 @@
        }
    }
    /**
     * 人工随访:删除患者出院记录对应的未完成随访任务,并按指定任务重新生成。
     * 未完成状态口径:sendstate in (1,2,3,7)。
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public Map<String, Object> addManualVisit(ManualVisitDTO manualVisitDTO) {
        if (manualVisitDTO == null) {
            throw new BaseException("入参不能为空");
        }
        if (CollectionUtils.isEmpty(manualVisitDTO.getPatids())) {
            throw new BaseException("患者patid集合不能为空");
        }
        if (manualVisitDTO.getTaskid() == null) {
            throw new BaseException("人工随访任务taskid不能为空");
        }
        ServiceTask serviceTask = serviceTaskMapper.selectServiceTaskByTaskid(manualVisitDTO.getTaskid());
        if (Objects.isNull(serviceTask)) {
            throw new BaseException("人工随访任务不存在,taskid:" + manualVisitDTO.getTaskid());
        }
        LinkedHashSet<Long> patids = manualVisitDTO.getPatids().stream()
                .filter(Objects::nonNull)
                .collect(Collectors.toCollection(LinkedHashSet::new));
        if (patids.isEmpty()) {
            throw new BaseException("患者patid集合不能为空");
        }
        String config = iSysConfigService.selectConfigByKey("visit.early.day");
        List<Long> unfinishedSendstates = Arrays.asList(1L, 2L, 3L, 7L);
        int deletedCount = 0;
        int generatedCount = 0;
        List<Long> noDischargeRecordPatids = new ArrayList<>();
        List<Long> noArchivePatids = new ArrayList<>();
        List<Long> generateFailedPatids = new ArrayList<>();
        for (Long patid : patids) {
            // 查询患者全部出院记录,SQL 按出院时间倒序,第一条作为本次生成任务的出院记录
            PatMedInhosp query = new PatMedInhosp();
            query.setPatid(patid);
            query.setCry(1);
            if (StringUtils.isNotEmpty(serviceTask.getOrgid())) {
                query.setOrgid(serviceTask.getOrgid());
            }
            List<PatMedInhosp> inhospList = patMedInhospMapper.selectPatMedInhospList(query);
            if (CollectionUtils.isEmpty(inhospList)) {
                noDischargeRecordPatids.add(patid);
                continue;
            }
            PatMedInhosp latestInhosp = inhospList.get(0);
            if (Objects.isNull(latestInhosp.getEndtime())) {
                noDischargeRecordPatids.add(patid);
                continue;
            }
            PatArchive patArchive = patArchiveMapper.selectPatArchiveByPatid(patid);
            if (Objects.isNull(patArchive)) {
                noArchivePatids.add(patid);
                continue;
            }
            // 先构建新任务,构建失败时不删除原任务,避免患者丢失待随访任务
            ServiceSubtask serviceSubtask = boxedServiceSubtask(serviceTask, latestInhosp, patArchive, config, 1);
            if (Objects.isNull(serviceSubtask) || Objects.isNull(serviceSubtask.getTaskid())) {
                generateFailedPatids.add(patid);
                continue;
            }
            List<Long> inhospids = inhospList.stream()
                    .map(PatMedInhosp::getInhospid)
                    .filter(Objects::nonNull)
                    .distinct()
                    .collect(Collectors.toList());
            if (CollectionUtils.isNotEmpty(inhospids)) {
                deletedCount += serviceSubtaskMapper.deleteUnfinishedServiceSubtaskByInhospids(
                        patid, inhospids, unfinishedSendstates);
            }
            serviceSubtask.setId(null);
            serviceSubtask.setUpid(null);
            serviceSubtask.setVisitDeptCode(StringUtils.isNotEmpty(latestInhosp.getLeaveldeptcode())
                    ? latestInhosp.getLeaveldeptcode() : latestInhosp.getLeavehospitaldistrictcode());
            serviceSubtask.setVisitDeptName(StringUtils.isNotEmpty(latestInhosp.getLeaveldeptname())
                    ? latestInhosp.getLeaveldeptname() : latestInhosp.getLeavehospitaldistrictname());
            // 与常规生成逻辑保持一致:手机号为空时生成任务但不执行
            if (StringUtils.isEmpty(serviceSubtask.getPhone())) {
                serviceSubtask.setRemark(StringUtils.isNotEmpty(serviceSubtask.getRemark())
                        ? serviceSubtask.getRemark() + ",手机号为空" : "手机号为空");
                serviceSubtask.setSendstate(4L);
                serviceSubtask.setResult("error");
            }
            int inserted = serviceSubtaskMapper.insertServiceSubtask(serviceSubtask);
            if (inserted != 1) {
                throw new BaseException("生成随访任务失败,patid:" + patid + ",taskid:" + serviceTask.getTaskid());
            }
            addServiceSubtaskPreachform(serviceSubtask, null);
            generatedCount++;
            log.info("addManualVisit 生成随访任务成功,patid:{},taskid:{},subtaskId:{}",
                    patid, serviceTask.getTaskid(), serviceSubtask.getId());
        }
        Map<String, Object> result = new HashMap<>();
        result.put("deletedCount", deletedCount);
        result.put("generatedCount", generatedCount);
        result.put("noDischargeRecordPatids", noDischargeRecordPatids);
        result.put("noArchivePatids", noArchivePatids);
        result.put("generateFailedPatids", generateFailedPatids);
        log.info("addManualVisit 处理完成,patid数:{},taskid:{},删除未完成任务数:{},生成任务数:{}",
                patids.size(), serviceTask.getTaskid(), deletedCount, generatedCount);
        return result;
    }
}
smartor/src/main/resources/mapper/smartor/ServiceSubtaskMapper.xml
@@ -1655,6 +1655,22 @@
        where patid = #{patid} and taskid = #{taskid}
    </update>
    <!-- 人工随访:软删除患者出院记录对应的未完成随访任务 -->
    <update id="deleteUnfinishedServiceSubtaskByInhospids">
        update service_subtask
        set del_flag = 1
        where del_flag = 0
          and patid = #{patid}
          and sendstate in
          <foreach collection="sendstates" item="sendstate" open="(" separator="," close=")">
              #{sendstate}
          </foreach>
          and inhospid in
          <foreach collection="inhospids" item="inhospid" open="(" separator="," close=")">
              #{inhospid}
          </foreach>
    </update>
    <select id="getSfStatistics" parameterType="com.smartor.domain.ServiceSubtaskCountReq"
            resultMap="ServiceSubtaskResult">
        select id,