liusheng
2025-09-29 55f5271f893a25a7be671b24938e49976936a67b
新增Orgid
已修改79个文件
已删除1个文件
已添加4个文件
5007 ■■■■■ 文件已修改
.idea/encodings.xml 30 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
.idea/jarRepositories.xml 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/pom.xml 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/component/RedisMqReceiver.java 1004 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/controller/common/CommonController.java 35 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/controller/common/SmsController.java 20 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/controller/smartor/BaseDictOperationController.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/controller/smartor/PatArchiveController.java 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/controller/smartor/ServiceExternalController.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/controller/smartor/ServiceSLTDHealthcareRecordController.java 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/controller/smartor/ServiceSubtaskAnswerController.java 31 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/controller/smartor/ServiceSubtaskController.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/controller/smartor/ServiceTaskController.java 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysLoginController.java 70 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysRoleController.java 5 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysUserController.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/test/MQTest.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/resources/application-druid.yml 42 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/resources/application-sltd.yml 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/resources/application.yml 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/resources/mybatis/mybatis-config.xml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/src/main/java/com/ruoyi/common/core/controller/BaseController.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/src/main/java/com/ruoyi/common/core/redis/RedisCache.java 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/src/main/java/com/ruoyi/common/enums/ServiceFromEnum.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/src/main/java/com/ruoyi/common/enums/VisitSendStateEnum.java 57 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/src/main/java/com/ruoyi/common/utils/HttpUtil.java 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/src/main/java/com/ruoyi/common/utils/PageUtils.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-framework/src/main/java/com/ruoyi/framework/config/SecurityConfig.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-framework/src/main/java/com/ruoyi/framework/interceptor/HospitalFilterInterceptor.java 44 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/SysLoginService.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-quartz/pom.xml 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-quartz/src/main/java/com/ruoyi/quartz/service/impl/CollectHISServiceImpl.java 96 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/RyTask.java 862 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/service/ISysConfigService.java 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SmsRecordsServiceImpl.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysConfigServiceImpl.java 51 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysUserServiceImpl.java 73 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/resources/mapper/system/SysConfigMapper.xml 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/resources/mapper/system/SysDeptMapper.xml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/resources/mapper/system/SysRoleMapper.xml 288 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/resources/mapper/system/SysUserMapper.xml 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/common/LSHospTokenUtil.java 15 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/domain/IvrLibaTargetVO.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/domain/IvrTaskTemplateScriptVO.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/domain/PatArchiveReq.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/domain/PatMedInhospVO.java 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/domain/PatMedOuthosp.java 9 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/domain/PatTaskRelevance.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/domain/ServiceSLTDDeptReqVO.java 48 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/domain/ServiceSLTDInhospReqVO.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/domain/ServiceSubTaskMYDAnswerReq.java 30 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/domain/ServiceSubtask.java 15 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/domain/ServiceSubtaskDetail.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/domain/ServiceSubtaskPreachform.java 89 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/domain/ServiceSubtaskVO.java 11 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/domain/ServiceTask.java 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/domain/ServiceTaskScriptQues.java 23 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/domain/ServiceTaskVO.java 19 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/domain/SvyTaskAnswer.java 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/domain/SvyTaskTemplateScriptVO.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/mapper/ServiceSubtaskMapper.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/mapper/ServiceSubtaskPreachformMapper.java 73 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/mapper/SysDept2Mapper.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/service/IHNGatherPatArchiveService.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/service/IServiceSLTDHealthcareRecordService.java 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/service/IServiceSubtaskAnswerService.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/service/IServiceTaskService.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/service/impl/CommonTaskServiceImpl.java 40 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/service/impl/HNGatherPatArchiveServiceImpl.java 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/service/impl/PatMedInhospServiceImpl.java 55 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/service/impl/ServiceSLTDHealthcareRecordServiceImpl.java 319 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/service/impl/ServiceSubtaskAnswerServiceImpl.java 254 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/service/impl/ServiceSubtaskServiceImpl.java 546 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/service/impl/ServiceTaskServiceImpl.java 158 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/service/impl/ServiceTelInfoServiceImpl.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/service/impl/SvyTaskSingleServiceImpl.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/resources/mapper/smartor/HNGatherPatArchiveMapper.xml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/resources/mapper/smartor/PatArchiveMapper.xml 28 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/resources/mapper/smartor/PatMedInhospMapper.xml 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/resources/mapper/smartor/PatMedOuthospMapper.xml 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/resources/mapper/smartor/ServiceSubtaskDetailMapper.xml 4 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/resources/mapper/smartor/ServiceSubtaskMapper.xml 175 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/resources/mapper/smartor/SysDeptMapper.xml 37 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/resources/mapper/smartor/SysUserDeptMapper.xml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
.idea/encodings.xml
@@ -2,8 +2,30 @@
<project version="4">
  <component name="Encoding">
    <file url="file://$PROJECT_DIR$/ruoyi-admin/src/main/java" charset="UTF-8" />
    <file url="file://$PROJECT_DIR$/ruoyi-admin/src/main/java/com/ruoyi/web/controller/smartor/ServiceSubtaskPreachformController.java" charset="UTF-8" />
    <file url="file://$PROJECT_DIR$/ruoyi-admin/src/main/resources" charset="UTF-8" />
    <file url="file://$PROJECT_DIR$/ruoyi-common/src/main/java" charset="UTF-8" />
    <file url="file://$PROJECT_DIR$/ruoyi-common/src/main/java/com/ruoyi/common/dx/Hello.java" charset="UTF-8" />
    <file url="file://$PROJECT_DIR$/ruoyi-common/src/main/java/com/ruoyi/common/dx/HelloResponse.java" charset="UTF-8" />
    <file url="file://$PROJECT_DIR$/ruoyi-common/src/main/java/com/ruoyi/common/dx/I5GReply.java" charset="UTF-8" />
    <file url="file://$PROJECT_DIR$/ruoyi-common/src/main/java/com/ruoyi/common/dx/I5GReplyResponse.java" charset="UTF-8" />
    <file url="file://$PROJECT_DIR$/ruoyi-common/src/main/java/com/ruoyi/common/dx/I5GReport.java" charset="UTF-8" />
    <file url="file://$PROJECT_DIR$/ruoyi-common/src/main/java/com/ruoyi/common/dx/I5GReportResponse.java" charset="UTF-8" />
    <file url="file://$PROJECT_DIR$/ruoyi-common/src/main/java/com/ruoyi/common/dx/I5GSearchNumber.java" charset="UTF-8" />
    <file url="file://$PROJECT_DIR$/ruoyi-common/src/main/java/com/ruoyi/common/dx/I5GSearchNumberResponse.java" charset="UTF-8" />
    <file url="file://$PROJECT_DIR$/ruoyi-common/src/main/java/com/ruoyi/common/dx/I5GSend.java" charset="UTF-8" />
    <file url="file://$PROJECT_DIR$/ruoyi-common/src/main/java/com/ruoyi/common/dx/I5GSendResponse.java" charset="UTF-8" />
    <file url="file://$PROJECT_DIR$/ruoyi-common/src/main/java/com/ruoyi/common/dx/SMSGetNumberResponse.java" charset="UTF-8" />
    <file url="file://$PROJECT_DIR$/ruoyi-common/src/main/java/com/ruoyi/common/dx/SMSGetTemplateList.java" charset="UTF-8" />
    <file url="file://$PROJECT_DIR$/ruoyi-common/src/main/java/com/ruoyi/common/dx/SMSGetUserList.java" charset="UTF-8" />
    <file url="file://$PROJECT_DIR$/ruoyi-common/src/main/java/com/ruoyi/common/dx/SMSGetUserListResponse.java" charset="UTF-8" />
    <file url="file://$PROJECT_DIR$/ruoyi-common/src/main/java/com/ruoyi/common/dx/SMSSaveContent.java" charset="UTF-8" />
    <file url="file://$PROJECT_DIR$/ruoyi-common/src/main/java/com/ruoyi/common/dx/SMSSaveContentResponse.java" charset="UTF-8" />
    <file url="file://$PROJECT_DIR$/ruoyi-common/src/main/java/com/ruoyi/common/dx/SMSVerify.java" charset="UTF-8" />
    <file url="file://$PROJECT_DIR$/ruoyi-common/src/main/java/com/ruoyi/common/dx/SMSVerifyPrivate.java" charset="UTF-8" />
    <file url="file://$PROJECT_DIR$/ruoyi-common/src/main/java/com/ruoyi/common/dx/SMSVerifyPrivateResponse.java" charset="UTF-8" />
    <file url="file://$PROJECT_DIR$/ruoyi-common/src/main/java/com/ruoyi/common/dx/SMSVerifyResponse.java" charset="UTF-8" />
    <file url="file://$PROJECT_DIR$/ruoyi-common/src/main/java/com/ruoyi/common/dx/SmsServiceSoap.java" charset="UTF-8" />
    <file url="file://$PROJECT_DIR$/ruoyi-common/src/main/resources" charset="UTF-8" />
    <file url="file://$PROJECT_DIR$/ruoyi-framework/src/main/java" charset="UTF-8" />
    <file url="file://$PROJECT_DIR$/ruoyi-framework/src/main/resources" charset="UTF-8" />
@@ -14,8 +36,14 @@
    <file url="file://$PROJECT_DIR$/ruoyi-system/src/main/java" charset="UTF-8" />
    <file url="file://$PROJECT_DIR$/ruoyi-system/src/main/resources" charset="UTF-8" />
    <file url="file://$PROJECT_DIR$/smartor/src/main/java" charset="UTF-8" />
    <file url="file://$PROJECT_DIR$/smartor/src/main/java/com/smartor/domain/ServiceSubtaskPreachform.java" charset="UTF-8" />
    <file url="file://$PROJECT_DIR$/smartor/src/main/java/com/smartor/mapper/ServiceSubtaskPreachformMapper.java" charset="UTF-8" />
    <file url="file://$PROJECT_DIR$/smartor/src/main/java/com/smartor/service/IServiceSubtaskPreachformService.java" charset="UTF-8" />
    <file url="file://$PROJECT_DIR$/smartor/src/main/java/com/smartor/service/impl/ServiceSubtaskPreachformServiceImpl.java" charset="UTF-8" />
    <file url="file://$PROJECT_DIR$/smartor/src/main/resources" charset="UTF-8" />
    <file url="file://$PROJECT_DIR$/smartor/src/main/resources/mapper/smartor/ServiceSubtaskPreachformMapper.xml" charset="UTF-8" />
    <file url="file://$PROJECT_DIR$/src/main/java" charset="UTF-8" />
    <file url="file://$PROJECT_DIR$/src/main/resources" charset="UTF-8" />
    <file url="PROJECT" charset="GBK" />
  </component>
</project>
</project>
.idea/jarRepositories.xml
@@ -49,12 +49,12 @@
    <remote-repository>
      <option name="id" value="central" />
      <option name="name" value="central" />
      <option name="url" value="http://maven.aliyun.com/nexus/content/groups/public/" />
      <option name="url" value="http://repo2.maven.org/maven2/" />
    </remote-repository>
    <remote-repository>
      <option name="id" value="central" />
      <option name="name" value="central" />
      <option name="url" value="http://repo2.maven.org/maven2/" />
      <option name="url" value="http://maven.aliyun.com/nexus/content/groups/public/" />
    </remote-repository>
    <remote-repository>
      <option name="id" value="jcenter" />
@@ -97,4 +97,4 @@
      <option name="url" value="https://repository.jboss.org/nexus/content/repositories/public/" />
    </remote-repository>
  </component>
</project>
</project>
ruoyi-admin/pom.xml
@@ -166,6 +166,11 @@
            <version>5.1.0</version>
        </dependency>
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-compress</artifactId>
            <version>1.21</version>
        </dependency>
        <dependency>
            <groupId>cn.easyproject</groupId>
            <artifactId>orai18n</artifactId>
            <version>12.1.0.2.0</version>
ruoyi-admin/src/main/java/com/ruoyi/web/component/RedisMqReceiver.java
@@ -5,6 +5,7 @@
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
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;
@@ -17,10 +18,7 @@
import com.ruoyi.system.service.ISysConfigService;
import com.smartor.common.LSHospTokenUtil;
import com.smartor.domain.*;
import com.smartor.mapper.HeLibraryMapper;
import com.smartor.mapper.PatArchiveMapper;
import com.smartor.mapper.ServiceSubtaskMapper;
import com.smartor.mapper.ServiceTaskMapper;
import com.smartor.mapper.*;
import com.smartor.service.IBaseSmsaccountService;
import com.smartor.service.IServiceOutPathService;
import com.smartor.service.IServiceSubtaskRecordService;
@@ -36,6 +34,8 @@
import java.io.IOException;
import java.security.MessageDigest;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.*;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
@@ -65,6 +65,7 @@
    @Autowired
    private ServiceSubtaskMapper ivrTaskcallMapper;
    @Autowired
    private HeLibraryMapper heLibraryMapper;
@@ -84,13 +85,13 @@
    private ServiceSubtaskMapper serviceSubtaskMapper;
    @Autowired
    private ServiceSubtaskPreachformMapper serviceSubtaskPreachformMapper;
    @Autowired
    private IServiceSubtaskRecordService serviceSubtaskRecordService;
    @Autowired
    IBaseSmsaccountService baseSmsaccountService;
    @Autowired
    private ISysConfigService configService;
    @Value("${xhsmsPath}")
    private String xhsmsPath;
@@ -100,6 +101,9 @@
    @Value("${server.port}")
    private String port;
    @Autowired
    private ISysConfigService configService;
    // åˆ›å»ºå›ºå®šå¤§å°çš„线程池
    private static final ExecutorService executorService = Executors.newFixedThreadPool(10);
@@ -166,536 +170,572 @@
        //判断一下commonTaskcallMQ中的stopstate是否与ivr_task中的一致,不一致,则说明是暂停了
        ServiceTask ivrTask1 = ivrTaskMapper.selectServiceTaskByTaskid(commonTaskcallMQ.getTaskid());
//        if (ivrTask1.getStopState() != commonTaskcallMQ.getStopState()) {
//            //将消息从队列中剔除
//            return;
//        }
        //通过任务ID拿到患者信息
        ServiceSubtaskVO serviceSubtaskVO = new ServiceSubtaskVO();
        serviceSubtaskVO.setTaskid(commonTaskcallMQ.getTaskid());
        serviceSubtaskVO.setSendstate(2L);
        List<ServiceSubtask> selectServiceSubtaskList = ivrTaskcallMapper.selectServiceSubtaskList(serviceSubtaskVO);
        if (StringUtils.isNotEmpty(commonTaskcallMQ.getPreachform())) {
            //如何任务发送方式不为空
            String[] split = commonTaskcallMQ.getPreachform().split(",");
            log.info("split的值为:{}", split);
        for (ServiceSubtask serviceSubtask : selectServiceSubtaskList) {
            //先判断患者是不是还要发送
            PatArchive patArchive = patArchiveMapper.selectPatArchiveByPatid(serviceSubtask.getPatid());
            if (!Objects.isNull(patArchive) && patArchive.getNotrequiredFlag() == "1") {
                //不需要发送
                serviceSubtask.setResult("患者不需要随访");
                serviceSubtask.setRemark(patArchive.getNotrequiredreason());
                serviceSubtask.setSendstate(4L);
                serviceSubtaskMapper.updateServiceSubtask(serviceSubtask);
                setFailPreachForm(serviceSubtask, "-1", "不需要执行", "6");
                continue;
            }
            //定义一个集合,用与存没有执行的子任务ID
            List<Long> subIds = new ArrayList<>();
            //临时存没有执行的子任务ID
            List<Long> lssubIds = new ArrayList<>();
            //是否将全部患者者发送完
            Boolean isSend = false;
            ServiceSubtaskPreachform serviceSubtaskPreachform = new ServiceSubtaskPreachform();
            serviceSubtaskPreachform.setTaskid(serviceSubtask.getTaskid());
            serviceSubtaskPreachform.setSubid(serviceSubtask.getId());
            //获取发送方式
            String sendPreachform = getSendPreachform(serviceSubtaskPreachform, serviceSubtask);
            if (sendPreachform.equals("-1") || serviceSubtask.getSendstate() == 6 || serviceSubtask.getSendstate() == 5 || serviceSubtask.getSendstate() == 4) {
                //说明已经全部遍历完了,当前的执行方式序号是最后一个了   æˆ–者  è¯¥æ‚£è€…已经随访结束(成功或失败了或不执行)
                continue;
            }
            aa:
            for (String serviceFrom : split) {
                String descByCode = ServiceFromEnum.getDescByCode(Integer.valueOf(serviceFrom));
                if (isSend == true) {
                    break aa;
                }
            String descByCode = ServiceFromEnum.getDescByCode(Integer.valueOf(sendPreachform));
            if (descByCode.equals("电话")) {
                try {
                    ServiceTask ivrTask = ivrTaskMapper.selectServiceTaskByTaskid(serviceSubtask.getTaskid());
                    if (ivrTask.getSendState() != null && ivrTask.getSendState() == 3 || ivrTask.getSendState() != null && ivrTask.getSendState() == 4) {
                        //如何任务被“暂停”或“终止”
                        break;
                    }
                    if (org.apache.commons.lang3.StringUtils.isEmpty(serviceSubtask.getPhone())) {
                        serviceSubtask.setCurrentPreachform(sendPreachform);
                        serviceSubtask.setVisitTime(getNextVisitTime(serviceSubtask.getId(), serviceSubtask.getTaskid(), serviceSubtask.getVisitTime(), serviceSubtask.getCurrentPreachform()));
                        serviceSubtaskMapper.updateServiceSubtask(serviceSubtask);
                        setFailPreachForm(serviceSubtask, sendPreachform, "手机号为空", "4");
                        continue;
                    }
                //通过任务ID拿到患者信息
                ServiceSubtaskVO ivrTaskcall = new ServiceSubtaskVO();
                ivrTaskcall.setTaskid(commonTaskcallMQ.getTaskid());
                ivrTaskcall.setSendstate(1L);
                List<ServiceSubtask> selectServiceSubtaskList = ivrTaskcallMapper.selectServiceSubtaskList(ivrTaskcall);
                if (CollectionUtils.isEmpty(selectServiceSubtaskList)) {
                    //获取到value值最少的key
                    String key = getKey();
                    if (commonTaskcallMQ.getSendType().equals("2")) {
                        //说明是立即发送
                        List<String> list = new ArrayList<>();
                        list.add(serviceSubtask.getId().toString());
                        log.info("缓存中cache-0的值为:{}", list);
                        redisCache.setCacheListLeftAndDistinct("cache-0", list);
                    } else {
                        //非立即发送
                        List<String> list = new ArrayList<>();
                        list.add(serviceSubtask.getId().toString());
                        redisCache.setCacheListLeftAndDistinct(key, list);
                    }
                } catch (Exception exception) {
                    ServiceSubtaskRecord serviceSubtaskRecord = new ServiceSubtaskRecord();
                    serviceSubtaskRecord.setTaskid(serviceSubtask.getTaskid().toString());
                    serviceSubtaskRecord.setSubtaskId(serviceSubtask.getId());
                    serviceSubtaskRecord.setUuid(UUID.randomUUID().toString());
                    serviceSubtaskRecord.setTasktype(serviceSubtask.getType());
                    serviceSubtaskRecord.setPreachform("3");
                    serviceSubtaskRecord.setResult("fail");
                    serviceSubtaskRecord.setStartTime(System.currentTimeMillis());
                    serviceSubtaskRecord.setRemark("队列任务电话发送失败");
                    log.error("队列任务电话发送失败:{}", exception.getMessage());
                    serviceSubtaskRecordService.insertServiceSubtaskRecord(serviceSubtaskRecord);
                    //将电话状态设置为失败
                    setFailPreachForm(serviceSubtask, sendPreachform, "队列任务电话发送失败", "5");
                    continue;
                }
                if (descByCode.equals("电话")) {
                    for (ServiceSubtask serviceSubtask : selectServiceSubtaskList) {
                        //先判断一下,subIds是否为空,如果不为空,只执行subIds里的患者
                        if (CollectionUtils.isNotEmpty(subIds)) {
                            boolean contains = subIds.contains(serviceSubtask.getId());
                            //如果contains不为true,说明当前的患者已经发送成功,直接循环下一个人就行
                            if (!contains) continue;
                //在子任务表里记录一下
                setFailPreachForm(serviceSubtask, sendPreachform, "队列任务电话发送成功", "2");
                //任务发送记录
                ServiceSubtaskRecord serviceSubtaskRecord = new ServiceSubtaskRecord();
                serviceSubtaskRecord.setTaskid(serviceSubtask.getTaskid().toString());
                serviceSubtaskRecord.setSubtaskId(serviceSubtask.getId());
                serviceSubtaskRecord.setUuid(UUID.randomUUID().toString());
                serviceSubtaskRecord.setTasktype(serviceSubtask.getType());
                serviceSubtaskRecord.setPreachform("3");
                serviceSubtaskRecord.setStartTime(System.currentTimeMillis());
                serviceSubtaskRecord.setRemark("队列任务电话发送成功");
                serviceSubtaskRecordService.insertServiceSubtaskRecord(serviceSubtaskRecord);
            } else if (descByCode.equals("短信")) {
                //短信
                //对url中两个参数加密
                RSAPublicKeyExample rsaPublicKeyExample = new RSAPublicKeyExample();
                String taskId = rsaPublicKeyExample.encryptedData(ivrTask1.getTaskid().toString(), pub_key);
                if (org.apache.commons.lang3.StringUtils.isEmpty(serviceSubtask.getPhone())) {
                    setFailPreachForm(serviceSubtask, sendPreachform, "手机号为空", "4");
                    continue;
                }
                try {
                    String patid = rsaPublicKeyExample.encryptedData(serviceSubtask.getPatid().toString(), pub_key);
                    String subId = rsaPublicKeyExample.encryptedData(serviceSubtask.getId().toString(), pub_key);
                    SendMagParam sendMagParam = new SendMagParam();
                    sendMagParam.setType("4");
                    if (type == 1) {
                        //随访
                        ServiceOutPath serviceOutPath = new ServiceOutPath();
                        serviceOutPath.setParam1(taskId);
                        serviceOutPath.setParam2(patid);
                        serviceOutPath.setParam6(subId);
                        serviceOutPath.setCreateTime(new Date());
                        iServiceOutPathService.insertServiceOutPath(serviceOutPath);
//                                sendMagParam.setUrl(ip + ":" + req_path + "/followvisit/particty?param1=" + taskId + "&param2=" + patid + "&param5=false");
                        //转成16进制
                        String format = String.format("%03X", serviceOutPath.getId());
                        serviceOutPath.setRadix(format);
                        serviceOutPath.setUpdateTime(new Date());
                        iServiceOutPathService.updateServiceOutPath(serviceOutPath);
                        sendMagParam.setPhone(serviceSubtask.getPhone());
                        sendMagParam.setUrl(ip + ":" + req_path + "/sf?p=" + format);
                        if (visitHosp == 2) {
                            sendMagParam.setContent("您好,邀请您填写出院宣教调查表,请点击" + sendMagParam.getUrl() + "查看。感谢您配合!");
                        } else if (visitHosp == 1) {
                            sendMagParam.setContent("【新华医院】您好,邀请您填写出院随访调查表,请点击" + sendMagParam.getUrl() + "填写。感谢您配合!");
                        }
                        try {
                            ServiceTask ivrTask = ivrTaskMapper.selectServiceTaskByTaskid(serviceSubtask.getTaskid());
                            if (ivrTask.getSendState() != null && ivrTask.getSendState() == 3 || ivrTask.getSendState() != null && ivrTask.getSendState() == 4) {
                                //如何任务被“暂停”或“终止”
                                break;
                            }
                            //获取到value值最少的key
                            String key = getKey();
                            if (commonTaskcallMQ.getSendType().equals("2")) {
                                //说明是立即发送
                                ServiceSubtaskVO serviceSubtask1 = new ServiceSubtaskVO();
                                serviceSubtask1.setTaskid(commonTaskcallMQ.getTaskid());
                                log.info("缓存中serviceSubtask1的值为:{}", serviceSubtask1);
                                List<String> list = new ArrayList<>();
                                List<ServiceSubtask> selectServiceSubtaskList1 = ivrTaskcallMapper.selectServiceSubtaskList(serviceSubtask1);
                                for (ServiceSubtask serviceSubtask2 : selectServiceSubtaskList1) {
                                    list.add(serviceSubtask2.getId().toString());
                                }
                                log.info("缓存中cache-0的值为:{}", list);
//                                redisCache.setCacheListLeft("cache-0", list);
                                redisCache.setCacheListLeftAndDistinct("cache-0", list);
                            } else {
                                //非立即发送
                                ServiceSubtaskVO serviceSubtask1 = new ServiceSubtaskVO();
                                serviceSubtask1.setTaskid(commonTaskcallMQ.getTaskid());
                                List<ServiceSubtask> selectServiceSubtaskList1 = ivrTaskcallMapper.selectServiceSubtaskList(serviceSubtask1);
                                List<String> list = new ArrayList<>();
                                for (ServiceSubtask serviceSubtask2 : selectServiceSubtaskList1) {
                                    list.add(serviceSubtask2.getId().toString());
                                }
//                                redisCache.setCacheListLeft(key, list);
                                redisCache.setCacheListLeftAndDistinct(key, list);
                            }
                        } catch (Exception exception) {
                            ServiceSubtaskRecord serviceSubtaskRecord = new ServiceSubtaskRecord();
                            serviceSubtaskRecord.setTaskid(serviceSubtask.getTaskid().toString());
                            serviceSubtaskRecord.setSubtaskId(serviceSubtask.getId());
                            serviceSubtaskRecord.setUuid(UUID.randomUUID().toString());
                            serviceSubtaskRecord.setTasktype(serviceSubtask.getType());
                            serviceSubtaskRecord.setPreachform("3");
                            serviceSubtaskRecord.setResult("fail");
                            serviceSubtaskRecord.setStartTime(System.currentTimeMillis());
                            serviceSubtaskRecord.setRemark("队列任务电话发送失败");
                            log.error("队列任务电话发送失败:{}", exception.getMessage());
                            lssubIds.add(serviceSubtask.getId());
                            serviceSubtaskRecordService.insertServiceSubtaskRecord(serviceSubtaskRecord);
                    } else if (type == 2) {
                        //问券(问题)
                        ServiceOutPath serviceOutPath = new ServiceOutPath();
                        serviceOutPath.setParam1(taskId);
                        serviceOutPath.setParam2(patid);
                        serviceOutPath.setParam6(subId);
//                                serviceOutPath.setParam3(URLEncoder.encode(ivrTask1.getTaskName(), StandardCharsets.UTF_8.toString()));
                        serviceOutPath.setParam3(ivrTask1.getTaskName());
                        serviceOutPath.setCreateTime(new Date());
                        iServiceOutPathService.insertServiceOutPath(serviceOutPath);
                        String format = String.format("%03X", serviceOutPath.getId());
                        serviceOutPath.setRadix(format);
                        serviceOutPath.setUpdateTime(new Date());
                        iServiceOutPathService.updateServiceOutPath(serviceOutPath);
//                                sendMagParam.setUrl(ip + ":" + req_path + "/outsideChainwt?param1=" + taskId + "&param2=" + patid + "&param3=" + URLEncoder.encode(ivrTask1.getTaskName(), StandardCharsets.UTF_8.toString()) + "&param5=false");
                        sendMagParam.setPhone(serviceSubtask.getPhone());
                        sendMagParam.setUrl(ip + ":" + req_path + "/wt?p=" + format);
                        //如果type是语音随访的话(说明补偿发送方式中有电话随访的方式,这里的外链就地址只能用/sf)
                        if (serviceSubtask.getType().equals("1"))
                            sendMagParam.setUrl(ip + ":" + req_path + "/sf?p=" + format);
                        if (serviceSubtask.getOrgid().equals("47255004333112711A1001")) {
                            sendMagParam.setContent("【景宁畲族自治县人民医院】您好,邀请您填写出院宣教调查表,请点击" + sendMagParam.getUrl() + "查看。感谢您配合!");
                        } else if (serviceSubtask.getOrgid().equals("47255004333112711A1001")) {
                            sendMagParam.setContent("【丽水中医院】您好,邀请您填写出院宣教调查表,请点击" + sendMagParam.getUrl() + "查看。感谢您配合!");
                        } else sendMagParam.setContent("【新华医院】您好,邀请您填写出院调查表,请点击" + sendMagParam.getUrl() + "填写。感谢您配合!");
                    } else if (type == 3) {
                        //宣教
                        ServiceOutPath serviceOutPath = new ServiceOutPath();
                        serviceOutPath.setParam1(taskId);
                        serviceOutPath.setParam2(patid);
                        serviceOutPath.setParam6(subId);
                        serviceOutPath.setParam3(ivrTask1.getTaskName());
                        serviceOutPath.setCreateTime(new Date());
                        iServiceOutPathService.insertServiceOutPath(serviceOutPath);
                        String format = String.format("%03X", serviceOutPath.getId());
                        serviceOutPath.setRadix(format);
                        serviceOutPath.setUpdateTime(new Date());
                        iServiceOutPathService.updateServiceOutPath(serviceOutPath);
                        //需要通过模板ID去判断要发的内容是宣教还是通知
                        HeLibrary heLibrary = heLibraryMapper.selectHeLibraryById(serviceSubtask.getLibtemplateid());
                        if (heLibrary.getHetype().equals("1")) {
                            sendMagParam.setPhone(serviceSubtask.getPhone());
                            sendMagParam.setUrl(ip + ":" + req_path + "/xj?p=" + format);
                            if (serviceSubtask.getOrgid().equals("47255004333112711A1001")) {
                                sendMagParam.setContent("【景宁畲族自治县人民医院】您好,邀请您填写出院宣教调查表,请点击" + sendMagParam.getUrl() + "查看。感谢您配合!");
                            } else if (serviceSubtask.getOrgid().equals("47255004333112711A1001")) {
                                sendMagParam.setContent("【丽水中医院】您好,邀请您填写出院宣教调查表,请点击" + sendMagParam.getUrl() + "查看。感谢您配合!");
                            } else
                                sendMagParam.setContent("【新华医院】您好,邀请您填写出院宣教调查表,请点击" + sendMagParam.getUrl() + "查看。感谢您配合!");
                        } else {
                            //通知
                            sendMagParam.setPhone(serviceSubtask.getPhone());
                            sendMagParam.setContent(heLibrary.getPreachcontent());
                        }
                    }
                    //短信还需要模板
                    String s = null;
                    if (visitHosp == 1) {
                        //新华的短信发送方式
                        Map<String, String> req = new HashMap<>();
                        req.put("phone", sendMagParam.getPhone());
                        req.put("content", sendMagParam.getContent());
                        s = HttpUtil.postJsonRequest(xhsmsPath, new Gson().toJson(req));
                    } else if (visitHosp == 2) {
                        String url = configService.selectConfigByKey("token.360", serviceSubtask.getOrgid());
                        //丽水的短信发送方式
                        Map<String, String> map = MsgLSEnum.getAddressByCode(serviceSubtask.getOrgid());
                        String token = LSHospTokenUtil.getToken(serviceSubtask.getOrgid(), url);
                        log.info("-----------token的值为:{}", token);
                        if (ObjectUtils.isNotEmpty(map) && StringUtils.isEmpty(map.get("address"))) {
                            serviceSubtask.setCurrentPreachform(sendPreachform);
                            serviceSubtask.setVisitTime(getNextVisitTime(serviceSubtask.getId(), serviceSubtask.getTaskid(), serviceSubtask.getVisitTime(), serviceSubtask.getCurrentPreachform()));
                            setFailPreachForm(serviceSubtask, descByCode, "短信发送失败,该机构没有配置短信地址", "5");
                            serviceSubtaskMapper.updateServiceSubtask(serviceSubtask);
                            continue;
                        }
                        log.info("---------mq丽水短信发送入参address:{},  sendMagParam:{},  orgid:{}-------", map.get("address"), sendMagParam, serviceSubtask.getOrgid());
                        String dxCode = getDXCode(map.get("address"), sendMagParam.getPhone(), sendMagParam.getContent(), map.get("sendPersonId"), map.get("sendPersonName"), MsgLSEnum.getHeaderByCode(serviceSubtask.getOrgid()), token);
                        log.info("---------丽水短信发送结果:{}-------", dxCode);
                        ObjectMapper objectMapper = new ObjectMapper();
                        Map<String, Object> textParam = objectMapper.readValue(dxCode, Map.class);
                        String code = textParam.get("Code").toString();
                        if (code.equals("0")) {
                            s = "true";
                        } else {
                            setFailPreachForm(serviceSubtask, sendPreachform, "短信发送失败", "5");
                            throw new BaseException("短信发送失败");
                        }
                    } else if (visitHosp == 3) {
                        //省立同德的短信发送方式
                        JSONObject data = MessageSend.sendMsg(sendMagParam.getContent(), "2", sendMagParam.getPhone(), LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss")));
                        String code = data.get("code").toString();
                        if (StringUtils.isNotEmpty(code) && code.equals("00000")) {
                            s = "true";
                        } else {
                            setFailPreachForm(serviceSubtask, sendPreachform, "短信发送失败", "5");
                            throw new BaseException("短信发送失败");
                        }
                    }
                    if (s.equals("true")) {
                        //在子任务表里记录一下
                        String uuid = UUID.randomUUID().toString();
                        serviceSubtask.setResult("success");
                        serviceSubtask.setRemark("队列任务电话发送成功");
                        serviceSubtask.setGuid(uuid);
                        serviceSubtask.setSendstate(3L);
                        serviceSubtask.setFinishtime(new Date());
                        serviceSubtaskMapper.updateServiceSubtask(serviceSubtask);
                        setFailPreachForm(serviceSubtask, sendPreachform, "短信发送成功", "2");
                        //任务发送记录
                        ServiceSubtaskRecord serviceSubtaskRecord = new ServiceSubtaskRecord();
                        serviceSubtaskRecord.setTaskid(serviceSubtask.getTaskid().toString());
                        serviceSubtaskRecord.setSubtaskId(serviceSubtask.getId());
                        serviceSubtaskRecord.setUuid(uuid);
                        serviceSubtaskRecord.setUuid(UUID.randomUUID().toString());
                        serviceSubtaskRecord.setTasktype(serviceSubtask.getType());
                        serviceSubtaskRecord.setPreachform("3");
                        serviceSubtaskRecord.setPreachform("5");
                        serviceSubtaskRecord.setStartTime(System.currentTimeMillis());
                        serviceSubtaskRecord.setRemark("队列任务电话发送成功");
                        serviceSubtaskRecord.setResult("success");
                        serviceSubtaskRecord.setRemark("短信发送成功");
                        serviceSubtaskRecordService.insertServiceSubtaskRecord(serviceSubtaskRecord);
                        log.error("serviceSubtaskRecord保存成功了吗?:{}", serviceSubtaskRecord);
                    } else {
                        //在子任务表里记录一下
                        setFailPreachForm(serviceSubtask, sendPreachform, "短信发送失败", "5");
                    }
                    if (CollectionUtils.isEmpty(lssubIds)) {
                        //如果“临时子任务”为空,说明全发送完了
                        isSend = true;
                    }
                    //将子任务ID清空,将“临时子任务”数据 æ”¾åˆ° â€œå­ä»»åŠ¡â€ ä¸­
                    subIds.clear();
                    subIds.addAll(lssubIds);
                    lssubIds.clear();
                } else if (descByCode.equals("多媒体")) {
                    //多媒体
                } catch (Exception e) {
                    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");
                    serviceSubtaskRecord.setResult("fail");
                    serviceSubtaskRecord.setStartTime(System.currentTimeMillis());
                    serviceSubtaskRecord.setRemark("短信发送失败");
                    log.error("短信发送失败:{}", e.getMessage());
                    serviceSubtaskRecordService.insertServiceSubtaskRecord(serviceSubtaskRecord);
                    setFailPreachForm(serviceSubtask, sendPreachform, "短信发送失败", "5");
                    continue;
                } else if (descByCode.equals("纸质")) {
                    //纸质
                    continue;
                } else if (descByCode.equals("短信")) {
                    //短信
                    //对url中两个参数加密
                    RSAPublicKeyExample rsaPublicKeyExample = new RSAPublicKeyExample();
                    String taskId = rsaPublicKeyExample.encryptedData(ivrTask1.getTaskid().toString(), pub_key);
                }
                    for (ServiceSubtask serviceSubtask : selectServiceSubtaskList) {
                        //先判断一下,subIds是否为空,如果不为空,只执行subIds里的患者
                        if (CollectionUtils.isNotEmpty(subIds)) {
                            boolean contains = subIds.contains(serviceSubtask.getId());
                            //如果contains不为true,说明当前的患者已经发送成功,直接循环下一个人就行
                            if (!contains) continue;
                        }
            } else if (descByCode.equals("公众号")) {
                //公众号
                RSAPublicKeyExample rsaPublicKeyExample = new RSAPublicKeyExample();
                String taskId = rsaPublicKeyExample.encryptedData(ivrTask1.getTaskid().toString(), pub_key);
                String patid = rsaPublicKeyExample.encryptedData(serviceSubtask.getPatid().toString(), pub_key);
                        try {
                            String patid = rsaPublicKeyExample.encryptedData(serviceSubtask.getPatid().toString(), pub_key);
                            String subId = rsaPublicKeyExample.encryptedData(serviceSubtask.getId().toString(), pub_key);
                            SendMagParam sendMagParam = new SendMagParam();
                            sendMagParam.setType("4");
                            if (type == 1) {
                                //随访
                                ServiceOutPath serviceOutPath = new ServiceOutPath();
                                serviceOutPath.setParam1(taskId);
                                serviceOutPath.setParam2(patid);
                                serviceOutPath.setParam6(subId);
                                serviceOutPath.setCreateTime(new Date());
                                iServiceOutPathService.insertServiceOutPath(serviceOutPath);
//                                sendMagParam.setUrl(ip + ":" + req_path + "/followvisit/particty?param1=" + taskId + "&param2=" + patid + "&param5=false");
                                //转成16进制
                                String format = String.format("%03X", serviceOutPath.getId());
                                serviceOutPath.setRadix(format);
                                serviceOutPath.setUpdateTime(new Date());
                                iServiceOutPathService.updateServiceOutPath(serviceOutPath);
                                sendMagParam.setPhone(serviceSubtask.getPhone());
                                sendMagParam.setUrl(ip + ":" + req_path + "/sf?p=" + format);
                                if (visitHosp == 2) {
                                    sendMagParam.setContent("您好,邀请您填写出院宣教调查表,请点击" + sendMagParam.getUrl() + "查看。感谢您配合!");
                                } else if (visitHosp == 1) {
                                    sendMagParam.setContent("【新华医院】您好,邀请您填写出院随访调查表,请点击" + sendMagParam.getUrl() + "填写。感谢您配合!");
                                }
                            } else if (type == 2) {
                                //问券(问题)
                                ServiceOutPath serviceOutPath = new ServiceOutPath();
                                serviceOutPath.setParam1(taskId);
                                serviceOutPath.setParam2(patid);
                                serviceOutPath.setParam6(subId);
//                                serviceOutPath.setParam3(URLEncoder.encode(ivrTask1.getTaskName(), StandardCharsets.UTF_8.toString()));
                                serviceOutPath.setParam3(ivrTask1.getTaskName());
                                serviceOutPath.setCreateTime(new Date());
                                iServiceOutPathService.insertServiceOutPath(serviceOutPath);
                                String format = String.format("%03X", serviceOutPath.getId());
                                serviceOutPath.setRadix(format);
                                serviceOutPath.setUpdateTime(new Date());
                                iServiceOutPathService.updateServiceOutPath(serviceOutPath);
//                                sendMagParam.setUrl(ip + ":" + req_path + "/outsideChainwt?param1=" + taskId + "&param2=" + patid + "&param3=" + URLEncoder.encode(ivrTask1.getTaskName(), StandardCharsets.UTF_8.toString()) + "&param5=false");
                                sendMagParam.setPhone(serviceSubtask.getPhone());
                                sendMagParam.setUrl(ip + ":" + req_path + "/wt?p=" + format);
                                if (serviceSubtask.getOrgid().equals("47255004333112711A1001")) {
                                    sendMagParam.setContent("【景宁畲族自治县人民医院】您好,邀请您填写出院宣教调查表,请点击" + sendMagParam.getUrl() + "查看。感谢您配合!");
                                } else if (serviceSubtask.getOrgid().equals("47255004333112711A1001")) {
                                    sendMagParam.setContent("【丽水中医院】您好,邀请您填写出院宣教调查表,请点击" + sendMagParam.getUrl() + "查看。感谢您配合!");
                                } else
                                    sendMagParam.setContent("【新华医院】您好,邀请您填写出院调查表,请点击" + sendMagParam.getUrl() + "填写。感谢您配合!");
                            } else if (type == 3) {
                                //宣教
                                ServiceOutPath serviceOutPath = new ServiceOutPath();
                                serviceOutPath.setParam1(taskId);
                                serviceOutPath.setParam2(patid);
                                serviceOutPath.setParam6(subId);
                                serviceOutPath.setParam3(ivrTask1.getTaskName());
                                serviceOutPath.setCreateTime(new Date());
                                iServiceOutPathService.insertServiceOutPath(serviceOutPath);
                                String format = String.format("%03X", serviceOutPath.getId());
                                serviceOutPath.setRadix(format);
                                serviceOutPath.setUpdateTime(new Date());
                                iServiceOutPathService.updateServiceOutPath(serviceOutPath);
                                //需要通过模板ID去判断要发的内容是宣教还是通知
                                HeLibrary heLibrary = heLibraryMapper.selectHeLibraryById(serviceSubtask.getLibtemplateid());
                                if (heLibrary.getHetype().equals("1")) {
                                    sendMagParam.setPhone(serviceSubtask.getPhone());
                                    sendMagParam.setUrl(ip + ":" + req_path + "/xj?p=" + format);
                                    if (serviceSubtask.getOrgid().equals("47255004333112711A1001")) {
                                        sendMagParam.setContent("【景宁畲族自治县人民医院】您好,邀请您填写出院宣教调查表,请点击" + sendMagParam.getUrl() + "查看。感谢您配合!");
                                    } else if (serviceSubtask.getOrgid().equals("47255004333112711A1001")) {
                                        sendMagParam.setContent("【丽水中医院】您好,邀请您填写出院宣教调查表,请点击" + sendMagParam.getUrl() + "查看。感谢您配合!");
                                    } else
                                        sendMagParam.setContent("【新华医院】您好,邀请您填写出院宣教调查表,请点击" + sendMagParam.getUrl() + "查看。感谢您配合!");
                                } else {
                                    //通知
                                    sendMagParam.setPhone(serviceSubtask.getPhone());
                                    sendMagParam.setContent(heLibrary.getPreachcontent());
                                }
                            }
                            //短信还需要模板
                            String s = null;
                            if (visitHosp == 1) {
                                //新华的短信发送方式
                                Map<String, String> req = new HashMap<>();
                                req.put("phone", sendMagParam.getPhone());
                                req.put("content", sendMagParam.getContent());
                                s = HttpUtil.postJsonRequest(xhsmsPath, new Gson().toJson(req));
                            } else if (visitHosp == 2) {
                                String url = configService.selectConfigByKey("token.360",serviceSubtask.getOrgid());
                                //丽水的短信发送方式
                                Map<String, String> map = MsgLSEnum.getAddressByCode(serviceSubtask.getOrgid());
                                String token = LSHospTokenUtil.getToken(serviceSubtask.getOrgid(),url);
                                log.info("-----------token的值为:{}", token);
                                if (ObjectUtils.isNotEmpty(map) && StringUtils.isEmpty(map.get("address"))) {
                                    ServiceSubtask ss = new ServiceSubtask();
                                    ss.setResult("error");
                                    ss.setRemark("短信发送失败,该机构没有配置短信地址");
                                    ss.setSendstate(5L);
                                    ss.setId(serviceSubtask.getId());
//                                    ss.setFinishtime(new Date());
                                    serviceSubtaskMapper.updateServiceSubtask(ss);
                                    continue;
                                }
                                log.info("---------mq丽水短信发送入参address:{},  sendMagParam:{},  orgid:{}-------", map.get("address"), sendMagParam, serviceSubtask.getOrgid());
                                String dxCode = getDXCode(map.get("address"), sendMagParam.getPhone(), sendMagParam.getContent(), map.get("sendPersonId"), map.get("sendPersonName"), MsgLSEnum.getHeaderByCode(serviceSubtask.getOrgid()), token);
                                log.info("---------丽水短信发送结果:{}-------", dxCode);
                                ObjectMapper objectMapper = new ObjectMapper();
                                Map<String, Object> textParam = objectMapper.readValue(dxCode, Map.class);
                                String code = textParam.get("Code").toString();
                                if (code.equals("0")) {
                                    s = "true";
                                } else {
                                    throw new BaseException(null);
                                }
                            }
                            if (s.equals("true")) {
                                //在子任务表里记录一下
                                String uuid = UUID.randomUUID().toString();
                                serviceSubtask.setResult("success");
                                serviceSubtask.setRemark("短信发送成功");
                                serviceSubtask.setGuid(uuid);
                                serviceSubtask.setSendstate(3L);
                                serviceSubtask.setFinishtime(new Date());
                                serviceSubtaskMapper.updateServiceSubtask(serviceSubtask);
                                //任务发送记录
                                ServiceSubtaskRecord serviceSubtaskRecord = new ServiceSubtaskRecord();
                                serviceSubtaskRecord.setTaskid(serviceSubtask.getTaskid().toString());
                                serviceSubtaskRecord.setSubtaskId(serviceSubtask.getId());
                                serviceSubtaskRecord.setUuid(uuid);
                                serviceSubtaskRecord.setTasktype(serviceSubtask.getType());
                                serviceSubtaskRecord.setPreachform("5");
                                serviceSubtaskRecord.setStartTime(System.currentTimeMillis());
                                serviceSubtaskRecord.setResult("success");
                                serviceSubtaskRecord.setRemark("短信发送成功");
                                serviceSubtaskRecordService.insertServiceSubtaskRecord(serviceSubtaskRecord);
                                log.error("serviceSubtaskRecord保存成功了吗?:{}", serviceSubtaskRecord);
                            }
                        } catch (Exception e) {
                            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");
                            serviceSubtaskRecord.setResult("fail");
                            serviceSubtaskRecord.setStartTime(System.currentTimeMillis());
                            serviceSubtaskRecord.setRemark("短信发送失败");
                            log.error("短信发送失败:{}", e.getMessage());
                            lssubIds.add(serviceSubtask.getId());
                            serviceSubtaskRecordService.insertServiceSubtaskRecord(serviceSubtaskRecord);
                            continue;
                        }
                try {
                    SendMagParam sendMagParam = new SendMagParam();
                    sendMagParam.setType("5");
                    String url = null;
                    Boolean aBoolean = false;
                    if (type == 1) {
                        //随访
                        ServiceOutPath serviceOutPath = new ServiceOutPath();
                        serviceOutPath.setParam1(taskId);
                        serviceOutPath.setParam2(patid);
                        serviceOutPath.setCreateTime(new Date());
                        iServiceOutPathService.insertServiceOutPath(serviceOutPath);
                        String format = String.format("%03X", serviceOutPath.getId());
                        serviceOutPath.setRadix(format);
                        serviceOutPath.setUpdateTime(new Date());
                        iServiceOutPathService.updateServiceOutPath(serviceOutPath);
                        url = ip + ":" + req_path + "/sf?p=" + format;
                    } else if (type == 2) {
                        //问券
                        ServiceOutPath serviceOutPath = new ServiceOutPath();
                        serviceOutPath.setParam1(taskId);
                        serviceOutPath.setParam2(patid);
                        serviceOutPath.setParam3(ivrTask1.getTaskName());
                        serviceOutPath.setCreateTime(new Date());
                        iServiceOutPathService.insertServiceOutPath(serviceOutPath);
                        String format = String.format("%03X", serviceOutPath.getId());
                        serviceOutPath.setRadix(format);
                        serviceOutPath.setUpdateTime(new Date());
                        iServiceOutPathService.updateServiceOutPath(serviceOutPath);
                        url = ip + ":" + req_path + "/wt?p=" + format;
                        //如果type是语音随访的话(说明补偿发送方式中有电话随访的方式,这里的外链就地址只能用/sf)
                        if (serviceSubtask.getType().equals("1"))
                            sendMagParam.setUrl(ip + ":" + req_path + "/sf?p=" + format);
                    } else if (type == 3) {
                        //宣教
                        ServiceOutPath serviceOutPath = new ServiceOutPath();
                        serviceOutPath.setParam1(taskId);
                        serviceOutPath.setParam2(patid);
                        serviceOutPath.setParam3(ivrTask1.getTaskName());
                        serviceOutPath.setCreateTime(new Date());
                        iServiceOutPathService.insertServiceOutPath(serviceOutPath);
                        String format = String.format("%03X", serviceOutPath.getId());
                        serviceOutPath.setRadix(format);
                        serviceOutPath.setUpdateTime(new Date());
                        iServiceOutPathService.updateServiceOutPath(serviceOutPath);
                        url = ip + ":" + req_path + "/xj?p=" + format;
                    }
                    if (CollectionUtils.isEmpty(lssubIds)) {
                        //如果“临时子任务”为空,说明全发送完了
                        isSend = true;
                    if (StringUtils.isEmpty(patArchive.getPatidHis())) {
                        serviceSubtask.setCurrentPreachform(sendPreachform);
                        serviceSubtask.setVisitTime(getNextVisitTime(serviceSubtask.getId(), serviceSubtask.getTaskid(), serviceSubtask.getVisitTime(), serviceSubtask.getCurrentPreachform()));
                        serviceSubtaskMapper.updateServiceSubtask(serviceSubtask);
                        //失败记录
                        setFailPreachForm(serviceSubtask, sendPreachform, "公众号发送失败,his系统的患者id为空", "5");
                        continue;
                    }
                    //将子任务ID清空,将“临时子任务”数据 æ”¾åˆ° â€œå­ä»»åŠ¡â€ ä¸­
                    subIds.clear();
                    subIds.addAll(lssubIds);
                    lssubIds.clear();
                } else if (descByCode.equals("公众号")) {
                    //公众号
                    RSAPublicKeyExample rsaPublicKeyExample = new RSAPublicKeyExample();
                    String taskId = rsaPublicKeyExample.encryptedData(ivrTask1.getTaskid().toString(), pub_key);
                    for (ServiceSubtask serviceSubtask : selectServiceSubtaskList) {
                        String patid = rsaPublicKeyExample.encryptedData(serviceSubtask.getPatid().toString(), pub_key);
                        try {
                            SendMagParam sendMagParam = new SendMagParam();
                            sendMagParam.setType("5");
                            String url = null;
                            Boolean aBoolean = false;
                            if (type == 1) {
                                //随访
                                ServiceOutPath serviceOutPath = new ServiceOutPath();
                                serviceOutPath.setParam1(taskId);
                                serviceOutPath.setParam2(patid);
                                serviceOutPath.setCreateTime(new Date());
                                iServiceOutPathService.insertServiceOutPath(serviceOutPath);
                                String format = String.format("%03X", serviceOutPath.getId());
                                serviceOutPath.setRadix(format);
                                serviceOutPath.setUpdateTime(new Date());
                                iServiceOutPathService.updateServiceOutPath(serviceOutPath);
                                url = ip + ":" + req_path + "/sf?p=" + format;
                            } else if (type == 2) {
                                //问券
                                ServiceOutPath serviceOutPath = new ServiceOutPath();
                                serviceOutPath.setParam1(taskId);
                                serviceOutPath.setParam2(patid);
//                                serviceOutPath.setParam3(URLEncoder.encode(ivrTask1.getTaskName(), StandardCharsets.UTF_8.toString()));
                                serviceOutPath.setParam3(ivrTask1.getTaskName());
                                serviceOutPath.setCreateTime(new Date());
                                iServiceOutPathService.insertServiceOutPath(serviceOutPath);
                                String format = String.format("%03X", serviceOutPath.getId());
                                serviceOutPath.setRadix(format);
                                serviceOutPath.setUpdateTime(new Date());
                                iServiceOutPathService.updateServiceOutPath(serviceOutPath);
                                url = ip + ":" + req_path + "/wt?p=" + format;
                            } else if (type == 3) {
                                //宣教
                                ServiceOutPath serviceOutPath = new ServiceOutPath();
                                serviceOutPath.setParam1(taskId);
                                serviceOutPath.setParam2(patid);
                                serviceOutPath.setParam3(ivrTask1.getTaskName());
                                serviceOutPath.setCreateTime(new Date());
                                iServiceOutPathService.insertServiceOutPath(serviceOutPath);
                                String format = String.format("%03X", serviceOutPath.getId());
                                serviceOutPath.setRadix(format);
                                serviceOutPath.setUpdateTime(new Date());
                                iServiceOutPathService.updateServiceOutPath(serviceOutPath);
                                url = ip + ":" + req_path + "/xj?p=" + format;
                            }
                            PatArchive patArchive = patArchiveMapper.selectPatArchiveByPatid(serviceSubtask.getPatid());
                            if (StringUtils.isEmpty(patArchive.getPatidHis())) {
                                ServiceSubtask ss = new ServiceSubtask();
                                ss.setResult("error");
                                ss.setRemark("公众号发送失败,his系统的患者id为空");
                                ss.setSendstate(5L);
                                ss.setId(serviceSubtask.getId());
//                                ss.setFinishtime(new Date());
                                serviceSubtaskMapper.updateServiceSubtask(ss);
                                continue;
                            }
                            //获取微信公众号请求信息根据机构ID
                            log.error("获取微信公众号请求信息根据机构ID:{}", patArchive.getOrgid());
                            List<String> wxqqxx = WxGZHEnum.getDescByCode(patArchive.getOrgid());
                            if (CollectionUtils.isEmpty(wxqqxx) || wxqqxx.size() < 4) {
                                ServiceSubtask ss = new ServiceSubtask();
                                ss.setResult("error");
                                ss.setRemark("该机构的公众号配置信息不全,无法通过公众号发送");
                                ss.setSendstate(5L);
                                ss.setId(serviceSubtask.getId());
//                                ss.setFinishtime(new Date());
                                serviceSubtaskMapper.updateServiceSubtask(ss);
                                continue;
                            }
                    //获取微信公众号请求信息根据机构ID
                    log.error("获取微信公众号请求信息根据机构ID:{}", patArchive.getOrgid());
                    List<String> wxqqxx = WxGZHEnum.getDescByCode(patArchive.getOrgid());
                    if (CollectionUtils.isEmpty(wxqqxx) || wxqqxx.size() < 4) {
                        serviceSubtask.setCurrentPreachform(sendPreachform);
                        serviceSubtask.setVisitTime(getNextVisitTime(serviceSubtask.getId(), serviceSubtask.getTaskid(), serviceSubtask.getVisitTime(), serviceSubtask.getCurrentPreachform()));
                        serviceSubtaskMapper.updateServiceSubtask(serviceSubtask);
                        //失败记录
                        setFailPreachForm(serviceSubtask, sendPreachform, "该机构的公众号配置信息不全,无法通过公众号发送", "5");
                        continue;
                    }
                            String wxCode = getWXCode(serviceSubtask.getSfzh(), url, serviceSubtask.getTaskName(), serviceSubtask.getTaskName(), patArchive.getTelcode(), patArchive.getName(), patArchive.getPatidHis(), wxqqxx);
                            log.error("wxCode的值为:{}", wxCode);
                            Map<String, Object> map = JSONObject.parseObject(wxCode, Map.class);
                            log.error("map的值为:{}", map);
                            if (!map.isEmpty()) {
                                serviceSubtask.setResult("success");
                                serviceSubtask.setSendstate(3L);
                                log.error("aBoolean的值为:{}", aBoolean);
                                if (map.get("succ").toString().equals("true")) {
                                    aBoolean = true;
                                }
                                if (aBoolean == false) {
                                    ServiceSubtaskRecord serviceSubtaskRecord = new ServiceSubtaskRecord();
                                    serviceSubtaskRecord.setTaskid(serviceSubtask.getTaskid().toString());
                                    serviceSubtaskRecord.setSubtaskId(serviceSubtask.getId());
                                    serviceSubtaskRecord.setUuid(UUID.randomUUID().toString());
                                    serviceSubtaskRecord.setTasktype(serviceSubtask.getType());
                                    serviceSubtaskRecord.setPreachform("5");
                                    serviceSubtaskRecord.setStartTime(System.currentTimeMillis());
                                    serviceSubtaskRecord.setRemark(ObjectUtils.isNotEmpty(map.get("msg")) ? map.get("msg").toString() : null);
                                    lssubIds.add(serviceSubtask.getId());
                                    serviceSubtaskRecordService.insertServiceSubtaskRecord(serviceSubtaskRecord);
                                    continue;
                                }
                            }
                        } catch (Exception e) {
                    String wxCode = getWXCode(serviceSubtask.getSfzh(), url, serviceSubtask.getTaskName(), serviceSubtask.getTaskName(), patArchive.getTelcode(), patArchive.getName(), patArchive.getPatidHis(), wxqqxx);
                    log.error("wxCode的值为:{}", wxCode);
                    Map<String, Object> map = JSONObject.parseObject(wxCode, Map.class);
                    log.error("map的值为:{}", map);
                    if (!map.isEmpty()) {
                        serviceSubtask.setResult("success");
                        serviceSubtask.setSendstate(3L);
                        log.error("aBoolean的值为:{}", aBoolean);
                        if (map.get("succ").toString().equals("true")) {
                            aBoolean = true;
                        }
                        if (aBoolean == false) {
                            ServiceSubtaskRecord serviceSubtaskRecord = new ServiceSubtaskRecord();
                            serviceSubtaskRecord.setTaskid(serviceSubtask.getTaskid().toString());
                            serviceSubtaskRecord.setSubtaskId(serviceSubtask.getId());
                            serviceSubtaskRecord.setUuid(UUID.randomUUID().toString());
                            serviceSubtaskRecord.setTasktype(serviceSubtask.getType());
                            serviceSubtaskRecord.setPreachform("5");
                            serviceSubtaskRecord.setResult("fail");
                            serviceSubtaskRecord.setStartTime(System.currentTimeMillis());
                            serviceSubtaskRecord.setRemark("公众号发送失败");
                            log.error("公众号发送失败:{}", e.getMessage());
                            lssubIds.add(serviceSubtask.getId());
                            serviceSubtaskRecord.setRemark(ObjectUtils.isNotEmpty(map.get("msg")) ? map.get("msg").toString() : null);
                            serviceSubtaskRecordService.insertServiceSubtaskRecord(serviceSubtaskRecord);
                            //在子任务表里记录一下
                            setFailPreachForm(serviceSubtask, sendPreachform, "公众号发送失败", "5");
                            continue;
                        }
                        //在子任务表里记录一下
                        String uuid = UUID.randomUUID().toString();
                        serviceSubtask.setResult("success");
                        serviceSubtask.setRemark("公众号发送成功");
                        serviceSubtask.setGuid(uuid);
                        serviceSubtask.setSendstate(3L);
                        serviceSubtask.setFinishtime(new Date());
                        serviceSubtaskMapper.updateServiceSubtask(serviceSubtask);
                        //任务发送记录
                        ServiceSubtaskRecord serviceSubtaskRecord = new ServiceSubtaskRecord();
                        serviceSubtaskRecord.setTaskid(serviceSubtask.getTaskid().toString());
                        serviceSubtaskRecord.setUuid(uuid);
                        serviceSubtaskRecord.setTasktype(serviceSubtask.getType());
                        serviceSubtaskRecord.setPreachform("5");
                        serviceSubtaskRecord.setStartTime(System.currentTimeMillis());
                        serviceSubtaskRecord.setResult("success");
                        serviceSubtaskRecord.setRemark("公众号发送成功");
                        serviceSubtaskRecordService.insertServiceSubtaskRecord(serviceSubtaskRecord);
                    }
                    if (CollectionUtils.isEmpty(lssubIds)) {
                        //如果“临时子任务”为空,说明全发送完了
                        isSend = true;
                    }
                    //将子任务ID清空,将“临时子任务”数据 æ”¾åˆ° â€œå­ä»»åŠ¡â€ ä¸­
                    subIds.clear();
                    subIds.addAll(lssubIds);
                    lssubIds.clear();
                } catch (Exception e) {
                    ServiceSubtaskRecord serviceSubtaskRecord = new ServiceSubtaskRecord();
                    serviceSubtaskRecord.setTaskid(serviceSubtask.getTaskid().toString());
                    serviceSubtaskRecord.setSubtaskId(serviceSubtask.getId());
                    serviceSubtaskRecord.setUuid(UUID.randomUUID().toString());
                    serviceSubtaskRecord.setTasktype(serviceSubtask.getType());
                    serviceSubtaskRecord.setPreachform("5");
                    serviceSubtaskRecord.setResult("fail");
                    serviceSubtaskRecord.setStartTime(System.currentTimeMillis());
                    serviceSubtaskRecord.setRemark("公众号发送失败");
                    log.error("公众号发送失败:{}", e.getMessage());
                    serviceSubtaskRecordService.insertServiceSubtaskRecord(serviceSubtaskRecord);
                    //失败记录
                    setFailPreachForm(serviceSubtask, sendPreachform, "公众号发送失败", "5");
                    continue;
                }
                //通知 MQ æ¶ˆæ¯å·²è¢«æŽ¥æ”¶,可以ACK(从队列中删除)了   ï¼ˆè¿™ä¸ªéœ€è¦æ ¹æ®ä¸šåŠ¡å†åŽ»å¤„ç†ACK)
                //在子任务表里记录一下
                setFailPreachForm(serviceSubtask, sendPreachform, "公众号发送成功", "2");
                //任务发送记录
                ServiceSubtaskRecord serviceSubtaskRecord = new ServiceSubtaskRecord();
                serviceSubtaskRecord.setTaskid(serviceSubtask.getTaskid().toString());
                serviceSubtaskRecord.setUuid(UUID.randomUUID().toString());
                serviceSubtaskRecord.setTasktype(serviceSubtask.getType());
                serviceSubtaskRecord.setPreachform("5");
                serviceSubtaskRecord.setStartTime(System.currentTimeMillis());
                serviceSubtaskRecord.setResult("success");
                serviceSubtaskRecord.setRemark("公众号发送成功");
                serviceSubtaskRecordService.insertServiceSubtaskRecord(serviceSubtaskRecord);
            } else if (descByCode.equals("人工")) {
                setFailPreachForm(serviceSubtask, sendPreachform, "人工待执行", "2");
            }
            if (CollectionUtils.isNotEmpty(subIds)) {
                //如果全部的发送方式都发完了,还有是未发送的,需要去subTask表中,记录一下,发送失败
                for (Long id : subIds) {
                    ServiceSubtask serviceSubtask = new ServiceSubtask();
                    serviceSubtask.setResult("error");
                    serviceSubtask.setRemark("发送失败");
        }
    }
    private Date getNextVisitTime(Long subid, Long taskid, Date visitTime, String currentPreachform) {
        ServiceSubtaskPreachform serviceSubtaskPreachform = new ServiceSubtaskPreachform();
        serviceSubtaskPreachform.setSubid(subid);
        serviceSubtaskPreachform.setTaskid(taskid);
        List<ServiceSubtaskPreachform> serviceSubtaskPreachforms = serviceSubtaskPreachformMapper.selectServiceSubtaskPreachformList(serviceSubtaskPreachform);
        if (CollectionUtils.isNotEmpty(serviceSubtaskPreachforms)) {
            Optional<String> ct = serviceSubtaskPreachforms.stream().filter(item -> currentPreachform.equals(item.getPreachform())).map(ServiceSubtaskPreachform::getCompensateTime).findFirst();
            String compensateTime = "0";
            if (ct.isPresent()) compensateTime = ct.get();
            int hoursToAdd = Integer.valueOf(compensateTime) * 24;
            Calendar calendar = Calendar.getInstance();
            calendar.setTime(visitTime);
            calendar.add(Calendar.HOUR_OF_DAY, hoursToAdd);
            Date newDate = calendar.getTime();
            return newDate;
        }
        return visitTime;
    }
    private String getSendPreachform(ServiceSubtaskPreachform serviceSubtaskPreachform, ServiceSubtask serviceSubtask) {
        List<ServiceSubtaskPreachform> serviceSubtaskPreachforms = serviceSubtaskPreachformMapper.selectServiceSubtaskPreachformList(serviceSubtaskPreachform);
        // æƒ…况1:currentPreachform为空,取sort为1的preachform
        if (StringUtils.isEmpty(serviceSubtask.getCurrentPreachform())) {
            return serviceSubtaskPreachforms.stream().filter(item -> item.getSort() == 1L).map(ServiceSubtaskPreachform::getPreachform).findFirst().orElse(null);
        }
        // æƒ…况2:currentPreachform不为空,找下一个sort
        Optional<Long> currentSort = serviceSubtaskPreachforms.stream().filter(item -> serviceSubtask.getCurrentPreachform().equals(item.getPreachform())).map(ServiceSubtaskPreachform::getSort).findFirst();
        if (currentSort.isPresent()) {
            // æ£€æŸ¥æ˜¯å¦æ‰€æœ‰sendstate不等于9
            boolean allSendStateNot1AndNot9 = serviceSubtaskPreachforms.stream().allMatch(item -> !item.getSendstate().equals("9"));
            // å½“sort等于列表size时,并且所有sendstate都不等于9,则返回-1
            if (currentSort.get().equals((long) serviceSubtaskPreachforms.size())) {
                if (allSendStateNot1AndNot9) {
                    //说明全发送失败了
                    serviceSubtask.setSendstate(5L);
                    serviceSubtask.setId(id);
//                    serviceSubtask.setFinishtime(new Date());
                    serviceSubtaskMapper.updateServiceSubtask(serviceSubtask);
                }
                return "-1";
            }
            // å½“sort等于列表size时,下一个sort为-1
            Long nextSort = currentSort.get() + 1;
            // æ‰¾åˆ°ä¸‹ä¸€ä¸ªsort对应的preachform
            return serviceSubtaskPreachforms.stream().filter(item -> nextSort.equals(item.getSort())).map(ServiceSubtaskPreachform::getPreachform).findFirst().orElse(null);
        }
        return null;
    }
    //    /**
//     * æœºå™¨äººç¬¬ä¸€å¥è¯è¯­éŸ³
//     * concurrency = "50"  å¹¶å‘数为50
//     */
//    @RabbitListener(queues = "ob_queue", concurrency = "50")
//    public void obVisit(String content, Message message, Channel channel) throws IOException {
//        try {
//            IvrTaskcallPhoneMQ commonTaskcallMQ = null;
//            ObjectMapper mapper = new ObjectMapper();
//            commonTaskcallMQ = mapper.readValue(content, IvrTaskcallPhoneMQ.class);
//            //判断患者是否已经接电话
//            String str = redisCache.getCacheObject(commonTaskcallMQ.getUuid() + "state_id");
//            System.out.println("-----------------" + str);
//            if (StringUtils.isNotEmpty(str) && str.equals("0")) {
//                //患者已经接听了电话
//                new PhoneUtils().ttsPlayback(commonTaskcallMQ.getScript(), commonTaskcallMQ.getUuid());
//            } else if (StringUtils.isNotEmpty(str) && str.equals("-10")) {
//                //这个说明,已经打了指定遍数还是没有人接,可以将消息从队列中移除了
//                channel.basicAck(message.getMessageProperties().getDeliveryTag(), false);
//                return;
//            } else {
//                //进行队列尾部,进行下一次校验
////                channel.basicRecover(false);
//                channel.basicReject(message.getMessageProperties().getDeliveryTag(), true);
//                System.out.println("++++++++++++++++++++++" + str);
//                return;
//            }
//            //通知 MQ æ¶ˆæ¯å·²è¢«æŽ¥æ”¶,可以ACK(从队列中删除)了   ï¼ˆè¿™ä¸ªéœ€è¦æ ¹æ®ä¸šåŠ¡å†åŽ»å¤„ç†ACK)
//            channel.basicAck(message.getMessageProperties().getDeliveryTag(), false);
//        } catch (Exception e) {
//            log.error("============消费失败,尝试消息补发再次消费!==============");
//            log.error(e.getMessage());
//            channel.basicReject(message.getMessageProperties().getDeliveryTag(), true);
//        }
//    }
    private String getKey() {
        Map<String, String> map = new HashMap<>();
        for (int i = 0; i < 6; i++) {
            Boolean aBoolean = redisCache.hasKey("cache-" + i);
            if (!aBoolean) {
                redisCache.setCacheObject("cache-" + i, "");
                map.put("cache-" + i, "");
            } else {
                map.put("cache-" + i, redisCache.getCacheObject("cache-" + i));
            }
    /**
     * @param serviceSubtask
     * @param preachform
     * @param remark
     * @param failSendstate
     * @return
     */
    public Boolean setFailPreachForm(ServiceSubtask serviceSubtask, String preachform, String remark, String failSendstate) {
        if (preachform.equals("-1")) {
            //说明都不需要执行了
            ServiceSubtaskPreachform serviceSubtaskPreachform = new ServiceSubtaskPreachform();
            serviceSubtaskPreachform.setSubid(serviceSubtask.getId());
            serviceSubtaskPreachform.setTaskid(serviceSubtask.getTaskid());
            serviceSubtaskPreachform.setOrgid(serviceSubtask.getOrgid());
            serviceSubtaskPreachform.setSendstate(failSendstate);
            serviceSubtaskPreachformMapper.updateSSPByCondition(serviceSubtaskPreachform);
            return true;
        }
        String key = null;
        String value = "";
        for (Map.Entry<String, String> entry : map.entrySet()) {
            if (StringUtils.isEmpty(value)) {
                value = entry.getValue();
                key = entry.getKey();
            } else {
                if (entry.getValue().split(",").length < value.split(",").length) {
                    value = entry.getValue();
                    key = entry.getKey();
        //将状态设置为失败
        ServiceSubtaskPreachform serviceSubtaskPreachform = new ServiceSubtaskPreachform();
        serviceSubtaskPreachform.setSubid(serviceSubtask.getId());
        serviceSubtaskPreachform.setTaskid(serviceSubtask.getTaskid());
        serviceSubtaskPreachform.setOrgid(serviceSubtask.getOrgid());
        //获取该患者的发送方式总数
        List<ServiceSubtaskPreachform> spSize = serviceSubtaskPreachformMapper.selectServiceSubtaskPreachformList(serviceSubtaskPreachform);
        serviceSubtaskPreachform.setPreachform(preachform);
        //1:未发送状态
        serviceSubtaskPreachform.setSendstate("1");
        //电话的未发送状态,需要查2,因为,数据可能卡在队列里了
        if (preachform.equals("3")) serviceSubtaskPreachform.setSendstate("2");
        List<ServiceSubtaskPreachform> serviceSubtaskPreachforms = serviceSubtaskPreachformMapper.selectServiceSubtaskPreachformList(serviceSubtaskPreachform);
        if (CollectionUtils.isNotEmpty(serviceSubtaskPreachforms)) {
            ServiceSubtaskPreachform serviceSubtaskPreachform1 = serviceSubtaskPreachforms.get(0);
            serviceSubtaskPreachform1.setSendstate(failSendstate);
            serviceSubtaskPreachform1.setRemark(remark);
            serviceSubtaskPreachformMapper.updateServiceSubtaskPreachform(serviceSubtaskPreachform1);
            //如果当前的preachform已经是最后一个了,并且本次还是发送失败,那直接将serviceSubtask的sendstate状态改成5就行了(全失败了)
            if (serviceSubtaskPreachform1.getSort() == spSize.size()) {
                if (serviceSubtaskPreachform1.getSort() == spSize.size()) {
                    if (failSendstate.equals("4") || failSendstate.equals("5")) {
                        serviceSubtask.setCurrentPreachform(preachform);
                        serviceSubtask.setSendstate(5L);
                        serviceSubtaskMapper.updateServiceSubtask(serviceSubtask);
                        return true;
                    }
                }
            }
        } else {
            log.error("【MQ中该患者没有查询到属于他的发送方式,subid:{},prechform:{},orgid:{}】", serviceSubtask.getId(), preachform, serviceSubtask.getOrgid());
            return false;
        }
        return key;
        serviceSubtask.setCurrentPreachform(preachform);
        serviceSubtask.setVisitTime(getNextVisitTime(serviceSubtask.getId(), serviceSubtask.getTaskid(), serviceSubtask.getVisitTime(), serviceSubtask.getCurrentPreachform()));
        serviceSubtask.setSendstate(3L);
        serviceSubtaskMapper.updateServiceSubtask(serviceSubtask);
        return true;
    }
    private String getKey() {
        String targetKey = null;
        long minSize = Long.MAX_VALUE;
        for (int i = 1; i < 6; i++) {
            String key = "cache-" + i;
            // èŽ·å– list çš„长度(即 value çš„元素个数)
            Long size = redisCache.getListSize(key);
            if (size == null) {
                size = 0L; // å¦‚æžœ key ä¸å­˜åœ¨ï¼Œè®¤ä¸ºæ˜¯ 0
            }
            // å–最小值
            if (size < minSize) {
                minSize = size;
                targetKey = key;
            }
        }
        return targetKey;
    }
//    private String getKey() {
//        Map<String, List> map = new HashMap<>();
//        for (int i = 0; i < 6; i++) {
//            Boolean aBoolean = redisCache.hasKey("cache-" + i);
//            if (!aBoolean) {
//                redisCache.setCacheList("cache-" + i, new ArrayList<String>());
//                map.put("cache-" + i, new ArrayList<String>());
//            } else {
//                map.put("cache-" + i, redisCache.getCacheObject("cache-" + i));
//            }
//        }
//
//        String key = null;
//        List<String> value = new ArrayList<String>();
//        for (Map.Entry<String, List> entry : map.entrySet()) {
//            if (CollectionUtils.isEmpty(value)) {
//                value = entry.getValue();
//                key = entry.getKey();
//            } else {
//                value = entry.getValue();
//                key = entry.getKey();
//            }
//        }
//        return key;
//    }
    private String getWXCode(String idcard, String url, String taskName, String taskDesc, String phone, String patientname, String setPatientid, List<String> wxqqxx) {
        XinHuaWXReq xinHuaWXReq = new XinHuaWXReq();
        xinHuaWXReq.setIdcard(idcard);
ruoyi-admin/src/main/java/com/ruoyi/web/controller/common/CommonController.java
@@ -10,6 +10,8 @@
import com.ruoyi.common.utils.file.FileUploadUtils;
import com.ruoyi.common.utils.file.FileUtils;
import com.ruoyi.framework.config.ServerConfig;
import com.ruoyi.system.domain.SysConfig;
import com.ruoyi.system.mapper.SysConfigMapper;
import com.smartor.domain.HtmlContentVO;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
@@ -53,6 +55,9 @@
    @Autowired
    private ServerConfig serverConfig;
    @Autowired
    private SysConfigMapper sysConfigMapper;
    private static final String FILE_DELIMETER = ",";
@@ -143,7 +148,10 @@
            convertDocToHtml(filePath + "\\" + file.getOriginalFilename(), filePath + "\\" + file.getOriginalFilename().split("\\.", 2)[0] + ".html");
            String url = null;
            String xhPath = "http://218.108.11.22:8093/profile-api";
            SysConfig config = new SysConfig();
            config.setConfigKey("sys.qdip");
            SysConfig sysConfig = sysConfigMapper.selectConfig(config);
            String xhPath = sysConfig.getConfigValue() + "/profile-api";
            if (uploadSwitch == 1) {
                String fn = fileName.replaceAll("\\.[^.]*$", ".html").replaceAll("/profile", "");
                url = xhPath + fn;
@@ -263,8 +271,7 @@
        // å°†æ–‡ä»¶ä¿å­˜åˆ°æŒ‡å®šç›®å½•
        File outputFile = new File(RuoYiConfig.getUploadPath() + "/show/" + fileName.split("\\.", 2)[0] + "/" + fileName);
        try (BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(outputFile), "UTF-8"))) {
            if (StringUtils.isNotEmpty(htmlContentVO.getContent()))
                writer.write(htmlContentVO.getContent());
            if (StringUtils.isNotEmpty(htmlContentVO.getContent())) writer.write(htmlContentVO.getContent());
        } catch (IOException e) {
            e.printStackTrace();
        }
@@ -315,4 +322,26 @@
    }
    /**
     * èŽ·å–æ–‡ä»¶æ‰©å±•å
     */
    private static String getFileExtension(String fileName) {
        int lastDotIndex = fileName.lastIndexOf('.');
        if (lastDotIndex > 0) {
            return fileName.substring(lastDotIndex);
        }
        return "";
    }
    /**
     * æ£€æŸ¥æ–‡ä»¶æ˜¯å¦ä¸ºæ”¯æŒçš„Word格式
     */
    public static boolean isSupportedWordFormat(String filePath) {
        if (filePath == null) return false;
        String fileName = filePath.toLowerCase();
        return fileName.endsWith(".doc") || fileName.endsWith(".docx");
    }
}
ruoyi-admin/src/main/java/com/ruoyi/web/controller/common/SmsController.java
@@ -9,7 +9,9 @@
import com.ruoyi.framework.config.ServerConfig;
import com.smartor.domain.HtmlContentVO;
import com.smartor.domain.ServiceOutPath;
import com.smartor.domain.ServiceTask;
import com.smartor.domain.smsVO;
import com.smartor.mapper.ServiceTaskMapper;
import com.smartor.service.IServiceOutPathService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
@@ -50,6 +52,9 @@
    @Autowired
    private IServiceOutPathService iServiceOutPathService;
    @Autowired
    private ServiceTaskMapper serviceTaskMapper;
    /**
     * @param
@@ -58,9 +63,10 @@
    @ApiOperation("短信发送")
    @PostMapping("/send")
    public AjaxResult send(@RequestBody smsVO vo) {
        String sendMsg=smsUtils.sendSms(xhsmsPath,xhsmsAccount,xhsmsPwd,vo.getPhone(),vo.getContent());
        String sendMsg = smsUtils.sendSms(xhsmsPath, xhsmsAccount, xhsmsPwd, vo.getPhone(), vo.getContent());
        return AjaxResult.success(sendMsg);
    }
    /**
     * @param
     * @return
@@ -83,13 +89,19 @@
        serviceOutPath.setRadix(format);
        serviceOutPath.setUpdateTime(new Date());
        iServiceOutPathService.updateServiceOutPath(serviceOutPath);
        String url=ip + ":" + req_path + "/wt?p=" + format;
        String url = ip + ":" + req_path + "/wt?p=" + format;
        ServiceTask serviceTask = serviceTaskMapper.selectServiceTaskByTaskid(Long.valueOf(taskId));
        //如果type是语音随访的话(说明补偿发送方式中有电话随访的方式,这里的外链就地址只能用/sf)
        if (serviceTask.getType().equals("1")) {
            url = ip + ":" + req_path + "/sf?p=" + format;
        }
        //String url = = ip + ":" + req_path + "/outsideChainwt?param1=" + taskId + "&param2=" + patid + "&param3=" + URLEncoder.encode(vo.getTaskName(), StandardCharsets.UTF_8.toString()) + "&param5=false";
        String content="您好,邀请您填写出院调查表,请点击" + url + "填写。感谢您配合!";
        String content = "您好,邀请您填写出院调查表,请点击" + url + "填写。感谢您配合!";
        String sendMsg=smsUtils.sendSms(xhsmsPath,xhsmsAccount,xhsmsPwd,vo.getPhone(),content);
        String sendMsg = smsUtils.sendSms(xhsmsPath, xhsmsAccount, xhsmsPwd, vo.getPhone(), content);
        return AjaxResult.success(sendMsg);
    }
}
ruoyi-admin/src/main/java/com/ruoyi/web/controller/smartor/BaseDictOperationController.java
@@ -2,6 +2,8 @@
import java.util.List;
import com.ruoyi.common.core.domain.entity.SysUser;
import com.ruoyi.common.core.domain.model.LoginUser;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
@@ -47,6 +49,9 @@
    @PostMapping("/list")
    public TableDataInfo list(@RequestBody BaseDictOperation baseDictOperation) {
        startPage();
        LoginUser loginUser = getLoginUser();
        SysUser user = loginUser.getUser();
        baseDictOperation.setOrgid(user.getOrgid());
        List<BaseDictOperation> list = baseDictOperationService.selectBaseDictOperationList(baseDictOperation);
        return getDataTable(list);
    }
ruoyi-admin/src/main/java/com/ruoyi/web/controller/smartor/PatArchiveController.java
@@ -25,6 +25,7 @@
import javax.servlet.http.HttpServletResponse;
import java.util.List;
import java.util.Map;
import java.util.concurrent.Executor;
import java.util.concurrent.Executors;
@@ -249,8 +250,9 @@
     */
    @ApiOperation("获取患者信息")
    @PostMapping("/getPatientInfoQC")
    public TableDataInfo getPatientInfoQC(@RequestBody PatArchiveReq patArchiveReq) {
        PageUtils.startPageByPost(patArchiveReq.getPageNum(), patArchiveReq.getPageSize());
    public Map<String, Object> getPatientInfoQC(@RequestBody PatArchiveReq patArchiveReq) {
        patArchiveReq.setPageNum(PageUtils.getOffset(patArchiveReq.getPageNum(), patArchiveReq.getPageSize()));
        LoginUser loginUser = getLoginUser();
        SysUser user = loginUser.getUser();
        patArchiveReq.setOrgid(user.getOrgid());
@@ -261,13 +263,18 @@
            patArchiveReq.setLeaveldeptcodes(null);
        }
        List<PatArchiveOthreInfo> patientInfo = patArchiveService.getPatientInfoQC(patArchiveReq);
        long count = PageUtils.count(new ISelect() {
            @Override
            public void doSelect() {
                patArchiveService.getPatientInfoQC(patArchiveReq);
            }
        });
        return getDataTable2(count, patientInfo);
        patArchiveReq.setPageSize(null);
        patArchiveReq.setPageNum(null);
        List<PatArchiveOthreInfo> patientInfoQC = patArchiveService.getPatientInfoQC(patArchiveReq);
//        long count = PageUtils.count(new ISelect() {
//            @Override
//            public void doSelect() {
//                patArchiveService.getPatientInfoQC(patArchiveReq);
//            }
//        });
        return getDataTable3(patientInfoQC.size(), patientInfo);
    }
}
ruoyi-admin/src/main/java/com/ruoyi/web/controller/smartor/ServiceExternalController.java
@@ -5,7 +5,6 @@
import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.utils.DtoConversionUtils;
import com.ruoyi.system.service.ISysConfigService;
import com.smartor.domain.*;
import com.smartor.service.IServiceExternalService;
import com.smartor.service.IServiceSubtaskDetailService;
@@ -38,8 +37,6 @@
    private IServiceExternalService serviceExternalService;
    @Autowired
    private ISvyTaskSingleService svyTaskSingleService;
    @Autowired
    private ISysConfigService configService;
    /**
     * é€šç”¨æŽ¥å£
@@ -86,10 +83,6 @@
        log.info("------serviceQueryInfo的入参为:{}", serviceQueryInfo);
        Map map = null;
        try {
            String url = configService.selectConfigByKey("token.360",serviceQueryInfo.getXiaoXiTou().getFaSongJGID());
            serviceQueryInfo.setUrl(url);
           String url360 = configService.selectConfigByKey("url.360",serviceQueryInfo.getXiaoXiTou().getFaSongJGID());
            serviceQueryInfo.setUrl360(url360);
            map = svyTaskSingleService.query360PatInfo(serviceQueryInfo);
        } catch (Exception e) {
            e.printStackTrace();
ruoyi-admin/src/main/java/com/ruoyi/web/controller/smartor/ServiceSLTDHealthcareRecordController.java
@@ -2,6 +2,7 @@
import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.domain.AjaxResult;
import com.smartor.domain.ServiceSLTDDeptReqVO;
import com.smartor.domain.ServiceSLTDInhospReqVO;
import com.smartor.domain.ServiceSLTDInhospResDTO;
import com.smartor.service.IServiceSLTDHealthcareRecordService;
@@ -70,4 +71,24 @@
            return AjaxResult.error("查询健康记录失败:" + e.getMessage());
        }
    }
    /**
     * é‡‡é›†ç§‘室病区信息
     */
    @ApiOperation("采集科室病区信息")
    @PostMapping("/queryDeptWardAreaInfoList")
    public AjaxResult queryDeptWardAreaInfoList(@RequestBody ServiceSLTDDeptReqVO reqVO) {
        try {
            log.info("【queryHealthcareRecordList】接收到查询请求,参数:{}", reqVO);
            Boolean b = serviceSLTDHealthcareRecordService.queryDeptWardAreaInfoList(reqVO);
            log.info("【queryHospUserInfoList】查询成功,是否成功:{}", b);
            return AjaxResult.success(b);
        } catch (Exception e) {
            log.error("【queryHospUserInfoList】查询异常,请求参数:{}", reqVO, e);
            return AjaxResult.error("查询健康记录失败:" + e.getMessage());
        }
    }
}
ruoyi-admin/src/main/java/com/ruoyi/web/controller/smartor/ServiceSubtaskAnswerController.java
@@ -6,6 +6,7 @@
import com.ruoyi.common.core.domain.entity.SysUser;
import com.ruoyi.common.core.page.TableDataInfo;
import com.ruoyi.common.enums.BusinessType;
import com.ruoyi.common.utils.RSAPublicKeyExample;
import com.ruoyi.common.utils.poi.ExcelUtil;
import com.smartor.domain.*;
import com.smartor.service.IServiceSubtaskAnswerService;
@@ -14,6 +15,7 @@
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.ObjectUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.*;
@@ -33,6 +35,10 @@
public class ServiceSubtaskAnswerController extends BaseController {
    @Autowired
    private IServiceSubtaskAnswerService serviceSubtaskAnswerService;
    @Value("${pri_key}")
    private String pri_key;
    /**
     * æŸ¥è¯¢ä»»åŠ¡é—®å·é—®é¢˜é€‰é¡¹åˆ—è¡¨
@@ -90,6 +96,7 @@
    @ApiOperation("修改任务问卷问题选项")
    @PostMapping("/edit")
    public AjaxResult edit(@RequestBody ServiceSubtaskAnswer serviceSubtaskAnswer) {
        log.info("【saveQuestionCache-----edit】的入参为:{}", serviceSubtaskAnswer);
        return toAjax(serviceSubtaskAnswerService.updateServiceSubtaskAnswer(serviceSubtaskAnswer));
    }
@@ -101,13 +108,14 @@
    @ApiOperation("删除任务问卷问题选项")
    @DeleteMapping("/remove/{ids}")
    public AjaxResult remove(@PathVariable Long[] ids) {
        log.info("【saveQuestionCache-----remove】的入参为:{}", ids);
        return toAjax(serviceSubtaskAnswerService.deleteServiceSubtaskAnswerByIds(ids));
    }
    @ApiOperation("患者问题结果记录(外链)")
    @PostMapping("/saveQuestionAnswer")
    public AjaxResult saveQuestionAnswer(@RequestBody ServiceSubTaskAnswerReq serviceSubTaskAnswerReq) {
        log.info("-----saveQuestionAnswer方法的入参为:{}", serviceSubTaskAnswerReq);
        log.info("【saveQuestionCache-----saveQuestionAnswer】的入参为:{}", serviceSubTaskAnswerReq);
        return toAjax(serviceSubtaskAnswerService.saveQuestionAnswer(serviceSubTaskAnswerReq, 0L));
    }
@@ -115,6 +123,7 @@
    @ApiOperation("患者问题结果记录缓存(小程序外链)")
    @PostMapping("/saveQuestionCacheXCH")
    public AjaxResult saveQuestionCacheXCH(@RequestBody ServiceSubTaskCacheReq serviceSubTaskCacheReq) {
        log.info("【saveQuestionCache-----saveQuestionCacheXCH】的入参为:{}", serviceSubTaskCacheReq);
        return toAjax(serviceSubtaskAnswerService.saveQuestionCache(serviceSubTaskCacheReq, 1L));
    }
@@ -122,26 +131,28 @@
    @ApiOperation("患者问题结果记录(小程充外链)")
    @PostMapping("/saveQuestionAnswerXCH")
    public AjaxResult saveQuestionAnswerXCH(@RequestBody ServiceSubTaskAnswerReq serviceSubTaskAnswerReq) {
        log.info("-------saveQuestionAnswerXCH的入参的值为:{}", serviceSubTaskAnswerReq);
        log.info("【saveQuestionCache-----saveQuestionAnswerXCH】的入参为:{}", serviceSubTaskAnswerReq);
        return toAjax(serviceSubtaskAnswerService.saveQuestionAnswer(serviceSubTaskAnswerReq, 1L));
    }
    @ApiOperation("获取患者问题结果记录缓存(小程序外链)")
    @PostMapping("/getQuestionCacheXCH")
    public AjaxResult getQuestionCacheXCH(@RequestBody ServiceSubTaskCacheReq serviceSubTaskCacheReq) {
        log.info("【saveQuestionCache-----getQuestionCacheXCH】的入参为:{}", serviceSubTaskCacheReq);
        return AjaxResult.success(serviceSubtaskAnswerService.getQuestionCache(serviceSubTaskCacheReq, 1L));
    }
    @ApiOperation("患者问题结果记录缓存(外链)")
    @PostMapping("/saveQuestionCache")
    public AjaxResult saveQuestionCache(@RequestBody ServiceSubTaskCacheReq serviceSubTaskCacheReq) {
        log.info("serviceSubTaskCacheReq的入参为:{}", serviceSubTaskCacheReq);
        log.info("【saveQuestionCache-----saveQuestionCache】的入参为:{}", serviceSubTaskCacheReq);
        return toAjax(serviceSubtaskAnswerService.saveQuestionCache(serviceSubTaskCacheReq, 0L));
    }
    @ApiOperation("获取患者问题结果记录缓存(外链)")
    @PostMapping("/getQuestionCache")
    public AjaxResult getQuestionCache(@RequestBody ServiceSubTaskCacheReq serviceSubTaskCacheReq) {
        log.info("【saveQuestionCache-----getQuestionCache】的入参为:{}", serviceSubTaskCacheReq);
        return AjaxResult.success(serviceSubtaskAnswerService.getQuestionCache(serviceSubTaskCacheReq, 0L));
    }
@@ -149,7 +160,21 @@
    @ApiOperation("医生查询患者问题结果(外链)")
    @PostMapping("/selectPatQuestionResult")
    public AjaxResult selectPatQuestionResult(@RequestBody ServiceSubTaskQueryReq serviceSubTaskQueryReq) {
        log.info("【saveQuestionCache-----selectPatQuestionResult】的入参为:{}", serviceSubTaskQueryReq);
        return AjaxResult.success(serviceSubtaskAnswerService.selectPatQuestionResult(serviceSubTaskQueryReq));
    }
    @ApiOperation("患者满意度结果记录(外链)")
    @PostMapping("/saveMYDQuestionAnswer")
    public AjaxResult saveMYDQuestionAnswer(@RequestBody ServiceSubTaskMYDAnswerReq serviceSubTaskAnswerReq) {
        log.info("【saveQuestionCache-----saveMYDQuestionAnswer】的入参为:{}", serviceSubTaskAnswerReq);
        RSAPublicKeyExample rsaPublicKeyExample = new RSAPublicKeyExample();
        String taskId = rsaPublicKeyExample.decryptedData(serviceSubTaskAnswerReq.getTaskId(), pri_key);
        String serialnum = rsaPublicKeyExample.decryptedData(serviceSubTaskAnswerReq.getSerialnum(), pri_key);
        serviceSubTaskAnswerReq.setTaskId(taskId);
        serviceSubTaskAnswerReq.setSerialnum(serialnum);
        return toAjax(serviceSubtaskAnswerService.saveMYDQuestionAnswer(serviceSubTaskAnswerReq));
    }
}
ruoyi-admin/src/main/java/com/ruoyi/web/controller/smartor/ServiceSubtaskController.java
@@ -85,7 +85,6 @@
            }
        });
        return getDataTable2(total, list);
//        return getDataTable(serviceSubtaskService.patItem(ivrTaskcall));
    }
@@ -111,8 +110,6 @@
            }
        }
        ExcelUtil<ServiceSubtaskExprot> util = new ExcelUtil<ServiceSubtaskExprot>(ServiceSubtaskExprot.class);
        util.exportExcel(response, serviceSubtaskExprots, "患者随访信息表单");
    }
@@ -265,8 +262,6 @@
    @PostMapping("/phoneCallBackYQ")
    public PhoneCallBackYQVO phoneCallBackYQ(@RequestBody PhoneCallReqYQVO phoneCallReqYQVO) {
        log.info("电话ASR通话回调(雨绮) ï¼Ÿ{}", phoneCallReqYQVO);
//        SysUser user = getLoginUser().getUser();
//        phoneCallReqYQVO.setOrgid(user.getOrgid());
        PhoneCallBackYQVO phoneCallBackYQVO = serviceSubtaskService.phoneCallBackYQ(phoneCallReqYQVO);
        return phoneCallBackYQVO;
    }
ruoyi-admin/src/main/java/com/ruoyi/web/controller/smartor/ServiceTaskController.java
@@ -25,6 +25,7 @@
import javax.servlet.http.HttpServletResponse;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
/**
@@ -232,4 +233,31 @@
        return success(serviceTaskService.getScriptInfoByCondition(tid, pid, true, serviceTaskScriptQues.getPatfrom()));
    }
    /**
     * é€šè¿‡ä»»åŠ¡ID和患者ID获取单个人的题目信息
     *
     * @return
     */
    @ApiOperation("通过任务ID和诊疗记录号获取单个人的题目信息")
    @PostMapping("/getScriptByCondition")
    public AjaxResult getScriptByCondition(@RequestBody ServiceTaskScriptQues serviceTaskScriptQues) {
        RSAPublicKeyExample rsaPublicKeyExample = new RSAPublicKeyExample();
        Long taskId = Long.valueOf(rsaPublicKeyExample.decryptedData(serviceTaskScriptQues.getParam1(), pri_key));
        String zyserialnum = null;
        String mzserialnum = null;
        String tsserialnum = null;
        if (StringUtils.isNotEmpty(serviceTaskScriptQues.getParam2()))
            zyserialnum = rsaPublicKeyExample.decryptedData(serviceTaskScriptQues.getParam2(), pri_key);
        if (StringUtils.isNotEmpty(serviceTaskScriptQues.getParam3()))
            mzserialnum = rsaPublicKeyExample.decryptedData(serviceTaskScriptQues.getParam3(), pri_key);
        if (StringUtils.isNotEmpty(serviceTaskScriptQues.getParam4()))
            tsserialnum = rsaPublicKeyExample.decryptedData(serviceTaskScriptQues.getParam4(), pri_key);
        Map<String, Object> scriptByCondition = serviceTaskService.getScriptByCondition(taskId, zyserialnum, mzserialnum, tsserialnum);
        scriptByCondition.put("zy", serviceTaskScriptQues.getParam2());
        scriptByCondition.put("mz", serviceTaskScriptQues.getParam3());
        scriptByCondition.put("tid", serviceTaskScriptQues.getParam1());
        return success(scriptByCondition);
    }
}
ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysLoginController.java
@@ -1,13 +1,11 @@
package com.ruoyi.web.controller.system;
import com.ruoyi.common.annotation.IpWhitelist;
import com.ruoyi.common.constant.Constants;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.core.domain.entity.SysMenu;
import com.ruoyi.common.core.domain.entity.SysUser;
import com.ruoyi.common.core.domain.entity.SysUserDept;
import com.ruoyi.common.core.domain.model.LoginBody;
import com.ruoyi.common.core.domain.model.LoginUser;
import com.ruoyi.common.exception.base.BaseException;
import com.ruoyi.common.utils.RSAPublicKeyExample;
import com.ruoyi.common.utils.SecurityUtils;
@@ -18,6 +16,7 @@
import com.ruoyi.system.service.ISysDeptService;
import com.ruoyi.system.service.ISysMenuService;
import com.smartor.mapper.SysUserDeptMapper;
import com.smartor.service.impl.ServiceSLTDHealthcareRecordServiceImpl;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
@@ -27,7 +26,9 @@
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
/**
@@ -60,6 +61,14 @@
    @Value("${isEncryp}")
    private Integer isEncryp;
    @Value("${sltd_pub_path}")
    private String sltdPubPath;
    @Value("${spring.profiles.active}")
    private String active;
    @Autowired
    private SysUserDeptMapper sysUserDeptMapper;
@@ -81,31 +90,64 @@
    /**
     * å•点登录方法(需要配置IP白名单)
     * éœ€è¦åœ¨sys_config表的sys.ip.whitelis中,加入IP才能访问该方法
     * <p>
     * å‚数同时为空,不给查询数据
     * <p>
     * ã€å…¥å‚规则】
     * å¦‚æžœuserName不为空,那orgid也不能为空
     * å¦‚果上面两个为空,那token不能为空
     *
     * @return ç»“æžœ
     */
    @IpWhitelist
//    @IpWhitelist
    @GetMapping("/SSOLogin")
    public RedirectView SSOLogin(@RequestParam String userName, @RequestParam String orgid, @RequestParam(required = false) String deptId) {
    public RedirectView SSOLogin(@RequestParam(required = false) String userName, @RequestParam(required = false) String orgid, @RequestParam(required = false) String deptId, @RequestParam(required = false) String token) {
        if (StringUtils.isEmpty(userName) && StringUtils.isEmpty(token)) {
            throw new BaseException("参数不能为空");
        }
        log.info("--------进方法了吗?{}", token);
        // é‡å®šå‘地址对象(重定向地址
        RedirectView redirectView = new RedirectView();
//        if (active.equals("sltd")) {
//            Map<String, String> headers = buildRequestHeaders();
//            Map<String, String> requestParams = new HashMap<>();
//            requestParams.put("token", token);
//            String reqData = HttpUtil.postFormRequest(sltdPubPath + "/checkSsoTokenId", requestParams, headers, null);
//            log.info("【-----返回的结果为】:{}", reqData);
//            if (StringUtils.isEmpty(reqData)) {
//                throw new BaseException("token验证失败");
//            }
//
//            Map<String, Object> map = JSONObject.parseObject(reqData, Map.class);
//            if (ObjectUtils.isEmpty(map) || (Integer) map.get("code") != 200) {
//                throw new BaseException("token验证失败");
//            }
//
//            Map<String, Object> data = (Map<String, Object>) map.get("data");
//            //员工编码
//            userName = (String) data.get("accountNo");
//        }
        log.info("【-----------userName的值为:{}】", userName);
        // ç”Ÿæˆä»¤ç‰Œ
        if (StringUtils.isEmpty(userName) || StringUtils.isEmpty(orgid)) {
            throw new BaseException("用户名或组织机构或部门不能为空");
        }
        if (isEncryp == 1) {
        if (isEncryp != null && isEncryp == 1) {
            RSAPublicKeyExample rsaPublicKeyExample = new RSAPublicKeyExample();
            userName = rsaPublicKeyExample.decryptedData(userName, pri_key);
        }
        String token = loginService.loginByUserName(userName + "&" + orgid + "&" + deptId);
        if (StringUtils.isEmpty(token)) {
        String token2 = loginService.loginByUserName(userName + "&" + orgid + "&" + deptId);
        if (StringUtils.isEmpty(token2)) {
            throw new BaseException("登陆失败");
        }
        String path = sysConfigService.selectConfigByKey("sys.qddz");
        if(StringUtils.isEmpty(path)){
        if (StringUtils.isEmpty(path)) {
            throw new BaseException("请配置前端地址");
        }
        log.info("单点登陆重定向地址为:{}",path + "/loginSSO?token=" + token + "&orgid=" + orgid + "&orgname=''" + "&ZuHuID=''&deptCode=''");
        redirectView.setUrl(path + "/loginSSO?token=" + token + "&orgid=" + orgid + "&orgname=null" + "&ZuHuID=null&deptCode=null");
        log.info("单点登陆重定向地址为:{}", path + "/loginSSO?token=" + token2 + "&orgid=" + orgid + "&orgname=''" + "&ZuHuID=''&deptCode=''");
        redirectView.setUrl(path + "/loginSSO?token=" + token2 + "&orgid=" + orgid + "&orgname=null" + "&ZuHuID=null&deptCode=null");
        redirectView.setStatusCode(HttpStatus.MOVED_PERMANENTLY);
        return redirectView;
    }
@@ -171,4 +213,12 @@
    public AjaxResult getDept(@PathVariable String orgid) {
        return AjaxResult.success(sysDeptService.selectDept(orgid));
    }
    private Map<String, String> buildRequestHeaders() {
        Map<String, String> headers = new HashMap<>();
//        headers.put("Content-Type", "application/json");
        headers.put("app-key", ServiceSLTDHealthcareRecordServiceImpl.APP_KEY);
        return headers;
    }
}
ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysRoleController.java
@@ -4,6 +4,7 @@
import javax.servlet.http.HttpServletResponse;
import com.ruoyi.common.core.domain.entity.SysUserRole;
import com.ruoyi.common.utils.SecurityUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.validation.annotation.Validated;
@@ -53,7 +54,7 @@
    @Autowired
    private ISysDeptService deptService;
    @Value("${isAdmin}")
    private List<Long> isAdmin;
@@ -61,6 +62,8 @@
    @GetMapping("/list")
    public TableDataInfo list(SysRole role) {
        startPage();
        SysUser user = SecurityUtils.getLoginUser().getUser();
        role.setOrgid(user.getOrgid());
        List<SysRole> list = roleService.selectRoleList(role);
        return getDataTable(list);
    }
ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysUserController.java
@@ -65,6 +65,9 @@
    @GetMapping("/list")
    public TableDataInfo list(SysUser user) {
        startPage();
        LoginUser loginUser = getLoginUser();
        String orgid = loginUser.getUser().getOrgid();
        user.setOrgid(orgid);
        List<SysUser> list = userService.selectUserList(user);
        return getDataTable(list);
    }
ruoyi-admin/src/main/java/com/ruoyi/web/test/MQTest.java
@@ -65,7 +65,7 @@
    @Test
    public void cc() {
        RSAPublicKeyExample rsaPublicKeyExample = new RSAPublicKeyExample();
        String s = rsaPublicKeyExample.encryptedData("1012320966", "MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBALQzqW1EIXBKGMu+2oEYSB5gM7Ox/ihyYTeeoE0yPX1qtt4++5yNOeTBVd6EEM4iKzVEzWj6REIWVwaSNPn/SvUCAwEAAQ==");
        String s = rsaPublicKeyExample.encryptedData("20250815001094", "MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBALQzqW1EIXBKGMu+2oEYSB5gM7Ox/ihyYTeeoE0yPX1qtt4++5yNOeTBVd6EEM4iKzVEzWj6REIWVwaSNPn/SvUCAwEAAQ==");
        System.out.println("加密结果为:" + s);
        String s1 = rsaPublicKeyExample.decryptedData(s, "MIIBUwIBADANBgkqhkiG9w0BAQEFAASCAT0wggE5AgEAAkEAtDOpbUQhcEoYy77agRhIHmAzs7H+KHJhN56gTTI9fWq23j77nI055MFV3oQQziIrNUTNaPpEQhZXBpI0+f9K9QIDAQABAkB3n0fcWfrcoMN/FU3VnrnZOEF6CzFNxkgU9P8y36QECWKZ9JhYQkNpKrMC9oXlN3VSaRigV7B+L/I/a0Rs1W+tAiEA4jx7xcXJ4y4BNwAmVHt6NNiEkzIwWnwC/0qsEu8NsOsCIQDL6MMn1D2uznC6OuOWpxDCkBh1JL1NzZTZeH2G+hj7nwIgKGAC9tjFnvWm4dn0/T7MIIJDpsFeP8fCAS2iZ/6hwuECIAS/eLvWr1EAsZNEh8QcQ8GkBU3E+ztyjAK8UX/xFt/VAiBf79/1tDErX4/DChecM8w3c3DhbBcjuE3fHZn7p6/UKg==");
        System.out.println("解密结果为:"+s1);
ruoyi-admin/src/main/resources/application-druid.yml
@@ -29,15 +29,19 @@
        #        driverClassName: com.mysql.cj.jdbc.Driver
        #  å…¬å¸äº‘
#        url: jdbc:mysql://116.62.18.175:6002/smartor_xinhua?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
#        username: hxsoft
#        password: Hxerp2000
#        driverClassName: com.mysql.cj.jdbc.Driver
        #        url: jdbc:mysql://116.62.18.175:6002/smartor_lishui?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
        #        username: hxsoft
        #        password: Smartor.2023
        #        driverClassName: com.mysql.cj.jdbc.Driver
        #  å…¬å¸æœ¬åœ°
        url: jdbc:mysql://haiershi.a1.luyouxia.net:23844/smartor_lishui?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
        username: smartor
        password: Smartor.2023
        driverClassName: com.mysql.cj.jdbc.Driver
      #        url: jdbc:mysql://127.0.0.1:2881/smartor-lisui?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
      #        username: root@sys
      #        password:
      #        driverClassName: com.mysql.cj.jdbc.Driver
      #        # é«˜æ–¯æ•°æ®åº“配置
      #        url: jdbc:postgresql://127.0.0.1:5432/smartorlishui
@@ -58,11 +62,11 @@
      #        password: Smartor.2023
      #        driverClassName: com.mysql.cj.jdbc.Driver
      # ä»Žæ•°æ®æºå¼€å…³/默认关闭(公司)
#       enabled: true
#       url: jdbc:sqlserver://116.62.18.175:6001;DatabaseName=iv-ywey;encrypt=false;SelectMethod=cursor
#       username: sa
#       password: Hxerp2000
#       driverClassName: com.microsoft.sqlserver.jdbc.SQLServerDriver
      #       enabled: true
      #       url: jdbc:sqlserver://116.62.18.175:6001;DatabaseName=iv-ywey;encrypt=false;SelectMethod=cursor
      #       username: sa
      #       password: Hxerp2000
      #       driverClassName: com.microsoft.sqlserver.jdbc.SQLServerDriver
      # ä»Žæ•°æ®æºå¼€å…³/默认关闭(义乌二院)
      # enabled: true
@@ -113,7 +117,7 @@
            multi-statement-allow: true
  # redis é…ç½®
  redis:
    host: 192.168.100.10
    host: 127.0.0.1
    port: 6020
    database: 0
    password: Smartor
@@ -140,6 +144,7 @@
  sql-column-case: camel
  show-sql: true #配置打印SQL
  page-config:
    enabled: false  #禁用分页
    size: size
    page: page
    default-page: 1
@@ -202,9 +207,9 @@
#新华医院外链请求IP和端口号
req_path: 8093
#localIP: https://wx.lihusmart.com
localIP: https://wx.lihusmart.com
#丽水外链请求IP和端口号
localIP: http://221.12.19.26
#localIP: http://221.12.19.26
#获取患者信息URL(华卓提供)
hosp_info_url: http://esb-core-rest.wowjoy.cn/esb/exchange
@@ -213,9 +218,9 @@
uploadSwitch: 0
#  æŒ‡å®šasr回调的url路径(本地)
ASRCallBackPath: http://192.168.100.10:8095/smartor/serviceSubtask/phoneCallBackYQ
ASRCallBackPath: http://192.168.100.127:8095/smartor/serviceSubtask/phoneCallBackYQ
#挂断IP(本地)
hangup: http://192.168.100.6:8089/hangup
hangup: http://192.168.100.33:5060/hangup
#fs所使用的阿里的app_key(本地)
app_key_yq: ZurNHpaQLq6P55YS
@@ -267,6 +272,11 @@
isAdmin: 1,2,3,4,5,6,7,8,9,10,11,12,13
#随访医院:1新华   2丽水
visitHosp: 2
visitHosp: 1
isEncryp:
isEncryp:
dealDeptCode:
# å‰ç«¯ip
qdip: 192.168.100.132
ruoyi-admin/src/main/resources/application-sltd.yml
@@ -231,8 +231,8 @@
#admin管理员userId
isAdmin: 1,2,3,4,5,6,7,8,9,10,11,12,13
#随访医院:1新华   2丽水    3省立同德
visitHosp: 3
#随访医院:1新华   2丽水   3市一   4省立同德
visitHosp: 4
#用户默认密码
userPwd: sltd@0230
@@ -244,3 +244,4 @@
#是否加密  0不加   1加密
isEncryp: 0
ruoyi-admin/src/main/resources/application.yml
@@ -74,7 +74,7 @@
    # å›½é™…化资源文件路径
    basename: i18n/messages
  profiles:
    active: hzszlyy
    active: druid
  # æ–‡ä»¶ä¸Šä¼ 
  servlet:
    multipart:
@@ -137,6 +137,10 @@
    redirect_uri: "http://172.20.111.142:8096/login"
  state: "smartor"  # ä½ ä»¬ç³»ç»Ÿæ ‡è¯†
  scope: "openid%20roles%20profile"
  #单点登陆白名单IP配置
  whitelist:
    ips:
# é˜²æ­¢XSS攻击
xss:
ruoyi-admin/src/main/resources/mybatis/mybatis-config.xml
@@ -12,7 +12,7 @@
        <!-- é…ç½®é»˜è®¤çš„æ‰§è¡Œå™¨.SIMPLE就是普通执行器;REUSE执行器会重用预处理语句(prepared statements);BATCH执行器将重用语句并执行批量更新 -->
        <setting name="defaultExecutorType" value="SIMPLE"/>
        <!-- æŒ‡å®š MyBatis æ‰€ç”¨æ—¥å¿—的具体实现 -->
<!--        <setting name="logImpl" value="STDOUT_LOGGING"/>-->
        <setting name="logImpl" value="STDOUT_LOGGING"/>
        <!-- ä½¿ç”¨é©¼å³°å‘½åæ³•转换字段 -->
        <!-- <setting name="mapUnderscoreToCamelCase" value="true"/> -->
    </settings>
ruoyi-common/src/main/java/com/ruoyi/common/core/controller/BaseController.java
@@ -3,6 +3,8 @@
import java.beans.PropertyEditorSupport;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -94,6 +96,14 @@
        rspData.setTotal(total);
        return rspData;
    }
    protected Map<String,Object> getDataTable3(long total, List<?> list) {
        Map<String,Object> rspData = new TreeMap<>();
        rspData.put("code",HttpStatus.SUCCESS);
        rspData.put("msg","查询成功");
        rspData.put("rows",list);
        rspData.put("total",total);
        return rspData;
    }
    /**
     * è¿”回成功
ruoyi-common/src/main/java/com/ruoyi/common/core/redis/RedisCache.java
@@ -30,6 +30,10 @@
        redisTemplate.opsForValue().set(key, value);
    }
    public <T> void setCacheList(final String key, final List<T> values) {
        redisTemplate.opsForList().rightPushAll(key, values);
    }
    /**
     * ç¼“存基本的对象,Integer、String、实体类等
     *
@@ -299,4 +303,13 @@
    public Collection<String> keys(final String pattern) {
        return redisTemplate.keys(pattern);
    }
    /**
     * èŽ·å–å½“å‰key值的数量
     * @param key
     * @return
     */
    public Long getListSize(String key) {
        return redisTemplate.opsForList().size(key);
    }
}
ruoyi-common/src/main/java/com/ruoyi/common/enums/ServiceFromEnum.java
@@ -4,7 +4,7 @@
 * å‘送类型枚举
 */
public enum ServiceFromEnum {
    DMT(1, "多媒体"),
    RG(1, "人工"),
    ZZ(2, "纸质"),
    DH(3, "电话"),
    DX(4, "短信"),
ruoyi-common/src/main/java/com/ruoyi/common/enums/VisitSendStateEnum.java
ÎļþÒÑɾ³ý
ruoyi-common/src/main/java/com/ruoyi/common/utils/HttpUtil.java
@@ -106,11 +106,23 @@
            httpMethod.setRequestEntity(entity);
            int resultCode = httpClient.executeMethod(httpMethod);
            // èŽ·å–å“åº”å¤´çš„å­—ç¬¦ç¼–ç 
            String contentType = httpMethod.getResponseHeader("Content-Type") == null ?
                    null : httpMethod.getResponseHeader("Content-Type").getValue();
            String charset = "UTF-8"; // é»˜è®¤ä½¿ç”¨UTF-8
            if (contentType != null && contentType.contains("charset=")) {
                String[] parts = contentType.split("charset=");
                if (parts.length > 1) {
                    charset = parts[1].split(";")[0].trim();
                }
            }
            InputStream inputStream = httpMethod.getResponseBodyAsStream();
            if (inputStream == null) {
                throw new HttpRequestException(RESPONSE_NULL_ERROR_CODE, "响应为null");
            }
            BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
            BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream,charset));
            StringBuffer stringBuffer = new StringBuffer();
            String str = "";
            while ((str = reader.readLine()) != null) {
ruoyi-common/src/main/java/com/ruoyi/common/utils/PageUtils.java
@@ -38,4 +38,14 @@
    public static void clearPage() {
        PageHelper.clearPage();
    }
    /**
     * è®¡ç®—偏移量
     */
    public static Integer getOffset(Integer pageNum, Integer pageSize) {
        if (pageNum == null) pageNum = 1;
        if (pageSize == null) pageSize = 10;
        return (pageNum - 1) * pageSize;
    }
}
ruoyi-framework/src/main/java/com/ruoyi/framework/config/SecurityConfig.java
@@ -109,9 +109,8 @@
                .authorizeRequests()
                // å¯¹äºŽç™»å½•login æ³¨å†Œregister éªŒè¯ç captchaImage å…è®¸åŒ¿åè®¿é—®
                .antMatchers("/login", "/register", "/captchaImage", "/qrcode/generateStaticHtml", "/qrcode/getQRcode", "/qrcode/getFormDate", "/chat", "/system/file/admin/uploadFile", "/smartor/dingtalk/sendNotification", "/patient/read/patientInfo", "/socket", "/API_ESB_Service", "/API_ESB_Service/Run", "/magic/web/**", "/smartor/serviceSubtask/phoneCallBack", "/smartor/serviceSubtask/taskPull", "/smartor/serviceSubtask/phoneCallBackYQ", "/smartor/robot/callstatus", "/smartor/robot/aidialog", "/smartor/robot/cdrinfo", "/getToken", "/smartor/subtaskAnswer/getQuestionCache", "/smartor/subtaskAnswer/saveQuestionCache", "/smartor/servicetask/getScriptInfoByCondition", "/smartor/subtaskAnswer/saveQuestionAnswer", "/smartor/import/download", "/smartor/serviceSubtask/recordAccept", "/smartor/outPath/getInfoByParam", "/smartor/serviceExternal/addDeptInfo", "/smartor/serviceExternal/**", "/sso/**","/smartor/sltdHealthcareRecord/**","/smartor/servicetask/getScriptByCondition","/smartor/subtaskAnswer/saveMYDQuestionAnswer").permitAll()
                .antMatchers(HttpMethod.GET, "/SSOLogin/**").permitAll()
                // é™æ€èµ„源,可匿名访问
                .antMatchers(HttpMethod.GET, "/", "/*.html", "/**/*.html", "/**/*.css", "/**/*.js", "/profile/**","/getDept/*").permitAll().antMatchers("/swagger-ui.html", "/swagger-resources/**", "/webjars/**", "/*/api-docs", "/druid/**").permitAll()
                .antMatchers(HttpMethod.GET, "/", "/*.html", "/**/*.html", "/**/*.css", "/**/*.js", "/profile/**","/getDept/*","/SSOLogin/**").permitAll().antMatchers("/swagger-ui.html", "/swagger-resources/**", "/webjars/**", "/*/api-docs", "/druid/**").permitAll()
                .antMatchers("/smartor/organization/list").permitAll()
                // é™¤ä¸Šé¢å¤–的所有请求全部需要鉴权认证
                .anyRequest().authenticated().and().headers().frameOptions().disable();
ruoyi-framework/src/main/java/com/ruoyi/framework/interceptor/HospitalFilterInterceptor.java
@@ -12,8 +12,6 @@
import org.springframework.stereotype.Component;
import java.sql.Connection;
import java.util.ArrayList;
import java.util.List;
import java.util.Properties;
import static com.ruoyi.common.utils.SecurityUtils.getLoginUser;
@@ -44,13 +42,6 @@
        // èŽ·å–åŽŸå§‹ SQL
        String originalSql = (String) metaObject.getValue("delegate.boundSql.sql");
        //河南的特殊要求,不要orgid
        if (active.equals("hn")) {
            String s = removeOrgIdCondition(originalSql);
            // å°†ä¿®æ”¹åŽçš„ SQL å†™å›ž
            metaObject.setValue("delegate.boundSql.sql", s);
            return invocation.proceed();
        }
        // èŽ·å–å½“å‰ orgid
        String orgid = null;
@@ -62,7 +53,7 @@
        } catch (Exception e) {
//            e.printStackTrace();
        }
        if (StringUtils.isEmpty(orgid)) {
        if (StringUtils.isEmpty(orgid) || active.equals("hn")) {
            return invocation.proceed();
        }
@@ -76,39 +67,6 @@
        return invocation.proceed();
    }
    private String removeOrgIdCondition(String sql) {
        // è½¬æ¢ä¸ºå°å†™ä¾¿äºŽåŒ¹é…ï¼Œä½†ä¿ç•™åŽŸå§‹å¤§å°å†™
        String lowerSql = sql.toLowerCase();
        // æŸ¥æ‰¾ WHERE å­å¥çš„位置
        int whereIndex = lowerSql.indexOf("where");
        if (whereIndex == -1) {
            return sql; // æ²¡æœ‰ WHERE å­å¥
        }
        // æå– WHERE ä¹‹åŽçš„部分
        String whereClause = sql.substring(whereIndex + 5);
        String beforeWhere = sql.substring(0, whereIndex);
        // ä½¿ç”¨æ­£åˆ™è¡¨è¾¾å¼åˆ†å‰²æ¡ä»¶
        String[] conditions = whereClause.split("(?i)\\s+(AND|OR)\\s+");
        // è¿‡æ»¤æŽ‰åŒ…含 orgid çš„æ¡ä»¶
        List<String> filteredConditions = new ArrayList<>();
        for (String condition : conditions) {
            if (!containsOrgId(condition)) {
                filteredConditions.add(condition.trim());
            }
        }
        // é‡æ–°æž„建 SQL
        if (filteredConditions.isEmpty()) {
            return beforeWhere.trim();
        } else {
            String newWhereClause = String.join(" AND ", filteredConditions);
            return beforeWhere + "WHERE " + newWhereClause;
        }
    }
    private boolean containsOrgId(String condition) {
        // æ£€æŸ¥æ¡ä»¶æ˜¯å¦åŒ…含 orgid(考虑别名)
ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/SysLoginService.java
@@ -96,6 +96,7 @@
    public String loginByUserName(String userName) {
        SysUser sysUser = userService.selectUserByUserNameAndDeptId(userName);
        log.info("---------sysUser的值为:{}", sysUser);
        if (ObjectUtils.isNotEmpty(sysUser)) {
            // æž„建登录用户对象
            LoginUser loginUser = new LoginUser();
ruoyi-quartz/pom.xml
@@ -36,14 +36,14 @@
        </dependency>
        <dependency>
            <groupId>com.ruoyi</groupId>
            <artifactId>smartor</artifactId>
            <version>3.8.5</version>
            <artifactId>ruoyi-system</artifactId>
        </dependency>
        <dependency>
            <groupId>com.ruoyi</groupId>
            <artifactId>ruoyi-system</artifactId>
            <artifactId>smartor</artifactId>
            <version>3.8.5</version>
        </dependency>
    </dependencies>
</project>
</project>
ruoyi-quartz/src/main/java/com/ruoyi/quartz/service/impl/CollectHISServiceImpl.java
@@ -85,6 +85,7 @@
    /**
     * åŒæ­¥ä»»åŠ¡
     *
     * @param
     * @return
     */
@@ -104,15 +105,15 @@
            //同步住院病人信息
            List<Map<String, Object>> syncTemp = syncList.stream().filter(row -> row.get("syncName").equals("pat_med_inhosp")).collect(Collectors.toList());
            if (syncTemp.size() > 0) {
                count+=syncMedInhosp(syncTemp.get(0).get("startTime") + "", endTime);
                utilsMapper.updateSql("update sys_sync_time set startTime='"+endTime+"' where syncName='pat_med_inhosp' ");
                count += syncMedInhosp(syncTemp.get(0).get("startTime") + "", endTime);
                utilsMapper.updateSql("update sys_sync_time set startTime='" + endTime + "' where syncName='pat_med_inhosp' ");
            }
            //同步门诊信息
            syncTemp = syncList.stream().filter(row -> row.get("syncName").equals("pat_med_outhosp")).collect(Collectors.toList());
            if (syncTemp.size() > 0) {
                count+=syncOuthosp(syncTemp.get(0).get("startTime") + "", endTime);
                utilsMapper.updateSql("update sys_sync_time set startTime='"+endTime+"' where syncName='pat_med_outhosp' ");
                count += syncOuthosp(syncTemp.get(0).get("startTime") + "", endTime);
                utilsMapper.updateSql("update sys_sync_time set startTime='" + endTime + "' where syncName='pat_med_outhosp' ");
            }
@@ -124,10 +125,11 @@
    /**
     * åŒæ­¥æ‚£è€…基本信息
     *
     * @param
     * @return
     */
    private  Integer syncArchive(String startTime,String endTime) {
    private Integer syncArchive(String startTime, String endTime) {
        Integer count = 0;
        PatArchive pa = new PatArchive();
        pa.setLastStartTime(startTime);
@@ -148,8 +150,8 @@
                    count += patArchiveMapper.insertPatArchiveSingle(pm);
                }
            }catch (Exception ex){
                log.info("可同患者基本信息:"+ex.getMessage());
            } catch (Exception ex) {
                log.info("可同患者基本信息:" + ex.getMessage());
            }
        }
@@ -158,10 +160,11 @@
    /**
     * åŒæ­¥å‡ºå…¥é™¢ä¿¡æ¯
     *
     * @param
     * @return
     */
    private  Integer syncMedInhosp(String startTime,String endTime) {
    private Integer syncMedInhosp(String startTime, String endTime) {
        Integer count = 0;
        PatMedInhosp patMedInhosp = new PatMedInhosp();
        patMedInhosp.setLastStartTime(startTime);
@@ -169,11 +172,11 @@
        List<PatMedInhosp> patMedInhospList = chMapper.selectPatMedInhospList(patMedInhosp);
        log.info("可同步出入院数量" + patMedInhospList.size());
        for (PatMedInhosp pm : patMedInhospList) {
            List<PatArchive> patArchives1=new ArrayList<>();
            List<PatArchive> patArchives1 = new ArrayList<>();
            try {
                //患者基本信息
                if(ObjectUtils.isNotEmpty(pm.getPatno())) {
                if (ObjectUtils.isNotEmpty(pm.getPatno())) {
                    PatArchive patArchive = new PatArchive();
                    patArchive.setPatientno(pm.getPatno());
                    patArchive.setPageSize(5);
@@ -193,12 +196,12 @@
                        }
                    }
                }
            }catch (Exception ex) {
            } catch (Exception ex) {
                log.info("同患者基本信息:" + ex.getMessage());
            }
            try {
                if(patArchives1.size()>0) {
                if (patArchives1.size() > 0) {
                    pm.setPatid(patArchives1.get(0).getId());
                }
                //同步出入院
@@ -222,10 +225,11 @@
    /**
     * åŒæ­¥é—¨è¯Šä¿¡æ¯
     *
     * @param
     * @return
     */
    private  Integer syncOuthosp(String startTime,String endTime) {
    private Integer syncOuthosp(String startTime, String endTime) {
        Integer count = 0;
        PatMedOuthosp patMedOuthosp = new PatMedOuthosp();
        patMedOuthosp.setLastStartTime(startTime);
@@ -252,7 +256,7 @@
                    }
                }
            }catch (Exception ex) {
            } catch (Exception ex) {
                log.info("同患者基本信息:" + ex.getMessage());
            }
@@ -278,7 +282,7 @@
    @Override
    public Integer selectPatMedInhospList(PatMedInhosp patMedInhosp) {
        List<PatMedInhosp> patMedInhospList = chMapper.selectPatMedInhospList(patMedInhosp);
        log.info("可同步病人数量"+patMedInhospList.size());
        log.info("可同步病人数量" + patMedInhospList.size());
        for (PatMedInhosp pm : patMedInhospList) {
            PatArchive patArchive = new PatArchive();
            patArchive.setPatientno(pm.getPatno());
@@ -323,10 +327,8 @@
    @Override
    public Boolean hnDataGather(HnDataGatherVO hnDataGatherVO) {
        if(ObjectUtils.isEmpty(hnDataGatherVO.getStartTime()) )
            hnDataGatherVO.setStartTime(new Date());
        if(ObjectUtils.isEmpty(hnDataGatherVO.getEndTime()) )
            hnDataGatherVO.setEndTime(new Date());
        if (ObjectUtils.isEmpty(hnDataGatherVO.getStartTime())) hnDataGatherVO.setStartTime(new Date());
        if (ObjectUtils.isEmpty(hnDataGatherVO.getEndTime())) hnDataGatherVO.setEndTime(new Date());
        LocalDate startDate = hnDataGatherVO.getStartTime().toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
        LocalDate endDate = hnDataGatherVO.getEndTime().toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
@@ -415,10 +417,10 @@
    @Override
    public Integer selectUserList(SysUser sysUser) {
        List<SysUser> sysUserList = chMapper.selectUserList(sysUser);
        SysUser suerTemp=new SysUser();
        SysUser suerTemp = new SysUser();
        List<SysUserDept> sysUserDeptAll = chMapper.yhyksxx(suerTemp);
        log.info("sysUserList的采集到的数量为:{}", sysUserList.size());
        int i =0;// sysUser2Mapper.batchUser(sysUserList);
        int i = 0;// sysUser2Mapper.batchUser(sysUserList);
        for (SysUser sysUser1 : sysUserList) {
//            log.info("sysUser1的ID为:{}", sysUser1.getUserId());
//            log.info("sysUser1的HISUSERID为:{}", sysUser1.getHisUserId());
@@ -438,16 +440,11 @@
            //新增用户与部门
            //List<SysUserDept> sysUserDept = chMapper.yhyksxx(sysUser1);
            List<SysUserDept> sysUserDept = sysUserDeptAll.stream()
                    .filter((SysUserDept b) -> b.getUserCode().equals(sysUser1.getHisUserId()))
                    .collect(Collectors.toList());
            List<SysUserDept> sysUserDept = sysUserDeptAll.stream().filter((SysUserDept b) -> b.getUserCode().equals(sysUser1.getHisUserId())).collect(Collectors.toList());
            for (SysUserDept sud : sysUserDept) {
                if (usersTemp.size() > 0) {
                    sud.setUserId(usersTemp.get(0).getUserId());
                    SysDept sysDeptTemp = sysDept2Mapper.selectDeptByCode(sud.getDeptCode());
                    if (sysDeptTemp != null)
                        sud.setDeptId(sysDeptTemp.getDeptId());
                    sysUserDeptMapper.insertSysUserDept(sud);
                }
            }
@@ -458,20 +455,49 @@
    @Override
    public Integer selectDeptList(SysDept dept) {
        int count=0;
        int count = 0;
        List<SysDept> sysDepts = chMapper.selectDeptList(dept);
        log.info("selectDeptList的采集到的数量为:{}", sysDepts.size());
       // count = sysDept2Mapper.batchDept(sysDepts);
        for(SysDept row : sysDepts){
            SysDept sysDeptTemp= sysDept2Mapper.selectDeptByCode(row.getDeptCode());
            if(sysDeptTemp!=null&&sysDeptTemp.getDeptName()!=null){
        // count = sysDept2Mapper.batchDept(sysDepts);
        for (SysDept row : sysDepts) {
            SysDept sysDeptTemp = sysDept2Mapper.selectDeptByCode(row.getDeptCode(), null);
            if (sysDeptTemp != null && sysDeptTemp.getDeptName() != null) {
                row.setDeptId(sysDeptTemp.getDeptId());
                count+=sysDept2Mapper.updateDept(row);
            }else{
                count+=sysDept2Mapper.insertDept(row);
                count += sysDept2Mapper.updateDept(row);
            } else {
                count += sysDept2Mapper.insertDept(row);
            }
        }
        return count;
    }
    /**
     * æ£€æŸ¥å¹¶æ‰§è¡Œåˆ†è¡¨çš„æ ¸å¿ƒæ–¹æ³•
     *
     * @param tableName è¦æ£€æŸ¥çš„表名
     */
    private synchronized void checkAndShard(String tableName) {
        long currentCount = shardingMapper.getTableCount(tableName);
        if (currentCount >= SHARDING_THRESHOLD) {
            log.warn("表 '{}' å·²è¾¾åˆ°åˆ†è¡¨é˜ˆå€¼ {},准备执行分表操作...", tableName, SHARDING_THRESHOLD);
            String newTableName = tableName + "_" + java.time.LocalDate.now().format(java.time.format.DateTimeFormatter.ofPattern("yyyy_MM"));
            Long maxId = shardingMapper.getMaxId(tableName);
            if (maxId == null) maxId = 0L;
            shardingMapper.renameTable(tableName, newTableName);
            log.info("已将表 '{}' é‡å‘½åä¸º '{}'", tableName, newTableName);
            shardingMapper.createLikeTable(tableName, newTableName);
            log.info("已创建新表 '{}'", tableName);
            shardingMapper.setAutoIncrement(tableName, maxId + 1);
            log.info("已设置新表 '{}' çš„自增ID起始值为 {}", tableName, maxId + 1);
            log.info("表 '{}' çš„分表操作完成!", tableName);
        }
    }
}
ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/RyTask.java
@@ -5,9 +5,9 @@
import com.fasterxml.jackson.databind.ObjectMapper;
import com.google.gson.Gson;
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.VisitSendStateEnum;
import com.ruoyi.common.enums.WxGZHEnum;
import com.ruoyi.common.utils.HttpUtil;
import com.ruoyi.common.utils.OkHttpExample;
@@ -19,10 +19,7 @@
import com.ruoyi.system.service.ISysConfigService;
import com.smartor.common.LSHospTokenUtil;
import com.smartor.domain.*;
import com.smartor.mapper.HeLibraryMapper;
import com.smartor.mapper.ServiceSubtaskMapper;
import com.smartor.mapper.ServiceTaskMapper;
import com.smartor.mapper.SysUserImportMapper;
import com.smartor.mapper.*;
import com.smartor.service.*;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.CollectionUtils;
@@ -83,6 +80,9 @@
    private IHNGatherPatArchiveService ihnGatherPatArchiveService;
    @Autowired
    private IServiceSLTDHealthcareRecordService serviceSLTDHealthcareRecordService;
    @Autowired
    private SysUserImportMapper sysUserImportMapper;
    @Autowired
@@ -93,7 +93,6 @@
    @Autowired
    private ISysConfigService configService;
    @Value("${localIP}")
    private String localIP;
@@ -146,6 +145,9 @@
    @Autowired
    IXHGatherPatArchiveService ixhGatherPatArchiveService;
    @Autowired
    ServiceSubtaskPreachformMapper serviceSubtaskPreachformMapper;
    @Autowired
    ICollectHISService icollectHis;
@@ -251,10 +253,59 @@
                // æ²³å—数据采集
                HnDataGatherVO hnDataGatherVO = new HnDataGatherVO();
                log.info("【dealHisData】河南开始采集数据");
                Date startTime = Date.from(yesterdayZero.atZone(ZoneId.systemDefault()).toInstant());
                Date endTime = Date.from(todayZero.atZone(ZoneId.systemDefault()).toInstant());
                hnDataGatherVO.setStartTime(startTime);
                hnDataGatherVO.setEndTime(endTime);
                ihnGatherPatArchiveService.hnDataGather(hnDataGatherVO);
                log.info("【dealHisData】河南结束采集数据");
            } catch (Exception e) {
                log.error("【dealHisData】河南数据采集异常", e);
            }
        } else if (active.trim().equals("sltd")) {
            try {
                // çœç«‹åŒå¾·æ•°æ®é‡‡é›†
                log.info("【dealHisData】省立同德“入院”开始采集数据");
                String yesterday = LocalDate.now().minusDays(1).format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));
                ServiceSLTDInhospReqVO serviceSLTDInhospReqVO = new ServiceSLTDInhospReqVO();
                serviceSLTDInhospReqVO.setOrgId("20001001");
                serviceSLTDInhospReqVO.setCampusId(30001002L);
                serviceSLTDInhospReqVO.setStartHeadTime(yesterday);
                serviceSLTDInhospReqVO.setStartTailTime(yesterday);
                List<String> list = new ArrayList<>();
                list.add("FH0108.02");
                serviceSLTDInhospReqVO.setHealthcareRecordTypeList(list);
                serviceSLTDHealthcareRecordService.queryHealthcareRecordList(serviceSLTDInhospReqVO);
                log.info("【dealHisData】省立同德“入院”結束采集数据");
                log.info("【dealHisData】省立同德“门急诊”开始采集数据");
                serviceSLTDInhospReqVO.setStartHeadTime(null);
                serviceSLTDInhospReqVO.setStartTailTime(null);
                serviceSLTDInhospReqVO.setEncounterTimeStart(yesterday);
                serviceSLTDInhospReqVO.setEncounterTimeEnd(yesterday);
                List<String> list1 = new ArrayList<>();
                list1.add("FH0108.01");
                list1.add("FH0108.03");
                serviceSLTDInhospReqVO.setHealthcareRecordTypeList(list1);
                serviceSLTDHealthcareRecordService.queryHealthcareRecordList(serviceSLTDInhospReqVO);
                log.info("【dealHisData】河南结“门急诊”束采集数据");
                log.info("【dealHisData】省立同德“出院”开始采集数据");
                serviceSLTDInhospReqVO.setStartHeadTime(null);
                serviceSLTDInhospReqVO.setStartTailTime(null);
                serviceSLTDInhospReqVO.setEncounterTimeStart(null);
                serviceSLTDInhospReqVO.setEncounterTimeEnd(null);
                serviceSLTDInhospReqVO.setPreOutHospitalHeadDate(yesterday);
                serviceSLTDInhospReqVO.setPreOutHospitalTailDate(yesterday);
                List<String> list2 = new ArrayList<>();
                list2.add("FH0108.02");
                serviceSLTDInhospReqVO.setHealthcareRecordTypeList(list2);
                serviceSLTDHealthcareRecordService.queryHealthcareRecordList(serviceSLTDInhospReqVO);
                log.info("【dealHisData】河南结“出院”束采集数据");
            } catch (Exception e) {
                log.error("【dealHisData】省立同德数据采集异常", e);
            }
        }
    }
@@ -330,9 +381,69 @@
            commonTaskcallMQ.setTaskid(serviceTask.getTaskid());
            commonTaskcallMQ.setPreachform(serviceTask.getPreachform());
            commonTaskcallMQ.setSendType("2");
            sfHandlle(commonTaskcallMQ, localIP);
            //通过任务ID拿到患者信息,并且随访时间得是今天之前的
            ServiceSubtaskVO serviceSubtaskVO = new ServiceSubtaskVO();
            serviceSubtaskVO.setTaskid(commonTaskcallMQ.getTaskid());
            serviceSubtaskVO.setSendstate(2L);
            serviceSubtaskVO.setVisitTime(new Date());
            List<ServiceSubtask> selectServiceSubtaskList = serviceSubtaskMapper.queryServiceSubtaskList(serviceSubtaskVO);
            for (ServiceSubtask serviceSubtask : selectServiceSubtaskList) {
                sfHandlle(serviceSubtask);
            }
        }
    }
    /**
     * å¤„理补偿任务
     */
    public void compensateTask() {
        //获取到sendstate=3 å¹¶ä¸” visit_time为今天的subtask
        ServiceSubtaskVO serviceSubtaskVO = new ServiceSubtaskVO();
        serviceSubtaskVO.setSendstate(3L);
        serviceSubtaskVO.setVisitTime(new Date());
        List<ServiceSubtask> serviceSubtaskList = serviceSubtaskMapper.selectServiceSubtaskList(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(5L);
                    serviceSubtaskMapper.updateServiceSubtask(serviceSubtask);
                    //修改发送方式的状态为失败
                    serviceSubtaskPreachform.setSendstate("5");
                    serviceSubtaskPreachform.setId(id.get());
                    serviceSubtaskPreachformMapper.updateServiceSubtaskPreachform(serviceSubtaskPreachform);
                    continue;
                }
                //3.不是最后一个,获取到下一个执行方式(因为都是在今天执行,那就直接发出去就完了)
                sfHandlle(serviceSubtask);
            }
        }
    }
    /**
     * åˆ¤æ–­æ—¥æœŸæ˜¯å¦æ˜¯ä»Šå¤©
@@ -352,374 +463,334 @@
        return !localDate.isAfter(today);
    }
    public void sfHandlle(CommonTaskcallMQ commonTaskcallMQ, String ip) {
        log.info("【sfHandlle】开始处理任务,任务ID:{}", commonTaskcallMQ.getTaskid());
        //判断一下commonTaskcallMQ中的stopstate是否与ivr_task中的一致,不一致,则说明是暂停了
        ServiceTask ivrTask1 = serviceTaskMapper.selectServiceTaskByTaskid(commonTaskcallMQ.getTaskid());
        if (StringUtils.isNotEmpty(commonTaskcallMQ.getPreachform())) {
            //如何任务发送方式不为空
            String[] split = commonTaskcallMQ.getPreachform().split(",");
            log.info("【sfHandlle】任务发送方式:{}", Arrays.toString(split));
            for (String serviceFrom : split) {
                String descByCode = ServiceFromEnum.getDescByCode(Integer.valueOf(serviceFrom));
                //通过任务ID拿到患者信息
                ServiceSubtaskVO ivrTaskcall = new ServiceSubtaskVO();
                ivrTaskcall.setTaskid(commonTaskcallMQ.getTaskid());
                ivrTaskcall.setSendstate(2L);
                List<ServiceSubtask> subtaskList = iServiceSubtaskService.selectServiceSubtaskList(ivrTaskcall);
                //丽水有的医院还没法做长期任务随访
                List<ServiceSubtask> subtaskList2 = new ArrayList<>();
                if (visitHosp == 2) {
                    try {
                        for (ServiceSubtask serviceSubtask : subtaskList) {
                            Boolean b = VisitSendStateEnum.getDescByCode(serviceSubtask.getOrgid());
                            if (b) subtaskList2.add(serviceSubtask);
                        }
                    } catch (Exception e) {
                        log.error("-------长期任务异常为:", e);
                        continue;
                    }
//                    for (ServiceSubtask serviceSubtask : subtaskList) {
//                        Boolean b = VisitSendStateEnum.getDescByCode(serviceSubtask.getOrgid());
//
//                        if (b) subtaskList2.add(serviceSubtask);
//                    }
                    subtaskList = subtaskList2;
                }
                // æŒ‰ç…§ endtime ç¦»å½“前时间最近的排序
                List<ServiceSubtask> selectServiceSubtaskList = subtaskList.stream().sorted(Comparator.comparing(subtask -> Math.abs(subtask.getEndtime().getTime() - new Date().getTime()))).collect(Collectors.toList());
                if (descByCode.equals("电话")) {
                    String value = "";
                    List<String> list = new ArrayList<>();
                    for (ServiceSubtask serviceSubtask : selectServiceSubtaskList) {
                        ServiceTask ivrTask = serviceTaskMapper.selectServiceTaskByTaskid(serviceSubtask.getTaskid());
                        if (ivrTask.getSendState() != null && ivrTask.getSendState() == 3 || ivrTask.getSendState() != null && ivrTask.getSendState() == 4) {
                            //如何任务被"暂停"或"终止"
                            break;
                        }
                        if (org.apache.commons.lang3.StringUtils.isEmpty(serviceSubtask.getPhone())) {
                            serviceSubtask.setRemark("手机号为空");
                            serviceSubtask.setSendstate(4L);
                            serviceSubtask.setResult("error");
//                            serviceSubtask.setFinishtime(new Date());
                            serviceSubtaskMapper.updateServiceSubtask(serviceSubtask);
                            continue;
                        }
                        boolean dateToday = isDateToday(serviceSubtask.getLongSendTime());
                        //说明是立即发送(先把消息放到cache-0中,   displayNo不知道怎么配置)
                        if (dateToday) {
                            list.add(serviceSubtask.getId().toString());
                            //在子任务表里记录一下
                            String uuid = UUID.randomUUID().toString();
                            serviceSubtask.setResult("success");
                            serviceSubtask.setRemark("长期任务,电话进入队列成功");
                            serviceSubtask.setGuid(uuid);
                            serviceSubtaskMapper.updateServiceSubtask(serviceSubtask);
                            //任务发送记录
                            ServiceSubtaskRecord serviceSubtaskRecord = new ServiceSubtaskRecord();
                            serviceSubtaskRecord.setTaskid(serviceSubtask.getTaskid().toString());
                            serviceSubtaskRecord.setSubtaskId(serviceSubtask.getId());
                            serviceSubtaskRecord.setUuid(uuid);
                            serviceSubtaskRecord.setTasktype(serviceSubtask.getType());
                            serviceSubtaskRecord.setPreachform("3");
                            serviceSubtaskRecord.setStartTime(System.currentTimeMillis());
                            serviceSubtaskRecord.setRemark("长期任务,电话进入队列成功");
                            serviceSubtaskRecordService.insertServiceSubtaskRecord(serviceSubtaskRecord);
                        }
                    }
                    //将要执行的放到缓存中
                    if (list.size() > 0) {
//                        redisCache.setCacheListLeft("cache-0", list);
                        redisCache.setCacheListLeftAndDistinct("cache-0", list);
                        log.info("【sfHandlle】电话任务已加入队列,数量:{}", list.size());
                    }
                } else if (descByCode.equals("多媒体")) {
                    //多媒体
                } else if (descByCode.equals("纸质")) {
                    //纸质
                } else if (descByCode.equals("微信小程序")) {
                    //微信小程序
                    log.info("【sfHandlle】处理微信小程序任务,任务信息:{}", ivrTask1);
                    if (ObjectUtils.isNotEmpty(ivrTask1) && ivrTask1.getPatCycle() == 1) {
                        //说明该任务的患者是循环执行的
                        ServiceSubtaskVO serviceSubtaskVO = new ServiceSubtaskVO();
                        serviceSubtaskVO.setTaskid(ivrTask1.getTaskid());
                        List<ServiceSubtask> serviceSubtaskList = serviceSubtaskMapper.selectServiceSubtaskList(serviceSubtaskVO);
                        //这里需要根据身份证去重
                        List<ServiceSubtask> serviceSubtaskListFilter = new ArrayList<>();
                        aa:
                        for (ServiceSubtask serviceSubtask : serviceSubtaskList) {
                            for (ServiceSubtask ss : serviceSubtaskListFilter) {
                                if (ss.getSfzh().equals(serviceSubtask.getSfzh())) {
                                    continue aa;
                                }
                            }
                            serviceSubtaskListFilter.add(serviceSubtask);
                        }
                        for (ServiceSubtask serviceSubtask : serviceSubtaskListFilter) {
                            //将子任务ID删除 ã€sendstate改成3
                            serviceSubtask.setSendstate(3L);
                            serviceSubtask.setId(null);
                            serviceSubtask.setFinishtime(null);
                            serviceSubtask.setCreateTime(new Date());
                            serviceSubtask.setUpdateTime(new Date());
                            //处理重复新增问题,先查一下今天是不是有新增过,新增过就不新增了
                            ServiceSubtaskVO ssvo = new ServiceSubtaskVO();
                            LocalDate today = LocalDate.now();
                            LocalTime startOfDay = LocalTime.of(0, 0, 0);
                            LocalTime endOfDay = LocalTime.of(23, 59, 59);
                            Date startOfDayDate = Date.from(today.atTime(startOfDay).atZone(ZoneId.systemDefault()).toInstant());
                            Date endOfDayDate = Date.from(today.atTime(endOfDay).atZone(ZoneId.systemDefault()).toInstant());
                            ssvo.setCreateStartTime(startOfDayDate);
                            ssvo.setCreateEndTime(endOfDayDate);
                            ssvo.setCreateBy(serviceSubtask.getCreateBy());
                            ssvo.setSendname(serviceSubtask.getSendname());
                            ssvo.setSfzh(serviceSubtask.getSfzh());
                            List<ServiceSubtask> serviceSubtaskListByCreateTime = serviceSubtaskMapper.selectServiceSubtaskListByCreateTime(ssvo);
                            if (CollectionUtils.isEmpty(serviceSubtaskListByCreateTime))
                                serviceSubtaskMapper.insertServiceSubtask(serviceSubtask);
                        }
                    }
                } else if (descByCode.equals("短信")) {
                    RSAPublicKeyExample rsaPublicKeyExample = new RSAPublicKeyExample();
                    String taskId = rsaPublicKeyExample.encryptedData(ivrTask1.getTaskid().toString(), pub_key);
                    for (ServiceSubtask serviceSubtask : selectServiceSubtaskList) {
                        log.info("【sfHandlle】处理短信长期任务,患者ID:{}", serviceSubtask.getPatid());
                        boolean dateToday = isDateToday(serviceSubtask.getLongSendTime());
                        if (dateToday) {
                            try {
                                //先判断患者是不是还要发送
                                PatArchive patArchive = patArchiveService.selectPatArchiveByPatid(serviceSubtask.getPatid());
                                if (!Objects.isNull(patArchive) && patArchive.getNotrequiredFlag() == "1") {
                                    //不需要发送
                                    serviceSubtask.setResult("error");
                                    serviceSubtask.setRemark(patArchive.getNotrequiredreason());
                                    serviceSubtask.setSendstate(4L);
                                    iServiceSubtaskService.insertServiceSubtask(serviceSubtask);
                                    continue;
                                }
                                String patid = rsaPublicKeyExample.encryptedData(serviceSubtask.getPatid().toString(), pub_key);
                                String subId = rsaPublicKeyExample.encryptedData(serviceSubtask.getId().toString(), pub_key);
                                SendMagParam sendMagParam = new SendMagParam();
                                sendMagParam.setType("4");
                                ServiceOutPath serviceOutPath = new ServiceOutPath();
                                serviceOutPath.setParam1(taskId);
                                serviceOutPath.setParam2(patid);
                                serviceOutPath.setParam3(ivrTask1.getTaskName());
                                serviceOutPath.setParam6(subId);
                                serviceOutPath.setCreateTime(new Date());
                                iServiceOutPathService.insertServiceOutPath(serviceOutPath);
                                String format = String.format("%03X", serviceOutPath.getId());
                                serviceOutPath.setRadix(format);
                                serviceOutPath.setUpdateTime(new Date());
                                iServiceOutPathService.updateServiceOutPath(serviceOutPath);
                                //先判断一下发的是不是宣教
                                if (!"3".equals(serviceSubtask.getType())) {
                                    sendMagParam.setPhone(serviceSubtask.getPhone());
                                    sendMagParam.setUrl(ip + ":" + req_path + "/wt?p=" + format);
                                    sendMagParam.setContent("【新华医院】您好,邀请您填写出院调查表,请点击" + sendMagParam.getUrl() + "填写。感谢您配合!");
                                } else {
                                    HeLibrary heLibrary = heLibraryMapper.selectHeLibraryById(serviceSubtask.getLibtemplateid());
                                    if ("2".equals(heLibrary.getHetype())) {
                                        sendMagParam.setPhone(serviceSubtask.getPhone());
                                        sendMagParam.setContent(heLibrary.getPreachcontent());
                                    }
                                }
                                String isSuccess = null;
                                if (visitHosp == 1) {
                                    Map<String, String> req = new HashMap<>();
                                    req.put("phone", sendMagParam.getPhone());
                                    req.put("content", sendMagParam.getContent());
                                    isSuccess = HttpUtil.postJsonRequest(xhsmsPath, new Gson().toJson(req));
                                } else if (visitHosp == 2) {
                                    String url = configService.selectConfigByKey("token.360",serviceSubtask.getOrgid());
                                    //丽水的短信发送方式
                                    Map<String, String> map = MsgLSEnum.getAddressByCode(serviceSubtask.getOrgid());
                                    String token = LSHospTokenUtil.getToken(serviceSubtask.getOrgid(),url);
                                    if (ObjectUtils.isNotEmpty(map) && StringUtils.isEmpty(map.get("address"))) {
                                        ServiceSubtask ss = new ServiceSubtask();
                                        ss.setResult("error");
                                        ss.setRemark("短信发送失败,该机构没有配置短信地址");
                                        ss.setSendstate(5L);
                                        ss.setId(serviceSubtask.getId());
//                                        ss.setFinishtime(new Date());
                                        serviceSubtaskMapper.updateServiceSubtask(ss);
                                        continue;
                                    }
                                    log.info("【sfHandlle】丽水短信发送,地址:{},参数:{},机构ID:{}", map.get("address"), sendMagParam, serviceSubtask.getOrgid());
                                    String dxCode = getDXCode(map.get("address"), sendMagParam.getPhone(), sendMagParam.getContent(), map.get("sendPersonId"), map.get("sendPersonName"), MsgLSEnum.getHeaderByCode(serviceSubtask.getOrgid()), token);
                                    log.info("【sfHandlle】丽水短信发送结果:{}", dxCode);
                                    ObjectMapper objectMapper = new ObjectMapper();
                                    Map<String, Object> textParam = objectMapper.readValue(dxCode, Map.class);
                                    String code = textParam.get("Code").toString();
                                    if (code.equals("0")) {
                                        isSuccess = "true";
                                    }
                                }else if (visitHosp == 3) {//市一医院
                                    String content=sendMagParam.getContent().replace("【新华医院】","");
                                    smsUtils.sendSms(xhsmsPath,xhsmsAccount,xhsmsPwd,sendMagParam.getPhone(),content);
                                }
                                //任务发送记录
                                ServiceSubtaskRecord serviceSubtaskRecord = new ServiceSubtaskRecord();
                                serviceSubtaskRecord.setTaskid(serviceSubtask.getTaskid().toString());
                                serviceSubtaskRecord.setUuid(UUID.randomUUID().toString());
                                serviceSubtaskRecord.setTasktype(serviceSubtask.getType());
                                serviceSubtaskRecord.setPreachform("4");
                                serviceSubtaskRecord.setStartTime(System.currentTimeMillis());
                                serviceSubtaskRecord.setResult("success");
                                if (StringUtils.isNotEmpty(isSuccess) && !isSuccess.equals("true"))
                                    serviceSubtaskRecord.setResult("error");
                                serviceSubtaskRecordService.insertServiceSubtaskRecord(serviceSubtaskRecord);
                                //发送完成后,修改状态
                                serviceSubtask.setSendstate(3L);
                                if (StringUtils.isNotEmpty(isSuccess) && !isSuccess.equals("true")) {
                                    serviceSubtask.setResult("success");
                                    serviceSubtask.setRemark("短信发送成功");
                                } else {
                                    serviceSubtask.setResult("error");
                                    serviceSubtask.setSendstate(5L);
                                    serviceSubtask.setRemark("短信发送失败");
                                }
                                iServiceSubtaskService.updateServiceSubtask(serviceSubtask);
                            } catch (Exception e) {
                                String guid = UUID.randomUUID().toString();
                                log.error("【sfHandlle】长期任务短信发送失败,原因:{},GUID:{}", e.getMessage(), guid);
                                serviceSubtask.setResult("error");
                                serviceSubtask.setRemark("系统错误");
                                serviceSubtask.setSendstate(5L);
                                serviceSubtask.setGuid(guid);
                                iServiceSubtaskService.updateServiceSubtask(serviceSubtask);
                            }
                        }
                    }
                } else if (descByCode.equals("公众号")) {
                    log.info("【sfHandlle】处理公众号任务,任务信息:{}", ivrTask1);
                    //公众号
                    RSAPublicKeyExample rsaPublicKeyExample = new RSAPublicKeyExample();
                    String taskId = rsaPublicKeyExample.encryptedData(ivrTask1.getTaskid().toString(), pub_key);
                    for (ServiceSubtask serviceSubtask : selectServiceSubtaskList) {
                        boolean dateToday = isDateToday(serviceSubtask.getLongSendTime());
                        if (dateToday) {
                            try {
                                //先判断患者是不是还要发送
                                PatArchive patArchive = patArchiveService.selectPatArchiveByPatid(serviceSubtask.getPatid());
                                if (!Objects.isNull(patArchive) && patArchive.getNotrequiredFlag() == "1") {
                                    //不需要发送
                                    serviceSubtask.setResult("error");
                                    serviceSubtask.setRemark(patArchive.getNotrequiredreason());
                                    serviceSubtask.setSendstate(4L);
                                    iServiceSubtaskService.insertServiceSubtask(serviceSubtask);
                                    continue;
                                }
                                String patid = rsaPublicKeyExample.encryptedData(serviceSubtask.getPatid().toString(), pub_key);
                                String url = null;
                                url = ip + ":" + req_path + "/outsideChainwt?param1=" + taskId + "&param2=" + patid + "&param3=" + URLEncoder.encode(ivrTask1.getTaskName(), StandardCharsets.UTF_8.toString()) + "&param5=false";
                                //获取微信公众号请求信息根据机构ID
                                List<String> wxqqxx = WxGZHEnum.getDescByCode(patArchive.getOrgid());
                                if (CollectionUtils.isEmpty(wxqqxx) || wxqqxx.size() < 4) {
                                    ServiceSubtask ss = new ServiceSubtask();
                                    ss.setResult("error");
                                    ss.setRemark("该机构的公众号配置信息不全,无法通过公众号发送");
                                    ss.setSendstate(5L);
                                    ss.setId(serviceSubtask.getId());
                                    serviceSubtaskMapper.updateServiceSubtask(ss);
                                    continue;
                                }
                                if (StringUtils.isEmpty(patArchive.getPatidHis())) {
                                    ServiceSubtask ss = new ServiceSubtask();
                                    ss.setResult("error");
                                    ss.setRemark("公众号发送失败,his系统的患者id为空");
                                    ss.setSendstate(5L);
                                    ss.setId(serviceSubtask.getId());
                                    serviceSubtaskMapper.updateServiceSubtask(ss);
                                    continue;
                                }
                                String wxCode = "";
                                if (visitHosp == 3) {//市一医院
                                    String urlTemp="http://192.200.54.14:5003/sfjk/SendMessage?sfzh="+serviceSubtask.getSfzh()
                                            +"&title=您好,邀请您填写出院调查表,请点击填写。&content=您好,邀请您填写出院调查表,请点击填写。&phone="+patArchive.getTelcode()
                                            +"&url="+url+"&key=ff76f8904f5f32b5ee1739e8ea46e60g";
                                    HttpUtils.sendGet(urlTemp);
                                }else{
                                    wxCode = getWXCode(serviceSubtask.getSfzh(), url, serviceSubtask.getTaskName(), serviceSubtask.getTaskDesc(), patArchive.getTelcode(), serviceSubtask.getSendname(), patArchive.getPatidHis(), wxqqxx);
                                }
                                Map<String, Object> map = JSONObject.parseObject(wxCode, Map.class);
                                //任务发送记录
                                ServiceSubtaskRecord serviceSubtaskRecord = new ServiceSubtaskRecord();
                                serviceSubtaskRecord.setTaskid(serviceSubtask.getTaskid().toString());
                                serviceSubtaskRecord.setUuid(UUID.randomUUID().toString());
                                serviceSubtaskRecord.setTasktype(serviceSubtask.getType());
                                serviceSubtaskRecord.setPreachform("4");
                                serviceSubtaskRecord.setStartTime(System.currentTimeMillis());
                                serviceSubtaskRecord.setResult("success");
                                if (!map.isEmpty() && (Boolean) map.get("succ") == false)
                                    serviceSubtaskRecord.setResult("error");
                                serviceSubtaskRecordService.insertServiceSubtaskRecord(serviceSubtaskRecord);
                                //发送完成后,修改状态
                                serviceSubtask.setSendstate(3L);
                                if ((Boolean) map.get("succ") == true) {
                                    serviceSubtask.setResult("success");
                                } else {
                                    log.error("【sfHandlle】公众号发送失败,患者信息:{},错误信息:{}", serviceSubtask, map.get("msg"));
                                    serviceSubtask.setResult("error");
                                    serviceSubtask.setSendstate(5L);
                                    serviceSubtask.setRemark(map.get("msg").toString());
                                }
                                iServiceSubtaskService.updateServiceSubtask(serviceSubtask);
                            } catch (Exception e) {
                                String guid = UUID.randomUUID().toString();
                                log.error("【sfHandlle】长期任务公众号发送失败,原因:{},GUID:{}", e.getMessage(), guid);
                                serviceSubtask.setResult("error");
                                serviceSubtask.setRemark("系统错误");
                                serviceSubtask.setSendstate(5L);
                                serviceSubtask.setGuid(guid);
                                iServiceSubtaskService.updateServiceSubtask(serviceSubtask);
                            }
                        }
                    }
                }
                //通知 MQ æ¶ˆæ¯å·²è¢«æŽ¥æ”¶,可以ACK(从队列中删除)了   ï¼ˆè¿™ä¸ªéœ€è¦æ ¹æ®ä¸šåŠ¡å†åŽ»å¤„ç†ACK)
            }
    public void sfHandlle(ServiceSubtask serviceSubtask) {
        //这里需要根据身份证去重(给微信小程序的固定任务用的)
        List<ServiceSubtask> serviceSubtaskListFilter = new ArrayList<>();
        ServiceTask ivrTask1 = serviceTaskMapper.selectServiceTaskByTaskid(serviceSubtask.getTaskid());
        ServiceSubtaskPreachform serviceSubtaskPreachform = new ServiceSubtaskPreachform();
        serviceSubtaskPreachform.setTaskid(serviceSubtask.getTaskid());
        serviceSubtaskPreachform.setSubid(serviceSubtask.getId());
        //获取发送方式
        String sendPreachform = getSendPreachform(serviceSubtaskPreachform, serviceSubtask);
        if (sendPreachform.equals("-1") || serviceSubtask.getSendstate() == 6 || serviceSubtask.getSendstate() == 5 || serviceSubtask.getSendstate() == 4) {
            //说明已经全部遍历完了,当前的执行方式序号是最后一个了   æˆ–者  è¯¥æ‚£è€…已经随访结束(成功或失败了或不执行)
            return;
        }
        //先判断患者是不是还要发送
        PatArchive patArchive = patArchiveService.selectPatArchiveByPatid(serviceSubtask.getPatid());
        if (!Objects.isNull(patArchive) && patArchive.getNotrequiredFlag() == "1") {
            //不需要发送
            serviceSubtask.setResult("患者不需要随访");
            serviceSubtask.setRemark(patArchive.getNotrequiredreason());
            serviceSubtask.setSendstate(4L);
            iServiceSubtaskService.insertServiceSubtask(serviceSubtask);
            setSuccessPreachForm(serviceSubtask, "-1", "不需要执行", "6");
            return;
        }
        String descByCode = ServiceFromEnum.getDescByCode(Integer.valueOf(sendPreachform));
        if (descByCode.equals("电话")) {
            List<String> list = new ArrayList<>();
            ServiceTask ivrTask = serviceTaskMapper.selectServiceTaskByTaskid(serviceSubtask.getTaskid());
            if (ivrTask.getSendState() != null && ivrTask.getSendState() == 3 || ivrTask.getSendState() != null && ivrTask.getSendState() == 4) {
                //如何任务被"暂停"或"终止"
                return;
            }
            if (org.apache.commons.lang3.StringUtils.isEmpty(serviceSubtask.getPhone())) {
                setSuccessPreachForm(serviceSubtask, sendPreachform, "手机号为空", "4");
                return;
            }
            boolean dateToday = isDateToday(serviceSubtask.getVisitTime());
            //说明是立即发送(先把消息放到cache-0中,   displayNo不知道怎么配置)
            if (dateToday) {
                list.add(serviceSubtask.getId().toString());
                //在子任务表里记录一下
                setSuccessPreachForm(serviceSubtask, sendPreachform, "长期任务,电话进入队列成功", "2");
                //任务发送记录
                ServiceSubtaskRecord serviceSubtaskRecord = new ServiceSubtaskRecord();
                serviceSubtaskRecord.setTaskid(serviceSubtask.getTaskid().toString());
                serviceSubtaskRecord.setSubtaskId(serviceSubtask.getId());
                serviceSubtaskRecord.setUuid(UUID.randomUUID().toString());
                serviceSubtaskRecord.setTasktype(serviceSubtask.getType());
                serviceSubtaskRecord.setPreachform("3");
                serviceSubtaskRecord.setStartTime(System.currentTimeMillis());
                serviceSubtaskRecord.setRemark("长期任务,电话进入队列成功");
                serviceSubtaskRecordService.insertServiceSubtaskRecord(serviceSubtaskRecord);
            }
            //将要执行的放到缓存中
            if (list.size() > 0) {
                redisCache.setCacheListLeftAndDistinct("cache-0", list);
                log.info("【sfHandlle】电话任务已加入队列,数量:{}", list.size());
            }
        } else if (descByCode.equals("微信小程序")) {
            //微信小程序
            if (ObjectUtils.isNotEmpty(ivrTask1) && ivrTask1.getPatCycle() == 1) {
                //说明该任务的患者是循环执行的
                //判断患者过滤集合中,是否存在当前执行患者的身份证
                boolean continutFlag = false;
                for (ServiceSubtask ss : serviceSubtaskListFilter) {
                    if (ss.getSfzh().equals(serviceSubtask.getSfzh())) {
                        continutFlag = true;
                    }
                }
                //如果存在当前执行患者的身份证,则不执行该患者了
                if (continutFlag) {
                    return;
                }
                //将子任务ID删除 ã€sendstate改成3(循环任务就是这样)
                serviceSubtask.setSendstate(3L);
                serviceSubtask.setId(null);
                serviceSubtask.setFinishtime(null);
                serviceSubtask.setCreateTime(new Date());
                serviceSubtask.setUpdateTime(new Date());
                serviceSubtaskMapper.insertServiceSubtask(serviceSubtask);
                //将当前要执行的患者放到过滤患者集合中
                serviceSubtaskListFilter.add(serviceSubtask);
            }
        } else if (descByCode.equals("短信")) {
            RSAPublicKeyExample rsaPublicKeyExample = new RSAPublicKeyExample();
            String taskId = rsaPublicKeyExample.encryptedData(ivrTask1.getTaskid().toString(), pub_key);
            log.info("【sfHandlle】处理短信长期任务,患者ID:{}", serviceSubtask.getPatid());
            boolean dateToday = isDateToday(serviceSubtask.getVisitTime());
            if (dateToday) {
                try {
                    String patid = rsaPublicKeyExample.encryptedData(serviceSubtask.getPatid().toString(), pub_key);
                    String subId = rsaPublicKeyExample.encryptedData(serviceSubtask.getId().toString(), pub_key);
                    SendMagParam sendMagParam = new SendMagParam();
                    sendMagParam.setType("4");
                    ServiceOutPath serviceOutPath = new ServiceOutPath();
                    serviceOutPath.setParam1(taskId);
                    serviceOutPath.setParam2(patid);
                    serviceOutPath.setParam3(ivrTask1.getTaskName());
                    serviceOutPath.setParam6(subId);
                    serviceOutPath.setCreateTime(new Date());
                    iServiceOutPathService.insertServiceOutPath(serviceOutPath);
                    String format = String.format("%03X", serviceOutPath.getId());
                    serviceOutPath.setRadix(format);
                    serviceOutPath.setUpdateTime(new Date());
                    iServiceOutPathService.updateServiceOutPath(serviceOutPath);
                    //先判断一下发的是不是宣教
                    if (!"3".equals(serviceSubtask.getType())) {
                        sendMagParam.setPhone(serviceSubtask.getPhone());
                        sendMagParam.setUrl(localIP + ":" + req_path + "/wt?p=" + format);
                        //如果type是语音随访的话(说明补偿发送方式中有电话随访的方式,这里的外链就地址只能用/sf)
                        if (serviceSubtask.getType().equals("1"))
                            sendMagParam.setUrl(localIP + ":" + req_path + "/sf?p=" + format);
                        sendMagParam.setContent("您好,邀请您填写出院调查表,请点击" + sendMagParam.getUrl() + "填写。感谢您配合!");
                    } else {
                        HeLibrary heLibrary = heLibraryMapper.selectHeLibraryById(serviceSubtask.getLibtemplateid());
                        if ("2".equals(heLibrary.getHetype())) {
                            sendMagParam.setPhone(serviceSubtask.getPhone());
                            sendMagParam.setContent(heLibrary.getPreachcontent());
                        }
                    }
                    String isSuccess = null;
                    if (visitHosp == 1) {
                        Map<String, String> req = new HashMap<>();
                        req.put("phone", sendMagParam.getPhone());
                        req.put("content", sendMagParam.getContent());
                        isSuccess = HttpUtil.postJsonRequest(xhsmsPath, new Gson().toJson(req));
                    } else if (visitHosp == 2) {
                        String url = configService.selectConfigByKey("token.360", serviceSubtask.getOrgid());
                        //丽水的短信发送方式
                        Map<String, String> map = MsgLSEnum.getAddressByCode(serviceSubtask.getOrgid());
                        String token = LSHospTokenUtil.getToken(serviceSubtask.getOrgid(), url);
                        if (ObjectUtils.isNotEmpty(map) && StringUtils.isEmpty(map.get("address"))) {
                            setSuccessPreachForm(serviceSubtask, sendPreachform, "短信发送失败,该机构没有配置短信地址", "5");
                            return;
                        }
                        log.info("【sfHandlle】丽水短信发送,地址:{},参数:{},机构ID:{}", map.get("address"), sendMagParam, serviceSubtask.getOrgid());
                        String dxCode = getDXCode(map.get("address"), sendMagParam.getPhone(), sendMagParam.getContent(), map.get("sendPersonId"), map.get("sendPersonName"), MsgLSEnum.getHeaderByCode(serviceSubtask.getOrgid()), token);
                        log.info("【sfHandlle】丽水短信发送结果:{}", dxCode);
                        ObjectMapper objectMapper = new ObjectMapper();
                        Map<String, Object> textParam = objectMapper.readValue(dxCode, Map.class);
                        String code = textParam.get("Code").toString();
                        if (code.equals("0")) {
                            isSuccess = "true";
                        }
                    } else if (visitHosp == 4) {
                        //省立同德的短信发送方式
                        JSONObject data = MessageSend.sendMsg(sendMagParam.getContent(), "2", sendMagParam.getPhone(), LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss")));
                        String code = data.get("code").toString();
                        if (StringUtils.isNotEmpty(code) && code.equals("00000")) {
                            isSuccess = "true";
                        }
                    } else if (visitHosp == 3) {//市一医院
                        String content = sendMagParam.getContent().replace("【新华医院】", "");
                        String result = smsUtils.sendSms(xhsmsPath, xhsmsAccount, xhsmsPwd, sendMagParam.getPhone(), content);
                        //这里需要根据result返回的值去判断,是否成功,然后将值赋值给isSuccess
                    }
                    //任务发送记录
                    ServiceSubtaskRecord serviceSubtaskRecord = new ServiceSubtaskRecord();
                    serviceSubtaskRecord.setTaskid(serviceSubtask.getTaskid().toString());
                    serviceSubtaskRecord.setUuid(UUID.randomUUID().toString());
                    serviceSubtaskRecord.setTasktype(serviceSubtask.getType());
                    serviceSubtaskRecord.setPreachform("4");
                    serviceSubtaskRecord.setStartTime(System.currentTimeMillis());
                    serviceSubtaskRecord.setResult("success");
                    if (StringUtils.isNotEmpty(isSuccess) && !isSuccess.equals("true"))
                        serviceSubtaskRecord.setResult("error");
                    serviceSubtaskRecordService.insertServiceSubtaskRecord(serviceSubtaskRecord);
                    //发送完成后,修改状态
                    serviceSubtask.setSendstate(3L);
                    if (StringUtils.isNotEmpty(isSuccess) && isSuccess.equals("true")) {
                        serviceSubtask.setResult("success");
                        serviceSubtask.setRemark("短信发送成功");
                        setSuccessPreachForm(serviceSubtask, sendPreachform, "短信发送成功", "2");
                    } else {
                        serviceSubtask.setResult("error");
                        serviceSubtask.setRemark("短信发送失败");
                        setSuccessPreachForm(serviceSubtask, sendPreachform, "短信发送失败", "5");
                    }
                } catch (Exception e) {
                    String guid = UUID.randomUUID().toString();
                    log.error("【sfHandlle】长期任务短信发送失败,原因:{},GUID:{}", e.getMessage(), guid);
                    setSuccessPreachForm(serviceSubtask, sendPreachform, "长期任务短信发送失败:系统错误", "5");
                }
            }
        } else if (descByCode.equals("公众号")) {
            log.info("【sfHandlle】处理公众号任务,任务信息:{}", ivrTask1);
            //公众号
            RSAPublicKeyExample rsaPublicKeyExample = new RSAPublicKeyExample();
            String taskId = rsaPublicKeyExample.encryptedData(ivrTask1.getTaskid().toString(), pub_key);
            boolean dateToday = isDateToday(serviceSubtask.getVisitTime());
            if (dateToday) {
                try {
                    String patid = rsaPublicKeyExample.encryptedData(serviceSubtask.getPatid().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";
                    //获取微信公众号请求信息根据机构ID
                    List<String> wxqqxx = WxGZHEnum.getDescByCode(patArchive.getOrgid());
                    if (CollectionUtils.isEmpty(wxqqxx) || wxqqxx.size() < 4) {
                        setSuccessPreachForm(serviceSubtask, sendPreachform, "【公众号】该机构的公众号配置信息不全,无法通过公众号发送", "4");
                        return;
                    }
                    if (StringUtils.isEmpty(patArchive.getPatidHis())) {
                        setSuccessPreachForm(serviceSubtask, sendPreachform, "【公众号】公众号发送失败,his系统的患者id为空", "5");
                        return;
                    }
                    String wxCode = getWXCode(serviceSubtask.getSfzh(), url, serviceSubtask.getTaskName(), serviceSubtask.getTaskDesc(), patArchive.getTelcode(), serviceSubtask.getSendname(), patArchive.getPatidHis(), wxqqxx);
                    Map<String, Object> map = JSONObject.parseObject(wxCode, Map.class);
                    //任务发送记录
                    ServiceSubtaskRecord serviceSubtaskRecord = new ServiceSubtaskRecord();
                    serviceSubtaskRecord.setTaskid(serviceSubtask.getTaskid().toString());
                    serviceSubtaskRecord.setUuid(UUID.randomUUID().toString());
                    serviceSubtaskRecord.setTasktype(serviceSubtask.getType());
                    serviceSubtaskRecord.setPreachform("4");
                    serviceSubtaskRecord.setStartTime(System.currentTimeMillis());
                    serviceSubtaskRecord.setResult("success");
                    if (!map.isEmpty() && (Boolean) map.get("succ") == false) serviceSubtaskRecord.setResult("error");
                    serviceSubtaskRecordService.insertServiceSubtaskRecord(serviceSubtaskRecord);
                    //发送完成后,修改状态
                    serviceSubtask.setSendstate(3L);
                    if ((Boolean) map.get("succ") == true) {
                        serviceSubtask.setResult("success");
                        setSuccessPreachForm(serviceSubtask, sendPreachform, "【公众号】公众号发送成功", "2");
                    } else {
                        log.error("【sfHandlle】公众号发送失败,患者信息:{},错误信息:{}", serviceSubtask, map.get("msg"));
                        setSuccessPreachForm(serviceSubtask, sendPreachform, "【公众号】公众号发送失败", "5");
                    }
                } catch (Exception e) {
                    String guid = UUID.randomUUID().toString();
                    log.error("【sfHandlle】长期任务公众号发送失败,原因:{},GUID:{}", e.getMessage(), guid);
                    setSuccessPreachForm(serviceSubtask, sendPreachform, "【公众号】长期任务公众号发送失败,原因:" + e.getMessage(), "5");
                }
            }
        } else if (descByCode.equals("人工")) {
            setSuccessPreachForm(serviceSubtask, sendPreachform, "人工待执行", "2");
        }
    }
    private String getKey() {
        Map<String, String> map = new HashMap<>();
        for (int i = 0; i < 6; i++) {
            Boolean aBoolean = redisCache.hasKey("cache-" + i);
            if (!aBoolean) {
                redisCache.setCacheObject("cache-" + i, "");
                map.put("cache-" + i, "");
            } else {
                map.put("cache-" + i, redisCache.getCacheObject("cache-" + i));
            }
    private Date getNextVisitTime(Long subid, Long taskid, Date visitTime) {
        ServiceSubtaskPreachform serviceSubtaskPreachform = new ServiceSubtaskPreachform();
        serviceSubtaskPreachform.setSubid(subid);
        serviceSubtaskPreachform.setTaskid(taskid);
        List<ServiceSubtaskPreachform> serviceSubtaskPreachforms = serviceSubtaskPreachformMapper.selectServiceSubtaskPreachformList(serviceSubtaskPreachform);
        if (CollectionUtils.isNotEmpty(serviceSubtaskPreachforms)) {
            String compensateTime = serviceSubtaskPreachforms.get(0).getCompensateTime();
            int hoursToAdd = Integer.valueOf(compensateTime) * 24;
            Calendar calendar = Calendar.getInstance();
            calendar.setTime(visitTime);
            calendar.add(Calendar.HOUR_OF_DAY, hoursToAdd);
            Date newDate = calendar.getTime();
            return newDate;
        }
        return visitTime;
    }
    private String getSendPreachform(ServiceSubtaskPreachform serviceSubtaskPreachform, ServiceSubtask serviceSubtask) {
        List<ServiceSubtaskPreachform> serviceSubtaskPreachforms = serviceSubtaskPreachformMapper.selectServiceSubtaskPreachformList(serviceSubtaskPreachform);
        // æƒ…况1:currentPreachform为空,取sort为1的preachform
        if (StringUtils.isEmpty(serviceSubtask.getCurrentPreachform())) {
            return serviceSubtaskPreachforms.stream().filter(item -> item.getSort() == 1L).map(ServiceSubtaskPreachform::getPreachform).findFirst().orElse(null);
        }
        String key = null;
        String value = "";
        for (Map.Entry<String, String> entry : map.entrySet()) {
            if (StringUtils.isEmpty(value)) {
                value = entry.getValue();
                key = entry.getKey();
            } else {
                if (entry.getValue().split(",").length < value.split(",").length) {
                    value = entry.getValue();
                    key = entry.getKey();
                }
        // æƒ…况2:currentPreachform不为空,找下一个sort
        Optional<Long> currentSort = serviceSubtaskPreachforms.stream().filter(item -> serviceSubtask.getCurrentPreachform().equals(item.getPreachform())).map(ServiceSubtaskPreachform::getSort).findFirst();
        if (currentSort.isPresent()) {
            // æ£€æŸ¥æ˜¯å¦æ‰€æœ‰sendstate不等于9
            boolean allSendStateNot1AndNot9 = serviceSubtaskPreachforms.stream().allMatch(item -> !item.getSendstate().equals("9"));
            if (!allSendStateNot1AndNot9) {
                //说明,在某种方式发送失败后,又成功了(例如短信或公众号,在规定时间外患者做完了,这个时候,状态改成了9)
                serviceSubtask.setSendstate(6L);
                serviceSubtaskMapper.updateServiceSubtask(serviceSubtask);
                return "-1";
            }
            // å½“sort等于列表size时,并且所有sendstate都不等于9,则返回-1
            if (currentSort.get().equals((long) serviceSubtaskPreachforms.size())) {
                if (allSendStateNot1AndNot9) {
                    //说明全发送失败了
                    serviceSubtask.setSendstate(5L);
                    serviceSubtaskMapper.updateServiceSubtask(serviceSubtask);
                    //修改发送状态
                    setFail(serviceSubtaskPreachforms, serviceSubtask);
                }
                return "-1";
            }
            // å½“sort等于列表size时,下一个sort为-1
            Long nextSort = currentSort.get() + 1;
            //如果当前的发送方式不为空,并且开始准备要用下一种方式发送了,那当前的肯定没有发送成功,需要设置失败
            // (这里主要是,人工如果没有随访,然后到公众号的时候,就不会再去管人工是否成功,人工的状态会一直卡在2的状态上)
            if (StringUtils.isNotEmpty(serviceSubtask.getCurrentPreachform())) {
                setFail(serviceSubtaskPreachforms, serviceSubtask);
            }
            // æ‰¾åˆ°ä¸‹ä¸€ä¸ªsort对应的preachform
            return serviceSubtaskPreachforms.stream().filter(item -> nextSort.equals(item.getSort())).map(ServiceSubtaskPreachform::getPreachform).findFirst().orElse("-1");
        }
        return key;
        return null;
    }
    private Integer setFail(List<ServiceSubtaskPreachform> serviceSubtaskPreachforms, ServiceSubtask serviceSubtask) {
        Optional<Long> id = serviceSubtaskPreachforms.stream().filter(item -> serviceSubtask.getCurrentPreachform().equals(item.getPreachform())).map(ServiceSubtaskPreachform::getId).findFirst();
        if (id.isPresent()) {
            ServiceSubtaskPreachform subtaskPreachform = new ServiceSubtaskPreachform();
            subtaskPreachform.setSendstate("5");
            subtaskPreachform.setId(id.get());
            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<>();
@@ -800,4 +871,61 @@
            log.error("【dealHisData】HIS数据采集异常", e);
        }
    }
    public Boolean setSuccessPreachForm(ServiceSubtask serviceSubtask, String preachform, String remark, String failSendstate) {
        if (preachform.equals("-1")) {
            //说明都不需要执行了
            ServiceSubtaskPreachform serviceSubtaskPreachform = new ServiceSubtaskPreachform();
            serviceSubtaskPreachform.setSubid(serviceSubtask.getId());
            serviceSubtaskPreachform.setTaskid(serviceSubtask.getTaskid());
            serviceSubtaskPreachform.setOrgid(serviceSubtask.getOrgid());
            serviceSubtaskPreachform.setSendstate(failSendstate);
            serviceSubtaskPreachformMapper.updateSSPByCondition(serviceSubtaskPreachform);
            return true;
        }
        ServiceSubtaskPreachform serviceSubtaskPreachform = new ServiceSubtaskPreachform();
        serviceSubtaskPreachform.setSubid(serviceSubtask.getId());
        serviceSubtaskPreachform.setTaskid(serviceSubtask.getTaskid());
        serviceSubtaskPreachform.setOrgid(serviceSubtask.getOrgid());
        List<ServiceSubtaskPreachform> sspCount = serviceSubtaskPreachformMapper.selectServiceSubtaskPreachformList(serviceSubtaskPreachform);
        serviceSubtaskPreachform.setPreachform(preachform);
        //1:未发送状态
        serviceSubtaskPreachform.setSendstate("1");
        //电话的未发送状态,需要查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");
        List<ServiceSubtaskPreachform> serviceSubtaskPreachforms = serviceSubtaskPreachformMapper.selectServiceSubtaskPreachformList(serviceSubtaskPreachform);
        if (CollectionUtils.isNotEmpty(serviceSubtaskPreachforms)) {
            ServiceSubtaskPreachform serviceSubtaskPreachform1 = serviceSubtaskPreachforms.get(0);
            serviceSubtaskPreachform1.setSendstate(failSendstate);
            serviceSubtaskPreachform1.setRemark(remark);
            serviceSubtaskPreachformMapper.updateServiceSubtaskPreachform(serviceSubtaskPreachform1);
            //如果当前的preachform已经是最后一个了,那直接将serviceSubtask的sendstate状态改成5就行了(全失败了)
            if (serviceSubtaskPreachform1.getSort() == sspCount.size()) {
                if (failSendstate.equals("4") || failSendstate.equals("5")) {
                    serviceSubtask.setCurrentPreachform(preachform);
                    serviceSubtask.setSendstate(5L);
                    serviceSubtaskMapper.updateServiceSubtask(serviceSubtask);
                    return true;
                }
            }
        } else {
            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);
        serviceSubtaskMapper.updateServiceSubtask(serviceSubtask);
        return true;
    }
}
ruoyi-system/src/main/java/com/ruoyi/system/service/ISysConfigService.java
@@ -5,14 +5,14 @@
/**
 * å‚数配置 æœåС层
 *
 *
 * @author ruoyi
 */
public interface ISysConfigService
{
    /**
     * æŸ¥è¯¢å‚数配置信息
     *
     *
     * @param configId å‚数配置ID
     * @return å‚数配置信息
     */
@@ -20,30 +20,24 @@
    /**
     * æ ¹æ®é”®åæŸ¥è¯¢å‚数配置信息
     *
     *
     * @param configKey å‚数键名
     * @return å‚数键值
     */
    public String selectConfigByKey(String configKey);
    /**
     * æ ¹æ®é”®åæŸ¥è¯¢å‚数配置信息
     *
     * @param configKey å‚数键名
     * @return å‚数键值
     */
    public String selectConfigByKey(String configKey,String orgid);
    /**
     * èŽ·å–éªŒè¯ç å¼€å…³
     *
     *
     * @return true开启,false关闭
     */
    public boolean selectCaptchaEnabled();
    public String selectConfigByKey(String configKey,String orgid);
    /**
     * æŸ¥è¯¢å‚数配置列表
     *
     *
     * @param config å‚数配置信息
     * @return å‚数配置集合
     */
@@ -51,7 +45,7 @@
    /**
     * æ–°å¢žå‚数配置
     *
     *
     * @param config å‚数配置信息
     * @return ç»“æžœ
     */
@@ -59,7 +53,7 @@
    /**
     * ä¿®æ”¹å‚数配置
     *
     *
     * @param config å‚数配置信息
     * @return ç»“æžœ
     */
@@ -67,7 +61,7 @@
    /**
     * æ‰¹é‡åˆ é™¤å‚数信息
     *
     *
     * @param configIds éœ€è¦åˆ é™¤çš„参数ID
     */
    public void deleteConfigByIds(Long[] configIds);
@@ -89,7 +83,7 @@
    /**
     * æ ¡éªŒå‚数键名是否唯一
     *
     *
     * @param config å‚数信息
     * @return ç»“æžœ
     */
ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SmsRecordsServiceImpl.java
@@ -48,7 +48,6 @@
    @Autowired
    private ISysConfigService configService;
    /**
     * æŸ¥è¯¢çŸ­ä¿¡è®°å½•
     *
ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysConfigServiceImpl.java
@@ -19,7 +19,7 @@
/**
 * å‚数配置 æœåŠ¡å±‚å®žçŽ°
 *
 *
 * @author ruoyi
 */
@Service
@@ -42,7 +42,7 @@
    /**
     * æŸ¥è¯¢å‚数配置信息
     *
     *
     * @param configId å‚数配置ID
     * @return å‚数配置信息
     */
@@ -57,7 +57,7 @@
    /**
     * æ ¹æ®é”®åæŸ¥è¯¢å‚数配置信息
     *
     *
     * @param configKey å‚æ•°key
     * @return å‚数键值
     */
@@ -81,6 +81,22 @@
    }
    /**
     * èŽ·å–éªŒè¯ç å¼€å…³
     *
     * @return true开启,false关闭
     */
    @Override
    public boolean selectCaptchaEnabled()
    {
        String captchaEnabled = selectConfigByKey("sys.account.captchaEnabled");
        if (StringUtils.isEmpty(captchaEnabled))
        {
            return true;
        }
        return Convert.toBool(captchaEnabled);
    }
    /**
     * æ ¹æ®é”®åæŸ¥è¯¢å‚数配置信息
     *
     * @param configKey å‚æ•°key
@@ -100,26 +116,9 @@
        }
        return StringUtils.EMPTY;
    }
    /**
     * èŽ·å–éªŒè¯ç å¼€å…³
     *
     * @return true开启,false关闭
     */
    @Override
    public boolean selectCaptchaEnabled()
    {
        String captchaEnabled = selectConfigByKey("sys.account.captchaEnabled");
        if (StringUtils.isEmpty(captchaEnabled))
        {
            return true;
        }
        return Convert.toBool(captchaEnabled);
    }
    /**
     * æŸ¥è¯¢å‚数配置列表
     *
     *
     * @param config å‚数配置信息
     * @return å‚数配置集合
     */
@@ -131,7 +130,7 @@
    /**
     * æ–°å¢žå‚数配置
     *
     *
     * @param config å‚数配置信息
     * @return ç»“æžœ
     */
@@ -148,7 +147,7 @@
    /**
     * ä¿®æ”¹å‚数配置
     *
     *
     * @param config å‚数配置信息
     * @return ç»“æžœ
     */
@@ -171,7 +170,7 @@
    /**
     * æ‰¹é‡åˆ é™¤å‚数信息
     *
     *
     * @param configIds éœ€è¦åˆ é™¤çš„参数ID
     */
    @Override
@@ -224,7 +223,7 @@
    /**
     * æ ¡éªŒå‚数键名是否唯一
     *
     *
     * @param config å‚数配置信息
     * @return ç»“æžœ
     */
@@ -242,7 +241,7 @@
    /**
     * è®¾ç½®cache key
     *
     *
     * @param configKey å‚æ•°é”®
     * @return ç¼“存键key
     */
ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysUserServiceImpl.java
@@ -272,7 +272,11 @@
    @Override
    public SysUser selectUserByUserNameAndDeptId(String userName) {
        String[] split = userName.split("&");
        if (split[2].contains("null")) {
            split[2] = null;
        }
        SysUser sysUser = userMapper.selectUserByUserNameByCondition(split[0], split[1], split[2]);
        log.info("selectUserByUserNameAndDeptId的sysUser的值为:{}", sysUser);
        if (Objects.isNull(sysUser)) return sysUser;
        List<SysDept> sysDepts = null;
        if (StringUtils.isNotEmpty(split[0]) && split[0].equals("admin")) {
@@ -512,15 +516,66 @@
        // æ–°å¢žç”¨æˆ·ä¿¡æ¯
        int rows = userMapper.insertUser(user);
        //新增用户与部门关联
        if (!CollectionUtils.isEmpty(user.getDepts())) {
            for (Long deptId : user.getDepts()) {
                SysUserDept sysUserDep = new SysUserDept();
                sysUserDep.setUserId(user.getUserId());
                sysUserDep.setDeptId(deptId);
                sysUserDep.setCreateTime(new Date());
                sysUserDep.setUpdateTime(new Date());
                sysUserDep.setOrgid(user.getOrgid());
                sysUserDeptMapper.insertSysUserDept(sysUserDep);
//        if (!CollectionUtils.isEmpty(user.getDepts())) {
//            for (Long deptId : user.getDepts()) {
//                SysUserDept sysUserDep = new SysUserDept();
//                sysUserDep.setUserId(user.getUserId());
//                sysUserDep.setDeptId(deptId);
//                sysUserDep.setCreateTime(new Date());
//                sysUserDep.setUpdateTime(new Date());
//                sysUserDep.setOrgid(user.getOrgid());
//                sysUserDeptMapper.insertSysUserDept(sysUserDep);
//            }
//        }
        if (!CollectionUtils.isEmpty(user.getDeptCodes())) {
            for (String deptCode : user.getDeptCodes()) {
                SysDept sysDept = sysDeptMapper.selectDeptByCode(deptCode);
                if (ObjectUtils.isEmpty(sysDept)) {
                    continue;
                }
                SysUserDept sysUserDept = new SysUserDept();
                sysUserDept.setUserId(user.getUserId());
                sysUserDept.setOrgid(user.getOrgid());
                sysUserDept.setDeptCode(deptCode);
                sysUserDept.setDeptId(sysDept.getDeptId());
                List<SysUserDept> sysUserDepts = sysUserDeptMapper.selectSysUserDeptList(sysUserDept);
                sysUserDept.setDelFlag(0L);
                sysUserDept.setDeptType("1");
                sysUserDept.setDeptName(sysDept.getDeptName());
                sysUserDept.setUpdateTime(new Date());
                if (!CollectionUtils.isEmpty(sysUserDepts)) {
                    sysUserDept.setId(sysUserDepts.get(0).getId());
                    sysUserDeptMapper.updateSysUserDept(sysUserDept);
                    continue;
                }
                sysUserDept.setCreateTime(new Date());
                sysUserDeptMapper.insertSysUserDept(sysUserDept);
            }
        }
        if (!CollectionUtils.isEmpty(user.getWardCodes())) {
            for (String wardCode : user.getWardCodes()) {
                SysDept sysDept = sysDeptMapper.selectDeptByCode(wardCode);
                if (ObjectUtils.isEmpty(sysDept)) {
                    continue;
                }
                SysUserDept sysUserDept = new SysUserDept();
                sysUserDept.setUserId(user.getUserId());
                sysUserDept.setDeptCode(wardCode);
                sysUserDept.setDeptId(sysDept.getDeptId());
                sysUserDept.setOrgid(user.getOrgid());
                List<SysUserDept> sysUserDepts = sysUserDeptMapper.selectSysUserDeptList(sysUserDept);
                sysUserDept.setDelFlag(0L);
                sysUserDept.setDeptType("2");
                sysUserDept.setOrgid(user.getOrgid());
                sysUserDept.setDeptName(sysDept.getDeptName());
                sysUserDept.setUpdateTime(new Date());
                if (!CollectionUtils.isEmpty(sysUserDepts)) {
                    sysUserDeptMapper.updateSysUserDept(sysUserDept);
                    continue;
                }
                sysUserDept.setCreateTime(new Date());
                sysUserDeptMapper.insertSysUserDept(sysUserDept);
            }
        }
        // æ–°å¢žç”¨æˆ·å²—位关联
ruoyi-system/src/main/resources/mapper/system/SysConfigMapper.xml
@@ -43,9 +43,6 @@
            <if test="configKey !=null and configKey != ''">
                and config_key = #{configKey}
            </if>
            <if test="orgid !=null and orgid != ''">
                and orgid = #{orgid}
            </if>
        </where>
    </sql>
ruoyi-system/src/main/resources/mapper/system/SysDeptMapper.xml
@@ -250,7 +250,7 @@
    <delete id="deleteDeptById" parameterType="Long">
        update sys_dept
        set del_flag = '2'
        set del_flag = '1'
        where dept_id = #{deptId}
    </delete>
ruoyi-system/src/main/resources/mapper/system/SysRoleMapper.xml
@@ -1,160 +1,176 @@
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.ruoyi.system.mapper.SysRoleMapper">
    <resultMap type="SysRole" id="SysRoleResult">
        <id     property="roleId"             column="role_id"               />
        <result property="roleName"           column="role_name"             />
        <result property="roleKey"            column="role_key"              />
        <result property="roleSort"           column="role_sort"             />
        <result property="dataScope"          column="data_scope"            />
        <result property="menuCheckStrictly"  column="menu_check_strictly"   />
        <result property="deptCheckStrictly"  column="dept_check_strictly"   />
        <result property="status"             column="status"                />
        <result property="delFlag"            column="del_flag"              />
        <result property="createBy"           column="create_by"             />
        <result property="createTime"         column="create_time"           />
        <result property="updateBy"           column="update_by"             />
        <result property="updateTime"         column="update_time"           />
        <result property="remark"             column="remark"                />
        <result property="guid"             column="guid"                />
        <result property="orgid"             column="orgid"                />
    </resultMap>
    <resultMap type="SysRole" id="SysRoleResult">
        <id property="roleId" column="role_id"/>
        <result property="roleName" column="role_name"/>
        <result property="roleKey" column="role_key"/>
        <result property="roleSort" column="role_sort"/>
        <result property="dataScope" column="data_scope"/>
        <result property="menuCheckStrictly" column="menu_check_strictly"/>
        <result property="deptCheckStrictly" column="dept_check_strictly"/>
        <result property="status" column="status"/>
        <result property="delFlag" column="del_flag"/>
        <result property="createBy" column="create_by"/>
        <result property="createTime" column="create_time"/>
        <result property="updateBy" column="update_by"/>
        <result property="updateTime" column="update_time"/>
        <result property="remark" column="remark"/>
        <result property="guid" column="guid"/>
        <result property="orgid" column="orgid"/>
    </resultMap>
    <sql id="selectRoleVo">
        select distinct r.role_id, r.role_name, r.role_key, r.role_sort, r.data_scope, r.menu_check_strictly, r.dept_check_strictly,
            r.status, r.del_flag, r.create_time, r.remark , r.guid, r.orgid
    <sql id="selectRoleVo">
        select distinct r.role_id,
                        r.role_name,
                        r.role_key,
                        r.role_sort,
                        r.data_scope,
                        r.menu_check_strictly,
                        r.dept_check_strictly,
                        r.status,
                        r.del_flag,
                        r.create_time,
                        r.remark,
                        r.guid,
                        r.orgid
        from sys_role r
            left join sys_user_role ur on ur.role_id = r.role_id
            left join sys_user u on u.user_id = ur.user_id
            left join sys_dept d on u.dept_id = d.dept_id
                 left join sys_user_role ur on ur.role_id = r.role_id
                 left join sys_user u on u.user_id = ur.user_id
                 left join sys_dept d on u.dept_id = d.dept_id
    </sql>
    <select id="selectRoleList" parameterType="SysRole" resultMap="SysRoleResult">
        <include refid="selectRoleVo"/>
        where r.del_flag = '0'
        <if test="roleId != null and roleId != 0">
            AND r.role_id = #{roleId}
        </if>
        <if test="roleName != null and roleName != ''">
            AND r.role_name like concat('%', #{roleName}, '%')
        </if>
        <if test="status != null and status != ''">
            AND r.status = #{status}
        </if>
        <if test="roleKey != null and roleKey != ''">
            AND r.role_key like concat('%', #{roleKey}, '%')
        </if>
        <if test="params.beginTime != null and params.beginTime != ''"><!-- å¼€å§‹æ—¶é—´æ£€ç´¢ -->
            and date_format(r.create_time,'%y%m%d') &gt;= date_format(#{params.beginTime},'%y%m%d')
        </if>
        <if test="params.endTime != null and params.endTime != ''"><!-- ç»“束时间检索 -->
            and date_format(r.create_time,'%y%m%d') &lt;= date_format(#{params.endTime},'%y%m%d')
        </if>
        <!-- æ•°æ®èŒƒå›´è¿‡æ»¤ -->
        ${params.dataScope}
        order by r.role_sort
    </select>
        <include refid="selectRoleVo"/>
        where r.del_flag = '0'
        <if test="roleId != null and roleId != 0">
            AND r.role_id = #{roleId}
        </if>
        <if test="roleName != null and roleName != ''">
            AND r.role_name like concat('%', #{roleName}, '%')
        </if>
        <if test="status != null and status != ''">
            AND r.status = #{status}
        </if>
        <if test="orgid != null and orgid != ''">
            AND r.orgid = #{orgid}
        </if>
        <if test="roleKey != null and roleKey != ''">
            AND r.role_key like concat('%', #{roleKey}, '%')
        </if>
        <if test="params.beginTime != null and params.beginTime != ''"><!-- å¼€å§‹æ—¶é—´æ£€ç´¢ -->
            and date_format(r.create_time,'%y%m%d') &gt;= date_format(#{params.beginTime},'%y%m%d')
        </if>
        <if test="params.endTime != null and params.endTime != ''"><!-- ç»“束时间检索 -->
            and date_format(r.create_time,'%y%m%d') &lt;= date_format(#{params.endTime},'%y%m%d')
        </if>
        <!-- æ•°æ®èŒƒå›´è¿‡æ»¤ -->
        ${params.dataScope}
        order by r.role_sort
    </select>
    <select id="selectRolePermissionByUserId" parameterType="Long" resultMap="SysRoleResult">
        <include refid="selectRoleVo"/>
        WHERE r.del_flag = '0' and ur.user_id = #{userId}
    </select>
    <select id="selectRolePermissionByUserId" parameterType="Long" resultMap="SysRoleResult">
        <include refid="selectRoleVo"/>
        WHERE r.del_flag = '0' and ur.user_id = #{userId}
    </select>
    <select id="selectRoleAll" resultMap="SysRoleResult">
        <include refid="selectRoleVo"/>
    </select>
    <select id="selectRoleAll" resultMap="SysRoleResult">
        <include refid="selectRoleVo"/>
    </select>
    <select id="selectRoleListByUserId" parameterType="Long" resultType="Long">
        select r.role_id
    <select id="selectRoleListByUserId" parameterType="Long" resultType="Long">
        select r.role_id
        from sys_role r
            left join sys_user_role ur on ur.role_id = r.role_id
            left join sys_user u on u.user_id = ur.user_id
        where u.user_id = #{userId}
    </select>
                 left join sys_user_role ur on ur.role_id = r.role_id
                 left join sys_user u on u.user_id = ur.user_id
        where u.user_id = #{userId}
    </select>
    <select id="selectRoleById" parameterType="Long" resultMap="SysRoleResult">
        <include refid="selectRoleVo"/>
        where r.role_id = #{roleId}
    </select>
    <select id="selectRoleById" parameterType="Long" resultMap="SysRoleResult">
        <include refid="selectRoleVo"/>
        where r.role_id = #{roleId}
    </select>
    <select id="selectRolesByUserName" parameterType="String" resultMap="SysRoleResult">
        <include refid="selectRoleVo"/>
        WHERE r.del_flag = '0' and u.user_name = #{userName}
    </select>
    <select id="selectRolesByUserName" parameterType="String" resultMap="SysRoleResult">
        <include refid="selectRoleVo"/>
        WHERE r.del_flag = '0' and u.user_name = #{userName}
    </select>
    <select id="checkRoleNameUnique" parameterType="String" resultMap="SysRoleResult">
        <include refid="selectRoleVo"/>
         where r.role_name=#{roleName} and r.del_flag = '0' limit 1
    </select>
    <select id="checkRoleNameUnique" parameterType="String" resultMap="SysRoleResult">
        <include refid="selectRoleVo"/>
        where r.role_name=#{roleName} and r.del_flag = '0' limit 1
    </select>
    <select id="checkRoleKeyUnique" parameterType="String" resultMap="SysRoleResult">
        <include refid="selectRoleVo"/>
         where r.role_key=#{roleKey} and r.del_flag = '0' limit 1
    </select>
    <select id="checkRoleKeyUnique" parameterType="String" resultMap="SysRoleResult">
        <include refid="selectRoleVo"/>
        where r.role_key=#{roleKey} and r.del_flag = '0' limit 1
    </select>
     <insert id="insertRole" parameterType="SysRole" useGeneratedKeys="true" keyProperty="roleId">
         insert into sys_role(
             <if test="roleId != null and roleId != 0">role_id,</if>
             <if test="roleName != null and roleName != ''">role_name,</if>
             <if test="roleKey != null and roleKey != ''">role_key,</if>
             <if test="roleSort != null">role_sort,</if>
             <if test="dataScope != null and dataScope != ''">data_scope,</if>
             <if test="menuCheckStrictly != null">menu_check_strictly,</if>
             <if test="deptCheckStrictly != null">dept_check_strictly,</if>
             <if test="status != null and status != ''">status,</if>
             <if test="remark != null and remark != ''">remark,</if>
             <if test="createBy != null and createBy != ''">create_by,</if>
             <if test="guid != null and guid != ''">guid,</if>
             <if test="orgid != null and orgid != ''">orgid,</if>
             create_time
         )values(
             <if test="roleId != null and roleId != 0">#{roleId},</if>
             <if test="roleName != null and roleName != ''">#{roleName},</if>
             <if test="roleKey != null and roleKey != ''">#{roleKey},</if>
             <if test="roleSort != null">#{roleSort},</if>
             <if test="dataScope != null and dataScope != ''">#{dataScope},</if>
             <if test="menuCheckStrictly != null">#{menuCheckStrictly},</if>
             <if test="deptCheckStrictly != null">#{deptCheckStrictly},</if>
             <if test="status != null and status != ''">#{status},</if>
             <if test="remark != null and remark != ''">#{remark},</if>
             <if test="createBy != null and createBy != ''">#{createBy},</if>
             <if test="guid != null and guid != ''">#{guid},</if>
             <if test="orgid != null and orgid != ''">#{orgid},</if>
             sysdate()
         )
    </insert>
    <insert id="insertRole" parameterType="SysRole" useGeneratedKeys="true" keyProperty="roleId">
        insert into sys_role(
        <if test="roleId != null and roleId != 0">role_id,</if>
        <if test="roleName != null and roleName != ''">role_name,</if>
        <if test="roleKey != null and roleKey != ''">role_key,</if>
        <if test="roleSort != null">role_sort,</if>
        <if test="dataScope != null and dataScope != ''">data_scope,</if>
        <if test="menuCheckStrictly != null">menu_check_strictly,</if>
        <if test="deptCheckStrictly != null">dept_check_strictly,</if>
        <if test="status != null and status != ''">status,</if>
        <if test="remark != null and remark != ''">remark,</if>
        <if test="createBy != null and createBy != ''">create_by,</if>
        <if test="guid != null and guid != ''">guid,</if>
        <if test="orgid != null and orgid != ''">orgid,</if>
        create_time
        )values(
        <if test="roleId != null and roleId != 0">#{roleId},</if>
        <if test="roleName != null and roleName != ''">#{roleName},</if>
        <if test="roleKey != null and roleKey != ''">#{roleKey},</if>
        <if test="roleSort != null">#{roleSort},</if>
        <if test="dataScope != null and dataScope != ''">#{dataScope},</if>
        <if test="menuCheckStrictly != null">#{menuCheckStrictly},</if>
        <if test="deptCheckStrictly != null">#{deptCheckStrictly},</if>
        <if test="status != null and status != ''">#{status},</if>
        <if test="remark != null and remark != ''">#{remark},</if>
        <if test="createBy != null and createBy != ''">#{createBy},</if>
        <if test="guid != null and guid != ''">#{guid},</if>
        <if test="orgid != null and orgid != ''">#{orgid},</if>
        sysdate()
        )
    </insert>
    <update id="updateRole" parameterType="SysRole">
         update sys_role
         <set>
             <if test="roleName != null and roleName != ''">role_name = #{roleName},</if>
             <if test="roleKey != null and roleKey != ''">role_key = #{roleKey},</if>
             <if test="roleSort != null">role_sort = #{roleSort},</if>
             <if test="dataScope != null and dataScope != ''">data_scope = #{dataScope},</if>
             <if test="menuCheckStrictly != null">menu_check_strictly = #{menuCheckStrictly},</if>
             <if test="deptCheckStrictly != null">dept_check_strictly = #{deptCheckStrictly},</if>
             <if test="status != null and status != ''">status = #{status},</if>
             <if test="remark != null">remark = #{remark},</if>
             <if test="updateBy != null and updateBy != ''">update_by = #{updateBy},</if>
             <if test="guid != null and guid != ''">guid = #{guid},</if>
             <if test="orgid != null and orgid != ''">orgid = #{orgid},</if>
             update_time = sysdate()
         </set>
         where role_id = #{roleId}
    </update>
    <update id="updateRole" parameterType="SysRole">
        update sys_role
        <set>
            <if test="roleName != null and roleName != ''">role_name = #{roleName},</if>
            <if test="roleKey != null and roleKey != ''">role_key = #{roleKey},</if>
            <if test="roleSort != null">role_sort = #{roleSort},</if>
            <if test="dataScope != null and dataScope != ''">data_scope = #{dataScope},</if>
            <if test="menuCheckStrictly != null">menu_check_strictly = #{menuCheckStrictly},</if>
            <if test="deptCheckStrictly != null">dept_check_strictly = #{deptCheckStrictly},</if>
            <if test="status != null and status != ''">status = #{status},</if>
            <if test="remark != null">remark = #{remark},</if>
            <if test="updateBy != null and updateBy != ''">update_by = #{updateBy},</if>
            <if test="guid != null and guid != ''">guid = #{guid},</if>
            <if test="orgid != null and orgid != ''">orgid = #{orgid},</if>
            update_time = sysdate()
        </set>
        where role_id = #{roleId}
    </update>
    <delete id="deleteRoleById" parameterType="Long">
         update sys_role set del_flag = '2' where role_id = #{roleId}
     </delete>
    <delete id="deleteRoleById" parameterType="Long">
        update sys_role
        set del_flag = '1'
        where role_id = #{roleId}
    </delete>
     <delete id="deleteRoleByIds" parameterType="Long">
         update sys_role set del_flag = '2' where role_id in
         <foreach collection="array" item="roleId" open="(" separator="," close=")">
             #{roleId}
    <delete id="deleteRoleByIds" parameterType="Long">
        update sys_role set del_flag = '1' where role_id in
        <foreach collection="array" item="roleId" open="(" separator="," close=")">
            #{roleId}
        </foreach>
     </delete>
    </delete>
</mapper>
ruoyi-system/src/main/resources/mapper/system/SysUserMapper.xml
@@ -119,9 +119,9 @@
        u.birthday,
        u.job_phone,
        u.phonenumber, u.sex, u.status,
        u.del_flag, u.login_ip, u.login_date, u.create_by, u.create_time, u.remark, d.dept_name, d.leader from sys_user
        u.del_flag, u.login_ip, u.login_date, u.create_by, u.create_time, u.remark, d.dept_name from sys_user
        u
        left join sys_dept d on u.dept_id = d.dept_id
        left join sys_user_dept d on u.user_id = d.user_id
        where u.del_flag = '0'
        <if test="userId != null">
            AND u.user_id = #{userId}
@@ -401,12 +401,12 @@
    <delete id="deleteUserById" parameterType="Long">
        update sys_user
        set del_flag = '2'
        set del_flag = '1'
        where user_id = #{userId}
    </delete>
    <delete id="deleteUserByIds" parameterType="Long">
        update sys_user set del_flag = '2' where user_id in
        update sys_user set del_flag = '1' where user_id in
        <foreach collection="array" item="userId" open="(" separator="," close=")">
            #{userId}
        </foreach>
smartor/src/main/java/com/smartor/common/LSHospTokenUtil.java
@@ -7,17 +7,18 @@
@Slf4j
public class LSHospTokenUtil {
     public static String getToken(String orgid,String url) {
    public static String getToken(String orgid,String url) {
        String token = null;
        LyraTokenUtil lyraTokenUtil = null;
            if (orgid.equals("47255004333112711A1001")) { //景宁
        if(ObjectUtils.isNotEmpty(url)){
            lyraTokenUtil = LyraTokenUtil.createLyraTokenUtil(url, "zjhes.suifangxt", "OIjdJvx2ALjFVGZoCZO4I8O");
            log.info("token.360调用结果"+url+";机构代码:"+orgid+"");
        }else {
            if (orgid.equals("47255004333112711A1001"))  //景宁
                lyraTokenUtil = LyraTokenUtil.createLyraTokenUtil("https://9.0.124.104:13021/mediinfo-lyra-authserver/connect/token", "zjhes.suifangxt", "OIjdJvx2ALjFVGZoCZO4I8O");
            }else  if (orgid.equals("47231022633110211A2101")) {  //中医院
            if (orgid.equals("47231022633110211A2101"))  //中医院
                lyraTokenUtil = LyraTokenUtil.createLyraTokenUtil("https://9.0.124.104:13011/mediinfo-lyra-authserver/connect/token", "zjhes.suifangxt", "OIjdJvx2ALjFVGZoCZO4I8O");
            }else if(ObjectUtils.isNotEmpty(url)) {
                lyraTokenUtil = LyraTokenUtil.createLyraTokenUtil(url, "zjhes.suifangxt", "OIjdJvx2ALjFVGZoCZO4I8O");
                log.info("token.360调用结果" + url + ";机构代码:" + orgid + "");
            }
        }
        try {
            token = lyraTokenUtil.getToken();
        } catch (IOException e) {
smartor/src/main/java/com/smartor/domain/IvrLibaTargetVO.java
@@ -90,8 +90,8 @@
    /**
     * æ˜¯å¦å¼‚常标识
     */
    @Excel(name = "是否异常标识")
    @ApiModelProperty(value = "是否异常标识")
    @Excel(name = "是否异常标识  0绿色;1红色;2黄色;")
    @ApiModelProperty(value = "是否异常标识   0绿色;1红色;2黄色;")
    private Long isabnormal;
    /**
smartor/src/main/java/com/smartor/domain/IvrTaskTemplateScriptVO.java
@@ -320,6 +320,12 @@
    private Integer sort;
    /**
     * å¼‚常预警:0绿色;1红色;2黄色
     */
    @ApiModelProperty(value = "异常预警:0绿色;1红色;2黄色")
    private Long isabnormal;
    /**
     * è¯æœ¯é€‰é¡¹
     */
    @ApiModelProperty(value = "话术选项")
smartor/src/main/java/com/smartor/domain/PatArchiveReq.java
@@ -112,7 +112,7 @@
    /**
     * æŸ¥çœ‹å…¨éƒ¨  0   æŸ¥çœ‹ä½é™¢  1  æŸ¥çœ‹é—¨è¯Š  2   æŸ¥çœ‹ä½“检  3   æŸ¥çœ‹å‡ºé™¢ 4
     * æŸ¥çœ‹å…¨éƒ¨  0   æŸ¥çœ‹å‡ºé™¢  1  æŸ¥çœ‹é—¨è¯Š  2   æŸ¥çœ‹ä½“检  3   æŸ¥çœ‹åœ¨é™¢ 4
     */
    @ApiModelProperty(value = " æŸ¥çœ‹ä½é™¢  1  æŸ¥çœ‹é—¨è¯Š  2   æŸ¥çœ‹ä½“检  3   æŸ¥çœ‹å‡ºé™¢ 4")
    private Long allhosp;
smartor/src/main/java/com/smartor/domain/PatMedInhospVO.java
@@ -34,6 +34,29 @@
    private String inhospno;
    /**
     * éšè®¿æ ‡è¯†ï¼š0不需要,1需要
     */
    @ApiModelProperty(value = "随访标识:0不需要,1需要")
    private String fuflag;
    /**
     * ç–¾ç—…处理:0未处理   1处理成功   2处理失败
     */
    @ApiModelProperty(value = "疾病处理:0未处理   1处理成功   2处理失败")
    private String diagcheckFlag;
    /**
     *病区处理:0未处理   1处理成功   2处理失败
     */
    @ApiModelProperty(value = "病区处理:0未处理   1处理成功   2处理失败")
    private String wardcheckFlag;
    /**
     * éƒ¨é—¨å¤„理:0未处理   1处理成功   2处理失败
     */
    @ApiModelProperty(value = "部门处理:0未处理   1处理成功   2处理失败")
    private String deptcheckFlag;
    /**
     * æŠ¤å£«ID
     */
    @ApiModelProperty(value = "护士ID")
smartor/src/main/java/com/smartor/domain/PatMedOuthosp.java
@@ -8,6 +8,7 @@
import lombok.Data;
import java.util.Date;
import java.util.List;
/**
 * æ‚£è€…门诊记录对象 pat_med_outhosp
@@ -82,6 +83,12 @@
     */
    @ApiModelProperty(value = "科室代码")
    private String deptcode;
    /**
     * ç§‘室代码
     */
    @ApiModelProperty(value = "科室代码集合")
    private List<String> deptcodes;
    /**
     * ç§‘室名称
@@ -161,7 +168,7 @@
    private String hpi;
    /**
     æ‚£è€…档案编号 çŽ°ç—…å²
     * æ‚£è€…档案编号 çŽ°ç—…å²
     */
    @ApiModelProperty(value = "患者档案编号")
    private String patno;
smartor/src/main/java/com/smartor/domain/PatTaskRelevance.java
@@ -217,7 +217,7 @@
    @Excel(name = "发送时间")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @ApiModelProperty("发送时间")
    private Date visitTime;
    private Date visittime;
    /**
smartor/src/main/java/com/smartor/domain/ServiceSLTDDeptReqVO.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,48 @@
package com.smartor.domain;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.List;
@ApiModel(value = "ServiceSLTDCommonReqVO", description = "省立同德出科室病区请求信息")
@Data
public class ServiceSLTDDeptReqVO {
    @ApiModelProperty(value = "机构ID æœºæž„唯一编号")
    private String orgId;
    @ApiModelProperty(value = "院区ID")
    private List<Long> campusIds;
    @ApiModelProperty(value = "机构学科,字典code")
    private String orgSubjectCode;
    @ApiModelProperty(value = "国际学科,字典code ")
    private String subjectCode;
    @ApiModelProperty(value = "科室名称模糊匹配")
    private Long searchText;
    @ApiModelProperty(value = "部门维度:  201-人事  202-业务  ä¸ä¼ -全部")
    private Long deptDimensions;
    @ApiModelProperty(value = "服务范围  ï¼š æ€¥è¯Š-emergency åŒ»æŠ€-medicalTechnology  é—¨è¯Š-outpatient ä½é™¢-hospitalization ä½“检-physicalExamination" +
            "手术-operation è¯æˆ¿-drugRoom  è¯åº“-drugWarehouse ææ–™åº“-materialWarehouse   æŠ¢æ•‘-rescue  ç•™è§‚-observation é™é…-venousConfig")
    private List<String> serviceScopes;
    @ApiModelProperty(value = "是否是病区: 0-不是 1-是")
    private Integer inpatientArea;
    @ApiModelProperty(value = "停用状态 : 1-未停用 0-停用 ä¸ä¼ -全部")
    private Integer status;
    @ApiModelProperty(value = "部门类型: FH0132.01-医疗   FH0132.02-教学  FH0132.03-科研  FH0132.04-行政  FH0132.05-后勤 FH0132.06-其他")
    private String deptType;
}
smartor/src/main/java/com/smartor/domain/ServiceSLTDInhospReqVO.java
@@ -13,7 +13,7 @@
    private String orgId;
    @ApiModelProperty(value = "院区ID")
    private Long campusIds;
    private Long campusId;
    @ApiModelProperty(value = "患者姓名   å¿…填一个")
    private String patientName;
smartor/src/main/java/com/smartor/domain/ServiceSubTaskMYDAnswerReq.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,30 @@
package com.smartor.domain;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.List;
/**
 * ç”µè¯é—®é¢˜å›žç­”明细
 *
 * @author ls
 * @date 2023-06-05
 */
@ApiModel(value = "ServiceSubTaskAnswerReq", description = "问题回答明细")
@Data
public class ServiceSubTaskMYDAnswerReq {
    @ApiModelProperty(value = "问卷结果")
    private List<SvyLibTemplateScriptVO> svyLibTemplateScriptVOS;
    @ApiModelProperty(value = "流水号")
    private String serialnum;
    @ApiModelProperty(value = "任务ID")
    private String taskId;
    @ApiModelProperty(value = "住院 1   é—¨è¯Š2    æŠ•诉3")
    private String mzzy;
}
smartor/src/main/java/com/smartor/domain/ServiceSubtask.java
@@ -68,8 +68,8 @@
    /**
     * å¼‚常标识
     */
    @ApiModelProperty(value = "异常标识")
    @Excel(name = " å¼‚常标识 ")
    @ApiModelProperty(value = "异常标识:0绿色;1红色;2黄色")
    @Excel(name = " å¼‚常标识:0绿色;1红色;2黄色 ")
    private String excep;
    /**
@@ -158,8 +158,8 @@
    /**
     * æœåŠ¡ç±»åž‹(1、监测评估;2、出院随访;3、门诊随访;4、宣教关怀;5、复诊管理;6、满意度调查;7、患者报告; 8、其他通知 9体检随访 10.医技随访  11,影像专科随访  12、心电专科随访, 13专科随访)
     */
    @Excel(name = "服务类型(1、监测评估;2、出院随访;3、门诊随访;4、宣教关怀;5、复诊管理;6、满意度调查;7、患者报告; 8、其他通知 9体检随访 10.医技随访  11,影像专科随访  12、心电专科随访, 13专科随访)")
    @ApiModelProperty(value = "服务类型(1、监测评估;2、出院随访;3、门诊随访;4、宣教关怀;5、复诊管理;6、满意度调查;7、患者报告; 8、其他通知 9体检随访 10.医技随访  11,影像专科随访  12、心电专科随访, 13专科随访")
    @Excel(name = "服务类型(1、监测评估;2、出院随访;3、门诊随访;4、宣教关怀;5、复诊管理;6、住院满意度调查;7、患者报告; 8、其他通知 9体检随访 10.医技随访  11,影像专科随访  12、心电专科随访, 13专科随访   14、门诊满意度调查  15投诉建议 16课题随访")
    @ApiModelProperty(value = "服务类型(1、监测评估;2、出院随访;3、门诊随访;4、宣教关怀;5、复诊管理;6、住院满意度调查;7、患者报告; 8、其他通知 9体检随访 10.医技随访  11,影像专科随访  12、心电专科随访, 13专科随访   14、门诊满意度调查  15投诉建议  16课题随访")
    private String serviceType;
    /**
@@ -361,6 +361,13 @@
    private String preachform;
    /**
     * å½“前发送方式
     */
    @Excel(name = " å½“前发送方式")
    @ApiModelProperty("当前发送方式")
    private String currentPreachform;
    /**
     * åºŠå·
     */
    @Excel(name = "床号")
smartor/src/main/java/com/smartor/domain/ServiceSubtaskDetail.java
@@ -23,7 +23,7 @@
    private static final long serialVersionUID = 1L;
    @ApiModelProperty(value = "主键")
    private String id;
    private Long id;
    @ApiModelProperty(value = "子任务ID")
    private Long subId;
smartor/src/main/java/com/smartor/domain/ServiceSubtaskPreachform.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,89 @@
package com.smartor.domain;
import com.ruoyi.common.annotation.Excel;
import com.ruoyi.common.core.domain.BaseEntity;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
 * ã€è¯·å¡«å†™åŠŸèƒ½åç§°ã€‘å¯¹è±¡ service_subtask_preachform
 *
 * @author lihu
 * @date 2025-09-15
 */
@Data
@ApiModel("【请填写功能名称】")
public class ServiceSubtaskPreachform extends BaseEntity {
    private static final long serialVersionUID = 1L;
    /**
     * $column.columnComment
     */
    @ApiModelProperty("$column.columnComment")
    //数据库自增改成@TableId(type = IdType.AUTO)
    private Long id;
    /**
     * ä»»åŠ¡ID
     */
    @ApiModelProperty("任务ID")
    @Excel(name = "任务ID")
    private Long subid;
    /**
     * æœåŠ¡ID
     */
    @ApiModelProperty("服务ID")
    @Excel(name = "服务ID")
    private Long taskid;
    /**
     * å‘送方式(1,人工 2,纸质  3,电话  4,短信  5.微信公众号 6.微信小程序 7.支付宝小程序  8.智能机器人  9.钉钉)
     */
    @ApiModelProperty("发送方式")
    @Excel(name = "发送方式")
    private String preachform;
    /**
     * çŸ­ä¿¡çŠ¶æ€ï¼š1未发送    2已发送   3已领取   4号码错误(无意义,为了和其它配平)     5发送失败  6不执行    9完成
     * <p>
     * å¾®ä¿¡çŠ¶æ€ï¼š1未发送    2已发送   3已领取   4微信号错误(无意义,为了和其它配平)    5发送失败  6不执行    9完成
     * <p>
     * æ™ºèƒ½è¯­éŸ³çŠ¶æ€ï¼š1未执行  2已发送  3拒接拒访   4号码错误   5执行失败   6不执行   9完成
     * <p>
     * äººå·¥éšè®¿çŠ¶æ€ï¼š1未执行   2待人工确认  3拒接拒访  4号码错误   5执行失败   6不执行      9完成
     * <p>
     * é¢è®¿çŠ¶æ€ï¼š1未执行   9完成
     */
    @ApiModelProperty("发送状态")
    private String sendstate;
    /**
     * æœºæž„编码
     */
    @ApiModelProperty("机构编码")
    @Excel(name = "机构编码")
    private String orgid;
    /**
     * åˆ é™¤çŠ¶æ€
     */
    @ApiModelProperty("删除状态")
    private String delFlag;
    /**
     * é¡ºåº
     */
    @ApiModelProperty("顺序")
    @Excel(name = "顺序")
    private Long sort;
    /**
     * è¡¥å¿æ—¶é—´ï¼ˆå•位天)
     */
    @ApiModelProperty("补偿时间(单位天)")
    @Excel(name = "补偿时间(单位天)")
    private String compensateTime;
}
smartor/src/main/java/com/smartor/domain/ServiceSubtaskVO.java
@@ -260,14 +260,14 @@
     * å‘送状态
     */
    @Excel(name = " å‘送状态 ")
    @ApiModelProperty(value = "发送状态 : 1新建 2执行中 3暂停 4终止 5完成")
    @ApiModelProperty(value = "发送状态 1 è¢«é¢†å–(在任务中是新建,在服务中是被领取)  2 å¾…发送  3 å·²å‘送  4 ä¸æ‰§è¡Œ  5 å‘送失败 6 å·²å®Œæˆ")
    private Long sendstate;
    /**
     * å‘送状态
     */
    @Excel(name = " å‘送状态集合 ")
    @ApiModelProperty(value = "发送状态 : 1新建 2执行中 3暂停 4终止 5完成")
    @ApiModelProperty(value = "发送状态 1 è¢«é¢†å–(在任务中是新建,在服务中是被领取)  2 å¾…发送  3 å·²å‘送  4 ä¸æ‰§è¡Œ  5 å‘送失败 6 å·²å®Œæˆ")
    private List<Long> sendstates;
@@ -435,6 +435,13 @@
    @ApiModelProperty(value = "宣教形式 : 1,文本、2,图片、3,语音、4,视频、5,混合")
    private String preachform;
    /**
     * å½“前发送方式
     */
    @Excel(name = " å½“前发送方式")
    @ApiModelProperty(value = "当前发送方式")
    private String currentPreachform;
    /**
     * åºŠå·
smartor/src/main/java/com/smartor/domain/ServiceTask.java
@@ -172,10 +172,10 @@
    private String type;
    /**
     * æœåŠ¡ç±»åž‹(1、监测评估;2、出院随访;3、门诊随访;4、宣教关怀;5、复诊通知;6、满意度调查;7、患者报告; 8、其他通知)
     * "服务类型(1、监测评估;2、出院随访;3、门诊随访;4、宣教关怀;5、复诊管理;6、住院满意度调查;7、患者报告; 8、其他通知 9体检随访 10.医技随访  11,影像专科随访  12、心电专科随访, 13专科随访   14、门诊满意度调查  15投诉建议"
     */
    @Excel(name = "服务类型(1、监测评估;2、出院随访;3、门诊随访;4、宣教关怀;5、复诊通知;6、满意度调查;7、患者报告; 8、其他通知)")
    @ApiModelProperty(value = "服务类型 : 1、监测评估;2、出院随访;3、门诊随访;4、宣教关怀;5、复诊管理;6、满意度调查;7、患者报告; 8、其他通知 9体检随访 10.医技随访  11,影像专科随访  12、心电专科随访, 13专病随访")
    @Excel(name = "服务类型(1、监测评估;2、出院随访;3、门诊随访;4、宣教关怀;5、复诊管理;6、住院满意度调查;7、患者报告; 8、其他通知 9体检随访 10.医技随访  11,影像专科随访  12、心电专科随访, 13专科随访   14、门诊满意度调查  15投诉建议 16课题随访")
    @ApiModelProperty(value = "服务类型(1、监测评估;2、出院随访;3、门诊随访;4、宣教关怀;5、复诊管理;6、住院满意度调查;7、患者报告; 8、其他通知 9体检随访 10.医技随访  11,影像专科随访  12、心电专科随访, 13专科随访   14、门诊满意度调查  15投诉建议 16课题随访")
    private String serviceType;
    /**
@@ -312,7 +312,7 @@
    /**
     * pageSize
     */
    @ApiModelProperty("是否是长期任务 0:不是    1:是")
    @ApiModelProperty("是否是长期任务 0:临时任务    1:长期任务   2固定任务   3循环任务")
    private Integer longTask;
    /**
smartor/src/main/java/com/smartor/domain/ServiceTaskScriptQues.java
@@ -22,13 +22,30 @@
    private String param1;
    /**
     * patid
     * patid æˆ– æµæ°´å·
     * è¯Šç–—记录号
     */
    @Excel(name = "patid  ")
    @ApiModelProperty(value = "patid")
    @Excel(name = "patid æˆ–  ä½é™¢æµæ°´å· ")
    @ApiModelProperty(value = "patid æˆ– ä½é™¢æµæ°´å·")
    private String param2;
    /**
     * patid æˆ– æµæ°´å·
     * è¯Šç–—记录号
     */
    @Excel(name = "门诊流水号  ")
    @ApiModelProperty(value = "门诊流水号")
    private String param3;
    /**
     * æŠ•诉患者编号
     * æŠ•诉患者编号
     */
    @Excel(name = "投诉患者编号 patientId ")
    @ApiModelProperty(value = "投诉患者编号 patientId")
    private String param4;
    /**
     * patfrom
     */
    @Excel(name = "patfrom  ")
smartor/src/main/java/com/smartor/domain/ServiceTaskVO.java
@@ -121,14 +121,27 @@
     */
    @Excel(name = "  ")
    private Long fail;
    /**
     * ä»»åŠ¡å½¢å¼ 1,多媒体   2,纸质  3,电话  4,短信  5.微信公众号 6.微信小程序  7.支付宝  8.智能小程序  9.钉钉
     */
    @Excel(name = "  ä»»åŠ¡å½¢å¼ 1,多媒体   2,纸质  3,电话  4,短信  5.微信公众号 6.微信小程序  7.支付宝  8.智能小程序  9.钉钉 ")
    @ApiModelProperty(value = " ä»»åŠ¡å½¢å¼ 1,多媒体   2,纸质  3,电话  4,短信  5.微信公众号 6.微信小程序  7.支付宝  8.智能小程序  9.钉钉 ")
    @Excel(name = "  ä»»åŠ¡å½¢å¼ 1,人工   2,纸质  3,电话  4,短信  5.微信公众号 6.微信小程序  7.支付宝  8.智能小程序  9.钉钉 ")
    @ApiModelProperty(value = " ä»»åŠ¡å½¢å¼ 1,人工   2,纸质  3,电话  4,短信  5.微信公众号 6.微信小程序  7.支付宝  8.智能小程序  9.钉钉 ")
    private String preachform;
    /**
     * ä»»åŠ¡å½¢å¼ 1,多媒体   2,纸质  3,电话  4,短信  5.微信公众号 6.微信小程序  7.支付宝  8.智能小程序  9.钉钉
     * [
     *     {
     *         "sort": 1,   //序号
     *         "preachform": "1",  //发送方式
     *         "compensateTime": 2   //补偿时间
     *     }
     * ]
     */
    @Excel(name = "  ä»»åŠ¡å½¢å¼ 1,人工   2,纸质  3,电话  4,短信  5.微信公众号 6.微信小程序  7.支付宝  8.智能小程序  9.钉钉 ")
    @ApiModelProperty(value = " ä»»åŠ¡å½¢å¼ 1,人工   2,纸质  3,电话  4,短信  5.微信公众号 6.微信小程序  7.支付宝  8.智能小程序  9.钉钉 ")
    private List<ServiceSubtaskPreachform> preachformList;
    /**
     *
smartor/src/main/java/com/smartor/domain/SvyTaskAnswer.java
@@ -70,10 +70,10 @@
    private String istrack;
    /**
     * å¼‚常预警(是:1、否:0)
     * å¼‚常预警:0绿色;1红色;2黄色
     */
    @ApiModelProperty(value = "异常预警  æ˜¯=:1、否:0")
    private String isabnormal;
    @ApiModelProperty(value = "异常预警:0绿色;1红色;2黄色")
    private Long isabnormal;
    /**
     * åˆ é™¤æ ‡å¿—(0:未删除 1:已删除)
smartor/src/main/java/com/smartor/domain/SvyTaskTemplateScriptVO.java
@@ -191,6 +191,13 @@
    @ApiModelProperty(value = "问题结果 ,给=“值类型”是文本或者数值用的")
    private String scriptResult;
    /**
     * å¼‚常预警:0绿色;1红色;2黄色
     */
    @ApiModelProperty(value = "异常预警:0绿色;1红色;2黄色")
    private Long isabnormal;
    /**
     * å˜é‡å‚数集合
     */
smartor/src/main/java/com/smartor/mapper/ServiceSubtaskMapper.java
@@ -31,6 +31,10 @@
     */
    public List<ServiceSubtask> selectServiceSubtaskList(ServiceSubtaskVO serviceSubtaskVO);
    public List<ServiceSubtask> queryServiceSubtaskList(ServiceSubtaskVO serviceSubtaskVO);
    public List<ServiceSubtask> selectServiceSubtaskBySendstate(ServiceSubtaskVO serviceSubtaskVO);
    public List<ServiceSubtask> selectServiceSubtaskListByCreateTime(ServiceSubtaskVO serviceSubtaskVO);
    public List<ServiceSubtask> selectServiceSubtaskListAgain(ServiceSubtaskVO serviceSubtaskVO);
smartor/src/main/java/com/smartor/mapper/ServiceSubtaskPreachformMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,73 @@
package com.smartor.mapper;
import java.util.List;
import org.apache.ibatis.annotations.Mapper;
import com.smartor.domain.ServiceSubtaskPreachform;
/**
 * ã€è¯·å¡«å†™åŠŸèƒ½åç§°ã€‘Mapper接口
 *
 * @author lihu
 * @date 2025-09-15
 */
@Mapper
public interface ServiceSubtaskPreachformMapper
{
    /**
     * æŸ¥è¯¢ã€è¯·å¡«å†™åŠŸèƒ½åç§°ã€‘
     *
     * @param id ã€è¯·å¡«å†™åŠŸèƒ½åç§°ã€‘ä¸»é”®
     * @return ã€è¯·å¡«å†™åŠŸèƒ½åç§°ã€‘
     */
    public ServiceSubtaskPreachform selectServiceSubtaskPreachformById(Long id);
    /**
     * æŸ¥è¯¢ã€è¯·å¡«å†™åŠŸèƒ½åç§°ã€‘åˆ—è¡¨
     *
     * @param serviceSubtaskPreachform ã€è¯·å¡«å†™åŠŸèƒ½åç§°ã€‘
     * @return ã€è¯·å¡«å†™åŠŸèƒ½åç§°ã€‘é›†åˆ
     */
    public List<ServiceSubtaskPreachform> selectServiceSubtaskPreachformList(ServiceSubtaskPreachform serviceSubtaskPreachform);
    /**
     * æ–°å¢žã€è¯·å¡«å†™åŠŸèƒ½åç§°ã€‘
     *
     * @param serviceSubtaskPreachform ã€è¯·å¡«å†™åŠŸèƒ½åç§°ã€‘
     * @return ç»“æžœ
     */
    public int insertServiceSubtaskPreachform(ServiceSubtaskPreachform serviceSubtaskPreachform);
    /**
     * ä¿®æ”¹ã€è¯·å¡«å†™åŠŸèƒ½åç§°ã€‘
     *
     * @param serviceSubtaskPreachform ã€è¯·å¡«å†™åŠŸèƒ½åç§°ã€‘
     * @return ç»“æžœ
     */
    public int updateServiceSubtaskPreachform(ServiceSubtaskPreachform serviceSubtaskPreachform);
    public int updateSSPByCondition(ServiceSubtaskPreachform serviceSubtaskPreachform);
    /**
     * åˆ é™¤ã€è¯·å¡«å†™åŠŸèƒ½åç§°ã€‘
     *
     * @param id ã€è¯·å¡«å†™åŠŸèƒ½åç§°ã€‘ä¸»é”®
     * @return ç»“æžœ
     */
    public int deleteServiceSubtaskPreachformById(Long id);
    /**
     * æ ¹æ®subid删除该子任务的所有发送方式
     * @param subIds
     * @return
     */
    public int deleteServiceSubtaskPreachformBySubid(Long subIds);
    /**
     * æ‰¹é‡åˆ é™¤ã€è¯·å¡«å†™åŠŸèƒ½åç§°ã€‘
     *
     * @param ids éœ€è¦åˆ é™¤çš„æ•°æ®ä¸»é”®é›†åˆ
     * @return ç»“æžœ
     */
    public int deleteServiceSubtaskPreachformByIds(Long[] ids);
}
smartor/src/main/java/com/smartor/mapper/SysDept2Mapper.java
@@ -38,7 +38,7 @@
     */
    public SysDept selectDeptById(Long deptId);
    public SysDept selectDeptByCode(String deptCode);
    public SysDept selectDeptByCode(@Param("deptCode")String deptCode,@Param("orgid")String orgid);
    /**
     * æ ¹æ®ID查询所有子部门
smartor/src/main/java/com/smartor/service/IHNGatherPatArchiveService.java
@@ -42,7 +42,7 @@
    /**
     * é—¨æ€¥è¯Šä¿¡æ¯
     *
     * @param id
     * @param patMedOuthosp
     * @return
     */
    public Integer selectPatMedOuthospList(PatMedOuthosp patMedOuthosp);
smartor/src/main/java/com/smartor/service/IServiceSLTDHealthcareRecordService.java
@@ -1,5 +1,6 @@
package com.smartor.service;
import com.smartor.domain.ServiceSLTDDeptReqVO;
import com.smartor.domain.ServiceSLTDInhospReqVO;
import com.smartor.domain.ServiceSLTDInhospResDTO;
@@ -43,7 +44,7 @@
     * @return å‚考
     * {
     * "orgId": 20001001,
     * "campusIds": 30001002,
     * "campusId": 30001002,
     * "unitIds": null,
     * "relationType": null,
     * "searchText": null,
@@ -52,5 +53,21 @@
     */
    Boolean queryHospUserInfoList(ServiceSLTDInhospReqVO reqVO);
    /**
     * é‡‡é›†ç§‘室病区信息
     *
     * @param serviceSLTDDeptReqVO
     * @return å‚考
     * {
     * "orgId": 20001001,
     * "campusIds": 30001002,
     * "unitIds": null,
     * "relationType": null,
     * "searchText": null,
     * "status": 1
     * }
     */
    Boolean queryDeptWardAreaInfoList(ServiceSLTDDeptReqVO serviceSLTDDeptReqVO);
}
smartor/src/main/java/com/smartor/service/IServiceSubtaskAnswerService.java
@@ -70,6 +70,8 @@
     */
    public Integer saveQuestionAnswer(ServiceSubTaskAnswerReq serviceSubTaskAnswerReq,Long flag);
    public Boolean saveMYDQuestionAnswer(ServiceSubTaskMYDAnswerReq serviceSubTaskMYDAnswerReq);
    /**
     * å°†é—®é¢˜ä¿å­˜åˆ°ç¼“å­˜
     *
smartor/src/main/java/com/smartor/service/IServiceTaskService.java
@@ -77,5 +77,7 @@
     */
    public Map<String, Object> getScriptInfoByCondition(Long taskid, Long patid, Boolean isFinish, String patfrom);
    public Map<String, Object> getScriptByCondition(Long taskid, String zyserialnum, String mzserialnum, String tsserialnum);
}
smartor/src/main/java/com/smartor/service/impl/CommonTaskServiceImpl.java
@@ -60,7 +60,6 @@
            //宣教
            return xjSend(sendTaskVO);
        }
        log.error("走到这里了嘛");
        return null;
    }
@@ -108,6 +107,8 @@
        //判断任务是否是立即发送
        if (StringUtils.isNotEmpty(sendTaskVO.getSendType()) && sendTaskVO.getSendType().equals("2")) {
            String content = sendMQContent(sendTaskVO, ivrTask.getTemplateid().toString(), ivrTask.getPreachform(), ivrTask.getStopState(), null);
            //先修改状态
            updateServiceSubtask(ivrTask.getTaskid(), new Date());
            //立即发送
            redisCache.setCacheObject(content, content, 1, TimeUnit.SECONDS);
            //将任务状态修改成执行中
@@ -130,23 +131,23 @@
                } catch (JsonProcessingException e) {
                    log.error("JsonProcessingException报错了:{}", e.getMessage());
                }
                Date date = new Date();
                for (TaskSendTimeVO taskSendTimeVO : taskSendTimeVOList) {
//                    //去SendTimeslot中,获取所有的时间段
//                    List<TaskSendTimeVO> list = new ArrayList<>();
//                    list.add(taskSendTimeVO);
                    //获取开始发送时间
                    String begantime = taskSendTimeVO.getBegantime();
                    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
                    //记录目前到发送时间的毫秒值 ï¼ˆå‘送时间的毫秒值 - å½“前时间的毫秒值)
                    Long milliseconds = 1000L;
                    try {
                        Date date = sdf.parse(begantime);
                        date = sdf.parse(begantime);
                        milliseconds = date.getTime() - System.currentTimeMillis();
                        System.out.println("日期毫秒数:" + milliseconds);
                        SendTaskVO sendTaskVO1 = DtoConversionUtils.sourceToTarget(sendTaskVO, SendTaskVO.class);
                        sendTaskVO1.setSendType("1");
                        String content = sendMQContent(sendTaskVO1, ivrTask.getTemplateid().toString(), ivrTask.getPreachform(), ivrTask.getStopState(), taskSendTimeVO);
                        //先修改状态
                        updateServiceSubtask(ivrTask.getTaskid(), date);
                        redisCache.setCacheObject(content, content, milliseconds / 1000, TimeUnit.SECONDS);
                    } catch (Exception e) {
                        e.printStackTrace();
@@ -208,6 +209,8 @@
        if (StringUtils.isNotEmpty(sendTaskVO.getSendType()) && sendTaskVO.getSendType().equals("2")) {
            String content = sendMQContent(sendTaskVO, serviceTask1.getTemplateid().toString(), serviceTask1.getPreachform(), serviceTask1.getStopState(), null);
            //先修改状态
            updateServiceSubtask(serviceTask1.getTaskid(), new Date());
            //立即发送
            redisCache.setCacheObject(content, content, 1, TimeUnit.SECONDS);
@@ -228,6 +231,7 @@
                } catch (JsonProcessingException e) {
                    log.error("JsonProcessingException报错了:{}", e.getMessage());
                }
                Date date = new Date();
                for (TaskSendTimeVO taskSendTimeVO : taskSendTimeVOList) {
                    //去SendTimeslot中,获取所有的时间段
//                    List<TaskSendTimeVO> list = new ArrayList<>();
@@ -239,7 +243,7 @@
                    //记录目前到发送时间的毫秒值 ï¼ˆå‘送时间的毫秒值 - å½“前时间的毫秒值)
                    Long milliseconds = 1000L;
                    try {
                        Date date = sdf.parse(begantime);
                        date = sdf.parse(begantime);
                        milliseconds = date.getTime() - System.currentTimeMillis();
                        if (milliseconds < 0) {
                            milliseconds = 1000L;
@@ -252,6 +256,8 @@
                    SendTaskVO sendTaskVO1 = DtoConversionUtils.sourceToTarget(sendTaskVO, SendTaskVO.class);
                    sendTaskVO1.setSendType("1");
                    String content = sendMQContent(sendTaskVO1, serviceTask1.getTemplateid().toString(), serviceTask1.getPreachform(), serviceTask1.getStopState(), taskSendTimeVO);
                    //先修改状态
                    updateServiceSubtask(serviceTask1.getTaskid(), date);
                    redisCache.setCacheObject(content, content, milliseconds / 1000, TimeUnit.SECONDS);
                }
                //将任务状态修改成执行中
@@ -310,6 +316,8 @@
        if (StringUtils.isNotEmpty(sendTaskVO.getSendType()) && sendTaskVO.getSendType().equals("2")) {
            String content = sendMQContent(sendTaskVO, serviceTask1.getLibtemplateid().toString(), serviceTask1.getPreachform(), serviceTask1.getStopState(), null);
            //先修改状态
            updateServiceSubtask(serviceTask1.getTaskid(), new Date());
            //立即发送
            redisCache.setCacheObject(content, content, 1, TimeUnit.SECONDS);
@@ -323,6 +331,7 @@
        } else if (StringUtils.isNotEmpty(sendTaskVO.getSendType()) && sendTaskVO.getSendType().equals("1") || StringUtils.isNotEmpty(sendTaskVO.getSendType()) && sendTaskVO.getSendType().equals("3")) {
            //时间段发送
            ObjectMapper objectMapper = new ObjectMapper();
            Date date = new Date();
            if (StringUtils.isNotEmpty(serviceTask1.getSendTimeSlot())) {
                List<TaskSendTimeVO> taskSendTimeVOList = null;
                try {
@@ -342,7 +351,7 @@
                    //记录目前到发送时间的毫秒值 ï¼ˆå‘送时间的毫秒值 - å½“前时间的毫秒值)
                    Long milliseconds = 1000L;
                    try {
                        Date date = sdf.parse(begantime);
                        date = sdf.parse(begantime);
                        milliseconds = date.getTime() - System.currentTimeMillis();
                        System.out.println("日期毫秒数:" + milliseconds);
                    } catch (Exception e) {
@@ -352,6 +361,8 @@
                    SendTaskVO sendTaskVO1 = DtoConversionUtils.sourceToTarget(sendTaskVO, SendTaskVO.class);
                    sendTaskVO1.setSendType("1");
                    String content = sendMQContent(sendTaskVO1, serviceTask1.getTemplateid().toString(), serviceTask1.getPreachform(), serviceTask1.getStopState(), taskSendTimeVO);
                    //先修改状态
                    updateServiceSubtask(serviceTask1.getTaskid(), date);
                    redisCache.setCacheObject(content, content, milliseconds / 1000, TimeUnit.SECONDS);
                }
                //将任务状态修改成执行中
@@ -389,4 +400,17 @@
        commonTaskcallMQJson = commonTaskcallMQJson.substring(1, commonTaskcallMQJson.length() - 1);
        return commonTaskcallMQJson;
    }
    private void updateServiceSubtask(Long taskId, Date date) {
        //只要进入队列就算待发送
        ServiceSubtaskVO serviceSubtaskVO = new ServiceSubtaskVO();
        serviceSubtaskVO.setTaskid(taskId);
        serviceSubtaskVO.setSendstate(1L);
        List<ServiceSubtask> serviceSubtaskList = serviceSubtaskMapper.selectServiceSubtaskList(serviceSubtaskVO);
        for (ServiceSubtask serviceSubtask : serviceSubtaskList) {
            serviceSubtask.setSendstate(2L);
            serviceSubtask.setVisitTime(date);
            serviceSubtaskMapper.updateServiceSubtask(serviceSubtask);
        }
    }
}
smartor/src/main/java/com/smartor/service/impl/HNGatherPatArchiveServiceImpl.java
@@ -157,7 +157,7 @@
            PatMedOuthosp patMedOuthosp = new PatMedOuthosp();
            patMedOuthosp.setBeginTime(Date.from(dayStart.atZone(ZoneId.systemDefault()).toInstant()));
            patMedOuthosp.setEndTime(Date.from(dayEnd.atZone(ZoneId.systemDefault()).toInstant()));
           selectPatMedOuthospList(patMedOuthosp);
            selectPatMedOuthospList(patMedOuthosp);
        }
        return true;
    }
@@ -204,6 +204,9 @@
    @Override
    public Integer selectUserList(SysUser sysUser) {
        List<SysUser> sysUserList = hnGatherPatArchiveMapper.selectUserList(sysUser);
        if (CollectionUtils.isEmpty(sysUserList)) return null;
        log.info("sysUserList的采集到的数量为:{}", sysUserList.size());
        int i = sysUser2Mapper.batchUser(sysUserList);
        for (SysUser sysUser1 : sysUserList) {
@@ -240,7 +243,8 @@
    public Integer selectDeptList(SysDept dept) {
        List<SysDept> sysDepts = hnGatherPatArchiveMapper.selectDeptList(dept);
        log.info("selectDeptList的采集到的数量为:{}", sysDepts.size());
        int i = sysDept2Mapper.batchDept(sysDepts);
        int i = 0;
        if (CollectionUtils.isNotEmpty(sysDepts)) i = sysDept2Mapper.batchDept(sysDepts);
        return i;
    }
smartor/src/main/java/com/smartor/service/impl/PatMedInhospServiceImpl.java
@@ -1,5 +1,8 @@
package com.smartor.service.impl;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.ruoyi.common.core.domain.entity.SysDept;
import com.ruoyi.common.utils.DateUtils;
import com.ruoyi.common.utils.DtoConversionUtils;
@@ -46,7 +49,7 @@
    @Autowired
    private ServiceSubtaskMapper serviceSubtaskMapper;
    @Autowired
    private SysUserDeptMapper sysUserDeptMapper;
    private ServiceSubtaskPreachformMapper serviceSubtaskPreachformMapper;
    @Value("${visitHosp}")
    private Integer visitHosp;
@@ -619,31 +622,17 @@
                        serviceSubtaskMapper.updateServiceSubtask(serviceSubtask1);
                        //重新新增子任务
                        i = serviceSubtaskMapper.insertServiceSubtask(serviceSubtask);
                        //这里需要全失败
                        addServiceSubtaskPreachform(serviceSubtask, "5");
                    }
                }
            } else {
                if (StringUtils.isEmpty(serviceSubtask.getPhone())) {
                    serviceSubtask.setRemark("手机号为空");
                    serviceSubtask.setSendstate(4L);
                    serviceSubtask.setResult("error");
//                    serviceSubtask.setFinishtime(new Date());
                }
                serviceSubtask.setCreateBy(serviceTask.getCreateBy());
                serviceSubtask.setCreateTime(new Date());
                i = serviceSubtaskMapper.insertServiceSubtask(serviceSubtask);
            }
        } else {
            if (StringUtils.isEmpty(serviceSubtask.getPhone())) {
                serviceSubtask.setRemark("手机号为空");
                serviceSubtask.setSendstate(4L);
                serviceSubtask.setResult("error");
//                serviceSubtask.setFinishtime(new Date());
            }
            serviceSubtask.setCreateBy(serviceTask.getCreateBy());
            serviceSubtask.setCreateTime(new Date());
            i = serviceSubtaskMapper.insertServiceSubtask(serviceSubtask);
            addServiceSubtaskPreachform(serviceSubtask, null);
        }
        if (i == 1) {
            //将check_flag改成1(已处理)
@@ -667,6 +656,36 @@
        }
    }
    private Integer addServiceSubtaskPreachform(ServiceSubtask serviceSubtask, String sendstate) {
        //将preachform的json对象,放到list集合中
        String preachform = serviceSubtask.getPreachform();
        ObjectMapper objectMapper = new ObjectMapper();
        if (org.apache.commons.lang3.StringUtils.isNotEmpty(preachform)) {
            List<ServiceSubtaskPreachform> serviceSubtaskPreachformList = null;
            try {
                serviceSubtaskPreachformList = objectMapper.readValue(preachform, new TypeReference<List<ServiceSubtaskPreachform>>() {
                });
            } catch (JsonProcessingException e) {
                log.error("preachform转List<ServiceSubtaskPreachform>报错了:{}", e.getMessage());
            }
            for (ServiceSubtaskPreachform serviceSubtaskPreachform : serviceSubtaskPreachformList) {
                serviceSubtaskPreachform.setTaskid(serviceSubtask.getTaskid());
                serviceSubtaskPreachform.setSubid(serviceSubtask.getId());
                //这个sendstate需要在数据库设置一个默认值为“1”
                serviceSubtaskPreachform.setSendstate("1");
                if (StringUtils.isNotEmpty(sendstate)) serviceSubtaskPreachform.setSendstate(sendstate);
                serviceSubtaskPreachform.setOrgid(serviceSubtask.getOrgid());
                return serviceSubtaskPreachformMapper.insertServiceSubtaskPreachform(serviceSubtaskPreachform);
            }
        }
        return 0;
    }
    //封装serviceSubtask
    private ServiceSubtask boxedServiceSubtask(ServiceTask serviceTask, PatMedInhosp patMedInhosp1, PatArchive patArchive) {
        ServiceSubtask serviceSubtask = DtoConversionUtils.sourceToTarget(serviceTask, ServiceSubtask.class);
smartor/src/main/java/com/smartor/service/impl/ServiceSLTDHealthcareRecordServiceImpl.java
@@ -2,24 +2,28 @@
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
import com.ruoyi.common.core.domain.entity.SysDept;
import com.ruoyi.common.core.domain.entity.SysUser;
import com.ruoyi.common.core.domain.entity.SysUserDept;
import com.ruoyi.common.core.domain.entity.SysUserRole;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.common.utils.http.HttpUtils;
import com.smartor.domain.*;
import com.smartor.mapper.PatMedOuthospMapper;
import com.smartor.mapper.SysUser2Mapper;
import com.smartor.mapper.SysUserImportMapper;
import com.smartor.mapper.*;
import com.smartor.service.IPatArchiveService;
import com.smartor.service.IPatMedInhospService;
import com.smartor.service.IServiceSLTDHealthcareRecordService;
import com.sun.org.apache.bcel.internal.generic.NEW;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.CollectionUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.stereotype.Service;
import java.lang.reflect.Array;
import java.lang.reflect.Type;
import java.math.BigDecimal;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;
@@ -29,7 +33,7 @@
public class ServiceSLTDHealthcareRecordServiceImpl implements IServiceSLTDHealthcareRecordService {
    private static final String DATE_FORMAT = "yyyy-MM-dd HH:mm:ss";
    private static final String APP_KEY = "ak-zUMiOWhqXiJQWPB1pCbz0pjr";
    public static final String APP_KEY = "ak-zUMiOWhqXiJQWPB1pCbz0pjr";
    @Autowired
    private IPatArchiveService patArchiveService;
@@ -43,25 +47,128 @@
    @Autowired
    private SysUser2Mapper sysUser2Mapper;
    @Autowired
    private SysDept2Mapper sysDeptMapper;
    @Autowired
    private SysUserDeptMapper sysUserDeptMapper;
    @Autowired
    private SysUserRole2Mapper sysUserRoleMapper;
    @Value("${sltd_pub_path}")
    private String sltdPubPath;
    @Value("${userPwd}")
    private String userPwd;
    @Override
    public List<ServiceSLTDInhospResDTO> queryHealthcareRecordList(ServiceSLTDInhospReqVO reqVO) {
        log.info("【queryHealthcareRecordList】开始调用省立同德健康记录查询接口,请求参数:{}", reqVO);
        try {
            log.info("【queryHealthcareRecordList】开始调用省立同德健康记录查询接口,请求参数:{}", reqVO);
            Map<String, Object> requestParams = buildRequestParams(reqVO);
            Map<String, String> headers = buildRequestHeaders();
            String result = HttpUtils.sendPostByHeader(sltdPubPath + "osj/hbos-thirdparty-integration/standard/common/healthcareRecord/dtcQueryHealthcareRecordList", new Gson().toJson(requestParams), headers);
            log.info("【queryHealthcareRecordList】接口响应结果:{}", result);
            String cry = determineCry(reqVO);
            return parseResponseData(result, reqVO.getHealthcareRecordTypeList().get(0), cry);
            return parseResponseData(result, reqVO.getHealthcareRecordTypeList(), cry, reqVO.getCampusId());
        } catch (Exception e) {
            log.error("【queryHealthcareRecordList】调用省立同德健康记录查询接口异常,请求参数:{}", reqVO, e);
            throw new RuntimeException("调用省立同德健康记录查询接口失败", e);
        }
    }
    /**
     * é‡‡é›†ç§‘室病区信息
     *
     * @param serviceSLTDDeptReqVO
     * @return å‚考
     * {
     * "orgId": 20001001,
     * "campusIds": 30001002,
     * "unitIds": null,
     * "relationType": null,
     * "searchText": null,
     * "status": 1
     * }
     */
    @Override
    public Boolean queryDeptWardAreaInfoList(ServiceSLTDDeptReqVO serviceSLTDDeptReqVO) {
        log.info("【queryDeptWardAreaInfoList】开始调用省立同德科室病区查询接口,请求参数:{}", serviceSLTDDeptReqVO);
        try {
            Map<String, Object> params = new HashMap<>();
            if (serviceSLTDDeptReqVO.getOrgId() != null) {
                params.put("orgId", Long.parseLong(serviceSLTDDeptReqVO.getOrgId()));
            }
            if (serviceSLTDDeptReqVO.getCampusIds() != null) {
                params.put("campusIds", serviceSLTDDeptReqVO.getCampusIds());
            }
            params.put("subjectCode", serviceSLTDDeptReqVO.getSubjectCode());
            params.put("orgSubjectCode", serviceSLTDDeptReqVO.getOrgSubjectCode());
            params.put("deptDimensions", serviceSLTDDeptReqVO.getDeptDimensions());
            params.put("serviceScopes", serviceSLTDDeptReqVO.getServiceScopes());
            params.put("inpatientArea", serviceSLTDDeptReqVO.getInpatientArea());
            params.put("status", serviceSLTDDeptReqVO.getStatus());
            Map<String, String> headers = buildRequestHeaders();
            String result = HttpUtils.sendPostByHeader(sltdPubPath + "/osj/hbos-thirdparty-integration/standard/common/dept/queryDeptList", new Gson().toJson(params), headers);
            log.info("【queryDeptWardAreaInfoList】接口响应结果:{}", result);
            List<Map<String, Object>> dataList = getDataList(result);
            log.info("-----------dataList接口响应结果:{}", dataList.size());
            for (Map<String, Object> dataItem : dataList) {
                SysDept sysDept = new SysDept();
                sysDept.setOrgid("" + serviceSLTDDeptReqVO.getCampusIds().get(0));
                sysDept.setHisDeptId("" + getLongValue(dataItem, "deptId"));
                sysDept.setHisParentId(getStringValue(dataItem, "parentDeptId"));
                //通过his的父科室ID去找到科室ID,填充parentId
                if (StringUtils.isNotEmpty(getStringValue(dataItem, "parentDeptId"))) {
                    SysDept sd = new SysDept();
                    sd.setHisDeptId(getStringValue(dataItem, "parentDeptId"));
                    sd.setOrgid(getStringValue(dataItem, "orgId"));
                    List<SysDept> sysDepts = sysDeptMapper.selectDeptList(sd);
                    if (CollectionUtils.isNotEmpty(sysDepts)) {
                        SysDept sysDept1 = sysDepts.get(0);
                        sysDept.setParentId(sysDept1.getDeptId());
                        sysDept.setParentName(sysDept1.getDeptName());
                    }
                }
                sysDept.setDeptName(getStringValue(dataItem, "deptName"));
                Integer inpatientArea = getIntegerValue(dataItem, "inpatientArea");
                if (inpatientArea != null && inpatientArea == 0) sysDept.setDeptType("1");
                else if (inpatientArea != null && inpatientArea == 1) sysDept.setDeptType("2");
                sysDept.setLeader("");
                Integer status = getIntegerValue(dataItem, "status");
                if (status != null & status == 0) sysDept.setStatus("1");
                if (status != null & status == 1) sysDept.setStatus("0");
                sysDept.setType("");
                sysDept.setDeptCode("" + getLongValue(dataItem, "deptId"));
                sysDept.setCreateBy(null);
                sysDept.setCreateTime(new Date());
                sysDept.setUpdateTime(new Date());
                sysDept.setUpdateBy(null);
                SysDept sysDept1 = sysDeptMapper.selectDeptByCode(sysDept.getDeptCode(), sysDept.getOrgid());
                if (Objects.isNull(sysDept1)) {
                    int i = sysDeptMapper.insertDept(sysDept);
                    log.info("ServiceExternalServiceImpl---addDeptInfo是否新增成功:{}", i);
                } else {
                    sysDept.setDeptId(sysDept1.getDeptId());
                    int i = sysDeptMapper.updateDept(sysDept);
                    log.info("ServiceExternalServiceImpl---addDeptInfo是否修改成功04:{}", i);
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return true;
    }
    /**
     * é‡‡é›†åŒ»é™¢ç”¨æˆ·ä¿¡æ¯
@@ -73,11 +180,14 @@
    public Boolean queryHospUserInfoList(ServiceSLTDInhospReqVO reqVO) {
        Map<String, Object> requestParams = buildRequestParams(reqVO);
        Map<String, String> headers = buildRequestHeaders();
        String result = HttpUtils.sendPostByHeader(sltdPubPath + "osj/hbos-thirdparty-integration/standard/common/healthcareRecord/dtcQueryHealthcareRecordList", new Gson().toJson(requestParams), headers);
        String result = HttpUtils.sendPostByHeader(sltdPubPath + "/osj/hbos-thirdparty-integration/standard/common/staff/queryStaffList", new Gson().toJson(requestParams), headers);
        log.info("【queryHealthcareRecordList】接口响应结果:{}", result);
        List<Map<String, Object>> dataList = getDataList(result);
        for (Map<String, Object> dataItem : dataList) {
            SysUser sysUser = new SysUser();
            if (StringUtils.isEmpty(getStringValue(dataItem, "accountNo"))) {
                continue;
            }
            sysUser.setUserName(getStringValue(dataItem, "accountNo"));
            sysUser.setNickName(getStringValue(dataItem, "name"));
            List diagnosisObjList = (List<?>) dataItem.get("qualifications");
@@ -86,15 +196,21 @@
                    if (diagnosis instanceof Map) {
                        Map<String, Object> diagnosisMap = (Map<String, Object>) diagnosis;
                        String professionalTitleName = getStringValue(diagnosisMap, "professionalTitleName");
                        if (professionalTitleName.contains("医师")) sysUser.setUserType("医生");
                        if (professionalTitleName.contains("护")) sysUser.setUserType("护士");
                        if (professionalTitleName.contains("医师")) {
                            sysUser.setUserType("医生");
                            sysUser.setSearchscope("1");
                        }
                        if (professionalTitleName.contains("护")) {
                            sysUser.setUserType("护士");
                            sysUser.setSearchscope("2");
                        }
                        sysUser.setTitle(getStringValue(diagnosisMap, "professionalTitleName"));
                    }
                }
            }
            sysUser.setDeptCode(getStringValue(dataItem, "accountNo"));
            sysUser.setDeptName(getStringValue(dataItem, "personnelDeptName"));
            sysUser.setPhonenumber(getStringValue(dataItem, "telephone"));
            sysUser.setUserCode(getStringValue(dataItem, "jobNumber"));
            //设置性别
            String genderName = getStringValue(dataItem, "genderName");
            if ("男".equals(genderName)) sysUser.setSex("0");
@@ -105,8 +221,61 @@
            sysUser.setUpdateTime(new Date());
            sysUser.setUpdateBy("admin");
            sysUser.setCreateBy("admin");
            sysUser.setCreateBy("admin");
            sysUser.setOrgid(reqVO.getCampusId().toString());
            BCryptPasswordEncoder passwordEncoder = new BCryptPasswordEncoder();
            sysUser.setPassword(passwordEncoder.encode(userPwd));
            sysUser2Mapper.insertUser(sysUser);
            // å¤„理用户与部门的关系
            List personnelDepts = (List<?>) dataItem.get("personnelDepts");
            if (CollectionUtils.isEmpty(personnelDepts)) {
                continue;
            }
            List<List<String>> deptInfoList = new ArrayList<>();
            List<List<String>> hospInfoList = new ArrayList<>();
            for (Object personnelDept : personnelDepts) {
                if (personnelDept instanceof Map) {
                    Map<String, Object> personnelDeptMap = (Map<String, Object>) personnelDept;
//                    Long hisDeptId = (Long) personnelDeptMap.get("deptId");
                    String hisDeptId = getStringValue(personnelDeptMap, "deptId");
                    //在这里,hisDeptId就是deptCode
                    SysDept sysDept = sysDeptMapper.selectDeptByCode(hisDeptId, reqVO.getCampusId().toString());
                    if (Objects.isNull(sysDept)) continue;
                    SysUserDept sysUserDept = new SysUserDept();
                    sysUserDept.setUserId(sysUser.getUserId());
                    sysUserDept.setDeptType(sysDept.getDeptType());
                    sysUserDept.setDeptId(sysDept.getDeptId());
                    sysUserDept.setDeptCode(sysDept.getDeptCode());
                    sysUserDept.setDeptName(sysDept.getDeptName());
                    sysUserDept.setOrgid(sysDept.getOrgid());
                    sysUserDept.setCreateTime(new Date());
                    sysUserDept.setDelFlag(0L);
                    sysUserDeptMapper.insertSysUserDept(sysUserDept);
                    if (StringUtils.isNotEmpty(sysDept.getDeptType()) && sysDept.getDeptType().equals("1")) {
                        hospInfoList.add(Arrays.asList(sysDept.getDeptCode()));
                    } else if (StringUtils.isNotEmpty(sysDept.getDeptType()) && sysDept.getDeptType().equals("2")) {
                        deptInfoList.add(Arrays.asList(sysDept.getDeptCode()));
                    }
                }
            }
            //将部门我病区放到指定字段中
            Gson gson = new Gson();
            sysUser.setHospInfo(gson.toJson(hospInfoList));
            sysUser.setDeptInfo(gson.toJson(deptInfoList));
            sysUser2Mapper.updateUser(sysUser);
            //设置一个默认角色(医生角色)
            List<SysUserRole> userRoleList = new ArrayList();
            SysUserRole sur = new SysUserRole();
            sur.setUserId(sysUser.getUserId());
            sur.setRoleId(3L);
            sur.setOrgid(sysUser.getOrgid());
            userRoleList.add(sur);
            sysUserRoleMapper.batchUserRole(userRoleList);
        }
        return true;
@@ -116,7 +285,7 @@
        if (reqVO.getHealthcareRecordTypeList().contains("FH0108.02")) {
            if (reqVO.getStartHeadTime() != null && reqVO.getStartTailTime() != null) {
                return "0";
            } else if (reqVO.getPreOutHospitalHeadDate() != null && reqVO.getPreOutHospitalTailDate() != null) {
            } else if (StringUtils.isNotEmpty(reqVO.getPreOutHospitalHeadDate()) && StringUtils.isNotEmpty(reqVO.getPreOutHospitalTailDate())) {
                return "1";
            }
        }
@@ -128,14 +297,26 @@
        if (reqVO.getOrgId() != null) {
            params.put("orgId", Long.parseLong(reqVO.getOrgId()));
        }
        if (reqVO.getCampusIds() != null) {
            params.put("campusIds", reqVO.getCampusIds());
        if (reqVO.getCampusId() != null) {
            params.put("campusId", reqVO.getCampusId());
        }
        if (reqVO.getStartHeadTime() != null) {
            params.put("startHeadTime", reqVO.getStartHeadTime());
        }
        if (reqVO.getStartTailTime() != null) {
            params.put("startTailTime", reqVO.getStartTailTime());
        }
        if (reqVO.getEncounterTimeStart() != null) {
            params.put("encounterTimeStart", reqVO.getEncounterTimeStart());
        }
        if (reqVO.getEncounterTimeEnd() != null) {
            params.put("encounterTimeEnd", reqVO.getEncounterTimeEnd());
        }
        if (reqVO.getPreOutHospitalHeadDate() != null) {
            params.put("preOutHospitalHeadDate", reqVO.getPreOutHospitalHeadDate());
        }
        if (reqVO.getPreOutHospitalTailDate() != null) {
            params.put("preOutHospitalTailDate", reqVO.getPreOutHospitalTailDate());
        }
        if (reqVO.getHealthcareRecordTypeList() != null && !reqVO.getHealthcareRecordTypeList().isEmpty()) {
            params.put("healthcareRecordTypeList", reqVO.getHealthcareRecordTypeList());
@@ -148,7 +329,7 @@
        }
        params.put("serviceScopes", null);
        params.put("inpatientArea", null);
        params.put("status", reqVO.getStatusList() != null && !reqVO.getStatusList().isEmpty() ? reqVO.getStatusList() : null);
        params.put("status", reqVO.getStatusList() != null && !reqVO.getStatusList().isEmpty() ? reqVO.getStatusList().get(0) : null);
        return params;
    }
@@ -159,7 +340,7 @@
        return headers;
    }
    private List<ServiceSLTDInhospResDTO> parseResponseData(String result, String type, String cry) {
    private List<ServiceSLTDInhospResDTO> parseResponseData(String result, List<String> types, String cry, Long orgid) {
        try {
            List<Map<String, Object>> dataList = getDataList(result);
@@ -169,7 +350,7 @@
            }
            log.info("【parseResponseData】成功解析{}条健康记录数据", resultList.size());
            processResultList(resultList, type, cry);
            processResultList(resultList, types, cry, orgid);
            return resultList;
        } catch (Exception e) {
            log.error("【parseResponseData】解析响应数据异常,响应内容:{}", result, e);
@@ -182,16 +363,16 @@
        Type mapType = new TypeToken<Map<String, Object>>() {
        }.getType();
        Map<String, Object> responseMap = gson.fromJson(result, mapType);
        Number codeObj = (Number) responseMap.get("code");
        if (codeObj == null || codeObj.intValue() != 200) {
            log.error("【parseResponseData】接口返回失败,响应码:{},响应内容:{}", codeObj, result);
            throw new RuntimeException("接口调用失败,响应码:" + codeObj);
        Number codeNum = (Number) responseMap.get("code");
        String code = BigDecimal.valueOf(codeNum.longValue()).toPlainString();
        if (StringUtils.isEmpty(code) || !code.equals("200")) {
            log.error("【parseResponseData】接口返回失败,响应码:{},响应内容:{}", code, result);
            throw new RuntimeException("接口调用失败,响应码:" + code);
        }
        Object dataObj = responseMap.get("data");
        if (dataObj == null) {
            log.warn("【parseResponseData】接口返回数据为空");
            log.info("【parseResponseData】接口返回数据为空");
            return new ArrayList<>();
        }
@@ -202,36 +383,38 @@
        return dataList;
    }
    private void processResultList(List<ServiceSLTDInhospResDTO> resultList, String type, String cry) {
        switch (type) {
            case "FH0108.01":
                log.info("【parseResponseData】解析门诊数据");
                outHospitalDate(resultList);
                break;
            case "FH0108.02":
                log.info("【parseResponseData】解析住院数据");
                inHospitalDate(resultList, cry);
                break;
            case "FH0108.03":
                log.info("【parseResponseData】解析急诊数据");
                outHospitalDate(resultList);
                break;
            default:
                log.warn("【parseResponseData】未知的数据类型:{}", type);
                break;
        }
    private void processResultList(List<ServiceSLTDInhospResDTO> resultList, List<String> types, String cry, Long orgid) {
        for (String type : types)
            switch (type) {
                case "FH0108.01":
                    log.info("【parseResponseData】解析门诊数据");
                    outHospitalDate(resultList, orgid);
                    break;
                case "FH0108.02":
                    log.info("【parseResponseData】解析住院数据");
                    inHospitalDate(resultList, cry, orgid);
                    break;
                case "FH0108.03":
                    log.info("【parseResponseData】解析急诊数据");
                    outHospitalDate(resultList, orgid);
                    break;
                default:
                    log.warn("【parseResponseData】未知的数据类型:{}", type);
                    break;
            }
    }
    private Boolean outHospitalDate(List<ServiceSLTDInhospResDTO> resultList) {
    private Boolean outHospitalDate(List<ServiceSLTDInhospResDTO> resultList, Long orgid) {
        for (ServiceSLTDInhospResDTO dto : resultList) {
            PatArchive patArchive = processPatientArchive(dto);
            PatMedOuthosp patMedOuthosp = buildPatMedOuthosp(dto, patArchive);
            if (Objects.isNull(dto)) continue;
            PatArchive patArchive = processPatientArchive(dto, orgid);
            PatMedOuthosp patMedOuthosp = buildPatMedOuthosp(dto, patArchive, orgid);
            patMedOuthospMapper.insertPatMedOuthosp(patMedOuthosp);
        }
        return true;
    }
    private PatMedOuthosp buildPatMedOuthosp(ServiceSLTDInhospResDTO dto, PatArchive patArchive) {
    private PatMedOuthosp buildPatMedOuthosp(ServiceSLTDInhospResDTO dto, PatArchive patArchive, Long orgid) {
        PatMedOuthosp patMedOuthosp = new PatMedOuthosp();
        patMedOuthosp.setOuthospno(dto.getHealthcareRecordNo());
        patMedOuthosp.setSerialnum(dto.getHealthcareRecordNo());
@@ -249,10 +432,14 @@
        patMedOuthosp.setMainsuit(dto.getDiagnosisName());
        patMedOuthosp.setHpi(null);
        patMedOuthosp.setCreateTime(new Date());
        patMedOuthosp.setOrgid("" + orgid);
        return patMedOuthosp;
    }
    private Date parseDate(String dateStr) {
        if (StringUtils.isEmpty(dateStr)) {
            return null;
        }
        try {
            return new SimpleDateFormat(DATE_FORMAT).parse(dateStr);
        } catch (ParseException e) {
@@ -261,21 +448,25 @@
        }
    }
    private Boolean inHospitalDate(List<ServiceSLTDInhospResDTO> resultList, String cry) {
    private Boolean inHospitalDate(List<ServiceSLTDInhospResDTO> resultList, String cry, Long orgid) {
        for (ServiceSLTDInhospResDTO dto : resultList) {
            PatArchive patArchive = processPatientArchive(dto);
            processPatientInhospInfo(dto, patArchive, cry);
            if (Objects.isNull(dto)) continue;
            PatArchive patArchive = processPatientArchive(dto, orgid);
            processPatientInhospInfo(dto, patArchive, cry, orgid);
        }
        return true;
    }
    private void processPatientInhospInfo(ServiceSLTDInhospResDTO dto, PatArchive patArchive, String cry) {
        PatMedInhosp patMedInhosp = buildPatientInhospInfo(dto, patArchive, cry);
    private void processPatientInhospInfo(ServiceSLTDInhospResDTO dto, PatArchive patArchive, String cry, Long orgid) {
        PatMedInhosp patMedInhosp = buildPatientInhospInfo(dto, patArchive, cry, orgid);
        PatMedInhosp queryInhosp = new PatMedInhosp();
        queryInhosp.setPatno(patArchive.getPatientno());
        queryInhosp.setSerialnum(patMedInhosp.getSerialnum());
        queryInhosp.setOrgid("" + orgid);
        log.info("----------------这里的入参为:{}", queryInhosp);
        List<PatMedInhosp> existingInhosps = patMedInhospService.selectPatMedInhospList(queryInhosp);
        log.info("----------------这里的返参为:{}", existingInhosps);
        if (CollectionUtils.isNotEmpty(existingInhosps)) {
            patMedInhosp.setInhospid(existingInhosps.get(0).getInhospid());
            patMedInhospService.updatePatMedInhosp(patMedInhosp);
@@ -286,7 +477,8 @@
        }
    }
    private PatMedInhosp buildPatientInhospInfo(ServiceSLTDInhospResDTO dto, PatArchive patArchive, String cry) {
    private PatMedInhosp buildPatientInhospInfo(ServiceSLTDInhospResDTO dto, PatArchive patArchive, String cry, Long orgid) {
        log.info("----------------buildPatientInhospInfo这里进来了吗?{}", cry);
        PatMedInhosp patMedInhosp = new PatMedInhosp();
        patMedInhosp.setPatid(patArchive.getId());
        patMedInhosp.setPatno(patArchive.getPatientno());
@@ -295,7 +487,8 @@
        patMedInhosp.setNurseName(dto.getChiefNurseName());
        patMedInhosp.setSerialnum(dto.getHealthcareRecordNo());
        patMedInhosp.setFuflag("1");
        patMedInhosp.setInhospstate("0".equals(cry) ? "0" : "1");
        if ("0".equals(cry)) patMedInhosp.setInhospstate("0");
        if ("1".equals(cry)) patMedInhosp.setInhospstate("1");
        patMedInhosp.setHospitalcode(dto.getOrgId());
        patMedInhosp.setBedNo(dto.getBedNumber());
        patMedInhosp.setStarttime(parseDate(dto.getStartTime()));
@@ -311,7 +504,7 @@
        patMedInhosp.setDrcode("" + dto.getDoctorId());
        patMedInhosp.setSchemestatus("0".equals(cry) ? 1L : 2L);
        patMedInhosp.setDelFlag("0");
        patMedInhosp.setOrgid("1");
        patMedInhosp.setOrgid("" + orgid);
        return patMedInhosp;
    }
@@ -338,12 +531,12 @@
        patMedInhosp.setHospitaldistrictname(dto.getAreaName());
    }
    private PatArchive processPatientArchive(ServiceSLTDInhospResDTO dto) {
    private PatArchive processPatientArchive(ServiceSLTDInhospResDTO dto, Long orgid) {
        PatArchive queryArchive = new PatArchive();
        queryArchive.setIdcardno(dto.getIdCardNo().trim());
        queryArchive.setIdcardno(StringUtils.isEmpty(dto.getIdCardNo()) ? "" + dto.getMedicalCardId() : dto.getIdCardNo().trim());
        List<PatArchive> existingArchives = patArchiveService.selectPatArchiveList(queryArchive);
        PatArchive patArchive = buildPatientArchive(dto);
        PatArchive patArchive = buildPatientArchive(dto, orgid);
        if (CollectionUtils.isEmpty(existingArchives)) {
            patArchiveService.insertPatArchive(patArchive);
@@ -357,10 +550,10 @@
        return patArchive;
    }
    private PatArchive buildPatientArchive(ServiceSLTDInhospResDTO dto) {
    private PatArchive buildPatientArchive(ServiceSLTDInhospResDTO dto, Long orgid) {
        PatArchive patArchive = new PatArchive();
        patArchive.setPatientno(dto.getMedicalRecordNo());
        patArchive.setIdcardno(dto.getIdCardNo().trim());
        patArchive.setPatientno("" + dto.getPatientId());
        patArchive.setIdcardno(StringUtils.isEmpty(dto.getIdCardNo()) ? "" + dto.getMedicalCardId() : dto.getIdCardNo().trim());
        patArchive.setName(dto.getPatientName());
        patArchive.setSourcefrom(2);
        patArchive.setPattype("2");
@@ -376,6 +569,7 @@
        patArchive.setDelFlag("0");
        patArchive.setCreateTime(new Date());
        patArchive.setUpdateTime(new Date());
        patArchive.setOrgid("" + orgid);
        return patArchive;
    }
@@ -485,7 +679,12 @@
    private String getStringValue(Map<String, Object> map, String key) {
        Object value = map.get(key);
        return value != null ? value.toString() : null;
        if (value == null) {
            return null;
        }
        // åªå¤„理数字类型,避免科学计数法
        return value instanceof Number ? new BigDecimal(value.toString()).toPlainString() : value.toString();
    }
    private Long getLongValue(Map<String, Object> map, String key) {
smartor/src/main/java/com/smartor/service/impl/ServiceSubtaskAnswerServiceImpl.java
@@ -1,17 +1,12 @@
package com.smartor.service.impl;
import afu.org.checkerframework.checker.oigj.qual.O;
import com.alibaba.fastjson2.JSON;
import com.ruoyi.common.core.redis.RedisCache;
import com.ruoyi.common.utils.DateUtils;
import com.ruoyi.common.utils.DtoConversionUtils;
import com.ruoyi.common.utils.RSAPublicKeyExample;
import com.ruoyi.common.utils.StringUtils;
import com.smartor.domain.*;
import com.smartor.mapper.ServiceSubtaskAnswerMapper;
import com.smartor.mapper.ServiceSubtaskDetailMapper;
import com.smartor.mapper.ServiceSubtaskMapper;
import com.smartor.mapper.SvyTaskTemplateTargetoptionMapper;
import com.smartor.mapper.*;
import com.smartor.service.IServiceSubtaskAnswerService;
import com.smartor.service.IServiceTaskService;
import lombok.extern.slf4j.Slf4j;
@@ -23,7 +18,6 @@
import java.math.BigDecimal;
import java.util.*;
import java.util.concurrent.TimeUnit;
/**
 * ä»»åŠ¡é—®å·é—®é¢˜é€‰é¡¹Service业务层处理
@@ -41,6 +35,9 @@
    private ServiceSubtaskMapper serviceSubtaskMapper;
    @Autowired
    private ServiceSubtaskPreachformMapper serviceSubtaskPreachformMapper;
    @Autowired
    private RedisCache redisCache;
    @Autowired
@@ -50,10 +47,20 @@
    private IServiceTaskService serviceTaskService;
    @Autowired
    private SvyTaskTemplateTargetoptionMapper svyTaskTemplateTargetoptionMapper;
    private PatArchiveMapper patArchiveMapper;
    @Autowired
    private PatMedInhospMapper patMedInhospMapper;
    @Autowired
    private PatMedOuthospMapper patMedOuthospMapper;
    @Value("${pri_key}")
    private String pri_key;
    @Value("${dealDeptCode}")
    private String dealDeptCode;
    /**
     * æŸ¥è¯¢ä»»åŠ¡é—®å·é—®é¢˜é€‰é¡¹
@@ -129,6 +136,7 @@
        Long tid = null;
        Long pid = null;
        Double score = null;
        Long isabno = 0L;
        Set<String> allKeys = redisCache.getAllKeys();
        if (ObjectUtils.isNotEmpty(serviceSubTaskAnswerReq)) {
            //需要立即执行
@@ -179,7 +187,8 @@
                                svyTaskTemplateScriptVO.setSvyTaskTemplateTargetoptions(svyTaskTemplateTargetoptions);
                                Map<String, String> map = setWJInfo(svyTaskTemplateScriptVO, tid, pid);
                                if (map == null) continue aa;
                                nextScriptno = Long.valueOf(map.get("nextScriptNo"));
                                if (!Objects.isNull(map.get("nextScriptNo")))
                                    nextScriptno = Long.valueOf(map.get("nextScriptNo"));
                                if (score == null) {
                                    score = Double.valueOf(map.get("score"));
                                } else {
@@ -197,7 +206,8 @@
                            log.error("svyTaskTemplateScriptVO的值为:{}", svyTaskTemplateScriptVO);
                            Map<String, String> map = setWJInfo(svyTaskTemplateScriptVO, Long.valueOf(split[1]), Long.valueOf(split[0]));
                            log.error("map的信息为:{}", map);
                            nextScriptno = Long.valueOf(map.get("nextScriptNo"));
                            if (!Objects.isNull(map.get("nextScriptNo")))
                                nextScriptno = Long.valueOf(map.get("nextScriptNo"));
                            if (score == null) {
                                score = Double.valueOf(map.get("score"));
                            } else {
@@ -221,7 +231,8 @@
                                List<IvrTaskTemplateTargetoption> ivrTaskTemplateTargetoptions = DtoConversionUtils.sourceToTarget(ivrLibaTemplateTargetoptions, IvrTaskTemplateTargetoption.class);
                                ivrTaskTemplateScriptVO.setIvrTaskScriptTargetoptionList(ivrTaskTemplateTargetoptions);
                                Map<String, String> map = setSFInfo(ivrTaskTemplateScriptVO, tid, pid);
                                nextScriptno = Long.valueOf(map.get("nextScriptNo"));
                                if (!Objects.isNull(map.get("nextScriptNo")))
                                    nextScriptno = Long.valueOf(map.get("nextScriptNo"));
                                if (score == null) {
                                    score = Double.valueOf(map.get("score"));
                                } else {
@@ -238,7 +249,8 @@
                        if (ivrTaskTemplateScriptVO.getSort() != null && Long.valueOf(ivrTaskTemplateScriptVO.getSort()).equals(nextScriptno)) {
                            Map<String, String> map = setSFInfo(ivrTaskTemplateScriptVO, Long.valueOf(split[1]), Long.valueOf(split[0]));
                            log.error("map的信息为:{}", map);
                            nextScriptno = Long.valueOf(map.get("nextScriptNo"));
                            if (!Objects.isNull(map.get("nextScriptNo")))
                                nextScriptno = Long.valueOf(map.get("nextScriptNo"));
                            if (score == null) {
                                score = Double.valueOf(map.get("score"));
                            } else {
@@ -252,6 +264,14 @@
            }
            //将该key和value从redis中,删除
            redisCache.deleteObject(key);
            //查询出该任务中正在执行的患者信息
            ServiceSubtaskVO ssVO = new ServiceSubtaskVO();
            ssVO.setTaskid(tid);
            ssVO.setPatid(pid);
            ssVO.setSendstate(3L);
            List<ServiceSubtask> serviceSubtaskList = serviceSubtaskMapper.selectServiceSubtaskList(ssVO);
            ServiceSubtask serviceSubtask = new ServiceSubtask();
            serviceSubtask.setTaskid(tid);
            serviceSubtask.setPatid(pid);
@@ -263,8 +283,186 @@
            log.error("将该key和value从redis中,serviceSubtask的值为--------:{}", serviceSubtask);
            if (score != null) serviceSubtask.setScore(BigDecimal.valueOf(score));
            serviceSubtaskMapper.updateServiceSubtaskByCondition(serviceSubtask);
            //将当前发送状态改成9完成
            ServiceSubtaskPreachform serviceSubtaskPreachform = new ServiceSubtaskPreachform();
            serviceSubtaskPreachform.setPreachform(serviceSubtaskList.get(0).getCurrentPreachform());
            serviceSubtaskPreachform.setSubid(serviceSubtask.getId());
            serviceSubtaskPreachform.setTaskid(serviceSubtask.getTaskid());
            List<ServiceSubtaskPreachform> serviceSubtaskPreachforms = serviceSubtaskPreachformMapper.selectServiceSubtaskPreachformList(serviceSubtaskPreachform);
            if (CollectionUtils.isNotEmpty(serviceSubtaskPreachforms)) {
                ServiceSubtaskPreachform ssp = serviceSubtaskPreachforms.get(0);
                ssp.setSendstate("9");
                serviceSubtaskPreachformMapper.updateServiceSubtaskPreachform(ssp);
            }
        }
        return 1;
    }
    @Override
    public Boolean saveMYDQuestionAnswer(ServiceSubTaskMYDAnswerReq serviceSubTaskMYDAnswerReq) {
        //用来处理投诉建议的部门
        String dealDept = null;
        Long patid = null;
        List<PatMedInhosp> patMedInhospList = null;
        List<PatMedOuthosp> patMedOuthosps = null;
        List<Long> idList = new ArrayList<>();
        if (serviceSubTaskMYDAnswerReq.getMzzy().equals("1")) {
            //住院
            PatMedInhosp patMedInhosp = new PatMedInhosp();
            patMedInhosp.setSerialnum(serviceSubTaskMYDAnswerReq.getSerialnum());
            patMedInhospList = patMedInhospMapper.selectPatMedInhospList(patMedInhosp);
            if (CollectionUtils.isNotEmpty(patMedInhospList)) patid = patMedInhospList.get(0).getPatid();
        } else if (serviceSubTaskMYDAnswerReq.getMzzy().equals("2")) {
            //门诊
            PatMedOuthosp patMedOuthosp = new PatMedOuthosp();
            patMedOuthosp.setSerialnum(serviceSubTaskMYDAnswerReq.getSerialnum());
            patMedOuthosps = patMedOuthospMapper.selectPatMedOuthospList(patMedOuthosp);
            if (CollectionUtils.isNotEmpty(patMedOuthosps)) patid = patMedOuthosps.get(0).getPatid();
        } else if (serviceSubTaskMYDAnswerReq.getMzzy().equals("3")) {
            //指定一个部门,用来处理投诉建议
            dealDept = dealDeptCode;
            String serialnum = serviceSubTaskMYDAnswerReq.getSerialnum();
            PatArchive patArchive = new PatArchive();
            patArchive.setPatientno(serialnum);
            List<PatArchive> patArchives = patArchiveMapper.selectPatArchiveList(patArchive);
            if (CollectionUtils.isNotEmpty(patArchives)) {
                patid = patArchives.get(0).getId();
            }
        }
        if (CollectionUtils.isNotEmpty(serviceSubTaskMYDAnswerReq.getSvyLibTemplateScriptVOS())) {
            Double score = null;
            List<SvyLibTemplateScriptVO> svyLibTemplateScriptVOS = serviceSubTaskMYDAnswerReq.getSvyLibTemplateScriptVOS();
            Long nextScriptno = null;
            for (int i = 0; i < svyLibTemplateScriptVOS.size(); i++) {
                if (i == 0) {
                    //这个时间要找到第一题
                    for (SvyLibTemplateScriptVO svyLibTemplateScriptVO : svyLibTemplateScriptVOS) {
                        if (svyLibTemplateScriptVO.getSort() == 1L) {
                            //说明是第一题
                            SvyTaskTemplateScriptVO svyTaskTemplateScriptVO = DtoConversionUtils.sourceToTarget(svyLibTemplateScriptVOS.get(0), SvyTaskTemplateScriptVO.class);
                            List<SvyLibTemplateTargetoption> svyLibTemplateTargetoptions = svyLibTemplateScriptVOS.get(0).getSvyLibTemplateTargetoptions();
                            List<SvyTaskTemplateTargetoption> svyTaskTemplateTargetoptions = DtoConversionUtils.sourceToTarget(svyLibTemplateTargetoptions, SvyTaskTemplateTargetoption.class);
                            svyTaskTemplateScriptVO.setSvyTaskTemplateTargetoptions(svyTaskTemplateTargetoptions);
                            Map<String, String> map = setWJInfo(svyTaskTemplateScriptVO, Long.valueOf(serviceSubTaskMYDAnswerReq.getTaskId()), patid);
                            if (map == null) continue;
                            if (!Objects.isNull(map.get("nextScriptNo")))
                                nextScriptno = Long.valueOf(map.get("nextScriptNo"));
                            if (score == null) {
                                score = Double.valueOf(map.get("score"));
                            } else {
                                score = score + Double.valueOf(map.get("score"));
                            }
                            if (!Objects.isNull(map.get("id"))) {
                                idList.add(Long.valueOf(map.get("id")));
                            }
                        }
                    }
                } else {
                    SvyTaskTemplateScriptVO svyTaskTemplateScriptVO = DtoConversionUtils.sourceToTarget(svyLibTemplateScriptVOS.get(i), SvyTaskTemplateScriptVO.class);
                    List<SvyTaskTemplateTargetoption> svyTaskTemplateTargetoptions = DtoConversionUtils.sourceToTarget(svyLibTemplateScriptVOS.get(i).getSvyLibTemplateTargetoptions(), SvyTaskTemplateTargetoption.class);
                    svyTaskTemplateScriptVO.setSvyTaskTemplateTargetoptions(svyTaskTemplateTargetoptions);
                    if (svyTaskTemplateScriptVO.getSort() != null && svyTaskTemplateScriptVO.getSort().equals(nextScriptno)) {
                        log.error("svyTaskTemplateScriptVO的值为:{}", svyTaskTemplateScriptVO);
                        Map<String, String> map = setWJInfo(svyTaskTemplateScriptVO, Long.valueOf(serviceSubTaskMYDAnswerReq.getTaskId()), patid);
                        log.error("map的信息为:{}", map);
                        if (!Objects.isNull(map.get("nextScriptNo")))
                            nextScriptno = Long.valueOf(map.get("nextScriptNo"));
                        if (score == null) {
                            score = Double.valueOf(map.get("score"));
                        } else {
                            score = score + Double.valueOf(map.get("score"));
                        }
                        if (!Objects.isNull(map.get("id"))) {
                            idList.add(Long.valueOf(map.get("id")));
                        }
                    }
                }
            }
            ServiceTask serviceTask = serviceTaskService.selectServiceTaskByTaskid(Long.valueOf(serviceSubTaskMYDAnswerReq.getTaskId()));
            PatArchive patArchive = patArchiveMapper.selectPatArchiveByPatid(patid);
            if (!Objects.isNull(serviceTask)) {
                ServiceSubtask serviceSubtask = new ServiceSubtask();
                serviceSubtask.setTaskid(serviceTask.getTaskid());
                serviceSubtask.setTaskName(serviceTask.getTaskName());
                serviceSubtask.setTaskDesc(serviceTask.getTaskDesc());
                serviceSubtask.setTemplateid(serviceTask.getTemplateid());
                serviceSubtask.setTemplatename(serviceTask.getTemplatename());
                serviceSubtask.setLibtemplateid(Long.valueOf(serviceTask.getLibtemplateid()));
                if (CollectionUtils.isNotEmpty(patMedInhospList)) {
                    serviceSubtask.setHospType("2");
                    serviceSubtask.setDeptname(patMedInhospList.get(0).getDeptname());
                    serviceSubtask.setDeptcode(patMedInhospList.get(0).getDeptcode());
                    serviceSubtask.setLeavehospitaldistrictcode(patMedInhospList.get(0).getLeavehospitaldistrictcode());
                    serviceSubtask.setLeavehospitaldistrictname(patMedInhospList.get(0).getLeavehospitaldistrictname());
                    serviceSubtask.setDrname(patMedInhospList.get(0).getDrname());
                    serviceSubtask.setDrcode(patMedInhospList.get(0).getDrcode());
                    serviceSubtask.setNurseName(patMedInhospList.get(0).getNurseName());
                    serviceSubtask.setNurseId(patMedInhospList.get(0).getNurseId());
                    serviceSubtask.setInhospid(patMedInhospList.get(0).getInhospid());
                    serviceSubtask.setServiceType("6");
                } else if (CollectionUtils.isNotEmpty(patMedOuthosps)) {
                    serviceSubtask.setHospType("1");
                    serviceSubtask.setAdmindate(patMedOuthosps.get(0).getAdmitdate());
                    serviceSubtask.setHospno(patMedOuthosps.get(0).getOuthospno());
                    serviceSubtask.setDeptname(patMedOuthosps.get(0).getDeptname());
                    serviceSubtask.setDeptcode(patMedOuthosps.get(0).getDeptcode());
                    serviceSubtask.setDrname(patMedOuthosps.get(0).getDrname());
                    serviceSubtask.setDrcode(patMedOuthosps.get(0).getDrcode());
                    serviceSubtask.setServiceType("14");
                }
                if (!Objects.isNull(patArchive)) {
                    serviceSubtask.setPatid(patArchive.getId());
                    serviceSubtask.setSendname(patArchive.getName());
                    serviceSubtask.setSex(patArchive.getSex());
                    serviceSubtask.setPhone(patArchive.getTelcode());
                    serviceSubtask.setSfzh(patArchive.getIdcardno());
                    serviceSubtask.setAddr(patArchive.getPlaceOfResidence());
                    serviceSubtask.setOrgid(patArchive.getOrgid());
                }
                if (StringUtils.isNotEmpty(dealDept)) {
                    //投诉建议的处理部门
                    serviceSubtask.setDeptcode(dealDept);
                    serviceSubtask.setServiceType("15");
                }
                serviceSubtask.setSubmit(1L);
                serviceSubtask.setSendstate(6L);
                serviceSubtask.setType("2");
                serviceSubtask.setExcep(null);
                serviceSubtask.setFinishtime(new Date());
                serviceSubtask.setUpdateTime(new Date());
                serviceSubtask.setCreateTime(new Date());
                serviceSubtask.setVisitTime(new Date());
                if (score != null) serviceSubtask.setScore(BigDecimal.valueOf(score));
                serviceSubtaskMapper.insertServiceSubtask(serviceSubtask);
                //将当前发送状态改成9完成
                ServiceSubtaskPreachform serviceSubtaskPreachform = new ServiceSubtaskPreachform();
                serviceSubtaskPreachform.setPreachform(serviceSubtask.getCurrentPreachform());
                serviceSubtaskPreachform.setSubid(serviceSubtask.getId());
                serviceSubtaskPreachform.setTaskid(serviceSubtask.getTaskid());
                List<ServiceSubtaskPreachform> serviceSubtaskPreachforms = serviceSubtaskPreachformMapper.selectServiceSubtaskPreachformList(serviceSubtaskPreachform);
                if (CollectionUtils.isNotEmpty(serviceSubtaskPreachforms)) {
                    ServiceSubtaskPreachform ssp = serviceSubtaskPreachforms.get(0);
                    ssp.setSendstate("9");
                    serviceSubtaskPreachformMapper.updateServiceSubtaskPreachform(ssp);
                }
                for (Long detailId : idList) {
                    ServiceSubtaskDetail serviceSubtaskDetail = new ServiceSubtaskDetail();
                    serviceSubtaskDetail.setId(detailId);
                    serviceSubtaskDetail.setSubId(serviceSubtask.getId());
                    serviceSubtaskDetailMapper.updateServiceSubtaskDetail(serviceSubtaskDetail);
                }
            }
        }
        return true;
    }
@@ -287,7 +485,7 @@
                tid = Long.valueOf(serviceSubTaskCacheReq.getParam1());
                pid = Long.valueOf(serviceSubTaskCacheReq.getParam2());
            }
            if (CollectionUtils.isNotEmpty(serviceSubTaskCacheReq.getSvyLibTemplateScriptVOS()) &&  serviceSubTaskCacheReq.getSvyLibTemplateScriptVOS().size() > 0) {
            if (CollectionUtils.isNotEmpty(serviceSubTaskCacheReq.getSvyLibTemplateScriptVOS()) && serviceSubTaskCacheReq.getSvyLibTemplateScriptVOS().size() > 0) {
                //问卷
                redisCache.deleteObject(pid + "-" + tid + "-WJscriptCache");
                redisCache.setCacheListRight(pid + "-" + tid + "-WJscriptCache", serviceSubTaskCacheReq.getSvyLibTemplateScriptVOS());
@@ -428,7 +626,7 @@
        List<ServiceSubtaskDetail> serviceSubtaskDetails = serviceSubtaskDetailMapper.selectServiceSubtaskDetailList(serviceSubtaskDetail);
        if (CollectionUtils.isNotEmpty(serviceSubtaskDetails)) {
            map.put("asrtext", serviceSubtaskDetails.get(0).getAsrtext());
            map.put("asrtextId", serviceSubtaskDetails.get(0).getId());
            map.put("asrtextId", "" + serviceSubtaskDetails.get(0).getId());
            map.put("answerps", serviceSubtaskDetails.get(0).getAnswerps());
            return map;
        }
@@ -440,7 +638,6 @@
        serviceSubtaskVO.setTaskid(taskid);
        serviceSubtaskVO.setPatid(patid);
        List<ServiceSubtask> selectServiceSubtaskList = serviceSubtaskMapper.selectServiceSubtaskList(serviceSubtaskVO);
        String score = "0";
        //下题跳转
        String nextScriptNo = null;
@@ -455,35 +652,15 @@
                } else {
                    serviceSubtaskDetailVO.setTargetvalue(serviceSubtaskDetailVO.getTargetvalue() + "&" + svyTaskTemplateTargetoption.getOptioncontent());
                }
//                if (svyTaskTemplateTargetoption.getIsUserOperation() == true) {
//                    //将选中的结果放到asrtext中
//                    if (StringUtils.isEmpty(serviceSubtaskDetailVO.getAsrtext())) {
//                        //和前端商量,前端会将选中的结果更新到问题上
////                        serviceSubtaskDetailVO.setAsrtext(svyTaskTemplateTargetoption.getTargetvalue());
//                        serviceSubtaskDetailVO.setAsrtext(svyTaskTemplateScriptVO.getScriptResult());
//                    } else {
//                        //如果是多选,答案需要用 & è¿›è¡Œæ‹¼æŽ¥(//和前端商量,前端会将选中的结果更新到问题上)
////                        serviceSubtaskDetailVO.setAsrtext(serviceSubtaskDetailVO.getAnswerps() + "&" + svyTaskTemplateTargetoption.getTargetvalue());
//                        serviceSubtaskDetailVO.setAsrtext(svyTaskTemplateScriptVO.getScriptResult());
//                    }
//                    if (svyTaskTemplateScriptVO.getScriptType().equals("1") && svyTaskTemplateScriptVO.getBranchFlag().equals("1")) {
//                        //是单选,并且是有分支的(和前端商量,在外链结果保存时,会将选中的选项上的跳转更新到题目上)
////                        nextScriptNo = svyTaskTemplateTargetoption.getNextQuestion().toString();
//                        nextScriptNo = svyTaskTemplateScriptVO.getNextScriptno().toString();
//                        score = svyTaskTemplateTargetoption.getScore().toString();
//                    } else {
//                        nextScriptNo = svyTaskTemplateScriptVO.getNextScriptno().toString();
//                        score = svyTaskTemplateScriptVO.getScore().toString();
//                    }
//                }
            }
            nextScriptNo = svyTaskTemplateScriptVO.getNextScriptno().toString();
            nextScriptNo = svyTaskTemplateScriptVO.getNextScriptno();
            if (svyTaskTemplateScriptVO.getScore() != null) {
                score = String.valueOf(svyTaskTemplateScriptVO.getScore());
            }
            serviceSubtaskDetailVO.setAsrtext(StringUtils.isEmpty(svyTaskTemplateScriptVO.getScriptResult()) ? "" : svyTaskTemplateScriptVO.getScriptResult().replaceAll("^\"|\"$", ""));
            serviceSubtaskDetailVO.setMatchedtext(StringUtils.isEmpty(svyTaskTemplateScriptVO.getScriptResult()) ? "" : svyTaskTemplateScriptVO.getScriptResult().replaceAll("^\"|\"$", ""));
//            if (StringUtils.isEmpty(serviceSubtaskDetailVO.getAsrtext())) {
            //            if (StringUtils.isEmpty(serviceSubtaskDetailVO.getAsrtext())) {
//                nextScriptNo = svyTaskTemplateScriptVO.getNextScriptno().toString();
//            }
//            serviceSubtaskDetailVO.setSvyTaskTemplateTargetoptions(svyTaskTemplateScriptVO.getSvyTaskTemplateTargetoptions());
@@ -520,6 +697,7 @@
        Map<String, String> map = new HashMap<>();
        map.put("nextScriptNo", nextScriptNo);
        map.put("score", score);
        map.put("id", "" + serviceSubtaskDetail.getId());
        return map;
    }
smartor/src/main/java/com/smartor/service/impl/ServiceSubtaskServiceImpl.java
@@ -1,6 +1,7 @@
package com.smartor.service.impl;
import com.alibaba.fastjson2.JSON;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.google.gson.Gson;
@@ -48,6 +49,9 @@
public class ServiceSubtaskServiceImpl implements IServiceSubtaskService {
    @Autowired
    private ServiceSubtaskMapper serviceSubtaskMapper;
    @Autowired
    private ServiceSubtaskPreachformMapper serviceSubtaskPreachformMapper;
    @Autowired
    private ServiceSubtaskDetailMapper serviceSubtaskDetailMapper;
@@ -173,7 +177,6 @@
            return DtoConversionUtils.sourceToTarget(serviceTask, ServiceTaskVO.class);
        }
        //将查出来的数据倒入ServiceSubtaskVO中
        ServiceTaskVO serviceTaskVO = DtoConversionUtils.sourceToTarget(serviceTask, ServiceTaskVO.class);
        serviceTaskVO.setShowDate(serviceTask.getShowDate());
@@ -253,6 +256,14 @@
                patTaskRelevance.setNurseName(serviceSubtask1.getNurseName());
                patTaskRelevances.add(patTaskRelevance);
            }
            //获取该患者所有的执行状态
            ServiceSubtaskPreachform serviceSubtaskPreachform = new ServiceSubtaskPreachform();
            serviceSubtaskPreachform.setTaskid(serviceTask.getTaskid());
            serviceSubtaskPreachform.setSubid(serviceSubtask1.getId());
            List<ServiceSubtaskPreachform> serviceSubtaskPreachformList = serviceSubtaskPreachformMapper.selectServiceSubtaskPreachformList(serviceSubtaskPreachform);
            serviceTaskVO.setPreachformList(serviceSubtaskPreachformList);
        }
        serviceTaskVO.setPatTaskRelevances(patTaskRelevances);
@@ -297,7 +308,8 @@
            if (serviceSubtask.getSendstate() >= 3L || serviceSubtask.getSendstate() == 1L) yfs = yfs + 1;
            if (serviceSubtask.getSendstate() == 2L) dsf = dsf + 1;
            if (serviceSubtask.getSendstate() == 1L) blq = blq + 1;
            if (serviceSubtask.getExcep().equals("1")) yc = yc + 1;
            if (StringUtils.isNotEmpty(serviceSubtask.getExcep()) && !serviceSubtask.getExcep().equals("0"))
                yc = yc + 1;
        }
        map.put("wzx", wzx);
        map.put("ysf", ysf);
@@ -414,6 +426,16 @@
            throw new BaseException("任务入参为空,请检查入参");
        }
        ServiceTask serviceTask = DtoConversionUtils.sourceToTarget(serviceTaskVO, ServiceTask.class);
        if (CollectionUtils.isEmpty(serviceTaskVO.getPreachformList())) throw new BaseException("任务的发送方式为空");
        //将preachfromList放到serviceTask中的preachfrom中
        ObjectMapper mapper = new ObjectMapper();
        try {
            String preachformList = mapper.writeValueAsString(serviceTaskVO.getPreachformList());
            serviceTask.setPreachform(preachformList);
        } catch (JsonProcessingException e) {
            e.printStackTrace();
        }
        serviceTask.setTextParam(JSON.toJSONString(serviceTaskVO.getTextParam()));
        if (serviceTaskVO.getIsoperation() != null && serviceTaskVO.getIsoperation() == 1) {
            //新增模板信息
@@ -460,7 +482,7 @@
                    ServiceTaskdiag serviceTaskdiag = new ServiceTaskdiag();
                    serviceTaskdiag.setTaskId(serviceTask.getTaskid());
                    serviceTaskdiag.setTaskName(serviceTask.getTaskName());
                    serviceTaskdiag.setLongtask(0L);
                    serviceTaskdiag.setLongtask(Long.valueOf(serviceTask.getLongTask()));
                    if (serviceTaskVO.getLongTask() == 1) serviceTaskdiag.setLongtask(1L);
                    serviceTaskdiag.setIcd10code(serviceTaskVO.getIcd10code());
                    serviceTaskdiag.setIcd10name(serviceTaskVO.getIcd10name());
@@ -481,11 +503,10 @@
                    serviceTaskoper.setOpdesc(serviceTaskVO.getOpdesc());
                    serviceTaskoper.setTaskId(serviceTask.getTaskid());
                    serviceTaskoper.setTaskName(serviceTask.getTaskName());
                    serviceTaskoper.setLongtask(0L);
                    serviceTaskoper.setLongtask(Long.valueOf(serviceTask.getLongTask()));
                    serviceTaskoper.setGuid(serviceTask.getGuid());
                    serviceTaskoper.setOrgid(serviceTask.getOrgid());
                    serviceTaskoper.setCreateTime(new Date());
                    if (serviceTaskVO.getLongTask() == 1) serviceTaskoper.setLongtask(1L);
                    if (StringUtils.isNotEmpty(serviceTaskVO.getOpcode())) {
                        String[] opcodes = serviceTaskVO.getOpcode().split(",");
                        for (String opcode : opcodes) {
@@ -500,8 +521,7 @@
                    serviceTaskdept.setTaskId(serviceTask.getTaskid());
                    serviceTaskdept.setTaskName(serviceTask.getTaskName());
                    serviceTaskdept.setOrgid(serviceTask.getOrgid());
                    serviceTaskdept.setLongtask(0L);
                    if (serviceTaskVO.getLongTask() == 1) serviceTaskdept.setLongtask(1L);
                    serviceTaskdept.setLongtask(Long.valueOf(serviceTaskVO.getLongTask()));
                    if (StringUtils.isNotEmpty(serviceTaskVO.getDeptcode())) {
                        String[] deptcodes = serviceTaskVO.getDeptcode().split(",");
                        for (String deptCode : deptcodes) {
@@ -522,11 +542,12 @@
                    }
                }
            }
            if (serviceTaskVO.getLongTask() != null && serviceTaskVO.getLongTask() == 1 && serviceTaskVO.getPatCycle() == 0L) {
                Map<String, Integer> map = new HashMap<>();
                map.put("taskId", serviceTask.getTaskid().intValue());
                return map;
            }
//长期任务,也允许加人了
//            if (serviceTaskVO.getLongTask() != null && serviceTaskVO.getLongTask() == 1 && serviceTaskVO.getPatCycle() == 0L) {
//                Map<String, Integer> map = new HashMap<>();
//                map.put("taskId", serviceTask.getTaskid().intValue());
//                return map;
//            }
            //将任务信息放到服务表中
            ServiceSubtask serviceSubtask = DtoConversionUtils.sourceToTarget(serviceTaskVO, ServiceSubtask.class);
@@ -565,11 +586,25 @@
                    serviceSubtask.setNurseName(patTaskRelevance.getNurseName());
                    serviceSubtask.setCreateBy(serviceTask.getCreateBy());
                    serviceSubtask.setUpdateBy(serviceTask.getCreateBy());
                    serviceSubtask.setVisitTime(patTaskRelevance.getVisitTime());
                    serviceSubtask.setVisitTime(patTaskRelevance.getVisittime());
                    if (serviceTaskVO.getLongTask() != null && serviceTaskVO.getLongTask() == 1)
                        serviceSubtask.setLongSendTime(patTaskRelevance.getLongSendTime());
                    serviceSubtaskMapper.insertServiceSubtask(serviceSubtask);
                    serviceSubtask.getId().intValue();
                    //需要按service_task里的preachform的顺序将发送方式保存到service_subtask_preachform表中
                    if (StringUtils.isNotEmpty(serviceTaskVO.getPreachformList())) {
                        List<ServiceSubtaskPreachform> pfList = serviceTaskVO.getPreachformList();
                        for (ServiceSubtaskPreachform serviceSubtaskPreachform : pfList) {
                            serviceSubtaskPreachform.setTaskid(serviceTask.getTaskid());
                            serviceSubtaskPreachform.setSubid(serviceSubtask.getId());
                            //这个sendstate需要在数据库设置一个默认值为“1”
                            serviceSubtaskPreachform.setSendstate("1");
                            serviceSubtaskPreachform.setOrgid(serviceTask.getOrgid());
                            serviceSubtaskPreachform.setCreateTime(new Date());
                            serviceSubtaskPreachformMapper.insertServiceSubtaskPreachform(serviceSubtaskPreachform);
                        }
                    }
                }
            }
@@ -579,8 +614,6 @@
                serviceTask.setSendTimeSlot(JSON.toJSONString(serviceTaskVO.getSendTimeslot()));
            //修改操作,需要将stopState状态+1
            ServiceTask serviceTask1 = serviceTaskService.selectServiceTaskByTaskid(serviceTask.getTaskid());
//            long l = serviceTask1.getStopState() + 1;
//            serviceTask.setStopState(l);
            //获取到该任务所有的服务,并从队列里删除
            ServiceSubtaskVO serviceSubtaskVO = new ServiceSubtaskVO();
            serviceSubtaskVO.setTaskid(serviceTask1.getTaskid());
@@ -593,18 +626,6 @@
            } else {
                if (CollectionUtils.isNotEmpty(serviceSubtaskList1)) serviceSubtaskList = serviceSubtaskList1;
            }
            if (CollectionUtils.isNotEmpty(serviceSubtaskList)) {
                for (ServiceSubtask serviceSubtask : serviceSubtaskList) {
                    log.info("insertOrUpdateTask需要移除的subId为:{}", serviceSubtask.getId().toString());
                    serviceSubtaskMapper.deleteServiceSubtaskById(serviceSubtask.getId());
                    redisCache.removeElementFromList("cache-exist", serviceSubtask.getId().toString());
                    redisCache.removeElementFromList("cache-0", serviceSubtask.getId().toString());
                    redisCache.removeElementFromList("cache-1", serviceSubtask.getId().toString());
                    redisCache.removeElementFromList("cache-2", serviceSubtask.getId().toString());
                    redisCache.removeElementFromList("cache-3", serviceSubtask.getId().toString());
                    redisCache.removeElementFromList("cache-4", serviceSubtask.getId().toString());
                }
            }
            if (serviceTaskVO.getLibtemplateid() != null)
                serviceTask.setLibtemplateid(serviceTaskVO.getLibtemplateid().toString());
@@ -613,17 +634,14 @@
            serviceTask.setUpdateTime(new Date());
            serviceTaskService.updateServiceTask(serviceTask);
            if (serviceTaskVO.getAppltype().equals("1") || serviceTaskVO.getAppltype().equals("2")) {
                if (StringUtils.isNotEmpty(serviceTaskVO.getDeptcode())) {
                    String[] deptcodes = serviceTaskVO.getDeptcode().split(",");
                    for (String deptCode : deptcodes) {
                        ServiceTaskdept serviceTaskdept = new ServiceTaskdept();
                        serviceTaskdept.setTaskId(serviceTask.getTaskid());
                        serviceTaskdept.setTaskName(serviceTask.getTaskName());
                        serviceTaskdept.setLongtask(0L);
                        serviceTaskdept.setLongtask(Long.valueOf(serviceTask.getLongTask()));
                        serviceTaskdept.setOrgid(serviceTaskVO.getOrgid());
                        if (serviceTaskVO.getLongTask() == 1) serviceTaskdept.setLongtask(1L);
                        serviceTaskdept.setDeptCode(deptCode);
                        serviceTaskdept.setDeptType("1");
                        serviceTaskdept.setServiceType(serviceTaskVO.getServiceType());
@@ -644,9 +662,8 @@
                        ServiceTaskdept serviceTaskdept = new ServiceTaskdept();
                        serviceTaskdept.setTaskId(serviceTask.getTaskid());
                        serviceTaskdept.setTaskName(serviceTask.getTaskName());
                        serviceTaskdept.setLongtask(0L);
                        serviceTaskdept.setLongtask(Long.valueOf(serviceTask.getLongTask()));
                        serviceTaskdept.setOrgid(serviceTaskVO.getOrgid());
                        if (serviceTaskVO.getLongTask() == 1) serviceTaskdept.setLongtask(1L);
                        serviceTaskdept.setDeptCode(districtcode);
                        serviceTaskdept.setDeptType("2");
                        serviceTaskdept.setServiceType(serviceTaskVO.getServiceType());
@@ -669,9 +686,7 @@
                if (StringUtils.isEmpty(serviceTaskVO.getIcd10code())) {
                    throw new BaseException("疾病编码为空");
                }
//                serviceTaskdiag.setIcd10code(serviceTaskVO.getIcd10code());
                serviceTaskdiag.setLongtask(1L);
                serviceTaskdiag.setLongtask(Long.valueOf(serviceTask.getLongTask()));
                serviceTaskdiag.setIcd10name(serviceTaskVO.getIcd10name());
                serviceTaskdiag.setGuid(serviceTask.getGuid());
                serviceTaskdiag.setOrgid(serviceTask.getOrgid());
@@ -695,7 +710,6 @@
                    }
                }
            } else if (serviceTaskVO.getAppltype().equals("4")) {
                ServiceTaskoper serviceTaskoper = new ServiceTaskoper();
                if (StringUtils.isEmpty(serviceTaskVO.getOpcode())) {
@@ -705,7 +719,7 @@
                serviceTaskoper.setOpdesc(serviceTaskVO.getOpdesc());
                serviceTaskoper.setTaskId(serviceTask.getTaskid());
                serviceTaskoper.setTaskName(serviceTask.getTaskName());
                serviceTaskoper.setLongtask(1L);
                serviceTaskoper.setLongtask(Long.valueOf(serviceTask.getLongTask()));
                serviceTaskoper.setGuid(serviceTask.getGuid());
                serviceTaskoper.setOrgid(serviceTask.getOrgid());
                serviceTaskoper.setCreateTime(new Date());
@@ -728,7 +742,6 @@
                        }
                    }
                }
            }
            if (ObjectUtils.isNotEmpty(serviceTaskVO.getIvrTaskTemplateVO())) {
                IvrTaskTemplate ivrTaskTemplate = new IvrTaskTemplate();
@@ -771,12 +784,13 @@
                    serviceSubtask.setEndtime(patTaskRelevance.getEndtime());
                    serviceSubtask.setNurseId(patTaskRelevance.getNurseId());
                    serviceSubtask.setNurseName(patTaskRelevance.getNurseName());
                    serviceSubtask.setVisitTime(patTaskRelevance.getVisitTime());
                    serviceSubtask.setVisitTime(patTaskRelevance.getVisittime());
                    serviceSubtask.setTextParam(new Gson().toJson(serviceTaskVO.getTextParam()));
                    if (patTaskRelevance.getIsoperation() != null) {
                        if (patTaskRelevance.getIsoperation() == 2)
                        if (patTaskRelevance.getIsoperation() == 2) {
                            serviceSubtask.setUpdateBy(serviceTask.getUpdateBy());
                        serviceSubtaskMapper.updateServiceSubtaskByCondition(serviceSubtask);
                            serviceSubtaskMapper.updateServiceSubtaskByCondition(serviceSubtask);
                        }
                        if (patTaskRelevance.getIsoperation() == 1) {
                            serviceSubtask.setSendstate(1L);
                            serviceSubtask.setUpdateBy(serviceTask.getUpdateBy());
@@ -788,6 +802,32 @@
                            serviceSubtaskMapper.deleteServiceSubtaskByCondition(serviceTaskVO.getTaskid(), patTaskRelevance.getPatid());
                    }
                    serviceSubtask.getTaskid().intValue();
                }
            }
            // æœ‰å¯èƒ½ä¼šæŠŠå‘送顺序也修改了(需要根据taskId将所有的sendstate!=4,5,6的subTask拉出来,进行修改一下)
            ServiceSubtaskVO ssVo = new ServiceSubtaskVO();
            ssVo.setTaskid(serviceTaskVO.getTaskid());
            ssVo.setDelFlag("0");
            List<Long> ssList = new ArrayList<>();
            ssList.add(1l);
            ssList.add(2L);
            ssList.add(3L);
            ssVo.setSendstates(ssList);
            List<ServiceSubtask> ssTaskList = serviceSubtaskMapper.selectServiceSubtaskBySendstate(ssVo);
            for (int i = 0; i < ssTaskList.size(); i++) {
                ServiceSubtask serviceSubtask = ssTaskList.get(i);
                serviceSubtaskPreachformMapper.deleteServiceSubtaskPreachformBySubid(serviceSubtask.getId());
                if (StringUtils.isNotEmpty(serviceTaskVO.getPreachformList())) {
                    List<ServiceSubtaskPreachform> pfList = serviceTaskVO.getPreachformList();
                    for (ServiceSubtaskPreachform serviceSubtaskPreachform : pfList) {
                        serviceSubtaskPreachform.setTaskid(serviceTask.getTaskid());
                        serviceSubtaskPreachform.setSubid(serviceSubtask.getId());
                        //这个sendstate需要在数据库设置一个默认值为“1”
                        serviceSubtaskPreachform.setSendstate("1");
                        serviceSubtaskPreachform.setOrgid(serviceTask.getOrgid());
//                        serviceSubtaskPreachform.setSort(Long.valueOf(i));
                        serviceSubtaskPreachformMapper.insertServiceSubtaskPreachform(serviceSubtaskPreachform);
                    }
                }
            }
        }
@@ -1055,7 +1095,7 @@
        //判断是否挂机
        String hangupState = redisCache.getCacheObject(phoneCallReqYQVO.getUuid() + "- hangup");
        Object cacheObject1 = redisCache.getCacheObject(phoneCallReqYQVO.getTaskid() + "recordAccept-hungup");
        if (StringUtils.isNotEmpty(hangupState) && hangup.equals("1") || ObjectUtils.isNotEmpty(cacheObject1) && String.valueOf(cacheObject1).equals("1")) {
        if (StringUtils.isNotEmpty(hangupState) && hangupState.equals("1") || ObjectUtils.isNotEmpty(cacheObject1) && String.valueOf(cacheObject1).equals("1")) {
            return new PhoneCallBackYQVO();
        }
        if ("AsrCallback".equals(phoneCallReqYQVO.getOperate()) && phoneCallReqYQVO.getEnd_time() != null && phoneCallReqYQVO.getEnd_time() != -1) {
@@ -1064,6 +1104,8 @@
                //判断 recordAccept-hungup æ˜¯å¦æœ‰å€¼ï¼Œå¦‚果有,则说明不用处理了,之前已经处理过了(recordAccept-hungup这个主要是给"通话记录用的,")
                Object cacheObject = redisCache.getCacheObject(phoneCallReqYQVO.getTaskid() + "recordAccept-hungup");
                if (ObjectUtils.isNotEmpty(cacheObject) && String.valueOf(cacheObject).equals("1")) {
                    ServiceSubtask serviceSubtask = serviceSubtaskMapper.selectServiceSubtaskById(Long.valueOf(phoneCallReqYQVO.getTaskid()));
                    setFailPreachForm(serviceSubtask, "3", "拨叫的用户正忙", "4");
                    return new PhoneCallBackYQVO();
                }
                //如果发送状态为6,就说明已经打完了,也没有必要继续往下走了
@@ -1085,8 +1127,12 @@
                //先把默认的recordAccept-hungup删除,再更新
                redisCache.deleteObject(phoneCallReqYQVO.getTaskid() + "recordAccept-hungup");
                redisCache.setCacheObject(phoneCallReqYQVO.getTaskid() + "recordAccept-hungup", "1", 10, TimeUnit.MINUTES);
                //记录电话发送状态
                setFailPreachForm(serviceSubtask2, "3", "电话发送成功(患者挂断)", "4");
                //这个时候就需要走补偿机制了,先暂定走短信
                getSmsCompensate(Long.valueOf(phoneCallReqYQVO.getTaskid()));
//                getSmsCompensate(Long.valueOf(phoneCallReqYQVO.getTaskid()));
                return new PhoneCallBackYQVO();
            }
        }
@@ -1115,6 +1161,9 @@
                    req.put("caller", phoneCallReqYQVO.getPhone());
//                    HttpUtils.sendPost(hangup, new Gson().toJson(req));
                    HttpUtil.postJsonRequest(hangup, new Gson().toJson(req));
                    ServiceSubtask serviceSubtask = serviceSubtaskMapper.selectServiceSubtaskById(Long.valueOf(phoneCallReqYQVO.getTaskid()));
                    //记录电话发送状态
                    setFailPreachForm(serviceSubtask, "3", "通话正常结束", "9");
                    //删除结束语的患存
                    redisCache.deleteObject(phoneCallReqYQVO.getUuid() + "- jsy");
                } else {
@@ -1122,6 +1171,7 @@
                    log.error("-------PlayEventCallbackPlaystop的值为:{}", true);
                }
            }
            return phoneCallBackYQVO;
        }
        //获取放音是否结束
@@ -1198,6 +1248,9 @@
                serviceSubtask.setUpdateTime(new Date());
                log.error("先更新一下分数,电话的serviceSubtask的值为:{}", serviceSubtask);
                serviceSubtaskMapper.updateServiceSubtask(serviceSubtask);
                //记录状态
                setFailPreachForm(serviceSubtask, "3", "静默次数达到" + num + "次", "4");
                Map<String, String> map = delRedisValue(null, id.toString());
                if (ObjectUtils.isNotEmpty(map)) redisCache.setCacheObject(map.get("cacheName"), map.get("val"));
                redisCache.deleteObject(serviceSubtask.getId() + "-" + serviceSubtask.getPhone());
@@ -1252,6 +1305,8 @@
                        ss.setSendstate(6L);
                        ss.setRemark("电话拨打已完成");
                        serviceSubtaskMapper.updateServiceSubtask(ss);
                        //记录状态
                        setFailPreachForm(serviceSubtask, "3", "电话拨打已完成", "9");
                        //可以挂机了
                        redisCache.deleteObject(serviceSubtask.getId() + "-" + serviceSubtask.getPhone());
                        redisCache.deleteObject(phoneCallReqYQVO.getUuid() + "SCORE");
@@ -1336,6 +1391,8 @@
                            redisCache.setCacheObject(phoneCallReqYQVO.getUuid() + "- jsy", serviceTask.getJsy(), 120, TimeUnit.MINUTES);
                            phoneCallBackYQVO.setType("text");
                            phoneCallBackYQVO.setValue(phoneCallBackYQVO.getCommonValue() + serviceTask.getJsy());
                            //记录状态
                            setFailPreachForm(serviceSubtask, "3", "电话拨打已完成", "9");
                            return phoneCallBackYQVO;
                        }
@@ -1367,6 +1424,9 @@
                                ss.setSendstate(6L);
                                ss.setRemark("电话拨打已完成");
                                serviceSubtaskMapper.updateServiceSubtask(ss);
                                //记录状态
                                setFailPreachForm(serviceSubtask, "3", "电话拨打已完成", "9");
                                redisCache.deleteObject(serviceSubtask.getId() + "-" + serviceSubtask.getPhone());
                                redisCache.deleteObject(phoneCallReqYQVO.getUuid() + "SCORE");
                                redisCache.deleteObject(phoneCallReqYQVO.getUuid() + "PlayEventCallbackPlaystop");
@@ -1414,6 +1474,8 @@
                            serviceSubtask.setSendstate(6L);
                            serviceSubtask.setRemark("电话拨打已完成");
                            serviceSubtaskMapper.updateServiceSubtask(serviceSubtask);
                            //记录状态
                            setFailPreachForm(serviceSubtask, "3", "电话拨打已完成", "9");
                            //设置结束语
                            phoneCallBackYQVO.setValue(phoneCallBackYQVO.getCommonValue() + serviceTask1.getJsy());
                            Long id = serviceSubtask.getId();
@@ -1484,7 +1546,8 @@
                            serviceSubtask.setSendstate(6L);
                            serviceSubtask.setRemark("电话拨打已完成");
                            serviceSubtaskMapper.updateServiceSubtask(serviceSubtask);
                            //记录状态
                            setFailPreachForm(serviceSubtask, "3", "电话拨打已完成", "9");
                            //在redis中保存一下结束语,在调用挂电话的方法时删除
                            ServiceTask serviceTask = serviceTaskService.selectServiceTaskByTaskid(serviceSubtask.getTaskid());
                            redisCache.setCacheObject(phoneCallReqYQVO.getUuid() + "- jsy", serviceTask.getJsy(), 120, TimeUnit.MINUTES);
@@ -1588,7 +1651,8 @@
                    serviceSubtask.setRemark("电话拨打已完成");
                    serviceSubtask.setSendstate(6L);
                    serviceSubtaskMapper.updateServiceSubtask(serviceSubtask);
                    //记录状态
                    setFailPreachForm(serviceSubtask, "3", "电话拨打已完成", "9");
                    //去redis中,把该子任务ID删除
                    Long id = serviceSubtask.getId();
                    Map<String, String> map = delRedisValue(null, id.toString());
@@ -1813,241 +1877,6 @@
    }
    //下面的代码不能删除,上面的方法只是配合电话端联调用的,
//    @Override
//    public PhoneCallBackVO phoneCallBack(PhoneCallBackVO phoneCallBackVO) {
//        log.error("phoneCallBackVO的入参:{},{},{},{},{},{},{}", phoneCallBackVO.getResultType(), phoneCallBackVO.getUuid(), phoneCallBackVO.getErrResult(), phoneCallBackVO.getTextResult(), phoneCallBackVO.getHangUpResult(), phoneCallBackVO.getEnumState(), phoneCallBackVO.getUint8());
//        //获取数据
//        Boolean aBoolean = redisCache.hasKey(phoneCallBackVO.getUuid());
//        if (!aBoolean) {
//            throw new BaseException("该uuid不存在");
//        }
//        Integer hangupValue = redisCache.getCacheObject(phoneCallBackVO.getUuid() + "hangup");
//        if (hangupValue != null && hangupValue == 1) {
//            //hangupValue == 1  éšè®¿ç»“束,直接可以挂电话
//            PhoneUtils phoneUtils = new PhoneUtils();
//            phoneUtils.hangup(phoneCallBackVO.getUuid(), null, null, null, null, null, null, null);
//
//        }
//
//        Map<String, Object> map = redisCache.getCacheObject(phoneCallBackVO.getUuid());
////        ObjectMapper objectMapper = new ObjectMapper();
////        Map<String, Object> map = null;
////        try {
////            map = objectMapper.readValue(cacheObject, Map.class);
////        } catch (JsonProcessingException e) {
////            e.printStackTrace();
////        }
//
//        ServiceSubtask ServiceSubtask = (ServiceSubtask) map.get("ServiceSubtask");
//        List<IvrLibaTemplateScriptVO> ivrLibaTemplateScriptVOs = (List<IvrLibaTemplateScriptVO>) map.get("ivrLibaTemplateScriptVO");
//        //将uuid更新到数据库中
//        ServiceSubtask.setSenduuid(phoneCallBackVO.getUuid());
//        ServiceSubtaskMapper.updateServiceSubtask(ServiceSubtask);
//
//        //获取模板信息
//        IvrLibaTemplateVO ivrLibaTemplateVO = redisCache.getCacheObject(phoneCallBackVO.getUuid() + "ivrLibaTemplateVO");
//
//
//        //首先判断resultType
//        if (phoneCallBackVO.getResultType() == 1) {
//            //呼叫结果接口: 1
//            if (phoneCallBackVO.getUint8() == 1) {
//                //呼叫失败,去redis中记录一下失败次数,进行再次呼叫
//                Integer integer = redisCache.getCacheObject(phoneCallBackVO.getUuid() + "uint8");
//                if (integer != null) {
//                    redisCache.setCacheObject(phoneCallBackVO.getUuid() + "uint8", integer + 1, 120, TimeUnit.MINUTES);
//                } else {
//                    redisCache.setCacheObject(phoneCallBackVO.getUuid() + "uint8", 1, 120, TimeUnit.MINUTES);
//                }
//
//                if (integer != null && integer == ServiceSubtask.getRecallcount().intValue()) {
//                    log.info("无人接听:{},   {}", phoneCallBackVO.getErrResult(), phoneCallBackVO.getUuid());
//                    //连续打规定次,如果要没人接,那就结束
//                    ServiceSubtask.setResult(phoneCallBackVO.getErrResult());
//                    ServiceSubtaskMapper.updateServiceSubtask(ServiceSubtask);
//                    redisCache.deleteObject(phoneCallBackVO.getUuid() + "uint8");
//                } else if (integer != null && integer < ServiceSubtask.getRecallcount().intValue()) {
//                    //进行重拨
//                    PhoneUtils phoneUtils = new PhoneUtils();
//                    phoneUtils.ob(null, null, null, null, null, null, null, ServiceSubtask.getPhone(), phoneCallBackVO.getUuid(), true);
//                }
//            }
//
//        } else if (phoneCallBackVO.getResultType() == 2) {
//            //通话状态更新接口: 2
//            if (phoneCallBackVO.getEnumState() == 0) {
//                // 0-振铃
//                Integer integer = redisCache.getCacheObject(phoneCallBackVO.getUuid() + "enumState");
//
//                if (integer != null && integer < ServiceSubtask.getRecallcount().intValue()) {
//                    redisCache.setCacheObject(phoneCallBackVO.getUuid() + "enumState", integer + 1, 120, TimeUnit.MINUTES);
//                } else if (integer == null) {
//                    redisCache.setCacheObject(phoneCallBackVO.getUuid() + "enumState", 1, 120, TimeUnit.MINUTES);
//                } else if (integer != null && integer == ServiceSubtask.getRecallcount().intValue()) {
//                    ServiceSubtask.setResult("无人接听");
//                    ServiceSubtaskMapper.updateServiceSubtask(ServiceSubtask);
//                    redisCache.deleteObject(phoneCallBackVO.getUuid() + "enumState");
//                }
//            } else if (phoneCallBackVO.getEnumState() == 2) {
//                //患者挂断电话
//                log.info("患者挂断电话:{}", phoneCallBackVO.getUuid());
//                ServiceSubtask.setResult(phoneCallBackVO.getHangUpResult());
//                ServiceSubtaskMapper.updateServiceSubtask(ServiceSubtask);
//                redisCache.deleteObject(phoneCallBackVO.getUuid() + "enumState");
//            }
//
//
//        } else if (phoneCallBackVO.getResultType() == 3) {
//            //语音识别结果上报接口: 3
//            Integer noVoice = redisCache.getCacheObject(phoneCallBackVO.getUuid() + "noVoice");
//            QuestionMessage returnQues = redisCache.getCacheObject(phoneCallBackVO.getUuid() + "returnQues");
//            IvrLibaTemplateScriptVO nowQuestion = returnQues.getNowQuestion();
//            PhoneUtils phoneUtils = new PhoneUtils();
//
//            if (StringUtils.isEmpty(phoneCallBackVO.getTextResult())) {
//                //无回话
//                //判断noVoice是否已经到了最大值
//                if (noVoice == ivrLibaTemplateVO.getNoVoiceNum().intValue()) {
//                    //已经问了对应的遍数,就判断是否还有下一题
//                    if (nowQuestion.getTargetid() == ivrLibaTemplateScriptVOs.size()) {
//                        //没有下一题了,就挂断电话,播放结束语
//                        redisCache.setCacheObject(phoneCallBackVO.getUuid() + "hangup", 1, 120, TimeUnit.MINUTES);
//                        phoneUtils.ttsPlayback(ivrLibaTemplateVO.getRevisitAfter(), phoneCallBackVO.getUuid());
//                    } else {
//                        //有下一题
//                        redisCache.setCacheObject(phoneCallBackVO.getUuid() + "noVoice", 0, 120, TimeUnit.MINUTES);
//                        IvrLibaTemplateScriptVO nextQuestion = getNextQuestion(ivrLibaTemplateScriptVOs, nowQuestion);
//                        // é—®é¢˜ï¼Œ  åŽ»è°ƒç”¨"tts合成和播放"接口
//                        phoneUtils.ttsPlayback(nowQuestion.getQuestionText(), phoneCallBackVO.getUuid());
//                    }
//                } else {
//                    redisCache.setCacheObject(phoneCallBackVO.getUuid() + "noVoice", noVoice + 1, 120, TimeUnit.MINUTES);
//                    //调用ivrLibaTemplateScriptVO中的slienceText(静默话术)
//                    String slienceText = nowQuestion.getSlienceText();
//                    //静默话术  + é—®é¢˜ï¼Œ  åŽ»è°ƒç”¨"tts合成和播放"接口
//                    phoneUtils.ttsPlayback(slienceText + nowQuestion.getQuestionText(), phoneCallBackVO.getUuid());
//                    return new PhoneCallBackVO();
//                }
//
//            } else {
//                //有回话,对回答的问题,进行正则匹配(这里只针对选择题,其它题型不行)
//                for (int j = 0; j < nowQuestion.getIvrLibaScriptTargetoptionList().size(); j++) {
//                    //包含
//                    Matcher matcher = null;
//                    if (StringUtils.isNotEmpty(nowQuestion.getIvrLibaScriptTargetoptionList().get(j).getTargetregex())) {
//                        Pattern pattern = Pattern.compile(nowQuestion.getIvrLibaScriptTargetoptionList().get(j).getTargetregex());
//                        matcher = pattern.matcher(phoneCallBackVO.getTextResult());
//                    }
//                    //不包含
//                    Matcher matcher2 = null;
//                    if (StringUtils.isNotEmpty(nowQuestion.getIvrLibaScriptTargetoptionList().get(j).getTargetregex2())) {
//                        Pattern pattern2 = Pattern.compile(nowQuestion.getIvrLibaScriptTargetoptionList().get(j).getTargetregex2());
//                        matcher2 = pattern2.matcher(phoneCallBackVO.getTextResult());
//                    }
//                    log.info("phoneCallBack--Targetregex的值为:{}, phoneCallBack--Targetregex2的值为:{}", nowQuestion.getIvrLibaScriptTargetoptionList().get(j).getTargetregex(), nowQuestion.getIvrLibaScriptTargetoptionList().get(j).getTargetregex2());
//                    if (StringUtils.isNotEmpty(nowQuestion.getIvrLibaScriptTargetoptionList().get(j).getTargetregex()) && matcher.matches() && StringUtils.isNotEmpty(nowQuestion.getIvrLibaScriptTargetoptionList().get(j).getTargetregex2()) && matcher2.matches() || StringUtils.isEmpty(nowQuestion.getIvrLibaScriptTargetoptionList().get(j).getTargetregex()) && StringUtils.isNotEmpty(nowQuestion.getIvrLibaScriptTargetoptionList().get(j).getTargetregex2()) && matcher2.matches() || StringUtils.isEmpty(nowQuestion.getIvrLibaScriptTargetoptionList().get(j).getTargetregex2()) && StringUtils.isNotEmpty(nowQuestion.getIvrLibaScriptTargetoptionList().get(j).getTargetregex()) && matcher.matches()) {
//                        //说明匹配正确了
//                        //这里应该先判断类型,去再修改,设置IsUserOperation是单选题的改法
//                        nowQuestion.getIvrLibaScriptTargetoptionList().get(j).setIsUserOperation(true);
//                        ivrLibaScriptTargetoptionMapper.updateIvrLibaTemplateTargetoption(nowQuestion.getIvrLibaScriptTargetoptionList().get(j));
//
//
//                        //将静默置为0
//                        redisCache.setCacheObject(phoneCallBackVO.getUuid() + "noVoice", 0, 120, TimeUnit.MINUTES);
//                        redisCache.setCacheObject(phoneCallBackVO.getUuid() + "mateNum", 0, 120, TimeUnit.MINUTES);
//                        //获取下一题
//                        Integer nextQuestion = nowQuestion.getIvrLibaScriptTargetoptionList().get(j).getNextQuestion();
//                        for (IvrLibaTemplateScriptVO script : ivrLibaTemplateScriptVOs) {
//                            if (script.getTargetid() == nextQuestion) {
//                                QuestionMessage questionMessage = new QuestionMessage();
//                                questionMessage.setNowQuestion(script);
//                                questionMessage.setQuestionList(ivrLibaTemplateScriptVOs);
//                                redisCache.setCacheObject(phoneCallBackVO.getUuid() + "returnQues", questionMessage, 120, TimeUnit.MINUTES);
//                                break;
//                            }
//                        }
//                        break;
//                    } else {
//                        //没有匹配到
//                        Integer mateNum = redisCache.getCacheObject(phoneCallBackVO.getUuid() + "mateNum");
//                        //无匹配次数去判断是否到最大询问次数,并且所有的选项都匹配完了
//                        if (mateNum == ivrLibaTemplateVO.getMateNum().intValue() && j == nowQuestion.getIvrLibaScriptTargetoptionList().size() - 1) {
//                            //如果下一题为空.则新的数据返回,并加上感谢语
//                            if (nowQuestion.getTargetid() < ivrLibaTemplateScriptVOs.size()) {
//                                QuestionMessage questionMessage = new QuestionMessage();
//                                IvrLibaTemplateScriptVO nextQuestion = getNextQuestion(ivrLibaTemplateScriptVOs, nowQuestion);
//                                questionMessage.setQuestionList(ivrLibaTemplateScriptVOs);
//                                questionMessage.setNowQuestion(nextQuestion);
//                                redisCache.setCacheObject(phoneCallBackVO.getUuid() + "returnQues", questionMessage, 120, TimeUnit.MINUTES);
//                                redisCache.setCacheObject(phoneCallBackVO.getUuid() + "mateNum", 0, 120, TimeUnit.MINUTES);
//                            } else {
//                                //就可以挂断电话了
//                                redisCache.setCacheObject(phoneCallBackVO.getUuid() + "hangup", 1, 120, TimeUnit.MINUTES);
//                                phoneUtils.ttsPlayback(ivrLibaTemplateVO.getRevisitAfter(), phoneCallBackVO.getUuid());
//                                break;
//                            }
//                        } else if (mateNum < ivrLibaTemplateVO.getMateNum().intValue() && j == nowQuestion.getIvrLibaScriptTargetoptionList().size() - 1) {
//                            //没有问到规定次数
//                            mateNum = mateNum + 1;
//                            redisCache.setCacheObject(phoneCallBackVO.getUuid() + "mateNum", mateNum, 120, TimeUnit.MINUTES);
//                        }
//                    }
//
//                }
//                //选项匹配完成后,需要再去通过库再进行匹配一次
//                String extemplateID = ivrLibaTemplateVO.getSubmoduleID();
//                String[] split = extemplateID.split(",");
//                List<String> list = Arrays.asList(split);
//                List<Long> list1 = new ArrayList<>();
//                if (StringUtils.isNotEmpty(extemplateID)) {
//                    for (String str : list) {
//                        list1.add(Long.valueOf(str));
//                    }
//                    List<IvrLibaExtemplatescript> ivrLibaExtemplatescripts = ivrLibaExtemplatescriptMapper.queryIvrLibaExtemplatescriptList(list1);
//                    for (IvrLibaExtemplatescript ivrLibaExtemplatescript : ivrLibaExtemplatescripts) {
//                        Matcher matcher = null;
//                        if (StringUtils.isNotEmpty(ivrLibaExtemplatescript.getSelfRegex())) {
//                            Pattern pattern = Pattern.compile(ivrLibaExtemplatescript.getSelfRegex());
//                            matcher = pattern.matcher(returnQues.getContent());
//                        }
//
//                        Matcher matcher2 = null;
//                        if (StringUtils.isNotEmpty(ivrLibaExtemplatescript.getSelfRegex2())) {
//                            Pattern pattern2 = Pattern.compile(ivrLibaExtemplatescript.getSelfRegex2());
//                            matcher2 = pattern2.matcher(returnQues.getContent());
//                        }
//                        log.info("++++++++++++++++++++++++++通用库是否为空:selfRegex : {} , selfRegex2 : {}", ivrLibaExtemplatescript.getSelfRegex(), ivrLibaExtemplatescript.getSelfRegex2());
//                        if (StringUtils.isNotEmpty(ivrLibaExtemplatescript.getSelfRegex()) && matcher.matches() && StringUtils.isNotEmpty(ivrLibaExtemplatescript.getSelfRegex2()) && matcher2.matches() || StringUtils.isEmpty(ivrLibaExtemplatescript.getSelfRegex()) && StringUtils.isNotEmpty(ivrLibaExtemplatescript.getSelfRegex2()) && matcher2.matches() || StringUtils.isEmpty(ivrLibaExtemplatescript.getSelfRegex2()) && StringUtils.isNotEmpty(ivrLibaExtemplatescript.getSelfRegex()) && matcher.matches()) {
//                            QuestionMessage questionMessage = redisCache.getCacheObject(phoneCallBackVO.getUuid() + "returnQues");
//                            IvrLibaTemplateScriptVO ivrLibaTemplateScriptVO = returnQues.getNowQuestion();
//                            ivrLibaTemplateScriptVO.setSubmoduleText(ivrLibaExtemplatescript.getSwitchText());
//                            ivrLibaTemplateScriptVO.setSubmoduleVoice(ivrLibaExtemplatescript.getSwitchWav());
//                            redisCache.setCacheObject(phoneCallBackVO.getUuid() + "returnQues", questionMessage, 120, TimeUnit.MINUTES);
//                            if (ivrLibaExtemplatescript.getIsEnd() == 1) {
//                                //将问题置空
//                                IvrLibaTemplateScriptVO nowQuestion1 = questionMessage.getNowQuestion();
//                                nowQuestion1.setQuestionText(null);
//                                nowQuestion1.setQuestionVoice(null);
//                                questionMessage.setNowQuestion(nowQuestion1);
//                                redisCache.setCacheObject(phoneCallBackVO.getUuid() + "returnQues", questionMessage, 120, TimeUnit.MINUTES);
//
//                                redisCache.setCacheObject(phoneCallBackVO.getUuid() + "isOver", 1, 120, TimeUnit.MINUTES);
//                            }
//
//                            //调用"15、tts合成和播放, tts_playback"将结果传回
//
//
//                        }
//                        break;
//                    }
//                }
//
//            }
//        }
//        return phoneCallBackVO;
//    }
    @Override
    public Integer saveQuestionAnswerPhone(ServiceSubTaskDetailReq serviceSubTaskDetailReq) {
        int i = 0;
@@ -2066,7 +1895,7 @@
            //随访
            for (ServiceSubtaskDetail serviceSubtaskDetail : serviceSubTaskDetailReq.getServiceSubtaskDetailList()) {
                serviceSubtaskDetail.setSubId(selectServiceSubtaskList.get(0).getId());
                serviceSubtaskDetail.setId(UUID.randomUUID().toString());
//                serviceSubtaskDetail.setId(UUID.randomUUID().toString());
                serviceSubtaskDetail.setCreateTime(new Date());
                serviceSubtaskDetail.setGuid(selectServiceSubtaskList.get(0).getGuid());
                serviceSubtaskDetail.setOrgid(serviceSubTaskDetailReq.getOrgid());
@@ -2112,7 +1941,11 @@
        Object cacheObject = redisCache.getCacheObject(phoneCallRecordVO.getTaskid() + "recordAccept-hungup");
        if (phoneCallRecordVO.getHangup_cause().equals("NO_USER_RESPONSE") || ObjectUtils.isNotEmpty(cacheObject) && String.valueOf(cacheObject).equals("1")) {
            //无人接听
            getSmsCompensate(Long.valueOf(phoneCallRecordVO.getTaskid()));
            //记录电话发送状态
            ServiceSubtask serviceSubtask = serviceSubtaskMapper.selectServiceSubtaskById(Long.valueOf(phoneCallRecordVO.getTaskid()));
            setFailPreachForm(serviceSubtask, "3", "无人接听", "4");
            //进行短信补偿
//            getSmsCompensate(Long.valueOf(phoneCallRecordVO.getTaskid()));
            redisCache.deleteObject(phoneCallRecordVO.getTaskid() + "recordAccept-hungup");
            redisCache.removeElementFromList("cache-exist", phoneCallRecordVO.getTaskid());
        } else if (ObjectUtils.isNotEmpty(cacheObject) && String.valueOf(cacheObject).equals("2")) {
@@ -2130,6 +1963,7 @@
            serviceSubtask.setUpdateTime(new Date());
            log.error("电话拨打已完成serviceSubtask的值为:{}", serviceSubtask);
            serviceSubtaskMapper.updateServiceSubtask(serviceSubtask);
            setFailPreachForm(serviceSubtask, StringUtils.isNotEmpty(serviceSubtask.getCurrentPreachform()) ? serviceSubtask.getCurrentPreachform() : "3", "电话拨打已完成", "9");
            //下载文件
            ftpService.downloadFolder("/" + LocalDate.now().toString(), profile + "/upload/vadio/voice/" + LocalDate.now().toString());
            redisCache.deleteObject(phoneCallRecordVO.getTaskid() + "recordAccept-hungup");
@@ -2147,8 +1981,10 @@
//            int endIndex = phoneCallRecordVO.getRecord_path().lastIndexOf("/");
//            String result = phoneCallRecordVO.getRecord_path().substring(startIndex, endIndex);
            //下载文件
            ftpService.downloadFolder("/" + LocalDate.now().toString(), profile + "/upload/vadio/voice/" + LocalDate.now().toString());
//            ftpService.downloadFolder("/" + LocalDate.now().toString(), profile + "/upload/vadio/voice/" + LocalDate.now().toString());
            redisCache.deleteObject(phoneCallRecordVO.getTaskid() + "recordAccept-hungup");
            ServiceSubtask ss = serviceSubtaskMapper.selectServiceSubtaskById(serviceSubtask.getId());
            setFailPreachForm(ss, StringUtils.isNotEmpty(ss.getCurrentPreachform()) ? ss.getCurrentPreachform() : "3", "电话接通成功,患者拒绝随访", "5");
        }
        return 1;
@@ -2227,11 +2063,11 @@
    public List<ServiceSubtaskStatistic> getSfStatistics(ServiceSubtaskCountReq serviceSubtaskCountReq) {
        log.error("getSfStatistics的入参为:{}", serviceSubtaskCountReq);
        List<ServiceSubtaskStatistic> serviceSubtaskStatistics = new ArrayList<>();
        List<ServiceSubtask> rawData = serviceSubtaskMapper.getSfStatistics(serviceSubtaskCountReq);
//        List<ServiceSubtask> rawData = serviceSubtaskMapper.getSfStatistics(serviceSubtaskCountReq);
        // æ ¹æ®æ¡ä»¶è¿›è¡Œåˆ†ç»„
        Map<String, List<ServiceSubtask>> collect = new HashMap<>();
        if (serviceSubtaskCountReq.getLeavehospitaldistrictcodes() != null && serviceSubtaskCountReq.getLeavehospitaldistrictcodes().size() > 0) {
            if (serviceSubtaskCountReq.getDrcode() != null && !serviceSubtaskCountReq.getDrcode().isEmpty()) {
                collect = serviceSubtaskMapper.getSfStatistics(serviceSubtaskCountReq).stream().collect(Collectors.groupingBy(subtask -> Optional.ofNullable(subtask.getDrname()).orElse("Unknown")));
@@ -2245,7 +2081,7 @@
                collect = serviceSubtaskMapper.getSfStatistics(serviceSubtaskCountReq).stream().collect(Collectors.groupingBy(subtask -> Optional.ofNullable(subtask.getDeptname()).orElse("Unknown")));
            }
        }
        for (List<ServiceSubtask> serviceSubtaskList : collect.values()) {
            if (CollectionUtils.isEmpty(serviceSubtaskList)) {
                continue;
@@ -2259,14 +2095,14 @@
            // å¦‚果有医生编码,设置医生编码用于及时率查询
            if (serviceSubtaskCountReq.getDrcode() != null && !serviceSubtaskCountReq.getDrcode().isEmpty()) {
                ss.setDrcode(serviceSubtaskList.get(0).getDrcode());
            }else {
            } else {
                if (CollectionUtils.isNotEmpty(serviceSubtaskCountReq.getLeavehospitaldistrictcodes())) {
                    ss.setLeavehospitaldistrictcode(serviceSubtaskList.get(0).getLeavehospitaldistrictcode());
                } else if (CollectionUtils.isNotEmpty(serviceSubtaskCountReq.getDeptcodes())) {
                    ss.setDeptcode(serviceSubtaskList.get(0).getDeptcode());
                }
            }
            ss.setStarttime(serviceSubtaskCountReq.getStartTime());
            ss.setEndtime(serviceSubtaskCountReq.getEndTime());
            if (serviceSubtaskCountReq.getEndTime() != null && new Date().before(serviceSubtaskCountReq.getEndTime())) {
@@ -2310,15 +2146,15 @@
                collect = serviceSubtaskMapper.getSfStatistics(serviceSubtaskCountReq).stream().collect(Collectors.groupingBy(subtask -> Optional.ofNullable(subtask.getDeptname()).orElse("Unknown")));
            }
        }
        List<ServiceSubtaskCount> joySubCount=serviceSubtaskMapper.getSfStatisticsJoy(serviceSubtaskCountReq);
        List<ServiceSubtaskCount> joySubCount = serviceSubtaskMapper.getSfStatisticsJoy(serviceSubtaskCountReq);
        for (List<ServiceSubtask> serviceSubtaskList : collect.values()) {
            if (CollectionUtils.isEmpty(serviceSubtaskList)) {
                continue;
            }
            ServiceSubtaskStatistic statistic = getStatisticJoy(serviceSubtaskList,joySubCount);
            if(statistic.getJoyCount()!=0&&statistic.getJoyAllCount()!=0) {
            ServiceSubtaskStatistic statistic = getStatisticJoy(serviceSubtaskList, joySubCount);
            if (statistic.getJoyCount() != 0 && statistic.getJoyAllCount() != 0) {
                Double joyTotal = Double.parseDouble(statistic.getJoyCount() + "") / Double.parseDouble(statistic.getJoyAllCount() + "") * 100;
                statistic.setJoyTotal(String.format("%.2f", joyTotal)+"%");
                statistic.setJoyTotal(String.format("%.2f", joyTotal) + "%");
            }
            //及时率
            ServiceSubtask ss = new ServiceSubtask();
@@ -2327,7 +2163,7 @@
            // å¦‚果有医生编码,设置医生编码用于及时率查询
            if (serviceSubtaskCountReq.getDrcode() != null && !serviceSubtaskCountReq.getDrcode().isEmpty()) {
                ss.setDrcode(serviceSubtaskList.get(0).getDrcode());
            }else {
            } else {
                if (CollectionUtils.isNotEmpty(serviceSubtaskCountReq.getLeavehospitaldistrictcodes())) {
                    ss.setLeavehospitaldistrictcode(serviceSubtaskList.get(0).getLeavehospitaldistrictcode());
                } else if (CollectionUtils.isNotEmpty(serviceSubtaskCountReq.getDeptcodes())) {
@@ -2380,7 +2216,7 @@
                if (serviceSubtask.getSendstate() != null && serviceSubtask.getSendstate() == 2) {
                    serviceSubtaskStatistic.setPendingFollowUp(serviceSubtaskStatistic.getPendingFollowUp() + 1L);
                }
                if (serviceSubtask.getSendstate() != null && ( serviceSubtask.getSendstate() == 6)) {
                if (serviceSubtask.getSendstate() != null && (serviceSubtask.getSendstate() == 6)) {
                    serviceSubtaskStatistic.setFollowUpSuccess(serviceSubtaskStatistic.getFollowUpSuccess() + 1L);
                }
                if (serviceSubtask.getSendstate() != null && serviceSubtask.getSendstate() == 5) {
@@ -2445,7 +2281,7 @@
        return serviceSubtaskStatistic;
    }
    private ServiceSubtaskStatistic getStatisticJoy(List<ServiceSubtask> serviceSubtaskList,List<ServiceSubtaskCount> joySubCount) {
    private ServiceSubtaskStatistic getStatisticJoy(List<ServiceSubtask> serviceSubtaskList, List<ServiceSubtaskCount> joySubCount) {
        ServiceSubtaskStatistic serviceSubtaskStatistic = new ServiceSubtaskStatistic();
        //格式化为两位小数的百分比
        DecimalFormat percentFormat = new DecimalFormat("##.##%");
@@ -2461,13 +2297,12 @@
        serviceSubtaskStatistic.setJoyAllCount(0);
        for (ServiceSubtask serviceSubtask : serviceSubtaskList) {
            //满意度
            List<ServiceSubtaskCount> joyCountTemp= joySubCount.stream().filter(r->r.getSubTaskId().equals(serviceSubtask.getId()))
                    .collect(Collectors.toList());
            if(joyCountTemp!=null&&joyCountTemp.size()>0){
                if(ObjectUtils.isNotEmpty(joyCountTemp.get(0).getJoyCount()))
                    serviceSubtaskStatistic.setJoyCount(serviceSubtaskStatistic.getJoyCount()+joyCountTemp.get(0).getJoyCount());
                if(ObjectUtils.isNotEmpty(joyCountTemp.get(0).getJoyAllCount()))
                    serviceSubtaskStatistic.setJoyAllCount(serviceSubtaskStatistic.getJoyAllCount()+joyCountTemp.get(0).getJoyAllCount());
            List<ServiceSubtaskCount> joyCountTemp = joySubCount.stream().filter(r -> r.getSubTaskId().equals(serviceSubtask.getId())).collect(Collectors.toList());
            if (joyCountTemp != null && joyCountTemp.size() > 0) {
                if (ObjectUtils.isNotEmpty(joyCountTemp.get(0).getJoyCount()))
                    serviceSubtaskStatistic.setJoyCount(serviceSubtaskStatistic.getJoyCount() + joyCountTemp.get(0).getJoyCount());
                if (ObjectUtils.isNotEmpty(joyCountTemp.get(0).getJoyAllCount()))
                    serviceSubtaskStatistic.setJoyAllCount(serviceSubtaskStatistic.getJoyAllCount() + joyCountTemp.get(0).getJoyAllCount());
            }
            //无需随访人次
            if (serviceSubtask.getSendstate() != null && serviceSubtask.getSendstate() == 4) {
@@ -2486,7 +2321,7 @@
                if (serviceSubtask.getSendstate() != null && serviceSubtask.getSendstate() == 2) {
                    serviceSubtaskStatistic.setPendingFollowUp(serviceSubtaskStatistic.getPendingFollowUp() + 1L);
                }
                if (serviceSubtask.getSendstate() != null && ( serviceSubtask.getSendstate() == 6)) {
                if (serviceSubtask.getSendstate() != null && (serviceSubtask.getSendstate() == 6)) {
                    serviceSubtaskStatistic.setFollowUpSuccess(serviceSubtaskStatistic.getFollowUpSuccess() + 1L);
                }
                if (serviceSubtask.getSendstate() != null && serviceSubtask.getSendstate() == 5) {
@@ -2611,6 +2446,11 @@
        return serviceSubtaskDetail;
    }
    /**
     * ç”µè¯çš„补偿方法(老)
     *
     * @param subTaskId
     */
    private void getSmsCompensate(Long subTaskId) {
        ServiceSubtask serviceSubtask = serviceSubtaskMapper.selectServiceSubtaskById(subTaskId);
        RSAPublicKeyExample rsaPublicKeyExample = new RSAPublicKeyExample();
@@ -2641,6 +2481,34 @@
        serviceSubtask.setSendstate(3L);
        serviceSubtaskMapper.updateServiceSubtask(serviceSubtask);
        //需要在servicePreachform里记录一下短信状态
        ServiceSubtaskPreachform serviceSubtaskPreachform = new ServiceSubtaskPreachform();
        serviceSubtaskPreachform.setPreachform("4");
        serviceSubtaskPreachform.setSubid(subTaskId);
        serviceSubtaskPreachform.setTaskid(serviceSubtask.getTaskid());
        serviceSubtaskPreachform.setOrgid(serviceSubtask.getOrgid());
        List<ServiceSubtaskPreachform> serviceSubtaskPreachforms = serviceSubtaskPreachformMapper.selectServiceSubtaskPreachformList(serviceSubtaskPreachform);
        if (CollectionUtils.isNotEmpty(serviceSubtaskPreachforms)) {
            ServiceSubtaskPreachform serviceSubtaskPreachform1 = serviceSubtaskPreachforms.get(0);
            serviceSubtaskPreachform1.setSendstate("9");
            serviceSubtaskPreachformMapper.updateServiceSubtaskPreachform(serviceSubtaskPreachform1);
        } else if (CollectionUtils.isEmpty(serviceSubtaskPreachforms)) {
            //如果为空的话,说明用户没有选短信发送方式,这个时候需要强制新增一条
            //获取sort的最大值
            ServiceSubtaskPreachform ssp = new ServiceSubtaskPreachform();
            ssp.setSubid(subTaskId);
            ssp.setTaskid(serviceSubtask.getTaskid());
            ssp.setOrgid(serviceSubtask.getOrgid());
            List<ServiceSubtaskPreachform> sspf2 = serviceSubtaskPreachformMapper.selectServiceSubtaskPreachformList(ssp);
            serviceSubtaskPreachform.setSort(0L);
            if (CollectionUtils.isNotEmpty(sspf2)) {
                serviceSubtaskPreachform.setSort(Long.valueOf(sspf2.size()));
            }
            serviceSubtaskPreachform.setSendstate("2");
            serviceSubtaskPreachformMapper.insertServiceSubtaskPreachform(serviceSubtaskPreachform);
        }
    }
    //通过当前时间,拉取电话总数
@@ -2665,6 +2533,72 @@
    }
    public List<ServiceSubtaskCount> getSfStatisticsJoydetails(ServiceSubtaskCountReq serviceSubtaskCountReq) {
       return serviceSubtaskMapper.getSfStatisticsJoydetails(serviceSubtaskCountReq);
        return serviceSubtaskMapper.getSfStatisticsJoydetails(serviceSubtaskCountReq);
    }
    /**
     * @param serviceSubtask
     * @param preachform
     * @param remark
     * @param failSendstate
     * @return
     */
    public Boolean setFailPreachForm(ServiceSubtask serviceSubtask, String preachform, String remark, String failSendstate) {
        //将状态设置为失败
        ServiceSubtaskPreachform serviceSubtaskPreachform = new ServiceSubtaskPreachform();
        serviceSubtaskPreachform.setSubid(serviceSubtask.getId());
        serviceSubtaskPreachform.setTaskid(serviceSubtask.getTaskid());
        serviceSubtaskPreachform.setOrgid(serviceSubtask.getOrgid());
        //获取该患者的发送方式总数
        List<ServiceSubtaskPreachform> spSize = serviceSubtaskPreachformMapper.selectServiceSubtaskPreachformList(serviceSubtaskPreachform);
        serviceSubtaskPreachform.setPreachform(preachform);
        //1:未发送状态
        serviceSubtaskPreachform.setSendstate("1");
        if (preachform.equals("3")) {
            //电话进入队列后,状态会变成2
            serviceSubtaskPreachform.setSendstate("2");
        }
        List<ServiceSubtaskPreachform> serviceSubtaskPreachforms = serviceSubtaskPreachformMapper.selectServiceSubtaskPreachformList(serviceSubtaskPreachform);
        if (CollectionUtils.isNotEmpty(serviceSubtaskPreachforms)) {
            ServiceSubtaskPreachform serviceSubtaskPreachform1 = serviceSubtaskPreachforms.get(0);
            serviceSubtaskPreachform1.setSendstate(failSendstate);
            serviceSubtaskPreachform1.setRemark(remark);
            serviceSubtaskPreachformMapper.updateServiceSubtaskPreachform(serviceSubtaskPreachform1);
            //如果当前的preachform已经是最后一个了,那直接将serviceSubtask的sendstate状态改成5就行了(全失败了)
            if (serviceSubtaskPreachform1.getSort() == spSize.size() && failSendstate.equals("4")) {
                serviceSubtask.setCurrentPreachform(preachform);
                serviceSubtask.setSendstate(5L);
                serviceSubtaskMapper.updateServiceSubtask(serviceSubtask);
                return true;
            }
        }
        serviceSubtask.setCurrentPreachform(preachform);
        serviceSubtask.setSendstate(3L);
        //如果等于9,则说明电话正常结束了
        if (failSendstate.equals("9")) serviceSubtask.setSendstate(6L);
        serviceSubtask.setVisitTime(getNextVisitTime(serviceSubtask.getId(), serviceSubtask.getTaskid(), serviceSubtask.getVisitTime()));
        serviceSubtaskMapper.updateServiceSubtask(serviceSubtask);
        return true;
    }
    private Date getNextVisitTime(Long subid, Long taskid, Date visitTime) {
        ServiceSubtaskPreachform serviceSubtaskPreachform = new ServiceSubtaskPreachform();
        serviceSubtaskPreachform.setSubid(subid);
        serviceSubtaskPreachform.setTaskid(taskid);
        List<ServiceSubtaskPreachform> serviceSubtaskPreachforms = serviceSubtaskPreachformMapper.selectServiceSubtaskPreachformList(serviceSubtaskPreachform);
        if (CollectionUtils.isNotEmpty(serviceSubtaskPreachforms)) {
            String compensateTime = serviceSubtaskPreachforms.get(0).getCompensateTime();
            int hoursToAdd = Integer.valueOf(compensateTime) * 24;
            Calendar calendar = Calendar.getInstance();
            calendar.setTime(visitTime);
            calendar.add(Calendar.HOUR_OF_DAY, hoursToAdd);
            Date newDate = calendar.getTime();
            return newDate;
        }
        return visitTime;
    }
}
smartor/src/main/java/com/smartor/service/impl/ServiceTaskServiceImpl.java
@@ -45,13 +45,15 @@
    @Autowired
    private SvyTaskTemplateMapper svyTaskTemplateMapper;
    private ServiceSubtaskPreachformMapper serviceSubtaskPreachformMapper;
    @Autowired
    private HeLibraryMapper heLibraryMapper;
    @Autowired
    private IvrLibaTemplateScriptMapper ivrLibaTemplateScriptMapper;
    @Autowired
    private IvrTaskTemplateScriptMapper ivrTaskTemplateScriptMapper;
    @Autowired
    private SvyLibTemplateScriptMapper svyLibTemplateScriptMapper;
@@ -59,9 +61,17 @@
    @Autowired
    private PatArchiveMapper patArchiveMapper;
    @Autowired
    private PatMedInhospMapper patMedInhospMapper;
    @Autowired
    private PatMedOuthospMapper patMedOuthospMapper;
    @Autowired
    private IvrLibaTemplateTargetoptionMapper ivrLibaTemplateTargetOptionMapper;
    @Autowired
    private IvrTaskTemplateTargetoptionMapper ivrTaskTemplateTargetOptionMapper;
    @Autowired
    private SvyLibTemplateTargetoptionMapper svyLibTemplateTargetoptionMapper;
@@ -224,7 +234,8 @@
        ServiceSubtaskVO serviceSubtaskVO = new ServiceSubtaskVO();
        serviceSubtaskVO.setPatid(patid);
        serviceSubtaskVO.setTaskid(taskid);
//        List<ServiceSubtask> selectServiceSubtaskList = serviceSubtaskMapper.selectServiceSubtaskList(serviceSubtaskVO);
        serviceSubtaskVO.setSendstate(3L);
        List<ServiceSubtask> selectServiceSubtaskList = serviceSubtaskMapper.selectServiceSubtaskList(serviceSubtaskVO);
//        //查询患者是否重覆做题
//        if (CollectionUtils.isEmpty(selectServiceSubtaskList)) {
//            Long submit = selectServiceSubtaskList.get(0).getSubmit();
@@ -255,20 +266,121 @@
                Integer integer = serviceSubtaskMapper.selectSendstateByCondition(ss);
                if (integer != null && integer != 6) {
                    ss.setSendstate(1L);
//                    ss.setResult("success");
//                    ss.setFinishtime(new Date());
                    serviceSubtaskMapper.updateServiceSubtaskByCondition(ss);
                }
            }
        }
        SvyTaskTemplate svyTaskTemplate = svyTaskTemplateMapper.selectSvyTaskTemplateBySvyid(serviceTask.getTemplateid());
        if (CollectionUtils.isNotEmpty(selectServiceSubtaskList)) {
            //将当前方式的发送状态改成已领取
            ServiceSubtask serviceSubtask = selectServiceSubtaskList.get(0);
            ServiceSubtaskPreachform serviceSubtaskPreachform = new ServiceSubtaskPreachform();
            serviceSubtaskPreachform.setPreachform(serviceSubtask.getCurrentPreachform());
            serviceSubtaskPreachform.setSubid(serviceSubtask.getId());
            serviceSubtaskPreachform.setTaskid(serviceTask.getTaskid());
            List<ServiceSubtaskPreachform> serviceSubtaskPreachforms = serviceSubtaskPreachformMapper.selectServiceSubtaskPreachformList(serviceSubtaskPreachform);
            if (CollectionUtils.isNotEmpty(serviceSubtaskPreachforms)) {
                ServiceSubtaskPreachform ssp = serviceSubtaskPreachforms.get(0);
                ssp.setSendstate("3");
                serviceSubtaskPreachformMapper.updateServiceSubtaskPreachform(ssp);
            }
        }
        if (StringUtils.isNotEmpty(serviceTask.getKcb())) map.put("kcb", serviceTask.getKcb());
        map.put("script", info);
        if (StringUtils.isNotEmpty(serviceTask.getJsy())) map.put("jsy", serviceTask.getJsy());
        map.put("type", serviceTask.getType());
        map.put("taskName", serviceTask.getTaskName());
        map.put("submit", "0");
        return map;
    }
    @Override
    public Map<String, Object> getScriptByCondition(Long taskid, String zyserialnum, String mzserialnum, String tsserialnum) {
        //通过任务ID获取模板ID
        ServiceTask serviceTask = selectServiceTaskByTaskid(taskid);
        //通过模板ID获取问题信息
        SvyLibTemplateScript svyLibTemplateScript = new SvyLibTemplateScript();
        svyLibTemplateScript.setSvyid(Long.valueOf(serviceTask.getLibtemplateid()));
        svyLibTemplateScript.setDelFlag("0");
        List<SvyLibTemplateScript> svyLibTemplateScripts = svyLibTemplateScriptMapper.selectSvyLibTemplateScriptList(svyLibTemplateScript);
        if (CollectionUtils.isEmpty(svyLibTemplateScripts) || svyLibTemplateScripts.size() == 0) {
            log.info("ivrLibaTemplateScripts为空了,请尽快联系管理员处理");
            return null;
        }
        PatArchive patArchive = null;
        if (StringUtils.isNotEmpty(zyserialnum)) {
            PatMedInhospVO patMedInhospVO = new PatMedInhospVO();
            patMedInhospVO.setSerialnum(zyserialnum);
            List<PatMedInhosp> patMedInhospList = patMedInhospMapper.selectPatMedInhospListByCondition(patMedInhospVO);
            if (CollectionUtils.isNotEmpty(patMedInhospList)) {
                patArchive = patArchiveMapper.selectPatArchiveByPatid(patMedInhospList.get(0).getPatid());
            }
        } else if (StringUtils.isNotEmpty(mzserialnum)) {
            PatMedOuthosp patMedOuthosp = new PatMedOuthosp();
            patMedOuthosp.setSerialnum(mzserialnum);
            List<PatMedOuthosp> patMedOuthosps = patMedOuthospMapper.selectPatMedOuthospList(patMedOuthosp);
            if (CollectionUtils.isNotEmpty(patMedOuthosps)) {
                patArchive = patArchiveMapper.selectPatArchiveByPatid(patMedOuthosps.get(0).getPatid());
            }
        } else if (StringUtils.isNotEmpty(tsserialnum)) {
            PatArchive pa = new PatArchive();
            pa.setPatientno(tsserialnum);
            List<PatArchive> patArchives = patArchiveMapper.selectPatArchiveList(pa);
            if (CollectionUtils.isNotEmpty(patArchives)) patArchive = patArchives.get(0);
        }
        //判断一下今天是否已经做过题,做过就不让再做了
        ServiceSubtaskVO serviceSubtaskVO = new ServiceSubtaskVO();
        serviceSubtaskVO.setTaskid(taskid);
        serviceSubtaskVO.setPatid(patArchive.getId());
        serviceSubtaskVO.setVisitTime(new Date());
        List<ServiceSubtask> serviceSubtaskList = serviceSubtaskMapper.selectServiceSubtaskList(serviceSubtaskVO);
        if (CollectionUtils.isNotEmpty(serviceSubtaskList) && serviceSubtaskList.size() > 0) {
            Map<String, Object> map = new HashMap<>();
            map.put("result", "今日已经做过满意度调查 ï¼Œæ— éœ€å†é‡å¤åšç­”!");
            return map;
        }
        List<SvyLibTemplateScriptVO> svyLibTemplateScriptVOS = DtoConversionUtils.sourceToTarget(svyLibTemplateScripts, SvyLibTemplateScriptVO.class);
        //将模板问题话术里的通配符替换
        ObjectMapper objectMapper = new ObjectMapper();
        Map<String, Map<String, String>> serviceTaskMap = null;
        try {
            serviceTaskMap = objectMapper.readValue(serviceTask.getTextParam(), Map.class);
        } catch (JsonProcessingException e) {
            e.printStackTrace();
        }
        List<Map<String, String>> mapList = new ArrayList<>();
        for (Map<String, String> map : serviceTaskMap.values()) {
            mapList.add(map);
        }
        for (SvyLibTemplateScriptVO svyLibTemplateScriptVO : svyLibTemplateScriptVOS) {
            if (StringUtils.isNotEmpty(svyLibTemplateScriptVO.getScriptContent())) {
                for (Map<String, String> map : mapList) {
                    for (String key : map.keySet()) {
                        svyLibTemplateScriptVO.setScriptContent(svyLibTemplateScriptVO.getScriptContent().replace(key, StringUtils.isNotEmpty(map.get(key)) ? map.get(key) : ""));
                    }
                }
                //替换患者个人信息数据
                log.error("问题id:{},   é—®é¢˜å†…容:{}", svyLibTemplateScriptVO.getId(), svyLibTemplateScriptVO.getScriptContent());
                if (StringUtils.isNotEmpty(svyLibTemplateScriptVO.getScriptContent()) && ObjectUtils.isNotEmpty(patArchive)) {
                    svyLibTemplateScriptVO.setScriptContent(svyLibTemplateScriptVO.getScriptContent().replace("${name}", StringUtils.isNotEmpty(patArchive.getName()) ? patArchive.getName() : ""));
                    svyLibTemplateScriptVO.setScriptContent(svyLibTemplateScriptVO.getScriptContent().replace("${dzz}", StringUtils.isNotEmpty(patArchive.getPlaceOfResidence()) ? patArchive.getPlaceOfResidence() : ""));
                    svyLibTemplateScriptVO.setScriptContent(svyLibTemplateScriptVO.getScriptContent().replace("${dhh}", StringUtils.isNotEmpty(patArchive.getTelcode()) ? patArchive.getTelcode() : ""));
                }
                //获取问题选项
                SvyLibTemplateTargetoption svyLibTemplateTargetoption = new SvyLibTemplateTargetoption();
                svyLibTemplateTargetoption.setScriptid(svyLibTemplateScriptVO.getId());
                List<SvyLibTemplateTargetoption> svyLibTemplateTargetoptions = svyLibTemplateTargetoptionMapper.selectSvyLibTemplateTargetoptionList(svyLibTemplateTargetoption);
                svyLibTemplateScriptVO.setSvyLibTemplateTargetoptions(svyLibTemplateTargetoptions);
            }
        }
        Map<String, Object> map = new HashMap<>();
        map.put("result", null);
        map.put("svyLibTemplateScriptVOS", svyLibTemplateScriptVOS);
        return map;
    }
@@ -281,15 +393,15 @@
     */
    public List sfInfo(ServiceTask serviceTask, Long patid, String patfrom) {
        //通过模板ID获取问题信息
        IvrLibaTemplateScript ivrLibaTemplateScript = new IvrLibaTemplateScript();
        ivrLibaTemplateScript.setTemplateid(Long.valueOf(serviceTask.getLibtemplateid()));
        ivrLibaTemplateScript.setDelFlag("0");
        List<IvrLibaTemplateScript> ivrLibaTemplateScripts = ivrLibaTemplateScriptMapper.selectIvrLibaTemplateScriptList(ivrLibaTemplateScript);
        if (CollectionUtils.isEmpty(ivrLibaTemplateScripts) || ivrLibaTemplateScripts.size() == 0) {
        IvrTaskTemplateScript ivrTaskTemplateScript = new IvrTaskTemplateScript();
        ivrTaskTemplateScript.setTemplateID(Long.valueOf(serviceTask.getTemplateid()));
        ivrTaskTemplateScript.setDelFlag("0");
        List<IvrTaskTemplateScript> ivrTaskTemplateScripts = ivrTaskTemplateScriptMapper.selectIvrTaskTemplateScriptList(ivrTaskTemplateScript);
        if (CollectionUtils.isEmpty(ivrTaskTemplateScripts) || ivrTaskTemplateScripts.size() == 0) {
            log.info("ivrLibaTemplateScripts为空了,请尽快联系管理员处理");
            return new ArrayList<>();
        }
        List<IvrLibaTemplateScriptVO> ivrLibaTemplateScriptVOS = DtoConversionUtils.sourceToTarget(ivrLibaTemplateScripts, IvrLibaTemplateScriptVO.class);
        List<IvrTaskTemplateScriptVO> ivrTaskTemplateScriptVOS = DtoConversionUtils.sourceToTarget(ivrTaskTemplateScripts, IvrTaskTemplateScriptVO.class);
        //获取患者信息
        PatArchive patArchive = null;
@@ -314,29 +426,29 @@
        }
        //将模板问题话术里的通配符替换
        for (IvrLibaTemplateScriptVO ivrLibaTemplateScriptVO : ivrLibaTemplateScriptVOS) {
            if (StringUtils.isNotEmpty(ivrLibaTemplateScriptVO.getScriptContent())) {
        for (IvrTaskTemplateScriptVO ivrTaskTemplateScriptVO : ivrTaskTemplateScriptVOS) {
            if (StringUtils.isNotEmpty(ivrTaskTemplateScriptVO.getScriptContent())) {
                for (Map<String, String> map : mapList) {
                    for (String key : map.keySet()) {
                        ivrLibaTemplateScriptVO.setScriptContent(ivrLibaTemplateScriptVO.getScriptContent().replace(key, StringUtils.isNotEmpty(map.get(key)) ? map.get(key) : ""));
                        ivrTaskTemplateScriptVO.setScriptContent(ivrTaskTemplateScriptVO.getScriptContent().replace(key, StringUtils.isNotEmpty(map.get(key)) ? map.get(key) : ""));
                    }
                }
                //替换患者个人信息数据
                ivrLibaTemplateScriptVO.setScriptContent(ivrLibaTemplateScriptVO.getScriptContent().replace("${name}", StringUtils.isNotEmpty(patArchive.getName()) ? patArchive.getName() : ""));
                ivrLibaTemplateScriptVO.setScriptContent(ivrLibaTemplateScriptVO.getScriptContent().replace("${dzz}", StringUtils.isNotEmpty(patArchive.getPlaceOfResidence()) ? patArchive.getPlaceOfResidence() : ""));
                ivrLibaTemplateScriptVO.setScriptContent(ivrLibaTemplateScriptVO.getScriptContent().replace("${dhh}", StringUtils.isNotEmpty(patArchive.getTelcode()) ? patArchive.getTelcode() : ""));
                ivrTaskTemplateScriptVO.setScriptContent(ivrTaskTemplateScriptVO.getScriptContent().replace("${name}", StringUtils.isNotEmpty(patArchive.getName()) ? patArchive.getName() : ""));
                ivrTaskTemplateScriptVO.setScriptContent(ivrTaskTemplateScriptVO.getScriptContent().replace("${dzz}", StringUtils.isNotEmpty(patArchive.getPlaceOfResidence()) ? patArchive.getPlaceOfResidence() : ""));
                ivrTaskTemplateScriptVO.setScriptContent(ivrTaskTemplateScriptVO.getScriptContent().replace("${dhh}", StringUtils.isNotEmpty(patArchive.getTelcode()) ? patArchive.getTelcode() : ""));
                //获取问题选项
                IvrLibaTemplateTargetoption ivrLibaTemplateTargetoption = new IvrLibaTemplateTargetoption();
                ivrLibaTemplateTargetoption.setScriptid(ivrLibaTemplateScriptVO.getId());
                List<IvrLibaTemplateTargetoption> ivrLibaTemplateTargetoptions = ivrLibaTemplateTargetOptionMapper.selectIvrLibaTemplateTargetoptionList(ivrLibaTemplateTargetoption);
                ivrLibaTemplateScriptVO.setIvrLibaScriptTargetoptionList(ivrLibaTemplateTargetoptions);
                IvrTaskTemplateTargetoption ivrTaskTemplateTargetoption = new IvrTaskTemplateTargetoption();
                ivrTaskTemplateTargetoption.setScriptid(ivrTaskTemplateScriptVO.getId());
                List<IvrTaskTemplateTargetoption> ivrTaskTemplateTargetoptions = ivrTaskTemplateTargetOptionMapper.selectIvrTaskTemplateTargetoptionList(ivrTaskTemplateTargetoption);
                ivrTaskTemplateScriptVO.setIvrTaskScriptTargetoptionList(ivrTaskTemplateTargetoptions);
            }
        }
        Collections.sort(ivrLibaTemplateScriptVOS, Comparator.comparingLong(IvrLibaTemplateScriptVO::getSort));
        Collections.sort(ivrTaskTemplateScriptVOS, Comparator.comparingLong(IvrTaskTemplateScriptVO::getSort));
        return ivrLibaTemplateScriptVOS;
        return ivrTaskTemplateScriptVOS;
    }
    /**
smartor/src/main/java/com/smartor/service/impl/ServiceTelInfoServiceImpl.java
@@ -23,7 +23,7 @@
     */
    @Override
    public List<Map<String,Object>> getList() {
       List<Map<String,Object>> lists= utilsMapper.getList("select * from service_telinfo where state=0  OR DATE_ADD(editTime, INTERVAL 10 MINUTE)< NOW()  ");
       List<Map<String,Object>> lists= utilsMapper.getList("select * from service_telinfo where state=0 ");
        return lists;
    }
    /**
smartor/src/main/java/com/smartor/service/impl/SvyTaskSingleServiceImpl.java
@@ -350,7 +350,7 @@
            }else if(ObjectUtils.isNotEmpty(serviceQueryInfo.getUrl360())){
                result = OkHttpExample.sendPostRequest(serviceQueryInfo.getUrl360(), jsonString, token);
            }
                map = objectMapper.readValue(result, Map.class);
            map = objectMapper.readValue(result, Map.class);
        } catch (Exception e) {
            e.printStackTrace();
        }
@@ -362,6 +362,7 @@
        return map;
    }
    @Override
    public Map focus(ServiceQueryFocus serviceQueryFocus) {
        return null;
smartor/src/main/resources/mapper/smartor/HNGatherPatArchiveMapper.xml
@@ -645,7 +645,7 @@
               d.create_time,
               d.his_dept_id,
               d.his_parent_id
        FROM bmxx d
        FROM HEALTHY_DEPT d
    </select>
</mapper>
smartor/src/main/resources/mapper/smartor/PatArchiveMapper.xml
@@ -519,7 +519,7 @@
            </if>
        </where>
        order by a.update_time desc
        <if test="pn != null  and ps != null"> limit ${pn},${ps} </if>
        <if test="pn != null  and ps != null">limit ${pn},${ps}</if>
    </select>
@@ -660,8 +660,9 @@
                AND NOT exists ( SELECT 1 FROM pat_filterlist f where d.patid=f.patid)
            </if>
        </where>
        order by a.update_time desc
        <if test="pn != null  and ps != null"> limit ${pn},${ps} </if>
        -- order by a.update_time desc
        <if test="pageSize != null  and pageNum != null">limit ${pageSize} OFFSET ${pageNum}</if>
    </select>
    <select id="selectPatArchiveInfoByOuthosp" parameterType="com.smartor.domain.PatArchiveReq"
@@ -751,8 +752,8 @@
                AND NOT exists ( SELECT 1 FROM pat_filterlist f where d.patid=f.patid)
            </if>
        </where>
        order by a.update_time desc
        <if test="pn != null  and ps != null"> limit ${pn},${ps} </if>
        -- order by a.update_time desc
        <if test="pageSize != null  and pageNum != null">limit ${pageSize} OFFSET ${pageNum}</if>
    </select>
    <select id="selectPatArchiveInfoByPhysical" parameterType="com.smartor.domain.PatArchiveReq"
@@ -844,8 +845,8 @@
                AND NOT exists ( SELECT 1 FROM pat_filterlist f where d.patid=f.patid)
            </if>
        </where>
        order by a.update_time desc
        <if test="pn != null  and ps != null"> limit ${pn},${ps} </if>
        -- order by a.update_time desc
        <if test="pageSize != null  and pageNum != null">limit ${pageSize} OFFSET ${pageNum}</if>
    </select>
    <select id="selectPatArchiveInfoByInhospQC" parameterType="com.smartor.domain.PatArchiveReq"
@@ -939,8 +940,8 @@
            <if test="drcode != null">
                AND d.drcode = #{drcode}
            </if>
            <if test="cry != null and cry == 0 ">and d.endtime is null</if>
            <if test="cry != null and cry == 1 ">and d.endtime is not null</if>
            <if test="allhosp != null and allhosp == 1 ">and d.endtime is null</if>
            <if test="allhosp != null and allhosp == 4 ">and d.endtime is not null</if>
            <if test="visitno != null and visitno != ''">
                AND d.inhospno = #{visitno}
            </if>
@@ -989,8 +990,8 @@
                AND NOT exists ( SELECT 1 FROM pat_filterlist f where d.patid=f.patid)
            </if>
        </where>
        order by a.id,a.update_time desc ) as tmp order by endtime desc
        <if test="pn != null  and ps != null"> limit ${pn},${ps} </if>
        <if test="pageSize != null  and pageNum != null">limit ${pageSize} OFFSET ${pageNum}</if>
        ) as tmp
    </select>
    <select id="selectPatArchiveInfoByOuthospQC" parameterType="com.smartor.domain.PatArchiveReq"
@@ -1084,7 +1085,7 @@
                AND NOT exists ( SELECT 1 FROM pat_filterlist f where d.patid=f.patid)
            </if>
        </where>
        order by a.update_time desc
        <if test="pageSize != null  and pageNum != null">limit ${pageSize} OFFSET ${pageNum}</if>
    </select>
    <select id="selectPatArchiveInfoByPhysicalQC" parameterType="com.smartor.domain.PatArchiveReq"
@@ -1176,6 +1177,7 @@
                AND NOT exists ( SELECT 1 FROM pat_filterlist f where d.patid=f.patid)
            </if>
        </where>
        order by a.update_time desc
        -- order by a.update_time desc
        <if test="pageSize != null  and pageNum != null">limit ${pageSize} OFFSET ${pageNum}</if>
    </select>
</mapper>
smartor/src/main/resources/mapper/smartor/PatMedInhospMapper.xml
@@ -387,9 +387,9 @@
        b.out_way_name,
        b.nurse_id,
        b.nurse_name,
        b.deptcheckFlag,
        b.diagcheckFlag,
        b.wardcheckFlag,
        b.deptcheck_flag,
        b.diagcheck_flag,
        b.wardcheck_flag,
        b.inhospstate,
        b.patno,
        b.inhospno,
@@ -436,7 +436,7 @@
        b.futypecode,
        b.futypedesc,
        b.fuadvice,
        b.fuspecialadvice
        b.fuspecialadvice,
        b.schemetime
        FROM
        pat_med_inhosp b,
@@ -456,6 +456,7 @@
                concat('%', #{hospitaldistrictname}, '%')
            </if>
            <if test="endtime != null ">and b.endtime = #{endtime}</if>
            <if test="serialnum != null ">and b.serialnum = #{serialnum}</if>
            <if test="fuflag != null ">and b.fuflag = #{fuflag}</if>
            <if test="nurseId != null ">and b.nurse_id = #{nurseId}</if>
            <if test="nurseName != null ">and b.nurse_name = #{nurseName}</if>
smartor/src/main/resources/mapper/smartor/PatMedOuthospMapper.xml
@@ -122,6 +122,15 @@
                #{hospitalname},
                '%')
            </if>
            <if test="deptcodes != null and deptcodes.size()>0">
                AND  pmo.deptcode IN
                <foreach collection="deptcodes" item="deptcode" open="(" separator=","
                         close=")">
                    #{deptcode}
                </foreach>
            </if>
            <if test="deptname != null  and deptname != ''">and pmo.deptname like concat('%', #{deptname}, '%')</if>
            <if test="drname != null  and drname != ''">and pmo.drname like concat('%', #{drname}, '%')</if>
            <if test="patname != null  and patname != ''">and pmo.patname like concat('%', #{patname}, '%')</if>
smartor/src/main/resources/mapper/smartor/ServiceSubtaskDetailMapper.xml
@@ -171,7 +171,9 @@
        where id = #{id}
    </select>
    <insert id="insertServiceSubtaskDetail" parameterType="com.smartor.domain.ServiceSubtaskDetail">
    <insert id="insertServiceSubtaskDetail" parameterType="com.smartor.domain.ServiceSubtaskDetail"
            useGeneratedKeys="true"
            keyProperty="id">
        insert into service_subtask_detail
        <trim prefix="(" suffix=")" suffixOverrides=",">
            <if test="id != null">id,</if>
smartor/src/main/resources/mapper/smartor/ServiceSubtaskMapper.xml
@@ -84,6 +84,7 @@
        <result property="visitDeptCode" column="visit_dept_code"/>
        <result property="managementDoctor" column="management_doctor"/>
        <result property="managementDoctorCode" column="management_doctor_code"/>
        <result property="currentPreachform" column="current_preachform"/>
    </resultMap>
    <resultMap type="com.smartor.domain.ServiceSubtaskCount" id="ServiceSubtaskResult2">
@@ -104,6 +105,7 @@
               patfrom,
               management_doctor,
               management_doctor_code,
               current_preachform,
               upid,
               visit_dept_name,
               visit_dept_code,
@@ -184,6 +186,36 @@
               management_doctor_code
        from service_subtask
    </sql>
    <select id="selectServiceSubtaskBySendstate" parameterType="com.smartor.domain.ServiceSubtaskVO"
            resultMap="ServiceSubtaskResult">
        <include refid="selectServiceSubtaskVo"/>
        <where>
            del_flag=0
            and taskid = #{taskid}
            AND sendstate IN
            <foreach collection="sendstates" item="sendstate" open="(" separator=","
                     close=")">
                #{sendstate}
            </foreach>
        </where>
    </select>
    <select id="queryServiceSubtaskList" parameterType="com.smartor.domain.ServiceSubtaskVO"
            resultMap="ServiceSubtaskResult">
        <include refid="selectServiceSubtaskVo"/>
        <where>
            del_flag=0
            <if test="taskid != null ">and taskid = #{taskid}</if>
            <if test="visitTime != null">
                AND date_format(visit_time,'%y%m%d') &lt;= date_format(#{visitTime},'%y%m%d')
            </if>
            <if test="sendstate != null ">and sendstate = #{sendstate}</if>
        </where>
    </select>
    <select id="selectServiceSubtaskList" parameterType="com.smartor.domain.ServiceSubtaskVO"
            resultMap="ServiceSubtaskResult">
@@ -275,6 +307,9 @@
                </if>
            </if>
            <if test="visitTime != null">
                AND date_format(visit_time,'%y%m%d') = date_format(#{visitTime},'%y%m%d')
            </if>
            <if test="senddate != null ">and senddate = #{senddate}</if>
            <if test="senduuid != null  and senduuid != ''">and senduuid = #{senduuid}</if>
            <if test="result != null  and result != ''">and result = #{result}</if>
@@ -290,6 +325,7 @@
            <if test="orgid != null  and orgid != ''">and orgid = #{orgid}</if>
            <if test="pid != null ">and pid = #{pid}</if>
            <if test="preachform != null ">and preachform = #{preachform}</if>
            <if test="currentPreachform != null ">and current_preachform = #{currentPreachform}</if>
            <if test="guid != null  and guid != ''">and guid = #{guid}</if>
            <if test="textParam != null  and textParam != ''">and text_param = #{textParam}</if>
            <if test="bedNo != null">and bed_no = #{bedNo}</if>
@@ -324,7 +360,7 @@
            <if test="createBy != null">and create_by = #{createBy}</if>
            <if test="taskGuid != null">and task_guid = #{taskGuid}</if>
            <if test="isVisitAgain != null">and is_visit_again = #{isVisitAgain}</if>
            <if test="visitTime != null">and visit_time = #{visitTime}</if>
            <!-- <if test="visitTime != null">and visit_time = #{visitTime}</if> -->
            <!--<if test="visitDeptCode != null">and visit_dept_code = #{visitDeptCode}</if>
            <if test="visitDeptName != null">and visit_dept_name = #{visitDeptName}</if>-->
            <if test="visitCount != null and visitCount > 1 and visitDeptCodes != null and visitDeptCodes.size() > 0">
@@ -367,6 +403,7 @@
            <if test="visitDeptName != null">and visit_dept_name = #{visitDeptName}</if>
            <if test="managementDoctorCode != null">and management_doctor_code = #{managementDoctorCode}</if>
            <if test="managementDoctor != null">and management_doctor = #{managementDoctor}</if>
            <if test="currentPreachform != null">and current_preachform = #{currentPreachform}</if>
        </where>
    </select>
@@ -421,6 +458,7 @@
            <if test="visitTime != null ">and visit_time = #{visitTime}</if>
            <if test="visitDeptCode != null">and visit_dept_code = #{visitDeptCode}</if>
            <if test="visitDeptName != null">and visit_dept_name = #{visitDeptName}</if>
            <if test="currentPreachform != null">and current_preachform = #{currentPreachform}</if>
            <if test="managementDoctorCode != null">and management_doctor_code = #{managementDoctorCode}</if>
            <if test="managementDoctor != null">and management_doctor like concat('%',#{managementDoctor}, '%')</if>
        </where>
@@ -585,6 +623,7 @@
            <if test="visitDeptName != null">visit_dept_name,</if>
            <if test="managementDoctorCode != null">management_doctor_code,</if>
            <if test="managementDoctor != null">management_doctor,</if>
            <if test="currentPreachform != null">current_preachform,</if>
        </trim>
        <trim prefix="values (" suffix=")" suffixOverrides=",">
            <if test="sendname != null">#{sendname},</if>
@@ -668,6 +707,7 @@
            <if test="visitDeptName != null">#{visitDeptName},</if>
            <if test="managementDoctorCode != null">#{managementDoctorCode},</if>
            <if test="managementDoctor != null">#{managementDoctor},</if>
            <if test="currentPreachform != null">#{currentPreachform},</if>
        </trim>
    </insert>
@@ -756,6 +796,7 @@
            <if test="visitDeptName != null">visit_dept_name = #{visitDeptName},</if>
            <if test="managementDoctorCode != null">management_doctor_code = #{managementDoctorCode},</if>
            <if test="managementDoctor != null">management_doctor=#{managementDoctor},</if>
            <if test="currentPreachform != null">current_preachform=#{currentPreachform},</if>
        </trim>
        where id = #{id}
    </update>
@@ -845,6 +886,7 @@
            <if test="visitDeptName != null">visit_dept_name = #{visitDeptName},</if>
            <if test="managementDoctorCode != null">management_doctor_code = #{managementDoctorCode},</if>
            <if test="managementDoctor != null">management_doctor=#{managementDoctor},</if>
            <if test="currentPreachform != null">current_preachform=#{currentPreachform},</if>
        </trim>
        <where>
            <if test="patid != null ">and patid = #{patid}</if>
@@ -936,6 +978,7 @@
            <if test="visitDeptName != null">visit_dept_name = #{visitDeptName},</if>
            <if test="managementDoctorCode != null">management_doctor_code = #{managementDoctorCode},</if>
            <if test="managementDoctor != null">management_doctor=#{managementDoctor},</if>
            <if test="currentPreachform != null">current_preachform=#{currentPreachform},</if>
        </trim>
        where patid = #{patid} and taskid = #{taskid}
    </update>
@@ -1024,6 +1067,7 @@
            <if test="visitDeptName != null">visit_dept_name = #{visitDeptName},</if>
            <if test="managementDoctorCode != null">management_doctor_code = #{managementDoctorCode},</if>
            <if test="managementDoctor != null">management_doctor=#{managementDoctor},</if>
            <if test="currentPreachform != null">current_preachform=#{currentPreachform},</if>
        </trim>
        where task_guid = #{taskGuid} and task_name = #{taskName}
    </update>
@@ -1204,6 +1248,7 @@
               openid,
               sfzh,
               addr,
               current_preachform,
               senderdetail,
               type,
               taskid,
@@ -1342,16 +1387,16 @@
                DATE_FORMAT(visit_time, '%Y-%m-%d') AS timePeriod,
            </otherwise>
        </choose>
        COUNT(CASE WHEN service_type = '2' THEN 1 END) AS dischargeFollowCount,
        COUNT(CASE WHEN service_type = '3' THEN 1 END) AS outpatientFollowCount,
        CASE WHEN service_type = '2' THEN 1 END AS dischargeFollowCount,
        CASE WHEN service_type = '3' THEN 1 END AS outpatientFollowCount,
        0 AS pmiCount,
        0 AS pmoCount
        FROM service_subtask
        WHERE
        del_flag = '0'
        <if test="startDate != null and endDate != null">
            and date_format(visit_time,'%y%m%d') &gt;= date_format(#{startDate},'%y%m%d')
            and date_format(visit_time,'%y%m%d') &lt;= date_format(#{endDate},'%y%m%d')
            AND visit_time >= #{startDate}
            AND visit_time &lt;= DATE_ADD(#{endDate}, INTERVAL 1 DAY)
        </if>
        <if test="orgid != null">
@@ -1379,24 +1424,24 @@
            </foreach>
        </if>
        GROUP BY
        <choose>
            <when test="timeType == 'day'">
                DATE_FORMAT(visit_time, '%Y-%m-%d')
            </when>
            <when test="timeType == 'month'">
                DATE_FORMAT(visit_time, '%Y-%m')
            </when>
            <when test="timeType == 'year'">
                DATE_FORMAT(visit_time, '%Y')
            </when>
            <when test="timeType == 'week'">
                CONCAT(YEAR(visit_time), '-W', LPAD(WEEK(visit_time, 1), 2, '0'))
            </when>
            <otherwise>
                DATE_FORMAT(visit_time, '%Y-%m-%d')
            </otherwise>
        </choose>
<!--        GROUP BY-->
<!--        <choose>-->
<!--            <when test="timeType == 'day'">-->
<!--                DATE_FORMAT(visit_time, '%Y-%m-%d')-->
<!--            </when>-->
<!--            <when test="timeType == 'month'">-->
<!--                DATE_FORMAT(visit_time, '%Y-%m')-->
<!--            </when>-->
<!--            <when test="timeType == 'year'">-->
<!--                DATE_FORMAT(visit_time, '%Y')-->
<!--            </when>-->
<!--            <when test="timeType == 'week'">-->
<!--                CONCAT(YEAR(visit_time), '-W', LPAD(WEEK(visit_time, 1), 2, '0'))-->
<!--            </when>-->
<!--            <otherwise>-->
<!--                DATE_FORMAT(visit_time, '%Y-%m-%d')-->
<!--            </otherwise>-->
<!--        </choose>-->
        UNION ALL
@@ -1421,13 +1466,13 @@
        </choose>
        0 AS dischargeFollowCount,
        0 AS outpatientFollowCount,
        COUNT( patid) AS pmiCount,
        1 AS pmiCount,
        0 AS pmoCount
        FROM pat_med_inhosp
        WHERE del_flag = '0'
        <if test="startDate != null and endDate != null">
            and date_format(endtime,'%y%m%d') &gt;= date_format(#{startDate},'%y%m%d')
            and date_format(endtime,'%y%m%d') &lt;= date_format(#{endDate},'%y%m%d')
            AND endtime >= #{startDate}
            AND endtime &lt;= DATE_ADD(#{endDate}, INTERVAL 1 DAY)
        </if>
        AND inhospstate=1
@@ -1449,24 +1494,24 @@
            </foreach>
        </if>
        GROUP BY
        <choose>
            <when test="timeType == 'day'">
                DATE_FORMAT(endtime, '%Y-%m-%d')
            </when>
            <when test="timeType == 'month'">
                DATE_FORMAT(endtime, '%Y-%m')
            </when>
            <when test="timeType == 'year'">
                DATE_FORMAT(endtime, '%Y')
            </when>
            <when test="timeType == 'week'">
                CONCAT(YEAR(endtime), '-W', LPAD(WEEK(endtime, 1), 2, '0'))
            </when>
            <otherwise>
                DATE_FORMAT(endtime, '%Y-%m-%d')
            </otherwise>
        </choose>
<!--        GROUP BY-->
<!--        <choose>-->
<!--            <when test="timeType == 'day'">-->
<!--                DATE_FORMAT(endtime, '%Y-%m-%d')-->
<!--            </when>-->
<!--            <when test="timeType == 'month'">-->
<!--                DATE_FORMAT(endtime, '%Y-%m')-->
<!--            </when>-->
<!--            <when test="timeType == 'year'">-->
<!--                DATE_FORMAT(endtime, '%Y')-->
<!--            </when>-->
<!--            <when test="timeType == 'week'">-->
<!--                CONCAT(YEAR(endtime), '-W', LPAD(WEEK(endtime, 1), 2, '0'))-->
<!--            </when>-->
<!--            <otherwise>-->
<!--                DATE_FORMAT(endtime, '%Y-%m-%d')-->
<!--            </otherwise>-->
<!--        </choose>-->
        UNION ALL
@@ -1492,12 +1537,12 @@
        0 AS dischargeFollowCount,
        0 AS outpatientFollowCount,
        0 AS pmiCount,
        COUNT( patid) AS pmoCount
        1 AS pmoCount
        FROM pat_med_outhosp
        WHERE del_flag = '0'
        <if test="startDate != null and endDate != null">
            and date_format(admitdate,'%y%m%d') &gt;= date_format(#{startDate},'%y%m%d')
            and date_format(admitdate,'%y%m%d') &lt;= date_format(#{endDate},'%y%m%d')
            AND admitdate >= #{startDate}
            AND admitdate &lt;= DATE_ADD(#{endDate}, INTERVAL 1 DAY)
        </if>
        <if test="orgid != null">
            AND orgid = #{orgid}
@@ -1510,24 +1555,24 @@
            </foreach>
        </if>
        GROUP BY
        <choose>
            <when test="timeType == 'day'">
                DATE_FORMAT(admitdate, '%Y-%m-%d')
            </when>
            <when test="timeType == 'month'">
                DATE_FORMAT(admitdate, '%Y-%m')
            </when>
            <when test="timeType == 'year'">
                DATE_FORMAT(admitdate, '%Y')
            </when>
            <when test="timeType == 'week'">
                CONCAT(YEAR(admitdate), '-W', LPAD(WEEK(admitdate, 1), 2, '0'))
            </when>
            <otherwise>
                DATE_FORMAT(admitdate, '%Y-%m-%d')
            </otherwise>
        </choose>
<!--        GROUP BY-->
<!--        <choose>-->
<!--            <when test="timeType == 'day'">-->
<!--                DATE_FORMAT(admitdate, '%Y-%m-%d')-->
<!--            </when>-->
<!--            <when test="timeType == 'month'">-->
<!--                DATE_FORMAT(admitdate, '%Y-%m')-->
<!--            </when>-->
<!--            <when test="timeType == 'year'">-->
<!--                DATE_FORMAT(admitdate, '%Y')-->
<!--            </when>-->
<!--            <when test="timeType == 'week'">-->
<!--                CONCAT(YEAR(admitdate), '-W', LPAD(WEEK(admitdate, 1), 2, '0'))-->
<!--            </when>-->
<!--            <otherwise>-->
<!--                DATE_FORMAT(admitdate, '%Y-%m-%d')-->
<!--            </otherwise>-->
<!--        </choose>-->
        ) AS combined_data
        GROUP BY timePeriod
        ORDER BY timePeriod DESC
smartor/src/main/resources/mapper/smartor/SysDeptMapper.xml
@@ -120,23 +120,28 @@
    <select id="selectDeptByCode" parameterType="string" resultMap="SysDeptResult">
        select d.dept_id,
               d.parent_id,
               d.type,
               d.dept_code,
               d.dept_type,
               d.ancestors,
               d.dept_name,
               d.order_num,
               d.leader,
               d.phone,
               d.email,
               d.orgid,
               d.his_dept_id,
               d.his_parent_id
            d.status
        d.parent_id,
        d.type,
        d.dept_code,
        d.dept_type,
        d.ancestors,
        d.dept_name,
        d.order_num,
        d.leader,
        d.phone,
        d.email,
        d.orgid,
        d.his_dept_id,
        d.his_parent_id,
        d.status
        from sys_dept d
        where del_flag = 0
          and d.dept_code = #{deptCode}
        <if test="deptCode != null and deptCode != ''">
            AND dept_code = #{deptCode}
        </if>
        <if test="orgid != null and orgid != ''">
            AND orgid = #{orgid}
        </if>
    </select>
    <select id="checkDeptExistUser" parameterType="Long" resultType="int">
@@ -306,7 +311,7 @@
    <delete id="deleteDeptById" parameterType="Long">
        update sys_dept
        set del_flag = '2'
        set del_flag = '1'
        where dept_id = #{deptId}
    </delete>
smartor/src/main/resources/mapper/smartor/SysUserDeptMapper.xml
@@ -195,7 +195,7 @@
               d.orgid,
               d.status as dept_status
        from sys_dept d
                 left join sys_user_dept ud on d.dept_id = ud.dept_id
                 left join sys_user_dept ud on d.dept_code = ud.dept_code
        where ud.user_id = #{userId}
          and ud.del_flag = 0
          and d.del_flag = 0