霸王餐 充值
This commit is contained in:
@@ -1,22 +0,0 @@
|
||||
package com.czg.service.order.dto;
|
||||
|
||||
import lombok.Data;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
|
||||
/**
|
||||
* @author ww
|
||||
* @description
|
||||
*/
|
||||
@Data
|
||||
public class BigDecimalDTO {
|
||||
private BigDecimal price;
|
||||
|
||||
public BigDecimalDTO(BigDecimal price) {
|
||||
this.price = price;
|
||||
}
|
||||
|
||||
public BigDecimal getPrice() {
|
||||
return price == null ? BigDecimal.ZERO : price;
|
||||
}
|
||||
}
|
||||
@@ -16,6 +16,14 @@ public class VipPayParamDTO {
|
||||
@NotNull(message = "店铺不能为空")
|
||||
private Long shopId;
|
||||
private Long shopUserId;
|
||||
/**
|
||||
* 霸王餐使用
|
||||
*/
|
||||
private Long orderId;
|
||||
/**
|
||||
* 霸王餐使用 是否整单打包
|
||||
*/
|
||||
private Integer allPack;
|
||||
@NotNull(message = "充值金额不为空")
|
||||
private BigDecimal amount;
|
||||
|
||||
@@ -35,4 +43,9 @@ public class VipPayParamDTO {
|
||||
*/
|
||||
private String authCode;
|
||||
private String pwd;
|
||||
|
||||
|
||||
public boolean isAllPack() {
|
||||
return allPack != null && allPack == 1;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -32,7 +32,7 @@ import com.czg.order.vo.OrderDetailSmallVO;
|
||||
import com.czg.order.vo.OrderInfoVo;
|
||||
import com.czg.sa.StpKit;
|
||||
import com.czg.service.RedisService;
|
||||
import com.czg.service.order.dto.BigDecimalDTO;
|
||||
import com.czg.order.dto.BigDecimalDTO;
|
||||
import com.czg.service.order.enums.OrderStatusEnums;
|
||||
import com.czg.service.order.mapper.OrderInfoMapper;
|
||||
import com.czg.utils.AssertUtil;
|
||||
@@ -259,7 +259,9 @@ public class OrderInfoServiceImpl extends ServiceImpl<OrderInfoMapper, OrderInfo
|
||||
BigDecimalDTO prodCouponAmount = new BigDecimalDTO(BigDecimal.ZERO);
|
||||
//总商品支付金额 不包含打包费 用来计算后续
|
||||
BigDecimalDTO totalAmount = new BigDecimalDTO(BigDecimal.ZERO);
|
||||
processOrderDetails2(orderDetails, prodCouponMap, prodCouponAmount, totalAmount, param.isVipPrice());
|
||||
//最终打包费
|
||||
BigDecimalDTO packAmount = new BigDecimalDTO(BigDecimal.ZERO);
|
||||
processOrderDetails2(orderDetails, prodCouponMap, prodCouponAmount, totalAmount, packAmount, param.isAllPack(), param.isVipPrice());
|
||||
//总商品支付金额 不包含打包费 用来计算后续
|
||||
log.info("支付前置,商品金额{} 商品优惠券金额{} 总金额{}", totalAmount, prodCouponAmount, totalAmount.getPrice().add(orderInfo.getPackFee()));
|
||||
if (prodCouponAmount.getPrice().compareTo(param.getProductCouponDiscountAmount()) != 0) {
|
||||
@@ -268,10 +270,10 @@ public class OrderInfoServiceImpl extends ServiceImpl<OrderInfoMapper, OrderInfo
|
||||
orderInfo.setOriginAmount(totalAmount.getPrice());
|
||||
BigDecimal newTotalAmount = totalAmount.getPrice();
|
||||
//折扣金额 如 9折 计算 为 订单金额*0.9 向上取整
|
||||
if(param.getDiscountRatio().compareTo(BigDecimal.ZERO) > 0) {
|
||||
if (param.getDiscountRatio().compareTo(BigDecimal.ZERO) > 0) {
|
||||
newTotalAmount = totalAmount.getPrice().multiply(param.getDiscountRatio()).setScale(2, RoundingMode.UP);
|
||||
|
||||
}else if(param.getDiscountAmount().compareTo(BigDecimal.ZERO) > 0) {
|
||||
} else if (param.getDiscountAmount().compareTo(BigDecimal.ZERO) > 0) {
|
||||
newTotalAmount = totalAmount.getPrice().subtract(param.getDiscountAmount());
|
||||
}
|
||||
|
||||
@@ -301,11 +303,12 @@ public class OrderInfoServiceImpl extends ServiceImpl<OrderInfoMapper, OrderInfo
|
||||
newTotalAmount = newTotalAmount.subtract(param.getRoundAmount());
|
||||
log.info("支付前置4,订单金额{} ", newTotalAmount);
|
||||
//校验最终金额(订单金额 (扣除各类折扣)+打包费 餐位费)
|
||||
newTotalAmount = newTotalAmount.add(orderInfo.getPackFee()).add(orderInfo.getSeatAmount());
|
||||
newTotalAmount = newTotalAmount.add(packAmount.getPrice()).add(orderInfo.getSeatAmount());
|
||||
log.info("支付前置5,订单金额{} ", newTotalAmount);
|
||||
if (newTotalAmount.compareTo(param.getOrderAmount()) != 0) {
|
||||
throw new ValidateException("生成支付订单失败,订单金额不正确");
|
||||
}
|
||||
orderInfo.setPackFee(packAmount.getPrice());
|
||||
//生成订单 //discount_info 所有折扣 几折 折扣金额 满减金额 优惠券金额 积分抵扣金额 抹零
|
||||
upOrderPayInfo(orderInfo, param);
|
||||
orderDetailService.updateBatch(orderDetails);
|
||||
@@ -318,7 +321,7 @@ public class OrderInfoServiceImpl extends ServiceImpl<OrderInfoMapper, OrderInfo
|
||||
}
|
||||
|
||||
/**
|
||||
* 填充 优惠券使用数量 以及 付款金额
|
||||
* 填充 单价/付款金额
|
||||
*
|
||||
* @param orderDetails 订单详情 需要回填
|
||||
*/
|
||||
@@ -346,8 +349,10 @@ public class OrderInfoServiceImpl extends ServiceImpl<OrderInfoMapper, OrderInfo
|
||||
* @param prodCouponAmount 商品券优惠金额 商品单价*优惠数量 的总和
|
||||
* @param totalAmount 最终总金额(没加打包费 餐位费) 去除优惠券金额后的
|
||||
*/
|
||||
private void processOrderDetails2(List<OrderDetail> orderDetails, Map<Long, Integer> prodCouponMap,
|
||||
BigDecimalDTO prodCouponAmount, BigDecimalDTO totalAmount, boolean isVipPrice) {
|
||||
@Override
|
||||
public void processOrderDetails2(List<OrderDetail> orderDetails, Map<Long, Integer> prodCouponMap,
|
||||
BigDecimalDTO prodCouponAmount, BigDecimalDTO totalAmount, BigDecimalDTO packAmount,
|
||||
boolean isAllPack, boolean isVipPrice) {
|
||||
Map<Long, List<OrderDetail>> detailMap = new HashMap<>();
|
||||
for (OrderDetail detail : orderDetails) {
|
||||
detailMap.computeIfAbsent(detail.getProductId(), k -> new ArrayList<>()).add(detail);
|
||||
@@ -373,6 +378,10 @@ public class OrderInfoServiceImpl extends ServiceImpl<OrderInfoMapper, OrderInfo
|
||||
orderDetail.setUnitPrice(orderDetail.getPrice());
|
||||
}
|
||||
}
|
||||
if (isAllPack) {
|
||||
orderDetail.setPackNumber(orderDetail.getNum());
|
||||
}
|
||||
packAmount.setPrice(packAmount.getPrice().add(orderDetail.getPackAmount().multiply(orderDetail.getPackNumber())));
|
||||
if (couponNum.compareTo(BigDecimal.ZERO) > 0) {
|
||||
if (couponNum.compareTo(orderDetail.getNum()) >= 0) {
|
||||
orderDetail.setCouponNum(orderDetail.getNum());
|
||||
@@ -457,7 +466,8 @@ public class OrderInfoServiceImpl extends ServiceImpl<OrderInfoMapper, OrderInfo
|
||||
upOrderInfo(orderInfo, new BigDecimal(czgCallBackDto.getAmount() / 100L),
|
||||
DateUtil.parseLocalDateTime(czgCallBackDto.getPayTime()), payment.getId(), null);
|
||||
redisService.del(RedisCst.classKeyExpired.EXPIRED_ORDER + orderInfo.getId());
|
||||
} else if ("memberIn".equals(payment.getPayType())) {
|
||||
} else if ("memberIn".equals(payment.getPayType()) || "free".equals(payment.getPayType())) {
|
||||
boolean isFree = "free".equals(payment.getPayType());
|
||||
ShopUser shopUser = shopUserService.getById(payment.getSourceId());
|
||||
if (shopUser == null) {
|
||||
log.error("会员充值失败,会员不存在,会员id:{}", payment.getSourceId());
|
||||
@@ -481,11 +491,24 @@ public class OrderInfoServiceImpl extends ServiceImpl<OrderInfoMapper, OrderInfo
|
||||
} else {
|
||||
shopUserMoneyEditDTO.setBizEnum(ShopUserFlowBizEnum.CASH_IN);
|
||||
}
|
||||
if (isFree) {
|
||||
if (StrUtil.isBlank(czgCallBackDto.getExtParam())) {
|
||||
throw new ValidateException("霸王餐支付,订单号处理失败");
|
||||
}
|
||||
shopUserMoneyEditDTO.setBizEnum(ShopUserFlowBizEnum.FREE_IN);
|
||||
updateChain().eq(OrderInfo::getId, czgCallBackDto.getExtParam())
|
||||
.set(OrderInfo::getStatus, OrderStatusEnums.DONE.getCode())
|
||||
.set(OrderInfo::getIsFreeDine, 1)
|
||||
.set(OrderInfo::getPayAmount, 0)
|
||||
.update();
|
||||
}
|
||||
//更新会员余额 并生成流水
|
||||
Long flowId = shopUserService.updateMoney(shopUser.getShopId(), shopUserMoneyEditDTO);
|
||||
//会员活动
|
||||
activateService.giveActivate(shopUser,
|
||||
new BigDecimal(czgCallBackDto.getAmount() / 100L), flowId);
|
||||
if (!isFree) {
|
||||
//会员活动
|
||||
activateService.giveActivate(shopUser,
|
||||
new BigDecimal(czgCallBackDto.getAmount() / 100L), flowId);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@@ -13,6 +13,7 @@ import com.czg.entity.req.*;
|
||||
import com.czg.entity.resp.*;
|
||||
import com.czg.enums.ShopUserFlowBizEnum;
|
||||
import com.czg.exception.PaySuccessException;
|
||||
import com.czg.order.dto.BigDecimalDTO;
|
||||
import com.czg.order.dto.CheckOrderPay;
|
||||
import com.czg.order.dto.OrderInfoRefundDTO;
|
||||
import com.czg.order.entity.OrderDetail;
|
||||
@@ -100,6 +101,32 @@ public class PayServiceImpl implements PayService {
|
||||
return orderInfo;
|
||||
}
|
||||
|
||||
/**
|
||||
* 会员充值 校验
|
||||
*
|
||||
* @return 是否是霸王餐充值
|
||||
*/
|
||||
private boolean checkPayVip(VipPayParamDTO payParam) {
|
||||
if (payParam.getOrderId() != null) {
|
||||
OrderInfo orderInfo = orderInfoService.getById(payParam.getOrderId());
|
||||
AssertUtil.isNull(orderInfo, "订单不存在");
|
||||
//获取商品信息 计算金额 需要传入优惠券 减去优惠券
|
||||
List<OrderDetail> orderDetails = orderDetailService.queryChain().eq(OrderDetail::getOrderId, orderInfo.getId()).select().list();
|
||||
//总商品支付金额 不包含打包费 用来计算后续
|
||||
BigDecimalDTO totalAmount = new BigDecimalDTO(BigDecimal.ZERO);
|
||||
//最终打包费
|
||||
BigDecimalDTO packAmount = new BigDecimalDTO(BigDecimal.ZERO);
|
||||
orderInfoService.processOrderDetails2(orderDetails, null, null, totalAmount, packAmount, payParam.isAllPack(), true);
|
||||
BigDecimal payAmount = (totalAmount.getPrice().add(packAmount.getPrice())).multiply(BigDecimal.TWO);
|
||||
if (payAmount.compareTo(payParam.getAmount()) != 0) {
|
||||
throw new ValidateException("霸王餐支付金额不正确");
|
||||
}
|
||||
orderDetailService.updateBatch(orderDetails);
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
@Transactional
|
||||
@@ -263,6 +290,7 @@ public class PayServiceImpl implements PayService {
|
||||
@Override
|
||||
@Transactional
|
||||
public CzgResult<Object> cashPayVip(VipPayParamDTO payParam) {
|
||||
boolean isFree = checkPayVip(payParam);
|
||||
ShopUser shopUser = shopUserService.getById(payParam.getShopUserId());
|
||||
AssertUtil.isNull(shopUser, "充值失败 该店铺用户不存在");
|
||||
ShopInfo shopInfo = shopInfoService.getById(payParam.getShopId());
|
||||
@@ -286,60 +314,78 @@ public class PayServiceImpl implements PayService {
|
||||
.remark("现金充值")
|
||||
.bizEnum(ShopUserFlowBizEnum.CASH_IN)
|
||||
.build();
|
||||
if (isFree) {
|
||||
shopUserMoneyEditDTO.setBizEnum(ShopUserFlowBizEnum.FREE_IN);
|
||||
orderInfoService.updateChain().eq(OrderInfo::getId, payParam.getOrderId())
|
||||
.set(OrderInfo::getStatus, OrderStatusEnums.DONE.getCode())
|
||||
.set(OrderInfo::getIsFreeDine, 1)
|
||||
.set(OrderInfo::getPayAmount, 0)
|
||||
.update();
|
||||
}
|
||||
//更新会员余额 并生成流水
|
||||
Long flowId = shopUserService.updateMoney(shopUser.getShopId(), shopUserMoneyEditDTO);
|
||||
//会员活动
|
||||
shopActivateService.giveActivate(shopUser, payParam.getAmount(), flowId);
|
||||
if (!isFree) {
|
||||
//会员活动
|
||||
shopActivateService.giveActivate(shopUser, payParam.getAmount(), flowId);
|
||||
}
|
||||
return CzgResult.success();
|
||||
}
|
||||
|
||||
@Override
|
||||
@Transactional
|
||||
public CzgResult<Map<String, Object>> jsPayVip(String clintIp, VipPayParamDTO payParam) {
|
||||
boolean isFree = checkPayVip(payParam);
|
||||
ShopUser shopUser = shopUserService.getById(payParam.getShopUserId());
|
||||
AssertUtil.isNull(shopUser, "充值失败 该店铺用户不存在");
|
||||
AssertUtil.isBlank(payParam.getOpenId(), "用户小程序ID不能为空");
|
||||
AssertUtil.isBlank(payParam.getPayType(), "支付方式不能为空");
|
||||
String payOrderNo = payParam.getPlatformType() + IdUtil.getSnowflakeNextId();
|
||||
initOrderPayment(new OrderPayment(payParam.getShopId(), shopUser.getId(), "memberIn", payOrderNo, "", payParam.getAmount()));
|
||||
initOrderPayment(new OrderPayment(payParam.getShopId(), shopUser.getId(), isFree ? "free" : "memberIn", payOrderNo, "", payParam.getAmount()));
|
||||
String extParam = payParam.getOrderId() == null ? "" : payParam.getOrderId().toString();
|
||||
return jsPay(payParam.getShopId(), payParam.getPayType(), new CzgJsPayReq(payOrderNo, payParam.getAmount().multiply(MONEY_RATE).longValue(),
|
||||
"会员充值", payParam.getOpenId(), clintIp, payParam.getReturnUrl(), payParam.getBuyerRemark(), ""));
|
||||
"会员充值", payParam.getOpenId(), clintIp, payParam.getReturnUrl(), payParam.getBuyerRemark(), extParam));
|
||||
}
|
||||
|
||||
@Override
|
||||
@Transactional
|
||||
public CzgResult<Map<String, Object>> ltPayVip(String clintIp, VipPayParamDTO payParam) {
|
||||
boolean isFree = checkPayVip(payParam);
|
||||
ShopUser shopUser = shopUserService.getById(payParam.getShopUserId());
|
||||
AssertUtil.isNull(shopUser, "充值失败 该店铺用户不存在");
|
||||
AssertUtil.isBlank(payParam.getOpenId(), "用户小程序ID不能为空");
|
||||
AssertUtil.isBlank(payParam.getPayType(), "支付方式不能为空");
|
||||
String payOrderNo = payParam.getPlatformType() + IdUtil.getSnowflakeNextId();
|
||||
initOrderPayment(new OrderPayment(payParam.getShopId(), shopUser.getId(), "memberIn", payOrderNo, "", payParam.getAmount()));
|
||||
initOrderPayment(new OrderPayment(payParam.getShopId(), shopUser.getId(), isFree ? "free" : "memberIn", payOrderNo, "", payParam.getAmount()));
|
||||
String extParam = payParam.getOrderId() == null ? "" : payParam.getOrderId().toString();
|
||||
return ltPay(payParam.getShopId(), payParam.getPayType(), new CzgLtPayReq(payOrderNo, payParam.getAmount().multiply(MONEY_RATE).longValue(),
|
||||
payParam.getPayType(), "会员充值", payParam.getOpenId(), clintIp, payParam.getReturnUrl(), payParam.getBuyerRemark(), ""));
|
||||
payParam.getPayType(), "会员充值", payParam.getOpenId(), clintIp, payParam.getReturnUrl(), payParam.getBuyerRemark(), extParam));
|
||||
}
|
||||
|
||||
@Override
|
||||
@Transactional
|
||||
public CzgResult<Map<String, Object>> scanPayVip(String clintIp, VipPayParamDTO payParam) {
|
||||
boolean isFree = checkPayVip(payParam);
|
||||
ShopUser shopUser = shopUserService.getById(payParam.getShopUserId());
|
||||
AssertUtil.isNull(shopUser, "充值失败 该店铺用户不存在");
|
||||
String payOrderNo = payParam.getPlatformType() + IdUtil.getSnowflakeNextId();
|
||||
initOrderPayment(new OrderPayment(payParam.getShopId(), shopUser.getId(), "memberIn", payOrderNo, "", payParam.getAmount()));
|
||||
initOrderPayment(new OrderPayment(payParam.getShopId(), shopUser.getId(), isFree ? "free" : "memberIn", payOrderNo, "", payParam.getAmount()));
|
||||
String extParam = payParam.getOrderId() == null ? "" : payParam.getOrderId().toString();
|
||||
return scanPay(payParam.getShopId(), new CzgScanPayReq(payOrderNo, payParam.getAmount().multiply(MONEY_RATE).longValue(),
|
||||
"会员充值", clintIp, payParam.getReturnUrl(), payParam.getBuyerRemark(), ""));
|
||||
"会员充值", clintIp, payParam.getReturnUrl(), payParam.getBuyerRemark(), extParam));
|
||||
}
|
||||
|
||||
@Override
|
||||
@Transactional
|
||||
public CzgResult<Map<String, Object>> microPayVip(VipPayParamDTO payParam) {
|
||||
boolean isFree = checkPayVip(payParam);
|
||||
AssertUtil.isBlank(payParam.getAuthCode(), "扫描码不能为空");
|
||||
ShopUser shopUser = shopUserService.getById(payParam.getShopUserId());
|
||||
AssertUtil.isNull(shopUser, "充值失败 该店铺用户不存在");
|
||||
String payOrderNo = payParam.getPlatformType() + IdUtil.getSnowflakeNextId();
|
||||
initOrderPayment(new OrderPayment(payParam.getShopId(), shopUser.getId(), "memberIn", payOrderNo, payParam.getAuthCode(), payParam.getAmount()));
|
||||
initOrderPayment(new OrderPayment(payParam.getShopId(), shopUser.getId(), isFree ? "free" : "memberIn", payOrderNo, payParam.getAuthCode(), payParam.getAmount()));
|
||||
String extParam = payParam.getOrderId() == null ? "" : payParam.getOrderId().toString();
|
||||
return microPay(payParam.getShopId(), new CzgMicroPayReq(payOrderNo, payParam.getAmount().multiply(MONEY_RATE).longValue(),
|
||||
"会员充值", payParam.getAuthCode(), payParam.getBuyerRemark(), ""));
|
||||
"会员充值", payParam.getAuthCode(), payParam.getBuyerRemark(), extParam));
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
Reference in New Issue
Block a user