liusheng
2026-03-06 459aa78c84cf552ebea6ef056d978c2531d71ac8
代码提交
已重命名1个文件
已修改25个文件
已添加1个文件
已复制2个文件
1453 ■■■■■ 文件已修改
ruoyi-admin/src/main/java/com/ruoyi/web/component/RedisMqReceiver.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/controller/smartor/ServiceSubtaskController.java 71 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/controller/smartor/ServiceTaskController.java 11 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/controller/smartor/SvyTaskController.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysLoginController.java 91 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/SysLoginService.java 92 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/UserDetailsServiceImpl.java 4 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/RyTask.java 82 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/pom.xml 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/common/DistinctByProperty.java 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/domain/PatTaskRelevance.java 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/domain/ServiceSubtask.java 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/domain/ServiceSubtaskRes.java 575 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/domain/VO/ServiceSubtaskVO.java 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/domain/entity/ServiceSubtaskEntity.java 24 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/mapper/ServiceSubtaskMapper.java 19 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/service/IServiceSubtaskService.java 11 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/service/impl/CommonTaskServiceImpl.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/service/impl/PatArchiveServiceImpl.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/service/impl/PatFilterlistServiceImpl.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/service/impl/PatMedInhospServiceImpl.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/service/impl/PatMedOuthospServiceImpl.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/service/impl/ServiceExternalServiceImpl.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/service/impl/ServiceSLTDHealthcareRecordServiceImpl.java 10 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/service/impl/ServiceSubtaskAnswerServiceImpl.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/service/impl/ServiceSubtaskServiceImpl.java 223 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/service/impl/ServiceTaskServiceImpl.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/service/impl/SvyTaskSingleServiceImpl.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/resources/mapper/smartor/ServiceSubtaskMapper.xml 97 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/component/RedisMqReceiver.java
@@ -24,6 +24,7 @@
import com.ruoyi.system.service.ISysConfigService;
import com.smartor.common.LSHospTokenUtil;
import com.smartor.domain.*;
import com.smartor.domain.entity.ServiceSubtaskEntity;
import com.smartor.mapper.*;
import com.smartor.service.IBaseSmsaccountService;
import com.smartor.service.IServiceOutPathService;
@@ -187,7 +188,7 @@
        ServiceTask ivrTask1 = ivrTaskMapper.selectServiceTaskByTaskid(commonTaskcallMQ.getTaskid());
        //通过任务ID拿到患者信息
        ServiceSubtaskVO serviceSubtaskVO = new ServiceSubtaskVO();
        ServiceSubtaskEntity serviceSubtaskVO = new ServiceSubtaskEntity();
        serviceSubtaskVO.setTaskid(commonTaskcallMQ.getTaskid());
        serviceSubtaskVO.setSendstate(2L);
        List<ServiceSubtask> selectServiceSubtaskList = ivrTaskcallMapper.selectServiceSubtaskList(serviceSubtaskVO);
ruoyi-admin/src/main/java/com/ruoyi/web/controller/smartor/ServiceSubtaskController.java
@@ -25,6 +25,8 @@
import com.ruoyi.system.domain.SysConfig;
import com.ruoyi.system.service.ISysConfigService;
import com.smartor.domain.*;
import com.smartor.domain.VO.ServiceSubtaskVO;
import com.smartor.domain.entity.ServiceSubtaskEntity;
import com.smartor.mapper.PatMedInhospMapper;
import com.smartor.mapper.PatMedOuthospMapper;
import com.smartor.service.IServiceSubtaskRecordService;
@@ -96,14 +98,17 @@
//        }
        serviceSubtaskVO.setPageNum(PageUtils.getOffset(serviceSubtaskVO.getPageNum(), serviceSubtaskVO.getPageSize()));
        List<ServiceSubtask> serviceSubtaskList = null;
        List<ServiceSubtaskRes> serviceSubtaskList = null;
        LoginUser loginUser = getLoginUser();
        SysUser user = loginUser.getUser();
        serviceSubtaskVO.setOrgid(user.getOrgid());
        ServiceSubtaskEntity serviceSubtaskEntity = null;
        if (serviceSubtaskVO != null) {
            serviceSubtaskList = serviceSubtaskService.patItem(serviceSubtaskVO);
            serviceSubtaskEntity = DtoConversionUtils.sourceToTarget(serviceSubtaskVO, ServiceSubtaskEntity.class);
            serviceSubtaskEntity.setContinueContent(ObjectUtils.isNotEmpty(serviceSubtaskVO.getContinueContent()) ? serviceSubtaskVO.getContinueContent().toString() : null);
            serviceSubtaskList = serviceSubtaskService.patItem(serviceSubtaskEntity);
        }
        for (ServiceSubtask serviceSubtask : serviceSubtaskList) {
        for (ServiceSubtaskRes serviceSubtask : serviceSubtaskList) {
            ServiceSubtaskRecord serviceSubtaskRecord = new ServiceSubtaskRecord();
            serviceSubtaskRecord.setSubtaskId(serviceSubtask.getId());
            serviceSubtaskRecord.setOrgid(serviceSubtask.getOrgid());
@@ -116,14 +121,14 @@
        }
//      patItemCount è°ƒç”¨redisCache记录统计数据
        Map<String, Object> map = serviceSubtaskService.patItemCount(serviceSubtaskVO);
        Map<String, Object> map = serviceSubtaskService.patItemCount(serviceSubtaskEntity);
        map.put("serviceSubtaskList", serviceSubtaskList);
        List<Map<String, Object>> list = new ArrayList<>();
        list.add(map);
        serviceSubtaskVO.setPageNum(null);
        serviceSubtaskVO.setPageSize(null);
        List<ServiceSubtask> serviceSubtasks = serviceSubtaskService.patItem(serviceSubtaskVO);
        List<ServiceSubtaskRes> serviceSubtasks = serviceSubtaskService.patItem(serviceSubtaskEntity);
        return getDataTable3(CollectionUtils.isNotEmpty(serviceSubtasks) ? serviceSubtasks.size() : 0L, list);
    }
