SysChannelCostServiceImpl.java 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319
  1. package com.ydtech.modules.admin.service.impl;
  2. import cn.hutool.core.collection.CollUtil;
  3. import cn.hutool.core.util.StrUtil;
  4. import com.alibaba.fastjson.JSON;
  5. import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
  6. import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
  7. import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
  8. import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
  9. import com.ydtech.core.page.HttpResult;
  10. import com.ydtech.exception.SystemException;
  11. import com.ydtech.modules.admin.constants.UserConstants;
  12. import com.ydtech.modules.admin.dao.SysChannelCostMapper;
  13. import com.ydtech.modules.admin.model.dto.SysChannelCostDto;
  14. import com.ydtech.modules.admin.model.excel.read.SysChannelCostExcelReadHead;
  15. import com.ydtech.modules.admin.model.excel.wirte.SysChannelCostExportWriteHead;
  16. import com.ydtech.modules.admin.model.po.SysChannelCost;
  17. import com.ydtech.modules.admin.model.po.SysCostOperateLog;
  18. import com.ydtech.modules.admin.model.vo.ChannelAuditVo;
  19. import com.ydtech.modules.admin.model.vo.ChannelSettleVo;
  20. import com.ydtech.modules.admin.model.vo.SysChannelCostPageVo;
  21. import com.ydtech.modules.admin.service.SysChannelCostService;
  22. import com.ydtech.modules.admin.service.SysCostOperateLogService;
  23. import com.ydtech.modules.base.controller.BaseController;
  24. import com.ydtech.modules.inv.utils.EasyExcelUtils;
  25. import com.ydtech.modules.order.entity.BasePageResult;
  26. import com.ydtech.modules.order.entity.InsAreaCompany;
  27. import com.ydtech.modules.order.service.InsAreaCompanyService;
  28. import com.ydtech.modules.protocol.utils.AssertionUtils;
  29. import org.apache.commons.lang3.ObjectUtils;
  30. import org.apache.commons.lang3.StringUtils;
  31. import org.springframework.beans.BeanUtils;
  32. import org.springframework.beans.factory.annotation.Autowired;
  33. import org.springframework.beans.factory.annotation.Value;
  34. import org.springframework.stereotype.Service;
  35. import java.io.IOException;
  36. import java.math.BigDecimal;
  37. import java.nio.file.Files;
  38. import java.nio.file.Path;
  39. import java.nio.file.Paths;
  40. import java.time.LocalDateTime;
  41. import java.util.*;
  42. import java.util.function.Function;
  43. import java.util.stream.Collectors;
  44. /**
  45. * @author dongxin
  46. * @description 针对表【sys_channel_cost(分组计算结果表)】的数据库操作Service实现
  47. * @createDate 2024-09-11 10:16:44
  48. */
  49. @Service
  50. public class SysChannelCostServiceImpl extends ServiceImpl<SysChannelCostMapper, SysChannelCost>
  51. implements SysChannelCostService {
  52. @Value("${upload.file.path}")
  53. private String uploadPath;
  54. @Value("${upload.file.url}")
  55. private String uploadUrl;
  56. @Autowired
  57. private SysCostOperateLogService sysCostOperateLogService;
  58. @Autowired
  59. private InsAreaCompanyService insAreaCompanyService;
  60. @Override
  61. public Page<SysChannelCost> queryPage(Page page, SysChannelCostPageVo sysChannelCostPageVo) {
  62. LambdaQueryWrapper<SysChannelCost> wrapper = new LambdaQueryWrapper<>();
  63. wrapper.eq(!ObjectUtils.isEmpty(sysChannelCostPageVo.getOrderNo()), SysChannelCost::getOrderNo,
  64. sysChannelCostPageVo.getOrderNo())
  65. .eq(SysChannelCost::getStatus, 1)
  66. .eq(!ObjectUtils.isEmpty(sysChannelCostPageVo.getCompanyId()),SysChannelCost::getCompanyId,
  67. sysChannelCostPageVo.getCompanyId())
  68. .eq(!ObjectUtils.isEmpty(sysChannelCostPageVo.getUserName()),SysChannelCost::getUserName,
  69. sysChannelCostPageVo.getUserName())
  70. .eq(!ObjectUtils.isEmpty(sysChannelCostPageVo.getUserId()),SysChannelCost::getUserId,
  71. sysChannelCostPageVo.getUserId())
  72. .eq(!ObjectUtils.isEmpty(sysChannelCostPageVo.getLicenseNo()),SysChannelCost::getLicenseNo,
  73. sysChannelCostPageVo.getLicenseNo())
  74. ;
  75. Page<SysChannelCost> costPage = page(page, wrapper);
  76. return costPage;
  77. }
  78. @Override
  79. public SysChannelCost queryById(Long id) {
  80. return getById(id);
  81. }
  82. @Override
  83. public void edit(SysChannelCost sysChannelCost) {
  84. SysChannelCost cost = getByIdExist(sysChannelCost.getId(), "查询加投结算信息不存在");
  85. AssertionUtils.isFail(cost.getDeleted().equals(1),"已删除的数据不允许修改");
  86. AssertionUtils.isFail(cost.getStatus().equals(1),"审核通过的数据不允许修改");
  87. if(!StringUtils.isBlank(sysChannelCost.getJqCostsProportion())){
  88. BigDecimal jq = new BigDecimal(sysChannelCost.getJqCostsProportion());
  89. if(jq.compareTo(new BigDecimal("1")) > 0){
  90. throw new SystemException("交强加投比例不能大于1");
  91. }
  92. }
  93. if(!StringUtils.isBlank(sysChannelCost.getSyCostsProportion())){
  94. BigDecimal sy = new BigDecimal(sysChannelCost.getSyCostsProportion());
  95. if(sy.compareTo(new BigDecimal("1")) > 0){
  96. throw new SystemException("商业加投比例不能大于1");
  97. }
  98. }
  99. if(!StringUtils.isBlank(sysChannelCost.getNoCostsProportion())){
  100. BigDecimal no = new BigDecimal(sysChannelCost.getNoCostsProportion());
  101. if(no.compareTo(new BigDecimal("1")) > 0){
  102. throw new SystemException("非车加投比例不能大于1");
  103. }
  104. }
  105. // 重新计算加投金额
  106. BigDecimal jq = cost.getJqPremium().multiply(
  107. new BigDecimal(StringUtils.isBlank(sysChannelCost.getJqCostsProportion())? "0":sysChannelCost.getJqCostsProportion()))
  108. .setScale(2, BigDecimal.ROUND_HALF_UP);
  109. BigDecimal sy = cost.getSyPremium().multiply(
  110. new BigDecimal(StringUtils.isBlank(sysChannelCost.getSyCostsProportion())? "0":sysChannelCost.getSyCostsProportion()))
  111. .setScale(2, BigDecimal.ROUND_HALF_UP);
  112. BigDecimal no = cost.getJyPremium().multiply(
  113. new BigDecimal(StringUtils.isBlank(sysChannelCost.getNoCostsProportion())? "0":sysChannelCost.getNoCostsProportion()))
  114. .setScale(2, BigDecimal.ROUND_HALF_UP);
  115. LambdaUpdateWrapper<SysChannelCost> updateWrapper = new LambdaUpdateWrapper<>();
  116. updateWrapper.set(SysChannelCost::getJqCostsProportion,sysChannelCost.getJqCostsProportion());
  117. updateWrapper.set(SysChannelCost::getSyCostsProportion,sysChannelCost.getSyCostsProportion());
  118. updateWrapper.set(SysChannelCost::getNoCostsProportion,sysChannelCost.getNoCostsProportion());
  119. updateWrapper.set(SysChannelCost::getJqJtPremium,jq);
  120. updateWrapper.set(SysChannelCost::getSyJtPremium,sy);
  121. updateWrapper.set(SysChannelCost::getJyJtPremium,no);
  122. updateWrapper.set(SysChannelCost::getTotalPremium,jq.add(sy).add(no));
  123. updateWrapper.set(SysChannelCost::getUpdateBy,sysChannelCost.getUpdateBy());
  124. updateWrapper.set(SysChannelCost::getUpdateTime,sysChannelCost.getUpdateTime());
  125. updateWrapper.eq(SysChannelCost::getId,sysChannelCost.getId());
  126. this.baseMapper.update(cost, updateWrapper);
  127. // 日志新增
  128. SysChannelCost logEntity = new SysChannelCost();
  129. logEntity.setId(sysChannelCost.getId());
  130. logEntity.setJqCostsProportion(sysChannelCost.getJqCostsProportion());
  131. logEntity.setSyCostsProportion(sysChannelCost.getSyCostsProportion());
  132. logEntity.setNoCostsProportion(sysChannelCost.getNoCostsProportion());
  133. logEntity.setJqJtPremium(sysChannelCost.getJqJtPremium());
  134. logEntity.setSyJtPremium(sysChannelCost.getSyJtPremium());
  135. logEntity.setJyJtPremium(sysChannelCost.getJyJtPremium());
  136. SysCostOperateLog sysCostOperateLog = new SysCostOperateLog();
  137. sysCostOperateLog.setOptId(sysChannelCost.getId());
  138. sysCostOperateLog.setOptType(UserConstants.OPT_TYPE_1);
  139. sysCostOperateLog.setOptContent(JSON.toJSONString(logEntity));
  140. sysCostOperateLog.setCreateBy(sysChannelCost.getUpdateBy());
  141. sysCostOperateLog.setCreateTime(sysChannelCost.getUpdateTime());
  142. sysCostOperateLogService.save(sysCostOperateLog);
  143. }
  144. @Override
  145. public void delete(Long id) {
  146. SysChannelCost sysChannelCost = getByIdExist(id, "查询加投结算信息不存在");
  147. Integer delFlag = sysChannelCost.getDeleted();
  148. Integer i = Objects.equals(UserConstants.NOT_DEL, delFlag) ? UserConstants.NOT_DEL : UserConstants.DEL;
  149. boolean b = updateDel(i);
  150. sysChannelCost.setDeleted(i);
  151. boolean b1 = updateById(sysChannelCost);
  152. AssertionUtils.isSucceed(b1 && b, "成功");
  153. }
  154. @Override
  155. public List<SysChannelCost> queryList(SysChannelCostPageVo sysChannelCostPageVo) {
  156. LambdaQueryWrapper<SysChannelCost> wrapper = new LambdaQueryWrapper<>();
  157. wrapper.eq(!ObjectUtils.isEmpty(sysChannelCostPageVo.getOrderNo()), SysChannelCost::getOrderNo,
  158. sysChannelCostPageVo.getOrderNo())
  159. .eq(!ObjectUtils.isEmpty(sysChannelCostPageVo.getStatus()),SysChannelCost::getStatus,
  160. sysChannelCostPageVo.getStatus())
  161. .eq(!ObjectUtils.isEmpty(sysChannelCostPageVo.getCompanyId()),SysChannelCost::getCompanyId,
  162. sysChannelCostPageVo.getCompanyId())
  163. .eq(!ObjectUtils.isEmpty(sysChannelCostPageVo.getUserName()),SysChannelCost::getUserName,
  164. sysChannelCostPageVo.getUserName())
  165. .eq(!ObjectUtils.isEmpty(sysChannelCostPageVo.getUserId()),SysChannelCost::getUserId,
  166. sysChannelCostPageVo.getUserId())
  167. .eq(!ObjectUtils.isEmpty(sysChannelCostPageVo.getLicenseNo()),SysChannelCost::getLicenseNo,
  168. sysChannelCostPageVo.getLicenseNo())
  169. ;
  170. List<SysChannelCost> list = list(wrapper);
  171. return list;
  172. }
  173. @Override
  174. public HttpResult exportData(SysChannelCostPageVo sysChannelCostPageVo) {
  175. List<SysChannelCost> costList = this.queryList(sysChannelCostPageVo);
  176. AssertionUtils.isFail(costList.size() <= 0,"无数据导出!");
  177. List<SysChannelCostExportWriteHead> headList = new ArrayList<>();
  178. costList.stream().forEach(cost -> {
  179. SysChannelCostExportWriteHead head = new SysChannelCostExportWriteHead();
  180. BeanUtils.copyProperties(cost, head);
  181. headList.add(head);
  182. });
  183. String uploadPath = this.uploadPath + "/excel/";
  184. Path path = Paths.get(uploadPath);
  185. if (!Files.exists(path)) {
  186. try {
  187. Files.createDirectories(path);
  188. } catch (IOException e) {
  189. e.printStackTrace();
  190. }
  191. }
  192. String fileName = EasyExcelUtils.downExcel(uploadPath, "加投结算表", SysChannelCostExportWriteHead.class, headList);
  193. return HttpResult.ok("", uploadUrl + "excel/" + fileName);
  194. }
  195. @Override
  196. public boolean audit(ChannelAuditVo channelAuditVo) {
  197. SysChannelCost sysChannelCost = getByIdExist(channelAuditVo.getId(), "查询加投结算信息不存在");
  198. sysChannelCost.setStatus(channelAuditVo.getIsAudit());
  199. return baseMapper.updateById(sysChannelCost) > 0;
  200. }
  201. @Override
  202. public boolean settle(ChannelSettleVo channelSettleVo) {
  203. // 获取子订单信息
  204. List<SysChannelCost> costList = this.baseMapper.selectBatchIds(channelSettleVo.getIds());
  205. if(CollUtil.isEmpty(costList)){
  206. return false;
  207. }
  208. // 查询子订单
  209. List<String> orderNos = costList.stream().map(SysChannelCost::getOrderNo).collect(Collectors.toList());
  210. LambdaQueryWrapper<InsAreaCompany> wrapper = new LambdaQueryWrapper<>();
  211. wrapper.select(InsAreaCompany::getId,InsAreaCompany::getSigningTime,InsAreaCompany::getPayDate)
  212. .in(InsAreaCompany::getId, orderNos);
  213. Map<String, InsAreaCompany> orderMap = insAreaCompanyService.list(wrapper).stream()
  214. .collect(Collectors.toMap(InsAreaCompany::getId, Function.identity()));
  215. for (SysChannelCost sysChannelCost : costList) {
  216. if (sysChannelCost.getStatus().equals(0) || sysChannelCost.getSettleStatus().equals(1)) {
  217. throw new SystemException("未审核通过的单据和已结算的单据不允许再次上传!");
  218. }
  219. sysChannelCost.setSettleStatus(1); // 已经结算状态
  220. sysChannelCost.setVoucherNumber(channelSettleVo.getVoucherNumber());
  221. if(orderMap.containsKey(sysChannelCost.getOrderNo())){
  222. sysChannelCost.setPayDate(orderMap.get(sysChannelCost.getOrderNo()).getPayDate());
  223. sysChannelCost.setSigningTime(orderMap.get(sysChannelCost.getOrderNo()).getSigningTime());
  224. }
  225. sysChannelCost.setUpdateTime(LocalDateTime.now());
  226. sysChannelCost.setUpdateBy(BaseController.getUser().getName());
  227. }
  228. return updateBatchById(costList);
  229. }
  230. @Override
  231. public BasePageResult<SysChannelCostDto> queryStaticPage(SysChannelCostPageVo sysChannelCostPageVo) {
  232. Page<SysChannelCostDto> page = new Page<>(sysChannelCostPageVo.getPageNum(),
  233. sysChannelCostPageVo.getPageSize());
  234. Page<SysChannelCostDto> result = this.baseMapper.queryPage(page, sysChannelCostPageVo);
  235. return new BasePageResult<>(sysChannelCostPageVo.getPageNum(), page.getSize(), result.getTotal(), page.getPages(),
  236. result.getRecords());
  237. }
  238. @Override
  239. public void importSettle(List<SysChannelCostExcelReadHead> heads, String voucherNumber) {
  240. heads.forEach(head -> {
  241. LambdaQueryWrapper<SysChannelCost> wrapper = new LambdaQueryWrapper<>();
  242. wrapper.eq(SysChannelCost::getStatus,1)
  243. .eq(SysChannelCost::getSettleStatus,0)
  244. .eq(!StringUtils.isBlank(head.getUserId()),SysChannelCost::getUserId,head.getUserId())
  245. .eq(!StringUtils.isBlank(head.getUserName()),SysChannelCost::getUserName,head.getUserName());
  246. List<SysChannelCost> costList = list(wrapper);
  247. if (CollUtil.isNotEmpty(costList)) {
  248. for (SysChannelCost sysChannelCost : costList) {
  249. sysChannelCost.setJqPolicyNo(StrUtil.nullToEmpty(sysChannelCost.getJqPolicyNo()));
  250. sysChannelCost.setSyPolicyNo(StrUtil.nullToEmpty(sysChannelCost.getSyPolicyNo()));
  251. sysChannelCost.setNoPolicyNo(StrUtil.nullToEmpty(sysChannelCost.getNoPolicyNo()));
  252. sysChannelCost.setJqPremium(Objects.isNull(sysChannelCost.getJqPremium()) ? new BigDecimal(0) : sysChannelCost.getJqPremium());
  253. sysChannelCost.setSyPremium(Objects.isNull(sysChannelCost.getSyPremium()) ? new BigDecimal(0) : sysChannelCost.getSyPremium());
  254. sysChannelCost.setJyPremium(Objects.isNull(sysChannelCost.getJyPremium()) ? new BigDecimal(0) : sysChannelCost.getJyPremium());
  255. sysChannelCost.setTaxAmount(Objects.isNull(sysChannelCost.getTaxAmount()) ? new BigDecimal(0) : sysChannelCost.getTaxAmount());
  256. sysChannelCost.setJqCostsProportion(StringUtils.isBlank(sysChannelCost.getJqCostsProportion()) ? "0" : sysChannelCost.getJqCostsProportion());
  257. sysChannelCost.setSyCostsProportion(StringUtils.isBlank(sysChannelCost.getSyCostsProportion()) ? "0" : sysChannelCost.getSyCostsProportion());
  258. sysChannelCost.setNoCostsProportion(StringUtils.isBlank(sysChannelCost.getNoCostsProportion()) ? "0" : sysChannelCost.getNoCostsProportion());
  259. sysChannelCost.setTotalPremium(Objects.isNull(sysChannelCost.getTotalPremium()) ? new BigDecimal(0) : sysChannelCost.getTotalPremium());
  260. if (!sysChannelCost.getJqPolicyNo().equals(StrUtil.nullToEmpty(head.getJqPolicyNo()))
  261. || !sysChannelCost.getSyPolicyNo().equals(StrUtil.nullToEmpty(head.getSyPolicyNo()))
  262. || !sysChannelCost.getNoPolicyNo().equals(StrUtil.nullToEmpty(head.getNoPolicyNo()))
  263. || sysChannelCost.getJqPremium().compareTo(head.getJqPremium()) != 0
  264. || sysChannelCost.getSyPremium().compareTo(head.getSyPremium()) != 0
  265. || sysChannelCost.getJyPremium().compareTo(head.getJyPremium()) != 0
  266. || sysChannelCost.getTaxAmount().compareTo(head.getTaxAmount()) != 0
  267. || sysChannelCost.getTotalPremium().compareTo(head.getTotalPremium()) != 0
  268. || !sysChannelCost.getJqCostsProportion().equals(head.getJqCostsProportion())
  269. || !sysChannelCost.getSyCostsProportion().equals(head.getSyCostsProportion())
  270. || !sysChannelCost.getNoCostsProportion().equals(head.getNoCostsProportion())
  271. || !sysChannelCost.getLicenseNo().equals(head.getLicenseNo())
  272. ){
  273. continue;
  274. }
  275. // 查询子订单
  276. List<String> orderNos = costList.stream().map(SysChannelCost::getOrderNo).collect(Collectors.toList());
  277. LambdaQueryWrapper<InsAreaCompany> orderWrapper = new LambdaQueryWrapper<>();
  278. orderWrapper.select(InsAreaCompany::getId,InsAreaCompany::getSigningTime,InsAreaCompany::getPayDate)
  279. .eq(InsAreaCompany::getId, sysChannelCost.getOrderNo());
  280. InsAreaCompany insAreaCompany = insAreaCompanyService.getOne(orderWrapper);
  281. LambdaUpdateWrapper<SysChannelCost> costWrapper = new LambdaUpdateWrapper<>();
  282. costWrapper.eq(SysChannelCost::getId,sysChannelCost.getId())
  283. .set(SysChannelCost::getSettleStatus,1)
  284. .set(SysChannelCost::getVoucherNumber,voucherNumber)
  285. .set(!Objects.isNull(insAreaCompany.getSigningTime()),SysChannelCost::getSigningTime,insAreaCompany.getSigningTime())
  286. .set(!Objects.isNull(insAreaCompany.getPayDate()),SysChannelCost::getPayDate,insAreaCompany.getPayDate())
  287. .set(SysChannelCost::getUpdateBy,BaseController.getUser().getName())
  288. .set(SysChannelCost::getUpdateTime,LocalDateTime.now());
  289. this.baseMapper.update(sysChannelCost, costWrapper);
  290. }
  291. }
  292. });
  293. }
  294. }