package com.ruoyi.task.domain; import com.alibaba.fastjson.JSONObject; import com.fasterxml.jackson.annotation.JsonAlias; import com.fasterxml.jackson.annotation.JsonFormat; import com.fasterxml.jackson.annotation.JsonIgnore; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.util.ArrayList; import java.util.Date; import java.util.List; /** * 各科室完成量统计结果请求 * * @author ruoyi * @date 2024-02-02 */ @ApiModel(value = "ServiceSubtaskCountReq", description = "各科室完成量统计结果请求") @Data public class ServiceSubtaskCountReq { private static final long serialVersionUID = 1L; @ApiModelProperty(value = "用户ID") private Long userId; private Integer visitCount; /** * rateDay 代表几天及时率 */ @ApiModelProperty(value = "几天及时率") private Integer rateDay; /** * 是否再次随访 */ @ApiModelProperty(value = "几天及时率") private Integer isVisitAgain; @ApiModelProperty(value = "异常预警:0绿色;1红色;2黄色") private Integer isabnormal; @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd") @ApiModelProperty(value = "开始时间") private Date startTime; @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd") @ApiModelProperty(value = "结束时间") private Date endTime; @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") @ApiModelProperty(value = "出院开始时间") private Date hospitalStartTime; @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") @ApiModelProperty(value = "出院结束时间") private Date hospitalEndTime; @ApiModelProperty(value = "服务类型") private List serviceType; @ApiModelProperty(value = "离院病区Code集合") private List leavehospitaldistrictcodes; @ApiModelProperty(value = "离院科室Code集合") private List leaveldeptcodes; @ApiModelProperty(value = "科室Code集合") private List deptcodes; @ApiModelProperty(value = "病区Code集合") private List hospitaldistrictcodes; @ApiModelProperty(value = "在院科室Code集合") private List hospitaldeptcodes; @ApiModelProperty(value = "子任务Id集合") private List subTaskIds; @ApiModelProperty(value = "统计维度:1-按病区(leavehospitaldistrictcode) 2-按科室(deptcode) 3-按taskid") @JsonAlias("statisticalType") private Integer statisticaltype; private String visitDeptCode; private String visitDeptName; @ApiModelProperty(value = "医生编码") private String drcode; @ApiModelProperty(value = "语音分类编码") private Long ivrCategoryid; @ApiModelProperty(value = "问卷分类编码") private Long svyCategoryid; @ApiModelProperty(value = "任务类型:1,机器人语音 2,问卷;3,通知;") private String type; @ApiModelProperty(value = "查询参数 joyCount-满意度统计; returnVisitCount-复诊统计") private String configKey; @ApiModelProperty(value = "查询参数对应值 joyCount-满意度统计; returnVisitCount-复诊统计") private String configValue; @ApiModelProperty(value = "继续标识:1 没 2有") private Integer continueFlag; @ApiModelProperty(value = "继续时间现在") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") private Date continueTimeNow; @ApiModelProperty(value = "继续内容") private JSONObject continueContent; @ApiModelProperty(value = "继续次数") private Integer continueCount; @ApiModelProperty(value = "继续时间下次") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") private Date continueTimeNext; /** * 机构编码 */ @ApiModelProperty("机构编码") private String orgid; /** * 院区编码 */ @ApiModelProperty("院区编码") private String campusid; /** * 问题编码-查询使用,支持多个问题,用逗号区分 */ @ApiModelProperty(value = "问题编码") private String scriptids; /** /** * 把 scriptids(逗号分隔的问题ID字符串)严格解析为 Long 集合,仅供 SQL 的 foreach 预编译使用。 *

* 只保留纯数字项,其余内容一律丢弃,返回 null 表示“不过滤”。 * 这样 scriptids 这个请求字段永远不会被拼接进 SQL,避免注入(原实现是 in (${scriptids}))。 */ @JsonIgnore public List getScriptidList() { if (scriptids == null || scriptids.trim().isEmpty()) { return null; } List scriptidList = new ArrayList<>(); for (String item : scriptids.split(",")) { String scriptid = item.trim(); if (scriptid.matches("\\d+")) { scriptidList.add(Long.valueOf(scriptid)); } } return scriptidList.isEmpty() ? null : scriptidList; } /** * 问题ID(题目明细行返回的 scriptid),用于选项数字下钻 */ @ApiModelProperty(value = "问题ID") @JsonAlias("scriptId") private Long scriptid; /** * 问题内容。传入后按题目内容匹配,兼容同一道题被复制到多个任务模板的场景 */ @ApiModelProperty(value = "问题内容") private String scriptContent; /** * 选项文本(题目明细行返回的 optionText) */ @ApiModelProperty(value = "选项文本") @JsonAlias({"optiontext", "option", "optionContent"}) private String optionText; /** * 题目明细中的任务类型(subtaskType),用于下钻时区分语音/问卷 */ @ApiModelProperty(value = "任务类型(题目明细中的 subtaskType)") @JsonAlias("subTaskType") private String subtaskType; /** * 分组类型 drCode, deptCode, leaveHospitalDistrictCode */ @ApiModelProperty(value = "分组类型") private String groupKeyType; /** * 实际用于“结果分组”的列名(仅服务端内部使用,不从请求传入)。 *

* 历史原因:{@link #groupKey} 既用于 getSfStatistics 的 {@code AND ${groupKey} IN (...)} 过滤, * 又被当成分组列;但 {@code groupKey = 'deptcode'} 时,原实现是在内存里按 * {@code leaveldeptcode} 分组的,过滤列与分组列并不相同。 * 为了把累加下推到数据库后口径不变,这里把两件事拆开:groupKey 负责过滤,groupColumn 负责分组。 */ @JsonIgnore private String groupColumn; /** * 分组key */ @ApiModelProperty(value = "分组key") private String groupKey; /** * 病区统计(离院维度)实际使用的“有效病区”列表达式(仅服务端内部使用)。 *

* 满意度子任务(service_type 6/14/15/16)的 {@code leavehospitaldistrictcode} 约三成为空, * 旧写法把空值当成“不限”放行({@code xxx IS NULL OR xxx IN (...)}), * 结果选中 A 病区时会把空病区的记录全带进来,再按 * {@code IFNULL(leavehospitaldistrictcode,'Unknown')} 归成一个组, * 这一组的病区名又是 {@code MAX(hospitaldistrictname)} 随便挑的。 *

* 这里给出“出院病区为空则回退到在院病区”的表达式,过滤与分组都改用它, * 空病区的记录因此回到它真正的在院病区,而不是污染用户选中的病区。 * 为 null 时保持历史行为(兼容其它调用方)。 */ @JsonIgnore private String districtColumn; /** * 分页偏移量(仅服务端内部使用)。 *

* pageNum 是 1 起始的,而历史写法直接把它当 SQL 的 OFFSET 用 * ({@code limit 20 OFFSET 1}),第一页会凭空跳掉第一条分组数据。 */ @JsonIgnore public Integer getPageOffset() { if (pageSize == null) { return null; } int current = (pageNum == null || pageNum < 1) ? 1 : pageNum; return (current - 1) * pageSize; } /** * 随访统计方式 1-默认统计方式 2-统计时算上不发送的 3-只统计已完成的 */ @ApiModelProperty(value = "统计方式") private String followUpCountStyle; /** * 分组code集合 */ @ApiModelProperty(value = "分组code集合") private List groupKeyList; /** * 发送状态 - 超链接统计 */ @ApiModelProperty(value = "发送状态 1 被领取(在任务中是新建,在服务中是被领取) 2 待发送 3 已发送 4 不执行 5 发送失败 6 已完成") private List sendstates; /** * 异常标识 - 超链接统计 */ @ApiModelProperty(value = "异常标识:0绿色;1红色;2黄色") private String excep; /** * 处理意见编码 - 超链接统计 */ @ApiModelProperty(value = "处理意见编码") private String suggest; /** * 完成时状态 - 超链接统计(1-正常完成 2-延期完成 3-超时完成) */ @ApiModelProperty(value = "完成时状态:1正常完成 2延期完成 3超时完成") private Long finishState; /** * 当前发送方式 - 超链接统计 */ @ApiModelProperty("当前发送方式") private String currentPreachform; /** * 随访情况 - 超链接统计 */ @ApiModelProperty(value = "随访情况:1正常语音,2患者拒接或拒访,3面访或者接诊,4微信随访,5随访电话不正确,6被过滤,7其它") private Integer taskSituation; /** * 出院病区编号 - 超链接统计 */ @ApiModelProperty(value = "出院病区编号") private String leavehospitaldistrictcode; /** * 出院科室编号 - 超链接统计 */ @ApiModelProperty(value = "出院科室编号") private String deptcode; /** * 超链接统计列表类型 - 超链接统计 */ @ApiModelProperty(value = "超链接统计列表类型") private String hyperLinkInfoType; @ApiModelProperty(value = "任务ID", required = true) @JsonAlias("taskid") private Long taskId; @ApiModelProperty(value = "taskIds集合") private List taskIds; @ApiModelProperty(value = "任务名称") private String taskName; @ApiModelProperty(value = "taskNamee集合") private List taskNames; @ApiModelProperty(value = "疾病病种") private String diagType; @ApiModelProperty(value = "diagType集合") private List diagTypes; @JsonFormat(pattern = "yyyy-MM-dd") @ApiModelProperty(value = "发送时间") private Date visittime; @JsonFormat(pattern = "yyyy-MM-dd") @ApiModelProperty(value = "完成时间") private Date finishtime; @ApiModelProperty(value = "就诊类型(1门诊 2出院 3.专病 4.外部导入 5急诊、6住院、7体检)") private String hospType; /** * 人工电话标记 */ @ApiModelProperty(value = "是否人工打过电话 0-没打过 1-打过") private Long isManuallyCalled; /** * pageNum */ @ApiModelProperty("pageNum") private Integer pageNum; /** * pageSize */ @ApiModelProperty("pageSize") private Integer pageSize; }