陈昶聿
20 小时以前 a2dd5b42824eff9626d1f48e1561be85f17f6107
ruoyi-admin/src/main/java/com/ruoyi/web/controller/smartor/ServiceSubtaskController.java
@@ -23,10 +23,10 @@
import com.ruoyi.quartz.task.RyTask;
import com.ruoyi.system.service.ISysConfigService;
import com.ruoyi.system.service.ISysUserDeptService;
import com.smartor.common.MydOptionRatioChartBuilder;
import com.smartor.domain.*;
import com.smartor.domain.VO.HeLibraryCountVO;
import com.smartor.domain.VO.ServiceSubtaskCotinueCountVO;
import com.smartor.domain.VO.ServiceSubtaskVO;
import com.smartor.domain.DTO.QuestionResultDTO;
import com.smartor.domain.VO.*;
import com.smartor.domain.entity.ServiceSubtaskEntity;
import com.smartor.service.IServiceSubtaskRecordService;
import com.smartor.service.IServiceSubtaskService;
@@ -45,6 +45,7 @@
import javax.servlet.http.HttpServletResponse;
import java.time.LocalDate;
import java.util.*;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;
@@ -101,6 +102,18 @@
    @Autowired
    private RedisCache redisCache;
    /**
     * 转移科室病区
     */
    @ApiOperation("转移科室病区")
    @PostMapping("/transferDept")
    public Map<String, Object> transferDept(@RequestBody TransferDeptVO transferDeptVO) {
        Integer i = serviceSubtaskService.transferDept(transferDeptVO);
        return success(i == 1 ? true : false);
    }
    /**
     * 查询患者随访信息
@@ -177,71 +190,19 @@
    }
    /**
     * 带Redis缓存的统计查询,供patItem和patItemCount共用,条件不变时直接命中缓存
     */
    private Map<String, Object> getPatItemCountWithCache(ServiceSubtaskEntity serviceSubtaskEntity) {
        Map<String, Object> map = new HashMap<>();
        LoginUser loginUser = getLoginUser();
        Long userId = null;
        if (ObjectUtils.isNotEmpty(loginUser) && ObjectUtils.isNotEmpty(loginUser.getUser())) {
            userId = loginUser.getUser().getUserId();
        }
        if (serviceSubtaskEntity.getSendstateView() != null) {
            //            1:待随访(1 被领取、2 待发送、3 已发送、5 发送失败、7、超时);2:已完成( 6 已完成)、3:无需随访(4 不执行)
            if (serviceSubtaskEntity.getSendstateView() == 1)
                serviceSubtaskEntity.setSendstates(new ArrayList<>(Arrays.asList(1L, 2L, 3L, 5L, 7L)));
            if (serviceSubtaskEntity.getSendstateView() == 2)
                serviceSubtaskEntity.setSendstates(new ArrayList<>(Arrays.asList(6L)));
            if (serviceSubtaskEntity.getSendstateView() == 3)
                serviceSubtaskEntity.setSendstates(new ArrayList<>(Arrays.asList(4L)));
        }
        if (ObjectUtils.isNotEmpty(userId)) {
            Map<String, Object> redisMap = redisCache.getCacheObject(userId + "patItemCount");
            Boolean redisFlag = false;
            if (MapUtils.isNotEmpty(redisMap)) {
                ServiceSubtaskEntity oldCondition = (ServiceSubtaskEntity) redisMap.get("searchCondition");
                if (ObjectUtils.isNotEmpty(oldCondition) && isSameCondition(oldCondition, serviceSubtaskEntity)) {
                    redisFlag = true;
                    map = redisMap;
                    redisCache.setCacheObject(userId + "patItemCount", map, 60, TimeUnit.MINUTES);
                }
            }
            if (!redisFlag) {
                map = serviceSubtaskService.patItemCount(serviceSubtaskEntity);
                map.put("searchCondition", serviceSubtaskEntity);
                redisCache.setCacheObject(userId + "patItemCount", map, 120, TimeUnit.MINUTES);
            }
        } else {
            map = serviceSubtaskService.patItemCount(serviceSubtaskEntity);
        }
        return map;
    }
    /**
     * 比较两个ServiceSubtaskVO的查询条件是否一致
     * 使用反射比较所有字段,排除分页参数和无关字段
     */
    private boolean isSameCondition(ServiceSubtaskEntity oldCondition, ServiceSubtaskEntity newCondition) {
        // 使用ReflectUtils的通用方法比较,排除分页参数等无关字段
        return ReflectUtils.equalsAllFields(oldCondition, newCondition,
                // 排除的字段:分页参数、序列化ID、时间戳等
                "pageNum", "pageSize", "serialVersionUID", "createBy", "createTime", "updateBy", "updateTime", "searchValue", "params");
    }
    /**
     * 导出单一任务列表
     */
    //@PreAuthorize("@ss.hasPermi('system:taskcall:export')")
    @Log(title = "单一任务", businessType = BusinessType.EXPORT)
    @PostMapping("/patItemExport")
    public void patItemExport(HttpServletResponse response, ServiceSubtaskEntity serviceSubtaskVO) {
    public void patItemExport(HttpServletResponse response, ServiceSubtaskVO serviceSubtaskVO) {
        LoginUser loginUser = getLoginUser();
        SysUser user = loginUser.getUser();
        serviceSubtaskVO.setOrgid(user.getOrgid());
        List<ServiceSubtaskRes> serviceSubtaskList = null;
        if (serviceSubtaskVO != null) {
            serviceSubtaskList = serviceSubtaskService.patItem(serviceSubtaskVO);
           ServiceSubtaskEntity serviceSubtaskEntity = DtoConversionUtils.sourceToTarget(serviceSubtaskVO, ServiceSubtaskEntity.class);
            serviceSubtaskList = serviceSubtaskService.patItem(serviceSubtaskEntity);
        }
        List<ServiceSubtaskExport> serviceSubtaskExports = null;
        List<ServiceSubtaskDetailRatioExport> serviceSubtaskDetailRatioExports = null;
@@ -261,16 +222,22 @@
                    serviceSubtaskExport.setEndDay(endDay);
                }
            }
            //获取serviceSubtaskList中的所有taskid
            List<Long> taskIds = serviceSubtaskList.stream().map(ServiceSubtaskRes::getTaskid).filter(ObjectUtils::isNotEmpty).distinct().collect(Collectors.toList());
            serviceSubtaskDetailRatioExports = serviceSubtaskService.statQuestionOption(taskIds, serviceSubtaskVO.getStartOutHospTime(), serviceSubtaskVO.getEndOutHospTime());
            //问题详情占比:只统计本次导出的这批患者,数量=选该选项的患者数,比例=占该题作答人数
            List<Long> subtaskIds = new ArrayList<>();
            for (ServiceSubtaskRes serviceSubtaskRes : serviceSubtaskList) {
                if (serviceSubtaskRes.getId() != null) {
                    subtaskIds.add(serviceSubtaskRes.getId());
                }
            }
            serviceSubtaskDetailRatioExports = serviceSubtaskService.statMydQuestionOptionForExport(subtaskIds, null);
        }
        ExcelUtil<ServiceSubtaskExport> util = new ExcelUtil<ServiceSubtaskExport>(ServiceSubtaskExport.class);
        util.exportExcelTwoSheet(response, serviceSubtaskExports, "患者随访信息表单", serviceSubtaskDetailRatioExports, "问题详情占比", ServiceSubtaskDetailRatioExport.class);
        //第三个Sheet:问题详情占比图表(按任务名称分组,一个任务一张柱状图)
        util.exportExcelTwoSheetWithChart(response, serviceSubtaskExports, "患者随访信息表单",
                serviceSubtaskDetailRatioExports, "问题详情占比", ServiceSubtaskDetailRatioExport.class,
                new MydOptionRatioChartBuilder(serviceSubtaskDetailRatioExports));
    }
    /**
@@ -335,8 +302,7 @@
    public AjaxResult querySubtaskList(@RequestBody ServiceSubtaskVO 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);
        // 该 SQL 已内置 limit ${pageSize} OFFSET ${pageNum},不再走 PageHelper,避免两套分页叠加产生两个 LIMIT
        return success(serviceSubtaskService.selectServiceSubtaskList(serviceSubtaskEntity));
    }
@@ -350,8 +316,8 @@
    public TableDataInfo querySubtaskListAgain(@RequestBody ServiceSubtaskVO serviceSubtaskVO) {
        ServiceSubtaskEntity serviceSubtaskEntity = DtoConversionUtils.sourceToTarget(serviceSubtaskVO, ServiceSubtaskEntity.class);
        serviceSubtaskEntity.setContinueContent(ObjectUtils.isNotEmpty(serviceSubtaskVO.getContinueContent()) ? serviceSubtaskVO.getContinueContent().toString() : null);
        // 该 SQL 未内置 limit,使用 PageHelper 分页;只调用一次,getDataTable 可基于 Page 取到正确 total
        PageUtils.startPageByPost(serviceSubtaskEntity.getPageNum(), serviceSubtaskEntity.getPageSize());
        serviceSubtaskService.selectServiceSubtaskListAgain(serviceSubtaskEntity);
        return getDataTable(serviceSubtaskService.selectServiceSubtaskListAgain(serviceSubtaskEntity));
    }
@@ -430,7 +396,11 @@
        ivrTaskVO.setCreateBy(user.getNickName());
        ivrTaskVO.setUpdateBy(user.getNickName());
        ivrTaskVO.setOrgid(user.getOrgid());
        ivrTaskVO.setCampusid(user.getCampusid());
        if(StringUtils.isNotEmpty(user.getCampusid())){
            ivrTaskVO.setCampusid(user.getCampusid());
        }else {
            ivrTaskVO.setCampusid("1");
        }
        return success(serviceSubtaskService.insertOrUpdateTask(ivrTaskVO));
    }
@@ -457,7 +427,10 @@
        SysUser user = getLoginUser().getUser();
        if (ObjectUtils.isNotEmpty(user)) serviceSubtask.setOrgid(user.getOrgid());
        if (ObjectUtils.isNotEmpty(user)) serviceSubtask.setCampusid(user.getCampusid());
        return toAjax(serviceSubtaskService.insertServiceSubtask(serviceSubtask));
        serviceSubtask.setCampusid(user.getCampusid());
        serviceSubtask.setCreateBy(user.getNickName());
        serviceSubtask.setUpdateBy(user.getNickName());
        return success(serviceSubtaskService.insertServiceSubtask(serviceSubtask));
    }
    @ApiOperation("患者再次随访")
@@ -582,9 +555,10 @@
                        SysUserDept sysUserWard = new SysUserDept();
                        sysUserWard.setUserId(user.getUserId());
                        sysUserWard.setOrgid(user.getOrgid());
                        sysUserWard.setCampusid(user.getCampusid());
                        sysUserWard.setDeptType("2");
                        List<SysUserDept> wardList = sysUserDeptService.selectSysUserDeptList(sysUserWard);
                        if(CollectionUtils.isNotEmpty(wardList)) {
                        if (CollectionUtils.isNotEmpty(wardList)) {
                            leavehospitaldistrictcodes = wardList.stream().map(SysUserDept::getDeptCode).collect(Collectors.toList());
                        }
                        serviceSubtaskCountReq.setLeavehospitaldistrictcodes(leavehospitaldistrictcodes);
@@ -596,9 +570,10 @@
                        SysUserDept sysUserDept = new SysUserDept();
                        sysUserDept.setUserId(user.getUserId());
                        sysUserDept.setOrgid(user.getOrgid());
                        sysUserDept.setCampusid(user.getCampusid());
                        sysUserDept.setDeptType("1");
                        List<SysUserDept> deptList = sysUserDeptService.selectSysUserDeptList(sysUserDept);
                        if(CollectionUtils.isNotEmpty(deptList)){
                        if (CollectionUtils.isNotEmpty(deptList)) {
                            deptCodes = deptList.stream().map(SysUserDept::getDeptCode).collect(Collectors.toList());
                        }
                        serviceSubtaskCountReq.setDeptcodes(deptCodes);
@@ -733,6 +708,7 @@
     * taskSituation4Info - taskSituation = 4
     * taskSituation5Info - taskSituation = 5
     * taskSituation6Info - taskSituation = 7
     * manuallyCalledInfo - isManuallyCalled = 1L
     * filterCountList - taskSituation = 6 && sendstate = 4
     *
     */
