package com.klp.domain.bo; import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.annotation.JsonSetter; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; import lombok.Setter; import javax.validation.constraints.Min; import javax.validation.constraints.NotBlank; import javax.validation.constraints.NotNull; /** * 盖章命令(Java/Python 坐标统一使用 px) */ @Getter @Setter @Builder @NoArgsConstructor @AllArgsConstructor @JsonInclude(JsonInclude.Include.ALWAYS) public class WmsSealStampBo { /** 待盖章 PDF 的 OSS 完整 URL */ @NotBlank(message = "待盖章文件地址不能为空") @JsonProperty("targetFileUrl") private String targetFileUrl; /** 章图片 OSS 完整 URL(透明 PNG/JPG) */ @NotBlank(message = "章图片地址不能为空") @JsonProperty("stampImageUrl") private String stampImageUrl; /** 页码(从1开始) */ @NotNull @Min(1) @JsonProperty("pageNo") private Integer pageNo; /** 左下角 X 坐标(px) */ @NotNull @Min(0) @JsonProperty("xPx") @JsonInclude(JsonInclude.Include.ALWAYS) @Setter(lombok.AccessLevel.NONE) private Integer xPx; /** 左下角 Y 坐标(px) */ @NotNull @Min(0) @JsonProperty("yPx") @JsonInclude(JsonInclude.Include.ALWAYS) @Setter(lombok.AccessLevel.NONE) private Integer yPx; /** 盖章宽度(px,可选) */ @Min(1) @JsonProperty("widthPx") private Integer widthPx; /** 盖章高度(px,可选) */ @Min(1) @JsonProperty("heightPx") private Integer heightPx; /** * 前端渲染的 viewport 宽度(像素):用于把前端点击坐标换算成 PDFBox 坐标(pt)。 * 注意:这不是 PDF 页面原始宽度,而是 pdf.js 按 scale 渲染到 canvas 的宽度。 */ @Min(1) @JsonProperty("viewportWidth") private Integer viewportWidth; /** 前端渲染的 viewport 高度(像素):用于坐标换算 */ @Min(1) @JsonProperty("viewportHeight") private Integer viewportHeight; /** * 手动添加 setter 方法,确保 Jackson 能够正确映射 yPx 字段 * Lombok 生成的 setYPx() 可能与 Jackson 的字段名映射不匹配 */ @JsonSetter("yPx") public void setYPx(Integer yPx) { this.yPx = yPx; } /** * 手动添加 setter 方法,确保 Jackson 能够正确映射 xPx 字段 */ @JsonSetter("xPx") public void setXPx(Integer xPx) { this.xPx = xPx; } }