陈昶聿
2 天以前 e32414ce775fefdd0602ac96c218c4f0758f7033
ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/RyTask.java
@@ -6,19 +6,24 @@
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.google.gson.Gson;
import com.ruoyi.common.core.domain.entity.SysDept;
import com.ruoyi.common.core.redis.RedisCache;
import com.ruoyi.common.dx.MessageSend;
import com.ruoyi.common.enums.MsgLSEnum;
import com.ruoyi.common.enums.ServiceFromEnum;
import com.ruoyi.common.enums.WxGZHEnum;
import com.ruoyi.common.exception.base.BaseException;
import com.ruoyi.common.utils.*;
import com.ruoyi.common.utils.http.HttpUtils;
import com.ruoyi.common.utils.sms.smsUtils;
import com.ruoyi.quartz.service.ICollectHISService;
import com.ruoyi.quartz.util.CreateDataTable;
import com.ruoyi.system.domain.SysConfig;
import com.ruoyi.system.mapper.SysConfigMapper;
import com.ruoyi.system.service.ISysConfigService;
import com.ruoyi.system.service.ISysDeptService;
import com.smartor.common.LSHospTokenUtil;
import com.smartor.common.MtSubmitSmUtil;
import com.smartor.common.QwenLLMUtil;
import com.smartor.domain.*;
import com.smartor.domain.entity.ServiceSubtaskEntity;
import com.smartor.mapper.*;
@@ -42,6 +47,7 @@
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
import java.util.*;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;
import static cn.hutool.core.convert.Convert.toHex;
@@ -108,6 +114,9 @@
    @Value("${xhsmsPwd}")
    private String xhsmsPwd;
    // 虚拟接入码
    @Value("${xhsmsjrm}")
    private String xhsmsjrm;
    @Value("${pub_key}")
    private String pub_key;
@@ -128,11 +137,13 @@
    private IServiceSubtaskRecordService serviceSubtaskRecordService;
    @Autowired
    IBaseSmsaccountService baseSmsaccountService;
    IIcd10Service iIcd10Service;
    @Autowired
    IPatArchiveService patArchiveService;
    @Autowired
    ISysDeptService sysDeptService;
    @Autowired
    IPatMedOuthospService patMedOuthospService;
@@ -152,6 +163,9 @@
    @Autowired
    ICollectHISService icollectHis;
    @Autowired
    CreateDataTable createDataTable;
    @Value("${appid}")
    private String appid;
@@ -159,9 +173,13 @@
    @Value("${server.port}")
    private String port;
    @Autowired
    private MtSubmitSmUtil mtSubmitSmUtil;
    @Value("${spring.profiles.active}")
    private String active;
    @Autowired
    private SysConfigMapper sysConfigMapper;
    public void ryMultipleParams(String s, Boolean b, Long l, Double d, Integer i) {
        System.out.println(StringUtils.format("执行多参方法: 字符串类型{},布尔类型{},长整型{},浮点型{},整形{}", s, b, l, d, i));
@@ -219,15 +237,29 @@
        serviceSubtaskAnswerService.saveQuestionAnswer(null, 0L);
    }
    /**
     * 获取预约停诊记录信息
     *
     */
    public void getAppointRecordInfo() {
        LocalDateTime tomorrowStart = LocalDate.now().plusDays(1).atStartOfDay(); // 明天 00:00:00
        LocalDateTime tomorrowEnd = tomorrowStart.plusDays(1).minusSeconds(1);     // 明天 23:59:59
        ixhGatherPatArchiveService.getAppointRecordInfo("2", tomorrowStart, tomorrowEnd);
    }
    /**
     * HIS数据采集
     * 定时任务:采集患者信息、出院、门诊数据
     * todayZeroStr  当前的时间   例如:2026-05-06 00:00:00
     */
    public void dealHisData() {
    public void dealHisData(String todayZeroStr) {
        log.info("【dealHisData】开始执行HIS数据采集任务");
        // 获取昨天0点到今天0点的时间范围
        LocalDateTime todayZero = LocalDateTime.now().with(LocalTime.MIN);
        if (StringUtils.isNotBlank(todayZeroStr)) {
            DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
            todayZero = LocalDateTime.parse(todayZeroStr, formatter);
        }
        LocalDateTime yesterdayZero = todayZero.minusDays(1);
        log.info("【dealHisData】采集时间范围:{} ~ {}", yesterdayZero, todayZero);
@@ -261,7 +293,9 @@
            } catch (Exception e) {
                log.error("【dealHisData】河南数据采集异常", e);
            }
        } else if (active.trim().equals("sltd")) {
        } else if (active.trim().equals("sltd") || active.trim().equals("nhfy")) {
            //省立同德与华南附一用同一套采集方法(都是来未来提供)
            try {
                //获取是否需要采集用户、部门信息
                SysConfig config = new SysConfig();
@@ -305,69 +339,96 @@
                        aBoolean = serviceSLTDHealthcareRecordService.queryHospUserInfoList(reqVO);
                    }
                    log.info("【dealHisData】省立同德“用户信息”结束采集数据:{}", aBoolean);
                    //疾病字典采集
                    iIcd10Service.queryAddIcd10();
                }
                // 省立同德数据采集
                for (Long cid : campusidList) {
                    log.debug("【dealHisData】省立同德“预入院”开始采集数据,院区:{}", cid);
                    String nowTime = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));
                    ServiceSLTDInhospReqVO serviceSLTDInhospReqVO = new ServiceSLTDInhospReqVO();
                    serviceSLTDInhospReqVO.setOrgId("20001001");
                    serviceSLTDInhospReqVO.setCampusId(cid);
                    serviceSLTDInhospReqVO.setEncounterTimeStart(nowTime);
                    serviceSLTDInhospReqVO.setEncounterTimeEnd(nowTime);
                    List<String> list = new ArrayList<>();
//                    list.add("FH0108.02");
                    list.add("FH0109.22");
                    list.add("FH0109.23");
                    list.add("FH0109.53");
                    serviceSLTDInhospReqVO.setStatusList(list);
                    log.debug("【dealHisData】省立同德“预入院”采集数据入参:{}", serviceSLTDInhospReqVO);
                    serviceSLTDHealthcareRecordService.queryHealthcareRecordList(serviceSLTDInhospReqVO);
                    log.debug("【dealHisData】省立同德“预入院”結束采集数据,院区:{}", cid);
                    log.debug("【dealHisData】省立同德“入院”开始采集数据,院区:{}", cid);
                    serviceSLTDInhospReqVO.setOrgId("20001001");
                    serviceSLTDInhospReqVO.setCampusId(cid);
                    serviceSLTDInhospReqVO.setEncounterTimeStart(null);
                    serviceSLTDInhospReqVO.setEncounterTimeEnd(null);
                    serviceSLTDInhospReqVO.setStartHeadTime(nowTime);
                    serviceSLTDInhospReqVO.setStartTailTime(nowTime);
                    List<String> listStr = new ArrayList<>();
                    listStr.add("FH0109.26");
                    serviceSLTDInhospReqVO.setStatusList(listStr);
                    log.debug("【dealHisData】省立同德“入院”采集数据入参:{}", serviceSLTDInhospReqVO);
                    serviceSLTDHealthcareRecordService.queryHealthcareRecordList(serviceSLTDInhospReqVO);
                    log.debug("【dealHisData】省立同德“入院”結束采集数据,院区:{}", cid);
                // nhfy/sltd回溯30天分段采集判断(每段最多7天)
                boolean isBackfill = (active.trim().equals("nhfy") || active.trim().equals("sltd")) && StringUtils.isNotBlank(todayZeroStr);
                if (isBackfill) {
                    DateTimeFormatter dateFmt = DateTimeFormatter.ofPattern("yyyy-MM-dd");
                    LocalDate segStart = todayZero.toLocalDate().minusDays(30);
                    LocalDate segEndDate = todayZero.toLocalDate();
                    int segCount = 0;
                    while (!segStart.isAfter(segEndDate)) {
                        LocalDate segEnd = segStart.plusDays(6);
                        if (segEnd.isAfter(segEndDate)) {
                            segEnd = segEndDate;
                        }
                        segCount++;
                        log.info("【dealHisData】{}回溯第{}段采集,日期范围:{} ~ {}", active.trim(), segCount, segStart.format(dateFmt), segEnd.format(dateFmt));
                        for (Long cid : campusidList) {
                            collectSegmentData(cid, segStart.format(dateFmt), segEnd.format(dateFmt));
                        }
                        segStart = segEnd.plusDays(1);
                    }
                    log.info("【dealHisData】{}回溯采集完成,共{}段", active.trim(), segCount);
                }
