InsFeeAuditServiceImpl.java 62 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156
  1. package com.ydtech.modules.fnc.service.impl;
  2. import cn.dev33.satoken.stp.StpUtil;
  3. import cn.hutool.core.collection.CollUtil;
  4. import com.alibaba.fastjson.JSON;
  5. import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
  6. import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
  7. import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
  8. import com.ydtech.constants.enums.dict.FeeAuditAuditstatus;
  9. import com.ydtech.constants.enums.dict.ins.InsFeeAuditDistributionStatusEnum;
  10. import com.ydtech.exception.SystemException;
  11. import com.ydtech.modules.admin.model.SysDept;
  12. import com.ydtech.modules.admin.model.SysDeptAccount;
  13. import com.ydtech.modules.admin.model.SysUser;
  14. import com.ydtech.modules.admin.model.SysUserRole;
  15. import com.ydtech.modules.admin.dao.SysPartnerAccountMapper;
  16. import com.ydtech.modules.admin.dao.SysPremiumDetailsMapper;
  17. import com.ydtech.modules.admin.model.*;
  18. import com.ydtech.modules.admin.model.po.SysChannelCost;
  19. import com.ydtech.modules.admin.model.po.SysUserAccount;
  20. import com.ydtech.modules.admin.model.vo.SysUserBaseVO;
  21. import com.ydtech.modules.admin.service.*;
  22. import com.ydtech.modules.base.controller.BaseController;
  23. import com.ydtech.modules.esm.model.EsmUserReferrer;
  24. import com.ydtech.modules.esm.service.EsmUserReferrerService;
  25. import com.ydtech.modules.fnc.dao.FncInsAreaCompanyMapper;
  26. import com.ydtech.modules.fnc.dao.InsFeeAuditMapper;
  27. import com.ydtech.modules.fnc.dao.InsPlyIncomeMapper;
  28. import com.ydtech.modules.fnc.entity.InsAreaCompany;
  29. import com.ydtech.modules.fnc.entity.InsFeeAudit;
  30. import com.ydtech.modules.fnc.entity.InsFeeAuditHistory;
  31. import com.ydtech.modules.fnc.entity.InsPlyIncome;
  32. import com.ydtech.modules.fnc.service.InsFeeAuditHistoryService;
  33. import com.ydtech.modules.fnc.service.InsFeeAuditService;
  34. import com.ydtech.modules.fnc.service.InsPlyIncomeService;
  35. import com.ydtech.modules.ins.model.InsCommission;
  36. import com.ydtech.modules.ins.model.InsCompanyFee;
  37. import com.ydtech.modules.ins.model.InsDeptFee;
  38. import com.ydtech.modules.ins.service.InsCommissionService;
  39. import com.ydtech.modules.ins.service.InsCompanyFeeService;
  40. import com.ydtech.modules.ins.service.InsDeptFeeService;
  41. import com.ydtech.modules.order.constants.BusinessConstant;
  42. import com.ydtech.modules.order.dao.InsOrdersMapper;
  43. import com.ydtech.modules.order.entity.InsFeeOrder;
  44. import com.ydtech.modules.order.entity.InsOrders;
  45. import com.ydtech.modules.order.entity.vo.FeeOrderNewVo;
  46. import com.ydtech.modules.order.entity.vo.OrderVo;
  47. import com.ydtech.modules.order.entity.vo.sendProject.SendProjectInfo;
  48. import com.ydtech.modules.protocol.service.PtlAgreementService;
  49. import com.ydtech.modules.protocol.utils.AssertionUtils;
  50. import com.ydtech.modules.protocols.entity.po.InsFeeOrderNew;
  51. import com.ydtech.modules.protocols.entity.po.InsFeeOrderNewDistribution;
  52. import com.ydtech.modules.protocols.service.InsFeeOrderNewDistributionService;
  53. import com.ydtech.modules.protocols.service.InsFeeOrderNewService;
  54. import com.ydtech.modules.sendProject.dao.SendProjectMapper;
  55. import com.ydtech.modules.sendProject.entity.SendProjectEntity;
  56. import com.ydtech.utils.DateUtil;
  57. import com.ydtech.utils.StringUtils;
  58. import com.ydtech.utils.idgen.IdGenerate;
  59. import com.ydtech.utils.sendProjectUtils.SendProjrctUtils;
  60. import lombok.extern.slf4j.Slf4j;
  61. import org.apache.commons.lang3.ObjectUtils;
  62. import org.redisson.Redisson;
  63. import org.redisson.api.RLock;
  64. import org.springframework.beans.BeanUtils;
  65. import org.springframework.beans.factory.annotation.Autowired;
  66. import org.springframework.stereotype.Service;
  67. import org.springframework.transaction.annotation.Transactional;
  68. import javax.annotation.Resource;
  69. import java.math.BigDecimal;
  70. import java.text.SimpleDateFormat;
  71. import java.time.LocalDateTime;
  72. import java.util.*;
  73. import java.util.concurrent.ExecutorService;
  74. import java.util.concurrent.Executors;
  75. import java.util.concurrent.TimeUnit;
  76. /**
  77. * <p>
  78. * 服务实现类
  79. * </p>
  80. *
  81. * @author gws
  82. * @since 2023-11-22
  83. */
  84. @Service
  85. @Slf4j
  86. public class InsFeeAuditServiceImpl extends ServiceImpl<InsFeeAuditMapper, InsFeeAudit> implements InsFeeAuditService {
  87. private final InsOrdersMapper insOrdersMapper;
  88. private final InsPlyIncomeMapper insPlyIncomeMapper;
  89. private final FncInsAreaCompanyMapper insAreaCompanyMapper;
  90. private final InsDeptFeeService insDeptFeeService;
  91. private final InsCommissionService insCommissionService;
  92. private final InsCompanyFeeService insCompanyFeeService;
  93. private final EsmUserReferrerService esmUserReferrerService;
  94. private final SysUserService sysUserService;
  95. @Autowired
  96. private InsFeeOrderNewService insFeeOrderNewService;
  97. @Autowired
  98. private SysUserAccountService sysUserAccountService;
  99. @Autowired
  100. private SysDeptService sysDeptService;
  101. @Autowired
  102. private SysDeptAccountService sysDeptAccountService;
  103. @Autowired
  104. private SysDeptAccountHistoryService sysDeptAccountHistoryService;
  105. @Autowired
  106. private InsPlyIncomeService insPlyIncomeService;
  107. @Autowired
  108. private InsFeeAuditHistoryService insFeeAuditHistoryService;
  109. @Autowired
  110. private PtlAgreementService ptlAgreementService;
  111. @Autowired
  112. private SysChannelCostService sysChannelCostService;
  113. @Resource
  114. private SysPremiumDetailsMapper sysPremiumDetailsMapper;
  115. @Resource
  116. private SysPartnerAccountMapper sysPartnerAccountMapper;
  117. @Autowired
  118. private Redisson redisson;
  119. @Resource
  120. private InsFeeOrderNewDistributionService insFeeOrderNewDistributionService;
  121. @Autowired
  122. private SendProjrctUtils sendProjrctUtils;
  123. @Autowired
  124. private SysUserRoleService sysUserRoleService;
  125. @Autowired
  126. private SendProjectMapper sendProjectMapper;
  127. private ExecutorService executorService= Executors.newCachedThreadPool();
  128. private static final String STRING_0 = "0";
  129. private static final String STRING_1 = "1";
  130. private static final String STRING_2 = "2";
  131. private static final Integer INTEGER_0 = 0;
  132. public InsFeeAuditServiceImpl(FncInsAreaCompanyMapper insAreaCompanyMapper, InsOrdersMapper insOrdersMapper,
  133. InsDeptFeeService insDeptFeeService, EsmUserReferrerService esmUserReferrerService,
  134. SysUserService sysUserService, InsCommissionService insCommissionService,
  135. InsCompanyFeeService insCompanyFeeService, InsPlyIncomeMapper insPlyIncomeMapper) {
  136. this.insAreaCompanyMapper = insAreaCompanyMapper;
  137. this.insOrdersMapper = insOrdersMapper;
  138. this.insDeptFeeService = insDeptFeeService;
  139. this.esmUserReferrerService = esmUserReferrerService;
  140. this.sysUserService = sysUserService;
  141. this.insCommissionService = insCommissionService;
  142. this.insCompanyFeeService = insCompanyFeeService;
  143. this.insPlyIncomeMapper = insPlyIncomeMapper;
  144. }
  145. @Override
  146. @Transactional
  147. public void feeAudit(String orderNo, String insOrderNo, boolean isAutoAudit, String auditStatus) {
  148. // add by 2024-09-25 强制配置电销组长逻辑
  149. InsOrders order = insOrdersMapper.selectById(orderNo);
  150. SysUserBaseVO sysUserBaseVO = sysUserService.selectUserById(order.getUserid());
  151. SysUser user = sysUserService.getById(order.getUserid());
  152. SysDept dept = sysDeptService.getById(user.getDeptId());
  153. if("3".equals(sysUserBaseVO.getRoleId()) && "3".equals(dept.getManagementSource())){
  154. //查找电销组长,没有的话提示
  155. if (StringUtils.isBlank(user.getManagerId())) {
  156. throw new SystemException("电销组员未配置电销管理人");
  157. }
  158. }
  159. RLock locked = redisson.getLock("feeAudit." + insOrderNo);
  160. try {
  161. boolean isLock = locked.tryLock(60, 10, TimeUnit.SECONDS);
  162. if (!isLock) {
  163. throw new SystemException("当前业务繁忙,请稍后重试\n");
  164. }
  165. //添加费用审核表及轨迹信息
  166. InsFeeAudit insFeeAudit = saveInsFeeAuditAndHistory(orderNo, insOrderNo, isAutoAudit, auditStatus);
  167. //InsOrders order = insOrdersMapper.selectById(orderNo);
  168. InsAreaCompany insAreaCompany = insAreaCompanyMapper.selectById(insFeeAudit.getInsOrderNo());
  169. //获取该订单的费用
  170. InsFeeOrderNew insFeeOrderNew = insFeeOrderNewService.getOne(new LambdaQueryWrapper<InsFeeOrderNew>()
  171. .eq(InsFeeOrderNew::getInsOrderNo, insFeeAudit.getInsOrderNo()));
  172. //生成机构费用
  173. gene_deptfee(order, insFeeOrderNew, insAreaCompany);
  174. //结算费用生成
  175. insPlyIncomeService.saveBalanceNew(order, insFeeOrderNew, insAreaCompany, user.getLeaderId(), user.getLeaderName());
  176. //生成 用户账户表 数据
  177. if (StringUtils.isNotEmpty(order.getUserid())) {
  178. //用戶賬戶表
  179. SysUserAccount sysUserAccount = new SysUserAccount();
  180. //add by hxl 2024-05-07 begin ==========
  181. //判断当前用户是否是出单员,如果是直接给团队长结算 角色id为19为出单员
  182. String userId = "";
  183. // SysUserBaseVO sysUserBaseVO = sysUserService.selectUserById(order.getUserid());
  184. // SysUser user = sysUserService.getById(order.getUserid());
  185. // SysDept dept = sysDeptService.getById(user.getDeptId());
  186. //出单员是19 且是渠道的话,给渠道团队长
  187. if ("19".equals(sysUserBaseVO.getRoleId()) && "1".equals(dept.getManagementSource())) {
  188. //查找该出单员的的团队长
  189. //找到上级
  190. userId = user.getOperatorCode();
  191. //if (userId == null || "".equals(userId)) {
  192. // throw new SystemException("出单员" + sysUserBaseVO.getName() + "所在机构缺少团队长,请设置!!!");
  193. //}
  194. //添加电销出单员出去单给电销组长结算
  195. } else if("3".equals(sysUserBaseVO.getRoleId()) && "3".equals(dept.getManagementSource())){
  196. //查找电销组长
  197. userId = user.getManagerId();
  198. } else {
  199. userId = order.getUserid();
  200. }
  201. sysUserAccount.setUserId(userId);
  202. // add by hxl 2024-05-07 end ==================
  203. if (ObjectUtils.isNotEmpty(insFeeOrderNew)) {
  204. //用户出口手续费
  205. BigDecimal totalPremiumAmount = new BigDecimal(0);
  206. totalPremiumAmount = totalPremiumAmount.add(insFeeOrderNew.getJqExportSuperviseCostsPremiums())
  207. .add(insFeeOrderNew.getSyExportSuperviseCostsPremiums()).add(insFeeOrderNew.getNoExportSuperviseCostsPremiums());
  208. //用户出口跟单费
  209. BigDecimal totalOtherPremiumAmount = new BigDecimal(0);
  210. totalOtherPremiumAmount =
  211. totalOtherPremiumAmount.add(insFeeOrderNew.getJqExportOtherCostsPremiums()).add(insFeeOrderNew.getSyExportOtherCostsPremiums()).add(insFeeOrderNew.getNoExportOtherCostsPremiums());
  212. //用戶
  213. //算佣金
  214. this.countUserAmount(insFeeOrderNew, insAreaCompany.getId());
  215. sysUserAccount.setHandlingFee(totalPremiumAmount);
  216. sysUserAccount.setDocumentary(totalOtherPremiumAmount);
  217. sysUserAccount.setDocumentaryStatus("2"); // 收入
  218. sysUserAccount.setSuborderId(insAreaCompany.getId()); // 订单Id
  219. sysUserAccountService.addOrUpdate(sysUserAccount);
  220. if (insFeeOrderNew.getDistributionStatus() != null) {
  221. createInsFeeOrderNewDistribution(insFeeOrderNew, insAreaCompany, order, order.getUserid(), BigDecimal.ZERO, BigDecimal.ZERO, "0");
  222. if (insFeeOrderNew.getFirstLevelUserId() != null) {
  223. createInsFeeOrderNewDistribution(insFeeOrderNew, insAreaCompany, order,
  224. insFeeOrderNew.getFirstLevelUserId(), insFeeOrderNew.getFirstDetailProportion(),
  225. insFeeOrderNew.getFirstDetailPremiums(), "1");
  226. }
  227. if (insFeeOrderNew.getTwoLevelUserId() != null) {
  228. createInsFeeOrderNewDistribution(insFeeOrderNew, insAreaCompany, order,
  229. insFeeOrderNew.getTwoLevelUserId(), insFeeOrderNew.getSecondDetailProportion(),
  230. insFeeOrderNew.getSecondDetailPremiums(), "2");
  231. }
  232. if (insFeeOrderNew.getThreeLevelUserId() != null) {
  233. createInsFeeOrderNewDistribution(insFeeOrderNew, insAreaCompany, order,
  234. insFeeOrderNew.getThreeLevelUserId(), insFeeOrderNew.getThirdDetailProportion(),
  235. insFeeOrderNew.getThirdDetailPremiums(), "3");
  236. }
  237. }
  238. String deptid = insFeeOrderNew.getDeptId();
  239. // 定义一个数组来存储各级机构的管理费
  240. BigDecimal[] jqDeptPremiumsLevels = {insFeeOrderNew.getJqDeptPremiumsLevel1(), insFeeOrderNew.getJqDeptPremiumsLevel2(),
  241. insFeeOrderNew.getJqDeptPremiumsLevel3(), insFeeOrderNew.getJqDeptPremiumsLevel4(),
  242. insFeeOrderNew.getJqDeptPremiumsLevel5()};
  243. BigDecimal[] syDeptPremiumsLevels = {insFeeOrderNew.getSyDeptPremiumsLevel1(), insFeeOrderNew.getSyDeptPremiumsLevel2(),
  244. insFeeOrderNew.getSyDeptPremiumsLevel3(), insFeeOrderNew.getSyDeptPremiumsLevel4(),
  245. insFeeOrderNew.getSyDeptPremiumsLevel5()};
  246. BigDecimal[] noDeptPremiumsLevels = {insFeeOrderNew.getNoDeptPremiumsLevel1(), insFeeOrderNew.getNoDeptPremiumsLevel2(),
  247. insFeeOrderNew.getNoDeptPremiumsLevel3(), insFeeOrderNew.getNoDeptPremiumsLevel4(),
  248. insFeeOrderNew.getNoDeptPremiumsLevel5()};
  249. for (int i = 1; i <= 5; i++) {
  250. // 根据循环次数确定机构ID的长度,第五级为11
  251. String levelDeptId = deptid.substring(0, (i == 5) ? 11 : i * 2);
  252. // 获取对应级别的机构信息
  253. SysDeptAccount levelSysDeptAccount = sysDeptAccountService.getOne(new LambdaQueryWrapper<SysDeptAccount>()
  254. .eq(SysDeptAccount::getDeptId, levelDeptId));
  255. // 初始化管理费总额为0
  256. BigDecimal sumManagementFee = BigDecimal.ZERO;
  257. // 根据分销等级和分销用户情况计算分销费用
  258. BigDecimal distributionFee = BigDecimal.ZERO;
  259. if (i == 1) {
  260. if (insFeeOrderNew.getFirstLevelUserId() == null) {
  261. distributionFee = distributionFee.add(insFeeOrderNew.getFirstDetailPremiums());
  262. }
  263. if (insFeeOrderNew.getTwoLevelUserId() == null) {
  264. distributionFee = distributionFee.add(insFeeOrderNew.getSecondDetailPremiums());
  265. }
  266. if (insFeeOrderNew.getThreeLevelUserId() == null) {
  267. distributionFee = distributionFee.add(insFeeOrderNew.getThirdDetailPremiums());
  268. }
  269. }
  270. // 根据分销等级计算管理费总额
  271. sumManagementFee = sumManagementFee.add(jqDeptPremiumsLevels[i - 1])
  272. .add(syDeptPremiumsLevels[i - 1])
  273. .add(noDeptPremiumsLevels[i - 1]);
  274. if (i == 1) {
  275. sumManagementFee = sumManagementFee.add(distributionFee);
  276. }
  277. // 如果机构信息不为空,更新管理费并记录历史
  278. if (levelSysDeptAccount != null) {
  279. levelSysDeptAccount.setManagementFee(levelSysDeptAccount.getManagementFee().add(sumManagementFee));
  280. sysDeptAccountService.updateById(levelSysDeptAccount);
  281. } else {
  282. // 如果机构信息为空,新建机构信息并记录历史
  283. levelSysDeptAccount = new SysDeptAccount();
  284. levelSysDeptAccount.setDeptId(levelDeptId);
  285. levelSysDeptAccount.setManagementFee(sumManagementFee);
  286. levelSysDeptAccount.setCreateTime(new Date());
  287. sysDeptAccountService.save(levelSysDeptAccount);
  288. }
  289. // 记录历史信息
  290. // 拼接备注
  291. String remark = this.getDeptFeeHistoryLog(i, jqDeptPremiumsLevels, syDeptPremiumsLevels, noDeptPremiumsLevels,
  292. distributionFee);
  293. sysDeptAccountHistoryService.addHistory(levelDeptId, sumManagementFee, levelSysDeptAccount.getManagementFee(), "2",
  294. insOrderNo, BaseController.getUser().getId(), remark);
  295. }
  296. }
  297. }
  298. // 获取加投结算数据 并审核通过
  299. LambdaQueryWrapper<SysChannelCost> costWrapper = new LambdaQueryWrapper<>();
  300. costWrapper.eq(SysChannelCost::getOrderNo, insOrderNo);
  301. List<SysChannelCost> costList = sysChannelCostService.list(costWrapper);
  302. if(CollUtil.isNotEmpty(costList)){
  303. for (SysChannelCost sysChannelCost : costList) {
  304. sysChannelCost.setStatus(1); // 审核通过
  305. sysChannelCost.setPayDate(insAreaCompany.getPayDate());
  306. sysChannelCost.setSigningTime(insAreaCompany.getSigningTime());
  307. sysChannelCost.setUpdateTime(LocalDateTime.now());
  308. sysChannelCost.setUpdateBy(BaseController.getUser().getName());
  309. }
  310. sysChannelCostService.updateBatchById(costList);
  311. }
  312. // //抽层状态修改
  313. // sysPremiumDetailsMapper.updateStatus(insAreaCompany.getId());
  314. // List<SysPremiumDetails> sysPremiumDetails = sysPremiumDetailsMapper.selectList(new LambdaQueryWrapper<SysPremiumDetails>()
  315. // .eq(SysPremiumDetails::getCompanyId,insAreaCompany.getId()).eq(SysPremiumDetails::getType,2));
  316. // if (sysPremiumDetails.size()>0) {
  317. // for (SysPremiumDetails sysPremiumDetail : sysPremiumDetails) {
  318. // SysPartnerAccount sysPartnerAccount = sysPartnerAccountMapper.selectOne(new LambdaQueryWrapper<SysPartnerAccount>()
  319. // .eq(SysPartnerAccount::getUserId,sysPremiumDetail.getUserId()));
  320. // if (sysPartnerAccount == null) {
  321. // SysPartnerAccount sysPartnerAccount1 = new SysPartnerAccount();
  322. // sysPartnerAccount1.setCreateTime(new Date());
  323. // sysPartnerAccount1.setSumPremium(sysPremiumDetail.getSumpremium());
  324. // sysPartnerAccount1.setExtractFee(sysPremiumDetail.getExtractFee());
  325. // sysPartnerAccount1.setCashFee(sysPremiumDetail.getExtractFee());
  326. // sysPartnerAccount1.setUserId(sysPremiumDetail.getUserId());
  327. // sysPartnerAccountMapper.insert(sysPartnerAccount1);
  328. // }else {
  329. // sysPartnerAccount.setSumPremium(sysPartnerAccount.getSumPremium().add(sysPremiumDetail.getSumpremium()));
  330. // sysPartnerAccount.setExtractFee(sysPartnerAccount.getExtractFee().add(sysPremiumDetail.getExtractFee()));
  331. // sysPartnerAccount.setCashFee(sysPartnerAccount.getCashFee().add(sysPremiumDetail.getExtractFee()));
  332. // sysPartnerAccountMapper.updateById(sysPartnerAccount);
  333. // }
  334. // }
  335. //
  336. // }
  337. } catch (Exception e) {
  338. throw new SystemException("当前业务繁忙,请稍后重试");
  339. } finally {
  340. //释放锁
  341. if (locked.isHeldByCurrentThread()) {
  342. locked.unlock();
  343. }
  344. }
  345. }
  346. private void createInsFeeOrderNewDistribution(InsFeeOrderNew insFeeOrderNew, InsAreaCompany insAreaCompany, InsOrders insOrders,
  347. String userId, BigDecimal commissionRate, BigDecimal commissionAmount,
  348. String commissionLevel) {
  349. InsFeeOrderNewDistribution insFeeOrderNewDistribution = new InsFeeOrderNewDistribution();
  350. insFeeOrderNewDistribution.setId(IdGenerate.nextId());
  351. insFeeOrderNewDistribution.setOrderNo(insFeeOrderNew.getInsOrderNo());
  352. insFeeOrderNewDistribution.setJqPolicyNo(insAreaCompany.getJqpolicyno());
  353. insFeeOrderNewDistribution.setSyPolicyNo(insAreaCompany.getSypolicyno());
  354. insFeeOrderNewDistribution.setOperator(insOrders.getUserid());
  355. insFeeOrderNewDistribution.setLicenseNo(insOrders.getLicenseno());
  356. insFeeOrderNewDistribution.setProductId(insAreaCompany.getProductid());
  357. insFeeOrderNewDistribution.setProduct(insAreaCompany.getProduct());
  358. insFeeOrderNewDistribution.setSignTime(insAreaCompany.getSigningTime());
  359. insFeeOrderNewDistribution.setInsCompany(insAreaCompany.getInscompany());
  360. insFeeOrderNewDistribution.setUserId(userId);
  361. insFeeOrderNewDistribution.setCommissionRate(commissionRate);
  362. insFeeOrderNewDistribution.setCommissionAmount(commissionAmount);
  363. insFeeOrderNewDistribution.setCommissionLevel(commissionLevel);
  364. insFeeOrderNewDistribution.setCreateTime(new Date());
  365. // 保存insFeeOrderNewDistribution
  366. insFeeOrderNewDistributionService.save(insFeeOrderNewDistribution);
  367. }
  368. private String getDeptFeeHistoryLog(Integer index, BigDecimal[] jqDeptPremiumsLevels, BigDecimal[] syDeptPremiumsLevels,
  369. BigDecimal[] noDeptPremiumsLevels, BigDecimal distributionFee) {
  370. StringBuilder remarkBuilder = new StringBuilder();
  371. if (jqDeptPremiumsLevels[index - 1].compareTo(BigDecimal.ZERO) != 0) {
  372. remarkBuilder.append("交强").append(index).append("级机构管理费:");
  373. remarkBuilder.append(jqDeptPremiumsLevels[index - 1]).append(",");
  374. }
  375. if (syDeptPremiumsLevels[index - 1].compareTo(BigDecimal.ZERO) != 0) {
  376. remarkBuilder.append("商业").append(index).append("级机构管理费:");
  377. remarkBuilder.append(syDeptPremiumsLevels[index - 1]).append(",");
  378. }
  379. if (noDeptPremiumsLevels[index - 1].compareTo(BigDecimal.ZERO) != 0) {
  380. remarkBuilder.append("非车").append(index).append("级机构管理费:");
  381. remarkBuilder.append(noDeptPremiumsLevels[index - 1]).append(",");
  382. }
  383. if (distributionFee.compareTo(BigDecimal.ZERO) != 0) {
  384. remarkBuilder.append("分销费:").append(distributionFee).append(",");
  385. }
  386. String remark = remarkBuilder.toString();
  387. if (remark.endsWith(",")) {
  388. remark = remark.substring(0, remark.length() - 1);
  389. }
  390. return remark;
  391. }
  392. private void countUserAmount(InsFeeOrderNew insFeeOrderNew, String orderNo) {
  393. String distributionStatus = insFeeOrderNew.getDistributionStatus();
  394. if (StringUtils.isNotEmpty(distributionStatus)) {
  395. if (InsFeeAuditDistributionStatusEnum.DS_3.getCode().equals(distributionStatus)) {
  396. BigDecimal totalDept = BigDecimal.ZERO;
  397. if (StringUtils.isNotEmpty(insFeeOrderNew.getFirstLevelUserId())) {
  398. String firstLevelUserId = insFeeOrderNew.getFirstLevelUserId();
  399. BigDecimal firstDetailPremiums = insFeeOrderNew.getFirstDetailPremiums();
  400. this.saveUpdateAccount(firstLevelUserId, firstDetailPremiums, orderNo);
  401. } else {
  402. totalDept = totalDept.add(insFeeOrderNew.getFirstDetailPremiums());
  403. }
  404. if (StringUtils.isNotEmpty(insFeeOrderNew.getTwoLevelUserId())) {
  405. String twoLevelUserId = insFeeOrderNew.getTwoLevelUserId();
  406. BigDecimal secondDetailProportion = insFeeOrderNew.getSecondDetailPremiums();
  407. this.saveUpdateAccount(twoLevelUserId, secondDetailProportion, orderNo);
  408. } else {
  409. totalDept = totalDept.add(insFeeOrderNew.getSecondDetailPremiums());
  410. }
  411. if (StringUtils.isNotEmpty(insFeeOrderNew.getThreeLevelUserId())) {
  412. String threeLevelUserId = insFeeOrderNew.getThreeLevelUserId();
  413. BigDecimal threeDetailPremiums = insFeeOrderNew.getThirdDetailPremiums();
  414. this.saveUpdateAccount(threeLevelUserId, threeDetailPremiums, orderNo);
  415. } else {
  416. totalDept = totalDept.add(insFeeOrderNew.getThirdDetailPremiums());
  417. }
  418. // 机构管理 费用给五级交钱机构管理费
  419. if (totalDept.compareTo(BigDecimal.ZERO) == 0) {
  420. BigDecimal jqDeptPremiumsLevel5 = insFeeOrderNew.getJqDeptPremiumsLevel5();
  421. jqDeptPremiumsLevel5.add(totalDept);
  422. insFeeOrderNewService.updateById(insFeeOrderNew);
  423. }
  424. } else if (InsFeeAuditDistributionStatusEnum.DS_2.getCode().equals(distributionStatus)) {
  425. BigDecimal totalDept = BigDecimal.ZERO;
  426. if (StringUtils.isNotEmpty(insFeeOrderNew.getFirstLevelUserId())) {
  427. String firstLevelUserId = insFeeOrderNew.getFirstLevelUserId();
  428. BigDecimal firstDetailPremiums = insFeeOrderNew.getFirstDetailPremiums();
  429. this.saveUpdateAccount(firstLevelUserId, firstDetailPremiums, orderNo);
  430. } else {
  431. totalDept = totalDept.add(insFeeOrderNew.getFirstDetailPremiums());
  432. }
  433. if (StringUtils.isNotEmpty(insFeeOrderNew.getTwoLevelUserId())) {
  434. String twoLevelUserId = insFeeOrderNew.getTwoLevelUserId();
  435. BigDecimal secondDetailProportion = insFeeOrderNew.getSecondDetailPremiums();
  436. this.saveUpdateAccount(twoLevelUserId, secondDetailProportion, orderNo);
  437. } else {
  438. totalDept = totalDept.add(insFeeOrderNew.getSecondDetailPremiums());
  439. }
  440. // 机构管理 费用给五级交钱机构管理费
  441. if (totalDept.compareTo(BigDecimal.ZERO) == 0) {
  442. BigDecimal jqDeptPremiumsLevel5 = insFeeOrderNew.getJqDeptPremiumsLevel5();
  443. jqDeptPremiumsLevel5.add(totalDept);
  444. insFeeOrderNewService.updateById(insFeeOrderNew);
  445. }
  446. } else {
  447. // 一级分销
  448. if (StringUtils.isNotEmpty(insFeeOrderNew.getFirstLevelUserId())) {
  449. String firstLevelUserId = insFeeOrderNew.getFirstLevelUserId();
  450. BigDecimal firstDetailPremiums = insFeeOrderNew.getFirstDetailPremiums();
  451. this.saveUpdateAccount(firstLevelUserId, firstDetailPremiums, orderNo);
  452. } else {
  453. if (insFeeOrderNew.getFirstDetailPremiums().compareTo(BigDecimal.ZERO) == 0) {
  454. BigDecimal jqDeptPremiumsLevel5 = insFeeOrderNew.getJqDeptPremiumsLevel5();
  455. jqDeptPremiumsLevel5.add(insFeeOrderNew.getFirstDetailPremiums());
  456. insFeeOrderNewService.updateById(insFeeOrderNew);
  457. }
  458. }
  459. }
  460. }
  461. }
  462. private void saveUpdateAccount(String userId, BigDecimal amount, String orderNo) {
  463. SysUserAccount sysUserOldAccount = new SysUserAccount();
  464. sysUserOldAccount.setUserId(userId);
  465. sysUserOldAccount.setPromotion(amount);
  466. sysUserOldAccount.setDocumentaryStatus("2"); // 收入
  467. sysUserOldAccount.setSuborderId(orderNo);
  468. sysUserAccountService.addOrUpdate(sysUserOldAccount);
  469. }
  470. private BigDecimal zeroBigdecimal(BigDecimal amount) {
  471. if (amount == null) {
  472. return amount = BigDecimal.ZERO;
  473. } else {
  474. return amount;
  475. }
  476. }
  477. /**
  478. * 生成保司费用(应收费用)
  479. *
  480. * @param order
  481. * @param insFeeOrder
  482. * @throws Exception
  483. */
  484. private void gene_orderIncome(InsOrders order, InsFeeOrderNew insFeeOrder, InsAreaCompany plyDto) throws Exception {
  485. InsPlyIncome insPlyIncome = new InsPlyIncome();
  486. insPlyIncome.setOrderno(order.getOrderno());
  487. insPlyIncome.setDeptId(order.getDeptid());
  488. insPlyIncome.setCompanyId(plyDto.getCompanyId());
  489. insPlyIncome.setAgreementId(String.valueOf(plyDto.getAgreementId()));
  490. insPlyIncome.setLicenseno(order.getLicenseno());
  491. insPlyIncome.setPayDate(StringUtils.isNullOrEmpty(plyDto.getPayDate()) ? plyDto.getCreatetime() : plyDto.getPayDate());
  492. insPlyIncome.setSignDate(StringUtils.isNullOrEmpty(plyDto.getInsidePayTime()) ? plyDto.getPayDate() : plyDto.getInsidePayTime());
  493. insPlyIncome.setCreateTime(LocalDateTime.now());
  494. if (StringUtils.isNotEmpty(plyDto.getJqpolicyno())) {
  495. insPlyIncome.setPolicyno(plyDto.getJqpolicyno());
  496. insPlyIncome.setRiskcode("交强");
  497. insPlyIncome.setTaxamount(plyDto.getTaxamount());
  498. if (!ObjectUtils.isEmpty(insFeeOrder)) {
  499. insPlyIncome.setNoTaxPremium(insFeeOrder.getJqNoTaxPremium());
  500. insPlyIncome.setCommissionFeerate(insFeeOrder.getJqSuperviseCostsProportion());
  501. insPlyIncome.setOtherFeerate(insFeeOrder.getJqCostsProportion().subtract(insFeeOrder.getJqSuperviseCostsProportion()));
  502. insPlyIncome.setCommissionFeevalue(insFeeOrder.getJqSuperviseCostsPremiums());
  503. insPlyIncome.setOtherFeevalue(insFeeOrder.getJqCostsPremiums().subtract(insFeeOrder.getJqSuperviseCostsPremiums()));
  504. insPlyIncome.setAllFeeValue(insFeeOrder.getJqCostsPremiums());
  505. }
  506. insPlyIncomeMapper.insert(insPlyIncome);
  507. }
  508. if (StringUtils.isNotEmpty(plyDto.getSypolicyno())) {
  509. insPlyIncome.setPolicyno(plyDto.getSypolicyno());
  510. insPlyIncome.setRiskcode("商业");
  511. insPlyIncome.setTaxamount(new BigDecimal(0));
  512. if (!ObjectUtils.isEmpty(insFeeOrder)) {
  513. insPlyIncome.setNoTaxPremium(insFeeOrder.getSyNoTaxPremium());
  514. insPlyIncome.setCommissionFeerate(insFeeOrder.getSySuperviseCostsProportion());
  515. insPlyIncome.setOtherFeerate(insFeeOrder.getSyCostsProportion().subtract(insFeeOrder.getSySuperviseCostsProportion()));
  516. insPlyIncome.setCommissionFeevalue(insFeeOrder.getSySuperviseCostsPremiums());
  517. insPlyIncome.setOtherFeevalue(insFeeOrder.getSyCostsPremiums().subtract(insFeeOrder.getSySuperviseCostsPremiums()));
  518. insPlyIncome.setAllFeeValue(insFeeOrder.getSyCostsPremiums());
  519. }
  520. insPlyIncomeMapper.insert(insPlyIncome);
  521. }
  522. }
  523. /**
  524. * 生成机构费用
  525. *
  526. * @param order
  527. * @param insFeeOrder
  528. * @throws Exception
  529. */
  530. private void gene_deptfee(InsOrders order, InsFeeOrderNew insFeeOrder, InsAreaCompany plyDto) {
  531. InsDeptFee deptFee = new InsDeptFee();
  532. deptFee.setOrderno(order.getOrderno());
  533. if (!ObjectUtils.isEmpty(insFeeOrder)) {
  534. deptFee.setQuoteno(insFeeOrder.getInsOrderNo());
  535. }
  536. deptFee.setAgreeid(String.valueOf(plyDto.getAgreementId()));
  537. deptFee.setAuditstatus("1");
  538. deptFee.setSettlestatus("0");
  539. if (plyDto.getInsidePayTime() != null) {
  540. deptFee.setSignDate(DateUtil.formatFullTime(plyDto.getInsidePayTime(), DateUtil.FULL_TIME_SPLIT_PATTERN));
  541. }
  542. deptFee.setInscompany(plyDto.getCompanyId());
  543. if (StringUtils.isNotEmpty(plyDto.getJqpolicyno())) {
  544. deptFee.setPolicyno(plyDto.getJqpolicyno());
  545. deptFee.setRiskcode("交强");
  546. deptFee.setLicenseno(order.getLicenseno());
  547. geneJqInsDeptFee(order, insFeeOrder, deptFee);
  548. }
  549. if (StringUtils.isNotEmpty(plyDto.getSypolicyno())) {
  550. deptFee.setPolicyno(plyDto.getSypolicyno());
  551. deptFee.setRiskcode("商业");
  552. deptFee.setLicenseno(order.getLicenseno());
  553. geneSyInsDeptFee(order, insFeeOrder, deptFee);
  554. }
  555. }
  556. private void geneJqInsDeptFee(InsOrders order, InsFeeOrderNew insFeeOrder, InsDeptFee deptFee) {
  557. if (!ObjectUtils.isEmpty(insFeeOrder)) {
  558. if (insFeeOrder.getJqDeptPremiumsLevel1().doubleValue() > 0) {
  559. deptFee.setComcode(order.getDeptid().substring(0, 2)); //99140302M01D01
  560. deptFee.setComlevel("一级");
  561. insDeptFeeService.insert(deptFee);
  562. }
  563. if (insFeeOrder.getJqDeptPremiumsLevel2().doubleValue() > 0) {
  564. deptFee.setComcode(order.getDeptid().substring(0, 4)); //99140302M01D01
  565. deptFee.setComlevel("二级");
  566. insDeptFeeService.insert(deptFee);
  567. }
  568. if (insFeeOrder.getJqDeptPremiumsLevel3().doubleValue() > 0) {
  569. deptFee.setComcode(order.getDeptid().substring(0, 6)); //99140302M01D01
  570. deptFee.setComlevel("三级");
  571. insDeptFeeService.insert(deptFee);
  572. }
  573. if (insFeeOrder.getJqDeptPremiumsLevel4().doubleValue() > 0) {
  574. deptFee.setComcode(order.getDeptid().substring(0, 8)); //99140302M01D01
  575. deptFee.setComlevel("四级");
  576. insDeptFeeService.insert(deptFee);
  577. }
  578. if (insFeeOrder.getJqDeptPremiumsLevel5().doubleValue() > 0) {
  579. deptFee.setComcode(order.getDeptid().substring(0, 11)); //99140302M01D01
  580. deptFee.setComlevel("五级");
  581. insDeptFeeService.insert(deptFee);
  582. }
  583. }
  584. }
  585. private void geneSyInsDeptFee(InsOrders order, InsFeeOrderNew insFeeOrder, InsDeptFee deptFee) {
  586. if (!ObjectUtils.isEmpty(insFeeOrder)) {
  587. if (insFeeOrder.getSyDeptPremiumsLevel1().doubleValue() > 0) {
  588. deptFee.setComcode(order.getDeptid().substring(0, 2)); //99140302M01D01
  589. deptFee.setComlevel("一级");
  590. insDeptFeeService.insert(deptFee);
  591. }
  592. if (insFeeOrder.getSyDeptPremiumsLevel2().doubleValue() > 0) {
  593. deptFee.setComcode(order.getDeptid().substring(0, 4)); //99140302M01D01
  594. deptFee.setComlevel("二级");
  595. insDeptFeeService.insert(deptFee);
  596. }
  597. if (insFeeOrder.getSyDeptPremiumsLevel3().doubleValue() > 0) {
  598. deptFee.setComcode(order.getDeptid().substring(0, 6)); //99140302M01D01
  599. deptFee.setComlevel("三级");
  600. insDeptFeeService.insert(deptFee);
  601. }
  602. if (insFeeOrder.getSyDeptPremiumsLevel4().doubleValue() > 0) {
  603. deptFee.setComcode(order.getDeptid().substring(0, 8)); //99140302M01D01
  604. deptFee.setComlevel("四级");
  605. insDeptFeeService.insert(deptFee);
  606. }
  607. if (insFeeOrder.getSyDeptPremiumsLevel5().doubleValue() > 0) {
  608. deptFee.setComcode(order.getDeptid().substring(0, 11)); //99140302M01D01
  609. deptFee.setComlevel("五级");
  610. insDeptFeeService.insert(deptFee);
  611. }
  612. }
  613. }
  614. /**
  615. * 三级分销费用保存
  616. *
  617. * @param order
  618. * @return
  619. */
  620. public void saveRetail(InsOrders order, InsFeeOrder insFeeOrder, InsAreaCompany plyDto) throws Exception {
  621. List<String> userlist = new ArrayList<>();
  622. esmUserReferrerService.getUpUser(order.getUserid(), userlist);
  623. //userlist:包括本人在内向上所有人
  624. if (userlist.size() - 1 > 0) {
  625. if (userlist.size() - 1 >= 1
  626. && insFeeOrder.getThirdRetailPremiums().doubleValue() > 0) {//三级分销
  627. SysUser user = sysUserService.getById(userlist.get(1));
  628. InsCommission commission = new InsCommission();
  629. commission.setOrderno(order.getOrderno());
  630. commission.setQuoteno(insFeeOrder.getInsOrderNo());
  631. commission.setDeptid(order.getDeptid());
  632. commission.setDeptname(order.getDeptname());
  633. commission.setInscompany(plyDto.getCompanyId());
  634. commission.setAgreeid(String.valueOf(plyDto.getAgreementId()));
  635. commission.setRefereescode(user.getId());
  636. commission.setRefereesname(user.getName());
  637. commission.setLevel("3");
  638. commission.setAuditstatus("1"); //0未审核 1已审核
  639. commission.setSettlestatus("0"); //0未结算 1已结算
  640. commission.setInsuredtime(DateUtil.formatFullTime(plyDto.getPayDate(), DateUtil.FULL_TIME_SPLIT_PATTERN));
  641. commission.setSignDate(DateUtil.formatFullTime(plyDto.getInsidePayTime(), DateUtil.FULL_TIME_SPLIT_PATTERN));
  642. if (StringUtils.isNotEmpty(plyDto.getJqpolicyno())) {
  643. commission.setPolicyno(plyDto.getJqpolicyno());
  644. commission.setRiskcode("交强");
  645. commission.setLicenseno(order.getLicenseno());
  646. commission.setCommissionrate(insFeeOrder.getThirdRetailProportion().doubleValue());
  647. commission.setCommissionamount(insFeeOrder.getJqNoTaxPremium().multiply(insFeeOrder.getThirdRetailProportion()).divide(new BigDecimal(100)).doubleValue());
  648. insCommissionService.insert(commission);
  649. }
  650. if (StringUtils.isNotEmpty(plyDto.getSypolicyno())) {
  651. commission.setPolicyno(plyDto.getSypolicyno());
  652. commission.setRiskcode("商业");
  653. commission.setLicenseno(order.getLicenseno());
  654. commission.setCommissionrate(insFeeOrder.getThirdRetailProportion().doubleValue());
  655. commission.setCommissionamount(insFeeOrder.getSyNoTaxPremium().multiply(insFeeOrder.getThirdRetailProportion()).divide(new BigDecimal(100)).doubleValue());
  656. insCommissionService.insert(commission);
  657. }
  658. }
  659. if (userlist.size() - 1 >= 2
  660. && insFeeOrder.getSecondRetailPremiums().doubleValue() > 0) {//二级分销
  661. SysUser user = sysUserService.getById(userlist.get(2));
  662. InsCommission commission = new InsCommission();
  663. commission.setOrderno(order.getOrderno());
  664. commission.setQuoteno(insFeeOrder.getInsOrderNo());
  665. commission.setDeptid(order.getDeptid());
  666. commission.setDeptname(order.getDeptname());
  667. commission.setInscompany(plyDto.getCompanyId());
  668. commission.setAgreeid(String.valueOf(plyDto.getAgreementId()));
  669. commission.setRefereescode(user.getId());
  670. commission.setRefereesname(user.getName());
  671. // commission.setCommissionrate(insFeeOrder.getSecondRetailProportion().doubleValue());
  672. // commission.setCommissionamount(insFeeOrder.getSecondRetailPremiums().doubleValue());
  673. commission.setLevel("2");
  674. commission.setAuditstatus("1"); //0未审核 1已审核
  675. commission.setSettlestatus("0"); //0未结算 1已结算
  676. commission.setInsuredtime(DateUtil.formatFullTime(plyDto.getPayDate(), DateUtil.FULL_TIME_SPLIT_PATTERN));
  677. commission.setSignDate(DateUtil.formatFullTime(plyDto.getInsidePayTime(), DateUtil.FULL_TIME_SPLIT_PATTERN));
  678. if (StringUtils.isNotEmpty(plyDto.getJqpolicyno())) {
  679. commission.setPolicyno(plyDto.getJqpolicyno());
  680. commission.setRiskcode("交强");
  681. commission.setLicenseno(order.getLicenseno());
  682. commission.setCommissionrate(insFeeOrder.getSecondRetailProportion().doubleValue());
  683. commission.setCommissionamount(insFeeOrder.getJqNoTaxPremium().multiply(insFeeOrder.getSecondRetailProportion()).divide(new BigDecimal(100)).doubleValue());
  684. insCommissionService.insert(commission);
  685. }
  686. if (StringUtils.isNotEmpty(plyDto.getSypolicyno())) {
  687. commission.setPolicyno(plyDto.getSypolicyno());
  688. commission.setRiskcode("商业");
  689. commission.setLicenseno(order.getLicenseno());
  690. commission.setCommissionrate(insFeeOrder.getSecondRetailProportion().doubleValue());
  691. commission.setCommissionamount(insFeeOrder.getSyNoTaxPremium().multiply(insFeeOrder.getSecondRetailProportion()).divide(new BigDecimal(100)).doubleValue());
  692. insCommissionService.insert(commission);
  693. }
  694. }
  695. if (userlist.size() - 1 >= 3
  696. && insFeeOrder.getFirstRetailPremiums().doubleValue() > 0) {//一级分销
  697. SysUser user = sysUserService.getById(userlist.get(3));
  698. InsCommission commission = new InsCommission();
  699. commission.setOrderno(order.getOrderno());
  700. commission.setQuoteno(insFeeOrder.getInsOrderNo());
  701. commission.setDeptid(order.getDeptid());
  702. commission.setDeptname(order.getDeptname());
  703. commission.setInscompany(plyDto.getCompanyId());
  704. commission.setAgreeid(String.valueOf(plyDto.getAgreementId()));
  705. commission.setRefereescode(user.getId());
  706. commission.setRefereesname(user.getName());
  707. // commission.setCommissionrate(insFeeOrder.getFirstRetailProportion().doubleValue());
  708. // commission.setCommissionamount(insFeeOrder.getFirstRetailPremiums().doubleValue());
  709. commission.setLevel("1");
  710. commission.setAuditstatus("1"); //0未审核 1已审核
  711. commission.setSettlestatus("0"); //0未结算 1已结算
  712. commission.setInsuredtime(DateUtil.formatFullTime(plyDto.getPayDate(), DateUtil.FULL_TIME_SPLIT_PATTERN));
  713. commission.setSignDate(DateUtil.formatFullTime(plyDto.getInsidePayTime(), DateUtil.FULL_TIME_SPLIT_PATTERN));
  714. if (StringUtils.isNotEmpty(plyDto.getJqpolicyno())) {
  715. commission.setPolicyno(plyDto.getJqpolicyno());
  716. commission.setRiskcode("交强");
  717. commission.setLicenseno(order.getLicenseno());
  718. commission.setCommissionrate(insFeeOrder.getFirstRetailProportion().doubleValue());
  719. commission.setCommissionamount(insFeeOrder.getJqNoTaxPremium().multiply(insFeeOrder.getFirstRetailProportion()).divide(new BigDecimal(100)).doubleValue());
  720. insCommissionService.insert(commission);
  721. }
  722. if (StringUtils.isNotEmpty(plyDto.getSypolicyno())) {
  723. commission.setPolicyno(plyDto.getSypolicyno());
  724. commission.setRiskcode("商业");
  725. commission.setLicenseno(order.getLicenseno());
  726. commission.setCommissionrate(insFeeOrder.getFirstRetailProportion().doubleValue());
  727. commission.setCommissionamount(insFeeOrder.getSyNoTaxPremium().multiply(insFeeOrder.getFirstRetailProportion()).divide(new BigDecimal(100)).doubleValue());
  728. insCommissionService.insert(commission);
  729. }
  730. }
  731. }
  732. }
  733. /**
  734. * 生成个代费用
  735. *
  736. * @param order
  737. * @param insFeeOrder
  738. * @throws Exception
  739. */
  740. public void saveInsCompanyFee(InsOrders order, InsFeeOrder insFeeOrder, InsAreaCompany plyDto) throws Exception {
  741. InsCompanyFee insCompanyFee = new InsCompanyFee();
  742. insCompanyFee.setOrderno(order.getOrderno());
  743. insCompanyFee.setFrameNo(order.getFrameno());
  744. insCompanyFee.setLicenseNo(order.getLicenseno());
  745. insCompanyFee.setInscompany(plyDto.getCompanyId());
  746. insCompanyFee.setAgreeid(String.valueOf(plyDto.getAgreementId()));
  747. insCompanyFee.setUserid(order.getUserid());
  748. insCompanyFee.setUsername(order.getUsername());
  749. insCompanyFee.setDeptid(order.getDeptid());
  750. insCompanyFee.setDeptname(order.getDeptname());
  751. insCompanyFee.setSettletype("B");
  752. insCompanyFee.setSettlestatus("0");
  753. insCompanyFee.setCreatetime(DateUtil.getDateFormat(new Date(), DateUtil.FULL_TIME_SPLIT_PATTERN));
  754. if (plyDto.getInsidePayTime() != null) {
  755. insCompanyFee.setSignDate(DateUtil.formatFullTime(plyDto.getInsidePayTime(), DateUtil.FULL_TIME_SPLIT_PATTERN));
  756. }
  757. if (ObjectUtils.isNotEmpty(insFeeOrder)) {
  758. BigDecimal dept_rate = insFeeOrder.getFirstDeptProportion()
  759. .add(insFeeOrder.getSecondDeptProportion())
  760. .add(insFeeOrder.getThirdDeptProportion())
  761. .add(insFeeOrder.getForthDeptProportion())
  762. .add(insFeeOrder.getFifthDeptProportion());
  763. BigDecimal retail_rate = insFeeOrder.getFirstRetailProportion()
  764. .add(insFeeOrder.getSecondRetailProportion())
  765. .add(insFeeOrder.getThirdRetailProportion());
  766. if (StringUtils.isNotEmpty(plyDto.getJqpolicyno())) {
  767. insCompanyFee.setPolicyno(plyDto.getJqpolicyno());
  768. insCompanyFee.setRiskcode("交强");
  769. //交强费用比例=交强险费用比例-五级机构管理费比例-三级分销比例
  770. insCompanyFee.setFeerate(insFeeOrder.getJqCostsProportion().subtract(dept_rate).subtract(retail_rate).doubleValue());
  771. insCompanyFee.setFeeamount(insFeeOrder.getJqNoTaxPremium().multiply(insFeeOrder.getJqCostsProportion().subtract(dept_rate).subtract(retail_rate)).divide(new BigDecimal(100)).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue());
  772. insCompanyFee.setJqpremium(insFeeOrder.getJqNoTaxPremium().doubleValue());
  773. //保存业务员费用
  774. insCompanyFeeService.insert(insCompanyFee);
  775. }
  776. if (StringUtils.isNotEmpty(plyDto.getSypolicyno())) {
  777. insCompanyFee.setPolicyno(plyDto.getSypolicyno());
  778. insCompanyFee.setRiskcode("商业");
  779. insCompanyFee.setFeerate(0);
  780. insCompanyFee.setFeeamount(0);
  781. insCompanyFee.setJqpremium(0);
  782. //商业费用比例=商业险费用比例-五级机构管理费比例-三级分销比例
  783. insCompanyFee.setDisrate(insFeeOrder.getSyCostsProportion().subtract(dept_rate).subtract(retail_rate).doubleValue());
  784. insCompanyFee.setDisamount(insFeeOrder.getSyNoTaxPremium().multiply(insFeeOrder.getSyCostsProportion().subtract(dept_rate).subtract(retail_rate)).divide(new BigDecimal(100)).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue());
  785. insCompanyFee.setSypremium(insFeeOrder.getSyNoTaxPremium().doubleValue());
  786. //保存业务员费用
  787. insCompanyFeeService.insert(insCompanyFee);
  788. }
  789. }
  790. }
  791. /**
  792. * 保存保险费用审核信息及审核历史。
  793. *
  794. * @param orderNo 订单号
  795. * @param insOrderNo 保险订单号
  796. * @param isAutoAudit 是否自动审核,true表示自动审核,false表示人工审核
  797. * @param auditstatus 审核状态码
  798. */
  799. @Override
  800. @Transactional
  801. public InsFeeAudit saveInsFeeAuditAndHistory(String orderNo, String insOrderNo, boolean isAutoAudit, String auditstatus) {
  802. //查询费用审核表
  803. InsFeeAudit insFeeAudit = getOne(new LambdaQueryWrapper<InsFeeAudit>().eq(InsFeeAudit::getInsOrderNo, insOrderNo));
  804. if (insFeeAudit != null && insFeeAudit.getAuditstatus().equals("1")) {
  805. throw new SystemException("该订单费用已审核,请刷新页面");
  806. }
  807. String userId;
  808. // 填充审核人
  809. if (isAutoAudit) {
  810. userId = "自动审核";
  811. } else {
  812. userId = StpUtil.getLoginId().toString();
  813. }
  814. //添加审核轨迹表
  815. InsFeeAuditHistory insFeeAuditHistory = new InsFeeAuditHistory();
  816. if (insFeeAudit == null) {
  817. insFeeAudit = new InsFeeAudit();
  818. // 设置订单号和保险订单号
  819. insFeeAudit.setAudituser(userId);
  820. insFeeAudit.setOrderno(orderNo);
  821. insFeeAudit.setInsOrderNo(insOrderNo);
  822. insFeeAudit.setAudittime(LocalDateTime.now());
  823. insFeeAudit.setAuditstatus(auditstatus);
  824. this.save(insFeeAudit);
  825. } else {
  826. //状态码为已审核且数据不为空,则更新审核状态
  827. insFeeAudit.setAuditstatus(FeeAuditAuditstatus.PASSED.getCode());
  828. insFeeAudit.setAudittime(LocalDateTime.now());
  829. insFeeAudit.setAudituser(userId);
  830. boolean update = this.update(insFeeAudit, new LambdaUpdateWrapper<InsFeeAudit>()
  831. .eq(InsFeeAudit::getAuditstatus, FeeAuditAuditstatus.UNREVICEWED.getCode())
  832. .eq(InsFeeAudit::getInsOrderNo, insOrderNo)
  833. );
  834. AssertionUtils.isSucceed(update, "审核状态异常");
  835. }
  836. //复制审核对象的属性
  837. BeanUtils.copyProperties(insFeeAudit, insFeeAuditHistory);
  838. InsAreaCompany insAreaCompany = insAreaCompanyMapper.selectById(insFeeAudit.getInsOrderNo());
  839. // 设置操作时间和操作人及保险公司名称
  840. insFeeAuditHistory.setInsCompany(insAreaCompany.getInscompany());
  841. insFeeAuditHistory.setOperatorTime(LocalDateTime.now());
  842. insFeeAuditHistory.setOperator(BaseController.getUser().getName());
  843. // 保存审核轨迹
  844. insFeeAuditHistoryService.save(insFeeAuditHistory);
  845. return insFeeAudit;
  846. }
  847. @Override
  848. public InsFeeAudit saveDefaultInsFeeAuditAndHistory(String orderNo, String insOrderNo, String auditstatus, String rejectInfo) {
  849. //查询费用审核表
  850. InsFeeAudit insFeeAudit = getOne(new LambdaQueryWrapper<InsFeeAudit>()
  851. .eq(InsFeeAudit::getOrderno, orderNo)
  852. .eq(InsFeeAudit::getInsOrderNo, insOrderNo));
  853. //添加审核轨迹表
  854. InsFeeAuditHistory insFeeAuditHistory = new InsFeeAuditHistory();
  855. if (insFeeAudit == null) {
  856. insFeeAudit = new InsFeeAudit();
  857. // 设置订单号和保险订单号
  858. insFeeAudit.setOrderno(orderNo);
  859. insFeeAudit.setInsOrderNo(insOrderNo);
  860. insFeeAudit.setAuditstatus(auditstatus);
  861. this.save(insFeeAudit);
  862. } else {
  863. //状态码为已审核且数据不为空,则更新审核状态
  864. //如果审核状态为已审核则一直都是已审核
  865. if (insFeeAudit.getAuditstatus().equals(FeeAuditAuditstatus.PASSED.getCode())) {
  866. insFeeAudit.setAuditstatus(insFeeAudit.getAuditstatus());
  867. } else {
  868. insFeeAudit.setAuditstatus(auditstatus);
  869. }
  870. insFeeAudit.setAudituser(BaseController.getUser().getName());
  871. insFeeAudit.setAudittime(LocalDateTime.now());
  872. insFeeAudit.setRejectinfo(rejectInfo);
  873. this.update(insFeeAudit, new LambdaUpdateWrapper<InsFeeAudit>()
  874. .eq(InsFeeAudit::getOrderno, orderNo)
  875. .eq(InsFeeAudit::getInsOrderNo, insOrderNo));
  876. }
  877. //复制审核对象的属性
  878. BeanUtils.copyProperties(insFeeAudit, insFeeAuditHistory);
  879. InsAreaCompany insAreaCompany = insAreaCompanyMapper.selectById(insFeeAudit.getInsOrderNo());
  880. // 设置操作时间和操作人及保险公司名称
  881. insFeeAuditHistory.setInsCompany(insAreaCompany.getInscompany());
  882. insFeeAuditHistory.setOperatorTime(LocalDateTime.now());
  883. insFeeAuditHistory.setOperator(BaseController.getUser().getName());
  884. // 保存审核轨迹
  885. insFeeAuditHistoryService.save(insFeeAuditHistory);
  886. return insFeeAudit;
  887. }
  888. /**
  889. * 获取费用审核 根据子订单id
  890. *
  891. * @return
  892. */
  893. @Override
  894. public InsFeeAudit getFeeAuditByInsOrderNo(String insOrderNo) {
  895. LambdaQueryWrapper<InsFeeAudit> queryWrapper = new LambdaQueryWrapper<>();
  896. queryWrapper.eq(InsFeeAudit::getInsOrderNo, insOrderNo);
  897. return this.getOne(queryWrapper);
  898. }
  899. @Override
  900. public void sendProject(String insOrderNo) {
  901. log.info("订单:{},审核通过后首次推送服务", insOrderNo);
  902. executorService.submit(new Runnable() {
  903. @Override
  904. public void run() {
  905. log.info("异步线程开始!程序启动时间:{}", new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"));
  906. SendProjectInfo sendProjectInfo = new SendProjectInfo();
  907. //查询归属信息
  908. OrderVo orderAndAreaCompany = new OrderVo();
  909. EsmUserReferrer esmUserReferrer = new EsmUserReferrer();
  910. try {
  911. log.info("查询ins_orders数据库入参:{}", insOrderNo);
  912. orderAndAreaCompany = insOrdersMapper.getOrderAndAreaCompany(insOrderNo);
  913. log.info("查询ins_orders数据库出参:{}", JSON.toJSON(orderAndAreaCompany));
  914. log.info("查询esm_user_referrer数据库入参:{}", orderAndAreaCompany.getUserid());
  915. esmUserReferrer = esmUserReferrerService.getById(orderAndAreaCompany.getUserid());
  916. log.info("查询esm_user_referrer数据库出参:{}", JSON.toJSON(esmUserReferrer));
  917. } catch (Exception e) {
  918. e.printStackTrace();
  919. log.error("查询ins_orders/esm_user_referrer数据库报错:{}", e.getMessage());
  920. }
  921. if (esmUserReferrer != null) {
  922. sendProjectInfo.setReferrerNo(esmUserReferrer.getReferrerId());
  923. }
  924. if (orderAndAreaCompany != null) {
  925. sendProjectInfo.setUserId(orderAndAreaCompany.getUserid());
  926. }
  927. //查询费用信息
  928. log.info("查询ins_fee_order_new数据库");
  929. InsFeeOrderNew insFeeOrderNew = insFeeOrderNewService.getOne(new LambdaQueryWrapper<InsFeeOrderNew>()
  930. .eq(InsFeeOrderNew::getInsOrderNo, insOrderNo));
  931. log.info("查询ins_fee_order_new数据库出参:{}", JSON.toJSON(insFeeOrderNew));
  932. FeeOrderNewVo.ExportFee exportFee = exportFee(insFeeOrderNew);
  933. BigDecimal totalAmount = exportFee.getTotalAmount();
  934. StringBuffer uuid = new StringBuffer();
  935. uuid.append(new SimpleDateFormat("yyyyMMddHHmmss"))
  936. .append(UUID.randomUUID());
  937. SendProjectInfo userInfo = new SendProjectInfo();
  938. try {
  939. log.info("查询数据库保险订单表入参:{}", insOrderNo);
  940. userInfo = insOrdersMapper.getOrderByCompanyId(insOrderNo);
  941. log.info("查询数据库保险订单表出参:{}", JSON.toJSON(userInfo));
  942. } catch (Exception e) {
  943. log.error("查询数据库保险订单表报错:{}", e.getMessage());
  944. }
  945. if (userInfo == null) {
  946. return;
  947. }
  948. sendProjectInfo.setGiveBudget(totalAmount);
  949. sendProjectInfo.setUuid(uuid.toString());
  950. sendProjectInfo.setUserName(userInfo.getUserName());
  951. sendProjectInfo.setUserPhone(userInfo.getUserPhone());
  952. sendProjectInfo.setUserCarNum(userInfo.getUserCarNum());
  953. SendProjectEntity addSendProject = new SendProjectEntity();
  954. addSendProject.setTotalAmount(sendProjectInfo.getGiveBudget());
  955. addSendProject.setUserName(sendProjectInfo.getUserName());
  956. addSendProject.setUserCarNum(sendProjectInfo.getUserCarNum());
  957. addSendProject.setUserPhone(sendProjectInfo.getUserPhone());
  958. addSendProject.setSendState(STRING_2);
  959. addSendProject.setSendUuid(sendProjectInfo.getSendUuid());
  960. addSendProject.setUserId(sendProjectInfo.getUserId());
  961. addSendProject.setReferrerNo(sendProjectInfo.getReferrerNo());
  962. addSendProject.setFailNum(INTEGER_0);
  963. addSendProject.setState(STRING_1);
  964. addSendProject.setIsDelete(STRING_0);
  965. addSendProject.setCreateTime(new Date());
  966. addSendProject.setUpdateTime(new Date());
  967. try {
  968. log.info("新增推送服务数据库入参:{}", JSON.toJSON(addSendProject));
  969. sendProjectMapper.addSendProjectInfo(addSendProject);
  970. } catch (Exception e) {
  971. e.printStackTrace();
  972. log.error("新增推送服务数据库报错:{}", e.getMessage());
  973. }
  974. sendProjrctUtils.firstSendProject(sendProjectInfo);
  975. }
  976. });
  977. }
  978. private FeeOrderNewVo.ExportFee exportFee(InsFeeOrderNew insFeeOrderNew) {
  979. List<FeeOrderNewVo.ExportFee> exportFeeList = new ArrayList<>();
  980. //region 出口费用
  981. //交强
  982. FeeOrderNewVo.ExportFee jqExportFee = this.assignExportFee(BusinessConstant.FEE_INSURANCE_TYPE_1,
  983. insFeeOrderNew.getJqPremium(), insFeeOrderNew.getJqCostsExportProportion(),
  984. insFeeOrderNew.getJqExportOtherCostsProportion(),
  985. insFeeOrderNew.getJqExportSuperviseCostsPremiums(), insFeeOrderNew.getJqExportOtherCostsPremiums()
  986. );
  987. //exportFeeList.add(jqExportFee);
  988. //交强
  989. FeeOrderNewVo.ExportFee syExportFee = this.assignExportFee(BusinessConstant.FEE_INSURANCE_TYPE_2,
  990. insFeeOrderNew.getSyPremium(), insFeeOrderNew.getSyCostsExportProportion(),
  991. insFeeOrderNew.getSyExportOtherCostsProportion(),
  992. insFeeOrderNew.getSyExportSuperviseCostsPremiums(), insFeeOrderNew.getSyExportOtherCostsPremiums()
  993. );
  994. //exportFeeList.add(syExportFee);
  995. //交强
  996. FeeOrderNewVo.ExportFee noExportFee = this.assignExportFee(BusinessConstant.FEE_INSURANCE_TYPE_3,
  997. insFeeOrderNew.getNoPremium(), insFeeOrderNew.getNoCostsExportProportion(),
  998. insFeeOrderNew.getNoExportOtherCostsProportion(),
  999. insFeeOrderNew.getNoExportSuperviseCostsPremiums(), insFeeOrderNew.getNoExportOtherCostsPremiums());
  1000. // exportFeeList.add(noExportFee);
  1001. //add by hxl 添加出单员不能查看优惠的限制 2024-07-11
  1002. String userId = BaseController.getUserId();
  1003. SysUserRole sysUserRole = sysUserRoleService.selectByUserId(userId);
  1004. if (sysUserRole != null && sysUserRole.getRoleId() == 19) {
  1005. jqExportFee.setTotalAmount(BigDecimal.ZERO);
  1006. jqExportFee.setTotalProportion(BigDecimal.ZERO);
  1007. syExportFee.setTotalAmount(BigDecimal.ZERO);
  1008. syExportFee.setTotalProportion(BigDecimal.ZERO);
  1009. noExportFee.setTotalAmount(BigDecimal.ZERO);
  1010. noExportFee.setTotalProportion(BigDecimal.ZERO);
  1011. }
  1012. exportFeeList.add(jqExportFee);
  1013. exportFeeList.add(syExportFee);
  1014. exportFeeList.add(noExportFee);
  1015. //出口费用合计
  1016. FeeOrderNewVo.ExportFee exportFeeTotal = assignExportFeeTotal(exportFeeList);
  1017. return exportFeeTotal;
  1018. }
  1019. private FeeOrderNewVo.ExportFee assignExportFeeTotal(List<FeeOrderNewVo.ExportFee> exportFeeList) {
  1020. FeeOrderNewVo.ExportFee exportFee = new FeeOrderNewVo.ExportFee();
  1021. exportFee.setInsuranceType(BusinessConstant.FEE_INSURANCE_TYPE_4);
  1022. //总费用合计
  1023. BigDecimal totalAmount = exportFeeList.stream().map(FeeOrderNewVo.ExportFee::getTotalAmount).reduce(BigDecimal.ZERO, BigDecimal::add);
  1024. exportFee.setTotalAmount(Optional.of(totalAmount).orElse(BigDecimal.ZERO));
  1025. return exportFee;
  1026. }
  1027. /**
  1028. * 出口费用赋值
  1029. *
  1030. * @param title
  1031. * @param premium
  1032. * @param superviseCostsProportion
  1033. * @param otherCostsProportion
  1034. * @param superviseCostsPremiums
  1035. * @param otherCostsPremiums
  1036. * @return
  1037. */
  1038. public FeeOrderNewVo.ExportFee assignExportFee(String title, BigDecimal premium, BigDecimal superviseCostsProportion,
  1039. BigDecimal otherCostsProportion,
  1040. BigDecimal superviseCostsPremiums, BigDecimal otherCostsPremiums
  1041. ) {
  1042. FeeOrderNewVo.ExportFee exportFee = new FeeOrderNewVo.ExportFee();
  1043. exportFee.setInsuranceType(title);
  1044. //保费
  1045. exportFee.setPremium(premium);
  1046. //手续费比例
  1047. exportFee.setSuperviseCosts(superviseCostsProportion);
  1048. //跟单比例
  1049. exportFee.setOtherCostsProportion(otherCostsProportion);
  1050. //总比例
  1051. exportFee.setTotalProportion(superviseCostsProportion.add(otherCostsProportion));
  1052. //手续费
  1053. exportFee.setSuperviseCostsPremiums(superviseCostsPremiums);
  1054. //跟单费
  1055. exportFee.setOtherCostsPremiums(otherCostsPremiums);
  1056. //总费用
  1057. exportFee.setTotalAmount(superviseCostsPremiums.add(otherCostsPremiums));
  1058. return exportFee;
  1059. }
  1060. }