InvReceivableServiceImpl.java 42 KB

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