|
|
@@ -1,5 +1,6 @@
|
|
|
package com.jzg.quotation.summary.service.impl;
|
|
|
|
|
|
+import cn.hutool.core.collection.CollUtil;
|
|
|
import com.alibaba.nacos.common.utils.CollectionUtils;
|
|
|
import com.jzg.commons.core.page.HttpResult;
|
|
|
import com.jzg.commons.entity.po.InsFeeOrders;
|
|
|
@@ -12,6 +13,7 @@ import com.jzg.commons.entity.rights.po.InsOrderRightsPackage;
|
|
|
import com.jzg.commons.entity.rights.vo.InsOrderRightsInfoVo;
|
|
|
import com.jzg.commons.entity.rights.vo.InsOrderRightsPackageVo;
|
|
|
import com.jzg.commons.entity.rights.vo.InsOrderRightsVo;
|
|
|
+import com.jzg.commons.util.AssertionUtils;
|
|
|
import com.jzg.quotation.summary.service.*;
|
|
|
import lombok.RequiredArgsConstructor;
|
|
|
import lombok.extern.slf4j.Slf4j;
|
|
|
@@ -20,8 +22,10 @@ import org.springframework.stereotype.Service;
|
|
|
import org.springframework.transaction.annotation.Transactional;
|
|
|
import org.springframework.transaction.interceptor.TransactionAspectSupport;
|
|
|
|
|
|
+import java.math.BigDecimal;
|
|
|
import java.util.ArrayList;
|
|
|
import java.util.List;
|
|
|
+import java.util.Optional;
|
|
|
|
|
|
/**
|
|
|
* 类描述:
|
|
|
@@ -43,25 +47,25 @@ public class InsOrderRightsInfoServiceImpl implements InsOrderRightsInfoService
|
|
|
/**
|
|
|
* 订单关联权益信息入库
|
|
|
* @param insOrderRightsInfoDto
|
|
|
- * @param insFeeOrders
|
|
|
+ * @param orderNo
|
|
|
* @return
|
|
|
*/
|
|
|
@Transactional(rollbackFor = Exception.class)
|
|
|
@Override
|
|
|
- public void saveInsOrderRightsInfo(InsOrderRightsInfoDto insOrderRightsInfoDto, InsFeeOrders insFeeOrders) {
|
|
|
+ public void saveInsOrderRightsInfo(InsOrderRightsInfoDto insOrderRightsInfoDto,String orderNo) {
|
|
|
// 1. 业务校验:至少有一个集合有数据
|
|
|
boolean hasRights = CollectionUtils.isNotEmpty(insOrderRightsInfoDto.getInsOrderRightsList());
|
|
|
boolean hasPackages = CollectionUtils.isNotEmpty(insOrderRightsInfoDto.getInsOrderRightsPackageList());
|
|
|
try{
|
|
|
// 先删除现有的权益券
|
|
|
if (hasRights) {
|
|
|
- Integer deletedRights = insOrderRightsService.deleteByOrderNo(insFeeOrders.getOrderNo());
|
|
|
- log.info("删除订单 {} 现有权益券 {} 条", insFeeOrders.getOrderNo(), deletedRights);
|
|
|
+ Integer deletedRights = insOrderRightsService.deleteByOrderNo(orderNo);
|
|
|
+ log.info("删除订单 {} 现有权益券 {} 条", orderNo, deletedRights);
|
|
|
}
|
|
|
//删除现有的权益包
|
|
|
if (hasPackages) {
|
|
|
- Integer deletedPackages = insOrderRightsPackageService.deleteByOrderNo(insFeeOrders.getOrderNo());
|
|
|
- log.info("删除订单 {} 现有权益包 {} 条", insFeeOrders.getOrderNo(), deletedPackages);
|
|
|
+ Integer deletedPackages = insOrderRightsPackageService.deleteByOrderNo(orderNo);
|
|
|
+ log.info("删除订单 {} 现有权益包 {} 条", orderNo, deletedPackages);
|
|
|
}
|
|
|
//保存权益券信息
|
|
|
if(hasRights){
|
|
|
@@ -75,11 +79,11 @@ public class InsOrderRightsInfoServiceImpl implements InsOrderRightsInfoService
|
|
|
insOrderRights.setReceiverMobile(rightsGrantReceiverDTO.getReceiverMobile());
|
|
|
insOrderRights.setReceiverName(rightsGrantReceiverDTO.getReceiverName());
|
|
|
insOrderRights.setReceiverType(rightsGrantReceiverDTO.getReceiverType());
|
|
|
- insOrderRights.setOrderId(insFeeOrders.getOrderNo());
|
|
|
+ insOrderRights.setOrderId(orderNo);
|
|
|
insOrderRightsList.add(insOrderRights);
|
|
|
}
|
|
|
insOrderRightsService.saveInsOrderRights(insOrderRightsList);
|
|
|
- log.info("保存订单 {} 权益券 {} 条", insFeeOrders.getOrderNo(), insOrderRightsList.size());
|
|
|
+ log.info("保存订单 {} 权益券 {} 条", orderNo, insOrderRightsList.size());
|
|
|
}
|
|
|
//保存权益套餐信息
|
|
|
if(hasPackages){
|
|
|
@@ -93,24 +97,71 @@ public class InsOrderRightsInfoServiceImpl implements InsOrderRightsInfoService
|
|
|
insOrderRightsPackage.setReceiverMobile(rightsGrantReceiverDTO.getReceiverMobile());
|
|
|
insOrderRightsPackage.setReceiverName(rightsGrantReceiverDTO.getReceiverName());
|
|
|
insOrderRightsPackage.setReceiverType(rightsGrantReceiverDTO.getReceiverType());
|
|
|
- insOrderRightsPackage.setOrderId(insFeeOrders.getOrderNo());
|
|
|
+ insOrderRightsPackage.setOrderId(orderNo);
|
|
|
insOrderRightsPackageList.add(insOrderRightsPackage);
|
|
|
}
|
|
|
insOrderRightsPackageService.saveInsOrderRightsPackage(insOrderRightsPackageList);
|
|
|
- log.info("保存订单 {} 权益包 {} 条", insFeeOrders.getOrderNo(), insOrderRightsInfoDto.getInsOrderRightsPackageList().size());
|
|
|
+ log.info("保存订单 {} 权益包 {} 条", orderNo, insOrderRightsInfoDto.getInsOrderRightsPackageList().size());
|
|
|
}
|
|
|
log.info("订单权益券信息保存成功!");
|
|
|
if(hasRights || hasPackages){
|
|
|
+ InsFeeOrders feeOrders = insFeeOrdersService.getById(orderNo);
|
|
|
+ setUsedAmountAndRemainAmount(feeOrders,insOrderRightsInfoDto.getInsOrderRightsList(),insOrderRightsInfoDto.getInsOrderRightsPackageList());
|
|
|
//更新订单表的权益可用金额、已使用金额、剩余金额
|
|
|
- insFeeOrdersService.updateById(insFeeOrders);
|
|
|
+ insFeeOrdersService.updateById(feeOrders);
|
|
|
}
|
|
|
}catch (Exception e) {
|
|
|
- log.error("保存订单权益信息失败,订单ID: {}", insFeeOrders.getOrderNo(), e);
|
|
|
+ log.error("保存订单权益信息失败,订单ID: {}", orderNo, e);
|
|
|
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * 计算已使用金额、剩余金额存入订单费用表
|
|
|
+ * @param feeOrders
|
|
|
+ * @param rightsList
|
|
|
+ * @param rightsPackageList
|
|
|
+ */
|
|
|
+ private void setUsedAmountAndRemainAmount(InsFeeOrders feeOrders,List<InsOrderRightsDto> rightsList,List<InsOrderRightsPackageDto> rightsPackageList) {
|
|
|
+
|
|
|
+ // 计算权益金额 = (出口费用总和) - (出口留点费用总和)
|
|
|
+ BigDecimal availableAmount = feeOrders.getAvailableAmount();
|
|
|
+ // 权益金额大于 0,计算实际花费的权益金额并发放权益券
|
|
|
+ if (availableAmount.compareTo(BigDecimal.ZERO) > 0) {
|
|
|
+ // 初始化变量
|
|
|
+ BigDecimal rightsTotalAmount = BigDecimal.ZERO;//选中的权益券总价
|
|
|
+ BigDecimal rightsPackageTotalAmount = BigDecimal.ZERO;//选中的权益套餐总价
|
|
|
+
|
|
|
+ // 遍历权益单品,计算总金额并构建请求参数
|
|
|
+ if (CollUtil.isNotEmpty(rightsList)) {
|
|
|
+ for (InsOrderRightsDto rights : rightsList) {
|
|
|
+ // 累加金额
|
|
|
+ BigDecimal amount = Optional.ofNullable(rights.getSettlePrice()).orElse(BigDecimal.ZERO);
|
|
|
+ Integer count = Optional.ofNullable(rights.getRightsCount()).orElse(0);
|
|
|
+ rightsTotalAmount = rightsTotalAmount.add(amount.multiply(new BigDecimal(count)));
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // 遍历权益套餐,计算总金额并构建请求参数
|
|
|
+ if (CollUtil.isNotEmpty(rightsPackageList)) {
|
|
|
+ for (InsOrderRightsPackageDto pkg : rightsPackageList) {
|
|
|
+ // 累加金额
|
|
|
+ BigDecimal packagePrice = Optional.ofNullable(pkg.getPackagePrice()).orElse(BigDecimal.ZERO);
|
|
|
+ Integer count = Optional.ofNullable(pkg.getRightsCount()).orElse(0);
|
|
|
+ rightsPackageTotalAmount = rightsPackageTotalAmount.add(packagePrice.multiply(new BigDecimal(count)));
|
|
|
+ }
|
|
|
+ }
|
|
|
+ // 计算权益总花费并校验
|
|
|
+ BigDecimal usedAmount = rightsTotalAmount.add(rightsPackageTotalAmount);
|
|
|
+ if (usedAmount.compareTo(availableAmount) > 0) {
|
|
|
+ AssertionUtils.isFail(true, "权益金额不足!");
|
|
|
+ }
|
|
|
+ feeOrders.setUsedAmount(usedAmount);//已使用金额
|
|
|
+ feeOrders.setRemainingAmount(availableAmount.subtract(usedAmount));//剩余金额
|
|
|
+
|
|
|
+ }
|
|
|
+ }
|
|
|
/**
|
|
|
* 根据订单号查询权益券和权益套餐信息
|
|
|
* @param orderNo
|