liusheng
15 小时以前 c24d16a37523a49080392610357872ce580cbc38
ruoyi-task/src/main/java/com/ruoyi/task/controller/ServiceSubtaskController.java
@@ -160,6 +160,10 @@
    @ApiOperation("查询患者随访信息")
    @PostMapping("/patItem")
    public Map<String, Object> patItem(@RequestBody ServiceSubtaskVO serviceSubtaskVO) {
        // ==== 临时诊断计时:确认慢在哪一段后整段删除即可(只加日志,不改逻辑)====
        long tTotal = System.currentTimeMillis();
        long tMark = tTotal;
        serviceSubtaskVO.setPageNum(PageUtils.getOffset(serviceSubtaskVO.getPageNum(), serviceSubtaskVO.getPageSize()));
        List<ServiceSubtaskRes> serviceSubtaskList = null;
        LoginUser loginUser = getLoginUser();
@@ -172,17 +176,26 @@
            serviceSubtaskEntity.setContinueContent(ObjectUtils.isNotEmpty(serviceSubtaskVO.getContinueContent()) ? serviceSubtaskVO.getContinueContent().toString() : null);
            serviceSubtaskList = serviceSubtaskService.patItem(serviceSubtaskEntity);
        }
        log.info("[patItem耗时] 1.列表页(两阶段分页)={}ms,行数={}", System.currentTimeMillis() - tMark,
                serviceSubtaskList == null ? -1 : serviceSubtaskList.size());
        tMark = System.currentTimeMillis();
        // 批量查 subtask_record,1次SQL替代循环中N次单独查
        List<Long> subtaskIds = serviceSubtaskList.stream().map(ServiceSubtaskRes::getId).filter(ObjectUtils::isNotEmpty).collect(Collectors.toList());
        Map<Long, List<ServiceSubtaskRecord>> recordMap = serviceSubtaskRecordService.selectRecordMapBySubtaskIds(subtaskIds);
        for (ServiceSubtaskRes serviceSubtask : serviceSubtaskList) {
            serviceSubtask.setServiceSubtaskRecordList(recordMap.getOrDefault(serviceSubtask.getId(), new ArrayList<>()));
        }
//        List<Long> subtaskIds = serviceSubtaskList.stream().map(ServiceSubtaskRes::getId).filter(ObjectUtils::isNotEmpty).collect(Collectors.toList());
//        Map<Long, List<ServiceSubtaskRecord>> recordMap = serviceSubtaskRecordService.selectRecordMapBySubtaskIds(subtaskIds);
//        log.info("[patItem耗时] 2.subtask_record批量={}ms,入参id数={}", System.currentTimeMillis() - tMark, subtaskIds.size());
//        tMark = System.currentTimeMillis();
//
//        for (ServiceSubtaskRes serviceSubtask : serviceSubtaskList) {
//            serviceSubtask.setServiceSubtaskRecordList(recordMap.getOrDefault(serviceSubtask.getId(), new ArrayList<>()));
//        }
        log.info("[patItem耗时] 3.记录回填={}ms", System.currentTimeMillis() - tMark);
        tMark = System.currentTimeMillis();
//      patItemCount 走Redis缓存版,避免每次全表聚合扫描
        Map<String, Object> map = getPatItemCountWithCache(serviceSubtaskEntity);
        log.info("[patItem耗时] 4.统计patItemCount(含缓存)={}ms", System.currentTimeMillis() - tMark);
        tMark = System.currentTimeMillis();
        map.put("serviceSubtaskList", serviceSubtaskList);
        List<Map<String, Object>> list = new ArrayList<>();
        list.add(map);
@@ -200,6 +213,8 @@
            total = CollectionUtils.isNotEmpty(serviceSubtasks) ? serviceSubtasks.size() : 0L;
        }
        log.info("[patItem耗时] 5.组装返回total={}={}ms,整体合计={}ms", total,
                System.currentTimeMillis() - tMark, System.currentTimeMillis() - tTotal);
        return getDataTable3(total, list);
    }
@@ -774,7 +789,12 @@
    @AddOrgId(field = "orgid", paramIndex = 0, campusField = "campusid")
    @PostMapping("/getSfStatisticsCountDetails")
    public AjaxResult getSfStatisticsCountDetails(@RequestBody ServiceSubtaskCountReq serviceSubtaskCountReq) {
        if (serviceSubtaskCountReq.getLeavehospitaldistrictcodes().size() == 0 && serviceSubtaskCountReq.getDeptcodes().size() == 0) {
        boolean noDeptOrDistrict = CollectionUtils.isEmpty(serviceSubtaskCountReq.getLeavehospitaldistrictcodes())
                && CollectionUtils.isEmpty(serviceSubtaskCountReq.getDeptcodes())
                && CollectionUtils.isEmpty(serviceSubtaskCountReq.getLeaveldeptcodes())
                && CollectionUtils.isEmpty(serviceSubtaskCountReq.getHospitaldeptcodes())
                && CollectionUtils.isEmpty(serviceSubtaskCountReq.getHospitaldistrictcodes());
        if (noDeptOrDistrict) {
            return error("科室或病区不能为空");
        }
        //复诊统计
@@ -980,23 +1000,31 @@
                serviceSubtaskEntity.setSendstates(new ArrayList<>(Arrays.asList(4L)));
        }
        if (ObjectUtils.isNotEmpty(userId)) {
            long tRedis = System.currentTimeMillis();
            Map<String, Object> redisMap = redisCache.getCacheObject(userId + "patItemCount");
            log.info("[patItem耗时] 4.1 Redis取count缓存={}ms", System.currentTimeMillis() - tRedis);
            Boolean redisFlag = false;
            if (MapUtils.isNotEmpty(redisMap)) {
                long tCmp = System.currentTimeMillis();
                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);
                }
                log.info("[patItem耗时] 4.2 条件比对={}ms,命中={}", System.currentTimeMillis() - tCmp, redisFlag);
            }
            if (!redisFlag) {
                long tCalc = System.currentTimeMillis();
                map = serviceSubtaskService.patItemCount(serviceSubtaskEntity);
                log.info("[patItem耗时] 4.3 count聚合(未命中缓存,走库)={}ms", System.currentTimeMillis() - tCalc);
                map.put("searchCondition", serviceSubtaskEntity);
                redisCache.setCacheObject(userId + "patItemCount", map, 120, TimeUnit.MINUTES);
            }
        } else {
            long tCalc = System.currentTimeMillis();
            map = serviceSubtaskService.patItemCount(serviceSubtaskEntity);
            log.info("[patItem耗时] 4.3 count聚合(无登录人,走库)={}ms", System.currentTimeMillis() - tCalc);
        }
        return map;
    }