| | |
| | | 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.DTO.QuestionResultDTO; |
| | | import com.smartor.domain.VO.*; |
| | |
| | | //@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; |
| | |
| | | serviceSubtaskExport.setEndDay(endDay); |
| | | } |
| | | } |
| | | QuestionResultVO questionResultVO = new QuestionResultVO(); |
| | | questionResultVO.setServiceType(serviceSubtaskVO.getServiceType()); |
| | | questionResultVO.setEndOutHospTime(serviceSubtaskVO.getEndOutHospTime()); |
| | | questionResultVO.setStartOutHospTime(serviceSubtaskVO.getStartOutHospTime()); |
| | | serviceSubtaskDetailRatioExports = serviceSubtaskService.getDetailRatio(questionResultVO, serviceSubtaskList); |
| | | //问题详情占比:只统计本次导出的这批患者,数量=选该选项的患者数,比例=占该题作答人数 |
| | | 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)); |
| | | } |
| | | |
| | | /** |
| | |
| | | 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)); |
| | | } |
| | | |
| | |
| | | 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)); |
| | | } |
| | | |
| | |
| | | * taskSituation4Info - taskSituation = 4 |
| | | * taskSituation5Info - taskSituation = 5 |
| | | * taskSituation6Info - taskSituation = 7 |
| | | * manuallyCalledInfo - isManuallyCalled = 1L |
| | | * filterCountList - taskSituation = 6 && sendstate = 4 |
| | | * |
| | | */ |
| | |
| | | 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; |
| | | } |
| | | |
| | | /** |
| | |
| | | } |
| | | |
| | | /** |
| | | * 统计任务各种状态的数量(优化版) |
| | | * 统计任务各种状态的数量(优化版)-【随访工作台】 |
| | | * |
| | | * @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.setCampusid(sysUser.getCampusid()); |
| | | sysUserDept.setDeptType("1"); |
| | | List<SysUserDept> sysUserDepts = sysUserDeptService.selectSysUserDeptList(sysUserDept); |
| | | SysUserDept sysUserWard = new SysUserDept(); |
| | | sysUserWard.setUserId(sysUser.getUserId()); |
| | | sysUserWard.setOrgid(sysUser.getOrgid()); |
| | | sysUserWard.setCampusid(sysUser.getCampusid()); |
| | | 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("获取当前用户宣教数量统计") |
| | |
| | | @GetMapping(value = "/smsSubTask/{subid}") |
| | | public Map<String, Object> smsSubTask(@PathVariable("subid") Long subid) { |
| | | return serviceSubtaskService.smsSubTask(subid); |
| | | } |
| | | |
| | | /** |
| | | * 手动发送问卷模板的微信功能 |
| | | * |
| | | * @param subid |
| | | * @return |
| | | */ |
| | | @GetMapping(value = "/weChatSubTask/{subid}") |
| | | public Map<String, Object> weChatSubTask(@PathVariable("subid") Long subid) { |
| | | return serviceSubtaskService.weChatSubTask(subid); |
| | | } |
| | | |
| | | /** |
| | |
| | | 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共用,条件不变时直接命中缓存 |
| | | */ |
| | |
| | | } |
| | | |
| | | |
| | | |
| | | @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; |
| | | } |
| | | } |