liusheng
5 天以前 c71fe5ffd8b8552e75fe03205a3ddf85d2840b5e
1.新增省立同德延续随访统计

2.给数据库连接加超时时间
已修改12个文件
已添加1个文件
532 ■■■■■ 文件已修改
ruoyi-admin/src/main/java/com/ruoyi/web/controller/smartor/ServiceSubtaskController.java 41 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/resources/application-ls.yml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/resources/application-sltd.yml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/resources/application-xh.yml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/RyTask.java 24 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/domain/ServiceSubtask.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/domain/VO/ServiceSubtaskCotinueCountVO.java 31 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/mapper/ServiceSubtaskMapper.java 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/service/IServiceSubtaskService.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/service/impl/PatMedInhospServiceImpl.java 54 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/service/impl/ServiceSubtaskServiceImpl.java 68 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/resources/mapper/smartor/PatMedInhospMapper.xml 219 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/resources/mapper/smartor/ServiceSubtaskMapper.xml 60 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/controller/smartor/ServiceSubtaskController.java
@@ -1,11 +1,8 @@
package com.ruoyi.web.controller.smartor;
import com.github.pagehelper.ISelect;
import com.github.pagehelper.Page;
import com.ruoyi.common.annotation.AddOrgId;
import com.ruoyi.common.annotation.Log;
import com.ruoyi.common.constant.CacheConstants;
import com.ruoyi.common.constant.Constants;
import com.ruoyi.common.constant.HttpStatus;
import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.domain.AjaxResult;
@@ -22,34 +19,26 @@
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.common.utils.poi.ExcelUtil;
import com.ruoyi.common.utils.reflect.ReflectUtils;
import com.ruoyi.common.utils.uuid.IdUtils;
import com.ruoyi.system.domain.SysConfig;
import com.ruoyi.system.service.ISysConfigService;
import com.ruoyi.system.service.ISysUserDeptService;
import com.smartor.domain.*;
import com.smartor.domain.VO.ServiceSubtaskCotinueCountVO;
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;
import com.smartor.service.IServiceSubtaskService;
import com.smartor.service.IServiceTaskService;
import com.smartor.service.impl.ServiceSubtaskServiceImpl;
import com.sun.org.apache.bcel.internal.generic.NEW;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import net.bytebuddy.implementation.bytecode.Throw;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.collections4.MapUtils;
import org.apache.commons.lang3.ObjectUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletResponse;
import java.text.DecimalFormat;
import java.time.LocalDate;
import java.util.ArrayList;
import java.util.HashMap;
@@ -559,9 +548,7 @@
    @PostMapping("/getSfStatisticsExport")
    public void export(HttpServletResponse response, ServiceSubtaskCountReq serviceSubtaskCountReq) {
        List<ServiceSubtaskStatistic> sfStatistics = serviceSubtaskService.getSfStatisticsExport(serviceSubtaskCountReq);
        ExcelUtil<ServiceSubtaskStatistic> util = new ExcelUtil<ServiceSubtaskStatistic>(ServiceSubtaskStatistic.class);
        String sheetName = "";
        String fileName = "";
        if (active.equals("ls") || active.equals("druid")) {
@@ -599,6 +586,30 @@
        }
        return success(serviceSubtaskService.getSfStatisticsJoydetails(serviceSubtaskCountReq));
    }
    /**
     * å»¶ç»­æŠ¤ç†ç»Ÿè®¡
     */
    @ApiOperation("延续护理统计")
    @AddOrgId(field = "orgid", paramIndex = 0, campusField = "campusid")
    @PostMapping("/getContinueNerseCount")
    public AjaxResult getContinueNerseCount(@RequestBody ServiceSubtaskCotinueCountVO serviceSubtaskCotinueCountVO) {
        SysUser user = getLoginUser().getUser();
        serviceSubtaskCotinueCountVO.setOrgid(user.getOrgid());
        serviceSubtaskCotinueCountVO.setCampusid(user.getCampusid());
        boolean hasDistrict = !CollectionUtils.isEmpty(serviceSubtaskCotinueCountVO.getLeavehospitaldistrictcodes());
        boolean hasDept = !CollectionUtils.isEmpty(serviceSubtaskCotinueCountVO.getDeptcodes());
        if (hasDistrict && hasDept) {
            return error("病区Code集合与科室Code集合互斥,不能同时传入");
        }
        return success(serviceSubtaskService.getContinueNurseCount(serviceSubtaskCotinueCountVO));
    }
    /**
     * èŽ·å–éšè®¿åˆ†ç±»ç»Ÿè®¡æ˜Žç»†
@@ -715,4 +726,6 @@
        }
        return map;
    }
}
ruoyi-admin/src/main/resources/application-ls.yml
@@ -11,7 +11,7 @@
        #        username: smartor
        #        password: Smartor.2023
        #        driverClassName: com.mysql.cj.jdbc.Driver
        url: jdbc:mysql://9.209.1.5:2883/smartor-lisui?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
        url: jdbc:mysql://9.209.1.5:2883/smartor-lisui?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&connectTimeout=60000&socketTimeout=120000
        username: root@sfxx#other_cluster02
        password: Y5oapyS8
        driverClassName: com.mysql.cj.jdbc.Driver
ruoyi-admin/src/main/resources/application-sltd.yml
@@ -7,7 +7,7 @@
      # ä¸»åº“数据源
      master:
        #        çœç«‹åŒå¾·
        url: jdbc:mysql://192.88.117.237:3306/smartor_sltd?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
        url: jdbc:mysql://192.88.117.237:3306/smartor_sltd?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&connectTimeout=60000&socketTimeout=120000
        username: root
        password: Smartor.2023
        driverClassName: com.mysql.cj.jdbc.Driver
ruoyi-admin/src/main/resources/application-xh.yml
@@ -7,7 +7,7 @@
      # ä¸»åº“数据源
      master:
        #   æ–°åŽ
        url: jdbc:mysql://192.168.191.181:3308/smartor?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
        url: jdbc:mysql://192.168.191.181:3308/smartor?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&connectTimeout=60000&socketTimeout=120000
        username: smartor
        password: Smartor.2023
        driverClassName: com.mysql.cj.jdbc.Driver
ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/RyTask.java
@@ -577,20 +577,20 @@
                //2判断一下,当前的sort是不是等于需要执行的总个数,如果等于的话,说明是最后一个,直接将servuce_subtask的状态改成5,执行失败就行了
                Long cs = currentSort.get();
                if (cs.equals(serviceSubtaskPreachforms.size())) {
                    if(serviceSubtask.getPreachform().equals("1")){
                    if (serviceSubtask.getPreachform().equals("1")) {
                        serviceSubtask.setSendstate(7L);
                        serviceSubtask.setRemark("处理补偿任务,当前处理最后补偿 äººå·¥è¶…æ—¶");
                    }else {
                    } else {
                        serviceSubtask.setSendstate(5L);
                        serviceSubtask.setRemark("处理补偿任务,当前处理最后补偿,全部执行失败");
                    }
                    serviceSubtaskMapper.updateServiceSubtask(serviceSubtask);
                    //修改发送方式的状态为失败
                    if(serviceSubtaskPreachform.getPreachform().equals("1")){
                    if (serviceSubtaskPreachform.getPreachform().equals("1")) {
                        serviceSubtaskPreachform.setSendstate("7");
                        serviceSubtaskPreachform.setId(id.get());
                    }else {
                    } else {
                        serviceSubtaskPreachform.setSendstate("5");
                        serviceSubtaskPreachform.setId(id.get());
                    }
@@ -1020,7 +1020,7 @@
                    log.error("getSendPreachform方法 æ£€æŸ¥æ˜¯å¦æ‰€æœ‰sendstate不等于9, å…¨å¤±è´¥äº†");
                    serviceSubtask.setRemark("所有发送方式均未获取结果,任务失败");
                    //人工发送超时
                    if(ObjectUtils.isNotEmpty(serviceSubtask.getCurrentPreachform()) && serviceSubtask.getCurrentPreachform().equals("1")){
                    if (ObjectUtils.isNotEmpty(serviceSubtask.getCurrentPreachform()) && serviceSubtask.getCurrentPreachform().equals("1")) {
                        serviceSubtask.setSendstate(7L);
                        serviceSubtask.setRemark("人工发送超时");
                    }
@@ -1106,7 +1106,7 @@
            subtaskPreachform.setSendstate("5");
            subtaskPreachform.setId(id.get());
            //人工发送超时
            if(ObjectUtils.isNotEmpty(serviceSubtask.getCurrentPreachform()) && serviceSubtask.getCurrentPreachform().equals("1")){
            if (ObjectUtils.isNotEmpty(serviceSubtask.getCurrentPreachform()) && serviceSubtask.getCurrentPreachform().equals("1")) {
                subtaskPreachform.setSendstate("7");
                subtaskPreachform.setRemark("人工发送超时");
            }
@@ -1234,7 +1234,7 @@
                if (failSendstate.equals("2")) serviceSubtaskPreachform1.setSendstate("9");
            }
            serviceSubtaskPreachform1.setRemark(remark);
            if(ObjectUtils.isNotEmpty(preachform) && preachform.equals("1")){
            if (ObjectUtils.isNotEmpty(preachform) && preachform.equals("1")) {
                serviceSubtaskPreachform1.setSendstate("7");
                serviceSubtaskPreachform1.setRemark("人工发送超时");
            }
@@ -1242,16 +1242,18 @@
            //如果当前的preachform已经是最后一个了,那直接将serviceSubtask的sendstate状态改成5就行了(全失败了)
            if (serviceSubtaskPreachform1.getSort() == sspCount.size()) {
                if(ObjectUtils.isNotEmpty(preachform) && preachform.equals("1")){
                if (ObjectUtils.isNotEmpty(preachform) && preachform.equals("1")) {
                    serviceSubtask.setCurrentPreachform(preachform);
                    serviceSubtask.setSendstate(7L);
                    serviceSubtask.setRemark("人工发送超时");
                    serviceSubtaskMapper.updateServiceSubtask(serviceSubtask);
                    return true;
                }else {
                } else {
                    if (failSendstate.equals("4") || failSendstate.equals("5")) {
                        serviceSubtask.setCurrentPreachform(preachform);
                        serviceSubtask.setSendstate(5L);
                        log.error("setSuccessPreachForm方法,当前的preachform已经是最后一个了,全部执行失败");
                        serviceSubtask.setRemark("所有发送方式均未获取结果,任务失败");
                        //serviceSubtask.setRemark("setSuccessPreachForm方法,当前的preachform已经是最后一个了,全部执行失败");
                        serviceSubtaskMapper.updateServiceSubtask(serviceSubtask);
                        return true;
@@ -1266,10 +1268,10 @@
        //将下一次的随访时间与当前执行方式记录一下
        serviceSubtask.setVisitTime(getNextVisitTime(serviceSubtask.getId(), serviceSubtask.getTaskid(), serviceSubtask.getVisitTime()));
        serviceSubtask.setCurrentPreachform(preachform);
        if(ObjectUtils.isNotEmpty(preachform) && preachform.equals("1")){
        if (ObjectUtils.isNotEmpty(preachform) && preachform.equals("1")) {
            serviceSubtask.setSendstate(7L);
            serviceSubtask.setRemark("人工发送超时");
        }else {
        } else {
            serviceSubtask.setSendstate(3L);
        }
        if (serviceSubtask.getType().equals("3") || serviceSubtask.getType().equals("4")) {
smartor/src/main/java/com/smartor/domain/ServiceSubtask.java
@@ -653,7 +653,7 @@
    @ApiModelProperty(value = "异常预警:0绿色;1红色;2黄色; 3已处理")
    private Integer isabnormal;
    @ApiModelProperty(value = "继续标识")
    @ApiModelProperty(value = "继续标识:1否 2是")
    private Integer continueFlag;
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
smartor/src/main/java/com/smartor/domain/VO/ServiceSubtaskCotinueCountVO.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,31 @@
package com.smartor.domain.VO;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.List;
/**
 * å»¶ç»­æŠ¤ç†ç»Ÿè®¡è¯·æ±‚
 *
 * @author ls
 * @date 2026-04-11
 */