@@ -835,8 +811,18 @@
        LoginUser loginUser = getLoginUser();
        String orgid = loginUser.getUser().getOrgid();
        serviceSubtaskCountReq.setOrgid(orgid);
        PageUtils.startPageByPost(serviceSubtaskCountReq.getPageNum(), serviceSubtaskCountReq.getPageSize());
        return success(serviceSubtaskService.getSfStatisticsScriptDetails(serviceSubtaskCountReq));
        //注意:这里不能再调用 PageUtils.startPageByPost。
        //返回结构是 Map,且不传 type 时会执行两条 SQL,PageHelper 只作用于第一条 SQL,
        //分页已放到 Service 里按题目(scriptid)完成,保证 total 是题目总数。
        Map<String, Object> details = serviceSubtaskService.getSfStatisticsScriptDetails(serviceSubtaskCountReq);
        AjaxResult ajax = success(details.get("data"));
        //兼容旧前端:data 仍然是 {scriptid: 题目} 的 Map;
        //同时按 RuoYi 习惯补上 rows/total/pageNum/pageSize 方便前端分页
        ajax.put("rows", details.get("rows"));
        ajax.put("total", details.get("total"));
        ajax.put("pageNum", details.get("pageNum"));
        ajax.put("pageSize", details.get("pageSize"));
        return ajax;
    }
    /**
@@ -856,46 +842,54 @@
    }
    /**
     * 统计任务各种状态的数量(优化版)
     * 统计任务各种状态的数量(优化版)-【随访工作台】
     *
     * @param soonTimeoutHours 即将超时时间(小时),默认 48
     * @return Map<String, Object> 包含各状态统计数据
     * pendingVisitCount: 当前登录人截止今日待随访总量
     * failedVisitCount: 当前登录人随访任务失败总量
     * abnormalVisitVount: 当前登录人随访任务异常总量
     * allVisitCount: 当前登录人随访任务总量
     * soonTimeoutCount: 当前登录人即将超时数量(超时截止时间在 soonTimeoutHours 小时内)
     */
    @ApiOperation("获取当前用户随访数量统计")
    @PostMapping("/getCurrentUserServiceSubtaskCount")
    public Map<String, Object> getCurrentUserServiceSubtaskCount() {
        Map<String, Object> map = new HashMap<>();
        LoginUser loginUser = getLoginUser();
    public Map<String, Object> getCurrentUserServiceSubtaskCount(
            @RequestParam(value = "soonTimeoutHours", required = false, defaultValue = "48") Integer soonTimeoutHours) {
        LoginUser loginUser = SecurityUtils.getLoginUser();
        if (loginUser == null || loginUser.getUser() == null) {
            return new HashMap<>();
        }
        SysUser sysUser = loginUser.getUser();
        SysUserDept sysUserDept = new SysUserDept();
        sysUserDept.setUserId(sysUser.getUserId());
        sysUserDept.setOrgid(sysUser.getOrgid());
        sysUserDept.setDeptType("1");
        List<SysUserDept> sysUserDepts = sysUserDeptService.selectSysUserDeptList(sysUserDept);
        SysUserDept sysUserWard = new SysUserDept();
        sysUserWard.setUserId(sysUser.getUserId());
        sysUserWard.setOrgid(sysUser.getOrgid());
        sysUserWard.setDeptType("2");
        List<SysUserDept> sysUserWards = sysUserDeptService.selectSysUserDeptList(sysUserWard);
        List<String> deptCodes = sysUserDepts.stream().map(SysUserDept::getDeptCode).collect(Collectors.toList());
        List<String> wardCodes = sysUserWards.stream().map(SysUserDept::getDeptCode).collect(Collectors.toList());
        List<String> deptCodes = CollectionUtils.emptyIfNull(sysUser.getBelongDepts()).stream()
                .map(item -> item.get("deptCode"))
                .filter(Objects::nonNull) // 剔除null
                .map(Object::toString)
                .collect(Collectors.toList());
        List<String> wardCodes = CollectionUtils.emptyIfNull(sysUser.getBelongWards()).stream()
                .map(item -> item.get("districtCode"))
                .filter(Objects::nonNull) // 剔除null
                .map(Object::toString)
                .collect(Collectors.toList());
        ServiceSubtaskEntity entity = new ServiceSubtaskEntity();
        entity.setOrgid(sysUser.getOrgid());
        entity.setLeaveldeptcodes(deptCodes);
        entity.setLeavehospitaldistrictcodes(wardCodes);
        if (ObjectUtils.isNotEmpty(sysUser)) {
            if (!("admin").equals(sysUser.getUserName())) {
                if (ObjectUtils.isNotEmpty(sysUserWards) && ObjectUtils.isNotEmpty(sysUserDepts)) {
                    map = serviceSubtaskService.getCurrentUserServiceSubtaskCount(entity);
                }
            } else {
                map = serviceSubtaskService.getCurrentUserServiceSubtaskCount(entity);
            }
        entity.setSoonTimeoutHours(soonTimeoutHours);
        // admin 查看全院;非 admin 只要配置了科室或病区任一维度即可查询(SQL 中为 OR 关系)
        boolean isAdmin = "admin".equals(sysUser.getUserName());
        if (isAdmin || CollectionUtils.isNotEmpty(deptCodes) || CollectionUtils.isNotEmpty(wardCodes)) {
            return serviceSubtaskService.getCurrentUserServiceSubtaskCount(entity);
        }
        return map;
        // 非 admin 且未配置任何科室/病区权限时,返回默认 0 值,避免前端取不到 key
        Map<String, Object> empty = new HashMap<>();
        empty.put("pendingVisitCount", 0);
        empty.put("failedVisitCount", 0);
        empty.put("abnormalVisitCount", 0);
        empty.put("warnningVisitCount", 0);
        empty.put("allVisitCount", 0);
        empty.put("soonTimeoutCount", 0);
        return empty;
    }
    @ApiOperation("获取当前用户宣教数量统计")
@@ -924,6 +918,17 @@
    }
    /**
     * 手动发送问卷模板的微信功能
     *
     * @param subid
     * @return
     */
    @GetMapping(value = "/weChatSubTask/{subid}")
    public Map<String, Object> weChatSubTask(@PathVariable("subid") Long subid) {
        return serviceSubtaskService.weChatSubTask(subid);
    }
    /**
     * 跳转中间页
     *
     * @param taskId
@@ -932,10 +937,10 @@
    @PostMapping(value = "/goSfRelay")
    public AjaxResult goSfRelay(@RequestParam("taskId") Long taskId, @RequestParam("deptcode") String deptcode, @RequestParam("leavehospitaldistrictcode") String leavehospitaldistrictcode) {
        String url = localIP + ":" + req_path + "/SfRelay?taskid=" + taskId;
        if(StringUtils.isNotEmpty(deptcode)){
        if (StringUtils.isNotEmpty(deptcode)) {
            url = url + "&deptcode=" + deptcode;
        }
        if(StringUtils.isNotEmpty(leavehospitaldistrictcode)){
        if (StringUtils.isNotEmpty(leavehospitaldistrictcode)) {
            url = url + "&leavehospitaldistrictcode=" + leavehospitaldistrictcode;
        }
        return AjaxResult.success(url);
@@ -952,27 +957,110 @@
        return AjaxResult.success(serviceSubtaskService.scanGenerateSubtask(serviceTask));
    }
    @PostMapping("/test")
    public void test() {
        ryTask.dealOutHospInfo();
    @PostMapping("/syncMedInhospForShiyi")
    public AjaxResult syncMedInhospForShiyi(@RequestParam("startTime") String startTime, @RequestParam("endTime") String endTime) {
        // 立即返回,后台异步执行
        CompletableFuture.runAsync(() -> {
            collectHISService.syncMedInhosp(startTime, endTime);
        });
        return AjaxResult.success("同步任务已启动,请稍后查看结果");
    }
    @PostMapping("/syncMedInhospForShiyi")
    public void syncMedInhospForShiyi(@RequestParam("startTime") String startTime, @RequestParam("endTime") String endTime) {
        collectHISService.syncMedInhosp(startTime, endTime);
    @PostMapping("/syncMedInhospForShiyiYesterday")
    public AjaxResult syncMedInhospForShiyiYesterday() {
        // 立即返回,后台异步执行
        ryTask.collectHISYesterday();
        return AjaxResult.success("同步任务已启动,请稍后查看结果");
    }
    @PostMapping("/syncMedInhospForShiyiDaysBefore")
    public AjaxResult syncMedInhospForShiyiDaysBefore(@RequestParam("day") Long day) {
        // 立即返回,后台异步执行
        ryTask.collectHISDaysBefore(day);
        return AjaxResult.success("【collectHISDaysBefore】同步任务已启动,天数为" + day + "天,请稍后查看结果");
    }
    @PostMapping("/syncMedOperForShiyi")
    public void syncMedOperForShiyi(@RequestParam("startTime") String startTime, @RequestParam("endTime") String endTime) {
        collectHISService.syncOper(startTime, endTime);
    public AjaxResult syncMedOperForShiyi(@RequestParam("startTime") String startTime, @RequestParam("endTime") String endTime) {
        // 立即返回,后台异步执行
        CompletableFuture.runAsync(() -> {
            collectHISService.syncOper(startTime, endTime);
        });
        return AjaxResult.success("同步任务已启动,请稍后查看结果");
    }
    @PostMapping("/qwenLLMTest")
    public int qwenLLMTest(@RequestParam("voiceText") String questionText, @RequestParam("voiceText") String voiceText, @RequestParam("value") String value, @RequestParam("regexText") String regexText) {
        int result = ryTask.qwenLLMTest(questionText, voiceText, value, regexText);
        return result;
    @PostMapping("/dealSubtaskDeadline")
    public AjaxResult dealSubtaskDeadline(@RequestParam("orgid") String orgid, @RequestParam("day") Integer day) {
        // 立即返回,后台异步执行
        ryTask.dealSubtaskDeadline(orgid, day);
        return AjaxResult.success("【dealSubtaskDeadline】同步任务已启动,天数为" + day + "天,请稍后查看结果");
    }
    @PostMapping("/sendExceptInfo")
    public AjaxResult sendExceptInfo() throws Exception {
        ryTask.sendExceptInfo();
        return AjaxResult.success("sendExceptInfo");
    }
    /**
     * 带Redis缓存的统计查询,供patItem和patItemCount共用,条件不变时直接命中缓存
     */
    private Map<String, Object> getPatItemCountWithCache(ServiceSubtaskEntity serviceSubtaskEntity) {
        Map<String, Object> map = new HashMap<>();
        LoginUser loginUser = getLoginUser();
        Long userId = null;
        if (ObjectUtils.isNotEmpty(loginUser) && ObjectUtils.isNotEmpty(loginUser.getUser())) {
            userId = loginUser.getUser().getUserId();
        }
        if (serviceSubtaskEntity.getSendstateView() != null) {
            //            1:待随访(1 被领取、2 待发送、3 已发送、5 发送失败、7、超时);2:已完成( 6 已完成)、3:无需随访(4 不执行)
            if (serviceSubtaskEntity.getSendstateView() == 1)
                serviceSubtaskEntity.setSendstates(new ArrayList<>(Arrays.asList(1L, 2L, 3L, 5L, 7L)));
            if (serviceSubtaskEntity.getSendstateView() == 2)
                serviceSubtaskEntity.setSendstates(new ArrayList<>(Arrays.asList(6L)));
            if (serviceSubtaskEntity.getSendstateView() == 3)
                serviceSubtaskEntity.setSendstates(new ArrayList<>(Arrays.asList(4L)));
        }
        if (ObjectUtils.isNotEmpty(userId)) {
            Map<String, Object> redisMap = redisCache.getCacheObject(userId + "patItemCount");
            Boolean redisFlag = false;
            if (MapUtils.isNotEmpty(redisMap)) {
                ServiceSubtaskEntity oldCondition = (ServiceSubtaskEntity) redisMap.get("searchCondition");
                if (ObjectUtils.isNotEmpty(oldCondition) && isSameCondition(oldCondition, serviceSubtaskEntity)) {
                    redisFlag = true;
                    map = redisMap;
                    redisCache.setCacheObject(userId + "patItemCount", map, 60, TimeUnit.MINUTES);
                }
            }
            if (!redisFlag) {
                map = serviceSubtaskService.patItemCount(serviceSubtaskEntity);
                map.put("searchCondition", serviceSubtaskEntity);
                redisCache.setCacheObject(userId + "patItemCount", map, 120, TimeUnit.MINUTES);
            }
        } else {
            map = serviceSubtaskService.patItemCount(serviceSubtaskEntity);
        }
        return map;
    }
    /**
     * 比较两个ServiceSubtaskVO的查询条件是否一致
     * 使用反射比较所有字段,排除分页参数和无关字段
     */
    private boolean isSameCondition(ServiceSubtaskEntity oldCondition, ServiceSubtaskEntity newCondition) {
        // 使用ReflectUtils的通用方法比较,排除分页参数等无关字段
        return ReflectUtils.equalsAllFields(oldCondition, newCondition,
                // 排除的字段:分页参数、序列化ID、时间戳等
                "pageNum", "pageSize", "serialVersionUID", "createBy", "createTime", "updateBy", "updateTime", "searchValue", "params");
    }
    @ApiOperation("获取统计数")
    @AddOrgId(field = "orgid", paramIndex = 0, campusField = "campusid")
    @PostMapping("/countByCondition")
    public Map<String, Object>  countByCondition(@RequestBody ServiceSubtaskEntity condition) {
        Map<String, Object> map = serviceSubtaskService.countByCondition(condition);
        return map;
    }
}