InsOrders.java 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353
  1. package com.ydtech.modules.order.entity;
  2. import com.alibaba.fastjson.JSON;
  3. import com.alibaba.fastjson.JSONArray;
  4. import com.alibaba.fastjson.JSONObject;
  5. import com.baomidou.mybatisplus.annotation.IdType;
  6. import com.baomidou.mybatisplus.annotation.TableField;
  7. import com.baomidou.mybatisplus.annotation.TableId;
  8. import com.baomidou.mybatisplus.annotation.TableName;
  9. import com.baomidou.mybatisplus.extension.handlers.FastjsonTypeHandler;
  10. import com.fasterxml.jackson.annotation.JsonFormat;
  11. import com.ydtech.constants.enums.InsuranceRisk;
  12. import com.ydtech.constants.enums.dict.InsOrderStatusEnum;
  13. import com.ydtech.constants.enums.dict.agreement.ProductsType;
  14. import com.ydtech.exception.SystemException;
  15. import com.ydtech.modules.admin.model.SysDept;
  16. import com.ydtech.modules.admin.model.SysUser;
  17. import com.ydtech.modules.ins.model.vo.KindInfoVo;
  18. import com.ydtech.modules.ins.model.vo.RiskInfoVo;
  19. import com.ydtech.modules.order.entity.vo.BaseQuoteInfoVo;
  20. import lombok.*;
  21. import java.io.Serializable;
  22. import java.math.BigDecimal;
  23. import java.time.LocalDateTime;
  24. import java.util.List;
  25. /**
  26. * 保险订单表
  27. *
  28. * @TableName ins_orders
  29. */
  30. @EqualsAndHashCode
  31. @ToString
  32. @TableName(value = "ins_orders", autoResultMap = true)
  33. @Data
  34. @AllArgsConstructor
  35. @NoArgsConstructor
  36. public class InsOrders implements Serializable {
  37. /**
  38. * 订单号
  39. */
  40. @TableId(value = "orderno",type = IdType.AUTO)
  41. private String orderno;
  42. /**
  43. * 报价单号
  44. */
  45. @TableField(value = "quoteno")
  46. private String quoteno;
  47. /**
  48. * 承保 保险公司编号
  49. */
  50. @TableField(value = "company_id")
  51. private String companyId;
  52. /**
  53. * 承保 保险名称
  54. */
  55. @TableField(value = "ins_company")
  56. private String insCompany;
  57. /**
  58. * 报价状态
  59. */
  60. @TableField(value = "orderstatus")
  61. private String orderstatus;
  62. /**
  63. * 车辆信息
  64. */
  65. @TableField(value = "carinfo", typeHandler = FastjsonTypeHandler.class)
  66. private JSONObject carinfo;
  67. /**
  68. * 用户id
  69. */
  70. @TableField(value = "userid")
  71. private String userid;
  72. /**
  73. * 代客录单时操作员ID
  74. */
  75. @TableField(value = "operatorid")
  76. private String operatorid;
  77. /**
  78. * 用户名称
  79. */
  80. @TableField(value = "username")
  81. private String username;
  82. /**
  83. * 代理团队id
  84. */
  85. @TableField(value = "deptid")
  86. private String deptid;
  87. /**
  88. * 代理团队名称
  89. */
  90. @TableField(value = "deptname")
  91. private String deptname;
  92. /**
  93. * 车主信息
  94. */
  95. @TableField(value = "ownerinfo", typeHandler = FastjsonTypeHandler.class)
  96. private JSONObject ownerinfo;
  97. /**
  98. * 投保人信息
  99. */
  100. @TableField(value = "applyinfo", typeHandler = FastjsonTypeHandler.class)
  101. private JSONObject applyinfo;
  102. /**
  103. * 被保人信息
  104. */
  105. @TableField(value = "insureinfo", typeHandler = FastjsonTypeHandler.class)
  106. private JSONObject insureinfo;
  107. /**
  108. * 协议id
  109. */
  110. @TableField(value = "agreeid")
  111. private String agreeid;
  112. /**
  113. * 产品id
  114. */
  115. @TableField(value = "productid")
  116. private String productid;
  117. /**
  118. * 产品名称
  119. */
  120. @TableField(value = "product")
  121. private String product;
  122. /**
  123. * 创建时间
  124. */
  125. @TableField(value = "createtime")
  126. @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
  127. private LocalDateTime createtime;
  128. /**
  129. * 车架号 VIN码
  130. */
  131. @TableField(value = "frameno")
  132. private String frameno;
  133. /**
  134. * 车牌号
  135. */
  136. @TableField(value = "licenseno")
  137. private String licenseno;
  138. /**
  139. * 投保人姓名
  140. */
  141. @TableField(value = "insuredname")
  142. private String insuredname;
  143. /**
  144. * 交强险开始时间
  145. */
  146. @TableField(value = "jqstartdate")
  147. private String jqstartdate;
  148. /**
  149. * 交强险结束时间
  150. */
  151. @TableField(value = "jqenddate")
  152. private String jqenddate;
  153. /**
  154. * 商业险开始时间
  155. */
  156. @TableField(value = "systartdate")
  157. private String systartdate;
  158. /**
  159. * 商业险结束时间
  160. */
  161. @TableField(value = "syenddate")
  162. private String syenddate;
  163. /**
  164. * 商业 交强
  165. */
  166. @TableField(value = "risk", typeHandler = FastjsonTypeHandler.class)
  167. private JSONArray risk;
  168. /**
  169. * 商业险信息
  170. */
  171. @TableField(value = "king", typeHandler = FastjsonTypeHandler.class)
  172. private JSONArray king;
  173. /**
  174. * 车船税信息
  175. */
  176. @TableField(value = "vehicle_and_vessel_tax", typeHandler = FastjsonTypeHandler.class)
  177. private JSONObject vehicleAndVesselTax;
  178. @TableField(exist = false)
  179. private List<InsAreaCompany> insAreaCompanyList; //子级集合
  180. @TableField(exist = false)
  181. private static final long serialVersionUID = 1L;
  182. @TableField(exist = false)
  183. private String subOrderId; //子订单id
  184. @TableField(exist = false)
  185. private BigDecimal willFirstPremiums; //一级预收金额
  186. @TableField(exist = false)
  187. private BigDecimal willSecondPremiums; //二级预收金额
  188. @TableField(exist = false)
  189. private BigDecimal willThreePremiums; //三级预收金额
  190. @TableField(exist = false)
  191. private String managementSource; //业务员机构来源
  192. @TableField(exist = false)
  193. private String auditStatus; //订单费用审核状态
  194. @TableField(exist = false)
  195. private String auditUser; //订单费用审核人
  196. @TableField(exist = false)
  197. private String auditTime; //订单费用审核时间
  198. @TableField(exist = false)
  199. private String agreementCode; //协议code
  200. @TableField(exist = false)
  201. private String agreementName; //协议名称
  202. public InsOrders(SysUser user, SysDept dept, BaseQuoteInfoVo quoteInfoVo) {
  203. // 2. 组装订单
  204. this.setQuoteno(String.valueOf(quoteInfoVo.getQuoteno()));
  205. this.setOrderstatus(InsOrderStatusEnum.QUOTE_ING.getCode()); // 0 报价 1 待核保 2 已核保待缴费 3 核保退回 4 核保不通过
  206. this.setFrameno(quoteInfoVo.getCarInfo().getFrameNo());
  207. this.setLicenseno(quoteInfoVo.getCarInfo().getLicenseNo());
  208. // 2.1 车辆信息
  209. this.setCarinfo(JSON.parseObject(JSON.toJSONString(quoteInfoVo.getCarInfo())));
  210. this.setUserid(user.getId());
  211. this.setUsername(user.getName());
  212. this.setDeptid(user.getDeptId());
  213. this.setDeptname(dept == null ? "" : dept.getName());
  214. // 2.2 人员信息
  215. this.setOwnerinfo(JSON.parseObject(JSON.toJSONString(quoteInfoVo.getOwnerInfo())));
  216. this.setApplyinfo(JSON.parseObject(JSON.toJSONString(quoteInfoVo.getPolicyHolderInfo())));
  217. this.setInsureinfo(JSON.parseObject(JSON.toJSONString(quoteInfoVo.getInsuredPersonInfo())));
  218. this.setInsuredname(quoteInfoVo.getPolicyHolderInfo().getName());
  219. List<RiskInfoVo> risks = quoteInfoVo.getRiskList();
  220. List<KindInfoVo> kinds = quoteInfoVo.getKindList();
  221. // 2.3 主险种信息
  222. this.insuranceInformation(risks, kinds);
  223. // 2.3.1 险种信息
  224. this.setRisk(JSON.parseArray(JSON.toJSONString(quoteInfoVo.getRiskList())));
  225. this.setKing(JSON.parseArray(JSON.toJSONString(quoteInfoVo.getKindList())));
  226. // 2.4 产品信息
  227. this.productInformation(risks, kinds);
  228. this.setCreatetime(LocalDateTime.now());
  229. // 2.5 车船税信息
  230. this.setVehicleAndVesselTax(JSON.parseObject(JSON.toJSONString(quoteInfoVo.getVehicleAndVesselTax())));
  231. }
  232. /**
  233. * 保险信息
  234. *
  235. * @param risks 主险种
  236. * @param kinds 商业险险种
  237. */
  238. private void insuranceInformation(List<RiskInfoVo> risks, List<KindInfoVo> kinds) {
  239. for (RiskInfoVo riskInfoVo : risks) {
  240. if (InsuranceRisk.TRAFFIC.getCode().equals(riskInfoVo.getRiskCode())) { //交强
  241. this.setJqstartdate(riskInfoVo.getStartDate());
  242. this.setJqenddate(riskInfoVo.getEndDate());
  243. }
  244. if (InsuranceRisk.BUSINESS.getCode().equals(riskInfoVo.getRiskCode())) { //商业
  245. this.setSystartdate(riskInfoVo.getStartDate());
  246. this.setSyenddate(riskInfoVo.getEndDate());
  247. if (kinds.isEmpty()) {
  248. throw new SystemException("商业险险种未选择,不允许报价");
  249. }
  250. }
  251. }
  252. }
  253. /**
  254. * 产品信息
  255. *
  256. * @param risks 主险种
  257. * @param kinds 商业险险种
  258. */
  259. private void productInformation(List<RiskInfoVo> risks, List<KindInfoVo> kinds) {
  260. /**
  261. * 投保险种逻辑
  262. * 单交-单交强
  263. * 单商-单商业(含车损)
  264. * 单三-单商业(不含车损)
  265. * 交三-交强+商业(不含车损)
  266. * 交商-交强+商业(含车损)
  267. * 单交:
  268. * 单商:034001
  269. * 单三:034002
  270. * 交三:0330034002
  271. * 交商:0330034001
  272. *
  273. */
  274. ProductsType productsType;
  275. boolean haveCarDamageKind = false;//是否含车损
  276. boolean haveBusiKind = false;//是否含车损外的商业险种
  277. for (KindInfoVo kindInfoVo : kinds) {
  278. String code = kindInfoVo.getKindCode();
  279. // 车损
  280. if ("A".equalsIgnoreCase(code)) {
  281. haveCarDamageKind = true;
  282. }
  283. if ("B,D3,D4,".contains(code + ",")) {
  284. haveBusiKind = true;
  285. }
  286. }
  287. if (risks.size() == 1 && InsuranceRisk.TRAFFIC.getCode().equals(risks.get(0).getRiskCode())) {
  288. productsType = ProductsType.PT_0330;//单交
  289. } else if (risks.size() == 1 && !haveCarDamageKind && haveBusiKind) {
  290. productsType = ProductsType.PT_034002;//单三
  291. } else if (risks.size() == 1) {
  292. productsType = ProductsType.PT_034001;//单商
  293. } else if (risks.size() == 2 && !haveCarDamageKind && haveBusiKind) {
  294. productsType = ProductsType.PT_0330034002;//交三
  295. } else {
  296. productsType = ProductsType.PT_0330034001;//交商
  297. }
  298. this.setProductid(productsType.getCode());
  299. this.setProduct(productsType.getDesc());
  300. }
  301. }