@ApiModel(value = "ServiceSubtaskCotinueCountVO", description = "延续护理统计请求")
@Data
public class ServiceSubtaskCotinueCountVO {
    @ApiModelProperty(value = "病区Code集合")
    private List<String> leavehospitaldistrictcodes;
    @ApiModelProperty(value = "科室Code集合")
    private List<String> deptcodes;
    @ApiModelProperty("机构编码")
    private String orgid;
    @ApiModelProperty("院区编码")
    private String campusid;
}
smartor/src/main/java/com/smartor/mapper/ServiceSubtaskMapper.java
@@ -2,6 +2,7 @@
import com.smartor.domain.*;
import com.smartor.domain.VO.PatSatisfactionReqVO;
import com.smartor.domain.VO.ServiceSubtaskCotinueCountVO;
import com.smartor.domain.entity.ServiceSubtaskEntity;
import com.smartor.domain.entity.ServiceSubtaskSatisfactionEntity;
import org.apache.ibatis.annotations.MapKey;
@@ -194,4 +195,20 @@
    List<Long> querySendCount(ServiceSubtaskSatisfactionEntity serviceSubtaskSatisfactionEntity);
    /**
     * æŒ‰ç—…区分组统计延续护理数量
     *
     * @param vo æŸ¥è¯¢æ¡ä»¶
     * @return æ¯ä¸ªç—…区的统计结果
     */
    List<Map<String, Object>> getContinueNurseCount(ServiceSubtaskCotinueCountVO vo);
    /**
     * æŒ‰ç§‘室分组统计延续护理数量
     *
     * @param vo æŸ¥è¯¢æ¡ä»¶
     * @return æ¯ä¸ªç§‘室的统计结果
     */
    List<Map<String, Object>> getContinueNurseCountByDept(ServiceSubtaskCotinueCountVO vo);
}
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.VO.ServiceSubtaskCotinueCountVO;
import com.smartor.domain.entity.ServiceSubtaskEntity;
import org.springframework.web.bind.annotation.RequestBody;
@@ -149,4 +150,13 @@
    public List<ServiceSubtaskDiagname> convertToDiagnameList(List<ServiceSubtask> subtaskList) ;
    public Map<String, Object> getCurrentUserServiceSubtaskCount(ServiceSubtaskEntity entity);
    /**
     * æŒ‰ç—…区或科室统计延续护理数量
     * éƒ½ä¸ä¼ æ—¶åŒæ—¶æŒ‰ç—…区和科室各统计一遍
     *
     * @param vo æŸ¥è¯¢æ¡ä»¶ï¼ˆleavehospitaldistrictcodes ä¸Ž deptcodes äº’斥)
     * @return noContinueCount、ContinueCount åŠ detail åˆ—表
     */
    Map<String, Object> getContinueNurseCount(ServiceSubtaskCotinueCountVO vo);
    }
