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.CrmQuote; import java.math.BigDecimal; import java.time.LocalDate; import java.util.List; /** * 报价单业务对象 crm_quote * * @author 系统管理员 * @date 2025-01-03 */ @Data @EqualsAndHashCode(callSuper = true) @AutoMapper(target = CrmQuote.class, reverseConvertGenerate = false) public class CrmQuoteBo extends BaseEntity { /** * 主键ID */ @NotNull(message = "主键不能为空", groups = { EditGroup.class }) private Long id; /** * 报价单编号(系统自动生成) */ private String quoteNo; /** * 报价单标题(可不填,系统自动生成) */ private String quoteTitle; /** * 报价单类型(sales-销售/purchase-采购) */ @NotBlank(message = "报价单类型不能为空", groups = { AddGroup.class, EditGroup.class }) @Pattern(regexp = "sales|purchase", message = "报价单类型只能为销售或采购", groups = { AddGroup.class, EditGroup.class }) private String quoteType; /** * 客户ID */ @NotNull(message = "客户ID不能为空", groups = { AddGroup.class, EditGroup.class }) private Long customerId; /** * 客户名称(冗余字段) */ private String customerName; /** * 快速检索关键字(用于报价主题/客户名称模糊检索) */ private String keyword; /** * 商机ID */ private Long opportunityId; /** * 联系人ID */ private Long contactId; /** * 联系人姓名(冗余字段) */ private String contactName; /** * 联系人手机(冗余字段) */ private String contactMobile; /** * 联系人邮箱(冗余字段) */ private String contactEmail; /** * 版本号(如V1.0,V1.1,V2.0) */ private String version; /** * 父版本ID */ private Long parentId; /** * 是否最新版本(0否 1是) */ private Integer isLatest; /** * 整单折扣率(百分比) */ @DecimalMin(value = "0.00", message = "折扣率不能为负数") @DecimalMax(value = "100.00", message = "折扣率不能超过100") private BigDecimal discountRate; /** * 有效期(天数) */ @Min(value = 1, message = "有效期必须大于0") private Integer validityDays; /** * 报价日期 */ private LocalDate quoteDate; /** * 报价日期开始 */ private String quoteDateBegin; /** * 报价日期结束 */ private String quoteDateEnd; /** * 到期日期 */ private LocalDate expireDate; /** * 状态 */ private String status; /** * 拒绝原因 */ private String rejectReason; /** * 负责人ID */ private Long ownerUserId; /** * 负责人姓名(冗余字段) */ private String ownerUserName; /** * 报价主体ID(关联crm_supplier_info表) */ @NotNull(message = "报价主体不能为空", groups = { AddGroup.class, EditGroup.class }) private Long supplierId; /** * 报价主体名称(冗余字段) */ private String supplierName; /** * 关联合同ID */ private Long contractId; /** * 付款条款 */ private String paymentTerms; /** * 交付条款 */ private String deliveryTerms; /** * 运费(元) */ @DecimalMin(value = "0.00", message = "运费不能为负数") private BigDecimal freight; /** * 附件(多个用逗号分隔) */ private String attachments; /** * 报价单模板内容(富文本HTML) */ private String templateContent; /** * 备注 */ private String remark; /** * 产品列表 */ @NotEmpty(message = "产品列表不能为空", groups = { AddGroup.class }) private List products; /** * 审批人ID(用于查询某个用户已审批过的报价单) */ private Long approvedByUserId; /** * 排除的状态(用于默认排除已作废的记录) */ private String excludeStatus; }