package org.dromara.crm.domain.bo; import io.github.linpeilie.annotations.AutoMapper; import jakarta.validation.constraints.*; import lombok.Data; import lombok.EqualsAndHashCode; import org.dromara.common.core.validate.AddGroup; import org.dromara.common.core.validate.EditGroup; import org.dromara.common.mybatis.core.domain.BaseEntity; import org.dromara.crm.domain.CrmContractProduct; import java.math.BigDecimal; import java.time.LocalDate; import java.util.List; /** * CRM合同产品明细业务对象 crm_contract_product * * @author AI Assistant * @date 2025-10-04 */ @Data @EqualsAndHashCode(callSuper = true) @AutoMapper(target = CrmContractProduct.class, reverseConvertGenerate = false) public class CrmContractProductBo extends BaseEntity { /** * 主键ID * 注意:编辑合同时,后端会先删除所有旧产品再重新插入,所以不需要校验id */ private Long id; /** * 合同ID - 新增时由后端自动填充,编辑时也会自动填充 */ private Long contractId; /** * 产品ID(保存合同时可为空,后端会按产品属性自动匹配或新增后回填) */ private Long productId; /** * 数量 */ @NotNull(message = "数量不能为空", groups = { AddGroup.class, EditGroup.class }) @DecimalMin(value = "0.01", message = "数量必须大于0") private BigDecimal quantity; /** * 单价(框架合同固定为0,由业务层按合同类型校验) */ @NotNull(message = "单价不能为空", groups = { AddGroup.class, EditGroup.class }) @DecimalMin(value = "0", message = "单价不能为负数") private BigDecimal price; /** * 折扣(百分比) */ @DecimalMin(value = "0", message = "折扣不能小于0") @DecimalMax(value = "100", message = "折扣不能大于100") private BigDecimal discount; /** * 税率(%) */ @DecimalMin(value = "0", message = "税率不能小于0") @DecimalMax(value = "100", message = "税率不能大于100") private BigDecimal taxRate; /** * 税费金额 */ private BigDecimal taxAmount; /** * 交付日期 */ private LocalDate deliveryDate; /** * 已交付数量 */ private Integer deliveredQuantity; /** * 交付状态(pending-待交付/partial-部分交付/delivered-已交付) */ private String deliveryStatus; /** * 产品描述 */ private String description; /** * 包装规格 */ private String packageSpec; /** * 送货方式 */ private String deliveryMethod; /** * 排序号 */ private Integer sort; /** * 备注 */ private String remark; // 查询和显示字段 private String productName; // 产品名称 private String productNo; // 产品编号 private Long categoryId; // 产品分类ID private String categoryName; // 产品分类名称 private String model; // 产品型号 private String unit; // 计量单位 private BigDecimal subtotal; // 小计金额 /** * 框架合同:调价区间(不落库到产品表,单独表保存) */ private List priceTiers; }