陈昶聿
5 天以前 85ce52a4573ea2bdfc82876aa92365d0359e8483
【丽水】丽水中模板读取报错
已修改3个文件
174 ■■■■■ 文件已修改
smartor/src/main/java/com/smartor/common/ScheduleSubtaskBuilder.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/service/impl/ServiceTaskScheduleServiceImpl.java 73 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/service/impl/ServiceTaskServiceImpl.java 90 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/common/ScheduleSubtaskBuilder.java
@@ -74,7 +74,16 @@
            // 模板:detail 优先于 task
            if (detail.getTemplateid() != null) {
                subtask.setTemplateid(detail.getTemplateid());
                // 兼容历史数据:明细 templateid 可能是模板库ID,不能直接作为任务模板ID使用。
                if ("2".equals(serviceTask.getType())
                        && String.valueOf(detail.getTemplateid()).equals(serviceTask.getLibtemplateid())
                        && serviceTask.getTemplateid() != null) {
                    log.warn("计划明细 templateid [{}] 是模板库ID,已回退为任务模板ID [{}], taskid={}, detailId={}",
                            detail.getTemplateid(), serviceTask.getTemplateid(), serviceTask.getTaskid(), detail.getId());
                    subtask.setTemplateid(serviceTask.getTemplateid());
                } else {
                    subtask.setTemplateid(detail.getTemplateid());
                }
                subtask.setTemplatename(detail.getTemplatename());
            }
            if (detail.getLibtemplateid() != null) {
smartor/src/main/java/com/smartor/service/impl/ServiceTaskScheduleServiceImpl.java
@@ -6,13 +6,17 @@
import com.ruoyi.common.utils.spring.SpringUtils;
import com.smartor.domain.ServiceSubtask;
import com.smartor.domain.ServiceSubtaskPreachform;
import com.smartor.domain.ServiceTask;
import com.smartor.domain.ServiceTaskSchedule;
import com.smartor.domain.ServiceTaskScheduleDetail;
import com.smartor.domain.ServiceTaskScheduleVO;
import com.smartor.domain.SvyTaskTemplateScript;
import com.smartor.mapper.ServiceSubtaskMapper;
import com.smartor.mapper.ServiceSubtaskPreachformMapper;
import com.smartor.mapper.ServiceTaskMapper;
import com.smartor.mapper.ServiceTaskScheduleDetailMapper;
import com.smartor.mapper.ServiceTaskScheduleMapper;
import com.smartor.mapper.SvyTaskTemplateScriptMapper;
import com.smartor.service.IServiceTaskScheduleService;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.CollectionUtils;
@@ -46,6 +50,12 @@
    @Autowired
    private ServiceSubtaskPreachformMapper serviceSubtaskPreachformMapper;
    @Autowired
    private ServiceTaskMapper serviceTaskMapper;
    @Autowired
    private SvyTaskTemplateScriptMapper svyTaskTemplateScriptMapper;
    /** 单次扫描的最大计划数,避免长事务。 */
    private static final int ROLL_BATCH_LIMIT = 200;
@@ -57,6 +67,10 @@
        }
        if (CollectionUtils.isEmpty(vo.getDetailList())) {
            throw new BaseException("任务计划明细不能为空(至少一条 detail)");
        }
        ServiceTask serviceTask = serviceTaskMapper.selectServiceTaskByTaskid(vo.getTaskid());
        if (serviceTask == null) {
            throw new BaseException("任务不存在或已删除,taskid=" + vo.getTaskid());
        }
        // 1. 旧计划删
