OrderComponents.java 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467
  1. package com.ydtech.components;
  2. import com.alibaba.fastjson.JSONObject;
  3. import com.ydtech.exception.SystemException;
  4. import com.ydtech.modules.admin.model.SysDept;
  5. import com.ydtech.modules.admin.model.SysUser;
  6. import com.ydtech.modules.admin.service.SysDeptService;
  7. import com.ydtech.modules.admin.service.SysUserService;
  8. import com.ydtech.modules.esm.model.EsmAgreement;
  9. import com.ydtech.modules.esm.model.EsmAgreementProd;
  10. import com.ydtech.modules.esm.model.EsmAgreementProdfee;
  11. import com.ydtech.modules.esm.model.EsmRetail;
  12. import com.ydtech.modules.esm.service.*;
  13. import com.ydtech.modules.ins.model.InsCommission;
  14. import com.ydtech.modules.ins.model.InsDeptFee;
  15. import com.ydtech.modules.ins.model.InsFeeDetail;
  16. import com.ydtech.modules.ins.model.InsOrder;
  17. import com.ydtech.modules.ins.model.ya.YaQuoteInfoVo;
  18. import com.ydtech.modules.ins.service.InsCommissionService;
  19. import com.ydtech.modules.ins.service.InsDeptFeeService;
  20. import com.ydtech.modules.ins.service.InsFeeDetailService;
  21. import com.ydtech.modules.ins.service.InsOrderService;
  22. import com.ydtech.modules.ins.vo.KindInfoVo;
  23. import com.ydtech.modules.ins.vo.RiskInfoVo;
  24. import com.ydtech.utils.idgen.IdGenerate;
  25. import org.springframework.beans.factory.annotation.Autowired;
  26. import org.springframework.data.redis.core.StringRedisTemplate;
  27. import org.springframework.stereotype.Component;
  28. import org.springframework.util.ObjectUtils;
  29. import org.springframework.util.StringUtils;
  30. import java.math.BigDecimal;
  31. import java.math.RoundingMode;
  32. import java.text.SimpleDateFormat;
  33. import java.util.ArrayList;
  34. import java.util.Date;
  35. import java.util.List;
  36. @Component
  37. public class OrderComponents {
  38. @Autowired
  39. private EsmAgreementService esmAgreementService;
  40. @Autowired
  41. private EsmAgreementProdfeeService esmAgreementProdfeeService;
  42. @Autowired
  43. private InsFeeDetailService insFeeDetailService;
  44. @Autowired
  45. private InsDeptFeeService insDeptFeeService;
  46. @Autowired
  47. private InsCommissionService insCommissionService;
  48. @Autowired
  49. private EsmRetailService esmRetailService;
  50. @Autowired
  51. private EsmUserInternalService esmUserInternalService;
  52. @Autowired
  53. private SysUserService sysUserService;
  54. @Autowired
  55. private InsOrderService insOrderService;
  56. @Autowired
  57. private SysDeptService sysDeptService;
  58. @Autowired
  59. private EsmAgreementProdService esmAgreementProdService;
  60. @Autowired
  61. private StringRedisTemplate redisTemplate;
  62. /**
  63. * 保存费用明细
  64. *
  65. * @param order
  66. */
  67. public void saveFeeDetail(InsOrder order) {
  68. InsFeeDetail feeDetail = new InsFeeDetail();
  69. feeDetail.setOrderno(order.getOrderno());
  70. feeDetail.setQuoteno(order.getQuoteno());
  71. feeDetail.setFeerate(order.getFeerate()); //交强手续费比例
  72. feeDetail.setDisrate(order.getDisrate()); //商业手续费比例
  73. BigDecimal jqfee = new BigDecimal(order.getJqpremium() * order.getFeerate() * 0.01);
  74. jqfee = jqfee.setScale(2, BigDecimal.ROUND_HALF_UP);
  75. feeDetail.setFeeamount(jqfee.doubleValue()); //交强手续费
  76. BigDecimal syfee = new BigDecimal(order.getSypremium() * order.getDisrate() * 0.01);
  77. syfee = syfee.setScale(2, BigDecimal.ROUND_HALF_UP);
  78. feeDetail.setDisamount(syfee.doubleValue()); //商业手续费
  79. feeDetail.setJqdiscountrate(order.getJqdiscountrate());
  80. feeDetail.setSydiscountrate(order.getSydiscountrate());
  81. BigDecimal jqDiscount = new BigDecimal(order.getJqpremium() * order.getJqdiscountrate() * 0.01);
  82. jqDiscount = jqDiscount.setScale(2, RoundingMode.HALF_UP);
  83. feeDetail.setJqdiscount(jqDiscount.doubleValue()); //交强优惠金额
  84. BigDecimal syDiscount = new BigDecimal(order.getSypremium() * order.getSydiscountrate() * 0.01);
  85. syDiscount = syDiscount.setScale(2, RoundingMode.HALF_UP);
  86. feeDetail.setSydiscount(syDiscount.doubleValue()); //商业优惠金额
  87. feeDetail.setJqpremium(order.getJqpremium());
  88. feeDetail.setSypremium(order.getSypremium());
  89. feeDetail.setTaxamount(order.getTaxamount());
  90. feeDetail.setSumpremium(order.getSumpremium());
  91. feeDetail.setInscompany(order.getInscompany());
  92. feeDetail.setAgreeid(order.getAgreeid());
  93. feeDetail.setAgreeprodid(order.getProductid());
  94. EsmAgreement esmAgreement = esmAgreementService.selectByPk(order.getAgreeid());
  95. if (esmAgreement != null) {
  96. feeDetail.setAgreementcode(esmAgreement.getAgreementcode());
  97. feeDetail.setAgreetype(esmAgreement.getAgreementtype());
  98. feeDetail.setChannel(esmAgreement.getChannel());
  99. }
  100. feeDetail.setProducname(order.getProduct());
  101. feeDetail.setAuditstatus("0"); //0未审核 1已审核
  102. insFeeDetailService.insert(feeDetail);
  103. //机构费用
  104. InsDeptFee deptFee = new InsDeptFee();
  105. deptFee.setOrderno(order.getOrderno());
  106. deptFee.setQuoteno(order.getQuoteno());
  107. deptFee.setAgreeid(order.getAgreeid());
  108. deptFee.setAgreeprodid(order.getProductid());
  109. deptFee.setAuditstatus("0");
  110. deptFee.setSettlestatus("0");
  111. List<EsmAgreementProdfee> prodfees = esmAgreementProdfeeService.selectList(" where agreeprodid=?", new Object[]{order.getProductid()});
  112. for (EsmAgreementProdfee prodfee : prodfees) {
  113. deptFee.setKeeprate(prodfee.getKeeprate() * 0.01);
  114. BigDecimal amount = new BigDecimal((order.getJqpremium() + order.getSypremium()) * prodfee.getKeeprate() * 0.01);
  115. amount = amount.setScale(2, BigDecimal.ROUND_HALF_UP);
  116. deptFee.setKeepamount(amount.doubleValue());
  117. deptFee.setAddrate(prodfee.getAddrate() * 0.01);
  118. amount = new BigDecimal((order.getJqpremium() + order.getSypremium()) * prodfee.getAddrate() * 0.01);
  119. amount = amount.setScale(2, BigDecimal.ROUND_HALF_UP);
  120. deptFee.setAddamount(amount.doubleValue());
  121. deptFee.setComlevel(prodfee.getComlevel());
  122. if ("一级".equals(prodfee.getComlevel())) {
  123. deptFee.setComcode(order.getDeptid().substring(0, 2)); //99140302M01D01
  124. } else if ("二级".equals(prodfee.getComlevel())) {
  125. deptFee.setComcode(order.getDeptid().substring(0, 4));
  126. } else if ("三级".equals(prodfee.getComlevel())) {
  127. deptFee.setComcode(order.getDeptid().substring(0, 6));
  128. } else if ("四级".equals(prodfee.getComlevel())) {
  129. deptFee.setComcode(order.getDeptid().substring(0, 8));
  130. } else {
  131. deptFee.setComcode(order.getDeptid().substring(0, 11));
  132. }
  133. insDeptFeeService.insert(deptFee);
  134. }
  135. saveRetail(order); //分销所占比例
  136. }
  137. /**
  138. * 三级分销费用保存
  139. *
  140. * @param order
  141. * @return
  142. */
  143. public double saveRetail(InsOrder order) {
  144. double retailRate = 0;
  145. //1、根据机构匹配分销规则,获取分销比例
  146. List<EsmRetail> list = esmRetailService.selectList(" where deptid = ? and status=?", new Object[]{order.getDeptid(), "1"});
  147. //2、根据userid查询三级推荐人
  148. List<SysUser> users = esmUserInternalService.getSuperior(order.getUserid());
  149. if (list != null && list.size() > 0 && users.size() > 0 && !"0".equals(list.get(0).getRetailtype())) {
  150. EsmRetail retail = list.get(0);
  151. List<Double> rateList = new ArrayList<Double>();
  152. rateList.add(retail.getDisrate1());
  153. rateList.add(retail.getDisrate2());
  154. rateList.add(retail.getDisrate3());
  155. if ("1".equals(retail.getRetailtype())) {//一级分销
  156. InsCommission commission = new InsCommission();
  157. commission.setOrderno(order.getOrderno());
  158. commission.setQuoteno(order.getQuoteno());
  159. commission.setRefereescode(users.get(0).getId());
  160. commission.setRefereesname(users.get(0).getName());
  161. double rate = rateList.get(0) * 0.01;
  162. commission.setCommissionrate(rate);
  163. BigDecimal amount = new BigDecimal((order.getJqpremium() + order.getSypremium()) * rate);
  164. amount = amount.setScale(2, BigDecimal.ROUND_HALF_UP);
  165. commission.setCommissionamount(amount.doubleValue());
  166. commission.setLevel("1");
  167. commission.setAuditstatus("0"); //0未审核 1已审核
  168. commission.setSettlestatus("0"); //0未结算 1已结算
  169. commission.setInsuredtime(order.getAudittime()); //承保确认时间
  170. insCommissionService.insert(commission);
  171. retailRate += rateList.get(0);
  172. } else if ("2".equals(retail.getRetailtype())) {//二级分销
  173. int num = users.size() > 2 ? 2 : users.size();
  174. for (int i = 0; i < num; i++) {
  175. InsCommission commission = new InsCommission();
  176. commission.setOrderno(order.getOrderno());
  177. commission.setQuoteno(order.getQuoteno());
  178. commission.setRefereescode(users.get(i).getId());
  179. commission.setRefereesname(users.get(i).getName());
  180. double rate = rateList.get(i) * 0.01;
  181. commission.setCommissionrate(rate);
  182. BigDecimal amount = new BigDecimal((order.getJqpremium() + order.getSypremium()) * rate);
  183. amount = amount.setScale(2, BigDecimal.ROUND_HALF_UP);
  184. commission.setCommissionamount(amount.doubleValue());
  185. commission.setLevel(String.valueOf(i + 1));
  186. commission.setAuditstatus("0"); //0未审核 1已审核
  187. commission.setSettlestatus("0"); //0未结算 1已结算
  188. commission.setInsuredtime(order.getAudittime()); //承保确认时间
  189. insCommissionService.insert(commission);
  190. retailRate += rateList.get(i);
  191. }
  192. } else {//三级分销
  193. int num = users.size() > 2 ? 3 : users.size();
  194. for (int i = 0; i < num; i++) {
  195. InsCommission commission = new InsCommission();
  196. commission.setOrderno(order.getOrderno());
  197. commission.setQuoteno(order.getQuoteno());
  198. commission.setRefereescode(users.get(i).getId());
  199. commission.setRefereesname(users.get(i).getName());
  200. double rate = rateList.get(i) * 0.01;
  201. commission.setCommissionrate(rate);
  202. BigDecimal amount = new BigDecimal((order.getJqpremium() + order.getSypremium()) * rate);
  203. amount = amount.setScale(2, RoundingMode.HALF_UP);
  204. commission.setCommissionamount(amount.doubleValue());
  205. commission.setLevel(String.valueOf(i + 1));
  206. commission.setAuditstatus("0"); //0未审核 1已审核
  207. commission.setSettlestatus("0"); //0未结算 1已结算
  208. commission.setInsuredtime(order.getAudittime()); //承保确认时间
  209. insCommissionService.insert(commission);
  210. retailRate += rateList.get(i);
  211. }
  212. }
  213. }
  214. return retailRate;
  215. }
  216. /**
  217. * 分销费用统计
  218. *
  219. * @param deptid
  220. * @param userid
  221. * @return
  222. */
  223. public double countRetail(String deptid, String userid) {
  224. double retailRate = 0;
  225. //1、根据机构匹配分销规则,获取分销比例
  226. List<EsmRetail> list = esmRetailService.selectList(" where deptid = ? and status=?", new Object[]{deptid, "1"});
  227. //2、根据userid查询三级推荐人
  228. List<SysUser> users = esmUserInternalService.getSuperior(userid);
  229. if (list != null && list.size() > 0 && users.size() > 0 && !"0".equals(list.get(0).getRetailtype())) {
  230. EsmRetail retail = list.get(0);
  231. List<Double> rateList = new ArrayList<>();
  232. rateList.add(retail.getDisrate1());
  233. rateList.add(retail.getDisrate2());
  234. rateList.add(retail.getDisrate3());
  235. if ("1".equals(retail.getRetailtype())) {//一级分销
  236. retailRate += rateList.get(0);
  237. } else if ("2".equals(retail.getRetailtype())) {//二级分销
  238. int num = Math.min(users.size(), 2);
  239. for (int i = 0; i < num; i++) {
  240. retailRate += rateList.get(i);
  241. }
  242. } else {//三级分销
  243. int num = users.size() > 2 ? 3 : users.size();
  244. for (int i = 0; i < num; i++) {
  245. retailRate += rateList.get(i);
  246. }
  247. }
  248. }
  249. return retailRate;
  250. }
  251. /**
  252. * 校验参数
  253. *
  254. * @param yaQuoteInfoVo
  255. * @throws Exception
  256. */
  257. public void checkEmpty(YaQuoteInfoVo yaQuoteInfoVo) {
  258. if (yaQuoteInfoVo.getCarInfo() == null) {
  259. throw new SystemException("carInfo不能为空!");
  260. }
  261. if (yaQuoteInfoVo.getPolicyHolderInfo() == null || yaQuoteInfoVo.getInsuredPersonInfo() == null) {
  262. throw new SystemException("policyHolderInfo/insuredPersonInfo 不能为空!");
  263. }
  264. if (StringUtils.isEmpty(yaQuoteInfoVo.getCarInfo().getFrameNo())) {
  265. throw new SystemException("车架号不能为空");
  266. }
  267. if (StringUtils.isEmpty(yaQuoteInfoVo.getQuoteno())) {
  268. throw new SystemException("报价号不能为空");
  269. }
  270. if (yaQuoteInfoVo.getRiskList() == null || yaQuoteInfoVo.getRiskList().size() == 0) {
  271. throw new SystemException("riskList 不能为空!");
  272. } else {
  273. for (RiskInfoVo riskInfoVo : yaQuoteInfoVo.getRiskList()) {
  274. if (riskInfoVo.getStartDate() == null || riskInfoVo.getEndDate() == null) {
  275. throw new SystemException("riskList.startDate / riskList.endDate不能为空!");
  276. }
  277. }
  278. }
  279. }
  280. /**
  281. * 生成订单信息
  282. *
  283. * @param record
  284. * @param insCompany
  285. * @return InsOrder
  286. */
  287. public InsOrder geneOrder(YaQuoteInfoVo record, String insCompany, String authComCode) {
  288. checkEmpty(record);
  289. SysUser user = sysUserService.selectByPk(record.getUserId());
  290. if (user == null) {
  291. throw new SystemException("userId不存在");
  292. }
  293. InsOrder insOrder = new InsOrder();
  294. String orderno = IdGenerate.nextId();
  295. insOrder.setOrderno(orderno);
  296. insOrder.setQuoteno(String.valueOf(record.getQuoteno()));
  297. insOrder.setOrderstatus("0"); // 0 报价 1 待核保 2 已核保待缴费 3 核保退回 4 核保不通过
  298. insOrder.setFrameNo(record.getCarInfo().getFrameNo());
  299. insOrder.setLicenseNo(record.getCarInfo().getLicenseNo());
  300. insOrder.setCarinfo(JSONObject.parseObject(JSONObject.toJSONString(record.getCarInfo())));
  301. // 关闭订单 不含当前报价号
  302. InsOrder orderObj = insOrderService.queryQuoteno(new Object[]{record.getUserId(), record.getCarInfo().getFrameNo(), record.getQuoteno()});
  303. if (orderObj != null) {
  304. List<InsOrder> listo = insOrderService.selectList(" where quoteno=?", new Object[]{orderObj.getQuoteno()});
  305. String status = "0";
  306. for (InsOrder order : listo) {
  307. if (!"0".equals(order.getOrderstatus())) {
  308. status = order.getOrderstatus();
  309. }
  310. }
  311. //0报价中 1待核保 2已核保 3核保退回 4核保不通过 5已核保待缴费 6已缴费 7已承保 99已关闭
  312. if ("0".equals(status)) {//关闭订单
  313. insOrderService.closeOrder(orderObj.getOrderno(), "99");
  314. } else if (!"99".equals(status)) {
  315. throw new SystemException("此车辆已提交核保,重新报价请先关闭订单,任务号:" + orderObj.getQuoteno());
  316. }
  317. }
  318. insOrder.setUserid(user.getId());
  319. insOrder.setUsername(user.getName());
  320. insOrder.setDeptid(user.getDeptId());
  321. SysDept dept = sysDeptService.getById(user.getDeptId());
  322. // SysDept dept = sysDeptService.selectByPk(user.getDeptId());
  323. insOrder.setDeptname(dept == null ? "" : dept.getName());
  324. double retailRate = countRetail(user.getDeptId(), user.getId());
  325. insOrder.setOwnerinfo(JSONObject.parseObject(JSONObject.toJSONString(record.getOwnerInfo())));
  326. insOrder.setApplyinfo(JSONObject.parseObject(JSONObject.toJSONString(record.getPolicyHolderInfo())));
  327. insOrder.setInsureinfo(JSONObject.parseObject(JSONObject.toJSONString(record.getInsuredPersonInfo())));
  328. insOrder.setInsuredname(record.getPolicyHolderInfo().getName());
  329. List<RiskInfoVo> risks = record.getRiskList();
  330. for (RiskInfoVo risk : risks) {
  331. if ("0507".equals(risk.getRiskCode())) {//交强
  332. insOrder.setJqstartdate(risk.getStartDate());
  333. insOrder.setJqenddate(risk.getEndDate());
  334. }
  335. if ("0510".equals(risk.getRiskCode())) {//商业
  336. insOrder.setSystartdate(risk.getStartDate());
  337. insOrder.setSyenddate(risk.getEndDate());
  338. }
  339. }
  340. List<KindInfoVo> kinds = record.getKindList();
  341. String productId = "";
  342. String productname = "";
  343. List<EsmAgreement> agreements = esmAgreementService.selectList(" where t.agreestatus='1' and t.insure1 like ? " + "and exists (select 1 from esm_agreement_prod t2 where t.id=t2.agreeid and t2.authcomcode like ?)", new Object[]{authComCode + "%", "%" + user.getDeptId() + "%"});
  344. if (agreements.size() == 0) {
  345. throw new SystemException("不存在有效协议或机构" + user.getDeptId() + "未授权");
  346. }
  347. String agreeid = agreements.get(0).getId();
  348. insOrder.setAgreeid(agreeid);
  349. //匹配协议,获取费用
  350. StringBuffer whereStr = new StringBuffer();
  351. List params = new ArrayList();// where t.agreeid=? and t.productid in ()
  352. whereStr.append("where t.agreeid=? ");
  353. params.add(agreeid);
  354. if (risks.size() == 1 && "0507".equals(risks.get(0).getRiskCode())) {
  355. productId = "ZG01001";
  356. productname = "单交强";
  357. whereStr.append(" and t.productid=?");
  358. params.add(productId);
  359. } else if (risks.size() == 1 && kinds.size() == 1 && "B".equals(kinds.get(0).getKindCode())) {
  360. productId = "ZG01002";
  361. productname = "单三者";
  362. whereStr.append(" and t.productid=?");
  363. params.add(productId);
  364. } else if (risks.size() == 1) {
  365. productId = "ZG01003";
  366. productname = "单商业";
  367. whereStr.append(" and t.productid=?");
  368. params.add(productId);
  369. } else if (risks.size() == 2 && kinds.size() == 1 && "B".equals(kinds.get(0).getKindCode())) {
  370. productId = "ZG01004";
  371. productname = "交强+三者";
  372. whereStr.append(" and t.productid in (?,?)");
  373. params.add("ZG01004");
  374. params.add("ZG01005");
  375. } else {
  376. productId = "ZG01006";
  377. productname = "交强+商业";
  378. whereStr.append(" and t.productid in (?,?)");
  379. params.add("ZG01006");
  380. params.add("ZG01007");
  381. }
  382. insOrder.setProductid(productId);
  383. insOrder.setProduct(productname);
  384. List<EsmAgreementProd> agreementProds = esmAgreementProdService.selectList(whereStr.toString(), params.toArray());
  385. for (EsmAgreementProd prod : agreementProds) {
  386. if ("ZG01001".equals(prod.getProductid()) || "ZG01004".equals(prod.getProductid()) || "ZG01006".equals(prod.getProductid())) {
  387. insOrder.setFeerate(prod.getProductrate());//交强手续费比例
  388. insOrder.setJqdiscountrate(prod.getFeerate() - retailRate); //交强优惠比例=业务员绩效-分销费用
  389. } else {
  390. insOrder.setDisrate(prod.getProductrate()); //商业手续费比例
  391. insOrder.setSydiscountrate(prod.getFeerate() - retailRate); //商业优惠比例=业务员绩效-分销费用
  392. }
  393. insOrder.setProductid(prod.getId());
  394. }
  395. insOrder.setRiskinfo(JSONObject.parseArray(JSONObject.toJSONString(record.getRiskList())));
  396. insOrder.setKindinfo(JSONObject.parseArray(JSONObject.toJSONString(record.getKindList())));
  397. SimpleDateFormat sdfm = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  398. insOrder.setInscompany(insCompany);
  399. insOrder.setCreatetime(sdfm.format(new Date()));
  400. return insOrder;
  401. }
  402. public InsOrder orderExists(String orderNo) {
  403. InsOrder insOrder = insOrderService.selectByPk(orderNo);
  404. if (ObjectUtils.isEmpty(insOrder)) {
  405. throw new SystemException("订单不存在");
  406. }
  407. return insOrder;
  408. }
  409. }