//                    log.debug("【dealHisData】省立同德“门急诊”开始采集数据,院区:{}", cid);
//                    serviceSLTDInhospReqVO.setStartHeadTime(null);
//                    serviceSLTDInhospReqVO.setStartTailTime(null);
//                    serviceSLTDInhospReqVO.setEncounterTimeStart(nowTime);
//                    serviceSLTDInhospReqVO.setEncounterTimeEnd(nowTime);
//                    serviceSLTDInhospReqVO.setStatusList(null);
//                    List<String> list1 = new ArrayList<>();
//                    list1.add("FH0108.01");
//                    list1.add("FH0108.03");
//                    serviceSLTDInhospReqVO.setHealthcareRecordTypeList(list1);
//                    log.debug("【dealHisData】省立同德“门急诊”采集数据入参:{}", serviceSLTDInhospReqVO);
//                    serviceSLTDHealthcareRecordService.queryHealthcareRecordList(serviceSLTDInhospReqVO);
//                    log.debug("【dealHisData】省立同德“门急诊”束采集数据,院区:{}", cid);
                // 省立同德数据采集(非回溯模式才执行)
                if (!isBackfill) {
                    for (Long cid : campusidList) {
                        log.info("【dealHisData】省立同德预入院开始采集数据,院区:{}", cid);
                        String nowTime = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));
                        ServiceSLTDInhospReqVO serviceSLTDInhospReqVO = new ServiceSLTDInhospReqVO();
                        serviceSLTDInhospReqVO.setOrgId("20001001");
                        serviceSLTDInhospReqVO.setCampusId(cid);
                        serviceSLTDInhospReqVO.setEncounterTimeStart(nowTime);
                        serviceSLTDInhospReqVO.setEncounterTimeEnd(nowTime);
                        if (active.trim().equals("nhfy")) {
                            serviceSLTDInhospReqVO.setEncounterTimeStart(yesterdayZero.format(DateTimeFormatter.ofPattern("yyyy-MM-dd")));
                            serviceSLTDInhospReqVO.setEncounterTimeEnd(todayZero.format(DateTimeFormatter.ofPattern("yyyy-MM-dd")));
                        }
                        List<String> list = new ArrayList<>();
                        list.add("FH0109.22");
                        list.add("FH0109.23");
                        list.add("FH0109.53");
                        serviceSLTDInhospReqVO.setStatusList(list);
                        log.info("【dealHisData】省立同德“预入院”采集数据入参:{}", serviceSLTDInhospReqVO);
                        serviceSLTDHealthcareRecordService.queryHealthcareRecordList(serviceSLTDInhospReqVO);
                        log.info("【dealHisData】省立同德“预入院”結束采集数据,院区:{}", cid);
                    log.debug("【dealHisData】省立同德“出院”开始采集数据,院区:{}", cid);
                    serviceSLTDInhospReqVO.setStartHeadTime(null);
                    serviceSLTDInhospReqVO.setStartTailTime(null);
                    serviceSLTDInhospReqVO.setEncounterTimeStart(null);
                    serviceSLTDInhospReqVO.setEncounterTimeEnd(null);
                    serviceSLTDInhospReqVO.setPreOutHospitalHeadDate(nowTime);
                    serviceSLTDInhospReqVO.setPreOutHospitalTailDate(nowTime);
                    serviceSLTDInhospReqVO.setHealthcareRecordTypeList(null);
                    List<String> list2 = new ArrayList<>();
                        log.info("【dealHisData】省立同德“入院”开始采集数据,院区:{}", cid);
                        serviceSLTDInhospReqVO.setOrgId("20001001");
                        serviceSLTDInhospReqVO.setCampusId(cid);
                        serviceSLTDInhospReqVO.setEncounterTimeStart(null);
                        serviceSLTDInhospReqVO.setEncounterTimeEnd(null);
                        serviceSLTDInhospReqVO.setStartHeadTime(nowTime);
                        serviceSLTDInhospReqVO.setStartTailTime(nowTime);
                        if (active.trim().equals("nhfy")) {
                            serviceSLTDInhospReqVO.setStartHeadTime(yesterdayZero.format(DateTimeFormatter.ofPattern("yyyy-MM-dd")));
                            serviceSLTDInhospReqVO.setStartTailTime(todayZero.format(DateTimeFormatter.ofPattern("yyyy-MM-dd")));
                        }
                        List<String> listStr = new ArrayList<>();
                        listStr.add("FH0109.24");
                        serviceSLTDInhospReqVO.setStatusList(listStr);
                        log.info("【dealHisData】省立同德“入院”采集数据入参:{}", serviceSLTDInhospReqVO);
                        serviceSLTDHealthcareRecordService.queryHealthcareRecordList(serviceSLTDInhospReqVO);
                        log.info("【dealHisData】省立同德“入院”結束采集数据,院区:{}", cid);
                        log.info("【dealHisData】省立同德“出院”开始采集数据,院区:{}", cid);
                        serviceSLTDInhospReqVO.setStartHeadTime(null);
                        serviceSLTDInhospReqVO.setStartTailTime(null);
                        serviceSLTDInhospReqVO.setEncounterTimeStart(null);
                        serviceSLTDInhospReqVO.setEncounterTimeEnd(null);
                        serviceSLTDInhospReqVO.setPreOutHospitalHeadDate(nowTime);
                        serviceSLTDInhospReqVO.setPreOutHospitalTailDate(nowTime);
                        if (active.trim().equals("nhfy")) {
                            serviceSLTDInhospReqVO.setPreOutHospitalHeadDate(yesterdayZero.format(DateTimeFormatter.ofPattern("yyyy-MM-dd")));
                            serviceSLTDInhospReqVO.setPreOutHospitalTailDate(todayZero.format(DateTimeFormatter.ofPattern("yyyy-MM-dd")));
                        }
                        serviceSLTDInhospReqVO.setHealthcareRecordTypeList(null);
                        List<String> list2 = new ArrayList<>();