@@ -100,6 +114,10 @@
        for (ServiceTaskScheduleDetail detail : detailList) {
            detail.setTaskid(vo.getTaskid());
            detail.setScheduleid(schedule.getId());
            Long resolvedTemplateId = resolveTaskTemplateId(serviceTask, detail);
            if (resolvedTemplateId != null) {
                detail.setTemplateid(resolvedTemplateId);
            }
            if (detail.getSeq() == null) {
                detail.setSeq(seq);
            }
@@ -120,6 +138,48 @@
        log.info("[任务组] taskid={} 计划保存完成, scheduleId={}, detail 条数={}",
                vo.getTaskid(), schedule.getId(), detailList.size());
        return schedule;
    }
    /**
     * 计划明细的 templateid 应保存任务模板ID(svy_task_template.id),
     * libtemplateid 才保存模板库ID(svy_lib_template_script.svyid)。
     * 兼容前端仍传模板库ID的情况:若明细模板在任务模板问题表中不存在,
     * 且该ID就是任务的模板库ID,则回退到任务自己的模板ID。
     */
    private Long resolveTaskTemplateId(ServiceTask serviceTask, ServiceTaskScheduleDetail detail) {
        Long detailTemplateId = detail.getTemplateid();
        if (detailTemplateId == null || serviceTask == null) {
            return detailTemplateId;
        }
        if (hasTaskTemplateScripts(detailTemplateId)) {
            return detailTemplateId;
        }
        // 只有问卷任务才依赖 svy_task_template_script,其它任务类型保持原逻辑
        if (!"2".equals(serviceTask.getType())) {
            return detailTemplateId;
        }
        Long taskTemplateId = serviceTask.getTemplateid();
        boolean detailUsesLibTemplate = detailTemplateId.equals(detail.getLibtemplateid())
                || String.valueOf(detailTemplateId).equals(serviceTask.getLibtemplateid());
        if (detailUsesLibTemplate && hasTaskTemplateScripts(taskTemplateId)) {
            log.warn("计划明细模板ID [{}] 是模板库ID,已映射为任务模板ID [{}], taskid={}",
                    detailTemplateId, taskTemplateId, serviceTask.getTaskid());
            return taskTemplateId;
        }
        log.warn("计划明细模板ID [{}] 在任务模板问题表中不存在, taskid={}, taskTemplateId={}, taskLibTemplateId={}",
                detailTemplateId, serviceTask.getTaskid(), taskTemplateId, serviceTask.getLibtemplateid());
        return detailTemplateId;
    }
    private boolean hasTaskTemplateScripts(Long templateId) {
        if (templateId == null) {
            return false;
        }
        SvyTaskTemplateScript query = new SvyTaskTemplateScript();
        query.setTemplateID(templateId);
        query.setDelFlag("0");
        return CollectionUtils.isNotEmpty(svyTaskTemplateScriptMapper.selectSvyTaskTemplateScriptList(query));
    }
    @Override
@@ -230,6 +290,7 @@
            log.warn("[任务组-滚动] scheduleId={} 明细为空, 跳过", scheduleId);
            return false;
        }
        ServiceTask serviceTask = serviceTaskMapper.selectServiceTaskByTaskid(schedule.getTaskid());
        // 推进步长(轮间隔)
        int stepNum = schedule.getScheduleTimeNum() == null ? 0 : schedule.getScheduleTimeNum();
@@ -258,7 +319,7 @@
                        scheduleId, src.getScheduleSeq(), src.getId());
                continue;
            }
            ServiceSubtask copy = cloneForNextLoop(src, detail, nextLoop, stepNum, stepUnit, now);
            ServiceSubtask copy = cloneForNextLoop(src, serviceTask, detail, nextLoop, stepNum, stepUnit, now);
            serviceSubtaskMapper.insertServiceSubtask(copy);
            // 复制 preachform
            copyPreachform(src.getId(), copy);
