CrmContractBo.java 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347
  1. package org.dromara.crm.domain.bo;
  2. import io.github.linpeilie.annotations.AutoMapper;
  3. import jakarta.validation.Valid;
  4. import jakarta.validation.constraints.*;
  5. import lombok.Data;
  6. import lombok.EqualsAndHashCode;
  7. import org.dromara.common.core.validate.AddGroup;
  8. import org.dromara.common.core.validate.EditGroup;
  9. import org.dromara.common.mybatis.core.domain.BaseEntity;
  10. import org.dromara.crm.domain.CrmContract;
  11. import java.math.BigDecimal;
  12. import java.time.LocalDate;
  13. import java.util.List;
  14. /**
  15. * CRM合同业务对象 crm_contract
  16. *
  17. * @author AI Assistant
  18. * @date 2025-10-04
  19. */
  20. @Data
  21. @EqualsAndHashCode(callSuper = true)
  22. @AutoMapper(target = CrmContract.class, reverseConvertGenerate = false)
  23. public class CrmContractBo extends BaseEntity {
  24. /**
  25. * 主键ID
  26. */
  27. @NotNull(message = "主键不能为空", groups = { EditGroup.class })
  28. private Long id;
  29. /**
  30. * 合同编号(CON+yyyyMMdd+4位流水号) - 新增时系统自动生成
  31. */
  32. @NotBlank(message = "合同编号不能为空", groups = { EditGroup.class })
  33. private String contractNo;
  34. /**
  35. * 合同名称(可不填,系统自动生成)
  36. */
  37. private String contractName;
  38. /**
  39. * 客户ID
  40. */
  41. @NotNull(message = "客户ID不能为空", groups = { AddGroup.class, EditGroup.class })
  42. private Long customerId;
  43. /**
  44. * 商机ID
  45. */
  46. private Long opportunityId;
  47. /**
  48. * 报价单ID
  49. */
  50. private Long quoteId;
  51. /**
  52. * 原合同ID(续签时关联)
  53. */
  54. private Long parentContractId;
  55. /**
  56. * 续签次数
  57. */
  58. private Integer renewalCount;
  59. /**
  60. * 合同模板ID
  61. */
  62. private Long templateId;
  63. /**
  64. * 合同模版(shanxia-山峡模版/customer-客户模版)
  65. */
  66. private String contractTemplate;
  67. /**
  68. * 联系人ID
  69. */
  70. private Long contactId;
  71. /**
  72. * 合同类型(sale-销售合同/service-服务合同/lease-租赁合同/other-其他)
  73. */
  74. @NotBlank(message = "合同类型不能为空", groups = { AddGroup.class, EditGroup.class })
  75. private String contractType;
  76. /**
  77. * 合同性质(new-新签/renewal-续签/change-变更)
  78. */
  79. private String contractNature;
  80. /**
  81. * 合同金额
  82. */
  83. @NotNull(message = "合同金额不能为空", groups = { AddGroup.class, EditGroup.class })
  84. @DecimalMin(value = "0", message = "合同金额不能为负数")
  85. private BigDecimal amount;
  86. /**
  87. * 币种(CNY-人民币/USD-美元/EUR-欧元)
  88. */
  89. private String currency;
  90. /**
  91. * 税率(%)
  92. */
  93. private BigDecimal taxRate;
  94. /**
  95. * 含税金额
  96. */
  97. private BigDecimal amountWithTax;
  98. /**
  99. * 签订日期
  100. */
  101. private LocalDate signDate;
  102. /**
  103. * 签订日期开始
  104. */
  105. private String signDateBegin;
  106. /**
  107. * 签订日期结束
  108. */
  109. private String signDateEnd;
  110. /**
  111. * 实际签订日期
  112. */
  113. private LocalDate actualSignDate;
  114. /**
  115. * 开始日期
  116. */
  117. private LocalDate startDate;
  118. /**
  119. * 结束日期
  120. */
  121. private LocalDate endDate;
  122. /**
  123. * 合同期限(月)
  124. */
  125. private Integer contractPeriod;
  126. /**
  127. * 履约状态(normal-正常/delayed-延期/abnormal-异常/completed-已完成)
  128. */
  129. private String performanceStatus;
  130. /**
  131. * 履约完成度(%)
  132. */
  133. private BigDecimal performanceRate;
  134. /**
  135. * 客户满意度(1-5星)
  136. */
  137. @Min(value = 1, message = "客户满意度最小值为1")
  138. @Max(value = 5, message = "客户满意度最大值为5")
  139. private Integer customerSatisfaction;
  140. /**
  141. * 负责人ID
  142. */
  143. private Long ownerUserId;
  144. /**
  145. * 甲方(客户方)
  146. */
  147. private String partyA;
  148. /**
  149. * 甲方地址
  150. */
  151. private String partyAAddress;
  152. /**
  153. * 甲方联系人
  154. */
  155. private String partyAContact;
  156. /**
  157. * 甲方联系电话
  158. */
  159. private String partyAMobile;
  160. /**
  161. * 甲方法定代表人
  162. */
  163. private String partyALegalPerson;
  164. /**
  165. * 甲方代理人
  166. */
  167. private String partyAAgent;
  168. /**
  169. * 甲方电话/传真
  170. */
  171. private String partyAPhoneFax;
  172. /**
  173. * 甲方开户银行
  174. */
  175. private String partyABank;
  176. /**
  177. * 甲方银行账号
  178. */
  179. private String partyAAccount;
  180. /**
  181. * 供方主体ID(关联crm_supplier_info表)
  182. */
  183. private Long supplierId;
  184. /**
  185. * 结算方式(arrive_payment-货到付款/advance_payment-款到发货)
  186. */
  187. private String settlementMethod;
  188. /**
  189. * 乙方(我方)
  190. */
  191. private String partyB;
  192. /**
  193. * 乙方地址
  194. */
  195. private String partyBAddress;
  196. /**
  197. * 乙方联系人
  198. */
  199. private String partyBContact;
  200. /**
  201. * 乙方联系电话
  202. */
  203. private String partyBMobile;
  204. /**
  205. * 乙方法定代表人
  206. */
  207. private String partyBLegalPerson;
  208. /**
  209. * 乙方代理人
  210. */
  211. private String partyBAgent;
  212. /**
  213. * 乙方电话/传真
  214. */
  215. private String partyBPhoneFax;
  216. /**
  217. * 乙方开户银行
  218. */
  219. private String partyBBank;
  220. /**
  221. * 乙方银行账号
  222. */
  223. private String partyBAccount;
  224. /**
  225. * 付款条款
  226. */
  227. private String paymentTerms;
  228. /**
  229. * 交付条款
  230. */
  231. private String deliveryTerms;
  232. /**
  233. * 合同条款
  234. */
  235. private String contractTerms;
  236. /**
  237. * 合同文件路径(扫描件或电子版)
  238. */
  239. private String contractFile;
  240. /**
  241. * 附件文件(多个文件用逗号分隔)
  242. */
  243. private String attachmentFiles;
  244. /**
  245. * 产品列表(销售合同和采购合同必填,其他合同类型可选)
  246. */
  247. @Valid
  248. private List<CrmContractProductBo> products;
  249. /**
  250. * 回款计划列表
  251. */
  252. @Valid
  253. private List<CrmPaymentPlanBo> paymentPlans;
  254. /**
  255. * 作废原因
  256. */
  257. private String invalidReason;
  258. /**
  259. * 审批人ID列表
  260. */
  261. private List<Long> approverIds;
  262. /**
  263. * 合同模板内容(富文本HTML)
  264. */
  265. private String templateContent;
  266. /**
  267. * 第五条结算方式草稿(按结算方式区分的JSON)
  268. */
  269. private String settlementClauseDrafts;
  270. /**
  271. * 备注
  272. */
  273. private String remark;
  274. // 查询条件字段
  275. private String customerName; // 客户名称
  276. private String contactName; // 联系人名称
  277. private String ownerUserName; // 负责人姓名
  278. private String status; // 合同状态
  279. private String approvalStatus; // 审批状态
  280. private Long approvedByUserId; // 审批人ID(用于查询某个用户已审批过的合同)
  281. private Long pendingApprovalUserId; // 待审批人ID(用于查询某个用户待审批的合同)
  282. private String excludeStatus; // 排除的状态(用于默认排除已作废的记录)
  283. }