店铺会员相关

This commit is contained in:
张松
2025-09-11 15:55:32 +08:00
parent e9fa387e02
commit 37be357a4f
32 changed files with 1649 additions and 5 deletions

View File

@@ -0,0 +1,35 @@
package com.czg.service.order.dto;
import jakarta.validation.constraints.NotNull;
import lombok.Data;
import java.math.BigDecimal;
/**
* 支付接收参数 实体类
*
* @author ww
* @description
*/
@Data
public class VipMemberPayParamDTO {
@NotNull(message = "店铺不能为空")
private Long shopId;
@NotNull(message = "用户ID不能为空")
private Long shopUserId;
@NotNull(message = "会员订单id不能为空")
private Long memberOrderId;
/**
* 平台类型 pc 收银机客户端 wechat 微信小程序 alipay 支付宝小程序 admin-pc PC管理端 admin-app APP管理端
*/
private String platformType;
private String payType;
private String openId;
/**
* 扫码支付 扫描码
*/
private String authCode;
private String pwd;
private String returnUrl;
private String buyerRemark;
}

View File

@@ -0,0 +1,14 @@
package com.czg.service.order.mapper;
import com.mybatisflex.core.BaseMapper;
import com.czg.order.entity.MemberOrder;
/**
* 会员充值订单 映射层。
*
* @author zs
* @since 2025-09-11
*/
public interface MemberOrderMapper extends BaseMapper<MemberOrder> {
}

View File

@@ -5,6 +5,7 @@ import com.czg.entity.resp.CzgRefundResp;
import com.czg.order.dto.OrderInfoRefundDTO;
import com.czg.resp.CzgResult;
import com.czg.service.order.dto.OrderPayParamDTO;
import com.czg.service.order.dto.VipMemberPayParamDTO;
import com.czg.service.order.dto.VipPayParamDTO;
import com.czg.service.order.dto.VipRefundDTO;
import lombok.NonNull;
@@ -119,4 +120,6 @@ public interface PayService {
* @param refundOrderId 平台退款订单号 二选一
*/
CzgResult<CzgRefundResp> queryRefund(Long shopId, String mchRefundNo, String refundOrderId);
CzgResult<Map<String, Object>> ltPayMember(String clientIP, VipMemberPayParamDTO payParam);
}

View File

@@ -0,0 +1,84 @@
package com.czg.service.order.service.impl;
import cn.hutool.core.util.IdUtil;
import com.alibaba.fastjson2.JSONObject;
import com.czg.account.dto.MemberConfigDTO;
import com.czg.account.entity.ShopInfo;
import com.czg.account.entity.UserInfo;
import com.czg.account.service.ShopInfoService;
import com.czg.account.service.ShopUserService;
import com.czg.account.service.TbMemberConfigService;
import com.czg.account.service.UserInfoService;
import com.czg.account.vo.MemberConfigVO;
import com.czg.exception.CzgException;
import com.czg.order.dto.MemberOrderDTO;
import com.czg.service.order.enums.OrderStatusEnums;
import com.czg.utils.AssertUtil;
import com.mybatisflex.spring.service.impl.ServiceImpl;
import com.czg.order.entity.MemberOrder;
import com.czg.order.service.MemberOrderService;
import com.czg.service.order.mapper.MemberOrderMapper;
import org.apache.dubbo.config.annotation.DubboReference;
import org.springframework.stereotype.Service;
import java.math.BigDecimal;
/**
* 会员充值订单 服务层实现。
*
* @author zs
* @since 2025-09-11
*/
@Service
public class MemberOrderServiceImpl extends ServiceImpl<MemberOrderMapper, MemberOrder> implements MemberOrderService {
@DubboReference
private ShopInfoService shopInfoService;
@DubboReference
private UserInfoService userInfoService;
@DubboReference
private ShopUserService shopUserService;
@DubboReference
private TbMemberConfigService memberConfigService;
@Override
public MemberOrder createMemberOrder(MemberOrderDTO orderDTO) {
ShopInfo shopInfo = shopInfoService.getById(orderDTO.getShopId());
AssertUtil.isNull(shopInfo, "生成订单失败,店铺信息不存在");
if (orderDTO.getUserId() != null) {
UserInfo userInfo = userInfoService.getById(orderDTO.getUserId());
AssertUtil.isNull(userInfo, "生成订单失败,用户信息不存在");
}
MemberConfigVO memberConfigVO = memberConfigService.detail(shopInfo.getId());
if(memberConfigVO.getConfigList() == null || memberConfigVO.getConfigList().isEmpty()) {
throw new CzgException("会员开通方案未配置,请联系店铺");
}
MemberConfigDTO.ConfigList configItem = memberConfigVO.getConfigList().stream()
.filter(item -> item.getName().equals(orderDTO.getName()))
.findFirst()
.orElseThrow(() -> new CzgException("会员开通方案未配置,请联系店铺"));
//生成订单
MemberOrder orderInfo = new MemberOrder();
orderInfo.setOrderNo(orderDTO.getPlatformType() + IdUtil.getSnowflakeNextId());
orderInfo.setShopId(orderDTO.getShopId());
orderInfo.setPayAmount(BigDecimal.ZERO);
orderInfo.setStatus(OrderStatusEnums.UNPAID.getCode());
orderInfo.setAmount(configItem.getPrice().multiply(BigDecimal.valueOf(orderDTO.getNum())));
orderInfo.setPrice(configItem.getPrice());
orderInfo.setName(configItem.getName());
orderInfo.setUserId(orderDTO.getUserId());
orderInfo.setReward(configItem.getReward());
orderInfo.setCircleTime(configItem.getCircleTime());
if (configItem.getCouponList() != null && !configItem.getCouponList().isEmpty()) {
orderInfo.setCouponList(JSONObject.toJSONString(configItem.getCouponList()));
}
orderInfo.setNum(orderDTO.getNum());
save(orderInfo);
return orderInfo;
}
}