@@ -136,6 +141,10 @@
    @PostMapping("/patItemCount")
    public Map<String, Object> patItemCount(@RequestBody ServiceSubtaskVO serviceSubtaskVO) {
        Map<String, Object> map = new HashMap<>();
        ServiceSubtaskEntity serviceSubtaskEntity = DtoConversionUtils.sourceToTarget(serviceSubtaskVO, ServiceSubtaskEntity.class);
        serviceSubtaskEntity.setContinueContent(ObjectUtils.isNotEmpty(serviceSubtaskVO.getContinueContent()) ? serviceSubtaskVO.getContinueContent().toString() : null);
        // é€šè¿‡redis记录结果
        Map<String, Object> redisMap = new HashMap<>();
        LoginUser loginUser = getLoginUser();
@@ -151,11 +160,11 @@
            redisMap = redisCache.getCacheObject(userId + "patItemCount");
            //记录是否有可用缓存
            Boolean redisFlag = false;
            ServiceSubtaskVO oldCondition = null;
            ServiceSubtaskEntity oldCondition = null;
            if (MapUtils.isNotEmpty(redisMap)) {
                oldCondition = (ServiceSubtaskVO) redisMap.get("searchCondition");
                oldCondition = (ServiceSubtaskEntity) redisMap.get("searchCondition");
                // æ¯”较查询条件是否一致
                if (ObjectUtils.isNotEmpty(oldCondition) && isSameCondition(oldCondition, serviceSubtaskVO)) {
                if (ObjectUtils.isNotEmpty(oldCondition) && isSameCondition(oldCondition, serviceSubtaskEntity)) {
                    // æ¡ä»¶ä¸€è‡´ï¼Œä½¿ç”¨ç¼“å­˜
                    redisFlag = true;
                    map = redisMap;
@@ -165,8 +174,8 @@
            // å¦‚果没有缓存或者条件不一致,重新查询
            if (!redisFlag) {
                map = serviceSubtaskService.patItemCount(serviceSubtaskVO);
                map.put("searchCondition", serviceSubtaskVO);
                map = serviceSubtaskService.patItemCount(serviceSubtaskEntity);
                map.put("searchCondition", serviceSubtaskEntity);
                redisCache.setCacheObject(userId + "patItemCount", map, 120, TimeUnit.MINUTES);
            }
        }
@@ -179,7 +188,7 @@
     * æ¯”较两个ServiceSubtaskVO的查询条件是否一致
     * ä½¿ç”¨åå°„比较所有字段,排除分页参数和无关字段
     */
    private boolean isSameCondition(ServiceSubtaskVO oldCondition, ServiceSubtaskVO newCondition) {
    private boolean isSameCondition(ServiceSubtaskEntity oldCondition, ServiceSubtaskEntity newCondition) {
        // ä½¿ç”¨ReflectUtils的通用方法比较,排除分页参数等无关字段
        return ReflectUtils.equalsAllFields(oldCondition, newCondition,
                // æŽ’除的字段:分页参数、序列化ID、时间戳等
@@ -193,8 +202,8 @@
    //@PreAuthorize("@ss.hasPermi('system:taskcall:export')")
    @Log(title = "单一任务(随访宣教)", businessType = BusinessType.EXPORT)
    @PostMapping("/patItemExport")
    public void patItemExport(HttpServletResponse response, ServiceSubtaskVO serviceSubtaskVO) {
        List<ServiceSubtask> serviceSubtaskList = null;
    public void patItemExport(HttpServletResponse response, ServiceSubtaskEntity serviceSubtaskVO) {
        List<ServiceSubtaskRes> serviceSubtaskList = null;
        if (serviceSubtaskVO != null) {
            if (serviceSubtaskVO.getPageNum() != null && serviceSubtaskVO.getPageSize() != null)
                PageUtils.startPageByPost(serviceSubtaskVO.getPageNum(), serviceSubtaskVO.getPageSize());
@@ -223,9 +232,12 @@
    @PostMapping("/patItemByCondition")
    public TableDataInfo patItemByCondition(@RequestBody ServiceSubtaskVO serviceSubtaskVO) {
        List<ServiceSubtask> serviceSubtaskList = null;
        if (serviceSubtaskVO != null) {
            PageUtils.startPageByPost(serviceSubtaskVO.getPageNum(), serviceSubtaskVO.getPageSize());
            serviceSubtaskList = serviceSubtaskService.patItem2(serviceSubtaskVO);
        ServiceSubtaskEntity serviceSubtaskEntity = DtoConversionUtils.sourceToTarget(serviceSubtaskVO, ServiceSubtaskEntity.class);
        serviceSubtaskEntity.setContinueContent(ObjectUtils.isNotEmpty(serviceSubtaskVO.getContinueContent()) ? serviceSubtaskVO.getContinueContent().toString() : null);
        if (serviceSubtaskEntity != null) {
            PageUtils.startPageByPost(serviceSubtaskEntity.getPageNum(), serviceSubtaskEntity.getPageSize());
            serviceSubtaskList = serviceSubtaskService.patItem2(serviceSubtaskEntity);
        }
        for (ServiceSubtask serviceSubtask : serviceSubtaskList) {
            ServiceSubtaskRecord serviceSubtaskRecord = new ServiceSubtaskRecord();
@@ -235,7 +247,7 @@
        }
//      patItemCount è°ƒç”¨redisCache记录统计数据
//      Map<String, Object> map = patItemCount(serviceSubtaskVO);
        Map<String, Object> map = serviceSubtaskService.patItemCount(serviceSubtaskVO);
        Map<String, Object> map = serviceSubtaskService.patItemCount(serviceSubtaskEntity);
        map.put("serviceSubtaskList", serviceSubtaskList);
        List<Map<String, Object>> list = new ArrayList<>();
@@ -246,7 +258,7 @@
            public void doSelect() {
                serviceSubtaskVO.setPageNum(null);
                serviceSubtaskVO.setPageSize(null);
                serviceSubtaskService.patItem2(serviceSubtaskVO);
                serviceSubtaskService.patItem2(serviceSubtaskEntity);
            }
        });
        return getDataTable2(total, list);
@@ -259,7 +271,7 @@
    @Log(title = "单一任务(随访宣教)", businessType = BusinessType.EXPORT)
    @PostMapping("/export")
    public void export(HttpServletResponse response, ServiceSubtask serviceSubtask) {
        ServiceSubtaskVO serviceSubtaskVO = DtoConversionUtils.sourceToTarget(serviceSubtask, ServiceSubtaskVO.class);
        ServiceSubtaskEntity serviceSubtaskVO = DtoConversionUtils.sourceToTarget(serviceSubtask, ServiceSubtaskEntity.class);
        List<ServiceSubtask> list = serviceSubtaskService.selectServiceSubtaskList(serviceSubtaskVO);
        ExcelUtil<ServiceSubtask> util = new ExcelUtil<ServiceSubtask>(ServiceSubtask.class);
        util.exportExcel(response, list, "单一任务(随访)数据");
@@ -272,9 +284,11 @@
    @AddOrgId(field = "orgid", paramIndex = 0, campusField = "campusid")
    @PostMapping("/querySubtaskList")
    public AjaxResult querySubtaskList(@RequestBody ServiceSubtaskVO serviceSubtaskVO) {
        PageUtils.startPageByPost(serviceSubtaskVO.getPageNum(), serviceSubtaskVO.getPageSize());
        serviceSubtaskService.selectServiceSubtaskList(serviceSubtaskVO);
        return success(serviceSubtaskService.selectServiceSubtaskList(serviceSubtaskVO));
        ServiceSubtaskEntity serviceSubtaskEntity = DtoConversionUtils.sourceToTarget(serviceSubtaskVO, ServiceSubtaskEntity.class);
        serviceSubtaskEntity.setContinueContent(ObjectUtils.isNotEmpty(serviceSubtaskVO.getContinueContent()) ? serviceSubtaskVO.getContinueContent().toString() : null);
        PageUtils.startPageByPost(serviceSubtaskEntity.getPageNum(), serviceSubtaskEntity.getPageSize());
        serviceSubtaskService.selectServiceSubtaskList(serviceSubtaskEntity);
        return success(serviceSubtaskService.selectServiceSubtaskList(serviceSubtaskEntity));
    }
@@ -285,9 +299,11 @@
    @Log(title = "再次随访数据查询", businessType = BusinessType.EXPORT)
    @PostMapping("/querySubtaskListAgain")
    public TableDataInfo querySubtaskListAgain(@RequestBody ServiceSubtaskVO serviceSubtaskVO) {
        PageUtils.startPageByPost(serviceSubtaskVO.getPageNum(), serviceSubtaskVO.getPageSize());
        serviceSubtaskService.selectServiceSubtaskListAgain(serviceSubtaskVO);
        return getDataTable(serviceSubtaskService.selectServiceSubtaskListAgain(serviceSubtaskVO));
        ServiceSubtaskEntity serviceSubtaskEntity = DtoConversionUtils.sourceToTarget(serviceSubtaskVO, ServiceSubtaskEntity.class);
        serviceSubtaskEntity.setContinueContent(ObjectUtils.isNotEmpty(serviceSubtaskVO.getContinueContent()) ? serviceSubtaskVO.getContinueContent().toString() : null);
        PageUtils.startPageByPost(serviceSubtaskEntity.getPageNum(), serviceSubtaskEntity.getPageSize());
        serviceSubtaskService.selectServiceSubtaskListAgain(serviceSubtaskEntity);
        return getDataTable(serviceSubtaskService.selectServiceSubtaskListAgain(serviceSubtaskEntity));
    }
@@ -400,9 +416,10 @@
    @ApiOperation("根据条件查询任务信息")
    @AddOrgId(field = "orgid", paramIndex = 0, campusField = "campusid")
    @PostMapping("/queryTaskByCondition")
    public AjaxResult queryTaskByCondition(@RequestBody ServiceSubtaskVO ivrTaskcallVO) {
    public AjaxResult queryTaskByCondition(@RequestBody ServiceSubtaskVO serviceSubtaskVO) {
        //根据入参查询信息
        ServiceSubtask serviceSubtask = DtoConversionUtils.sourceToTarget(ivrTaskcallVO, ServiceSubtask.class);
        ServiceSubtask serviceSubtask = DtoConversionUtils.sourceToTarget(serviceSubtaskVO, ServiceSubtask.class);
        serviceSubtask.setContinueContent(ObjectUtils.isNotEmpty(serviceSubtaskVO.getContinueContent()) ? serviceSubtaskVO.getContinueContent().toString() : null);
        ServiceTaskVO ivrTaskVO = serviceSubtaskService.queryTaskByCondition(serviceSubtask);
        return success(ivrTaskVO);
    }
ruoyi-admin/src/main/java/com/ruoyi/web/controller/smartor/ServiceTaskController.java
@@ -14,6 +14,7 @@
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.common.utils.poi.ExcelUtil;
import com.smartor.domain.*;
import com.smartor.domain.entity.ServiceSubtaskEntity;
import com.smartor.service.IServiceSubtaskService;
import com.smartor.service.IServiceTaskService;
import io.swagger.annotations.Api;
@@ -73,13 +74,13 @@
        List<Long> taskIds = list.stream().map(ServiceTask::getTaskid).collect(Collectors.toList());
        ServiceSubtaskVO serviceSubtaskVO = new ServiceSubtaskVO();
        serviceSubtaskVO.setTaskIds(taskIds);
        serviceSubtaskVO.setStartOutHospTime(serviceTask.getStartOutHospTime());
        serviceSubtaskVO.setEndOutHospTime(serviceTask.getEndOutHospTime());
        ServiceSubtaskEntity serviceSubtaskEntity = new ServiceSubtaskEntity();
        serviceSubtaskEntity.setTaskIds(taskIds);
        serviceSubtaskEntity.setStartOutHospTime(serviceTask.getStartOutHospTime());
        serviceSubtaskEntity.setEndOutHospTime(serviceTask.getEndOutHospTime());
        // æ‰¹é‡æŸ¥è¯¢æ‰€æœ‰å­ä»»åŠ¡
        Map<String, List<ServiceSubtask>> subtaskMap = iServiceSubtaskService
                .selectServiceSubtaskList(serviceSubtaskVO)
                .selectServiceSubtaskList(serviceSubtaskEntity)
                .stream()
                .filter(subtask -> subtask.getTaskid() != null)  // æ·»åŠ è¿‡æ»¤
                .collect(Collectors.groupingBy(subtask -> Optional.of(subtask.getTaskid().toString()).orElse("Unknown")));
ruoyi-admin/src/main/java/com/ruoyi/web/controller/smartor/SvyTaskController.java
@@ -13,6 +13,7 @@
import com.ruoyi.common.utils.RSAPublicKeyExample;
import com.ruoyi.common.utils.poi.ExcelUtil;
import com.smartor.domain.*;
import com.smartor.domain.entity.ServiceSubtaskEntity;
import com.smartor.service.IServiceSubtaskService;
import com.smartor.service.ISvyTaskService;
import com.smartor.service.ISvyTaskSingleService;
@@ -69,7 +70,7 @@
        List<SvyTaskVO> svyTaskVOS = DtoConversionUtils.sourceToTarget(list, SvyTaskVO.class);
        if (CollectionUtils.isNotEmpty(svyTaskVOS)) {
            for (SvyTaskVO svyTaskVO : svyTaskVOS) {
                ServiceSubtaskVO serviceSubtaskVO = new ServiceSubtaskVO();
                ServiceSubtaskEntity serviceSubtaskVO = new ServiceSubtaskEntity();
                serviceSubtaskVO.setTaskid(svyTaskVO.getTaskid());
                List<ServiceSubtask> svyTaskSingles = serviceSubtaskService.selectServiceSubtaskList(serviceSubtaskVO);
                if (CollectionUtils.isNotEmpty(svyTaskSingles)) {
ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysLoginController.java
@@ -7,7 +7,6 @@
import com.ruoyi.common.core.domain.entity.SysUserDept;
import com.ruoyi.common.core.domain.model.LoginBody;
import com.ruoyi.common.exception.base.BaseException;
import com.ruoyi.common.utils.RSAPublicKeyExample;
import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.framework.web.service.SysLoginService;
@@ -17,17 +16,14 @@
import com.ruoyi.system.service.ISysMenuService;
import com.smartor.mapper.SysUserDeptMapper;
import com.smartor.service.IServiceSLTDHealthcareRecordService;
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;
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.servlet.view.RedirectView;
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;
@@ -57,21 +53,6 @@
    @Autowired
    private IServiceSLTDHealthcareRecordService iServiceSLTDHealthcareRecordService;
    @Value("${pri_key}")
    private String pri_key;
    @Value("${isEncryp}")
    private Integer isEncryp;
    @Value("${sltd_pub_path}")
    private String sltdPubPath;
    @Value("${spring.profiles.active}")
    private String active;
    @Autowired
    private SysUserDeptMapper sysUserDeptMapper;
@@ -94,7 +75,7 @@
    /**
     * ç™»å½•方法
     *
     * @param loginBody ç™»å½•信息
     * @param map ç™»å½•信息
     * @return ç»“æžœ
     */
    @PostMapping("/test")
@@ -116,53 +97,37 @@
     */
//    @IpWhitelist
    @GetMapping("/SSOLogin")
    public RedirectView SSOLogin(@RequestParam(required = false) String userName, @RequestParam(required = false) String orgid, @RequestParam(required = false) String campusid, @RequestParam(required = false) String deptId, @RequestParam(required = false) String token) {
    public RedirectView SSOLogin(@RequestParam(required = false) String userName,
                                 @RequestParam(required = false) String orgid,
                                 @RequestParam(required = false) String campusid,
                                 @RequestParam(required = false) String deptId,
                                 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 != null && isEncryp == 1) {
            RSAPublicKeyExample rsaPublicKeyExample = new RSAPublicKeyExample();
            userName = rsaPublicKeyExample.decryptedData(userName, pri_key);
        }
        if (StringUtils.isEmpty(deptId)) deptId = "null";
        String token2 = loginService.loginByUserName(userName + "&" + orgid + "&" + deptId + "&" + campusid);
        if (StringUtils.isEmpty(token2)) {
            throw new BaseException("登陆失败");
        }
        String path = sysConfigService.selectConfigByKey("sys.qddz");
        if (StringUtils.isEmpty(path)) {
            throw new BaseException("请配置前端地址");
        }
        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");
        String loginToken = loginService.ssoLogin(userName, orgid, deptId, campusid, token);
        if (StringUtils.isEmpty(loginToken)) {
            log.error("【SSO登录】登录失败,userName={}, orgid={}", userName, orgid);
            return buildRedirect(path + "/login");
        }
        String redirectUrl = path + "/loginSSO?token=" + loginToken + "&orgid=" + orgid + "&orgname=null&ZuHuID=null&deptCode=null";
        log.info("【SSO登录】重定向地址:{}", redirectUrl);
        return buildRedirect(redirectUrl);
    }
    /**
     * æž„建重定向视图
     */
    private RedirectView buildRedirect(String url) {
        RedirectView redirectView = new RedirectView();
        redirectView.setUrl(url);
        redirectView.setStatusCode(HttpStatus.MOVED_PERMANENTLY);
        return redirectView;
    }
@@ -227,13 +192,5 @@
    @GetMapping("/getDept/{orgid}")
    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-framework/src/main/java/com/ruoyi/framework/web/service/SysLoginService.java
@@ -2,9 +2,14 @@
import javax.annotation.Resource;
import com.alibaba.fastjson2.JSONObject;
import com.ruoyi.common.utils.HttpUtil;
import com.ruoyi.common.utils.RSAPublicKeyExample;
import com.smartor.service.impl.ServiceSLTDHealthcareRecordServiceImpl;
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.authentication.AuthenticationManager;
import org.springframework.security.authentication.BadCredentialsException;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
@@ -30,6 +35,9 @@
import com.ruoyi.system.service.ISysConfigService;
import com.ruoyi.system.service.ISysUserService;
import java.util.HashMap;
import java.util.Map;
/**
 * ç™»å½•校验方法
 *
@@ -52,6 +60,21 @@
    @Autowired
    private ISysConfigService configService;
    @Autowired
    private RSAPublicKeyExample rsaPublicKeyExample;
    @Value("${pri_key}")
    private String priKey;
    @Value("${isEncryp}")
    private Integer isEncryp;
    @Value("${sltd_pub_path}")
    private String sltdPubPath;
    @Value("${spring.profiles.active}")
    private String active;
    /**
     * ç™»å½•验证
@@ -95,6 +118,75 @@
    }
    /**
     * SSO å•点登录业务处理
     * <p>
     * 1. å¦‚果是 sltd çŽ¯å¢ƒï¼Œå…ˆé€šè¿‡ SSO token æ¢å–员工账号
     * 2. RSA è§£å¯† userName(若开启加密)
     * 3. æ ¹æ® userName + orgid + deptId + campusid ç”Ÿæˆç™»å½• token
     *
     * @param userName ç”¨æˆ·åï¼ˆå¯èƒ½ä¸ºç©ºï¼Œå¦‚æžœ sltd æ¨¡å¼åˆ™ä»Ž token ä¸­èŽ·å–ï¼‰
     * @param orgid    ç»„织机构ID
     * @param deptId   éƒ¨é—¨ID
     * @param campusid æ ¡åŒº ID
     * @param token    SLTD SSO token(仅 sltd çŽ¯å¢ƒä¸‹ä½¿ç”¨ï¼‰
     * @return ç™»å½•成功后的 JWT token,失败返回 null
     */
    public String ssoLogin(String userName, String orgid, String deptId, String campusid, String token) {
        // sltd çŽ¯å¢ƒï¼šé€šè¿‡ SSO token èŽ·å–å‘˜å·¥è´¦å·
        if ("sltd".equals(active)) {
            userName = resolveUserNameBySltdToken(token);
            if (userName == null) {
                return null;
            }
        }
        log.info("【SSO登录】userName={}", userName);
        if (StringUtils.isEmpty(userName) || StringUtils.isEmpty(orgid)) {
            log.error("【SSO登录】用户名或组织机构不能为空");
            return null;
        }
        // RSA è§£å¯†ç”¨æˆ·å
        if (isEncryp != null && isEncryp == 1) {
            userName = rsaPublicKeyExample.decryptedData(userName, priKey);
        }
        if (StringUtils.isEmpty(deptId)) deptId = "null";
        if (StringUtils.isEmpty(campusid)) campusid = "null";
        return loginByUserName(userName + "&" + orgid + "&" + deptId + "&" + campusid);
    }
    /**
     * è°ƒç”¨çœç«‹åŒå¾·æŽ¥å£ï¼Œé€šè¿‡ SSO token èŽ·å–å‘˜å·¥è´¦å·
     *
     * @param token SLTD SSO token
     * @return å‘˜å·¥è´¦å·ï¼ŒéªŒè¯å¤±è´¥è¿”回 null
     */
    private String resolveUserNameBySltdToken(String token) {
        Map<String, String> headers = new HashMap<>();
        headers.put("app-key", ServiceSLTDHealthcareRecordServiceImpl.APP_KEY);
        Map<String, String> requestParams = new HashMap<>();
        requestParams.put("token", token);
        String reqData = HttpUtil.postFormRequest(sltdPubPath + "/checkSsoTokenId", requestParams, headers, null);
        log.info("【SLTD token éªŒè¯ã€‘响应结果:{}", reqData);
        if (StringUtils.isEmpty(reqData)) {
            log.error("【SLTD token éªŒè¯ã€‘响应为空,验证失败");
            return null;
        }
        Map<String, Object> map = JSONObject.parseObject(reqData, Map.class);
        if (ObjectUtils.isEmpty(map) || (Integer) map.get("code") != 200) {
            log.error("【SLTD token éªŒè¯ã€‘响应码异常,验证失败");
            return null;
        }
        Map<String, Object> data = (Map<String, Object>) map.get("data");
        return (String) data.get("accountNo");
    }
    public String loginByUserName(String userName) {
        SysUser sysUser = userService.selectUserByUserNameAndDeptId(userName);
        log.info("---------sysUser的值为:{}", sysUser);
ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/UserDetailsServiceImpl.java
@@ -48,10 +48,8 @@
        } else if (StringUtils.isEmpty(user.getOrgid()) || StringUtils.isEmpty(split[1]) || !user.getOrgid().trim().equals(split[1].trim())) {
            log.info("登录用户:{} ä¸æ˜¯æœ¬åŒ»é™¢å¸å·ï¼š{}", username, split[1]);
            throw new ServiceException("对不起,您的账号:" + split[0] + " ä¸æ˜¯æœ¬åŒ»é™¢çš„");
        } else if (StringUtils.isEmpty(user.getCampusid()) || StringUtils.isEmpty(split[2]) || !user.getCampusid().trim().equals(split[2].trim())) {
            log.info("登录用户:{} ä¸æ˜¯æœ¬é™¢åŒºå¸å·ï¼š{}", username, split[1]);
            throw new ServiceException("对不起,您的账号:" + split[0] + " ä¸æ˜¯æœ¬é™¢åŒºå¸å·");
        }
//-0/-85#4-
        passwordService.validate(user);
ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/RyTask.java
@@ -20,6 +20,7 @@
import com.ruoyi.system.service.ISysConfigService;
import com.smartor.common.LSHospTokenUtil;
import com.smartor.domain.*;
import com.smartor.domain.entity.ServiceSubtaskEntity;
import com.smartor.mapper.*;
import com.smartor.service.*;
import lombok.extern.slf4j.Slf4j;
@@ -305,11 +306,9 @@
                    }
                    log.info("【dealHisData】省立同德“用户信息”结束采集数据:{}", aBoolean);
                }
                // çœç«‹åŒå¾·æ•°æ®é‡‡é›†
                for (Long cid : campusidList) {
                    log.debug("【dealHisData】省立同德“预入院”开始采集数据,院区:{}", cid);
                    String yesterday = LocalDate.now().minusDays(1).format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));
                    String nowTime = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));
                    ServiceSLTDInhospReqVO serviceSLTDInhospReqVO = new ServiceSLTDInhospReqVO();
                    serviceSLTDInhospReqVO.setOrgId("20001001");
@@ -340,19 +339,19 @@
                    serviceSLTDHealthcareRecordService.queryHealthcareRecordList(serviceSLTDInhospReqVO);
                    log.debug("【dealHisData】省立同德“入院”結束采集数据,院区:{}", cid);
                    log.debug("【dealHisData】省立同德“门急诊”开始采集数据,院区:{}", cid);
                    serviceSLTDInhospReqVO.setStartHeadTime(null);
                    serviceSLTDInhospReqVO.setStartTailTime(null);
                    serviceSLTDInhospReqVO.setEncounterTimeStart(nowTime);
                    serviceSLTDInhospReqVO.setEncounterTimeEnd(nowTime);
                    serviceSLTDInhospReqVO.setStatusList(null);
                    List<String> list1 = new ArrayList<>();
                    list1.add("FH0108.01");
                    list1.add("FH0108.03");
                    serviceSLTDInhospReqVO.setHealthcareRecordTypeList(list1);
                    log.debug("【dealHisData】省立同德“门急诊”采集数据入参:{}", serviceSLTDInhospReqVO);
                    serviceSLTDHealthcareRecordService.queryHealthcareRecordList(serviceSLTDInhospReqVO);
                    log.debug("【dealHisData】省立同德“门急诊”束采集数据,院区:{}", cid);
//                    log.debug("【dealHisData】省立同德“门急诊”开始采集数据,院区:{}", cid);
//                    serviceSLTDInhospReqVO.setStartHeadTime(null);
//                    serviceSLTDInhospReqVO.setStartTailTime(null);
//                    serviceSLTDInhospReqVO.setEncounterTimeStart(nowTime);
//                    serviceSLTDInhospReqVO.setEncounterTimeEnd(nowTime);
//                    serviceSLTDInhospReqVO.setStatusList(null);
//                    List<String> list1 = new ArrayList<>();
//                    list1.add("FH0108.01");
//                    list1.add("FH0108.03");
//                    serviceSLTDInhospReqVO.setHealthcareRecordTypeList(list1);
//                    log.debug("【dealHisData】省立同德“门急诊”采集数据入参:{}", serviceSLTDInhospReqVO);
//                    serviceSLTDHealthcareRecordService.queryHealthcareRecordList(serviceSLTDInhospReqVO);
//                    log.debug("【dealHisData】省立同德“门急诊”束采集数据,院区:{}", cid);
                    log.debug("【dealHisData】省立同德“出院”开始采集数据,院区:{}", cid);
                    serviceSLTDInhospReqVO.setStartHeadTime(null);
@@ -370,10 +369,45 @@
                    serviceSLTDHealthcareRecordService.queryHealthcareRecordList(serviceSLTDInhospReqVO);
                    log.debug("【dealHisData】省立同德“出院”束采集数据,院区:{}", cid);
                }
            } catch (Exception e) {
                log.error("【dealHisData】省立同德数据采集异常", e);
            }
        }
    }
    public void dealHisDataSLTD() {
        log.info("【dealHisData】开始执行HIS数据采集任务");
        try {
            LocalDate startDate = LocalDate.of(2025, 11, 1);
            LocalDate endDate = LocalDate.of(2026, 2, 27);
            // çœç«‹åŒå¾·æ•°æ®é‡‡é›†
//            String nowTime = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));
            for (LocalDate date = startDate; !date.isAfter(endDate); date = date.plusDays(1)) {
                String nowTime = date.format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));
                ServiceSLTDInhospReqVO serviceSLTDInhospReqVO = new ServiceSLTDInhospReqVO();
                serviceSLTDInhospReqVO.setOrgId("20001001");
                serviceSLTDInhospReqVO.setCampusId(30001002L);
                log.debug("【dealHisData】省立同德“门急诊”开始采集数据,院区:{}", "30001002");
                serviceSLTDInhospReqVO.setStartHeadTime(null);
                serviceSLTDInhospReqVO.setStartTailTime(null);
                serviceSLTDInhospReqVO.setEncounterTimeStart(nowTime);
                serviceSLTDInhospReqVO.setEncounterTimeEnd(nowTime);
                serviceSLTDInhospReqVO.setStatusList(null);
                List<String> list1 = new ArrayList<>();
                list1.add("FH0108.01");
                list1.add("FH0108.03");
                serviceSLTDInhospReqVO.setHealthcareRecordTypeList(list1);
                log.debug("【dealHisData】省立同德“门急诊”采集数据入参:{}", serviceSLTDInhospReqVO);
                serviceSLTDHealthcareRecordService.queryHealthcareRecordList(serviceSLTDInhospReqVO);
                log.debug("【dealHisData】省立同德“门急诊”束采集数据,院区:{}", "30001002");
            }
        } catch (Exception e) {
            log.error("【dealHisData】省立同德数据采集异常", e);
        }
    }
    /**
@@ -465,7 +499,7 @@
            commonTaskcallMQ.setSendType("2");
            //通过任务ID拿到患者信息,并且随访时间得是今天之前的
            ServiceSubtaskVO serviceSubtaskVO = new ServiceSubtaskVO();
            ServiceSubtaskEntity serviceSubtaskVO = new ServiceSubtaskEntity();
            serviceSubtaskVO.setTaskid(commonTaskcallMQ.getTaskid());
            serviceSubtaskVO.setSendstate(2L);
            serviceSubtaskVO.setVisitTime(new Date());
@@ -482,7 +516,7 @@
     */
    public void compensateTask() {
        //获取到sendstate=3 å¹¶ä¸” visit_time为小于等于今天的subtask
        ServiceSubtaskVO serviceSubtaskVO = new ServiceSubtaskVO();
        ServiceSubtaskEntity serviceSubtaskVO = new ServiceSubtaskEntity();
        serviceSubtaskVO.setSendstate(3L);
        serviceSubtaskVO.setVisitTime(new Date());
        List<ServiceSubtask> serviceSubtaskList = serviceSubtaskMapper.getCompensateServiceSubtaskList(serviceSubtaskVO);
@@ -840,12 +874,12 @@
                    serviceSubtaskRecord.setStartTime(System.currentTimeMillis());
                    serviceSubtaskRecord.setResult("success");
                    Boolean wxCodeSuccess = false;
                    if(active.equals("hzszlyy")){
                        if(!map.isEmpty() && map.get("success") != null){
                    if (active.equals("hzszlyy")) {
                        if (!map.isEmpty() && map.get("success") != null) {
                            wxCodeSuccess = (boolean) map.get("success");
                        }
                    }else {
                        if(!map.isEmpty() && map.get("succ") != null){
                    } else {
                        if (!map.isEmpty() && map.get("succ") != null) {
                            wxCodeSuccess = (boolean) map.get("succ");
                        }
                    }
@@ -960,10 +994,8 @@
                //获取当前发送方式
                ServiceSubtaskPreachform currentServiceSubtaskPreachform = serviceSubtaskPreachforms.stream().filter(item -> item.getSort().equals(currentSort.get())).findFirst().orElse(new ServiceSubtaskPreachform());
                //当前发送方式为微信的,且下一发送方式为短信的,微信发送状态为已发送、已领取的,跳过短信步骤
                if (currentServiceSubtaskPreachform.getPreachform().equals("5")
                        && (currentServiceSubtaskPreachform.getSendstate().equals("2")
                        || currentServiceSubtaskPreachform.getSendstate().equals("3"))) {
                    if(StringUtils.isNotEmpty(nextPreachform) && nextPreachform.equals("2")){
                if (currentServiceSubtaskPreachform.getPreachform().equals("5") && (currentServiceSubtaskPreachform.getSendstate().equals("2") || currentServiceSubtaskPreachform.getSendstate().equals("3"))) {
                    if (StringUtils.isNotEmpty(nextPreachform) && nextPreachform.equals("2")) {
                        log.error("【sfHandlle】微信已发送,短信不发送,跳转人工");
                        setSuccessPreachForm(serviceSubtask, "-1", "微信已发送,短信不发送,跳转人工", "6");
                        //跳过短信,执行下一步
smartor/pom.xml
@@ -135,6 +135,10 @@
            <artifactId>jsch</artifactId>
            <version>0.1.54</version>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>
    </dependencies>
smartor/src/main/java/com/smartor/common/DistinctByProperty.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,24 @@
package com.smartor.common;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.function.Function;
import java.util.stream.Collectors;
/**
 * åŽ»é‡å·¥å…·ç±»
 */
public class DistinctByProperty {
    // åˆ›å»ºåŽ»é‡å·¥å…·æ–¹æ³•ï¼Œæ ¹æ®é›†åˆä¸­ä¸Šå±žæ€§
    public static <T> List<T> distinctByProperty(
            List<T> list,
            Function<? super T, ?> keyExtractor) {
        Set<Object> seen = new HashSet<>();
        return list.stream()
                .filter(item -> seen.add(keyExtractor.apply(item)))
                .collect(Collectors.toList());
    }
}
smartor/src/main/java/com/smartor/domain/PatTaskRelevance.java
@@ -1,5 +1,6 @@
package com.smartor.domain;
import com.alibaba.fastjson.JSONObject;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.ruoyi.common.annotation.Excel;
import com.ruoyi.common.core.domain.BaseEntity;
@@ -319,4 +320,20 @@
    @Excel(name = " é•¿æœŸä»»åŠ¡ï¼Œç»™æ‚£è€…å‘é€çš„æ—¶é—´")
    @ApiModelProperty(value = "长期任务,给患者发送的时间")
    private Date longSendTime;
    @ApiModelProperty(value = "继续标识")
    private Integer continueFlag;
    @ApiModelProperty(value = "继续时间现在")
    private Date continueTimeNow;
    @ApiModelProperty(value = "继续内容")
    private JSONObject continueContent;
    @ApiModelProperty(value = "继续次数")
    private Integer continueCount;
    @ApiModelProperty(value = "继续时间下次")
    private Date continueTimeNext;
}
smartor/src/main/java/com/smartor/domain/ServiceSubtask.java
@@ -652,4 +652,19 @@
    @ApiModelProperty(value = "异常预警:0绿色;1红色;2黄色; 3已处理")
    private Integer isabnormal;
    @ApiModelProperty(value = "继续标识")
    private Integer continueFlag;
    @ApiModelProperty(value = "继续时间现在")
    private Date continueTimeNow;
    @ApiModelProperty(value = "继续内容")
    private String continueContent;
    @ApiModelProperty(value = "继续次数")
    private Integer continueCount;
    @ApiModelProperty(value = "继续时间下次")
    private Date continueTimeNext;
}
smartor/src/main/java/com/smartor/domain/ServiceSubtaskRes.java
copy from smartor/src/main/java/com/smartor/domain/ServiceSubtaskVO.java copy to smartor/src/main/java/com/smartor/domain/ServiceSubtaskRes.java
Îļþ´Ó smartor/src/main/java/com/smartor/domain/ServiceSubtaskVO.java ¸´ÖÆ
@@ -1,33 +1,38 @@
package com.smartor.domain;
import com.alibaba.fastjson.JSONObject;
import com.fasterxml.jackson.annotation.JsonFormat;
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;
import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
import java.util.Map;
/**
 * å•一任务(随访)对象 ivr_taskcall
 * å•一任务(随访)对象 ivr_tasksingle
 *
 * @author ruoyi
 * @date 2024-02-02
 */
@ApiModel(value = "ServiceSubtaskVO", description = "单一随访任务入参")
@ApiModel(value = "ServiceSubtask", description = "单一随访任务")
@Data
public class ServiceSubtaskVO extends BaseEntity {
public class ServiceSubtaskRes extends PatArchive {
    private static final long serialVersionUID = 1L;
    /**
     *
     * ä¸»é”®
     */
    @ApiModelProperty(value = "主键id")
    private Long subId;
    @ApiModelProperty(value = "主键")
    private Long id;
    /**
     * ä»»åŠ¡ID
     */
    @ApiModelProperty(value = "任务ID")
    private Long taskid;
    /**
     * ç¬¬ä¸‰æ–¹ä»»åŠ¡ID
@@ -36,50 +41,63 @@
    private String taskGuid;
    /**
     * éšè®¿æ¬¡æ•°
     * å‡ºé™¢ç—…人记录ID
     */
    @ApiModelProperty(value = "随访次数")
    private Integer visitCount;
    @ApiModelProperty(value = "出院病人记录ID")
    private Long inhospid;
    /**
     * å¤è¯Šé€šçŸ¥ï¼š0已通知    1未通知
     * çˆ¶ID
     */
    @ApiModelProperty(value = "复诊通知:0已通知    1未通知")
    private Integer visitNotice;
    @Excel(name = "父ID")
    @ApiModelProperty(value = "父ID")
    private Long pid;
    /**
     * æ˜¯å¦åœ¨æ¬¡éšè®¿ï¼š1否    2是
     * å¤‡æ³¨
     */
    @ApiModelProperty(value = "是否在次随访:1是    2否")
    private Integer isVisitAgain;
    @ApiModelProperty(value = "备注")
    private String remark;
    /**
     * æ‚£è€…ID
     * å¤‡æ³¨
     */
    @Excel(name = "  æ‚£è€…ID")
    @ApiModelProperty(value = "患者ID")
    private String patguid;
    @ApiModelProperty(value = "")
    private String guid;
    /**
     * å¼‚常标识
     */
    @ApiModelProperty(value = "异常标识:0绿色;1红色;2黄色")
    @Excel(name = " å¼‚常标识:0绿色;1红色;2黄色 ")
    private String excep;
    /**
     * å‡ºé™¢æ—¶é—´
     */
    @ApiModelProperty(value = "出院时间")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private Date endtime;
    /**
     * å…¥é™¢æ—¶é—´
     */
    @ApiModelProperty(value = "入院时间")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private Date starttime;
    /**
     * æ˜¯å¦æäº¤
     */
    @ApiModelProperty(value = "是否提交:0未提交   1已提交")
    private Long submit;
    /**
     * å‘送人
     */
    @Excel(name = " å‘送人 ")
    @ApiModelProperty(value = "发送人")
    @Excel(name = " å‘送人(患者) ")
    @ApiModelProperty(value = "发送人(患者)")
    private String sendname;
    /**
     * å‘送UUID
     */
    @Excel(name = " å‘送UUID ")
    @ApiModelProperty(value = "发送UUID")
    private String senduuid;
    /**
     * å‘处理意见:1暂不处理、2通知就诊、3病情稳定、4人工随访、5失访送UUID
     */
    @Excel(name = " å¤„理意见:1暂不处理、2通知就诊、3病情稳定、4人工随访、5失访 ")
    @ApiModelProperty(value = "处理意见:1暂不处理、2通知就诊、3病情稳定、4人工随访、5失访")
    private String suggest;
    /**
     * æ‰‹æœºå·
@@ -89,18 +107,18 @@
    private String phone;
    /**
     * æœåŠ¡ç±»åž‹(1、监测评估;2、出院随访;3、门诊随访;4、宣教关怀;5、复诊通知;6、满意度调查;7、患者报告; 8、其他通知)
     * æ‰‹æœºå·
     */
    @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专科随访)")
    private String serviceType;
    @Excel(name = " æ‰‹æœºå· ")
    @ApiModelProperty(value = "手机号")
    private String openid;
    /**
     * æ€§åˆ«
     */
    @Excel(name = "  æ€§åˆ«")
    @ApiModelProperty(value = "性别")
    private String sex;
    private Long sex;
    /**
     * å¹´é¾„
@@ -108,13 +126,6 @@
    @Excel(name = " å¹´é¾„ ")
    @ApiModelProperty(value = "年龄")
    private Long age;
    /**
     * å¹´é¾„
     */
    @Excel(name = " å‡ºé™¢ç—…人记录ID ")
    @ApiModelProperty(value = "出院病人记录ID")
    private Long inhospid;
    /**
     * èº«ä»½è¯å·
@@ -140,19 +151,16 @@
    /**
     * ä»»åŠ¡ç±»åž‹(门诊,住院,复诊…)
     */
    @Excel(name = "任务类型(门诊,住院,复诊…)")
    @ApiModelProperty(value = "任务类型(门诊,住院,复诊…)")
    @Excel(name = "任务类型:1,机器人语音(随访)  2,问卷;3,通知(宣教)")
    @ApiModelProperty(value = "任务类型:1,机器人语音(随访)  2,问卷;3,宣教; 4.通知)")
    private String type;
    /**
     * ä»»åŠ¡ID
     * æœåŠ¡ç±»åž‹(1、监测评估;2、出院随访;3、门诊随访;4、宣教关怀;5、复诊管理;6、满意度调查;7、患者报告; 8、其他通知 9体检随访 10.医技随访  11,影像专科随访  12、心电专科随访, 13专科随访)
     */
    @Excel(name = " ä»»åŠ¡ID ")
    @ApiModelProperty(value = "任务ID")
    private Long taskid;
    @ApiModelProperty(value = "任务Id集合")
    private List<Long> taskIds;
    @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;
    /**
     * æ¨¡æ¿ID
@@ -162,52 +170,18 @@
    private Long templateid;
    /**
     * æ¨¡æ¿ID
     */
    @Excel(name = "  æ¨¡ç‰ˆåº“模板ID")
    @ApiModelProperty(value = "模版库模板ID")
    private Long libtemplateid;
    /**
     * æ¨¡æ¿ID
     */
    @Excel(name = "  æ¨¡æ¿åº“模板名称")
    @ApiModelProperty(value = "模板库模板名称")
    private String libtemplatename;
    /**
     * æ¨¡æ¿å
     */
    @Excel(name = " æ¨¡æ¿å ")
    @ApiModelProperty(value = "模板名")
    @ApiModelProperty(value = "拉取时间")
    private String templatename;
    /**
     * å‘送类型: 1 æ—¶é—´æ®µ   2 æ—¶é—´ç‚¹   3 å³åˆ»å‘送
     * å‘处理意见:1暂不处理、2通知就诊、3病情稳定、4人工随访、5失访送UUID
     */
    @ApiModelProperty(value = "发送类型: 1 æ—¶é—´æ®µ   2 å³åˆ»å‘送")
    private String sendType;
    /**
     * å‡ºé™¢æ—¶é—´
     */
    @ApiModelProperty(value = "出院时间")
    private Date inhosptime;
    /**
     * åŒ»ç”Ÿç¼–码
     */
    @Excel(name = "  åŒ»ç”Ÿç¼–码")
    @ApiModelProperty(value = "医生编码")
    private String drcode;
    /**
     * åŒ»ç”Ÿå§“名
     */
    @Excel(name = "  åŒ»ç”Ÿå§“名")
    @ApiModelProperty(value = "医生姓名")
    private String drname;
    @Excel(name = " å¤„理意见:1暂不处理、2通知就诊、3病情稳定、4人工随访、5失访 ")
    @ApiModelProperty(value = "处理意见:1暂不处理、2通知就诊、3病情稳定、4人工随访、5失访")
    private String suggest;
    /**
     * å‘送日期
@@ -216,6 +190,14 @@
    @Excel(name = " å‘送日期 ", width = 30, dateFormat = "yyyy-MM-dd")
    @ApiModelProperty(value = "发送日期")
    private Date senddate;
    /**
     * æ–°çš„创建时间(用来做查询参数用)
     */
    @JsonFormat(pattern = "yyyy-MM-dd")
    @Excel(name = " å‘送日期 ", width = 30, dateFormat = "yyyy-MM-dd")
    @ApiModelProperty(value = "新的创建时间")
    private Date createTimeNew;
    /**
     * ä¸Šåˆå¼€å§‹å‘送时间限制
@@ -262,33 +244,37 @@
    /**
     * å‘送状态
     */
    @Excel(name = " å‘送状态 ")
//    @Excel(name = " å‘送状态 1 è¢«é¢†å–(在任务中是新建,在服务中是被领取)  2 å¾…发送  3 å·²å‘送  4 ä¸æ‰§è¡Œ  5 å‘送失败 6 å·²å®Œæˆ\") ")
    @ApiModelProperty(value = "发送状态 1 è¢«é¢†å–(在任务中是新建,在服务中是被领取)  2 å¾…发送  3 å·²å‘送  4 ä¸æ‰§è¡Œ  5 å‘送失败 6 å·²å®Œæˆ")
    private Long sendstate;
    /**
     * å‘送状态
     * æš‚停状 ï¼š çŠ¶æ€å¦‚æžœå‘ç”Ÿä¿®æ”¹ï¼Œå€¼å°±åŠ 1
     */
    @Excel(name = " å‘送状态集合 ")
    @ApiModelProperty(value = "发送状态 1 è¢«é¢†å–(在任务中是新建,在服务中是被领取)  2 å¾…发送  3 å·²å‘送  4 ä¸æ‰§è¡Œ  5 å‘送失败 6 å·²å®Œæˆ")
    private List<Long> sendstates;
//    @Excel(name = " æš‚停状 ï¼š çŠ¶æ€å¦‚æžœå‘ç”Ÿä¿®æ”¹ï¼Œå€¼å°±åŠ 1 ")
    @ApiModelProperty(value = "暂停状 ï¼š çŠ¶æ€å¦‚æžœå‘ç”Ÿä¿®æ”¹ï¼Œå€¼å°±åŠ 1")
    private Long stopState;
    /**
     * å‘送UUID
     */
//    @Excel(name = " å‘送UUID ")
    @ApiModelProperty(value = "发送UUID")
    private String senduuid;
    /**
     * ç»“æžœ
     */
    @Excel(name = " ç»“æžœ ")
//    @Excel(name = " ç»“æžœ ")
    @ApiModelProperty(value = "结果")
    private String result;
    /**
     * å®Œæˆæ—¶é—´
     */
    @JsonFormat(pattern = "yyyy-MM-dd")
    @Excel(name = " å®Œæˆæ—¶é—´ ", width = 30, dateFormat = "yyyy-MM-dd")
    @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
    @ApiModelProperty(value = "完成时间")
    private Date finishtime;
    /**
     * å°±è¯Šè®°å½•编号
@@ -296,7 +282,6 @@
    @Excel(name = " å°±è¯Šè®°å½•编号 ")
    @ApiModelProperty(value = "就诊记录编号")
    private Long recordid;
    /**
     * å½“前重拨次数
@@ -314,31 +299,25 @@
    private Date pulltime;
    /**
     *
     */
    @Excel(name = " bqsms ")
    @ApiModelProperty(value = "bqsms")
    private Long bqsms;
    /**
     * bhsms
     */
    @Excel(name = " bhsms ")
    @ApiModelProperty(value = "bhsms")
    private Long bhsms;
    /**
     * éƒ¨é—¨code
     */
    @Excel(name = "  éƒ¨é—¨code")
    @ApiModelProperty(value = "部门code")
    private String deptcode;
    /**
     * éƒ¨é—¨code
     * åŒ»ç”Ÿç¼–码
     */
    @Excel(name = "  éƒ¨é—¨code")
    @ApiModelProperty(value = "部门code集合")
    private List<String> leaveldeptcodes;
    @Excel(name = "  åŒ»ç”Ÿç¼–码")
    @ApiModelProperty(value = "医生编码")
    private String drcode;
    /**
     * åŒ»ç”Ÿå§“名
     */
    @Excel(name = "  åŒ»ç”Ÿå§“名")
    @ApiModelProperty(value = "医生姓名")
    private String drname;
    /**
     * æ ‡ç­¾çŠ¶æ€
@@ -361,34 +340,6 @@
    private Long isupload;
    /**
     * æ‚£è€…ID
     */
    @Excel(name = "患者ID")
    @ApiModelProperty(value = "患者ID")
    private String patientid;
    /**
     * æ‚£è€…姓名
     */
    @Excel(name = "患者姓名")
    @ApiModelProperty(value = "患者姓名")
    private String patientname;
    /**
     * é•¿æœŸä»»åŠ¡ï¼Œç»™æ‚£è€…å‘é€çš„æ—¶é—´
     */
    @Excel(name = " é•¿æœŸä»»åŠ¡ï¼Œç»™æ‚£è€…å‘é€çš„æ—¶é—´")
    @ApiModelProperty(value = "长期任务,给患者发送的时间")
    private Date longSendTime;
    /**
     * openid
     */
    @Excel(name = "openid")
    @ApiModelProperty(value = "openid")
    private String openid;
    /**
     * ä¸Šä¼ æ—¶é—´
     */
    @JsonFormat(pattern = "yyyy-MM-dd")
@@ -404,67 +355,53 @@
    private String orgid;
    /**
     * çˆ¶ID
     */
    @Excel(name = "父ID")
    @ApiModelProperty(value = "父ID")
    private Long pid;
    /**
     * GUID
     */
    @Excel(name = "GUID")
    @ApiModelProperty(value = "GUID")
    private String guid;
    /**
     * æ˜¯å¦å­˜åœ¨æ“ä½œï¼š1 æ–°å¢ž 2修改 3删除
     */
    @ApiModelProperty(value = "是否存在操作:1 æ–°å¢ž 2修改 3删除")
    private Integer isoperation;
    /**
     * æ–‡æœ¬å˜é‡å‚æ•°
     */
    @Excel(name = "文本变量参数")
    @ApiModelProperty(value = "文本变量参数")
    private Map<String, Map<String, String>> textParam;
    private String textParam;
    /**
     * å®£æ•™å½¢å¼ :文本、图片、语音、视频、混合
     * å®£æ•™å½¢å¼ : 1,短信、2,线下、3,语音、4,视频、5,纸质  6.链接  7.钉钉   8.微信
     */
    @Excel(name = " å®£æ•™å½¢å¼ :文本、图片、语音、视频、混合")
    @ApiModelProperty(value = "宣教形式 : 1,文本、2,图片、3,语音、4,视频、5,混合")
    @Excel(name = " ä»»åŠ¡å½¢å¼ 1,人工   2,纸质  3,电话  4,短信  5.微信公众号 6.微信小程序  7.支付宝  8.智能小程序  9.钉钉")
    @ApiModelProperty("宣教形式 : ä»»åŠ¡å½¢å¼ 1,人工   2,纸质  3,电话  4,短信  5.微信公众号 6.微信小程序  7.支付宝  8.智能小程序  9.钉钉")
    private String preachform;
    /**
     * å½“前发送方式
     */
    @Excel(name = " å½“前发送方式")
    @ApiModelProperty(value = "当前发送方式")
    @ApiModelProperty("当前发送方式")
    private String currentPreachform;
    /**
     * åºŠå·
     */
    @Excel(name = "床号")
    @ApiModelProperty(value = "床号")
    private Long bedNo;
    private String bedNo;
    /**
     * æ‚£è€…ID
     * pageNum
     */
    @Excel(name = "  æ‚£è€…ID")
    @ApiModelProperty(value = "患者ID")
    private Long patid;
    @Excel(name = "pageNum")
    @ApiModelProperty(value = "pageNum")
    private Integer pageNum;
    /**
     * å‘送时间段
     * pageSize
     */
    @ApiModelProperty(value = "发送时间段 ")
    private List<TaskSendTimeVO> sendTimeslot;
    @Excel(name = "pageSize")
    @ApiModelProperty(value = "pageSize")
    private Integer pageSize;
    /**
     * å‘送类型: 1 æ—¶é—´æ®µ   2 æ—¶é—´ç‚¹   3 å³åˆ»å‘送
     */
    @ApiModelProperty(value = "发送类型: 1 æ—¶é—´æ®µ   2 æ—¶é—´ç‚¹   3 å³åˆ»å‘送")
    private String sendType;
    /**
     * ä»»åŠ¡åç§°
@@ -495,7 +432,6 @@
    @ApiModelProperty(value = "随访人编号")
    private String operatorNo;
    /**
     * å°±è¯Šç¼–号(对应的outhospno、inhospno)
     */
@@ -506,9 +442,10 @@
    /**
     * å°±è¯Šç±»åž‹ï¼ˆ1门诊  2出院)
     */
    @Excel(name = "  å°±è¯Šç±»åž‹ï¼ˆ1门诊  2出院   3.专病)")
    @ApiModelProperty(value = "就诊类型(1门诊  2出院   3.专病)")
    @Excel(name = "  å°±è¯Šç±»åž‹ï¼ˆ1门诊  2出院)")
    @ApiModelProperty(value = "就诊类型(1门诊  2出院 3.专病 4.外部导入 5急诊、5住院、7体检)")
    private String hospType;
    /**
     * å¾®ä¿¡
@@ -517,13 +454,32 @@
    @ApiModelProperty(value = "微信")
    private String wechat;
    /**
     * å‡ºé™¢è¯Šæ–­ç¼–码
     */
    @Excel(name = "  å‡ºé™¢è¯Šæ–­ç¼–码")
    @ApiModelProperty(value = "出院诊断编码")
    private String leaveicd10code;
    /**
     * å‡ºé™¢è¯Šæ–­åç§°
     */
    @Excel(name = "  å‡ºé™¢è¯Šæ–­åç§°")
    @ApiModelProperty(value = "出院诊断名称")
    private String leavediagname;
    /**
     * è¯Šæ–­åç§°
     * æ‚£è€…ID
     */
    @Excel(name = "  è¯Šæ–­åç§°")
    @ApiModelProperty(value = "诊断名称")
    private String diagname;
    @Excel(name = "  æ‚£è€…ID")
    @ApiModelProperty(value = "患者ID")
    private Long patid;
    /**
     * æ‚£è€…ID
     */
    @Excel(name = "  æ‚£è€…ID")
    @ApiModelProperty(value = "患者ID")
    private String patguid;
    /**
     * ç§‘室名称
@@ -531,14 +487,15 @@
    @Excel(name = "科室名称")
    @ApiModelProperty(value = "科室名称")
    private String deptname;
//
//    /**
//     * å°±è¯Šæ—¥æœŸ
//     */
//    @Excel(name = " å°±è¯Šæ—¥æœŸ")
//    @ApiModelProperty(value = "就诊日期")
//    private Date admindate;
//
    /**
     * å°±è¯Šæ—¥æœŸ
     */
    @Excel(name = " å°±è¯Šæ—¥æœŸ")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @ApiModelProperty(value = "就诊日期")
    private Date admindate;
    /**
     * ç—…房号
     */
@@ -547,45 +504,33 @@
    private String roomno;
    /**
     * æ¨¡æ¿åº“模版ID
     */
    @Excel(name = "模板库模版ID")
    @ApiModelProperty(value = "模板库模版ID")
    private Long libtemplateid;
    /**
     * æ€»åˆ†
     */
    @Excel(name = "总分")
    @ApiModelProperty(value = "总分")
    private Long score;
    private BigDecimal score;
    /**
     * æ¨¡æ¿åº“模版名称
     */
    @Excel(name = "模板库模版名称")
    @ApiModelProperty(value = "模板库模版名称")
    private String libtemplatename;
    /**
     * æ˜¯å¦æäº¤
     * é•¿æœŸä»»åŠ¡ï¼Œç»™æ‚£è€…å‘é€çš„æ—¶é—´
     */
    @ApiModelProperty(value = "是否提交:0未提交   1已提交")
    private Long submit;
    /**
     * å‡ºé™¢ç—…区编号
     */
    @ApiModelProperty(value = "出院病区编号")
    private String leavehospitaldistrictcode;
    /**
     * å‡ºé™¢ç—…区编号
     */
    @ApiModelProperty(value = "出院病区集合")
    private List<String> leavehospitaldistrictcodes;
    /**
     * å‡ºé™¢ç—…区名称
     */
    @ApiModelProperty(value = "出院病区名称")
    @Excel(name = " å‡ºé™¢ç—…区名称 ")
    private String leavehospitaldistrictname;
    /**
     * è¯Šæ–­åç§°
     */
    @Excel(name = "  ç¦»é™¢è¯Šæ–­åç§°")
    @ApiModelProperty(value = "离院诊断名称")
    private String leavediagname;
    @Excel(name = " é•¿æœŸä»»åŠ¡ï¼Œç»™æ‚£è€…å‘é€çš„æ—¶é—´")
    @ApiModelProperty(value = "长期任务,给患者发送的时间")
    private Date longSendTime;
    /**
     * è´£ä»»æŠ¤å£«ç¼–码
@@ -602,47 +547,35 @@
    private String nurseName;
    /**
     * å¼‚常标识
     * å‡ºé™¢ç—…区编号
     */
    @ApiModelProperty(value = "异常标识")
    @Excel(name = " å¼‚常标识 ")
    private String excep;
    @ApiModelProperty(value = "出院病区编号")
    private String leavehospitaldistrictcode;
    /**
     * å¤‡æ³¨
     * å‡ºé™¢ç—…区名称
     */
    @ApiModelProperty(value = "备注")
    private String remark;
    @ApiModelProperty(value = "出院病区名称")
    @Excel(name = " å‡ºé™¢ç—…区名称 ")
    private String leavehospitaldistrictname;
    /**
     * å‡ºé™¢æ—¶é—´
     * å‡ºé™¢ç—…区编号
     */
    @ApiModelProperty(value = "出院时间")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private Date endtime;
    @ApiModelProperty(value = "出院病区编号集合")
    private List<String> leavehospitaldistrictcodes;
    /**
     * å…¥é™¢æ—¶é—´
     * å‡ºé™¢ç—…区编号
     */
    @ApiModelProperty(value = "入院时间")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private Date starttime;
    @ApiModelProperty(value = "出院部门编号集合")
    private List<String> leaveldeptcodes;
    @ApiModelProperty(value = "发送详情")
    private List<ServiceSubtaskRecord> serviceSubtaskRecordList;
    /**
     * pageNum
     */
    @Excel(name = "pageNum")
    @ApiModelProperty(value = "pageNum")
    private Integer pageNum;
    /**
     * pageSize
     */
    @Excel(name = "pageSize")
    @ApiModelProperty(value = "pageSize")
    private Integer pageSize;
    @ApiModelProperty(value = "url")
    private String url;
    /**
     * æ‚£è€…来源
@@ -651,65 +584,22 @@
    private String patfrom;
    /**
     * ç»ç®¡åŒ»ç”Ÿç¼–码
     * éšè®¿æ¬¡æ•°
     */
    @ApiModelProperty(value = "经管医生编码")
    private String managementDoctorCode;
    @ApiModelProperty(value = "随访次数")
    private Integer visitCount;
    /**
     * ç»ç®¡åŒ»ç”Ÿ
     * å¤è¯Šé€šçŸ¥ï¼š0已通知    1未通知
     */
    @ApiModelProperty(value = "经管医生")
    private String managementDoctor;
    @ApiModelProperty(value = "复诊通知:0已通知    1未通知")
    private Integer visitNotice;
    /**
     * å¼€å§‹å‡ºé™¢æ—¥æœŸ
     * æ˜¯å¦åœ¨æ¬¡éšè®¿ï¼š1否    2是
     */
    @ApiModelProperty(value = "开始出院日期")
    private Date startOutHospTime;
    /**
     * å¼€å§‹å‘送日期
     */
    @ApiModelProperty(value = "开始发送日期")
    private Date startSendDateTime;
    /**
     * ç»“束发送日期
     */
    @ApiModelProperty(value = "结束发送日期")
    private Date endSendDateTime;
    /**
     * ç»“束出院日期
     */
    @ApiModelProperty(value = "结束出院日期")
    private Date endOutHospTime;
    /**
     * ç§‘室与病区的查询是or还是and:   1:and(默认)     2:or
     */
    @ApiModelProperty(value = "科室与病区的查询是or还是and:   1:and(默认)     2:or  ")
    private String deptOrDistrict = "1";
    /**
     * åˆ›å»ºå¼€å§‹æ—¶é—´
     */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private Date createStartTime;
    /**
     * åˆ›å»ºç»“束时间
     */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private Date createEndTime;
    /**
     * æŽ’序()
     */
    @ApiModelProperty(value = "排序:0 å‡ºé™¢æ—¶é—´(正序)    1 å‡ºé™¢æ—¶é—´(倒序)   2 å‘送时间(正序)    3 å‘送时间(倒序) ")
    private Integer sort;
    @ApiModelProperty(value = "是否在次随访:1是    2否")
    private Integer isVisitAgain;
    /**
     * æ‚£è€…上次随访的subId
@@ -718,6 +608,7 @@
    private Integer upid;
    @ApiModelProperty(value = "随访时间")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private Date visitTime;
    /**
@@ -726,32 +617,54 @@
    @ApiModelProperty(value = "随访方式")
    private String visitType;
    @ApiModelProperty(value = "随访部门编码")
    private String visitDeptCode;
    @ApiModelProperty(value = "随访部门名称")
    private String visitDeptName;
    @ApiModelProperty(value = "异常预警:0绿色;1红色;2黄色;3已处理")
    private Integer isabnormal;
    @ApiModelProperty(value = "随访部门编码集合")
    private List<String> visitDeptCodes;
    /**
     * åˆ†ç»„key
     * pageNum
     */
    @ApiModelProperty(value = "分组key")
    private String groupKey;
    /**
     * åˆ†ç»„code集合
     */
    @ApiModelProperty(value = "分组code集合")
    private List<String> groupKeyList;
    @Excel(name = "pn")
    @ApiModelProperty(value = "pn")
    private Integer pn;
//    /**
//     * æ—¥æœŸé™åˆ¶ ç›®å‰ç”±å‰ç«¯æŽ§åˆ¶
//     */
//    @ApiModelProperty(value = "日期限制:0全部服务    1截止当前日期")
//    private String dateLimit;
    /**
     * pageSize
     */
    @Excel(name = "ps")
    @ApiModelProperty(value = "ps")
    private Integer ps;
    @ApiModelProperty(value = "经管医生编码")
    private String managementDoctorCode;
    @ApiModelProperty(value = "经管医生")
    private String managementDoctor;
    @ApiModelProperty(value = "随访情况:1正常语音,2患者拒接或拒访,3面访或者接诊,4微信随访,5随访电话不正确,6被过滤,7其它")
    private Integer taskSituation;
    @ApiModelProperty(value = "异常预警:0绿色;1红色;2黄色; 3已处理")
    private Integer isabnormal;
    @ApiModelProperty(value = "继续标识")
    private Integer continueFlag;
    @ApiModelProperty(value = "继续时间现在")
    private Date continueTimeNow;
    @ApiModelProperty(value = "继续内容")
    private JSONObject continueContent;
    @ApiModelProperty(value = "继续次数")
    private Integer continueCount;
    @ApiModelProperty(value = "继续时间下次")
    private Date continueTimeNext;
}
smartor/src/main/java/com/smartor/domain/VO/ServiceSubtaskVO.java
ÎļþÃû´Ó smartor/src/main/java/com/smartor/domain/ServiceSubtaskVO.java ÐÞ¸Ä
@@ -1,8 +1,10 @@
package com.smartor.domain;
package com.smartor.domain.VO;
import com.alibaba.fastjson.JSONObject;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.ruoyi.common.annotation.Excel;
import com.ruoyi.common.core.domain.BaseEntity;
import com.smartor.domain.TaskSendTimeVO;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@@ -17,7 +19,8 @@
 * @author ruoyi
 * @date 2024-02-02
 */
@ApiModel(value = "ServiceSubtaskVO", description = "单一随访任务入参")
@ApiModel(value = "ServiceSubtaskEntity", description = "单一随访任务入参")
@Data
public class ServiceSubtaskVO extends BaseEntity {
    private static final long serialVersionUID = 1L;
@@ -743,6 +746,22 @@
     */
    @ApiModelProperty(value = "分组key")
    private String groupKey;
    @ApiModelProperty(value = "继续标识")
    private Integer continueFlag;
    @ApiModelProperty(value = "继续时间现在")
    private Date continueTimeNow;
    @ApiModelProperty(value = "继续内容")
    private JSONObject continueContent;
    @ApiModelProperty(value = "继续次数")
    private Integer continueCount;
    @ApiModelProperty(value = "继续时间下次")
    private Date continueTimeNext;
    /**
     * åˆ†ç»„code集合
     */
smartor/src/main/java/com/smartor/domain/entity/ServiceSubtaskEntity.java
copy from smartor/src/main/java/com/smartor/domain/ServiceSubtaskVO.java copy to smartor/src/main/java/com/smartor/domain/entity/ServiceSubtaskEntity.java
Îļþ´Ó smartor/src/main/java/com/smartor/domain/ServiceSubtaskVO.java ¸´ÖÆ
@@ -1,8 +1,9 @@
package com.smartor.domain;
package com.smartor.domain.entity;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.ruoyi.common.annotation.Excel;
import com.ruoyi.common.core.domain.BaseEntity;
import com.smartor.domain.TaskSendTimeVO;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@@ -17,9 +18,10 @@
 * @author ruoyi
 * @date 2024-02-02
 */
@ApiModel(value = "ServiceSubtaskVO", description = "单一随访任务入参")
@ApiModel(value = "ServiceSubtaskEntity", description = "单一随访任务入参")
@Data
public class ServiceSubtaskVO extends BaseEntity {
public class ServiceSubtaskEntity extends BaseEntity {
    private static final long serialVersionUID = 1L;
    /**
@@ -743,6 +745,22 @@
     */
    @ApiModelProperty(value = "分组key")
    private String groupKey;
    @ApiModelProperty(value = "继续标识")
    private Integer continueFlag;
    @ApiModelProperty(value = "继续时间现在")
    private Date continueTimeNow;
    @ApiModelProperty(value = "继续内容")
    private String continueContent;
    @ApiModelProperty(value = "继续次数")
    private Integer continueCount;
    @ApiModelProperty(value = "继续时间下次")
    private Date continueTimeNext;
    /**
     * åˆ†ç»„code集合
     */
smartor/src/main/java/com/smartor/mapper/ServiceSubtaskMapper.java
@@ -1,6 +1,7 @@
package com.smartor.mapper;
import com.smartor.domain.*;
import com.smartor.domain.entity.ServiceSubtaskEntity;
import org.apache.ibatis.annotations.MapKey;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
@@ -30,24 +31,24 @@
     * @param serviceSubtaskVO å•一任务(随访)
     * @return å•一任务(随访)集合
     */
    public List<ServiceSubtask> selectServiceSubtaskList(ServiceSubtaskVO serviceSubtaskVO);
    public List<ServiceSubtask> selectServiceSubtaskList(ServiceSubtaskEntity serviceSubtaskVO);
    /**
     * ç”¨äºŽè¡¥å¿æŸ¥è¯¢
     * @param serviceSubtaskVO
     * @param ServiceSubtaskEntity
     * @return
     */
    public List<ServiceSubtask> getCompensateServiceSubtaskList(ServiceSubtaskVO serviceSubtaskVO);
    public List<ServiceSubtask> getCompensateServiceSubtaskList(ServiceSubtaskEntity serviceSubtaskVO);
    public List<ServiceSubtask> selectServiceSubtaskByDiagname(ServiceSubtask serviceSubtask);
    public List<ServiceSubtask> queryServiceSubtaskList(ServiceSubtaskVO serviceSubtaskVO);
    public List<ServiceSubtask> queryServiceSubtaskList(ServiceSubtaskEntity serviceSubtaskVO);
    public List<ServiceSubtask> selectServiceSubtaskBySendstate(ServiceSubtaskVO serviceSubtaskVO);
    public List<ServiceSubtask> selectServiceSubtaskBySendstate(ServiceSubtaskEntity serviceSubtaskVO);
    public List<ServiceSubtask> selectServiceSubtaskListByCreateTime(ServiceSubtaskVO serviceSubtaskVO);
    public List<ServiceSubtask> selectServiceSubtaskListByCreateTime(ServiceSubtaskEntity serviceSubtaskVO);
    public List<ServiceSubtask> selectServiceSubtaskListAgain(ServiceSubtaskVO serviceSubtaskVO);
    public List<ServiceSubtask> selectServiceSubtaskListAgain(ServiceSubtaskEntity serviceSubtaskVO);
    public List<Integer> selectSendstateByCondition(ServiceSubtask serviceSubtask);
@@ -74,7 +75,7 @@
     * @return
     */
    @MapKey("groupKey")
    public Map<String, Map<String,Object>> selectTimelyRateBatch(ServiceSubtaskVO ServiceSubtaskvo);
    public Map<String, Map<String,Object>> selectTimelyRateBatch(ServiceSubtaskEntity ServiceSubtaskvo);
    /**
     * éšè®¿åŠæ—¶çŽ‡è¯¦æƒ…
     *
@@ -163,6 +164,6 @@
     *         blq: ä¸ç†ç¬æ•°é‡
     *         yc: å¼‚常数量
     */
    public Map<String, Object> countByCondition(ServiceSubtaskVO serviceSubtaskVO);
    public Map<String, Object> countByCondition(ServiceSubtaskEntity serviceSubtaskVO);
}
smartor/src/main/java/com/smartor/service/IServiceSubtaskService.java
@@ -3,6 +3,7 @@
import com.ruoyi.common.core.domain.AjaxResult;
import com.smartor.domain.*;
import com.smartor.domain.ServiceSubtask;
import com.smartor.domain.entity.ServiceSubtaskEntity;
import org.springframework.web.bind.annotation.RequestBody;
import java.util.List;
@@ -31,9 +32,9 @@
     * @param serviceSubtaskVO å•一任务(随访)
     * @return å•一任务(随访)集合
     */
    public List<ServiceSubtask> selectServiceSubtaskList(ServiceSubtaskVO serviceSubtaskVO);
    public List<ServiceSubtask> selectServiceSubtaskList(ServiceSubtaskEntity serviceSubtaskVO);
    public List<ServiceSubtask> selectServiceSubtaskListAgain(ServiceSubtaskVO serviceSubtaskVO);
    public List<ServiceSubtask> selectServiceSubtaskListAgain(ServiceSubtaskEntity serviceSubtaskVO);
    /**
     * æ ¹æ®æ¡ä»¶æŸ¥è¯¢ä»»åŠ¡ä¿¡æ¯
@@ -46,11 +47,11 @@
    /**
     * æŸ¥è¯¢æ‚£è€…随访信息
     */
    public List<ServiceSubtask> patItem(ServiceSubtaskVO serviceSubtaskVO);
    public List<ServiceSubtaskRes> patItem(ServiceSubtaskEntity serviceSubtaskEntity);
    public List<ServiceSubtask> patItem2(ServiceSubtaskVO serviceSubtaskVO);
    public List<ServiceSubtask> patItem2(ServiceSubtaskEntity serviceSubtaskEntity);
    public Map<String, Object> patItemCount(ServiceSubtaskVO serviceSubtaskVO);
    public Map<String, Object> patItemCount(ServiceSubtaskEntity serviceSubtaskEntity);
    /**
     * æ–°å¢žå•一任务(随访)
smartor/src/main/java/com/smartor/service/impl/CommonTaskServiceImpl.java
@@ -8,6 +8,7 @@
import com.ruoyi.common.exception.base.BaseException;
import com.ruoyi.common.utils.DtoConversionUtils;
import com.smartor.domain.*;
import com.smartor.domain.entity.ServiceSubtaskEntity;
import com.smartor.mapper.ServiceSubtaskMapper;
import com.smartor.service.CommonTaskService;
import com.smartor.service.IServiceTaskService;
@@ -73,7 +74,7 @@
            serviceTask.setSendState(sendTaskVO.getSendState());
            int i = ivrTaskService.updateServiceTask(serviceTask);
            //获取到该任务所有的服务,并从队列里删除
            ServiceSubtaskVO serviceSubtaskVO = new ServiceSubtaskVO();
            ServiceSubtaskEntity serviceSubtaskVO = new ServiceSubtaskEntity();
            serviceSubtaskVO.setTaskid(serviceTask.getTaskid());
            serviceSubtaskVO.setSendstate(2L);
            List<ServiceSubtask> serviceSubtaskList = serviceSubtaskMapper.selectServiceSubtaskList(serviceSubtaskVO);
@@ -175,7 +176,7 @@
            serviceTask.setSendState(sendTaskVO.getSendState());
            int i = iServiceTaskService.updateServiceTask(serviceTask);
            //获取到该任务所有的服务,并从队列里删除
            ServiceSubtaskVO serviceSubtaskVO = new ServiceSubtaskVO();
            ServiceSubtaskEntity serviceSubtaskVO = new ServiceSubtaskEntity();
            serviceSubtaskVO.setTaskid(serviceTask1.getTaskid());
            serviceSubtaskVO.setSendstate(2L);
            List<ServiceSubtask> serviceSubtaskList = serviceSubtaskMapper.selectServiceSubtaskList(serviceSubtaskVO);
@@ -281,7 +282,7 @@
            serviceTask.setSendState(sendTaskVO.getSendState());
            iServiceTaskService.updateServiceTask(serviceTask);
            //获取到该任务所有的服务,并从队列里删除
            ServiceSubtaskVO serviceSubtaskVO = new ServiceSubtaskVO();
            ServiceSubtaskEntity serviceSubtaskVO = new ServiceSubtaskEntity();
            serviceSubtaskVO.setTaskid(serviceTask1.getTaskid());
            serviceSubtaskVO.setSendstate(2L);
            List<ServiceSubtask> serviceSubtaskList = serviceSubtaskMapper.selectServiceSubtaskList(serviceSubtaskVO);
@@ -404,7 +405,7 @@
    private void updateServiceSubtask(Long taskId, Date date) {
        log.info("-------777进来了吗?{}",taskId);
        //只要进入队列就算待发送
        ServiceSubtaskVO serviceSubtaskVO = new ServiceSubtaskVO();
        ServiceSubtaskEntity serviceSubtaskVO = new ServiceSubtaskEntity();
        serviceSubtaskVO.setTaskid(taskId);
        serviceSubtaskVO.setSendstate(1L);
        List<ServiceSubtask> serviceSubtaskList = serviceSubtaskMapper.selectServiceSubtaskList(serviceSubtaskVO);
smartor/src/main/java/com/smartor/service/impl/PatArchiveServiceImpl.java
@@ -7,6 +7,7 @@
import com.ruoyi.common.utils.DtoConversionUtils;
import com.ruoyi.common.utils.StringUtils;
import com.smartor.domain.*;
import com.smartor.domain.entity.ServiceSubtaskEntity;
import com.smartor.mapper.*;
import com.smartor.service.IPatArchiveService;
import com.smartor.service.IPatMedInhospService;
@@ -160,7 +161,7 @@
            patArchiveMapper.updatePatArchive(patArchive);
            if (StringUtils.isNotEmpty(patArchive.getNotrequiredFlag()) && patArchive.getNotrequiredFlag().equals("1")) {
                //不需要服务了,需要通过patid和sendstate=2或者sendstate=1去查询一下,service_subtask里是否有正在执行的任务,有的话,立即停了
                ServiceSubtaskVO serviceSubtaskVO = new ServiceSubtaskVO();
                ServiceSubtaskEntity serviceSubtaskVO = new ServiceSubtaskEntity();
                serviceSubtaskVO.setPatid(patArchive.getId());
                serviceSubtaskVO.setSendstate(2L);
                List<ServiceSubtask> serviceSubtaskList = serviceSubtaskMapper.selectServiceSubtaskList(serviceSubtaskVO);
smartor/src/main/java/com/smartor/service/impl/PatFilterlistServiceImpl.java
@@ -3,7 +3,7 @@
import com.ruoyi.common.utils.DateUtils;
import com.smartor.domain.PatFilterlist;
import com.smartor.domain.ServiceSubtask;
import com.smartor.domain.ServiceSubtaskVO;
import com.smartor.domain.entity.ServiceSubtaskEntity;
import com.smartor.mapper.PatFilterlistMapper;
import com.smartor.mapper.ServiceSubtaskMapper;
import com.smartor.service.IPatFilterlistService;
@@ -59,7 +59,7 @@
    @Override
    public int insertPatFilterlist(PatFilterlist patFilterlist) {
        //先查询一下,该患者是否有执行的任务,如果有的话,将任务暂停
        ServiceSubtaskVO serviceSubtask = new ServiceSubtaskVO();
        ServiceSubtaskEntity serviceSubtask = new ServiceSubtaskEntity();
        serviceSubtask.setPatid(patFilterlist.getPatid());
        serviceSubtask.setDelFlag("0");
        List<ServiceSubtask> selectServiceSubtaskList = serviceSubtaskMapper.selectServiceSubtaskList(serviceSubtask);
smartor/src/main/java/com/smartor/service/impl/PatMedInhospServiceImpl.java
@@ -9,6 +9,7 @@
import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.common.utils.StringUtils;
import com.smartor.domain.*;
import com.smartor.domain.entity.ServiceSubtaskEntity;
import com.smartor.mapper.*;
import com.smartor.service.IPatMedInhospService;
import lombok.extern.slf4j.Slf4j;
@@ -752,7 +753,7 @@
            //先判断一下,是否需要校验
            if (check && (Objects.isNull(serviceSubtask.getTaskSituation()) || serviceSubtask.getTaskSituation() != 6)) {
                //在新增之前,先通过患者ID,sendstate=2查询一下,在所有长期任务中,是不是还有该患者待执行的任务,有的话,比较之前的endtime是否小于当前的endtaime,如果之前的小于现在的,则直接将之前的停掉(原因再入院)
                ServiceSubtaskVO subtask = new ServiceSubtaskVO();
                ServiceSubtaskEntity subtask = new ServiceSubtaskEntity();
                subtask.setPatid(patArchive.getId());
                subtask.setSendstate(2L);
                subtask.setTaskid(taskid);
@@ -1049,7 +1050,7 @@
        for (PatMedInhosp patMedInhosp1 : patMedInhospList) {
            try {
                //获取当前入院患者的待执行的出院子任务随访信息
                ServiceSubtaskVO subtask = new ServiceSubtaskVO();
                ServiceSubtaskEntity subtask = new ServiceSubtaskEntity();
                subtask.setPatid(patMedInhosp1.getPatid());
                subtask.setSendstate(2L);
                List<ServiceSubtask> selectServiceSubtaskList = serviceSubtaskMapper.selectServiceSubtaskList(subtask);
smartor/src/main/java/com/smartor/service/impl/PatMedOuthospServiceImpl.java
@@ -13,6 +13,7 @@
import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.common.utils.StringUtils;
import com.smartor.domain.*;
import com.smartor.domain.entity.ServiceSubtaskEntity;
import com.smartor.mapper.*;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.ObjectUtils;
@@ -88,7 +89,7 @@
                    patMedOuthosp1.setTelcode(patArchive.getTelcode());
                    patMedOuthosp1.setIdcardno(patArchive.getIdcardno());
                }
                ServiceSubtaskVO serviceSubtaskVO = new ServiceSubtaskVO();
                ServiceSubtaskEntity serviceSubtaskVO = new ServiceSubtaskEntity();
                serviceSubtaskVO.setPatid(patMedOuthosp1.getPatid());
                List<Long> sendstates = new ArrayList<>();
                sendstates.add(1L);
@@ -303,7 +304,7 @@
        //先判断一下,是否需要校验
        if (check) {
            //在新增之前,先通过患者ID,sendstate=2查询一下,在所有长期任务中,是不是还有该患者待执行的任务,有的话,比较之前的endtime是否小于当前的endtaime,如果之前的小于现在的,则直接将之前的停掉(原因再入院)
            ServiceSubtaskVO subtask = new ServiceSubtaskVO();
            ServiceSubtaskEntity subtask = new ServiceSubtaskEntity();
            subtask.setPatid(patArchive.getId());
            subtask.setSendstate(2L);
            subtask.setTaskid(taskid);
smartor/src/main/java/com/smartor/service/impl/ServiceExternalServiceImpl.java
@@ -10,6 +10,7 @@
import com.ruoyi.common.utils.DateUtils;
import com.ruoyi.common.utils.StringUtils;
import com.smartor.domain.*;
import com.smartor.domain.entity.ServiceSubtaskEntity;
import com.smartor.mapper.*;
import com.smartor.service.IServiceExternalService;
import lombok.extern.slf4j.Slf4j;
@@ -824,7 +825,7 @@
            int i = patMedInhospMapper.updatePatMedInhosp(patMedInhosp1);
            //取消出院,就不需要服务了,需要通过patid和sendstate=2或者sendstate=1去查询一下,service_subtask里是否有正在执行的任务,有的话,立即停了
            ServiceSubtaskVO serviceSubtaskVO = new ServiceSubtaskVO();
            ServiceSubtaskEntity serviceSubtaskVO = new ServiceSubtaskEntity();
            serviceSubtaskVO.setPatid(patMedInhosp1.getPatid());
            serviceSubtaskVO.setSendstate(2L);
            List<ServiceSubtask> serviceSubtaskList = serviceSubtaskMapper.selectServiceSubtaskList(serviceSubtaskVO);
smartor/src/main/java/com/smartor/service/impl/ServiceSLTDHealthcareRecordServiceImpl.java
@@ -10,6 +10,7 @@
import com.ruoyi.common.core.domain.entity.SysUserRole;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.common.utils.http.HttpUtils;
import com.smartor.common.DistinctByProperty;
import com.smartor.domain.*;
import com.smartor.mapper.*;
import com.smartor.service.IPatArchiveService;
@@ -30,6 +31,8 @@
import java.text.SimpleDateFormat;
import java.util.*;
import java.util.concurrent.TimeUnit;
import java.util.function.Function;
import java.util.stream.Collectors;
@Slf4j
@Service
@@ -484,7 +487,7 @@
    private Boolean outHospitalDate(List<ServiceSLTDInhospResDTO> resultList) {
        List<PatMedOuthosp> batchList = new ArrayList<>();
        for (ServiceSLTDInhospResDTO dto : resultList) {
            if (Objects.isNull(dto)) {
                continue;
@@ -493,12 +496,15 @@
            PatMedOuthosp patMedOuthosp = buildPatMedOuthosp(dto, patArchive);
            batchList.add(patMedOuthosp);
        }
        // æ‰¹é‡æ’入,自动忽略重复
        if (CollectionUtils.isNotEmpty(batchList)) {
            try {
                //这里用自动忽略重复会有问题,如果表重新建,serialnum索引会丢失。就无法去重,所以还是需要内存里去重
                batchList = DistinctByProperty.distinctByProperty(batchList, PatMedOuthosp::getSerialnum);
                int insertCount = patMedOuthospMapper.batchInsertIgnore(batchList);
                log.info("批量插入门急诊记录,总数:{}, å®žé™…插入:{}", batchList.size(), insertCount);
            } catch (Exception e) {
                log.error("批量插入门急诊记录失败", e);
                // é™çº§ä¸ºé€æ¡æ’å…¥
smartor/src/main/java/com/smartor/service/impl/ServiceSubtaskAnswerServiceImpl.java
@@ -9,6 +9,7 @@
import com.ruoyi.common.utils.RSAPublicKeyExample;
import com.ruoyi.common.utils.StringUtils;
import com.smartor.domain.*;
import com.smartor.domain.entity.ServiceSubtaskEntity;
import com.smartor.mapper.*;
import com.smartor.service.IServiceSubtaskAnswerService;
import com.smartor.service.IServiceTaskService;
@@ -272,7 +273,7 @@
            redisCache.deleteObject(key);
            //查询出该任务中正在执行的患者信息
            ServiceSubtaskVO ssVO = new ServiceSubtaskVO();
            ServiceSubtaskEntity ssVO = new ServiceSubtaskEntity();
            ssVO.setTaskid(tid);
            ssVO.setPatid(pid);
//            ssVO.setSendstate(3L);
@@ -540,7 +541,7 @@
                subId = Long.valueOf(serviceSubTaskCacheReq.getParam6());
        }
        ServiceSubtaskVO serviceSubtaskVO = new ServiceSubtaskVO();
        ServiceSubtaskEntity serviceSubtaskVO = new ServiceSubtaskEntity();
        serviceSubtaskVO.setTaskid(tid);
        serviceSubtaskVO.setPatid(pid);
        serviceSubtaskVO.setSubId(subId);
@@ -645,7 +646,7 @@
    private Map<String, String> setWJInfo(SvyTaskTemplateScriptVO svyTaskTemplateScriptVO, Long taskid, Long patid) {
        log.error("-----svyTaskTemplateScriptVO的值为:{}", svyTaskTemplateScriptVO);
        ServiceSubtaskVO serviceSubtaskVO = new ServiceSubtaskVO();
        ServiceSubtaskEntity serviceSubtaskVO = new ServiceSubtaskEntity();
        serviceSubtaskVO.setTaskid(taskid);
        serviceSubtaskVO.setPatid(patid);
        List<ServiceSubtask> selectServiceSubtaskList = serviceSubtaskMapper.selectServiceSubtaskList(serviceSubtaskVO);
@@ -799,7 +800,7 @@
    }
    private Map<String, String> setSFInfo(IvrTaskTemplateScriptVO ivrTaskTemplateScriptVO, Long taskid, Long patid) {
        ServiceSubtaskVO serviceSubtaskVO = new ServiceSubtaskVO();
        ServiceSubtaskEntity serviceSubtaskVO = new ServiceSubtaskEntity();
        serviceSubtaskVO.setTaskid(taskid);
        serviceSubtaskVO.setPatid(patid);
        List<ServiceSubtask> selectServiceSubtaskList = serviceSubtaskMapper.selectServiceSubtaskList(serviceSubtaskVO);
smartor/src/main/java/com/smartor/service/impl/ServiceSubtaskServiceImpl.java
@@ -1,5 +1,6 @@
package com.smartor.service.impl;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson2.JSON;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.JsonNode;
@@ -12,6 +13,7 @@
import com.smartor.common.FtpService;
import com.smartor.config.PhoneUtils;
import com.smartor.domain.*;
import com.smartor.domain.entity.ServiceSubtaskEntity;
import com.smartor.mapper.*;
import com.smartor.service.*;
import com.sun.org.apache.bcel.internal.generic.NEW;
@@ -167,27 +169,27 @@
    /**
     * æŸ¥è¯¢å•一任务(随访)列表
     *
     * @param serviceSubtaskVO å•一任务(随访)
     * @param serviceSubtaskEntity å•一任务(随访)
     * @return å•一任务(随访)
     */
    @Override
    public List<ServiceSubtask> selectServiceSubtaskList(ServiceSubtaskVO serviceSubtaskVO) {
        return serviceSubtaskMapper.selectServiceSubtaskList(serviceSubtaskVO);
    public List<ServiceSubtask> selectServiceSubtaskList(ServiceSubtaskEntity serviceSubtaskEntity) {
        return serviceSubtaskMapper.selectServiceSubtaskList(serviceSubtaskEntity);
    }
    public List<ServiceSubtask> selectServiceSubtaskListAgain(ServiceSubtaskVO serviceSubtaskVO) {
        return serviceSubtaskMapper.selectServiceSubtaskListAgain(serviceSubtaskVO);
    public List<ServiceSubtask> selectServiceSubtaskListAgain(ServiceSubtaskEntity serviceSubtaskEntity) {
        return serviceSubtaskMapper.selectServiceSubtaskListAgain(serviceSubtaskEntity);
    }
    @Override
    public ServiceTaskVO queryTaskByCondition(ServiceSubtask serviceSubtask) {
        //定义患者与单一任务关联表集合
        List<PatTaskRelevance> patTaskRelevances = new ArrayList<>();
        ServiceSubtaskVO serviceSubtaskVO = DtoConversionUtils.sourceToTarget(serviceSubtask, ServiceSubtaskVO.class);
        ServiceSubtaskEntity serviceSubtaskVO = DtoConversionUtils.sourceToTarget(serviceSubtask, ServiceSubtaskEntity.class);
        List<ServiceSubtask> list = selectServiceSubtaskList(serviceSubtaskVO);
        ServiceTask serviceTask = serviceTaskService.selectServiceTaskByTaskid(serviceSubtask.getTaskid());
        if(ObjectUtils.isEmpty(serviceTask)){
        if (ObjectUtils.isEmpty(serviceTask)) {
            log.error("找不到对应的serviceTask, orgid:{}, taskid: {}", serviceSubtask.getOrgid(), serviceSubtask.getTaskid());
            return null;
        }
@@ -231,8 +233,7 @@
        } catch (JsonProcessingException e) {
            e.printStackTrace();
        }
        List<ServiceSubtaskPreachform> serviceSubtaskPreachformLists =
                    serviceSubtaskPreachformMapper.selectBySubtask(serviceSubtask);
        List<ServiceSubtaskPreachform> serviceSubtaskPreachformLists = serviceSubtaskPreachformMapper.selectBySubtask(serviceSubtask);
        for (ServiceSubtask serviceSubtask1 : list) {
            PatTaskRelevance patTaskRelevance = new PatTaskRelevance();
            if (!serviceSubtask1.getHospType().equals("2")) {
@@ -289,9 +290,7 @@
            }
            //获取该患者所有的执行状态
            List<ServiceSubtaskPreachform> serviceSubtaskPreachformList =
                serviceSubtaskPreachformLists.stream().filter((item -> item.getSubid().equals(serviceSubtask1.getId())
                            && item.getTaskid().equals(serviceTask.getTaskid()))).collect(Collectors.toList());
            List<ServiceSubtaskPreachform> serviceSubtaskPreachformList = serviceSubtaskPreachformLists.stream().filter((item -> item.getSubid().equals(serviceSubtask1.getId()) && item.getTaskid().equals(serviceTask.getTaskid()))).collect(Collectors.toList());
            List<Map<String, Object>> resultList = serviceSubtaskPreachformList.stream().map(item -> {
                Map<String, Object> map = new HashMap<>();
                map.put("sort", item.getSort());
@@ -310,17 +309,23 @@
    }
    @Override
    public List<ServiceSubtask> patItem(ServiceSubtaskVO serviceSubtaskVO) {
        List<ServiceSubtask> selectServiceSubtaskList = this.selectServiceSubtaskList(serviceSubtaskVO);
        return selectServiceSubtaskList;
    public List<ServiceSubtaskRes> patItem(ServiceSubtaskEntity serviceSubtaskEntity) {
        List<ServiceSubtask> selectServiceSubtaskList = this.selectServiceSubtaskList(serviceSubtaskEntity);
        List<ServiceSubtaskRes> serviceSubtaskResList = new ArrayList<>();
        for (ServiceSubtask serviceSubtask : selectServiceSubtaskList) {
            ServiceSubtaskRes serviceSubtaskRes = DtoConversionUtils.sourceToTarget(serviceSubtask, ServiceSubtaskRes.class);
            serviceSubtaskRes.setContinueContent(JSONObject.parseObject(serviceSubtask.getContinueContent()));
        }
        return serviceSubtaskResList;
    }
    @Override
    public List<ServiceSubtask> patItem2(ServiceSubtaskVO serviceSubtaskVO) {
    public List<ServiceSubtask> patItem2(ServiceSubtaskEntity serviceSubtaskEntity) {
        List<ServiceSubtask> serviceSubtaskList = new ArrayList<>();
        for (Long sendstate : serviceSubtaskVO.getSendstates()) {
            serviceSubtaskVO.setSendstate(sendstate);
            List<ServiceSubtask> serviceSubtasks = serviceSubtaskMapper.selectServiceSubtaskList(serviceSubtaskVO);
        for (Long sendstate : serviceSubtaskEntity.getSendstates()) {
            serviceSubtaskEntity.setSendstate(sendstate);
            List<ServiceSubtask> serviceSubtasks = serviceSubtaskMapper.selectServiceSubtaskList(serviceSubtaskEntity);
            serviceSubtaskList.addAll(serviceSubtasks);
        }
        return serviceSubtaskList;
@@ -370,15 +375,15 @@
     * 2. æ€§èƒ½æå‡ 10-100 å€ï¼ˆå–决于数据量)
     * 3. é™ä½Žå†…存占用和网络传输
     *
     * @param serviceSubtaskVO æŸ¥è¯¢æ¡ä»¶
     * @param serviceSubtaskEntity æŸ¥è¯¢æ¡ä»¶
     * @return å„状态统计结果
     */
    @Override
    public Map<String, Object> patItemCount(ServiceSubtaskVO serviceSubtaskVO) {
    public Map<String, Object> patItemCount(ServiceSubtaskEntity serviceSubtaskEntity) {
        // ç›´æŽ¥è°ƒç”¨æ•°æ®åº“统计方法,在数据库层完成聚合计算
        Map<String, Object> result = serviceSubtaskMapper.countByCondition(serviceSubtaskVO);
        Map<String, Object> result = serviceSubtaskMapper.countByCondition(serviceSubtaskEntity);
        // å¤„理空异常
        if(MapUtils.isEmpty(result)){
        if (MapUtils.isEmpty(result)) {
            result = new HashMap<>();
        }
        // ç¡®ä¿æ‰€æœ‰ key éƒ½æœ‰å€¼ï¼Œé¿å…ç©ºæŒ‡é’ˆå¼‚常
@@ -424,18 +429,18 @@
        if (patMedInhospList.size() > 0) {
            serviceSubtask1.setIsVisitAgain(2);
            serviceSubtask1.setRemark(serviceSubtask1.getRemark()+";患者再入院了");
            serviceSubtask1.setRemark(serviceSubtask1.getRemark() + ";患者再入院了");
            serviceSubtaskMapper.updateServiceSubtask(serviceSubtask1);
            return "无需再次随访,患者再入院了";
        } else if (serviceSubtask1.getSendstate() == 4L) {
            serviceSubtask1.setIsVisitAgain(2);
            serviceSubtask1.setRemark(serviceSubtask1.getRemark()+";无需再次随访,任务被标记不在执行");
            serviceSubtask1.setRemark(serviceSubtask1.getRemark() + ";无需再次随访,任务被标记不在执行");
            serviceSubtaskMapper.updateServiceSubtask(serviceSubtask1);
            return "无需再次随访,任务被标记不在执行";
        } else if (StringUtils.isNotEmpty(patArchive.getNotrequiredFlag()) && patArchive.getNotrequiredFlag().equals("1")) {
            serviceSubtask1.setIsVisitAgain(2);
            serviceSubtaskMapper.updateServiceSubtask(serviceSubtask1);
            serviceSubtask1.setRemark(serviceSubtask1.getRemark()+";无需再次随访,患者被标记不需要被服务");
            serviceSubtask1.setRemark(serviceSubtask1.getRemark() + ";无需再次随访,患者被标记不需要被服务");
            return "无需再次随访,患者被标记不需要被服务";
        } else if (ObjectUtils.isNotEmpty(serviceSubtask1.getIsVisitAgain()) && serviceSubtask1.getIsVisitAgain() == 2) {
            return "无需再次随访,该任务已经再次随访过了";
@@ -671,6 +676,11 @@
                    serviceSubtask.setEndtime(patTaskRelevance.getEndtime());
                    serviceSubtask.setNurseId(patTaskRelevance.getNurseId());
                    serviceSubtask.setNurseName(patTaskRelevance.getNurseName());
                    serviceSubtask.setContinueContent(ObjectUtils.isNotEmpty(patTaskRelevance.getContinueContent()) ? patTaskRelevance.getContinueContent().toString() : null);
                    serviceSubtask.setContinueCount(patTaskRelevance.getContinueCount());
                    serviceSubtask.setContinueFlag(patTaskRelevance.getContinueFlag());
                    serviceSubtask.setContinueTimeNext(patTaskRelevance.getContinueTimeNext());
                    serviceSubtask.setContinueTimeNow(patTaskRelevance.getContinueTimeNow());
                    serviceSubtask.setCreateBy(serviceTask.getCreateBy());
                    serviceSubtask.setUpdateBy(serviceTask.getCreateBy());
                    serviceSubtask.setVisitTime(patTaskRelevance.getVisittime());
@@ -706,7 +716,7 @@
            //修改操作,需要将stopState状态+1
            ServiceTask serviceTask1 = serviceTaskService.selectServiceTaskByTaskid(serviceTask.getTaskid());
            //获取到该任务所有的服务,并从队列里删除
            ServiceSubtaskVO serviceSubtaskVO = new ServiceSubtaskVO();
            ServiceSubtaskEntity serviceSubtaskVO = new ServiceSubtaskEntity();
            serviceSubtaskVO.setTaskid(serviceTask1.getTaskid());
            serviceSubtaskVO.setSendstate(2L);
            List<ServiceSubtask> serviceSubtaskList = serviceSubtaskMapper.selectServiceSubtaskList(serviceSubtaskVO);
@@ -888,6 +898,11 @@
                    serviceSubtask.setDrcode(patTaskRelevance.getDrcode());
                    serviceSubtask.setInhosptime(patTaskRelevance.getInhosptime());
                    serviceSubtask.setHospType(patTaskRelevance.getHospType());
                    serviceSubtask.setContinueContent(ObjectUtils.isNotEmpty(patTaskRelevance.getContinueContent()) ? patTaskRelevance.getContinueContent().toString() : null);
                    serviceSubtask.setContinueCount(patTaskRelevance.getContinueCount());
                    serviceSubtask.setContinueFlag(patTaskRelevance.getContinueFlag());
                    serviceSubtask.setContinueTimeNext(patTaskRelevance.getContinueTimeNext());
                    serviceSubtask.setContinueTimeNow(patTaskRelevance.getContinueTimeNow());
                    serviceSubtask.setEndtime(patTaskRelevance.getEndtime());
                    serviceSubtask.setNurseId(patTaskRelevance.getNurseId());
                    serviceSubtask.setNurseName(patTaskRelevance.getNurseName());
@@ -912,7 +927,7 @@
                }
            }
            // æœ‰å¯èƒ½ä¼šæŠŠå‘送顺序也修改了(需要根据taskId将所有的sendstate!=4,5,6的subTask拉出来,进行修改一下)
            ServiceSubtaskVO ssVo = new ServiceSubtaskVO();
            ServiceSubtaskEntity ssVo = new ServiceSubtaskEntity();
            ssVo.setTaskid(serviceTaskVO.getTaskid());
            ssVo.setDelFlag("0");
            List<Long> ssList = new ArrayList<>();
@@ -1699,7 +1714,7 @@
                            redisCache.setCacheObject(phoneCallReqYQVO.getTaskid().trim() + "&&" + "mate" + "&&" + phoneCallReqYQVO.getUuid(), count + 1, 120, TimeUnit.MINUTES);
                        phoneCallBackYQVO.setType("text");
                        phoneCallBackYQVO.setValue(ivrTaskTemplateScriptVO.getNoMatchText() + getObject(serviceSubtask, StringUtils.isNotEmpty(ivrTaskTemplateScriptVO.getIvrtext())?ivrTaskTemplateScriptVO.getIvrtext():ivrTaskTemplateScriptVO.getScriptContent()));
                        phoneCallBackYQVO.setValue(ivrTaskTemplateScriptVO.getNoMatchText() + getObject(serviceSubtask, StringUtils.isNotEmpty(ivrTaskTemplateScriptVO.getIvrtext()) ? ivrTaskTemplateScriptVO.getIvrtext() : ivrTaskTemplateScriptVO.getScriptContent()));
                    }
                }
@@ -1999,7 +2014,7 @@
            RSAPublicKeyExample rsaPublicKeyExample = new RSAPublicKeyExample();
            Long tid = Long.valueOf(rsaPublicKeyExample.decryptedData(serviceSubTaskDetailReq.getParam1(), pri_key));
            Long pid = Long.valueOf(rsaPublicKeyExample.decryptedData(serviceSubTaskDetailReq.getParam2(), pri_key));
            ServiceSubtaskVO ivrTaskSingle = new ServiceSubtaskVO();
            ServiceSubtaskEntity ivrTaskSingle = new ServiceSubtaskEntity();
            ivrTaskSingle.setTaskid(tid);
            ivrTaskSingle.setPatid(pid);
            List<ServiceSubtask> selectServiceSubtaskList = serviceSubtaskMapper.selectServiceSubtaskList(ivrTaskSingle);
@@ -2252,8 +2267,7 @@
        List<String> groupKeyList = serviceSubtaskMapper.getSfStatisticsGroupKey(serviceSubtaskCountReq);
        serviceSubtaskCountReq.setGroupKeyList(groupKeyList);
        List<ServiceSubtask> rawData = serviceSubtaskMapper.getSfStatistics(serviceSubtaskCountReq);
        switch (groupKey)
        {
        switch (groupKey) {
            case "deptcode":
                collect = rawData.stream().collect(Collectors.groupingBy(subtask -> Optional.ofNullable(subtask.getDeptcode()).orElse("Unknown")));
                break;
@@ -2275,10 +2289,10 @@
                continue;
            }
            ServiceSubtaskStatistic statistic = getStatistic(serviceSubtaskList, serviceSubtaskCountReq.getFollowUpCountStyle());
            if(ObjectUtils.isNotEmpty(jsRates)){
            if (ObjectUtils.isNotEmpty(jsRates)) {
                Map<String, Object> jsRateMap = jsRates.get(collectKey);
                BigDecimal jsRate = new BigDecimal("0");
                if(ObjectUtils.isNotEmpty(jsRateMap) && ObjectUtils.isNotEmpty(jsRateMap.get("rate"))){
                if (ObjectUtils.isNotEmpty(jsRateMap) && ObjectUtils.isNotEmpty(jsRateMap.get("rate"))) {
                    jsRate = new BigDecimal(jsRateMap.get("rate").toString());
                }
                Double jsRateDouble = (jsRate.setScale(4, RoundingMode.HALF_UP)).doubleValue();
@@ -2294,24 +2308,25 @@
    /**
     * éšè®¿ç»Ÿè®¡-及时率统计
     *
     * @param serviceSubtaskCountReq
     * @param collect
     * @return
     */
    public  Map<String, Map<String, Object>> getSsRateForSfStatistics(ServiceSubtaskCountReq serviceSubtaskCountReq, Map<String, List<ServiceSubtask>> collect){
        if(ObjectUtils.isEmpty(serviceSubtaskCountReq)){
    public Map<String, Map<String, Object>> getSsRateForSfStatistics(ServiceSubtaskCountReq serviceSubtaskCountReq, Map<String, List<ServiceSubtask>> collect) {
        if (ObjectUtils.isEmpty(serviceSubtaskCountReq)) {
            return null;
        }
        String groupKey = serviceSubtaskCountReq.getGroupKey();
        if(StringUtils.isEmpty(groupKey)){
        if (StringUtils.isEmpty(groupKey)) {
            return null;
        }
        List<String> groupKeyList = new ArrayList<>(collect.keySet());
        if(ObjectUtils.isEmpty(groupKeyList)){
        if (ObjectUtils.isEmpty(groupKeyList)) {
            return null;
        }
        //及时率统计
        ServiceSubtaskVO ssRate = new ServiceSubtaskVO();
        ServiceSubtaskEntity ssRate = new ServiceSubtaskEntity();
        ssRate.setOrgid(serviceSubtaskCountReq.getOrgid());
        ssRate.setStarttime(serviceSubtaskCountReq.getStartTime());
        ssRate.setEndtime(serviceSubtaskCountReq.getEndTime());
@@ -2321,11 +2336,12 @@
        ssRate.setGroupKey(groupKey);
        ssRate.setGroupKeyList(groupKeyList);
        Map<String, Map<String, Object>> jsRates = new HashMap<>();
        if(!collect.isEmpty()){
        if (!collect.isEmpty()) {
            jsRates = serviceSubtaskMapper.selectTimelyRateBatch(ssRate);
        }
        return jsRates;
    }
    @Override
    public List<ServiceSubtaskStatistic> getSfStatisticsExport(ServiceSubtaskCountReq serviceSubtaskCountReq) {
        List<ServiceSubtaskStatistic> sfStatistics = getSfStatistics(serviceSubtaskCountReq);
@@ -2424,7 +2440,6 @@
    }
    /**
     * èŽ·å–æ»¡æ„åº¦é¢˜ç›®æ€»é‡
     * type : 1-科室   2病区
@@ -2465,7 +2480,7 @@
                    List<IvrTaskTemplateScript> ivrTaskTemplateScripts = iIvrTaskTemplateScriptService.selectIvrTaskTemplateScriptList(ivrTaskTemplateScript);
                    if (CollectionUtils.isNotEmpty(ivrTaskTemplateScripts)) {
                        //需要先计算出发送量,再乘以单个问券满意度题目数量,得到满意度题目总量(包含了未做的)
                        ServiceSubtaskVO serviceSubtaskVO = new ServiceSubtaskVO();
                        ServiceSubtaskEntity serviceSubtaskVO = new ServiceSubtaskEntity();
                        serviceSubtaskVO.setTaskid(serviceTask.getTaskid());
                        List<Long> sendstates = new ArrayList<>(Arrays.asList(3L, 5L, 6L));
                        serviceSubtaskVO.setSendstates(sendstates);
@@ -2484,11 +2499,11 @@
                    svyTaskTemplateScript.setCategoryid(svyCategoryid);
                    List<SvyTaskTemplateScript> svyTaskTemplateScriptList = svyTaskTemplateScriptService.selectSvyTaskTemplateScriptList(svyTaskTemplateScript);
                    if (CollectionUtils.isNotEmpty(svyTaskTemplateScriptList)) {
                        ServiceSubtaskVO serviceSubtaskVO = new ServiceSubtaskVO();
                        serviceSubtaskVO.setTaskid(serviceTask.getTaskid());
                        ServiceSubtaskEntity serviceSubtaskEntity = new ServiceSubtaskEntity();
                        serviceSubtaskEntity.setTaskid(serviceTask.getTaskid());
                        List<Long> sendstates = new ArrayList<>(Arrays.asList(3L, 5L, 6L));
                        serviceSubtaskVO.setSendstates(sendstates);
                        List<ServiceSubtask> serviceSubtaskList = serviceSubtaskMapper.selectServiceSubtaskBySendstate(serviceSubtaskVO);
                        serviceSubtaskEntity.setSendstates(sendstates);
                        List<ServiceSubtask> serviceSubtaskList = serviceSubtaskMapper.selectServiceSubtaskBySendstate(serviceSubtaskEntity);
                        if (CollectionUtils.isNotEmpty(serviceSubtaskList)) {
                            int mydtmzlCount = svyTaskTemplateScriptList.size() * serviceSubtaskList.size();
                            mydtmzlsum.add(new BigDecimal(mydtmzlCount));
@@ -2555,7 +2570,7 @@
        //记录再次待随访详情
        List<ServiceSubtask> pendingFollowUpAgainInfo = new ArrayList<>();
        //记录再次随访成功详情
        List<ServiceSubtask> followUpSuccessAgainInfo= new ArrayList<>();
        List<ServiceSubtask> followUpSuccessAgainInfo = new ArrayList<>();
        //记录再次随访失败详情
        List<ServiceSubtask> followUpFailAgainInfo = new ArrayList<>();
        //记录首次随访人工详情
@@ -2563,13 +2578,13 @@
        //记录首次随访短信详情
        List<ServiceSubtask> smsAgainInfo = new ArrayList<>();
        //记录首次随访微信详情
        List<ServiceSubtask> wechatAgainInfo= new ArrayList<>();
        List<ServiceSubtask> wechatAgainInfo = new ArrayList<>();
        for (ServiceSubtask serviceSubtask : serviceSubtaskList) {
            //无需随访人次
            if (serviceSubtask.getSendstate() != null && serviceSubtask.getSendstate() == 4) {
                serviceSubtaskStatistic.setNonFollowUp(serviceSubtaskStatistic.getNonFollowUp() + 1L);
                if (serviceSubtask.getTaskSituation() !=null && serviceSubtask.getTaskSituation() == 6) {
                if (serviceSubtask.getTaskSituation() != null && serviceSubtask.getTaskSituation() == 6) {
                    serviceSubtaskStatistic.setFilterCount(serviceSubtaskStatistic.getFilterCount() + 1L);
                    filterServiceSubtasks.add(serviceSubtask);
                }
@@ -2599,55 +2614,45 @@
                /**
                 * ä¸åŒç»Ÿè®¡æ–¹å¼ä¸‹ä¸åŒçš„随访成功数 å‚æ•° followUpCountStyle æŽ§åˆ¶
                 */
                if(StringUtils.isNotEmpty(followUpCountStyle) && followUpCountStyle.equals("1")){
                if (StringUtils.isNotEmpty(followUpCountStyle) && followUpCountStyle.equals("1")) {
                    //首次随访成功
                    if (serviceSubtask.getSendstate() != null && (serviceSubtask.getSendstate() == 6L)) {
                        serviceSubtaskStatistic.setFollowUpSuccess(serviceSubtaskStatistic.getFollowUpSuccess() + 1L);
                        followUpSuccessInfo.add(serviceSubtask);
                    }
                    //首次随访人工 (不统计不执行)
                    if (serviceSubtask.getSendstate() != null
                            && !serviceSubtask.getSendstate().equals(4L)
                            && serviceSubtask.getPreachform().equals("1")) {
                    if (serviceSubtask.getSendstate() != null && !serviceSubtask.getSendstate().equals(4L) && serviceSubtask.getPreachform().equals("1")) {
                        serviceSubtaskStatistic.setManual(serviceSubtaskStatistic.getManual() + 1L);
                        manualInfo.add(serviceSubtask);
                    }
                    //首次随访短信(不统计不执行)
                    if (serviceSubtask.getSendstate() != null
                            && !serviceSubtask.getSendstate().equals(4L)
                            && serviceSubtask.getPreachform().equals("4")) {
                    if (serviceSubtask.getSendstate() != null && !serviceSubtask.getSendstate().equals(4L) && serviceSubtask.getPreachform().equals("4")) {
                        serviceSubtaskStatistic.setSms(serviceSubtaskStatistic.getSms() + 1L);
                        smsInfo.add(serviceSubtask);
                    }
                    //首次随访微信(不统计不执行)
                    if (serviceSubtask.getSendstate() != null
                            && !serviceSubtask.getSendstate().equals(4L)
                            && serviceSubtask.getPreachform().equals("5")) {
                    if (serviceSubtask.getSendstate() != null && !serviceSubtask.getSendstate().equals(4L) && serviceSubtask.getPreachform().equals("5")) {
                        serviceSubtaskStatistic.setWeChat(serviceSubtaskStatistic.getWeChat() + 1L);
                        wechatInfo.add(serviceSubtask);
                    }
                }else {
                } else {
                    //首次随访成功 - ç»Ÿè®¡æ—¶å€™åŠ ä¸Šä¸æ‰§è¡Œçš„ï¼Œå·²å‘é€çš„
                    if (serviceSubtask.getSendstate() != null && (serviceSubtask.getSendstate().equals(6L)
                            || serviceSubtask.getSendstate().equals(3L) || serviceSubtask.getSendstate().equals(4L))) {
                    if (serviceSubtask.getSendstate() != null && (serviceSubtask.getSendstate().equals(6L) || serviceSubtask.getSendstate().equals(3L) || serviceSubtask.getSendstate().equals(4L))) {
                        serviceSubtaskStatistic.setFollowUpSuccess(serviceSubtaskStatistic.getFollowUpSuccess() + 1L);
                        followUpSuccessInfo.add(serviceSubtask);
                    }
                    //首次随访人工 (统计不执行)
                    if (serviceSubtask.getSendstate() != null
                            && serviceSubtask.getPreachform().equals("1")) {
                    if (serviceSubtask.getSendstate() != null && serviceSubtask.getPreachform().equals("1")) {
                        serviceSubtaskStatistic.setManual(serviceSubtaskStatistic.getManual() + 1L);
                        manualInfo.add(serviceSubtask);
                    }
                    //首次随访短信(统计不执行)
                    if (serviceSubtask.getSendstate() != null
                            && serviceSubtask.getPreachform().equals("4")) {
                    if (serviceSubtask.getSendstate() != null && serviceSubtask.getPreachform().equals("4")) {
                        serviceSubtaskStatistic.setSms(serviceSubtaskStatistic.getSms() + 1L);
                        smsInfo.add(serviceSubtask);
                    }
                    //首次随访微信(统计不执行)
                    if (serviceSubtask.getSendstate() != null
                            && serviceSubtask.getPreachform().equals("5")) {
                    if (serviceSubtask.getSendstate() != null && serviceSubtask.getPreachform().equals("5")) {
                        serviceSubtaskStatistic.setWeChat(serviceSubtaskStatistic.getWeChat() + 1L);
                        wechatInfo.add(serviceSubtask);
                    }
@@ -2682,56 +2687,45 @@
                /**
                 * ä¸åŒç»Ÿè®¡æ–¹å¼ä¸‹ä¸åŒçš„随访成功数 å‚æ•° followUpCountStyle æŽ§åˆ¶
                 */
                if(StringUtils.isNotEmpty(followUpCountStyle) && followUpCountStyle.equals("1")){
                if (StringUtils.isNotEmpty(followUpCountStyle) && followUpCountStyle.equals("1")) {
                    //再次随访成功
                    if (serviceSubtask.getSendstate() != null && (serviceSubtask.getSendstate() == 1 || serviceSubtask.getSendstate() == 3 || serviceSubtask.getSendstate() == 6)) {
                        serviceSubtaskStatistic.setFollowUpSuccessAgain(serviceSubtaskStatistic.getFollowUpSuccessAgain() + 1L);
                        followUpSuccessAgainInfo.add(serviceSubtask);
                    }
                    //再次随访人工(不统计不执行)
                    if (serviceSubtask.getSendstate() != null
                            && !serviceSubtask.getSendstate().equals(4L)
                            && serviceSubtask.getPreachform().equals("1")) {
                    if (serviceSubtask.getSendstate() != null && !serviceSubtask.getSendstate().equals(4L) && serviceSubtask.getPreachform().equals("1")) {
                        serviceSubtaskStatistic.setManualAgain(serviceSubtaskStatistic.getManualAgain() + 1L);
                        manualAgainInfo.add(serviceSubtask);
                    }
                    //再次随访短信(不统计不执行)
                    if (serviceSubtask.getSendstate() != null
                            && !serviceSubtask.getSendstate().equals(4L)
                            && serviceSubtask.getPreachform().equals("4")) {
                    if (serviceSubtask.getSendstate() != null && !serviceSubtask.getSendstate().equals(4L) && serviceSubtask.getPreachform().equals("4")) {
                        serviceSubtaskStatistic.setSmsAgain(serviceSubtaskStatistic.getSmsAgain() + 1L);
                        smsAgainInfo.add(serviceSubtask);
                    }
                    //再次随访微信(不统计不执行)
                    if (serviceSubtask.getSendstate() != null
                            && !serviceSubtask.getSendstate().equals(4L)
                            && serviceSubtask.getPreachform().equals("5")) {
                    if (serviceSubtask.getSendstate() != null && !serviceSubtask.getSendstate().equals(4L) && serviceSubtask.getPreachform().equals("5")) {
                        serviceSubtaskStatistic.setWeChatAgain(serviceSubtaskStatistic.getWeChatAgain() + 1L);
                        wechatAgainInfo.add(serviceSubtask);
                    }
                }else {
                } else {
                    //再次随访成功
                    if (serviceSubtask.getSendstate() != null &&
                            (serviceSubtask.getSendstate().equals(1L) || serviceSubtask.getSendstate().equals(6L) ||
                            serviceSubtask.getSendstate().equals(3L) || serviceSubtask.getSendstate().equals(4L))) {
                    if (serviceSubtask.getSendstate() != null && (serviceSubtask.getSendstate().equals(1L) || serviceSubtask.getSendstate().equals(6L) || serviceSubtask.getSendstate().equals(3L) || serviceSubtask.getSendstate().equals(4L))) {
                        serviceSubtaskStatistic.setFollowUpSuccessAgain(serviceSubtaskStatistic.getFollowUpSuccessAgain() + 1L);
                        followUpSuccessAgainInfo.add(serviceSubtask);
                    }
                    //再次随访人工(统计不执行)
                    if (serviceSubtask.getSendstate() != null
                            && serviceSubtask.getPreachform().equals("1")) {
                    if (serviceSubtask.getSendstate() != null && serviceSubtask.getPreachform().equals("1")) {
                        serviceSubtaskStatistic.setManualAgain(serviceSubtaskStatistic.getManualAgain() + 1L);
                        manualAgainInfo.add(serviceSubtask);
                    }
                    //再次随访短信(统计不执行)
                    if (serviceSubtask.getSendstate() != null
                            && serviceSubtask.getPreachform().equals("4")) {
                    if (serviceSubtask.getSendstate() != null && serviceSubtask.getPreachform().equals("4")) {
                        serviceSubtaskStatistic.setSmsAgain(serviceSubtaskStatistic.getSmsAgain() + 1L);
                        smsAgainInfo.add(serviceSubtask);
                    }
                    //再次随访微信(统计不执行)
                    if (serviceSubtask.getSendstate() != null
                            && serviceSubtask.getPreachform().equals("5")) {
                    if (serviceSubtask.getSendstate() != null && serviceSubtask.getPreachform().equals("5")) {
                        serviceSubtaskStatistic.setWeChatAgain(serviceSubtaskStatistic.getWeChatAgain() + 1L);
                        wechatAgainInfo.add(serviceSubtask);
                    }
@@ -2919,7 +2913,7 @@
        //获取随访统计
        List<Long> subTaskIds = new ArrayList<>();
        if(ObjectUtils.isNotEmpty(serviceSubtaskList)){
        if (ObjectUtils.isNotEmpty(serviceSubtaskList)) {
            subTaskIds = serviceSubtaskList.stream().map(ServiceSubtask::getId)      // æå–字段
                    .filter(Objects::nonNull)       // è¿‡æ»¤ null å€¼
                    .filter(id -> ObjectUtils.isNotEmpty(id))  // è¿‡æ»¤ç©ºå­—符串(可选)
@@ -3208,8 +3202,7 @@
        List<String> groupKeyList = serviceSubtaskMapper.getSfStatisticsGroupKey(serviceSubtaskCountReq);
        serviceSubtaskCountReq.setGroupKeyList(groupKeyList);
        List<ServiceSubtask> rawData = serviceSubtaskMapper.getSfStatistics(serviceSubtaskCountReq);
        switch (groupKey)
        {
        switch (groupKey) {
            case "deptcode":
                collect = rawData.stream().collect(Collectors.groupingBy(subtask -> Optional.ofNullable(subtask.getDeptcode()).orElse("Unknown")));
                break;
@@ -3231,10 +3224,10 @@
                continue;
            }
            ServiceSubtaskStatistic statistic = getStatisticCategory(serviceSubtaskList, serviceSubtaskCountReq);
            if(ObjectUtils.isNotEmpty(jsRates)){
            if (ObjectUtils.isNotEmpty(jsRates)) {
                Map<String, Object> jsRateMap = jsRates.get(collectKey);
                BigDecimal jsRate = new BigDecimal("0");
                if(ObjectUtils.isNotEmpty(jsRateMap) && ObjectUtils.isNotEmpty(jsRateMap.get("rate"))){
                if (ObjectUtils.isNotEmpty(jsRateMap) && ObjectUtils.isNotEmpty(jsRateMap.get("rate"))) {
                    jsRate = new BigDecimal(jsRateMap.get("rate").toString());
                }
                Double jsRateDouble = (jsRate.setScale(4, RoundingMode.HALF_UP)).doubleValue();
@@ -3254,14 +3247,14 @@
                BigDecimal finishedSum = new BigDecimal(0);
                //完成比例
                Double finishedPercentage = null;
                if(ObjectUtils.isNotEmpty(serviceSubtaskStatistic.getJoyCount())){
                if (ObjectUtils.isNotEmpty(serviceSubtaskStatistic.getJoyCount())) {
                    finishedSum = new BigDecimal(serviceSubtaskStatistic.getJoyCount());
                }
                if(ObjectUtils.isNotEmpty(serviceSubtaskStatistic.getJoyAllCount())){
                if (ObjectUtils.isNotEmpty(serviceSubtaskStatistic.getJoyAllCount())) {
                    sum = new BigDecimal(serviceSubtaskStatistic.getJoyAllCount());
                }
                if(sum.intValue() != 0){
                if (sum.intValue() != 0) {
                    finishedPercentage = finishedSum.divide(sum, 2, RoundingMode.HALF_UP).doubleValue();
                }
                serviceSubtaskStatistic.setJoyAllCount(sum.intValue());
@@ -3279,7 +3272,7 @@
        List<ServiceSubtaskScriptCount> allCounts = new ArrayList<>();
        List<ServiceSubtaskScriptCount> allItemCounts = new ArrayList<>();
        String type = serviceSubtaskCountReq.getType();
        if(ObjectUtils.isEmpty(type)){
        if (ObjectUtils.isEmpty(type)) {
            //查询语音统计明细
            serviceSubtaskCountReq.setType("1");
            List<ServiceSubtaskScriptCount> ivyCounts = serviceSubtaskMapper.getSfStatisticsScriptDetails(serviceSubtaskCountReq);
@@ -3294,26 +3287,24 @@
            allCounts.addAll(svyCounts);
            allItemCounts.addAll(ivyItemCounts);
            allItemCounts.addAll(svyItemCounts);
        }else {
        } else {
            allCounts = serviceSubtaskMapper.getSfStatisticsScriptDetails(serviceSubtaskCountReq);
            allItemCounts = serviceSubtaskMapper.getSfStatisticsScriptItemDetails(serviceSubtaskCountReq);
        }
        for(ServiceSubtaskScriptCount count : allCounts){
        for (ServiceSubtaskScriptCount count : allCounts) {
            Map<String, ServiceSubtaskScriptCount> itemCountMap = new HashMap<>();
            //问卷加上空白选项
            if(ObjectUtils.isNotEmpty(count.getTemplateid())
                    && ObjectUtils.isNotEmpty(count.getSubtaskType())
                    && count.getSubtaskType().equals("2")){
            if (ObjectUtils.isNotEmpty(count.getTemplateid()) && ObjectUtils.isNotEmpty(count.getSubtaskType()) && count.getSubtaskType().equals("2")) {
                SvyTaskTemplateScriptVO svyTaskTemplateScriptVO = new SvyTaskTemplateScriptVO();
                svyTaskTemplateScriptVO.setId(count.getScriptid());
                svyTaskTemplateScriptVO.setOrgid(serviceSubtaskCountReq.getOrgid());
                SvyTaskTemplateScriptVO svyTaskTemplateScriptResultVo = svyTaskTemplateScriptService.selectInfoByCondition(svyTaskTemplateScriptVO);
                if(ObjectUtils.isNotEmpty(svyTaskTemplateScriptResultVo)){
                if (ObjectUtils.isNotEmpty(svyTaskTemplateScriptResultVo)) {
                    List<SvyTaskTemplateTargetoption> svyTaskTemplateTargetoptions = svyTaskTemplateScriptResultVo.getSvyTaskTemplateTargetoptions();
                    if(ObjectUtils.isNotEmpty(svyTaskTemplateTargetoptions)){
                    if (ObjectUtils.isNotEmpty(svyTaskTemplateTargetoptions)) {
                        //填入空白信息
                        svyTaskTemplateTargetoptions.forEach(targetoption ->{
                        svyTaskTemplateTargetoptions.forEach(targetoption -> {
                            ServiceSubtaskScriptCount emptyCount = new ServiceSubtaskScriptCount();
                            emptyCount.setScriptid(count.getScriptid());
                            emptyCount.setScriptContent(count.getScriptContent());
@@ -3326,14 +3317,14 @@
                            emptyCount.setChosenQuantity(0);
                            emptyCount.setChosenPercentage("0.0");
                            emptyCount.setOptionText(targetoption.getOptioncontent());
                            itemCountMap.put(targetoption.getOptioncontent(),emptyCount);
                            itemCountMap.put(targetoption.getOptioncontent(), emptyCount);
                        });
                    }
                }
            }
            allItemCounts.forEach(itemCount ->{
                if(ObjectUtils.isNotEmpty(count.getScriptid()) && ObjectUtils.isNotEmpty(itemCount.getScriptid())){
                    if(count.getScriptid().equals(itemCount.getScriptid())){
            allItemCounts.forEach(itemCount -> {
                if (ObjectUtils.isNotEmpty(count.getScriptid()) && ObjectUtils.isNotEmpty(itemCount.getScriptid())) {
                    if (count.getScriptid().equals(itemCount.getScriptid())) {
                        //放入统计信息
                        itemCount.setScriptContent(count.getScriptContent());
                        itemCount.setScriptType(count.getScriptType());
@@ -3343,9 +3334,9 @@
                        itemCount.setCompletedPercentage(count.getCompletedPercentage());
                        itemCount.setTemplateid(count.getTemplateid());
                        //计算选择比例
                        int chosenQuantity = ObjectUtils.isNotEmpty(itemCount.getChosenQuantity())?itemCount.getChosenQuantity():0;
                        int chosenQuantity = ObjectUtils.isNotEmpty(itemCount.getChosenQuantity()) ? itemCount.getChosenQuantity() : 0;
                        int completedQuantity = itemCount.getCompletedQuantity();
                        if(ObjectUtils.isNotEmpty(completedQuantity) && completedQuantity != 0){
                        if (ObjectUtils.isNotEmpty(completedQuantity) && completedQuantity != 0) {
                            BigDecimal chosenPercentage = (new BigDecimal(chosenQuantity)).divide(new BigDecimal(completedQuantity), 2, RoundingMode.HALF_UP);
                            itemCount.setChosenPercentage(chosenPercentage.toString());
                        }
@@ -3355,7 +3346,7 @@
            });
            List<ServiceSubtaskScriptCount> itemCounts = new ArrayList<>(itemCountMap.values());
            count.setDetails(itemCounts);
            result.put(count.getScriptid().toString(),count);
            result.put(count.getScriptid().toString(), count);
        }
        return result;
    }
@@ -3369,8 +3360,7 @@
     * @return
     */
    public Boolean setFailPreachForm(ServiceSubtask serviceSubtask, String preachform, String remark, String failSendstate) {
        log.info("setFailPreachForm éšè®¿æµç¨‹å¤„理 serviceSubtask:{}, preachform:{}, remark:{}, failSendstate:{}",
                serviceSubtask, preachform, remark, failSendstate);
        log.info("setFailPreachForm éšè®¿æµç¨‹å¤„理 serviceSubtask:{}, preachform:{}, remark:{}, failSendstate:{}", serviceSubtask, preachform, remark, failSendstate);
        //将状态设置为失败
        ServiceSubtaskPreachform serviceSubtaskPreachform = new ServiceSubtaskPreachform();
        serviceSubtaskPreachform.setSubid(serviceSubtask.getId());
@@ -3437,6 +3427,7 @@
    /**
     * è®¡ç®—总计行
     *
     * @param statistics ç»Ÿè®¡æ•°æ®åˆ—表
     * @return æ€»è®¡è¡Œæ•°æ®
     */
@@ -3544,8 +3535,8 @@
            diagname.setLongSendTime(subtask.getLongSendTime());
            diagname.setEndtime(subtask.getEndtime());
            //计算出院天数
            if(!Objects.isNull(diagname.getEndtime())){
                Integer endDay = DateUtils.differentDaysByMillisecond(diagname.getEndtime(),new Date());
            if (!Objects.isNull(diagname.getEndtime())) {
                Integer endDay = DateUtils.differentDaysByMillisecond(diagname.getEndtime(), new Date());
                diagname.setEndDay(endDay);
            }
            diagname.setSfzh(subtask.getSfzh());
smartor/src/main/java/com/smartor/service/impl/ServiceTaskServiceImpl.java
@@ -10,6 +10,7 @@
import com.ruoyi.common.utils.DateUtils;
import com.ruoyi.common.utils.DtoConversionUtils;
import com.ruoyi.common.utils.http.HttpUtils;
import com.smartor.domain.entity.ServiceSubtaskEntity;
import org.apache.commons.lang3.ObjectUtils;
import org.apache.commons.lang3.StringUtils;
import com.smartor.domain.*;
@@ -169,7 +170,7 @@
        serviceSubtask.setTaskid(taskid);
        //查询子任务
        ServiceSubtaskVO serviceSubtaskVO = DtoConversionUtils.sourceToTarget(serviceSubtask, ServiceSubtaskVO.class);
        ServiceSubtaskEntity serviceSubtaskVO = DtoConversionUtils.sourceToTarget(serviceSubtask, ServiceSubtaskEntity.class);
        List<ServiceSubtask> serviceSubtaskList = serviceSubtaskMapper.selectServiceSubtaskList(serviceSubtaskVO);
        for (ServiceSubtask ss : serviceSubtaskList) {
            log.error("sfSend需要移除的subId为:{}", ss.getId().toString());
@@ -231,7 +232,7 @@
    @Override
    public Map<String, Object> getScriptInfoByCondition(Long taskid, Long patid, Boolean isFinish, String patfrom) {
        Map<String, Object> map = new HashMap<>();
        ServiceSubtaskVO serviceSubtaskVO = new ServiceSubtaskVO();
        ServiceSubtaskEntity serviceSubtaskVO = new ServiceSubtaskEntity();
        serviceSubtaskVO.setPatid(patid);
        serviceSubtaskVO.setTaskid(taskid);
        serviceSubtaskVO.setSendstate(3L);
@@ -338,7 +339,7 @@
        }
        //判断一下今天是否已经做过题,做过就不让再做了
        ServiceSubtaskVO serviceSubtaskVO = new ServiceSubtaskVO();
        ServiceSubtaskEntity serviceSubtaskVO = new ServiceSubtaskEntity();
        serviceSubtaskVO.setTaskid(taskid);
        serviceSubtaskVO.setPatid(patArchive.getId());
        serviceSubtaskVO.setVisitTime(new Date());
@@ -468,7 +469,7 @@
    private List wjInfo(ServiceTask serviceTask, Long patid, Boolean isFinish, String patfrom) {
        //用户点击了外链,就算他领取了
        //这样做会有一个问题,如果固定任务,会出现一个任务里,有多个该患者
        ServiceSubtaskVO serviceSubtaskVO = new ServiceSubtaskVO();
        ServiceSubtaskEntity serviceSubtaskVO = new ServiceSubtaskEntity();
        serviceSubtaskVO.setTaskid(serviceTask.getTaskid());
        serviceSubtaskVO.setPatid(patid);
        List<ServiceSubtask> serviceSubtaskList = serviceSubtaskMapper.selectServiceSubtaskList(serviceSubtaskVO);
smartor/src/main/java/com/smartor/service/impl/SvyTaskSingleServiceImpl.java
@@ -12,6 +12,7 @@
import com.smartor.common.LSHospTokenUtil;
import com.smartor.common.LyraTokenUtil;
import com.smartor.domain.*;
import com.smartor.domain.entity.ServiceSubtaskEntity;
import com.smartor.mapper.BaseOrganizationMapper;
import com.smartor.mapper.ServiceSubtaskMapper;
import com.smartor.service.IServiceTaskService;
@@ -98,7 +99,7 @@
            iServiceTaskService.updateServiceTask(serviceTask2);
            //获取到该任务所有的服务,并从队列里删除
            ServiceSubtaskVO serviceSubtaskVO = new ServiceSubtaskVO();
            ServiceSubtaskEntity serviceSubtaskVO = new ServiceSubtaskEntity();
            serviceSubtaskVO.setTaskid(serviceTask2.getTaskid());
            serviceSubtaskVO.setSendstate(2L);
            List<ServiceSubtask> serviceSubtaskList = serviceSubtaskMapper.selectServiceSubtaskList(serviceSubtaskVO);
@@ -152,7 +153,7 @@
    public ServiceTaskVO queryTaskByCondition(ServiceSubtask serviceSubtask) {
        //定义患者与单一任务关联表集合
        List<PatTaskRelevance> patTaskRelevances = new ArrayList<>();
        ServiceSubtaskVO serviceSubtaskVO = new ServiceSubtaskVO();
        ServiceSubtaskEntity serviceSubtaskVO = new ServiceSubtaskEntity();
        serviceSubtaskVO.setTaskid(serviceSubtask.getTaskid());
        List<ServiceSubtask> selectServiceSubtaskList = serviceSubtaskMapper.selectServiceSubtaskList(serviceSubtaskVO);
        if (CollectionUtils.isEmpty(selectServiceSubtaskList) || selectServiceSubtaskList.size() == 0) {
@@ -283,7 +284,7 @@
        serviceSubtask.setCreateTime(new Date());
        serviceSubtask.setLeavehospitaldistrictcode(serviceTaskVO.getDistrictcode());
        //先查询一遍,该taskGuid是否存在
        ServiceSubtaskVO serviceSubtaskVO = new ServiceSubtaskVO();
        ServiceSubtaskEntity serviceSubtaskVO = new ServiceSubtaskEntity();
        serviceSubtaskVO.setTaskGuid(serviceTaskVO.getTaskguid());
        List<ServiceSubtask> serviceSubtaskList = serviceSubtaskMapper.selectServiceSubtaskList(serviceSubtaskVO);
        if (CollectionUtils.isNotEmpty(serviceSubtaskList)) {
smartor/src/main/resources/mapper/smartor/ServiceSubtaskMapper.xml
@@ -87,6 +87,11 @@
        <result property="currentPreachform" column="current_preachform"/>
        <result property="taskSituation" column="task_situation"/>
        <result property="isabnormal" column="isabnormal"/>
        <result property="continueFlag" column="continue_flag"/>
        <result property="continueTimeNow" column="continue_time_now"/>
        <result property="continueContent" column="continue_content"/>
        <result property="continueCount" column="continue_count"/>
        <result property="continueTimeNext" column="continue_time_next"/>
    </resultMap>
    <resultMap type="com.smartor.domain.ServiceSubtaskCount" id="ServiceSubtaskResult2">
@@ -202,11 +207,16 @@
               visit_type,
               management_doctor,
               management_doctor_code,
               continue_flag,
               continue_time_now,
               continue_content,
               continue_count,
               continue_time_next,
               task_situation
        from service_subtask
    </sql>
    <select id="selectServiceSubtaskBySendstate" parameterType="com.smartor.domain.ServiceSubtaskVO"
    <select id="selectServiceSubtaskBySendstate" parameterType="com.smartor.domain.entity.ServiceSubtaskEntity"
            resultMap="ServiceSubtaskResult">
        <include refid="selectServiceSubtaskVo"/>
        where 1=1
@@ -215,6 +225,10 @@
            and orgid = #{orgid}
        </if>
        <if test="taskid != null ">and taskid = #{taskid}</if>
        <if test="continueFlag != null ">and continue_flag = #{continueFlag}</if>
        <if test="continueTimeNow != null ">and continue_time_now = #{continueTimeNow}</if>
        <if test="continueCount != null ">and continue_count = #{continueCount}</if>
        <if test="continueTimeNext != null ">and continue_time_next = #{continueTimeNext}</if>
        <if test="serviceType != null ">and service_type = #{serviceType}</if>
        <if test="patid != null ">and patid = #{patid}</if>
        <if test="sendstates!=null">
@@ -226,7 +240,7 @@
        </if>
    </select>
    <select id="queryServiceSubtaskList" parameterType="com.smartor.domain.ServiceSubtaskVO"
    <select id="queryServiceSubtaskList" parameterType="com.smartor.domain.entity.ServiceSubtaskEntity"
            resultMap="ServiceSubtaskResult">
        <include refid="selectServiceSubtaskVo"/>
        where 1=1
@@ -239,15 +253,22 @@
            AND date_format(visit_time,'%y%m%d') &lt;= date_format(#{visitTime},'%y%m%d')
        </if>
        <if test="sendstate != null ">and sendstate = #{sendstate}</if>
        <if test="continueFlag != null ">and continue_flag = #{continueFlag}</if>
        <if test="continueTimeNow != null ">and continue_time_now = #{continueTimeNow}</if>
        <if test="continueCount != null ">and continue_count = #{continueCount}</if>
        <if test="continueTimeNext != null ">and continue_time_next = #{continueTimeNext}</if>
    </select>
    <select id="selectServiceSubtaskList" parameterType="com.smartor.domain.ServiceSubtaskVO"
    <select id="selectServiceSubtaskList" parameterType="com.smartor.domain.entity.ServiceSubtaskEntity"
            resultMap="ServiceSubtaskResult">
        <include refid="selectServiceSubtaskVo"/>
        where 1=1
        and del_flag = 0
        <if test="continueFlag != null ">and continue_flag = #{continueFlag}</if>
        <if test="continueTimeNow != null ">and continue_time_now = #{continueTimeNow}</if>
        <if test="continueCount != null ">and continue_count = #{continueCount}</if>
        <if test="continueTimeNext != null ">and continue_time_next = #{continueTimeNext}</if>
        <if test="sendname != null  and sendname != ''">and sendname like concat('%', #{sendname}, '%')</if>
        <if test="phone != null  and phone != ''">and phone = #{phone}</if>
        <if test="leavehospitaldistrictcode != null  and leavehospitaldistrictcode != ''">and
@@ -412,7 +433,7 @@
        <if test="sort != null  and sort==8">order by visit_time desc</if>
        <if test="pageSize != null  and pageNum != null">limit ${pageSize} OFFSET ${pageNum}</if>
    </select>
    <select id="getCompensateServiceSubtaskList" parameterType="com.smartor.domain.ServiceSubtaskVO"
    <select id="getCompensateServiceSubtaskList" parameterType="com.smartor.domain.entity.ServiceSubtaskEntity"
            resultMap="ServiceSubtaskResult">
        <include refid="selectServiceSubtaskVo"/>
        where del_flag = 0
@@ -423,9 +444,13 @@
            AND date_format(visit_time,'%y%m%d') &lt;= date_format(#{visitTime},'%y%m%d')
        </if>
        <if test="sendstate != null ">and sendstate = #{sendstate}</if>
        <if test="continueFlag != null ">and continue_flag = #{continueFlag}</if>
        <if test="continueTimeNow != null ">and continue_time_now = #{continueTimeNow}</if>
        <if test="continueCount != null ">and continue_count = #{continueCount}</if>
        <if test="continueTimeNext != null ">and continue_time_next = #{continueTimeNext}</if>
    </select>
    <select id="selectServiceSubtaskListByCreateTime" parameterType="com.smartor.domain.ServiceSubtaskVO"
    <select id="selectServiceSubtaskListByCreateTime" parameterType="com.smartor.domain.entity.ServiceSubtaskEntity"
            resultMap="ServiceSubtaskResult">
        <include refid="selectServiceSubtaskVo"/>
        where del_flag = 0
@@ -448,11 +473,15 @@
        <if test="managementDoctor != null">and management_doctor = #{managementDoctor}</if>
        <if test="currentPreachform != null">and current_preachform = #{currentPreachform}</if>
        <if test="isabnormal != null">and isabnormal = #{isabnormal}</if>
        <if test="continueFlag != null ">and continue_flag = #{continueFlag}</if>
        <if test="continueTimeNow != null ">and continue_time_now = #{continueTimeNow}</if>
        <if test="continueCount != null ">and continue_count = #{continueCount}</if>
        <if test="continueTimeNext != null ">and continue_time_next = #{continueTimeNext}</if>
    </select>
    <select id="selectServiceSubtaskListAgain" parameterType="com.smartor.domain.ServiceSubtaskVO"
    <select id="selectServiceSubtaskListAgain" parameterType="com.smartor.domain.entity.ServiceSubtaskEntity"
            resultMap="ServiceSubtaskResult">
        <include refid="selectServiceSubtaskVo"/>
        where 1=1
@@ -505,7 +534,10 @@
        <if test="managementDoctorCode != null">and management_doctor_code = #{managementDoctorCode}</if>
        <if test="isabnormal != null">and isabnormal = #{isabnormal}</if>
        <if test="managementDoctor != null">and management_doctor like concat('%',#{managementDoctor}, '%')</if>
        <if test="continueFlag != null ">and continue_flag = #{continueFlag}</if>
        <if test="continueTimeNow != null ">and continue_time_now = #{continueTimeNow}</if>
        <if test="continueCount != null ">and continue_count = #{continueCount}</if>
        <if test="continueTimeNext != null ">and continue_time_next = #{continueTimeNext}</if>
    </select>
    <select id="selectSendstateByCondition" parameterType="com.smartor.domain.ServiceSubtask" resultType="Integer">
@@ -640,6 +672,10 @@
        <if test="taskName != null">and task_name like concat('%',#{taskName}, '%')</if>
        <if test="sendstate != null">and sendstate = #{sendstate}</if>
        <if test="orgid != null">and orgid =#{orgid}</if>
        <if test="continueFlag != null ">and continue_flag = #{continueFlag}</if>
        <if test="continueTimeNow != null ">and continue_time_now = #{continueTimeNow}</if>
        <if test="continueCount != null ">and continue_count = #{continueCount}</if>
        <if test="continueTimeNext != null ">and continue_time_next = #{continueTimeNext}</if>
        GROUP BY sendname,sendstate,starttime,endtime,nurse_name,phone,sex,task_name,leavediagname,visit_time ORDER BY
        visit_time
        <if test="pageSize != null  and pageNum != null">limit ${pageSize} OFFSET ${pageNum}</if>
@@ -733,6 +769,11 @@
            <if test="currentPreachform != null">current_preachform,</if>
            <if test="taskSituation != null">task_situation,</if>
            <if test="isabnormal != null">isabnormal,</if>
            <if test="continueFlag != null ">continue_flag,</if>
            <if test="continueTimeNow != null ">continue_time_now,</if>
            <if test="continueCount != null ">continue_count,</if>
            <if test="continueTimeNext != null ">continue_time_next,</if>
            <if test="continueContent != null ">continue_content,</if>
        </trim>
        <trim prefix="values (" suffix=")" suffixOverrides=",">
            <if test="sendname != null">#{sendname},</if>
@@ -819,6 +860,11 @@
            <if test="currentPreachform != null">#{currentPreachform},</if>
            <if test="taskSituation != null">#{taskSituation},</if>
            <if test="isabnormal != null">#{isabnormal},</if>
            <if test="continueFlag != null ">#{continueFlag},</if>
            <if test="continueTimeNow != null ">#{continueTimeNow},</if>
            <if test="continueCount != null ">#{continueCount},</if>
            <if test="continueTimeNext != null ">#{continueTimeNext},</if>
            <if test="continueContent != null ">#{continueContent},</if>
        </trim>
    </insert>
@@ -910,6 +956,11 @@
            <if test="currentPreachform != null">current_preachform=#{currentPreachform},</if>
            <if test="taskSituation != null">task_situation=#{taskSituation},</if>
            <if test="isabnormal != null">isabnormal=#{isabnormal},</if>
            <if test="continueFlag != null ">continue_flag = #{continueFlag},</if>
            <if test="continueTimeNow != null ">continue_time_now = #{continueTimeNow},</if>
            <if test="continueCount != null ">continue_count = #{continueCount},</if>
            <if test="continueTimeNext != null ">continue_time_next = #{continueTimeNext},</if>
            <if test="continueContent != null ">continue_content = #{continueContent},</if>
        </trim>
        where id = #{id}
    </update>
@@ -1002,6 +1053,11 @@
            <if test="currentPreachform != null">current_preachform=#{currentPreachform},</if>
            <if test="taskSituation != null">task_situation=#{taskSituation},</if>
            <if test="isabnormal != null">isabnormal=#{isabnormal},</if>
            <if test="continueFlag != null ">continue_flag = #{continueFlag},</if>
            <if test="continueTimeNow != null ">continue_time_now = #{continueTimeNow},</if>
            <if test="continueCount != null ">continue_count = #{continueCount},</if>
            <if test="continueTimeNext != null ">continue_time_next = #{continueTimeNext},</if>
            <if test="continueContent != null ">continue_content = #{continueContent},</if>
        </trim>
        where 1=1
        <if test="patid != null ">and patid = #{patid}</if>
@@ -1098,6 +1154,11 @@
            <if test="currentPreachform != null">current_preachform=#{currentPreachform},</if>
            <if test="taskSituation != null">task_situation=#{taskSituation},</if>
            <if test="isabnormal != null">isabnormal=#{isabnormal},</if>
            <if test="continueFlag != null ">continue_flag = #{continueFlag},</if>
            <if test="continueTimeNow != null ">continue_time_now = #{continueTimeNow},</if>
            <if test="continueCount != null ">continue_count = #{continueCount},</if>
            <if test="continueTimeNext != null ">continue_time_next = #{continueTimeNext},</if>
            <if test="continueContent != null ">continue_content = #{continueContent},</if>
        </trim>
        where patid = #{patid} and taskid = #{taskid}
    </update>
@@ -1189,6 +1250,11 @@
            <if test="currentPreachform != null">current_preachform=#{currentPreachform},</if>
            <if test="taskSituation != null">task_situation=#{taskSituation},</if>
            <if test="isabnormal != null">isabnormal=#{isabnormal},</if>
            <if test="continueFlag != null ">continue_flag = #{continueFlag},</if>
            <if test="continueTimeNow != null ">continue_time_now = #{continueTimeNow},</if>
            <if test="continueCount != null ">continue_count = #{continueCount},</if>
            <if test="continueTimeNext != null ">continue_time_next = #{continueTimeNext},</if>
            <if test="continueContent != null ">continue_content = #{continueContent},</if>
        </trim>
        where task_guid = #{taskGuid} and task_name = #{taskName}
    </update>
@@ -1243,6 +1309,11 @@
        send_type,
        recordid,
        exrecallcount,
        continue_flag,
        continue_time_now,
        continue_content,
        continue_count,
        continue_time_next,
        task_situation
        from service_subtask
        where 1=1
@@ -1278,6 +1349,10 @@
        <if test="visitDeptCode != null">and visit_dept_code = #{visitDeptCode}</if>
        <if test="visitDeptName != null">and visit_dept_name = #{visitDeptName}</if>
        <if test="isabnormal != null">and isabnormal = #{isabnormal}</if>
        <if test="continueFlag != null ">and continue_flag = #{continueFlag}</if>
        <if test="continueTimeNow != null ">and continue_time_now = #{continueTimeNow}</if>
        <if test="continueCount != null ">and continue_count = #{continueCount}</if>
        <if test="continueTimeNext != null ">and continue_time_next = #{continueTimeNext}</if>
        <!-- ç›®å‰åªç»Ÿè®¡è¯­éŸ³å’Œé—®å· -->
        <if test="type != null">
            and type = #{type}
@@ -1330,6 +1405,10 @@
        <if test="visitDeptCode != null">and visit_dept_code = #{visitDeptCode}</if>
        <if test="visitDeptName != null">and visit_dept_name = #{visitDeptName}</if>
        <if test="isabnormal != null">and isabnormal = #{isabnormal}</if>
        <if test="continueFlag != null ">and continue_flag = #{continueFlag}</if>
        <if test="continueTimeNow != null ">and continue_time_now = #{continueTimeNow}</if>
        <if test="continueCount != null ">and continue_count = #{continueCount}</if>
        <if test="continueTimeNext != null ">and continue_time_next = #{continueTimeNext}</if>
        <!-- ç›®å‰åªç»Ÿè®¡è¯­éŸ³å’Œé—®å· -->
        <if test="type != null">
            and type = #{type}
@@ -2003,7 +2082,7 @@
    </select>
    <!-- ä¼˜åŒ–的统计查询:直接在数据库层完成聚合计算 -->
    <select id="countByCondition" parameterType="com.smartor.domain.ServiceSubtaskVO" resultType="map">
    <select id="countByCondition" parameterType="com.smartor.domain.entity.ServiceSubtaskEntity" resultType="map">
        SELECT
        SUM(CASE WHEN sendstate = 4 THEN 1 ELSE 0 END) AS wzx,
        SUM(CASE WHEN sendstate != 4 AND sendstate != 2 THEN 1 ELSE 0 END) AS ysf,