InsOrders.java 10 KB

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