InvReceivableServiceImpl.java 41 KB

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