//                    list2.add("FH0108.02");
                    list2.add("FH0109.27");
                    serviceSLTDInhospReqVO.setStatusList(list2);
                    log.debug("【dealHisData】省立同德“出院”采集数据入参:{}", serviceSLTDInhospReqVO);
                    serviceSLTDHealthcareRecordService.queryHealthcareRecordList(serviceSLTDInhospReqVO);
                    log.debug("【dealHisData】省立同德“出院”束采集数据,院区:{}", cid);
                        //出院
                        list2.add("FH0109.27");
                        //预出院
                        list2.add("FH0109.25");
                        serviceSLTDInhospReqVO.setStatusList(list2);
                        log.info("【dealHisData】省立同德“出院”采集数据入参:{}", serviceSLTDInhospReqVO);
                        serviceSLTDHealthcareRecordService.queryHealthcareRecordList(serviceSLTDInhospReqVO);
                        log.info("【dealHisData】省立同德“出院”束采集数据,院区:{}", cid);
                    }
                }
            } catch (Exception e) {
@@ -375,6 +436,176 @@
            }
        }
    }
    /**
     * 分段采集数据(预入院、入院、出院)
     * 用于nhfy/sltd回溯采集,每次最多查询7天数据
     *
     * @param cid          院区ID
     * @param startDateStr 日期开始 yyyy-MM-dd
     * @param endDateStr   日期结束 yyyy-MM-dd
     */
    private void collectSegmentData(Long cid, String startDateStr, String endDateStr) {
        // 预入院
        log.info("【dealHisData】预入院开始采集数据,院区:{},时间段:{} ~ {}", cid, startDateStr, endDateStr);
        ServiceSLTDInhospReqVO reqVO = new ServiceSLTDInhospReqVO();
        reqVO.setOrgId("20001001");
        reqVO.setCampusId(cid);
        reqVO.setEncounterTimeStart(startDateStr);
        reqVO.setEncounterTimeEnd(endDateStr);
        List<String> preAdmitStatus = new ArrayList<>();
        preAdmitStatus.add("FH0109.22");
        preAdmitStatus.add("FH0109.23");
        preAdmitStatus.add("FH0109.53");
        reqVO.setStatusList(preAdmitStatus);
        log.info("【dealHisData】预入院采集数据入参:{}", reqVO);
        serviceSLTDHealthcareRecordService.queryHealthcareRecordList(reqVO);
        log.info("【dealHisData】预入院終了采集数据,院区:{}", cid);
        // 入院
        log.info("【dealHisData】入院开始采集数据,院区:{},时间段:{} ~ {}", cid, startDateStr, endDateStr);
        reqVO = new ServiceSLTDInhospReqVO();
        reqVO.setOrgId("20001001");
        reqVO.setCampusId(cid);
        reqVO.setStartHeadTime(startDateStr);
        reqVO.setStartTailTime(endDateStr);
        List<String> admitStatus = new ArrayList<>();
        admitStatus.add("FH0109.24");
        reqVO.setStatusList(admitStatus);
        log.info("【dealHisData】入院采集数据入参:{}", reqVO);
        serviceSLTDHealthcareRecordService.queryHealthcareRecordList(reqVO);
        log.info("【dealHisData】入院終了采集数据,院区:{}", cid);
        // 出院
        log.info("【dealHisData】出院开始采集数据,院区:{},时间段:{} ~ {}", cid, startDateStr, endDateStr);
        reqVO = new ServiceSLTDInhospReqVO();
        reqVO.setOrgId("20001001");
        reqVO.setCampusId(cid);
        reqVO.setPreOutHospitalHeadDate(startDateStr);
        reqVO.setPreOutHospitalTailDate(endDateStr);
        List<String> dischargeStatus = new ArrayList<>();
        //出院
        dischargeStatus.add("FH0109.27");
        //预出院
        dischargeStatus.add("FH0109.25");
        reqVO.setStatusList(dischargeStatus);
        log.info("【dealHisData】出院采集数据入参:{}", reqVO);
        serviceSLTDHealthcareRecordService.queryHealthcareRecordList(reqVO);
        log.info("【dealHisData】出院结束采集数据,院区:{}", cid);
    }
    /**
     * HIS省立同德门急诊数据采集(这个只能一天执行一次,不能半个小时执行一个,数据量太大,影响性能)
     * 定时任务:门诊数据
     * todayZeroStr  当前的时间   例如:2026-05-06 00:00:00
     */
    public void dealHisDataMZ(String todayZeroStr) {
        log.info("【dealHisData】门急诊数据开始执行HIS数据采集任务");
        // 获取昨天0点到今天0点的时间范围
        LocalDateTime todayZero = LocalDateTime.now().with(LocalTime.MIN);
        if (StringUtils.isNotBlank(todayZeroStr)) {
            DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
            todayZero = LocalDateTime.parse(todayZeroStr, formatter);
        }
        LocalDateTime tomorrowdayZero = todayZero.plusDays(1);
        if (active.trim().equals("sltd") || active.trim().equals("nhfy")) {
            //省立同德与华南附一用同一套采集方法(都是来未来提供)
            try {
                //获取省立同德要采集的院区
                SysConfig cf = new SysConfig();
                cf.setConfigKey("sltd.gather.campusid");
                cf.setOrgid("20001001");
                List<SysConfig> sysConfigcampusids = configService.selectConfigList(cf);
                List<Long> campusidList = new ArrayList<>();
                if (CollectionUtils.isNotEmpty(sysConfigcampusids)) {
                    String[] split = sysConfigcampusids.get(0).getConfigValue().split(",");
                    campusidList = Arrays.stream(split).map(Long::valueOf).collect(Collectors.toList());
                } else {
                    log.error("SysConfig中的院区ID为空!");
                    return;
                }
                // 省立同德数据采集
                log.info("--campusidList的值为:{}", campusidList);
                for (Long cid : campusidList) {
                    String nowTime = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));
                    ServiceSLTDInhospReqVO serviceSLTDInhospReqVO = new ServiceSLTDInhospReqVO();
                    serviceSLTDInhospReqVO.setOrgId("20001001");
                    serviceSLTDInhospReqVO.setCampusId(cid);
                    serviceSLTDInhospReqVO.setEncounterTimeStart(nowTime);
                    serviceSLTDInhospReqVO.setEncounterTimeEnd(nowTime);
                    // 门急诊分页采集:每页40条,直到无数据为止(南华附一的先不采门急诊数据)
                    if (active.trim().equals("sltd")) {
                        log.info("【dealHisData】省立同德“门急诊”开始分页采集数据,院区:{}", cid);
                        serviceSLTDInhospReqVO.setStartHeadTime(null);
                        serviceSLTDInhospReqVO.setStartTailTime(null);
                        //查询当天的数据
                        serviceSLTDInhospReqVO.setEncounterTimeEnd(tomorrowdayZero.format(DateTimeFormatter.ofPattern("yyyy-MM-dd")));
                        serviceSLTDInhospReqVO.setEncounterTimeStart(todayZero.format(DateTimeFormatter.ofPattern("yyyy-MM-dd")));
                        serviceSLTDInhospReqVO.setStatusList(null);
                        List<String> list1 = new ArrayList<>();
                        list1.add("FH0108.01");
                        list1.add("FH0108.03");
                        serviceSLTDInhospReqVO.setHealthcareRecordTypeList(list1);
                        //从缓存里获取起始页(零点前10分钟内用昨天的日期,避免跨天漏采)
                        LocalDateTime now = LocalDateTime.now();
                        String mzCacheDate = (now.getHour() == 0 && now.getMinute() < 10) ? now.minusDays(1).format(DateTimeFormatter.ofPattern("yyyy-MM-dd")) : now.format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));
                        Long outpPage = redisCache.getCacheObject("mzCurrent" + cid + mzCacheDate);
                        if (outpPage == null) outpPage = 1L;
                        //那边暂时只能设置40
                        final long OUTP_PAGE_SIZE = 500L;
                        while (true) {
                            serviceSLTDInhospReqVO.setCurrent(outpPage);
                            serviceSLTDInhospReqVO.setSize(OUTP_PAGE_SIZE);
                            log.info("【dealHisData】省立同德“门急诊”采集第{}页数据,院区:{}", outpPage, cid);
                            List<ServiceSLTDInhospResDTO> outpResult = serviceSLTDHealthcareRecordService.queryHealthcareRecordList(serviceSLTDInhospReqVO);
                            if (CollectionUtils.isEmpty(outpResult)) {
                                log.info("【dealHisData】省立同德“门急诊”第{}页无数据,采集结束,院区:{}", outpPage, cid);
                                break;
                            }
                            log.info("【dealHisData】省立同德“门急诊”第{}页采集{}条,院区:{}", outpPage, outpResult.size(), cid);
                            if (outpResult.size() < OUTP_PAGE_SIZE) {
                                //设置一个缓存,用来存在下次的起始页
                                redisCache.setCacheObject("mzCurrent" + cid + mzCacheDate, outpPage, 24, TimeUnit.HOURS);
                                log.info("【dealHisData】省立同德“门急诊”的缓存key:{}下次的起始页{},院区:{}", "mzCurrent" + cid + mzCacheDate, outpPage, cid);
                                break;
                            }
                            outpPage++;
                        }
                        // 清除分页参数,避免影响后续出入院查询
                        serviceSLTDInhospReqVO.setCurrent(null);
                        serviceSLTDInhospReqVO.setSize(null);
                        log.info("【dealHisData】省立同德“门急诊”分页采集完成,院区:{}", cid);
                    }
                }
            } catch (Exception e) {
                log.error("【dealHisData】省立同德数据门急诊采集异常", e);
            }
        }
    }
    /**
     * 同德药品数据采集
     */
    public void dealHisDataMedication() {
        final long OUTP_PAGE_SIZE = 500L;
        ServiceSLTDInhospReqVO serviceSLTDInhospReqVO = new ServiceSLTDInhospReqVO();
        serviceSLTDInhospReqVO.setOrgId("20001001");
        Long outpPage = 1L;
        while (true) {
            serviceSLTDInhospReqVO.setCurrent(outpPage);
            serviceSLTDInhospReqVO.setSize(OUTP_PAGE_SIZE);
            log.info("【dealHisData】省立同德“药品数据”采集第{}页数据", outpPage);
           Boolean b = serviceSLTDHealthcareRecordService.queryMedicationItemList(serviceSLTDInhospReqVO);
            log.info("【dealHisData】省立同德“药品数据”采集结果:{}", b);
            outpPage++;
        }
    }
    public void dealHisDataSLTD() {
        log.info("【dealHisData】开始执行HIS数据采集任务");
@@ -390,7 +621,7 @@
                ServiceSLTDInhospReqVO serviceSLTDInhospReqVO = new ServiceSLTDInhospReqVO();
                serviceSLTDInhospReqVO.setOrgId("20001001");
                serviceSLTDInhospReqVO.setCampusId(30001002L);
                log.debug("【dealHisData】省立同德“门急诊”开始采集数据,院区:{}", "30001002");
                log.info("【dealHisData】省立同德“门急诊”开始采集数据,院区:{}", "30001002");
                serviceSLTDInhospReqVO.setStartHeadTime(null);
                serviceSLTDInhospReqVO.setStartTailTime(null);
                serviceSLTDInhospReqVO.setEncounterTimeStart(nowTime);
@@ -400,9 +631,9 @@
                list1.add("FH0108.01");
                list1.add("FH0108.03");
                serviceSLTDInhospReqVO.setHealthcareRecordTypeList(list1);
                log.debug("【dealHisData】省立同德“门急诊”采集数据入参:{}", serviceSLTDInhospReqVO);
                log.info("【dealHisData】省立同德“门急诊”采集数据入参:{}", serviceSLTDInhospReqVO);
                serviceSLTDHealthcareRecordService.queryHealthcareRecordList(serviceSLTDInhospReqVO);
                log.debug("【dealHisData】省立同德“门急诊”束采集数据,院区:{}", "30001002");
                log.info("【dealHisData】省立同德“门急诊”束采集数据,院区:{}", "30001002");
            }
        } catch (Exception e) {
            log.error("【dealHisData】省立同德数据采集异常", e);
@@ -471,6 +702,19 @@
    }
    /**
     * 门诊分表定时任务:从 sys_config 读取分表模式,按模式建表并刷新视图 v_pat_med_outhosp
     * 配置 key: outhosp.split.mode
     * quarter -> 按季度,表名示例:pat_med_outhosp_20260103
     * year    -> 按年,表名示例:pat_med_outhosp_2026
     * month   -> 按月,表名示例:pat_med_outhosp_202601
     * 查询不到配置则不分表
     */
    public void createOuthospQuarterTable() {
        log.info("【createOuthospQuarterTable】开始执行门诊分表任务");
        createDataTable.createOuthospQuarterTable();
    }
    /**
     * 处理患者信息,进入子任务表(微信小程序)
     */
    public void dealOutHospInfoXHC() {
@@ -483,7 +727,7 @@
    /**
     *  长期任务发送
     * 长期任务发送
     */
    public void longTaskSend() {
        //获取任务信息
@@ -502,12 +746,12 @@
            ServiceSubtaskEntity serviceSubtaskVO = new ServiceSubtaskEntity();
            serviceSubtaskVO.setTaskid(commonTaskcallMQ.getTaskid());
            serviceSubtaskVO.setSendstate(2L);
            serviceSubtaskVO.setIsVisitAgain(1);
            serviceSubtaskVO.setVisitTime(new Date());
            List<ServiceSubtask> selectServiceSubtaskList = serviceSubtaskMapper.queryServiceSubtaskList(serviceSubtaskVO);
            for (ServiceSubtask serviceSubtask : selectServiceSubtaskList) {
                sfHandlle(serviceSubtask);
            }
        }
    }
