消费返现

充值触发条件成为会员
霸王餐触发条件成为会员
This commit is contained in:
2025-12-25 17:18:46 +08:00
parent f374c335c4
commit c6102dd4b4
8 changed files with 80 additions and 119 deletions

View File

@@ -133,6 +133,7 @@ public class RabbitPublisher {
/**
* 订单商品状态消息
* type bc 广播
*/
public void sendOrderDetailStatusMsg(String shopId, String type) {
sendMsg(RabbitConstants.Queue.ORDER_DETAIL_STATUS_QUEUE, JSONObject.toJSONString(Map.of(

View File

@@ -30,5 +30,8 @@ public interface MkConsumeCashbackService extends IService<MkConsumeCashback> {
*/
void cashback(Long shopId, Long userId, BigDecimal amount, Long orderId, String orderNo);
/**
* 订单退款 删除返现
*/
void removeCashback(Long shopId, Long userId, Long orderId, String orderNo);
}

View File

@@ -22,13 +22,19 @@ import java.util.List;
public interface MkShopRechargeService extends IService<MkShopRecharge> {
MkShopRechargeVO detail(Long shopId);
MkShopRechargeVO detailApp(Long shopId);
Boolean edit(Long shopId, MkShopRechargeDTO shopRechargeDTO);
BigDecimal checkRecharge(Long mainShopId, @NotNull(message = "店铺不能为空") Long shopId, Long userId, Long rechargeDetailId, @DecimalMin("0.01") BigDecimal money);
void recharge(Long shopId, Long shopUserId, Long rechargeDetailId, BigDecimal amount, Long paymentId, String payType, ShopUserFlowBizEnum bizEnum);
/**
* 充值
* @param isNoJoin 是否没有执行 加入会员的方法
* 会员如果是条件开通 则 需要统计
*/
void recharge(Long shopId, Long shopUserId, Long rechargeDetailId, BigDecimal amount, Long paymentId, String payType, ShopUserFlowBizEnum bizEnum, boolean isNoJoin);
List<RechargeListVO> getList(long loginIdAsLong);

View File

@@ -194,16 +194,18 @@ public class MkConsumeCashbackServiceImpl extends ServiceImpl<MkConsumeCashbackM
.setMainShopId(record.getMainShopId())
.setShopId(shopId)
.setAmount(BigDecimal.ZERO)
.setCashbackAmount(record.getAmount().negate())
.setCashbackAmount(record.getCashbackAmount().negate())
.setUserId(userId)
.setShopUserId(record.getShopUserId());
consumeCashbackRecordService.save(mkConsumeCashbackRecord);
shopUserService.updateMoney(new ShopUserMoneyEditDTO().setId(record.getShopUserId()).setType(0)
shopUserService.updateMoney(new ShopUserMoneyEditDTO()
.setId(record.getShopUserId())
.setType(0)
.setRelationId(mkConsumeCashbackRecord.getId())
.setMoney(record.getAmount())
.setMoney(record.getCashbackAmount())
.setBizEnum(ShopUserFlowBizEnum.CASHBACK)
.setRemark(StrUtil.format("订单退款,扣除返现: {}", record.getAmount())));
log.info("订单退款扣除返现 订单ID:{}, 店铺用户id: {}, 扣除返现: {}", orderId, record.getShopUserId(), record.getAmount());
.setRemark(StrUtil.format("订单退款,扣除返现: {}", record.getCashbackAmount())));
log.info("订单退款扣除返现 订单ID:{}, 店铺用户id: {}, 扣除返现: {}", orderId, record.getShopUserId(), record.getCashbackAmount());
AcUserMsg msg = new AcUserMsg()
.setUserId(userId)
@@ -212,7 +214,7 @@ public class MkConsumeCashbackServiceImpl extends ServiceImpl<MkConsumeCashbackM
.setSourceType("order")
.setType("cash")
.setTitle("订单退款,消费返现扣除")
.setContent(StrUtil.format("返现扣除提醒: 订单退款扣除的{}元返现。订单编号:{}", record.getAmount(), orderNo));
.setContent(StrUtil.format("返现扣除提醒: 订单退款扣除的{}元返现。订单编号:{}", record.getCashbackAmount(), orderNo));
acUserMsgService.addUserMsg(msg);
}
}

View File

@@ -20,6 +20,7 @@ import com.czg.market.enums.PointsConstant;
import com.czg.market.service.*;
import com.czg.market.vo.*;
import com.czg.utils.AssertUtil;
import com.czg.utils.FunUtils;
import com.mybatisflex.core.query.QueryWrapper;
import com.mybatisflex.spring.service.impl.ServiceImpl;
import com.czg.market.entity.MkShopRecharge;
@@ -45,6 +46,8 @@ public class MkShopRechargeServiceImpl extends ServiceImpl<MkShopRechargeMapper,
@Resource
private MkShopRechargeDetailService shopRechargeDetailService;
@Resource
private TbMemberConfigService memberConfigService;
@Resource
private ShopCouponService shopCouponService;
@DubboReference
private ShopUserService shopUserService;
@@ -159,7 +162,8 @@ public class MkShopRechargeServiceImpl extends ServiceImpl<MkShopRechargeMapper,
}
@Override
public void recharge(Long shopId, Long shopUserId, Long rechargeDetailId, BigDecimal amount, Long paymentId, String payType, ShopUserFlowBizEnum bizEnum) {
public void recharge(Long shopId, Long shopUserId, Long rechargeDetailId, BigDecimal amount, Long paymentId,
String payType, ShopUserFlowBizEnum bizEnum, boolean isNoJoin) {
log.info("充值回调, 用户id: {}, 金额: {}, rechargeDetailId: {}", shopUserId, amount, rechargeDetailId);
ShopUser shopUser = shopUserService.getById(shopUserId);
ShopUserMoneyEditDTO shopUserMoneyEditDTO = new ShopUserMoneyEditDTO()
@@ -168,7 +172,6 @@ public class MkShopRechargeServiceImpl extends ServiceImpl<MkShopRechargeMapper,
.setBizEnum(bizEnum)
.setRelationId(paymentId);
// 标准充值
if (rechargeDetailId != null) {
MkShopRechargeDetail rechargeDetail = shopRechargeDetailService.getById(rechargeDetailId);
@@ -209,7 +212,9 @@ public class MkShopRechargeServiceImpl extends ServiceImpl<MkShopRechargeMapper,
shopUserMoneyEditDTO.setMoney(amount);
}
shopUserService.updateMoney(shopUserMoneyEditDTO);
if (isNoJoin) {
FunUtils.transactionSafeRun(() -> memberConfigService.joinMemberByCondition(shopId, shopUser.getUserId(), shopUser));
}
}
@Override

View File

@@ -11,7 +11,6 @@ import com.czg.account.entity.ShopUser;
import com.czg.account.service.ShopConfigService;
import com.czg.account.service.ShopInfoService;
import com.czg.account.service.ShopUserService;
import com.czg.account.service.UserInfoService;
import com.czg.constant.TableValueConstant;
import com.czg.constants.PayTypeConstants;
import com.czg.exception.CzgException;
@@ -60,8 +59,6 @@ public class TbMemberConfigServiceImpl extends ServiceImpl<TbMemberConfigMapper,
@Resource
private MemberLevelConfigService levelConfigService;
@DubboReference
private UserInfoService userInfoService;
@DubboReference
private ShopUserService shopUserService;
@Resource
private OrderInfoService orderInfoService;
@@ -345,13 +342,11 @@ public class TbMemberConfigServiceImpl extends ServiceImpl<TbMemberConfigMapper,
}
if (levelVO.getCycleRewardCouponList() != null && !levelVO.getCycleRewardCouponList().isEmpty()) {
levelVO.getCycleRewardCouponList().forEach(item -> {
levelVO.getCycleRewardCouponList().forEach(item ->
shopCouponRecordService.grant(shopUser.getMainShopId(), new MkRewardCouponDTO().setCouponId(item.getCoupon().getId())
.setNum(item.getNum())
.setUserId(shopUser.getUserId())
.setShopId(shopUser.getMainShopId()), "购买会员赠券");
});
.setShopId(shopUser.getMainShopId()), "购买会员赠券"));
}
}
@@ -425,7 +420,8 @@ public class TbMemberConfigServiceImpl extends ServiceImpl<TbMemberConfigMapper,
orderInfoService.getOneAs(query().select("IFNULL(sum(pay_amount), 0) as total_amount").eq(OrderInfo::getShopId, shopId).eq(OrderInfo::getUserId, shopUser.getUserId())
.eq(OrderInfo::getStatus, OrderStatusEnums.DONE.getCode()), BigDecimal.class)
.compareTo(new BigDecimal(item.getValue())) >= 0;
case "RECHARGE_AMOUNT" -> paymentService.getOneAs(query().select("IFNULL(sum(amount), 0) as total_amount")
case "RECHARGE_AMOUNT" ->
paymentService.getOneAs(query().select("IFNULL(sum(amount), 0) as total_amount")
.eq(OrderPayment::getShopId, shopId)
.eq(OrderPayment::getSourceType, PayTypeConstants.SourceType.MEMBER_IN)
.eq(OrderPayment::getPayType, PayTypeConstants.PayType.PAY)

View File

@@ -1088,87 +1088,34 @@ public class OrderInfoCustomServiceImpl implements OrderInfoCustomService {
.setRelationId(orderInfo.getId())
.setMoney(BigDecimal.valueOf(czgCallBackDto.getAmount()).divide(BigDecimal.valueOf(100), 2, RoundingMode.DOWN));
shopUserService.updateMoney(shopUserMoneyEditDTO);
OrderInfo orderInfo1 = new OrderInfo();
orderInfo1.setId(orderInfo.getId());
orderInfo1.setIsFreeDine(1);
orderInfo1.setStatus(OrderStatusEnums.DONE.getCode());
orderInfo1.setPayAmount(BigDecimal.ZERO);
orderInfo1.setPaidTime(LocalDateTime.now());
orderInfo1.setPayType(PayEnums.FREE_PAY.getValue());
orderInfoService.updateById(orderInfo1);
orderDetailService.updateOrderDetailStatus(orderInfo.getId(), OrderStatusEnums.DONE.getCode());
redisService.del(RedisCst.classKeyExpired.EXPIRED_ORDER + orderInfo.getId());
upOrderInfo(orderInfo, BigDecimal.ZERO,
LocalDateTime.now(), null, PayEnums.FREE_PAY);
}
} else {
shopRechargeService.recharge(payment.getShopId(), payment.getSourceId(), payment.getRelatedId(),
BigDecimal.valueOf(czgCallBackDto.getAmount()).divide(BigDecimal.valueOf(100), 2, RoundingMode.DOWN), payment.getId(), payment.getSourceType(), bizEnum);
//充值并支付 ↓
orderInfo = orderInfoService.getOne(new QueryWrapper()
.eq(OrderInfo::getPayOrderId, payment.getId())
.eq(OrderInfo::getPayType, PayEnums.VIP_PAY.getValue()));
if (orderInfo != null) {
OrderInfo upOrderInfo = new OrderInfo()
.setId(orderInfo.getId())
.setPayType(PayEnums.VIP_PAY.getValue())
.setPaidTime(LocalDateTime.now())
.setPayAmount(orderInfo.getOrderAmount())
.setStatus(OrderStatusEnums.DONE.getCode());
orderInfoService.updateById(upOrderInfo);
orderDetailService.updateOrderDetailStatus(orderInfo.getId(), OrderStatusEnums.DONE.getCode());
ShopUserMoneyEditDTO shopUserMoneyEditDTO = new ShopUserMoneyEditDTO()
.setId(shopUser.getId())
.setType(0)
.setBizEnum(ShopUserFlowBizEnum.ORDER_PAY)
.setRelationId(orderInfo.getId())
.setMoney(orderInfo.getOrderAmount());
shopUserService.updateMoney(shopUserMoneyEditDTO);
redisService.del(RedisCst.classKeyExpired.EXPIRED_ORDER + orderInfo.getId());
// 发放成长值
shopUser = shopUserService.getById(shopUser);
//充值
memberConfigService.deliver(shopUser,
TableValueConstant.MemberExpFlow.Type.RECHARGE,
BigDecimal.valueOf(czgCallBackDto.getAmount()).divide(BigDecimal.valueOf(100), 2, RoundingMode.DOWN), null, orderInfo.getId());
if (TransactionSynchronizationManager.isSynchronizationActive()) {
OrderInfo finalOrderInfo = orderInfo;
TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronization() {
@Override
public void afterCommit() {
// 事务成功提交后执行消息发送
String printParam = finalOrderInfo.getId() + "_" + (!"after-pay".equals(finalOrderInfo.getPayMode()) ? 1 : 0) + "_1";
rabbitPublisher.sendOrderPrintMsg(printParam, finalOrderInfo.getIsPrint() == 1);
// log.info("订单{}事务提交后,发送打印消息", orderId);
upOrderInfo(orderInfo, orderInfo.getOrderAmount(),
LocalDateTime.now(), null, PayEnums.VIP_PAY);
}
});
} else {
// 非事务环境下直接发送(兼容无事务场景)
String printParam = orderInfo.getId() + "_" + (!"after-pay".equals(orderInfo.getPayMode()) ? 1 : 0) + "_1";
rabbitPublisher.sendOrderPrintMsg(printParam, orderInfo.getIsPrint() == 1);
// log.info("非事务环境下,直接发送订单{}打印消息", orderId);
shopRechargeService.recharge(payment.getShopId(), payment.getSourceId(), payment.getRelatedId(),
BigDecimal.valueOf(czgCallBackDto.getAmount()).divide(BigDecimal.valueOf(100), 2, RoundingMode.DOWN),
payment.getId(), payment.getSourceType(), bizEnum, orderInfo == null);
}
}
}
}
// 分销奖励
// if (shopUser != null) {
// distributionUserService.distribute(payment.getId(), payment.getOrderNo(), payment.getAmount(), shopUser.getUserId(), payment.getShopId(), "recharge");
// }
// if (orderInfo != null) {
// distributionUserService.distribute(payment.getId(), payment.getOrderNo(), payment.getAmount(), orderInfo.getUserId(), payment.getShopId(), "recharge");
// }
} else if (PayTypeConstants.SourceType.MEMBER_PAY.equals(payment.getSourceType())) {
//购买会员
ShopUser shopUser = shopUserService.getById(payment.getSourceId());
memberConfigService.joinMember(payment.getShopId(), shopUser.getUserId(), payment.getRelatedId());
// 充值赠送积分
// memberConfigService.deliver(shopUser.getMainShopId(), shopUser.getUserId(), TableValueConstant.MemberExpFlow.Type.COST, payment.getAmount(), null, payment.getId());
// 分销员开通
} else if (PayTypeConstants.SourceType.DISTRIBUTION.equals(payment.getSourceType())) {
distributionUserService.open(payment.getSourceId(), payment.getAmount(), payment.getShopId(), payment.getId());
} else if (PayTypeConstants.SourceType.POINT.equals(payment.getSourceType())) {
@@ -1300,14 +1247,14 @@ public class OrderInfoCustomServiceImpl implements OrderInfoCustomService {
shopUserUseInfo(orderInfo, shopUser);
// 后续 赠送等功能 挂账支付不赠送
if (!orderInfo.getPayType().equals(PayEnums.CREDIT_PAY.getValue())) {
if (!orderInfo.getPayType().equals(PayEnums.FREE_PAY.getValue())) {
FunUtils.safeRunVoid(() -> consumerCouponService.receiveConsumerCoupon(shopUser.getSourceShopId(), orderInfo.getId(),
orderInfo.getPayAmount(), shopUser.getUserId(), shopUser.getId()), "订单{}消费赠券失败", orderInfo.getId());
FunUtils.safeRunVoid(() -> pointsConfigService.consumeAwardPoints(shopUser, orderInfo), "订单{}赠送积分失败", orderInfo.getId());
FunUtils.safeRunVoid(() -> consumeCashbackService.cashback(orderInfo.getShopId(), shopUser.getUserId(),
orderInfo.getPayAmount(), orderInfo.getId(), orderInfo.getOrderNo()), "订单{}消费返现失败", orderInfo.getId());
}
FunUtils.safeRunVoid(() -> {
if (shopUser.getIsVip().equals(0)) {
// 消费累计成为会员的情况

View File

@@ -425,15 +425,16 @@ public class PayServiceImpl implements PayService {
return CzgResult.failure("支付密码错误");
}
}
if (shopUser.getIsVip().equals(0)) {
//更新会员
ShopUser updateInfo = new ShopUser();
updateInfo.setIsVip(1);
updateInfo.setJoinTime(LocalDateTime.now());
updateInfo.setId(payParam.getShopUserId());
shopUserService.updateById(updateInfo);
}
shopRechargeService.recharge(shopUser.getMainShopId(), shopUser.getId(), payParam.getRechargeDetailId(), payParam.getAmount(), null, "cash", ShopUserFlowBizEnum.CASH_IN);
// if (shopUser.getIsVip().equals(0)) {
// //更新会员
// ShopUser updateInfo = new ShopUser();
// updateInfo.setIsVip(1);
// updateInfo.setJoinTime(LocalDateTime.now());
// updateInfo.setId(payParam.getShopUserId());
// shopUserService.updateById(updateInfo);
// }
shopRechargeService.recharge(shopUser.getMainShopId(), shopUser.getId(), payParam.getRechargeDetailId(),
payParam.getAmount(), null, "cash", ShopUserFlowBizEnum.CASH_IN, true);
return CzgResult.success();
}
@@ -825,7 +826,9 @@ public class PayServiceImpl implements PayService {
// 退款分销还原
FunUtils.safeRunVoid(() -> distributionUserService.refund(orderId, orderNo),
"订单id:{} 退款,分销处理失败", orderId);
if (userId != null) {
if (userId == null) {
return;
}
FunUtils.safeRunVoid(() -> consumerCouponService.removeConsumerCoupon(shopId, userId, orderId),
"订单id:{} 退款,消费赠券回撤处理失败", orderId);
FunUtils.safeRunVoid(() -> consumeCashbackService.removeCashback(shopId, userId, orderId, orderNo),
@@ -835,9 +838,7 @@ public class PayServiceImpl implements PayService {
mkPointsUserService.alterPoints(userId, null, shopId, PointsConstant.ADD,
pointsNum, orderId, StrUtil.format("订单退款返还{}积分", pointsNum));
}
},
"订单id:{} 退款,积分返还处理失败", orderId);
}
}, "订单id:{} 退款,积分返还处理失败", orderId);
}
@Override