smartor/src/main/java/com/smartor/service/impl/PatMedInhospServiceImpl.java
@@ -141,16 +141,6 @@
    public PatMedRes selectPatMedInhospListCount(PatMedReq patMedReq) {
        PatMedRes patMedRes = null;
        // èŽ·å–å½“å‰ç™»é™†äººçš„éƒ¨é—¨æƒé™
        if (org.springframework.util.CollectionUtils.isEmpty(patMedReq.getDeptcodeList())) {
//            Long userId = SecurityUtils.getUserId();
//            List<SysDept> sysDepts = sysUserDeptMapper.selectDeptListByUserId(userId);
//            List<String> deptCode = new ArrayList<>();
//            for (SysDept sysDept : sysDepts) {
//                deptCode.add(sysDept.getDeptId().toString());
//            }
//            patMedReq.setDeptcodeList(deptCode);
//            patMedRes = patMedInhospMapper.selectPatMedInhospCount(patMedReq);
        }
        patMedRes = patMedInhospMapper.selectPatMedInhospCount(patMedReq);
        return patMedRes;
    }
@@ -448,6 +438,7 @@
    /**
     * å¤šç»´åº¦éšè®¿
     *
     * @param config
     * @return
     */
@@ -486,14 +477,12 @@
     * æŒ‰ç»´åº¦æ‰¾åˆ°æ‰€æœ‰åŒ¹é…é•¿æœŸä»»åŠ¡ï¼Œæ‰¹é‡ç”Ÿæˆ subtask
     * type: 1=科室, 2=病区, 3=疾病
     */
    private void processTasksByDimension(PatMedInhosp patMedInhosp1,
            PatArchive patArchive,
            String config, int type) {
    private void processTasksByDimension(PatMedInhosp patMedInhosp1, PatArchive patArchive, String config, int type) {
        List<Long> matchedTaskIds = findMatchingTaskIds(patMedInhosp1, type);
        if (CollectionUtils.isEmpty(matchedTaskIds)) {
                String reason = getDimensionReason(type);
                markFlagAsNoConfig(patMedInhosp1, type, reason);
            String reason = getDimensionReason(type);
            markFlagAsNoConfig(patMedInhosp1, type, reason);
            return;
        }
@@ -503,11 +492,11 @@
        }
    }
    private String getDimensionReason(int type){
    private String getDimensionReason(int type) {
        switch (type) {
            case 1: { // ç§‘室
                return "未找到科室匹配的长期任务";
                 }
            }
            case 2: { // ç—…区
                return "未找到病区匹配的长期任务";
            }
@@ -518,9 +507,7 @@
        return "多维长期任务-匹配类型为空";
    }
    private void markFlagAsNoConfig(PatMedInhosp patMedInhosp,
                                    int type,
                                    String reason){
    private void markFlagAsNoConfig(PatMedInhosp patMedInhosp, int type, String reason) {
        switch (type) {
            case 1: { // ç§‘室
                patMedInhosp.setDeptcheckFlag("2");
@@ -544,14 +531,14 @@
    }
    private void markAllFlagsAsError(PatMedInhosp patMedInhosp,
                                    String reason){
    private void markAllFlagsAsError(PatMedInhosp patMedInhosp, String reason) {
        patMedInhosp.setDeptcheckFlag("2");
        patMedInhosp.setWardcheckFlag("2");
        patMedInhosp.setDiagcheckFlag("2");
        patMedInhosp.setRemark(reason);
        patMedInhospMapper.updatePatMedInhosp(patMedInhosp);
    }
    /**
     * æ ¹æ®ç»´åº¦ç±»åž‹æŸ¥è¯¢åŒ¹é…çš„长期任务 ID åˆ—表
     */
@@ -563,8 +550,7 @@
                query.setDeptCode(patMedInhosp1.getLeaveldeptcode());
                query.setDeptType("1");
                query.setOrgid(patMedInhosp1.getOrgid());
                return serviceTaskdeptMapper.selectServiceTaskdeptList(query)
                        .stream().map(ServiceTaskdept::getTaskId).collect(Collectors.toList());
                return serviceTaskdeptMapper.selectServiceTaskdeptList(query).stream().map(ServiceTaskdept::getTaskId).collect(Collectors.toList());
            }
            case 2: { // ç—…区
                ServiceTaskdept query = new ServiceTaskdept();
@@ -572,8 +558,7 @@
                query.setDeptCode(patMedInhosp1.getLeavehospitaldistrictcode());
                query.setDeptType("2");
                query.setOrgid(patMedInhosp1.getOrgid());
                return serviceTaskdeptMapper.selectServiceTaskdeptList(query)
                        .stream().map(ServiceTaskdept::getTaskId).collect(Collectors.toList());
                return serviceTaskdeptMapper.selectServiceTaskdeptList(query).stream().map(ServiceTaskdept::getTaskId).collect(Collectors.toList());
            }
            case 3: { // ç–¾ç—…
                if (StringUtils.isEmpty(patMedInhosp1.getLeaveicd10code())) return Collections.emptyList();
@@ -581,8 +566,7 @@
                query.setLongtask(1L);
                query.setIcd10code(patMedInhosp1.getLeaveicd10code());
                query.setOrgid(patMedInhosp1.getOrgid());
                return serviceTaskdiagMapper.selectServiceTaskdiagList(query)
                        .stream().map(ServiceTaskdiag::getTaskId).collect(Collectors.toList());
                return serviceTaskdiagMapper.selectServiceTaskdiagList(query).stream().map(ServiceTaskdiag::getTaskId).collect(Collectors.toList());
            }
        }
        return Collections.emptyList();
@@ -748,13 +732,12 @@
    }
    /**
     *
     * @param taskid ä»»åŠ¡id
     * @param check æ˜¯å¦éœ€è¦æ ¡éªŒ
     * @param taskid        ä»»åŠ¡id
     * @param check         æ˜¯å¦éœ€è¦æ ¡éªŒ
     * @param patMedInhosp1 ç—…人出入院信息
     * @param patArchive ç—…人信息
     * @param type éšè®¿ç±»åž‹(1-科室,2-病区,3-疾病)
     * @param config é…ç½®ä¿¡æ¯ visit.early.day
     * @param patArchive    ç—…人信息
     * @param type          éšè®¿ç±»åž‹(1-科室,2-病区,3-疾病)
     * @param config        é…ç½®ä¿¡æ¯ visit.early.day
     */
    //将患者放到subtask中
    private void writeInSubTask(Long taskid, Boolean check, PatMedInhosp patMedInhosp1, PatArchive patArchive, Integer type, String config) {
@@ -1119,8 +1102,7 @@
                        }
                        //景宁 å‡ºé™¢é¦–次(7天)随访一定要做
                        boolean firstVisit = false;
                        if (serviceSubtask1.getOrgid().equals("47255004333112711A1001")
                                && serviceSubtask1.getVisitCount() != null && serviceSubtask1.getVisitCount() == 1) {
                        if (serviceSubtask1.getOrgid().equals("47255004333112711A1001") && serviceSubtask1.getVisitCount() != null && serviceSubtask1.getVisitCount() == 1) {
                            firstVisit = true;
                        }
                        if (!firstVisit) {
smartor/src/main/java/com/smartor/service/impl/ServiceSubtaskServiceImpl.java
@@ -13,6 +13,7 @@
import com.smartor.common.FtpService;
import com.smartor.config.PhoneUtils;
import com.smartor.domain.*;
import com.smartor.domain.VO.ServiceSubtaskCotinueCountVO;
import com.smartor.domain.entity.ServiceSubtaskEntity;
import com.smartor.mapper.*;
import com.smartor.service.*;
@@ -1982,7 +1983,7 @@
//        if (existSize > 0) return pullTaskVOList;
        int count = 0;
        long size = listOps.size("cache-0");
        log.error("---------打电话之前缓存中的数据量:{}", size);
        log.info("---------打电话之前缓存中的数据量:{}", size);
        if (size > 0) {
            //phoneCount()  é€šè¿‡ç»™å‡ºçš„æ¯ä¸ªå°æ—¶éœ€è¦æ‰“出的电话量,算出到晚上8点一点能打出多少个电话,获取到总量
            //如果需要立即执行的数据量大于一天要执行的上限,则只取上限的数量,其它的则放回redis中
@@ -2031,7 +2032,7 @@
            }
        }
//        if (existList.size() != 0) redisCache.setCacheListRight("cache-exist", existList);
        log.error("-----------实际拉取的电话数据量:{}", CollectionUtils.isNotEmpty(pullTaskVOList) ? pullTaskVOList.size() : null);
        log.info("-----------实际拉取的电话数据量:{}", CollectionUtils.isNotEmpty(pullTaskVOList) ? pullTaskVOList.size() : null);
        return pullTaskVOList;
    }
@@ -3847,7 +3848,7 @@
            if (serviceSubtaskPreachform1.getSort() == spSize.size() && failSendstate.equals("4")) {
                serviceSubtask.setCurrentPreachform(preachform);
                serviceSubtask.setSendstate(5L);
//                serviceSubtask.setRemark("setFailPreachForm方法 å½“前的preachform已经是最后一个了,全失败了");
                serviceSubtask.setRemark("所有发送方式均未获取结果,任务失败");
                serviceSubtaskMapper.updateServiceSubtask(serviceSubtask);
                return true;
            }
@@ -4017,4 +4018,65 @@
    public Map<String, Object> getCurrentUserServiceSubtaskCount(ServiceSubtaskEntity entity) {
        return serviceSubtaskMapper.getCurrentUserServiceSubtaskCount(entity);
    }
    @Override
    public Map<String, Object> getContinueNurseCount(ServiceSubtaskCotinueCountVO vo) {
        boolean hasDistrict = !CollectionUtils.isEmpty(vo.getLeavehospitaldistrictcodes());
        boolean hasDept = !CollectionUtils.isEmpty(vo.getDeptcodes());
        List<Map<String, Object>> districtRows;
        List<Map<String, Object>> deptRows;
        if (hasDistrict) {
            // åªä¼ äº†ç—…区:仅按病区维度统计
            districtRows = serviceSubtaskMapper.getContinueNurseCount(vo);
            deptRows = Collections.emptyList();
        } else if (hasDept) {
            // åªä¼ äº†ç§‘室:仅按科室维度统计
            districtRows = Collections.emptyList();
            deptRows = serviceSubtaskMapper.getContinueNurseCountByDept(vo);
        } else {
            // éƒ½æœªä¼ ï¼šç—…区和科室各统计一遍
            districtRows = serviceSubtaskMapper.getContinueNurseCount(vo);
            deptRows = serviceSubtaskMapper.getContinueNurseCountByDept(vo);
        }
        long totalNoContinue = 0L;
        long totalContinue = 0L;
        List<Map<String, Object>> detail = new ArrayList<>();
        for (Map<String, Object> row : districtRows) {
            String groupName = row.get("groupName") == null
                    ? (row.get("groupCode") == null ? "" : row.get("groupCode").toString())
                    : row.get("groupName").toString();
            long noCnt = row.get("noContinueCnt") == null ? 0L : Long.parseLong(row.get("noContinueCnt").toString());
            long yesCnt = row.get("continueCnt") == null ? 0L : Long.parseLong(row.get("continueCnt").toString());
            totalNoContinue += noCnt;
            totalContinue += yesCnt;
            Map<String, Object> item = new LinkedHashMap<>();
            item.put("未延续_" + groupName, noCnt);
            item.put("已延续_"+groupName, yesCnt);
            detail.add(item);
        }
        for (Map<String, Object> row : deptRows) {
            String groupName = row.get("groupName") == null
                    ? (row.get("groupCode") == null ? "" : row.get("groupCode").toString())
                    : row.get("groupName").toString();
            long noCnt = row.get("noContinueCnt") == null ? 0L : Long.parseLong(row.get("noContinueCnt").toString());
            long yesCnt = row.get("continueCnt") == null ? 0L : Long.parseLong(row.get("continueCnt").toString());
            totalNoContinue += noCnt;
            totalContinue += yesCnt;
            Map<String, Object> item = new LinkedHashMap<>();
            item.put("未延续_" + groupName, noCnt);
            item.put("已延续_" + groupName, yesCnt);
            detail.add(item);
        }
        Map<String, Object> result = new LinkedHashMap<>();
        result.put("未延续总数量", totalNoContinue);
        result.put("已延续总数量", totalContinue);
        result.put("详情", detail);
        return result;
    }
}
smartor/src/main/resources/mapper/smartor/PatMedInhospMapper.xml
@@ -854,167 +854,74 @@
    <select id="selectPatMedInhospCount" parameterType="com.smartor.domain.PatMedReq"
            resultType="com.smartor.domain.PatMedRes">
        SELECT SUM( rs ) AS rs,
        SUM( rc ) AS rc,
        SUM( scsf ) AS scsf,
        SUM( zcsf ) AS zcsf,
        SUM( zbsf ) AS zbsf
        SELECT SUM(rc) AS rc,
               SUM(rs) AS rs,
               SUM(scsf) AS scsf,
               SUM(zcsf) AS zcsf,
               SUM(zbsf) AS zbsf
        FROM (
        <!-- å‡ºé™¢äººæ¬¡-->
        SELECT
        COUNT(1) AS rc,
        0 AS rs,
        0 AS scsf,
        0 AS zcsf,
        0 AS zbsf
        FROM
        pat_med_inhosp
        JOIN
        pat_archive ON pat_archive.id = pat_med_inhosp.patid
        where 1=1
        and pat_med_inhosp.del_flag=0
        <if test="orgid != null and orgid != ''">
            and pat_med_inhosp.orgid = #{orgid}
        </if>
        AND pat_archive.idcardno IS NOT NULL
        <if test="zy != null">
            and pat_med_inhosp.inhospstate=0
            and date_format(pat_med_inhosp.starttime,'%y%m%d') &gt;= date_format(#{startDate},'%y%m%d')
            and date_format(pat_med_inhosp.starttime,'%y%m%d') &lt;= date_format(#{endDate},'%y%m%d')
            <if test="deptcodeList != null   and deptcodeList.size() > 0">
                and pat_med_inhosp.deptcode in
            <!-- å‡ºé™¢äººæ¬¡ï¼šåŽ»æŽ‰ date_format åŒ…装,使日期字段索引生效 -->
            SELECT
                COUNT(1) AS rc,
                0 AS rs,
                0 AS scsf,
                0 AS zcsf,
                0 AS zbsf
            FROM pat_med_inhosp
            JOIN pat_archive ON pat_archive.id = pat_med_inhosp.patid
            WHERE pat_med_inhosp.del_flag = 0
            <if test="orgid != null and orgid != ''">
                AND pat_med_inhosp.orgid = #{orgid}
            </if>
            AND pat_archive.idcardno IS NOT NULL
            <if test="zy != null">
                AND pat_med_inhosp.inhospstate = 0
                AND pat_med_inhosp.starttime &gt;= #{startDate}
                AND pat_med_inhosp.starttime &lt; DATE_ADD(#{endDate}, INTERVAL 1 DAY)
                <if test="deptcodeList != null and deptcodeList.size() > 0">
                    AND pat_med_inhosp.deptcode IN
                    <foreach collection="deptcodeList" item="deptcode" open="(" separator="," close=")">
                        #{deptcode}
                    </foreach>
                </if>
            </if>
            <if test="cy != null">
                AND pat_med_inhosp.inhospstate = 1
                AND pat_med_inhosp.endtime &gt;= #{startDate}
                AND pat_med_inhosp.endtime &lt; DATE_ADD(#{endDate}, INTERVAL 1 DAY)
                <if test="deptcodeList != null and deptcodeList.size() > 0">
                    AND pat_med_inhosp.leaveldeptcode IN
                    <foreach collection="deptcodeList" item="deptcode" open="(" separator="," close=")">
                        #{deptcode}
                    </foreach>
                </if>
            </if>
            UNION ALL
            <!-- éšè®¿æœåŠ¡/首次/再次/专病随访:合并为单次扫描,用条件聚合代替4个 UNION ALL -->
            SELECT
                0 AS rc,
                COUNT(1) AS rs,
                SUM(CASE WHEN service_type = 2 AND visit_count = 1 THEN 1 ELSE 0 END) AS scsf,
                SUM(CASE WHEN service_type = 2 AND visit_count > 1  THEN 1 ELSE 0 END) AS zcsf,
                SUM(CASE WHEN service_type = 13                      THEN 1 ELSE 0 END) AS zbsf
            FROM service_subtask
            WHERE del_flag = 0
            AND service_type IN (2, 13)
            <if test="orgid != null and orgid != ''">
                AND orgid = #{orgid}
            </if>
            <if test="startDate != null">
                AND visit_time &gt;= #{startDate}
            </if>
            <if test="endDate != null">
                AND visit_time &lt; DATE_ADD(#{endDate}, INTERVAL 1 DAY)
            </if>
            <if test="deptcodeList != null and deptcodeList.size() > 0">
                AND deptcode IN
                <foreach collection="deptcodeList" item="deptcode" open="(" separator="," close=")">
                    #{deptcode}
                </foreach>
            </if>
        </if>
        <if test="cy != null">
            and pat_med_inhosp.inhospstate=1
            and date_format(pat_med_inhosp.endtime,'%y%m%d') &gt;= date_format(#{startDate},'%y%m%d')
            and date_format(pat_med_inhosp.endtime,'%y%m%d') &lt;= date_format(#{endDate},'%y%m%d')
            <if test="deptcodeList != null   and deptcodeList.size() > 0">
                and pat_med_inhosp.leaveldeptcode in
                <foreach collection="deptcodeList" item="deptcode" open="(" separator="," close=")">
                    #{deptcode}
                </foreach>
            </if>
        </if>
        <!-- éšè®¿æœåŠ¡äººæ•° -->
        union all
        select
        0 AS rc,
        count(1) AS rs,
        0 AS scsf,
        0 AS zcsf,
        0 AS zbsf
        FROM
        service_subtask
        where 1=1
        and del_flag = 0
        and service_type=2
        <if test="orgid != null and orgid != ''">
            and orgid = #{orgid}
        </if>
        <if test="startDate != null">
            AND date_format( visit_time, '%y%m%d' ) &gt;= date_format( #{startDate}, '%y%m%d' )
        </if>
        <if test="endDate != null">
            AND date_format( visit_time, '%y%m%d' ) &lt;= date_format(#{endDate},'%y%m%d')
        </if>
        <if test="deptcodeList != null   and deptcodeList.size() > 0">
            and deptcode in
            <foreach collection="deptcodeList" item="deptcode" open="(" separator="," close=")">
                #{deptcode}
            </foreach>
        </if>
        <!-- é¦–次随访人数 -->
        union all
        select
        0 AS rc,
        0 AS rs,
        count(1) AS scsf,
        0 AS zcsf,
        0 AS zbsf
        FROM
        service_subtask
        where 1=1
        and del_flag = 0
        and service_type=2
        and visit_count is not null
        and visit_count = 1
        <if test="orgid != null and orgid != ''">
            and orgid = #{orgid}
        </if>
        <if test="startDate != null">
            AND date_format( visit_time, '%y%m%d' ) &gt;= date_format( #{startDate}, '%y%m%d' )
        </if>
        <if test="endDate != null">
            AND date_format( visit_time, '%y%m%d' ) &lt;= date_format(#{endDate},'%y%m%d')
        </if>
        <if test="deptcodeList != null   and deptcodeList.size() > 0">
            and deptcode in
            <foreach collection="deptcodeList" item="deptcode" open="(" separator="," close=")">
                #{deptcode}
            </foreach>
        </if>
        <!-- å†æ¬¡éšè®¿äººæ•° -->
        union all
        select
        0 AS rc,
        0 AS rs,
        0 AS scsf,
        count(1) AS zcsf,
        0 AS zbsf
        FROM
        service_subtask
        where 1=1
        and del_flag = 0
        and service_type=2
        and visit_count is not null
        and visit_count > 1
        <if test="orgid != null and orgid != ''">
            and orgid = #{orgid}
        </if>
        <if test="startDate != null">
            AND date_format( visit_time, '%y%m%d' ) &gt;= date_format( #{startDate}, '%y%m%d' )
        </if>
        <if test="endDate != null">
            AND date_format( visit_time, '%y%m%d' ) &lt;= date_format(#{endDate},'%y%m%d')
        </if>
        <if test="deptcodeList != null   and deptcodeList.size() > 0">
            and deptcode in
            <foreach collection="deptcodeList" item="deptcode" open="(" separator="," close=")">
                #{deptcode}
            </foreach>
        </if>
        <!-- ä¸“病随访人数 -->
        union all
        select
        0 AS rc,
        0 AS rs,
        0 AS scsf,
        0 AS zcsf,
        count(1) AS zbsf
        FROM
        service_subtask
        where 1=1
        and del_flag = 0
        and service_type=13
        <if test="orgid != null and orgid != ''">
            and orgid = #{orgid}
        </if>
        <if test="startDate != null">
            AND date_format( visit_time, '%y%m%d' ) &gt;= date_format( #{startDate}, '%y%m%d' )
        </if>
        <if test="endDate != null">
            AND date_format( visit_time, '%y%m%d' ) &lt;= date_format(#{endDate},'%y%m%d')
        </if>
        <if test="deptcodeList != null   and deptcodeList.size() > 0">
            and deptcode in
            <foreach collection="deptcodeList" item="deptcode" open="(" separator="," close=")">
                #{deptcode}
            </foreach>
        </if>
        ) AS combined_data
    </select>
smartor/src/main/resources/mapper/smartor/ServiceSubtaskMapper.xml
@@ -263,7 +263,7 @@
    <select id="selectServiceSubtaskList" parameterType="com.smartor.domain.entity.ServiceSubtaskEntity"
            resultMap="ServiceSubtaskResult">
        <include refid="selectServiceSubtaskVo"/>
        where  del_flag = 0
        where del_flag = 0
        <if test="continueFlag != null ">and continue_flag = #{continueFlag}</if>
        <if test="continueTimeNow != null ">and continue_time_now = #{continueTimeNow,jdbcType=TIMESTAMP}</if>
        <if test="continueCount != null ">and continue_count = #{continueCount}</if>
@@ -2414,4 +2414,62 @@
        </if>
    </select>
    <!--
        æŒ‰ç—…区或科室分组统计 continue_flag æ•°é‡
        ä¼ äº† leavehospitaldistrictcodes â†’ æŒ‰ç—…区维度
        ä¼ äº† deptcodes              â†’ æŒ‰ç§‘室维度
        éƒ½ä¸ä¼                      â†’ æŒ‰ç—…区维度统计全量
    -->
    <!-- æŒ‰ç—…区分组统计延续护理数量 -->
    <select id="getContinueNurseCount"
            parameterType="com.smartor.domain.VO.ServiceSubtaskCotinueCountVO"
            resultType="java.util.Map">
        SELECT
        leavehospitaldistrictcode AS groupCode,
        leavehospitaldistrictname AS groupName,
        SUM(CASE WHEN continue_flag = 1 THEN 1 ELSE 0 END) AS noContinueCnt,
        SUM(CASE WHEN continue_flag = 2 THEN 1 ELSE 0 END) AS continueCnt
        FROM service_subtask
        WHERE del_flag = 0
        AND continue_flag IN (1, 2)
        AND leavehospitaldistrictcode IS NOT NULL AND leavehospitaldistrictcode != ''
        <if test="orgid != null and orgid != ''">
            AND orgid = #{orgid}
        </if>
        <if test="leavehospitaldistrictcodes != null and leavehospitaldistrictcodes.size() > 0">
            AND leavehospitaldistrictcode IN
            <foreach collection="leavehospitaldistrictcodes" item="code" open="(" separator="," close=")">
                #{code}
            </foreach>
        </if>
        GROUP BY leavehospitaldistrictcode, leavehospitaldistrictname
        ORDER BY groupCode
    </select>
    <!-- æŒ‰ç§‘室分组统计延续护理数量 -->
    <select id="getContinueNurseCountByDept"
            parameterType="com.smartor.domain.VO.ServiceSubtaskCotinueCountVO"
            resultType="java.util.Map">
        SELECT
        deptcode AS groupCode,
        deptname AS groupName,
        SUM(CASE WHEN continue_flag = 1 THEN 1 ELSE 0 END) AS noContinueCnt,
        SUM(CASE WHEN continue_flag = 2 THEN 1 ELSE 0 END) AS continueCnt
        FROM service_subtask
        WHERE del_flag = 0
        AND continue_flag IN (1, 2)
        AND deptcode IS NOT NULL AND deptcode != ''
        <if test="orgid != null and orgid != ''">
            AND orgid = #{orgid}
        </if>
        <if test="deptcodes != null and deptcodes.size() > 0">
            AND deptcode IN
            <foreach collection="deptcodes" item="code" open="(" separator="," close=")">
                #{code}
            </foreach>
        </if>
        GROUP BY deptcode, deptname
        ORDER BY groupCode
    </select>
</mapper>