package org.dromara.crm.domain.bo; import io.github.linpeilie.annotations.AutoMapper; import jakarta.validation.Valid; 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.CrmContract; import java.math.BigDecimal; import java.time.LocalDate; import java.util.List; /** * CRM合同业务对象 crm_contract * * @author AI Assistant * @date 2025-10-04 */ @Data @EqualsAndHashCode(callSuper = true) @AutoMapper(target = CrmContract.class, reverseConvertGenerate = false) public class CrmContractBo extends BaseEntity { /** * 主键ID */ @NotNull(message = "主键不能为空", groups = { EditGroup.class }) private Long id; /** * 合同编号(CON+yyyyMMdd+4位流水号) - 新增时系统自动生成 */ @NotBlank(message = "合同编号不能为空", groups = { EditGroup.class }) private String contractNo; /** * 合同名称(可不填,系统自动生成) */ private String contractName; /** * 客户ID */ @NotNull(message = "客户ID不能为空", groups = { AddGroup.class, EditGroup.class }) private Long customerId; /** * 商机ID */ private Long opportunityId; /** * 报价单ID */ private Long quoteId; /** * 原合同ID(续签时关联) */ private Long parentContractId; /** * 续签次数 */ private Integer renewalCount; /** * 合同模板ID */ private Long templateId; /** * 合同模版(shanxia-山峡模版/customer-客户模版) */ private String contractTemplate; /** * 联系人ID */ private Long contactId; /** * 合同类型(sale-销售合同/service-服务合同/lease-租赁合同/other-其他) */ @NotBlank(message = "合同类型不能为空", groups = { AddGroup.class, EditGroup.class }) private String contractType; /** * 合同性质(new-新签/renewal-续签/change-变更) */ private String contractNature; /** * 合同金额 */ @NotNull(message = "合同金额不能为空", groups = { AddGroup.class, EditGroup.class }) @DecimalMin(value = "0", message = "合同金额不能为负数") private BigDecimal amount; /** * 币种(CNY-人民币/USD-美元/EUR-欧元) */ private String currency; /** * 税率(%) */ private BigDecimal taxRate; /** * 含税金额 */ private BigDecimal amountWithTax; /** * 签订日期 */ private LocalDate signDate; /** * 签订日期开始 */ private String signDateBegin; /** * 签订日期结束 */ private String signDateEnd; /** * 实际签订日期 */ private LocalDate actualSignDate; /** * 开始日期 */ private LocalDate startDate; /** * 结束日期 */ private LocalDate endDate; /** * 合同期限(月) */ private Integer contractPeriod; /** * 履约状态(normal-正常/delayed-延期/abnormal-异常/completed-已完成) */ private String performanceStatus; /** * 履约完成度(%) */ private BigDecimal performanceRate; /** * 客户满意度(1-5星) */ @Min(value = 1, message = "客户满意度最小值为1") @Max(value = 5, message = "客户满意度最大值为5") private Integer customerSatisfaction; /** * 负责人ID */ private Long ownerUserId; /** * 甲方(客户方) */ private String partyA; /** * 甲方地址 */ private String partyAAddress; /** * 甲方联系人 */ private String partyAContact; /** * 甲方联系电话 */ private String partyAMobile; /** * 甲方法定代表人 */ private String partyALegalPerson; /** * 甲方代理人 */ private String partyAAgent; /** * 甲方电话/传真 */ private String partyAPhoneFax; /** * 甲方开户银行 */ private String partyABank; /** * 甲方银行账号 */ private String partyAAccount; /** * 供方主体ID(关联crm_supplier_info表) */ private Long supplierId; /** * 结算方式(arrive_payment-货到付款/advance_payment-款到发货) */ private String settlementMethod; /** * 乙方(我方) */ private String partyB; /** * 乙方地址 */ private String partyBAddress; /** * 乙方联系人 */ private String partyBContact; /** * 乙方联系电话 */ private String partyBMobile; /** * 乙方法定代表人 */ private String partyBLegalPerson; /** * 乙方代理人 */ private String partyBAgent; /** * 乙方电话/传真 */ private String partyBPhoneFax; /** * 乙方开户银行 */ private String partyBBank; /** * 乙方银行账号 */ private String partyBAccount; /** * 付款条款 */ private String paymentTerms; /** * 交付条款 */ private String deliveryTerms; /** * 合同条款 */ private String contractTerms; /** * 合同文件路径(扫描件或电子版) */ private String contractFile; /** * 附件文件(多个文件用逗号分隔) */ private String attachmentFiles; /** * 产品列表(销售合同和采购合同必填,其他合同类型可选) */ @Valid private List products; /** * 回款计划列表 */ @Valid private List paymentPlans; /** * 作废原因 */ private String invalidReason; /** * 审批人ID列表 */ private List approverIds; /** * 合同模板内容(富文本HTML) */ private String templateContent; /** * 第五条结算方式草稿(按结算方式区分的JSON) */ private String settlementClauseDrafts; /** * 备注 */ private String remark; // 查询条件字段 private String customerName; // 客户名称 private String contactName; // 联系人名称 private String ownerUserName; // 负责人姓名 private String status; // 合同状态 private String approvalStatus; // 审批状态 private Long approvedByUserId; // 审批人ID(用于查询某个用户已审批过的合同) private Long pendingApprovalUserId; // 待审批人ID(用于查询某个用户待审批的合同) private String excludeStatus; // 排除的状态(用于默认排除已作废的记录) }