package jnpf.bizcommon.audit.entity.model; import com.fasterxml.jackson.annotation.JsonFormat; import io.swagger.v3.oas.annotations.media.Schema; import jnpf.base.Pagination; import lombok.Data; import lombok.EqualsAndHashCode; import java.util.Date; /** * 审计事件分页查询入参(spec §7.1)。沿平台 Pagination 惯例继承分页基类 * (currentPage/pageSize 取自 {@link Pagination},默认 currentPage=1、pageSize=20)。 */ @Data @EqualsAndHashCode(callSuper = true) public class AuditPageQuery extends Pagination { /** * 起止时间(Task D1 拍板,收 M2 遗留清单 §五-③)。 * *
本类走 {@code @RequestBody} 由 Jackson 反序列化。**不加这个注解时, * 传空格分隔的 {@code "yyyy-MM-dd HH:mm:ss"} 会报 `System abnormality`**——Jackson 默认只认 * ISO8601 与 epoch 数字,不认空格分隔(注意:平台的 `JsonUtil` 走 fastjson、认这个格式, * 但那是**消息通道**的反序列化器,与 Web 入参不是同一条路,早前的排查在这里绕过弯)。 * *
选择「加注解」而不是「让前端对齐 epoch 毫秒」的理由:`yyyy-MM-dd HH:mm:ss` 是本平台 * 前端日期控件的默认出参格式,`jnpf-flowable` / `jnpf-visualdata` 等模块的入参模型都是这么标的 * (如 `FlowableInstanceModel`),跟着平台惯例走比让每个接入方记住一个例外便宜。 * *
⚠️ **两种格式都要能收**:既有脚本(`tasks/audit-test.sh` 等)传的是 epoch 毫秒**数字**。 * Jackson 的 `DateDeserializer` 对 `VALUE_NUMBER_INT` 先行短路、不过 pattern,故加 pattern * 不影响数字形态——这一点**已用探针实测**而非推断,见 `tasks/audit-query-datefmt-probe.sh`。 * 但 epoch 毫秒若以**字符串**形态传(`"1785120484000"`)则会被 pattern 拒收,脚本勿改成那样。 */ @Schema(description = "起始时间(含)。接受 \"yyyy-MM-dd HH:mm:ss\" 或 epoch 毫秒数字") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private Date startTime; @Schema(description = "结束时间(含)。接受 \"yyyy-MM-dd HH:mm:ss\" 或 epoch 毫秒数字") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private Date endTime; @Schema(description = "操作人姓名,模糊匹配") private String operatorName; @Schema(description = "应用名,如 jnpf-lims") private String appName; /** * Codex 批次三a Important#1:spec §7.1 层 0 事件的 app_name 固定为 jnpf-visualdev(发起服务), * 用户视角"按业务应用筛选"应落在 biz_module(业务模块标识,如 lims/eln)。app_name 保留供技术侧筛选。 */ @Schema(description = "业务模块,如 lims/eln(用户视角应用筛选,区别于技术侧 app_name)") private String bizModule; @Schema(description = "事件类型:DATA_CHANGE / BIZ_ACTION / E_SIGNATURE") private String eventType; @Schema(description = "动作码:CREATE/UPDATE/DELETE/...") private String actionCode; @Schema(description = "目标表名") private String targetTable; @Schema(description = "业务单号") private String bizCode; @Schema(description = "业务对象类型") private String bizType; @Schema(description = "关键字,匹配 field_diffs 内容(pg_bigm 加速)") private String keyword; }