View File

@@ -4,6 +4,7 @@ import com.mybatisflex.spring.service.impl.ServiceImpl;
import com.czg.order.entity.OrderPayment;
import com.czg.order.service.OrderPaymentService;
import com.czg.service.order.mapper.OrderPaymentMapper;
import org.apache.dubbo.config.annotation.DubboService;
import org.springframework.stereotype.Service;
/**
@@ -12,7 +13,7 @@ import org.springframework.stereotype.Service;
* @author ww
* @since 2025-02-15
*/
@Service
@DubboService
public class OrderPaymentServiceImpl extends ServiceImpl<OrderPaymentMapper, OrderPayment> implements OrderPaymentService{
}

View File

@@ -20,19 +20,18 @@ 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.MemberOrder;
import com.czg.order.entity.OrderDetail;
import com.czg.order.entity.OrderInfo;
import com.czg.order.entity.OrderPayment;
import com.czg.order.enums.PayEnums;
import com.czg.order.service.CreditBuyerOrderService;
import com.czg.order.service.OrderDetailService;
import com.czg.order.service.OrderInfoService;
import com.czg.order.service.OrderPaymentService;
import com.czg.order.service.*;
import com.czg.resp.CzgRespCode;
import com.czg.resp.CzgResult;
import com.czg.service.CzgPayService;
import com.czg.service.RedisService;
import com.czg.service.order.dto.OrderPayParamDTO;
import com.czg.service.order.dto.VipMemberPayParamDTO;
import com.czg.service.order.dto.VipPayParamDTO;
import com.czg.service.order.dto.VipRefundDTO;
import com.czg.service.order.enums.OrderStatusEnums;
@@ -101,6 +100,8 @@ public class PayServiceImpl implements PayService {
private RedisService redisService;
@Resource
private RabbitPublisher rabbitPublisher;
@Resource
private MemberOrderService memberOrderService;
private final BigDecimal MONEY_RATE = new BigDecimal("100");
@@ -390,6 +391,21 @@ public class PayServiceImpl implements PayService {
"会员充值", payParam.getOpenId(), clintIp, payParam.getReturnUrl(), payParam.getBuyerRemark(), ""));
}
@Override
public CzgResult<Map<String, Object>> ltPayMember(String clientIP, VipMemberPayParamDTO payParam) {
MemberOrder memberOrder = memberOrderService.getOne(new QueryWrapper().eq(MemberOrder::getId, payParam.getMemberOrderId()));
AssertUtil.isNull(memberOrder, "充值会员失败 该会员订单不存在");
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(), "memberPay", payOrderNo,
"", memberOrder.getAmount(), payParam.getMemberOrderId()));
return ltPay(payParam.getShopId(), payParam.getPayType(), new CzgLtPayReq(payOrderNo, memberOrder.getAmount().multiply(MONEY_RATE).longValue(),
payParam.getPayType(), "会员充值", payParam.getOpenId(), clientIP, payParam.getReturnUrl(), payParam.getBuyerRemark(), ""));
}
@Override
@Transactional
public CzgResult<Map<String, Object>> ltPayVip(String clintIp, VipPayParamDTO payParam) {

View File

@@ -0,0 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.czg.service.order.mapper.MemberOrderMapper">
</mapper>