InvReceivableServiceImpl.java 36 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665
  1. package com.ydtech.modules.inv.service.impl;
  2. import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
  3. import com.baomidou.mybatisplus.core.metadata.IPage;
  4. import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
  5. import com.ydtech.core.page.PageRequest;
  6. import com.ydtech.modules.esm.model.EsmInsCompany;
  7. import com.ydtech.modules.inv.dao.InvReceivableMapper;
  8. import com.ydtech.modules.inv.dao.InvSettlementSourceMapper;
  9. import com.ydtech.modules.inv.dao.InvSourceMapper;
  10. import com.ydtech.modules.inv.model.po.InvSettlementSource;
  11. import com.ydtech.modules.inv.model.po.InvSource;
  12. import com.ydtech.modules.inv.model.vo.*;
  13. import com.ydtech.modules.inv.service.InvReceivableService;
  14. import com.ydtech.modules.inv.service.InvSourceService;
  15. import com.ydtech.utils.idgen.IdGenerate;
  16. import org.springframework.beans.factory.annotation.Autowired;
  17. import org.springframework.stereotype.Service;
  18. import java.math.BigDecimal;
  19. import java.math.RoundingMode;
  20. import java.time.YearMonth;
  21. import java.time.format.DateTimeFormatter;
  22. import java.util.ArrayList;
  23. import java.util.Arrays;
  24. import java.util.HashMap;
  25. import java.util.List;
  26. import java.util.stream.Collectors;
  27. /**
  28. * @author Administrator
  29. * @description 针对表【inv_channel_account(渠道账户表)】的数据库操作Service实现
  30. * @createDate 2024-01-20 10:29:30
  31. */
  32. @Service
  33. public class InvReceivableServiceImpl implements InvReceivableService {
  34. @Autowired
  35. InvReceivableMapper invReceivableMapper;
  36. @Autowired
  37. InvSourceService invSourceService;
  38. @Autowired
  39. InvSourceMapper invSourceMapper;
  40. @Autowired
  41. InvSettlementSourceMapper invSettlementSourceMapper;
  42. @Override
  43. public List<ReceivableResultVo> getReceivableList(String startTime, String endTime, String insuranceId) {
  44. return invReceivableMapper.getReceivableList(startTime, endTime, insuranceId);
  45. }
  46. @Override
  47. public List<SigningSourceResultVo> getSigningSourceResult(String yearMonthStr, String insuranceId, String startTime, String endTime) {
  48. List<SigningSourceResultVo> signingSources = invReceivableMapper.getSigningSourceResult(startTime, endTime, insuranceId);
  49. List<SigningSourceResultVo> signingSourceResult = new ArrayList<>();
  50. Float jqPremiumTax = 0f;
  51. Float syPremiumTax = 0f;
  52. Float nonCarPremiumTax = 0f;
  53. Float writtenPremium = 0f;
  54. Float settlementAmount = 0f;
  55. for (int i = 1; i <= 12; i++) {
  56. //查找day是否有数据
  57. String finalI = i < 10 ? "0" + String.valueOf(i) : String.valueOf(i);
  58. boolean countBol = signingSources.stream().filter(x -> finalI.equals(x.getDay())).count() > 0 ? true : false;
  59. if (countBol) {
  60. signingSourceResult.add(signingSources.stream().filter(x -> String.valueOf(finalI).equals(x.getDay())).findFirst().get());
  61. } else {
  62. SigningSourceResultVo signingSourceResultVo = new SigningSourceResultVo();
  63. signingSourceResultVo.setDay(finalI);
  64. signingSourceResultVo.setYearmonth(yearMonthStr + "-" + finalI);
  65. signingSourceResult.add(signingSourceResultVo);
  66. }
  67. }
  68. //处理合计
  69. for (SigningSourceResultVo vo : signingSourceResult) {
  70. jqPremiumTax = Float.parseFloat(vo.getJqPremiumTax()) + jqPremiumTax;
  71. syPremiumTax = Float.parseFloat(vo.getSyPremiumTax()) + syPremiumTax;
  72. nonCarPremiumTax = Float.parseFloat(vo.getNonCarPremiumTax()) + nonCarPremiumTax;
  73. writtenPremium = Float.parseFloat(vo.getWrittenPremium()) + writtenPremium;
  74. settlementAmount = Float.parseFloat(vo.getTotalAmountReceivable()) + settlementAmount;
  75. }
  76. SigningSourceResultVo vo = new SigningSourceResultVo();
  77. vo.setYearmonth("合计");
  78. vo.setJqPremiumTax(String.format("%.2f", jqPremiumTax));
  79. vo.setSyPremiumTax(String.format("%.2f", syPremiumTax));
  80. vo.setNonCarPremiumTax(String.format("%.2f", nonCarPremiumTax));
  81. vo.setWrittenPremium(String.format("%.2f", writtenPremium));
  82. vo.setTotalAmountReceivable(String.format("%.2f", settlementAmount));
  83. signingSourceResult.add(vo);
  84. return signingSourceResult;
  85. }
  86. @Override
  87. public List<SigningSourceResultVo> getSigningSourceDayResult(String yearMonthStr, String startTime, String endTime,
  88. String insuranceId) {
  89. List<SigningSourceResultVo> signingSources = invReceivableMapper.getSigningSourceDayResult(startTime, endTime, insuranceId);
  90. List<SigningSourceResultVo> signingSourceResult = new ArrayList<>();
  91. // 定义日期时间格式
  92. DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM");
  93. // 将字符串解析为YearMonth对象
  94. YearMonth yearMonth = YearMonth.parse(yearMonthStr, formatter);
  95. int maxDays = yearMonth.lengthOfMonth();
  96. Float jqPremiumTax = 0f;
  97. Float syPremiumTax = 0f;
  98. Float nonCarPremiumTax = 0f;
  99. Float writtenPremium = 0f;
  100. Float settlementAmount = 0f;
  101. for (int i = 1; i <= maxDays; i++) {
  102. //查找day是否有数据
  103. String finalI = i < 10 ? "0" + String.valueOf(i) : String.valueOf(i);
  104. boolean countBol = signingSources.stream().filter(x -> finalI.equals(x.getDay())).count() > 0 ? true : false;
  105. if (countBol) {
  106. signingSourceResult.add(signingSources.stream().filter(x -> String.valueOf(finalI).equals(x.getDay())).findFirst().get());
  107. } else {
  108. SigningSourceResultVo signingSourceResultVo = new SigningSourceResultVo();
  109. signingSourceResultVo.setDay(finalI);
  110. signingSourceResultVo.setYearmonth(yearMonthStr + "-" + finalI);
  111. signingSourceResult.add(signingSourceResultVo);
  112. }
  113. }
  114. //处理合计
  115. for (SigningSourceResultVo vo : signingSourceResult) {
  116. jqPremiumTax = Float.parseFloat(vo.getJqPremiumTax()) + jqPremiumTax;
  117. syPremiumTax = Float.parseFloat(vo.getSyPremiumTax()) + syPremiumTax;
  118. nonCarPremiumTax = Float.parseFloat(vo.getNonCarPremiumTax()) + nonCarPremiumTax;
  119. writtenPremium = Float.parseFloat(vo.getWrittenPremium()) + writtenPremium;
  120. settlementAmount = Float.parseFloat(vo.getTotalAmountReceivable()) + settlementAmount;
  121. }
  122. SigningSourceResultVo vo = new SigningSourceResultVo();
  123. vo.setYearmonth("合计");
  124. vo.setJqPremiumTax(String.format("%.2f", jqPremiumTax));
  125. vo.setSyPremiumTax(String.format("%.2f", syPremiumTax));
  126. vo.setNonCarPremiumTax(String.format("%.2f", nonCarPremiumTax));
  127. vo.setWrittenPremium(String.format("%.2f", writtenPremium));
  128. vo.setTotalAmountReceivable(String.format("%.2f", settlementAmount));
  129. signingSourceResult.add(vo);
  130. return signingSourceResult;
  131. }
  132. public static String[] getNext12MonthsDates(YearMonth startYearMonth) {
  133. String[] next12MonthsDates = new String[12];
  134. for (int i = 0; i < 12; i++) {
  135. YearMonth nextYearMonth = startYearMonth.plusMonths(i);
  136. String formattedDate = nextYearMonth.format(DateTimeFormatter.ofPattern("yyyy-MM"));
  137. next12MonthsDates[i] = formattedDate;
  138. }
  139. return next12MonthsDates;
  140. }
  141. @Override
  142. public List<SettlementSourceResultVo> getSettlementSourceResult(String yearMonthStr, String insuranceId) {
  143. // 定义日期时间格式
  144. DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM");
  145. // 将字符串解析为YearMonth对象
  146. YearMonth yearMonth = YearMonth.parse(yearMonthStr, formatter);
  147. String[] next12MonthsDates = getNext12MonthsDates(yearMonth);
  148. int maxDays = yearMonth.lengthOfMonth();
  149. //获取签单数据
  150. List<SigningSourceResultVo> signingSources = invReceivableMapper.getSigningSourceDayResult(yearMonthStr + "-01", yearMonthStr +
  151. "-" + maxDays, insuranceId);
  152. //转换类型
  153. List<SettlementSourceResultVo> settlementSourcesTmp = new ArrayList<>();
  154. List<SettlementSourceResultVo> settlementSources = new ArrayList<>();
  155. signingSources.forEach(signing -> {
  156. SettlementSourceResultVo settlementSourceResultVo = new SettlementSourceResultVo();
  157. settlementSourceResultVo.setDay(signing.getDay());
  158. settlementSourceResultVo.setSignDate(signing.getYearmonth());
  159. settlementSourceResultVo.setSignPremium(new BigDecimal(signing.getWrittenPremium()));
  160. settlementSourceResultVo.setSignReceivableAmount(new BigDecimal(signing.getTotalAmountReceivable()));
  161. settlementSourceResultVo.setSettlementData(new ArrayList<>());
  162. settlementSourcesTmp.add(settlementSourceResultVo);
  163. });
  164. for (int i = 1; i <= maxDays; i++) {
  165. //查找day是否有数据
  166. String finalI = i < 10 ? "0" + String.valueOf(i) : String.valueOf(i);
  167. boolean countBol = settlementSourcesTmp.stream().filter(x -> finalI.equals(x.getDay())).count() > 0 ? true : false;
  168. if (!countBol) {
  169. SettlementSourceResultVo settlementSourceResultVo = new SettlementSourceResultVo();
  170. settlementSourceResultVo.setDay(finalI);
  171. settlementSourceResultVo.setSignDate(yearMonthStr + "-" + finalI);
  172. settlementSources.add(settlementSourceResultVo);
  173. } else {
  174. settlementSources.add(settlementSourcesTmp.stream().filter(x -> finalI.equals(x.getDay())).findFirst().get());
  175. }
  176. }
  177. int year = yearMonth.getYear();
  178. //遍历结算数据
  179. settlementSources.forEach(signing -> {
  180. // String startTime = String.valueOf(year) + "-01-01";
  181. // String endTime = String.valueOf(year) + "-12-31";
  182. String startTime = next12MonthsDates[0] + "-01";
  183. int day = YearMonth.parse(next12MonthsDates[11], formatter).lengthOfMonth();
  184. String endTime = next12MonthsDates[11] + "-" + day;
  185. List<SettlementSourceDataVo> settlementSourceResultTmp =
  186. invReceivableMapper.getSettlementSourceResult(signing.getSignDate(), startTime, endTime, insuranceId);
  187. List<SettlementSourceDataVo> settlementSourceResult = new ArrayList<>();
  188. System.out.printf("1");
  189. //补齐数据
  190. for (int i = 0; i < 12; i++) {
  191. //查找day是否有数据
  192. String month = next12MonthsDates[i];
  193. boolean countBol = settlementSourceResultTmp.stream().filter(x -> month.equals(x.getSettlementDate())).count() > 0 ?
  194. true : false;
  195. if (!countBol) {
  196. SettlementSourceDataVo settlementSourceData = new SettlementSourceDataVo();
  197. settlementSourceData.setDay(month);
  198. settlementSourceData.setSettlementDate(next12MonthsDates[i]);
  199. settlementSourceResult.add(settlementSourceData);
  200. } else {
  201. settlementSourceResult.add(settlementSourceResultTmp.stream().filter(x -> month.equals(x.getSettlementDate())).findFirst().get());
  202. }
  203. }
  204. signing.setSettlementData(settlementSourceResult);
  205. });
  206. //计算每个日期的签单保费 和代理人佣金
  207. settlementSources.forEach(settlementSource -> {
  208. int length = settlementSource.getSettlementData().size();
  209. BigDecimal settlementPremium = new BigDecimal(0);
  210. BigDecimal agentCommission = new BigDecimal(0);
  211. //横向计算
  212. for (int i = 0; i < length; i++) {
  213. SettlementSourceDataVo settlementSourceData = settlementSource.getSettlementData().get(i);
  214. settlementPremium = settlementPremium.add(settlementSourceData.getSettlementPremium());
  215. agentCommission = agentCommission.add(settlementSourceData.getAgentCommission());
  216. }
  217. SettlementSourceDataVo settlementSourceData = new SettlementSourceDataVo();
  218. settlementSourceData.setSettlementPremium(settlementPremium);
  219. settlementSourceData.setAgentCommission(agentCommission);
  220. settlementSourceData.setSettlementDate("合计");
  221. settlementSource.getSettlementData().add(settlementSourceData);
  222. //竖向计算
  223. // settlementSource.getSettlementData().stream().filter(x-> x.getDay().equals("01")).count()
  224. });
  225. // 计算每个日期的签单保费 和代理人佣金 竖向计算
  226. List<SettlementSourceDataVo> settlementSourceDataSum = new ArrayList<>();
  227. for (int i = 0; i < 12; i++) {
  228. //提取每个月的数据
  229. // String finalI = i < 10 ? "0" + String.valueOf(i) : String.valueOf(i);
  230. String month = next12MonthsDates[i];
  231. List<SettlementSourceDataVo> settlementSourceDataVos = new ArrayList<>();
  232. BigDecimal settlementPremium = new BigDecimal(0);
  233. BigDecimal agentCommission = new BigDecimal(0);
  234. for (int j = 0; j < settlementSources.size(); j++) {
  235. List<SettlementSourceDataVo> collect =
  236. settlementSources.get(j).getSettlementData().stream().filter(x -> x.getSettlementDate() != null && x.getSettlementDate().equals(month)).collect(Collectors.toList());
  237. for (int k = 0; k < collect.size(); k++) {
  238. settlementPremium = settlementPremium.add(collect.get(k).getAgentCommission());
  239. agentCommission = agentCommission.add(collect.get(k).getAgentCommission());
  240. }
  241. }
  242. SettlementSourceDataVo settlementSourceDataVo = new SettlementSourceDataVo();
  243. settlementSourceDataVo.setDay(month);
  244. settlementSourceDataVo.setSettlementPremium(settlementPremium);
  245. settlementSourceDataVo.setAgentCommission(agentCommission);
  246. settlementSourceDataSum.add(settlementSourceDataVo);
  247. }
  248. //未结算签单保费 与 已结算利润计算
  249. settlementSources.forEach(settlementSource -> {
  250. SettlementSourceDataVo settlementSourceDataVo =
  251. settlementSource.getSettlementData().stream().filter(x -> !"合计".equals(x.getSettlementDate())).findFirst().get();
  252. settlementSource.setUnCalculatedAmount(settlementSource.getSignPremium().subtract(settlementSourceDataVo.getSettlementPremium()));
  253. settlementSource.setSettledProfit(settlementSource.getSignReceivableAmount().subtract(settlementSourceDataVo.getAgentCommission()));
  254. });
  255. //计算代理人佣金
  256. List<HashMap> maxReceivable = invReceivableMapper.getMaxReceivable(yearMonthStr + "-01", yearMonthStr + "-" + maxDays);
  257. settlementSources.forEach(settlementSource -> {
  258. Boolean b =
  259. maxReceivable.stream().filter(x -> settlementSource.getSignDate().equals(x.get("yeatmonth"))).findFirst().isPresent();
  260. if (!b) {
  261. settlementSource.setAgentAmount(new BigDecimal(0));
  262. } else {
  263. HashMap max =
  264. maxReceivable.stream().filter(x -> settlementSource.getSignDate().equals(x.get("yeatmonth"))).findFirst().get();
  265. SettlementSourceDataVo settlementSourceDataVo =
  266. settlementSource.getSettlementData().get(settlementSource.getSettlementData().size() - 1);
  267. settlementSource.setAgentAmount(new BigDecimal(max.get("receivable").toString()).subtract(settlementSourceDataVo.getAgentCommission()));
  268. }
  269. });
  270. //计算未结算利润测算
  271. List<HashMap> unsettledProfitCalculation = invReceivableMapper.getUnsettledProfitCalculation(yearMonthStr + "-01",
  272. yearMonthStr + "-" + maxDays);
  273. settlementSources.forEach(settlementSource -> {
  274. Boolean b =
  275. unsettledProfitCalculation.stream().filter(x -> settlementSource.getSignDate().equals(x.get("yeatmonth"))).findFirst().isPresent();
  276. if (!b) {
  277. settlementSource.setUnsettledProfitCalculation(new BigDecimal(0));
  278. } else {
  279. HashMap max =
  280. unsettledProfitCalculation.stream().filter(x -> settlementSource.getSignDate().equals(x.get("yeatmonth"))).findFirst().get();
  281. settlementSource.setUnsettledProfitCalculation(new BigDecimal(max.get("unsettled_profit_calculation").toString()));
  282. }
  283. });
  284. //计算签单合计 (第一层)
  285. int length = settlementSources.size();
  286. BigDecimal signPremium = new BigDecimal(0);
  287. BigDecimal signReceivableAmount = new BigDecimal(0);
  288. BigDecimal unCalculatedAmount = new BigDecimal(0);
  289. BigDecimal settledProfit = new BigDecimal(0);
  290. BigDecimal agentAmount = new BigDecimal(0);
  291. BigDecimal unsettledProfitCalculationSum = new BigDecimal(0);
  292. for (int i = 0; i < length; i++) {
  293. SettlementSourceResultVo settlementSource = settlementSources.get(i);
  294. signPremium = signPremium.add(settlementSource.getSignPremium());
  295. signReceivableAmount = signReceivableAmount.add(settlementSource.getSignReceivableAmount());
  296. unCalculatedAmount = unCalculatedAmount.add(settlementSource.getUnCalculatedAmount());
  297. settledProfit = settledProfit.add(settlementSource.getSettledProfit());
  298. agentAmount = agentAmount.add(settlementSource.getAgentAmount());
  299. unsettledProfitCalculationSum = unsettledProfitCalculationSum.add(settlementSource.getUnsettledProfitCalculation());
  300. }
  301. //合计
  302. SettlementSourceResultVo settlementSourceResultVo = new SettlementSourceResultVo();
  303. settlementSourceResultVo.setSignDate("合计");
  304. settlementSourceResultVo.setSignPremium(signPremium);
  305. settlementSourceResultVo.setSettlementData(settlementSourceDataSum);
  306. settlementSourceResultVo.setSignReceivableAmount(signReceivableAmount);
  307. settlementSourceResultVo.setUnCalculatedAmount(unCalculatedAmount);
  308. settlementSourceResultVo.setSettledProfit(settledProfit);
  309. settlementSourceResultVo.setAgentAmount(agentAmount);
  310. settlementSourceResultVo.setUnsettledProfitCalculation(unsettledProfitCalculationSum);
  311. settlementSources.add(settlementSourceResultVo);
  312. return settlementSources;
  313. }
  314. @Override
  315. public IPage<InvSource> getRecivablePage(InvSourceQueryVo invSourceQueryVo) {
  316. PageRequest pageRequest = new PageRequest();
  317. pageRequest.setPageNum(invSourceQueryVo.getPageNum());
  318. pageRequest.setPageSize(invSourceQueryVo.getPageSize());
  319. Page page = PageRequest.buildPageRequest(pageRequest);
  320. if (invSourceQueryVo.getSigningTime() != null && !"".equals(invSourceQueryVo.getSigningTime())) {
  321. String[] split = invSourceQueryVo.getSigningTime().split(",");
  322. invSourceQueryVo.setSigningTimeStartTime(split[0]);
  323. invSourceQueryVo.setSigningTimeEndTime(split[1]);
  324. }
  325. if (invSourceQueryVo.getClearingTime() != null && !"".equals(invSourceQueryVo.getClearingTime())) {
  326. String[] split1 = invSourceQueryVo.getClearingTime().split(",");
  327. invSourceQueryVo.setClearingTimeStartTime(split1[0]);
  328. invSourceQueryVo.setClearingTimeEndTime(split1[1]);
  329. }
  330. Page<InvSource> pageData = invSourceMapper.getRecivablePage(page, invSourceQueryVo);
  331. List<InvSource> records = pageData.getRecords();
  332. records.forEach(x -> {
  333. x.setClearingState("0".equals(x.getClearingState()) ? "未结算" : "1".equals(x.getClearingState()) ? "已结算" :
  334. "2".equals(x.getClearingState()) ? "孤儿单" : x.getClearingState());
  335. x.setInsuranceClearingState("0".equals(x.getInsuranceClearingState()) ? "未结算" :
  336. "1".equals(x.getInsuranceClearingState()) ? "已结算" : x.getInsuranceClearingState());
  337. });
  338. pageData.setRecords(records);
  339. return pageData;
  340. }
  341. @Override
  342. public List<InvSource> getRecivableList(InvSourceQueryVo invSourceQueryVo) {
  343. if (invSourceQueryVo.getSigningTime() != null && !"".equals(invSourceQueryVo.getSigningTime())) {
  344. String[] split = invSourceQueryVo.getSigningTime().split(",");
  345. invSourceQueryVo.setSigningTimeStartTime(split[0]);
  346. invSourceQueryVo.setSigningTimeEndTime(split[1]);
  347. }
  348. if (invSourceQueryVo.getClearingTime() != null && !"".equals(invSourceQueryVo.getClearingTime())) {
  349. String[] split1 = invSourceQueryVo.getClearingTime().split(",");
  350. invSourceQueryVo.setClearingTimeStartTime(split1[0]);
  351. invSourceQueryVo.setClearingTimeEndTime(split1[1]);
  352. }
  353. List<InvSource> pageData = invSourceMapper.getRecivableList(invSourceQueryVo);
  354. pageData.forEach(x -> {
  355. x.setClearingState("0".equals(x.getClearingState()) ? "未结算" : "1".equals(x.getClearingState()) ? "已结算" :
  356. "2".equals(x.getClearingState()) ? "孤儿单" : x.getClearingState());
  357. x.setInsuranceClearingState("0".equals(x.getInsuranceClearingState()) ? "未结算" :
  358. "1".equals(x.getInsuranceClearingState()) ? "已结算" : x.getInsuranceClearingState());
  359. });
  360. return pageData;
  361. }
  362. @Override
  363. public Boolean updateRecivable(InvSource invSource) {
  364. BigDecimal tax = BigDecimal.valueOf(1.06);
  365. //处理交强不含税
  366. invSource.setJqPremium(invSource.getJqPremiumTax().divide(tax, 2, RoundingMode.HALF_UP));
  367. //处理商业不含税
  368. invSource.setSyPremium(invSource.getSyPremiumTax().divide(tax, 2, RoundingMode.HALF_UP));
  369. //处理非车不含税
  370. invSource.setNonCarPremium(invSource.getNonCarPremiumTax().divide(tax, 2, RoundingMode.HALF_UP));
  371. //处理非跟单比例
  372. invSource.setJqNonCopyingRatio(invSource.getJqReceivableRatio().subtract(invSource.getJqPremiumRatio()));
  373. invSource.setSyNonCopyingRatio(invSource.getSyReceivableRatio().subtract(invSource.getSyPremiumRatio()));
  374. invSource.setNonCarNonCopyingRatio(invSource.getNonCarReceivableRatio().subtract(invSource.getNonCarPremiumRatio()));
  375. //处理手续费金额
  376. invSource.setPremium(
  377. invSource.getJqPremium().multiply(invSource.getJqPremiumRatio())
  378. .add(invSource.getSyPremium().multiply(invSource.getSyPremiumRatio()))
  379. .add(invSource.getNonCarPremium().multiply(invSource.getNonCarPremiumRatio())));
  380. //处理非跟单金额
  381. invSource.setNonCopying(
  382. invSource.getJqPremium().multiply(invSource.getJqNonCopyingRatio())
  383. .add(invSource.getSyPremium().multiply(invSource.getSyNonCopyingRatio()))
  384. .add(invSource.getNonCarPremium().multiply(invSource.getNonCarNonCopyingRatio())));
  385. //处理保司应收金额
  386. invSource.setReceivable(
  387. invSource.getJqPremium().multiply(invSource.getJqReceivableRatio())
  388. .add(invSource.getSyPremium().multiply(invSource.getSyReceivableRatio()))
  389. .add(invSource.getNonCarPremium().multiply(invSource.getNonCarReceivableRatio())));
  390. //处理补贴金额
  391. invSource.setSubsidyAmount(
  392. invSource.getJqPremiumTax().multiply(invSource.getSubsidyRatio())
  393. .add(invSource.getSyPremiumTax().multiply(invSource.getSubsidyRatio()))
  394. .add(invSource.getNonCarPremiumTax().multiply(invSource.getSubsidyRatio())));
  395. //处理应收总金额
  396. invSource.setTotalReceivableAmount(
  397. invSource.getReceivable().add(invSource.getSubsidyAmount()));
  398. //处理最大应付金额
  399. invSource.setMaxReceivable(
  400. invSource.getJqPremiumTax().multiply(invSource.getMaxJqReceivableRatio())
  401. .add(invSource.getSyPremiumTax().multiply(invSource.getMaxSyReceivableRatio()))
  402. .add(invSource.getNonCarPremiumTax().multiply(invSource.getMaxNonCarReceivableRatio())));
  403. invSource.setClearingState("未结算".equals(invSource.getClearingState()) ? "0" :
  404. "已结算".equals(invSource.getClearingState()) ? "1" : invSource.getClearingState());
  405. invSource.setInsuranceClearingState("未结算".equals(invSource.getInsuranceClearingState()) ? "0" :
  406. "已结算".equals(invSource.getInsuranceClearingState()) ? "1" : invSource.getInsuranceClearingState());
  407. return invSourceMapper.updateById(invSource) > 0;
  408. }
  409. @Override
  410. public IPage<InvSettlementSource> getSettlementPage(InvSettlementSourceQueryVo invSettlementSourceQueryVo) {
  411. PageRequest pageRequest = new PageRequest();
  412. pageRequest.setPageNum(invSettlementSourceQueryVo.getPageNum());
  413. pageRequest.setPageSize(invSettlementSourceQueryVo.getPageSize());
  414. Page page = PageRequest.buildPageRequest(pageRequest);
  415. LambdaQueryWrapper<InvSettlementSource> queryWrapper = new LambdaQueryWrapper<>();
  416. if (invSettlementSourceQueryVo.getLicenseno() != null && !"".equals(invSettlementSourceQueryVo.getLicenseno())) {
  417. queryWrapper.eq(InvSettlementSource::getLicenseno, invSettlementSourceQueryVo.getLicenseno());
  418. }
  419. if (invSettlementSourceQueryVo.getJqPolicyId() != null && !"".equals(invSettlementSourceQueryVo.getJqPolicyId())) {
  420. queryWrapper.eq(InvSettlementSource::getJqPolicyId, invSettlementSourceQueryVo.getJqPolicyId());
  421. }
  422. if (invSettlementSourceQueryVo.getSyPolicyId() != null && !"".equals(invSettlementSourceQueryVo.getSyPolicyId())) {
  423. queryWrapper.eq(InvSettlementSource::getSyPolicyId, invSettlementSourceQueryVo.getSyPolicyId());
  424. }
  425. if (invSettlementSourceQueryVo.getNonCarPolicyId() != null && !"".equals(invSettlementSourceQueryVo.getNonCarPolicyId())) {
  426. queryWrapper.eq(InvSettlementSource::getNonCarPolicyId, invSettlementSourceQueryVo.getNonCarPolicyId());
  427. }
  428. if (invSettlementSourceQueryVo.getInsuranceId() != null && !"".equals(invSettlementSourceQueryVo.getInsuranceId())) {
  429. queryWrapper.in(InvSettlementSource::getInsuranceId, invSettlementSourceQueryVo.getInsuranceId());
  430. }
  431. if (invSettlementSourceQueryVo.getInsuranceType() != null && !"".equals(invSettlementSourceQueryVo.getInsuranceType())) {
  432. queryWrapper.eq(InvSettlementSource::getInsuranceType, invSettlementSourceQueryVo.getInsuranceType());
  433. }
  434. if (invSettlementSourceQueryVo.getSignDate() != null && !"".equals(invSettlementSourceQueryVo.getSignDate())) {
  435. String[] split = invSettlementSourceQueryVo.getSignDate().split(",");
  436. queryWrapper.between(InvSettlementSource::getSignDate, split[0], split[1]);
  437. }
  438. if (invSettlementSourceQueryVo.getAgencySettlementTime() != null && !"".equals(invSettlementSourceQueryVo.getAgencySettlementTime())) {
  439. String[] split = invSettlementSourceQueryVo.getAgencySettlementTime().split(",");
  440. queryWrapper.between(InvSettlementSource::getAgencySettlementTime, split[0], split[1]);
  441. }
  442. if (invSettlementSourceQueryVo.getChannel() != null && !"".equals(invSettlementSourceQueryVo.getChannel())) {
  443. queryWrapper.eq(InvSettlementSource::getChannel, invSettlementSourceQueryVo.getChannel());
  444. }
  445. if (invSettlementSourceQueryVo.getChannelClassification() != null && !"".equals(invSettlementSourceQueryVo.getChannelClassification())) {
  446. queryWrapper.eq(InvSettlementSource::getChannelClassification, invSettlementSourceQueryVo.getChannelClassification());
  447. }
  448. if (invSettlementSourceQueryVo.getInsuredName() != null && !"".equals(invSettlementSourceQueryVo.getInsuredName())) {
  449. queryWrapper.like(InvSettlementSource::getInsuredName, invSettlementSourceQueryVo.getInsuredName());
  450. }
  451. Page pageData = invSettlementSourceMapper.selectPage(page, queryWrapper);
  452. return pageData;
  453. }
  454. @Override
  455. public List<InvSettlementSource> getSettlementList(InvSettlementSourceQueryVo invSettlementSourceQueryVo) {
  456. LambdaQueryWrapper<InvSettlementSource> queryWrapper = new LambdaQueryWrapper<>();
  457. if (invSettlementSourceQueryVo.getLicenseno() != null && !"".equals(invSettlementSourceQueryVo.getLicenseno())) {
  458. queryWrapper.eq(InvSettlementSource::getLicenseno, invSettlementSourceQueryVo.getLicenseno());
  459. }
  460. if (invSettlementSourceQueryVo.getJqPolicyId() != null && !"".equals(invSettlementSourceQueryVo.getJqPolicyId())) {
  461. queryWrapper.eq(InvSettlementSource::getJqPolicyId, invSettlementSourceQueryVo.getJqPolicyId());
  462. }
  463. if (invSettlementSourceQueryVo.getSyPolicyId() != null && !"".equals(invSettlementSourceQueryVo.getSyPolicyId())) {
  464. queryWrapper.eq(InvSettlementSource::getSyPolicyId, invSettlementSourceQueryVo.getSyPolicyId());
  465. }
  466. if (invSettlementSourceQueryVo.getNonCarPolicyId() != null && !"".equals(invSettlementSourceQueryVo.getNonCarPolicyId())) {
  467. queryWrapper.eq(InvSettlementSource::getNonCarPolicyId, invSettlementSourceQueryVo.getNonCarPolicyId());
  468. }
  469. if (invSettlementSourceQueryVo.getInsuranceId() != null && !"".equals(invSettlementSourceQueryVo.getInsuranceId())) {
  470. queryWrapper.in(InvSettlementSource::getInsuranceId, invSettlementSourceQueryVo.getInsuranceId());
  471. }
  472. if (invSettlementSourceQueryVo.getInsuranceType() != null && !"".equals(invSettlementSourceQueryVo.getInsuranceType())) {
  473. queryWrapper.eq(InvSettlementSource::getInsuranceType, invSettlementSourceQueryVo.getInsuranceType());
  474. }
  475. if (invSettlementSourceQueryVo.getSignDate() != null && !"".equals(invSettlementSourceQueryVo.getSignDate())) {
  476. String[] split = invSettlementSourceQueryVo.getSignDate().split(",");
  477. queryWrapper.between(InvSettlementSource::getSignDate, split[0], split[1]);
  478. }
  479. List<InvSettlementSource> pageData = invSettlementSourceMapper.selectList(queryWrapper);
  480. return pageData;
  481. }
  482. @Override
  483. public Boolean updateSettlement(InvSettlementSource invSettlementSource) {
  484. //处理结算金额
  485. BigDecimal settlementAmount = invSettlementSource.getJqPremiumTax().multiply(invSettlementSource.getCompulsoryExportRatio())
  486. .add(invSettlementSource.getSyPremiumTax().multiply(invSettlementSource.getCommercialExportRatio()))
  487. .add(invSettlementSource.getNonCarPremiumTax().multiply(invSettlementSource.getNonVehicleExportRatio()));
  488. invSettlementSource.setSettlementAmount(settlementAmount);
  489. return invSettlementSourceMapper.updateById(invSettlementSource) > 0 ? true : false;
  490. }
  491. @Override
  492. public Integer syncStatus() {
  493. Integer i = invSourceMapper.syncStatus();
  494. return i;
  495. }
  496. @Override
  497. public List<EsmInsCompany> getInsureCompany() {
  498. List<EsmInsCompany> insureCompany = invReceivableMapper.getInsureCompany();
  499. return insureCompany;
  500. }
  501. @Override
  502. public Page<ReceivableAndSettlementVo> getReceivableAndSettlementPage(ReceivableAndSettlementQueryVo receivableAndSettlementQueryVo) {
  503. Page page = new Page();
  504. page.setCurrent(receivableAndSettlementQueryVo.getPageNum());
  505. page.setSize(receivableAndSettlementQueryVo.getPageSize());
  506. Page<ReceivableAndSettlementVo> receivableAndSettlementPage = invReceivableMapper.getReceivableAndSettlementPage(page,
  507. receivableAndSettlementQueryVo);
  508. return receivableAndSettlementPage;
  509. }
  510. @Override
  511. public List<ReceivableAndSettlementVo> getReceivableAndSettlementList(ReceivableAndSettlementQueryVo receivableAndSettlementQueryVo) {
  512. List<ReceivableAndSettlementVo> receivableAndSettlementVoList =
  513. invReceivableMapper.getReceivableAndSettlementPage(receivableAndSettlementQueryVo);
  514. return receivableAndSettlementVoList;
  515. }
  516. @Override
  517. public Boolean deleteReceivable(String[] ids) {
  518. return invReceivableMapper.deleteReceivable(String.join(",", ids));
  519. }
  520. @Override
  521. public Boolean updateRecivableBatch(InvSource invSource) {
  522. List<String> list = Arrays.asList(invSource.getIds());
  523. List<InvSource> invSources = invSourceMapper.selectBatchIds(list);
  524. invSources.forEach(x -> {
  525. x.setInsuranceClearingState(invSource.getInsuranceClearingState());
  526. invSourceMapper.updateById(x);
  527. });
  528. return true;
  529. }
  530. @Override
  531. public Boolean updateSettlementBatch(InvSettlementSource invSettlementSource) {
  532. List<String> list = Arrays.asList(invSettlementSource.getIds());
  533. List<InvSettlementSource> invSettlementSources = invSettlementSourceMapper.selectBatchIds(list);
  534. invSettlementSources.forEach(x -> {
  535. x.setBusinessOwner(invSettlementSource.getBusinessOwner());
  536. x.setCompulsoryExportRatio(invSettlementSource.getCompulsoryExportRatio());
  537. x.setCommercialExportRatio(invSettlementSource.getCommercialExportRatio());
  538. x.setNonVehicleExportRatio(invSettlementSource.getNonVehicleExportRatio());
  539. invSettlementSourceMapper.updateById(x);
  540. });
  541. return true;
  542. }
  543. @Override
  544. public Boolean addReceivable(InvSource invSource) {
  545. invSource.setId(IdGenerate.nextId());
  546. invSource.builder();
  547. BigDecimal tax = new BigDecimal(1.06);
  548. //处理交强不含税
  549. invSource.setJqPremium(invSource.getJqPremiumTax().divide(tax, 2, RoundingMode.HALF_UP));
  550. //处理商业不含税
  551. invSource.setSyPremium(invSource.getSyPremiumTax().divide(tax, 2, RoundingMode.HALF_UP));
  552. //处理非车不含税
  553. invSource.setNonCarPremium(invSource.getNonCarPremiumTax().divide(tax, 2, RoundingMode.HALF_UP));
  554. //处理非跟单比例
  555. invSource.setJqNonCopyingRatio(invSource.getJqReceivableRatio().subtract(invSource.getJqPremiumRatio()));
  556. invSource.setSyNonCopyingRatio(invSource.getSyReceivableRatio().subtract(invSource.getSyPremiumRatio()));
  557. invSource.setNonCarNonCopyingRatio(invSource.getNonCarReceivableRatio().subtract(invSource.getNonCarPremiumRatio()));
  558. //处理手续费金额
  559. invSource.setPremium(
  560. invSource.getJqPremium().multiply(invSource.getJqPremiumRatio())
  561. .add(invSource.getSyPremium().multiply(invSource.getSyPremiumRatio()))
  562. .add(invSource.getNonCarPremium().multiply(invSource.getNonCarPremiumRatio())));
  563. //处理非跟单金额
  564. invSource.setNonCopying(
  565. invSource.getJqPremium().multiply(invSource.getJqNonCopyingRatio())
  566. .add(invSource.getSyPremium().multiply(invSource.getSyNonCopyingRatio()))
  567. .add(invSource.getNonCarPremium().multiply(invSource.getNonCarNonCopyingRatio())));
  568. //处理保司应收金额
  569. invSource.setReceivable(
  570. invSource.getJqPremium().multiply(invSource.getJqReceivableRatio())
  571. .add(invSource.getSyPremium().multiply(invSource.getSyReceivableRatio()))
  572. .add(invSource.getNonCarPremium().multiply(invSource.getNonCarReceivableRatio())));
  573. //处理补贴金额
  574. invSource.setSubsidyAmount(
  575. invSource.getJqPremiumTax().multiply(invSource.getSubsidyRatio())
  576. .add(invSource.getSyPremiumTax().multiply(invSource.getSubsidyRatio()))
  577. .add(invSource.getNonCarPremiumTax().multiply(invSource.getSubsidyRatio())));
  578. //处理应收总金额
  579. invSource.setTotalReceivableAmount(
  580. invSource.getReceivable().add(invSource.getSubsidyAmount()));
  581. //处理最大应付金额
  582. invSource.setMaxReceivable(
  583. invSource.getJqPremiumTax().multiply(invSource.getMaxJqReceivableRatio())
  584. .add(invSource.getSyPremiumTax().multiply(invSource.getMaxSyReceivableRatio()))
  585. .add(invSource.getNonCarPremiumTax().multiply(invSource.getMaxNonCarReceivableRatio())));
  586. boolean save = invSourceMapper.insert(invSource) > 0 ? true : false;
  587. return save;
  588. }
  589. @Override
  590. public List<String> dataMatching() {
  591. List<String> data = invSourceMapper.dataMatching();
  592. return data;
  593. }
  594. @Override
  595. public Boolean deleteSettlement(String[] ids) {
  596. List<String> list = Arrays.asList(ids);
  597. int i = invSettlementSourceMapper.deleteBatchIds(list);
  598. return i > 0 ? true : false;
  599. }
  600. }