霸王餐 充值

This commit is contained in:
wangw 2025-03-03 18:00:50 +08:00
parent b9cd922bbb
commit 575bd686e2
8 changed files with 122 additions and 25 deletions

View File

@ -30,6 +30,10 @@ public class CheckOrderPay implements Serializable {
private Long userId;
private Integer vipPrice;
/**
* 是否整单打包
*/
private Integer allPack;
/**
* 用餐人数
@ -124,4 +128,8 @@ public class CheckOrderPay implements Serializable {
public boolean isVipPrice() {
return vipPrice != null && vipPrice == 1;
}
public boolean isAllPack() {
return allPack != null && allPack == 1;
}
}

View File

@ -43,7 +43,7 @@ public class OrderPayment implements Serializable {
private Long sourceId;
/**
* 支付方式order,refund, memberIn,memberRefund
* 支付方式order,refund, memberIn,memberRefund, free
*/
private String payType;

View File

@ -1,9 +1,11 @@
package com.czg.order.service;
import com.alibaba.fastjson2.JSONObject;
import com.czg.order.dto.BigDecimalDTO;
import com.czg.order.dto.CheckOrderPay;
import com.czg.order.dto.OrderInfoAddDTO;
import com.czg.order.dto.OrderInfoQueryDTO;
import com.czg.order.entity.OrderDetail;
import com.czg.order.entity.OrderInfo;
import com.czg.order.enums.PayEnums;
import com.czg.order.vo.HistoryOrderVo;
@ -15,6 +17,8 @@ import org.jetbrains.annotations.NotNull;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.List;
import java.util.Map;
/**
* 订单表 服务层
@ -42,6 +46,8 @@ public interface OrderInfoService extends IService<OrderInfo> {
OrderInfo createPayOrder(Long shopId, BigDecimal amount, String remark);
void processOrderDetails2(List<OrderDetail> orderDetails, Map<Long, Integer> prodCouponMap,
BigDecimalDTO prodCouponAmount, BigDecimalDTO totalAmount, BigDecimalDTO packAmount,
boolean isAllPack, boolean isVipPrice);
}

View File

@ -10,6 +10,7 @@ import lombok.Getter;
public enum ShopUserFlowBizEnum {
// 会员充值
CASH_IN("cashIn", "会员充值"),
FREE_IN("freeIn", "霸王餐充值"),
// 重置奖励
AWARD_IN("awardIn", "充值奖励"),
// 微信小程序充值

View File

@ -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;
}
}

View File

@ -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);
}
}
}

View File

@ -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