@@ -282,7 +343,8 @@
    /**
     * 克隆 subtask 到下一轮:清主键、清回签字段、推进 visit_time、设置 loop_count。
     */
    private ServiceSubtask cloneForNextLoop(ServiceSubtask src, ServiceTaskScheduleDetail detail,
    private ServiceSubtask cloneForNextLoop(ServiceSubtask src, ServiceTask serviceTask,
                                            ServiceTaskScheduleDetail detail,
                                            long nextLoop, int stepNum, int stepUnit, Date now) {
        ServiceSubtask copy = JSON.parseObject(JSON.toJSONString(src), ServiceSubtask.class);
        copy.setId(null);
@@ -294,9 +356,10 @@
        copy.setSendstate(2L);
        copy.setLoopCount(nextLoop);
        copy.setScheduleDetailId(detail.getId());
        // 模板:detail 优先
        if (detail.getTemplateid() != null) {
            copy.setTemplateid(detail.getTemplateid());
        // 模板:detail 优先,并把历史数据里的模板库ID映射为任务模板ID
        Long resolvedTemplateId = resolveTaskTemplateId(serviceTask, detail);
        if (resolvedTemplateId != null) {
            copy.setTemplateid(resolvedTemplateId);
            copy.setTemplatename(detail.getTemplatename());
        }
        if (detail.getLibtemplateid() != null) {
smartor/src/main/java/com/smartor/service/impl/ServiceTaskServiceImpl.java
@@ -442,34 +442,50 @@
            serviceSubtaskVO.setPatid(patid);
        }
        List<ServiceSubtask> serviceSubtaskList = serviceSubtaskMapper.selectServiceSubtaskList(serviceSubtaskVO);
        List<SvyTaskTemplateScriptVO> svyTaskTemplateScriptVOS = null;
        if (CollectionUtils.isNotEmpty(serviceSubtaskList) && serviceSubtaskList.size() == 1) {
            if (serviceSubtaskList.get(0).getSendstate() == 3 && isFinish == true) {
                ServiceSubtask serviceSubtask = new ServiceSubtask();
                serviceSubtask.setSendstate(1L);
                serviceSubtask.setPatid(patid);
                serviceSubtask.setTaskid(serviceTask.getTaskid());
                serviceSubtaskMapper.updateServiceSubtaskByPatId(serviceSubtask);
            }
            //通过模板ID获取问题信息
            SvyTaskTemplateScript svyTaskTemplateScript = new SvyTaskTemplateScript();
            svyTaskTemplateScript.setTemplateID(Long.valueOf(serviceTask.getTemplateid()));
            if (serviceSubtaskList.get(0).getTemplateid() != null)
                svyTaskTemplateScript.setTemplateID(serviceSubtaskList.get(0).getTemplateid());
            else if (serviceTask.getTemplateid() != null)
                svyTaskTemplateScript.setTemplateID(serviceTask.getTemplateid());
            svyTaskTemplateScript.setDelFlag("0");
            List<SvyTaskTemplateScript> svyTaskTemplateScripts = svyTaskTemplateScriptMapper.selectSvyTaskTemplateScriptList(svyTaskTemplateScript);
            if (CollectionUtils.isEmpty(svyTaskTemplateScripts) || svyTaskTemplateScripts.size() == 0) {
                insertSvyTaskTempScript(null, serviceTask);
                svyTaskTemplateScripts = svyTaskTemplateScriptMapper.selectSvyTaskTemplateScriptList(svyTaskTemplateScript);
                if (CollectionUtils.isEmpty(svyTaskTemplateScripts)) {
                    throw new BaseException("请联系管理员,检查问题模板信息!");
                }
            }
            svyTaskTemplateScriptVOS = DtoConversionUtils.sourceToTarget(svyTaskTemplateScripts, SvyTaskTemplateScriptVO.class);
        if (CollectionUtils.isEmpty(serviceSubtaskList)) {
            throw new BaseException("未找到患者子任务,taskid=" + serviceTask.getTaskid()
                    + ", patid=" + patid + ", subId=" + subId);
        }
        if (serviceSubtaskList.size() > 1) {
            throw new BaseException("存在多条患者子任务,请传入子任务ID后再查询,taskid=" + serviceTask.getTaskid()
                    + ", patid=" + patid);
        }
        ServiceSubtask serviceSubtask = serviceSubtaskList.get(0);
        if (Long.valueOf(3L).equals(serviceSubtask.getSendstate()) && Boolean.TRUE.equals(isFinish)) {
            ServiceSubtask updateSubtask = new ServiceSubtask();
            updateSubtask.setSendstate(1L);
            updateSubtask.setPatid(patid);
            updateSubtask.setTaskid(serviceTask.getTaskid());
            serviceSubtaskMapper.updateServiceSubtaskByPatId(updateSubtask);
        }
        // 子任务模板优先;子任务未设置时回退到任务模板。
        Long templateId = serviceSubtask.getTemplateid() != null
                ? serviceSubtask.getTemplateid() : serviceTask.getTemplateid();
        if (templateId == null) {
            throw new BaseException("任务未配置问卷模板,taskid=" + serviceTask.getTaskid());
        }
        // 查询与兜底复制必须使用同一个模板ID,否则会出现“复制到A、仍查B”的死循环。
        SvyTaskTemplateScript svyTaskTemplateScript = new SvyTaskTemplateScript();
        svyTaskTemplateScript.setTemplateID(templateId);
        svyTaskTemplateScript.setDelFlag("0");
        List<SvyTaskTemplateScript> svyTaskTemplateScripts =
                svyTaskTemplateScriptMapper.selectSvyTaskTemplateScriptList(svyTaskTemplateScript);
        if (CollectionUtils.isEmpty(svyTaskTemplateScripts)) {
            log.warn("问卷任务模板问题为空,开始从模板库兜底复制, taskid={}, patid={}, subId={}, queryTemplateId={}, taskTemplateId={}, libTemplateId={}",
                    serviceTask.getTaskid(), patid, subId, templateId,
                    serviceTask.getTemplateid(), serviceTask.getLibtemplateid());
            insertSvyTaskTempScript(null, serviceTask, templateId);
            svyTaskTemplateScripts = svyTaskTemplateScriptMapper.selectSvyTaskTemplateScriptList(svyTaskTemplateScript);
            if (CollectionUtils.isEmpty(svyTaskTemplateScripts)) {
                throw new BaseException("请联系管理员,检查问题模板信息! taskid=" + serviceTask.getTaskid()
                        + ", templateId=" + templateId + ", libTemplateId=" + serviceTask.getLibtemplateid());
            }
        }
        List<SvyTaskTemplateScriptVO> svyTaskTemplateScriptVOS =
                DtoConversionUtils.sourceToTarget(svyTaskTemplateScripts, SvyTaskTemplateScriptVO.class);
        //获取患者信息
        PatArchive patArchive = null;
        if (patfrom.equals("0")) patArchive = patArchiveMapper.selectPatArchiveByPatid(patid);
@@ -529,7 +545,7 @@
                    svyTaskTemplateScriptVO.setSvyTaskTemplateTargetoptions(svyTaskTemplateTargetoptions);
                } else {
                    //如果选项没有查到,需要去基础模板库将选项查询出来,放到任务模板选项库中
                    insertSvyTaskTempScript(svyTaskTemplateScriptVO, serviceTask);
                    insertSvyTaskTempScript(svyTaskTemplateScriptVO, serviceTask, templateId);
                }
            }
@@ -539,8 +555,13 @@
    }
    private void insertSvyTaskTempScript(SvyTaskTemplateScriptVO svyTaskTemplateScriptVO, ServiceTask serviceTask) {
        log.info("-------基础模板libtemplateid的值为:{}", serviceTask.getLibtemplateid());
    private void insertSvyTaskTempScript(SvyTaskTemplateScriptVO svyTaskTemplateScriptVO,
                                         ServiceTask serviceTask, Long targetTemplateId) {
        log.info("-------基础模板libtemplateid的值为:{},目标templateID为:{}", serviceTask.getLibtemplateid(), targetTemplateId);
        if (targetTemplateId == null) {
            log.warn("目标模板ID为空,无法复制基础模板问题, taskid={}", serviceTask.getTaskid());
            return;
        }
        if (StringUtils.isEmpty(serviceTask.getLibtemplateid())) {
            return;
        }
@@ -551,7 +572,8 @@
        log.info("-------基础模板svyLibTemplateScripts问题值为:{}", svyLibTemplateScripts.size());
        for (SvyLibTemplateScript sll : svyLibTemplateScripts) {
            if (ObjectUtils.isNotEmpty(svyTaskTemplateScriptVO)) {
                if (sll.getScriptContent().trim().equals(svyTaskTemplateScriptVO.getScriptContent().trim())) {
                if (StringUtils.equals(StringUtils.trim(sll.getScriptContent()),
                        StringUtils.trim(svyTaskTemplateScriptVO.getScriptContent()))) {
                    SvyLibTemplateTargetoption sltto = new SvyLibTemplateTargetoption();
                    sltto.setScriptid(sll.getId());
                    List<SvyLibTemplateTargetoption> svyLibTemplateTargetoptions = svyLibTemplateTargetoptionMapper.selectSvyLibTemplateTargetoptionList(sltto);
@@ -559,7 +581,7 @@
                    //将查出来的选项,放到svyTaskTemplateTargetoption中
                    List<SvyTaskTemplateTargetoption> svyTaskTemplateTargetoptionList = DtoConversionUtils.sourceToTarget(svyLibTemplateTargetoptions, SvyTaskTemplateTargetoption.class);
                    for (int i = 0; i < svyTaskTemplateTargetoptionList.size(); i++) {
                        svyTaskTemplateTargetoptionList.get(i).setTemplateID(svyTaskTemplateScriptVO.getTemplateID());
                        svyTaskTemplateTargetoptionList.get(i).setTemplateID(targetTemplateId);
                        svyTaskTemplateTargetoptionList.get(i).setScriptid(svyTaskTemplateScriptVO.getId());
                        svyTaskTemplateTargetoptionMapper.insertSvyTaskTemplateTargetoption(svyTaskTemplateTargetoptionList.get(i));
                        log.info("-------新增完之后的选项ID值为:{}", svyTaskTemplateTargetoptionList.get(i).getId());
@@ -571,7 +593,7 @@
                SvyTaskTemplateScript stts = DtoConversionUtils.sourceToTarget(sll, SvyTaskTemplateScript.class);
                stts.setId(null);
                stts.setTaskid(serviceTask.getTaskid());
                stts.setTemplateID(serviceTask.getTemplateid());
                stts.setTemplateID(targetTemplateId);
                svyTaskTemplateScriptMapper.insertSvyTaskTemplateScript(stts);
                //新增问题选项
@@ -580,7 +602,7 @@
                List<SvyLibTemplateTargetoption> svyLibTemplateTargetoptions = svyLibTemplateTargetoptionMapper.selectSvyLibTemplateTargetoptionList(sltto);
                List<SvyTaskTemplateTargetoption> svyTaskTemplateTargetoptionList = DtoConversionUtils.sourceToTarget(svyLibTemplateTargetoptions, SvyTaskTemplateTargetoption.class);
                for (int i = 0; i < svyTaskTemplateTargetoptionList.size(); i++) {
                    svyTaskTemplateTargetoptionList.get(i).setTemplateID(serviceTask.getTemplateid());
                    svyTaskTemplateTargetoptionList.get(i).setTemplateID(targetTemplateId);
                    svyTaskTemplateTargetoptionList.get(i).setScriptid(stts.getId());
                    svyTaskTemplateTargetoptionMapper.insertSvyTaskTemplateTargetoption(svyTaskTemplateTargetoptionList.get(i));
                }