@@ -542,23 +786,114 @@
                //2判断一下,当前的sort是不是等于需要执行的总个数,如果等于的话,说明是最后一个,直接将servuce_subtask的状态改成5,执行失败就行了
                Long cs = currentSort.get();
                if (cs.equals(serviceSubtaskPreachforms.size())) {
                    serviceSubtask.setSendstate(5L);
                    serviceSubtask.setRemark("处理补偿任务,当前处理最后补偿,全部执行失败");
                    serviceSubtask.setSendstate(7L);
                    serviceSubtask.setRemark("处理补偿任务,当前处理最后补偿,全部执行失败(超时)");
                    serviceSubtaskMapper.updateServiceSubtask(serviceSubtask);
                    //修改发送方式的状态为失败
                    serviceSubtaskPreachform.setSendstate("5");
                    serviceSubtaskPreachform.setId(id.get());
                    serviceSubtaskPreachformMapper.updateServiceSubtaskPreachform(serviceSubtaskPreachform);
                    continue;
                }
                //3.不是最后一个,获取到下一个执行方式(因为都是在今天执行,那就直接发出去就完了)
                sfHandlle(serviceSubtask);
            }
        }
    }
    /**
     * 长期任务发送
     */
    public void longTaskSendTest(Long subId) {
        //获取任务信息
        ServiceTask st = new ServiceTask();
        st.setDelFlag("0");
        st.setLongTask(1);
        List<ServiceTask> serviceTasks = serviceTaskMapper.selectServiceTaskList(st);
        log.info("【longTaskSend】获取到{}个长期任务", serviceTasks.size());
        for (ServiceTask serviceTask : serviceTasks) {
            CommonTaskcallMQ commonTaskcallMQ = new CommonTaskcallMQ();
            commonTaskcallMQ.setTaskid(serviceTask.getTaskid());
            commonTaskcallMQ.setPreachform(serviceTask.getPreachform());
            commonTaskcallMQ.setSendType("2");
            //通过任务ID拿到患者信息,并且随访时间得是今天之前的
            ServiceSubtaskEntity serviceSubtaskVO = new ServiceSubtaskEntity();
            serviceSubtaskVO.setTaskid(commonTaskcallMQ.getTaskid());
            serviceSubtaskVO.setSendstate(2L);
            serviceSubtaskVO.setIsVisitAgain(1);
            serviceSubtaskVO.setSubId(subId);
            serviceSubtaskVO.setVisitTime(new Date());
            List<ServiceSubtask> selectServiceSubtaskList = serviceSubtaskMapper.queryServiceSubtaskList(serviceSubtaskVO);
            for (ServiceSubtask serviceSubtask : selectServiceSubtaskList) {
                sfHandlle(serviceSubtask);
            }
        }
    }
    /**
     * 处理补偿任务
     */
    public void compensateTaskTest(Long subId) {
        //获取到sendstate=3 并且 visit_time为小于等于今天的subtask
        ServiceSubtaskEntity serviceSubtaskVO = new ServiceSubtaskEntity();
        serviceSubtaskVO.setSendstate(3L);
        serviceSubtaskVO.setSubId(subId);
        serviceSubtaskVO.setVisitTime(new Date());
        List<ServiceSubtask> serviceSubtaskList = serviceSubtaskMapper.getCompensateServiceSubtaskList(serviceSubtaskVO);
        for (ServiceSubtask serviceSubtask : serviceSubtaskList) {
            //根据当前的执行方式,获取下一种执行方式
            ServiceSubtaskPreachform serviceSubtaskPreachform = new ServiceSubtaskPreachform();
            serviceSubtaskPreachform.setTaskid(serviceSubtask.getTaskid());
            serviceSubtaskPreachform.setSubid(serviceSubtask.getId());
            serviceSubtaskPreachform.setOrgid(serviceSubtask.getOrgid());
            List<ServiceSubtaskPreachform> serviceSubtaskPreachforms = serviceSubtaskPreachformMapper.selectServiceSubtaskPreachformList(serviceSubtaskPreachform);
            //获取当前执行方式的序号
            Optional<Long> currentSort = serviceSubtaskPreachforms.stream().filter(item -> serviceSubtask.getCurrentPreachform().equals(item.getPreachform())).map(ServiceSubtaskPreachform::getSort).findFirst();
            Optional<Long> id = serviceSubtaskPreachforms.stream().filter(item -> serviceSubtask.getCurrentPreachform().equals(item.getPreachform())).map(ServiceSubtaskPreachform::getId).findFirst();
            if (currentSort.isPresent()) {
                //1先检查一下,是不是有执行状态是完成的(怕之前已经有完的了,没有将servuce_subtask的状态改成功,这里再检查一下)
                boolean finishState = serviceSubtaskPreachforms.stream().allMatch(item -> item.getSendstate().equals("9"));
                if (finishState) {
                    serviceSubtask.setSendstate(6L);
                    serviceSubtaskMapper.updateServiceSubtask(serviceSubtask);
                    continue;
                }
                //2判断一下,当前的sort是不是等于需要执行的总个数,如果等于的话,说明是最后一个,直接将servuce_subtask的状态改成5,执行失败就行了
                Long cs = currentSort.get();
                if (cs.equals(serviceSubtaskPreachforms.size())) {
                    serviceSubtask.setSendstate(7L);
                    serviceSubtask.setRemark("处理补偿任务,当前处理最后补偿,全部执行失败(超时)");
                    serviceSubtaskMapper.updateServiceSubtask(serviceSubtask);
                    //修改发送方式的状态为失败
                    serviceSubtaskPreachform.setSendstate("5");
                    serviceSubtaskPreachform.setId(id.get());
                    serviceSubtaskPreachformMapper.updateServiceSubtaskPreachform(serviceSubtaskPreachform);
                    continue;
                }
                //3.不是最后一个,获取到下一个执行方式(因为都是在今天执行,那就直接发出去就完了)
                sfHandlle(serviceSubtask);
            }
        }
    }
    /**
     * 设置失败任务默认值,并将失败任务重新置为成功
     * <p>
     * *@param failDay   (失败天数:距离当前日期失败天数)
     *
     * @return
     */
    public void setFailSubTaskDefalutVal() {
        String failDay = configService.selectConfigByKey("hosp.default.fail.day");
        if (StringUtils.isNotEmpty(failDay)) iServiceSubtaskService.setFailSubTaskDefalutVal(Long.valueOf(failDay));
    }
