InsFeeAuditServiceImpl.java 57 KB

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