@@ -568,7 +903,7 @@
     * @param date
     * @return
     */
    public boolean isDateToday(Date date) {
    private boolean isDateToday(Date date) {
        if (date == null) {
            return false;
        }
@@ -582,9 +917,10 @@
    /**
     * 随访-补偿处理
     *
     * @param serviceSubtask
     */
    public void sfHandlle(ServiceSubtask serviceSubtask) {
    private void sfHandlle(ServiceSubtask serviceSubtask) {
        //这里需要根据身份证去重(给微信小程序的固定任务用的)
        List<ServiceSubtask> serviceSubtaskListFilter = new ArrayList<>();
        ServiceTask ivrTask1 = serviceTaskMapper.selectServiceTaskByTaskid(serviceSubtask.getTaskid());
@@ -603,7 +939,8 @@
        if (!Objects.isNull(patArchive) && patArchive.getNotrequiredFlag() == "1") {
            //不需要发送
            serviceSubtask.setResult("患者不需要随访");
            serviceSubtask.setRemark(patArchive.getNotrequiredreason());
            serviceSubtask.setRemark(StringUtils.isNotEmpty(serviceSubtask.getRemark()) ? serviceSubtask.getRemark() + "," + "患者不需要随访," + patArchive.getNotrequiredreason() : "患者不需要随访," + patArchive.getNotrequiredreason());
            serviceSubtask.setSendstate(4L);
            iServiceSubtaskService.insertServiceSubtask(serviceSubtask);
            setSuccessPreachForm(serviceSubtask, "-1", "不需要执行", "6");
@@ -691,6 +1028,7 @@
                    serviceOutPath.setParam3(ivrTask1.getTaskName());
                    serviceOutPath.setParam6(subId);
                    serviceOutPath.setCreateTime(new Date());
                    serviceOutPath.setOrgid(serviceSubtask.getOrgid());
                    iServiceOutPathService.insertServiceOutPath(serviceOutPath);
                    String format = String.format("%03X", serviceOutPath.getId());
                    serviceOutPath.setRadix(format);
@@ -699,23 +1037,38 @@
                    //先判断一下发的是不是宣教
                    if (!"3".equals(serviceSubtask.getType())) {
                        sendMagParam.setPhone(serviceSubtask.getPhone());
                        sendMagParam.setUrl(localIP + ":" + req_path + "/wt?p=" + format);
                        sendMagParam.setUrl(StringUtils.isNotEmpty(req_path) ? localIP + ":" + req_path + "/wt?p=" + format : localIP + "/wt?p=" + format);
                        //如果type是语音随访的话(说明补偿发送方式中有电话随访的方式,这里的外链就地址只能用/sf)
                        if (serviceSubtask.getType().equals("1"))
                            sendMagParam.setUrl(localIP + ":" + req_path + "/sf?p=" + format);
                        sendMagParam.setContent("您好,邀请您填写出院调查表,请点击" + sendMagParam.getUrl() + "填写。感谢您配合!");
                        if (active.equals("xh")) {
                            sendMagParam.setContent("【新华医院】您好,邀请您填写出院调查表,请点击" + sendMagParam.getUrl() + "填写。感谢您配合!");
                            sendMagParam.setUrl(StringUtils.isNotEmpty(req_path) ? localIP + ":" + req_path + "/sf?p=" + format : localIP + "/sf?p=" + format);
//                        SysConfig sysConfig = sysConfigMapper.checkConfigKeyUnique("wj.sms.template");
                        SysConfig sysConfig = new SysConfig();
                        if (StringUtils.isNotEmpty(serviceSubtask.getServiceType()) && serviceSubtask.getServiceType().equals("6")) {
                            sysConfig = sysConfigMapper.checkConfigKeyUnique("zymyd.sms.template");
                        } else if (StringUtils.isNotEmpty(serviceSubtask.getServiceType()) && serviceSubtask.getServiceType().equals("14")) {
                            sysConfig = sysConfigMapper.checkConfigKeyUnique("mzmyd.sms.template");
                        } else {
                            sysConfig = sysConfigMapper.checkConfigKeyUnique("wj.sms.template");
                        }
                        if (!Objects.isNull(sysConfig)) {
                            String smsContemt = sysConfig.getConfigValue();
//                            sendMagParam.setContent("您好,邀请您填写出院调查表,请点击" + sendMagParam.getUrl() + "填写。感谢您配合!");
                            sendMagParam.setContent(smsContemt.replace("${wjurl}", sendMagParam.getUrl()));
                        }
                    } else {
                        HeLibrary heLibrary = heLibraryMapper.selectHeLibraryById(serviceSubtask.getLibtemplateid());
                        if (heLibrary.getHetype().equals("1")) {
                            sendMagParam.setPhone(serviceSubtask.getPhone());
                            sendMagParam.setUrl(localIP + ":" + req_path + "/xj?p=" + format);
                            if (active.equals("ls") || active.equals("sltd")) {
                                sendMagParam.setContent("您好,邀请您填写出院宣教调查表,请点击" + sendMagParam.getUrl() + "查看。感谢您配合!");
                            } else if (active.equals("xh")) {
                                sendMagParam.setContent("【新华医院】您好,邀请您填写出院宣教调查表,请点击" + sendMagParam.getUrl() + "查看。感谢您配合!");
                            sendMagParam.setUrl(StringUtils.isNotEmpty(req_path) ? localIP + ":" + req_path + "/xj?p=" + format : localIP + "/xj?p=" + format);
                            SysConfig sysConfig = sysConfigMapper.checkConfigKeyUnique("xj.sms.template");
                            if (!Objects.isNull(sysConfig)) {
                                String smsContemt = sysConfig.getConfigValue();
//                              sendMagParam.setContent("您好,邀请您填写出院宣教调查表,请点击" + sendMagParam.getUrl() + "查看。感谢您配合!");
                                sendMagParam.setContent(smsContemt.replace("${xjurl}", sendMagParam.getUrl()));
                            }
                        } else if (heLibrary.getHetype().equals("2")) {
                            //通知
@@ -730,9 +1083,29 @@
                    log.info("active的值为:{}", active);
                    if (active.equals("xh")) {
                        Map<String, String> req = new HashMap<>();
                        req.put("phone", sendMagParam.getPhone());
                        req.put("content", sendMagParam.getContent());
                        isSuccess = HttpUtil.postJsonRequest(xhsmsPath, new Gson().toJson(req));
//                        req.put("phone", sendMagParam.getPhone());
//                        req.put("content", sendMagParam.getContent());
                        Map<String, String> map2 = new HashMap<String, String>();
                        map2.put("action", "send");
                        map2.put("account", xhsmsAccount);
                        map2.put("password", xhsmsPwd);
                        map2.put("mobile", sendMagParam.getPhone());
                        map2.put("content", sendMagParam.getContent());
                        map2.put("extno", xhsmsjrm);
                        map2.put("rt", "json");
                        StringBuilder encodedParams = new StringBuilder();
                        for (Map.Entry<String, String> entry : map2.entrySet()) {
                            if (encodedParams.length() > 0) {
                                encodedParams.append("&");
                            }
                            // 对键和值进行URL编码
                            String encodedKey = URLEncoder.encode(entry.getKey(), "UTF-8");
                            String encodedValue = URLEncoder.encode(entry.getValue(), "UTF-8");
                            encodedParams.append(encodedKey).append("=").append(encodedValue);
                        }
                        Boolean result = HttpUtils.sendPost(xhsmsPath, new Gson().toJson(req));
                        if (result) isSuccess = "true";
                    } else if (active.equals("ls")) {
//                        String url = configService.selectConfigByKey("token.360", serviceSubtask.getOrgid());
//                        //丽水的短信发送方式
@@ -764,30 +1137,62 @@
                        if (code.equals("0")) {
                            isSuccess = "true";
                        }
                    } else if (active.equals("sltd")) {
                    } else if (active.equals("sltd") || active.equals("nhfy")) {
                        log.info("sltd进来了吗?{}   ,---sendMagParam.getContent()的参数为:{}", active, sendMagParam.getContent());
                        //省立同德的短信发送方式
                        String data = MessageSend.sendMsg(sendMagParam.getContent(), "6", sendMagParam.getPhone(), LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss")));
                        if (StringUtils.isNotEmpty(data)) {
                            ObjectMapper mapper = new ObjectMapper();
                            JsonNode root = mapper.readTree(data);
                            String status = root.get("result").get(0).get("status").asText();
                            if (status.equals("00000")) {
                        if (active.equals("sltd")) {
                            //省立同德的短信发送方式
                            String data = MessageSend.sendMsg(sendMagParam.getContent(), "6", sendMagParam.getPhone(), LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss")));
                            if (StringUtils.isNotEmpty(data)) {
                                ObjectMapper mapper = new ObjectMapper();
                                JsonNode root = mapper.readTree(data);
                                String status = root.get("result").get(0).get("status").asText();
                                if (status.equals("00000")) {
                                    isSuccess = "true";
                                }
                            }
                        } else if (active.equals("nhfy")) {
                            Map<String, Object> smsResult = mtSubmitSmUtil.submitSm(sendMagParam.getPhone(), sendMagParam.getContent());
                            if (smsResult != null && smsResult.get("result") != null && smsResult.get("result").toString().equals("0")) {
                                isSuccess = "true";
                            }
                        }
                    } else if (active.equals("hzszlyy")) {//市一医院
                        String content = sendMagParam.getContent().replace("【新华医院】", "");
                        String result = smsUtils.sendSms(xhsmsPath, xhsmsAccount, xhsmsPwd, sendMagParam.getPhone(), content);
                        //这里需要根据result返回的值去判断,是否成功,然后将值赋值给isSuccess
                        if (StringUtils.isNotEmpty(result) && result.contains("处理成功")) {
                            isSuccess = "true";
                        }
                        SysDept sysDeptVo = new SysDept();
                        List<SysDept> sysDepts = new ArrayList<>();
                        if (ObjectUtils.isNotEmpty(serviceSubtask.getDeptcode())) {
                            sysDeptVo.setDeptType("1");
                            sysDeptVo.setOrgid(serviceSubtask.getOrgid());
                            sysDeptVo.setDeptCode(serviceSubtask.getDeptcode());
                            sysDeptService.selectDeptList(sysDeptVo);
                        } else if (ObjectUtils.isNotEmpty(serviceSubtask.getLeavehospitaldistrictcode())) {
                            sysDeptVo.setDeptType("2");
                            sysDeptVo.setOrgid(serviceSubtask.getOrgid());
                            sysDeptVo.setDeptCode(serviceSubtask.getLeavehospitaldistrictcode());
                            sysDeptService.selectDeptList(sysDeptVo);
                        }
                        SysDept sysDept = CollectionUtils.isNotEmpty(sysDepts) ? sysDepts.get(0) : new SysDept();
                        String campusid = ObjectUtils.isNotEmpty(sysDept) ? sysDept.getCampusid() : "2";
                        //湖滨单独发送方式
                        if ("1".equals(campusid)) {
                            String result = smsUtils.sendSms1(xhsmsPath, xhsmsAccount, xhsmsPwd, sendMagParam.getPhone(), content);
                            //这里需要根据result返回的值去判断,是否成功,然后将值赋值给isSuccess
                            if (StringUtils.isNotEmpty(result) && result.contains("处理成功")) {
                                isSuccess = "true";
                            }
                        } else {
                            String result = smsUtils.sendSms(xhsmsPath, xhsmsAccount, xhsmsPwd, sendMagParam.getPhone(), content);
                            //这里需要根据result返回的值去判断,是否成功,然后将值赋值给isSuccess
                            if (StringUtils.isNotEmpty(result) && result.contains("处理成功")) {
                                isSuccess = "true";
                            }
                        }
                    }
                    //任务发送记录
                    ServiceSubtaskRecord serviceSubtaskRecord = new ServiceSubtaskRecord();
                    serviceSubtaskRecord.setTaskid(serviceSubtask.getTaskid().toString());
                    serviceSubtaskRecord.setSubtaskId(serviceSubtask.getId());
                    serviceSubtaskRecord.setUuid(UUID.randomUUID().toString());
                    serviceSubtaskRecord.setTasktype(serviceSubtask.getType());
                    serviceSubtaskRecord.setPreachform("4");
@@ -801,11 +1206,11 @@
                    serviceSubtask.setSendstate(3L);
                    if (StringUtils.isNotEmpty(isSuccess) && isSuccess.equals("true")) {
                        serviceSubtask.setResult("success");
                        serviceSubtask.setRemark(serviceSubtask.getRemark() + "," + "短信发送成功");
                        serviceSubtask.setRemark(StringUtils.isNotEmpty(serviceSubtask.getRemark()) ? serviceSubtask.getRemark() + ",短信发送成功" : "短信发送成功");
                        setSuccessPreachForm(serviceSubtask, sendPreachform, "短信发送成功", "2");
                    } else {
                        serviceSubtask.setResult("error");
                        serviceSubtask.setRemark(serviceSubtask.getRemark() + "," + "短信发送失败" + now);
                        serviceSubtask.setRemark(StringUtils.isNotEmpty(serviceSubtask.getRemark()) ? serviceSubtask.getRemark() + ",短信发送失败" + now : "短信发送失败" + now);
                        setSuccessPreachForm(serviceSubtask, sendPreachform, "短信发送失败" + now, "5");
                    }
                } catch (Exception e) {
@@ -824,8 +1229,26 @@
            if (dateToday) {
                try {
                    String patid = rsaPublicKeyExample.encryptedData(serviceSubtask.getPatid().toString(), pub_key);
                    String subId = rsaPublicKeyExample.encryptedData(serviceSubtask.getId().toString(), pub_key);
                    String url = null;
                    url = localIP + ":" + req_path + "/outsideChainwt?param1=" + taskId + "&param2=" + patid + "&param3=" + URLEncoder.encode(ivrTask1.getTaskName(), StandardCharsets.UTF_8.toString()) + "&param5=false";
                    url = localIP + ":" + req_path + "/outsideChainwt?param1=" + taskId +
                            "&param2=" +  patid +
                            "&param3=" + URLEncoder.encode(ivrTask1.getTaskName(), StandardCharsets.UTF_8.toString()) +
                            "&param5=false" +
                            "$param6=" + subId;
                    ServiceOutPath serviceOutPath = new ServiceOutPath();
                    serviceOutPath.setParam1(taskId);
                    serviceOutPath.setParam2(patid);
                    serviceOutPath.setParam3(ivrTask1.getTaskName());
                    serviceOutPath.setParam6(subId);
                    serviceOutPath.setCreateTime(new Date());
                    serviceOutPath.setOrgid(serviceSubtask.getOrgid());
                    iServiceOutPathService.insertServiceOutPath(serviceOutPath);
                    String format = String.format("%03X", serviceOutPath.getId());
                    serviceOutPath.setRadix(format);
                    serviceOutPath.setUpdateTime(new Date());
                    iServiceOutPathService.updateServiceOutPath(serviceOutPath);
                    //获取微信公众号请求信息根据机构ID
                    List<String> wxqqxx = WxGZHEnum.getDescByCode(patArchive.getOrgid());
@@ -844,23 +1267,7 @@
                    //市一医院
                    if (active.equals("hzszlyy")) {
                        //处理中文乱码问题
                        /**String title = URLEncoder.encode("您好,邀请您填写出院调查表,请点击填写。", StandardCharsets.UTF_8.toString());
                         String content = URLEncoder.encode("您好,邀请您填写出院调查表,请点击填写。", StandardCharsets.UTF_8.toString());
                         String encodedUrl = URLEncoder.encode(url, StandardCharsets.UTF_8.toString());
                         String urlTemp = "http://192.200.54.14:5003/sfjk/SendMessage?sfzh=" + serviceSubtask.getSfzh() +
                         "&title=" + title +
                         "&content=" + content +
                         "&phone=" + patArchive.getTelcode() +
                         "&url=" + encodedUrl +
                         "&key=ff76f8904f5f32b5ee1739e8ea46e60g";
                         //                        HttpUtils.sendGet(urlTemp);
                         String sendMsg = "";
                         sendMsg = HttpUtils.sendPost(urlTemp);
                         log.info(sendMsg); **/
                        wxCode = smsUtils.sendChat(url, patArchive.getTelcode(), serviceSubtask.getSfzh());
                        log.info(wxCode);
                    } else {
                        wxCode = getWXCode(serviceSubtask.getSfzh(), url, serviceSubtask.getTaskName(), serviceSubtask.getTaskDesc(), patArchive.getTelcode(), serviceSubtask.getSendname(), patArchive.getPatidHis(), wxqqxx);
                    }
@@ -877,7 +1284,12 @@
                    Boolean wxCodeSuccess = false;
                    if (active.equals("hzszlyy")) {
                        if (!map.isEmpty() && map.get("success") != null) {
                            wxCodeSuccess = (boolean) map.get("success");
                            Integer wxCodeSuccessShiyi = (Integer) map.get("success");
                            if (ObjectUtils.isNotEmpty(wxCodeSuccessShiyi) && wxCodeSuccessShiyi == 1) {
                                wxCodeSuccess = true;
                            } else {
                                wxCodeSuccess = false;
                            }
                        }
                    } else {
                        if (!map.isEmpty() && map.get("succ") != null) {
@@ -903,7 +1315,7 @@
                }
            }
        } else if (descByCode.equals("人工")) {
            setSuccessPreachForm(serviceSubtask, sendPreachform, "人工待执行", "2");
            setSuccessPreachForm(serviceSubtask, sendPreachform, "人工发送成功", "2");
        }
    }
@@ -969,8 +1381,10 @@
            if (currentSort.get().equals((long) serviceSubtaskPreachforms.size())) {
                if (allSendStateNot1AndNot9) {
                    //说明全发送失败了
                    serviceSubtask.setSendstate(5L);
                    serviceSubtask.setSendstate(7L);
                    serviceSubtask.setFinishtime(null);
                    log.error("getSendPreachform方法 检查是否所有sendstate不等于9, 全失败了");
                    serviceSubtask.setRemark(StringUtils.isNotEmpty(serviceSubtask.getRemark()) ? serviceSubtask.getRemark() + "," + "所有发送方式均未获取结果,任务失败(超时)" : "所有发送方式均未获取结果,任务失败(超时)");
                    serviceSubtaskMapper.updateServiceSubtask(serviceSubtask);
                    //修改发送状态
                    setFail(serviceSubtaskPreachforms, serviceSubtask);
@@ -981,7 +1395,6 @@
            // 当sort等于列表size时,下一个sort为-1
            Long nextSort = currentSort.get() + 1;
            //如果当前的发送方式不为空,并且开始准备要用下一种方式发送了,那当前的肯定没有发送成功,需要设置失败
            // (这里主要是,人工如果没有随访,然后到公众号的时候,就不会再去管人工是否成功,人工的状态会一直卡在2的状态上)
            if (StringUtils.isNotEmpty(serviceSubtask.getCurrentPreachform())) {
                setFail(serviceSubtaskPreachforms, serviceSubtask);
            }
@@ -989,33 +1402,14 @@
            // 找到下一个sort对应的preachform
            String nextPreachform = serviceSubtaskPreachforms.stream().filter(item -> nextSort.equals(item.getSort())).map(ServiceSubtaskPreachform::getPreachform).findFirst().orElse("-1");
            String orgid = serviceSubtask.getOrgid();
            //微信已发送、已领取跳过短信发送,进行人工 -丽水中医院
            if (StringUtils.isNotEmpty(orgid) && orgid.equals("47231022633110211A2101")) {
                //获取当前发送方式
                ServiceSubtaskPreachform currentServiceSubtaskPreachform = serviceSubtaskPreachforms.stream().filter(item -> item.getSort().equals(currentSort.get())).findFirst().orElse(new ServiceSubtaskPreachform());
                //当前发送方式为微信的,且下一发送方式为短信的,微信发送状态为已发送、已领取的,跳过短信步骤
                if (currentServiceSubtaskPreachform.getPreachform().equals("5") && (currentServiceSubtaskPreachform.getSendstate().equals("2") || currentServiceSubtaskPreachform.getSendstate().equals("3"))) {
                    if (StringUtils.isNotEmpty(nextPreachform) && nextPreachform.equals("2")) {
                        log.error("【sfHandlle】微信已发送,短信不发送,跳转人工");
                        setSuccessPreachForm(serviceSubtask, "-1", "微信已发送,短信不发送,跳转人工", "6");
                        //跳过短信,执行下一步
                        Long newNextSort = nextSort + 1;
                        //找到短信再下一个sort对应的preachform
                        nextPreachform = serviceSubtaskPreachforms.stream().filter(item -> newNextSort.equals(item.getSort())).map(ServiceSubtaskPreachform::getPreachform).findFirst().orElse("-1");
                    }
                }
            }
            //更新一下当前发送时间
            if (StringUtils.isNotEmpty(nextPreachform)) {
                serviceSubtaskPreachform.setCurrentSendTime(new Date());
                serviceSubtaskPreachform.setPreachform(nextPreachform);
                serviceSubtaskPreachformMapper.updateSSPByCondition(serviceSubtaskPreachform);
            }
            return nextPreachform;
        }
        return null;
    }
@@ -1054,11 +1448,11 @@
            ServiceSubtaskPreachform subtaskPreachform = new ServiceSubtaskPreachform();
            subtaskPreachform.setSendstate("5");
            subtaskPreachform.setId(id.get());
            subtaskPreachform.setRemark("当前发送方式在规定时间内未成功获取结果");
            return serviceSubtaskPreachformMapper.updateServiceSubtaskPreachform(subtaskPreachform);
        }
        return 0;
    }
    private String getDXCode(String address, String ShouJiHM, String FaSongNR, String FaSongRID, String FaSongRXM, Map<String, Object> headerMap, String token) {
        Map<String, Object> map = new LinkedHashMap<>();
@@ -1108,7 +1502,7 @@
        Map<String, String> headerMap = new HashMap<>();
        headerMap.put("sign", encode);
        String result = HttpUtils.sendPostByHeader(wxqqxx.get(3), body, headerMap);
        log.info("【getWXCode】微信公众号返回参数:{}", result);
        JSONObject jsonObject = JSONObject.parseObject(result);
        String code = (String) jsonObject.toString();
        return code;
@@ -1165,9 +1559,9 @@
        //电话的未发送状态,需要查2,因为,数据可能卡在队列里了; (没进队列,电话状态还是1)
        if (preachform.equals("3") && StringUtils.isNotEmpty(failSendstate) && Long.valueOf(failSendstate) > 2)
            serviceSubtaskPreachform.setSendstate("2");
        //人工的未发送状态,需要查2
        if (preachform.equals("1") && StringUtils.isNotEmpty(failSendstate) && Long.valueOf(failSendstate) > 2)
            serviceSubtaskPreachform.setSendstate("2");
//        //人工的未发送状态,需要查2
//        if (preachform.equals("1") && StringUtils.isNotEmpty(failSendstate) && Long.valueOf(failSendstate) > 2)
//            serviceSubtaskPreachform.setSendstate("2");
        List<ServiceSubtaskPreachform> serviceSubtaskPreachforms = serviceSubtaskPreachformMapper.selectServiceSubtaskPreachformList(serviceSubtaskPreachform);
        if (CollectionUtils.isNotEmpty(serviceSubtaskPreachforms)) {
@@ -1180,12 +1574,14 @@
            serviceSubtaskPreachform1.setRemark(remark);
            serviceSubtaskPreachformMapper.updateServiceSubtaskPreachform(serviceSubtaskPreachform1);
            //如果当前的preachform已经是最后一个了,那直接将serviceSubtask的sendstate状态改成5就行了(全失败了)
            //如果当前的preachform已经是最后一个了,那直接将serviceSubtask的sendstate状态改成7就行了(全超时了)
            if (serviceSubtaskPreachform1.getSort() == sspCount.size()) {
                if (failSendstate.equals("4") || failSendstate.equals("5")) {
                    serviceSubtask.setCurrentPreachform(preachform);
                    serviceSubtask.setSendstate(5L);
                    serviceSubtask.setRemark("setSuccessPreachForm方法,当前的preachform已经是最后一个了,全部执行失败");
                    serviceSubtask.setSendstate(7L);
                    log.error("setSuccessPreachForm方法,当前的preachform已经是最后一个了,全部执行失败");
                    serviceSubtask.setRemark(StringUtils.isNotEmpty(serviceSubtask.getRemark()) ? serviceSubtask.getRemark() + "," + "所有发送方式均未获取结果,任务失败(超时)" : "所有发送方式均未获取结果,任务失败(超时)");
                    //serviceSubtask.setRemark("setSuccessPreachForm方法,当前的preachform已经是最后一个了,全部执行失败");
                    serviceSubtaskMapper.updateServiceSubtask(serviceSubtask);
                    return true;
                }
@@ -1194,16 +1590,19 @@
            log.error("【定时任务中该患者没有查询到属于他的发送方式,subid:{},prechform:{},orgid:{}】", serviceSubtask.getId(), preachform, serviceSubtask.getOrgid());
            return false;
        }
        //将下一次的随访时间与当前执行方式记录一下
        serviceSubtask.setVisitTime(getNextVisitTime(serviceSubtask.getId(), serviceSubtask.getTaskid(), serviceSubtask.getVisitTime()));
        serviceSubtask.setCurrentPreachform(preachform);
        serviceSubtask.setSendstate(3L);
        if (serviceSubtask.getType().equals("3") || serviceSubtask.getType().equals("4")) {
            //如果是宣教或通知,并且发送成功,则直接将serviceSubtask状态改成6L(这个患者是没有题做的,不会再触发接口进行状态修改)
            if (failSendstate.equals("2")) {
                serviceSubtask.setSendstate(6L);
            }
        }
        serviceSubtask.setRemark(StringUtils.isNotEmpty(serviceSubtask.getRemark()) ? serviceSubtask.getRemark() + "," + remark : remark);
        serviceSubtaskMapper.updateServiceSubtask(serviceSubtask);
        return true;
    }
@@ -1250,4 +1649,8 @@
        return serviceTaskMap;
    }
    public int qwenLLMTest(String questionText, String voiceText, String value, String regexText) {
        int result = QwenLLMUtil.matchRegex(questionText, voiceText, value, regexText);
        return result;
    }
}