From befbb28b2810ed108d2744bceee2bb9b3edaa9bc Mon Sep 17 00:00:00 2001
From: Administrator <15274802129@163.com>
Date: Sat, 13 Jun 2026 13:53:04 +0800
Subject: [PATCH] feat(mall): 添加USDT支付功能和相关服务
---
src/main/java/cc/mrbird/febs/mall/service/impl/ApiMallOrderInfoServiceImpl.java | 236 +++++++++++++++++++++-------------------------------------
1 files changed, 87 insertions(+), 149 deletions(-)
diff --git a/src/main/java/cc/mrbird/febs/mall/service/impl/ApiMallOrderInfoServiceImpl.java b/src/main/java/cc/mrbird/febs/mall/service/impl/ApiMallOrderInfoServiceImpl.java
index 4f5edc2..b7d279d 100644
--- a/src/main/java/cc/mrbird/febs/mall/service/impl/ApiMallOrderInfoServiceImpl.java
+++ b/src/main/java/cc/mrbird/febs/mall/service/impl/ApiMallOrderInfoServiceImpl.java
@@ -5,6 +5,7 @@
import cc.mrbird.febs.common.exception.FebsException;
import cc.mrbird.febs.common.properties.XcxProperties;
import cc.mrbird.febs.common.utils.*;
+import cc.mrbird.febs.mall.controller.dependentStation.constant.OrderConstants;
import cc.mrbird.febs.mall.conversion.MallGoodsCommentConversion;
import cc.mrbird.febs.mall.conversion.MallOrderInfoConversion;
import cc.mrbird.febs.mall.conversion.MallOrderRefundConversion;
@@ -71,6 +72,7 @@
private final RedisUtils redisUtils;
private final AgentProducer agentProducer;
+ private final ApiChatPayService apiChatPayService;
private final IPayService payService;
private final IXcxPayService iXcxPayService;
private final IMallAchieveService mallAchieveService;
@@ -93,18 +95,16 @@
@Transactional(rollbackFor = Exception.class)
public Long createOrder(AddOrderDto addOrderDto) {
Long memberId = LoginUserUtil.getLoginUser().getId();
- MallMember member = ValidateEntityUtils
- .ensureColumnReturnEntity(memberId, MallMember::getId, mallMemberMapper::selectOne, "用户不存在");
//订单范围内才允许下单
MallAddressInfo address = ValidateEntityUtils
- .ensureColumnReturnEntity(addOrderDto.getAddressId(), MallAddressInfo::getId, mallAddressInfoMapper::selectOne, "收货地址信息不存在");
+ .ensureColumnReturnEntity(addOrderDto.getAddressId(), MallAddressInfo::getId, mallAddressInfoMapper::selectOne, "Please fill in the address first");
String orderNo = MallUtils.getOrderNum();
MallOrderInfo orderInfo = new MallOrderInfo();
orderInfo.setOrderNo(orderNo);
orderInfo.setOrderTime(new Date());
- orderInfo.setMemberId(member.getId());
+ orderInfo.setMemberId(memberId);
orderInfo.setStatus(OrderStatusEnum.WAIT_PAY.getValue());
orderInfo.setRemark(addOrderDto.getRemark());
orderInfo.setOrderType(addOrderDto.getOrderType());
@@ -115,131 +115,54 @@
this.baseMapper.insert(orderInfo);
BigDecimal total = BigDecimal.ZERO;
- /**
- * 根据传入的优惠卷ID和商品明细集合计算出每个商品获取的实际支付金额
- */
- Map<Long, BigDecimal> couponAmountMap = new HashMap<>();
- MallMemberCoupon mallMemberCoupon = new MallMemberCoupon();
- if(ObjectUtil.isNotEmpty(addOrderDto.getMemberCouponId())){
- Long memberCouponId = addOrderDto.getMemberCouponId();
- mallMemberCoupon = mallMemberCouponMapper.selectById(memberCouponId);
- if(ObjectUtil.isEmpty(mallMemberCoupon)){
- throw new FebsException(mallMemberCoupon.getCouponName()+"无法使用");
- }
- Integer state = mallMemberCoupon.getState();
- if(1 != state){
- throw new FebsException(mallMemberCoupon.getCouponName()+"无法使用");
- }
- List<AddOrderItemDto> items = addOrderDto.getItems();
- couponAmountMap = getCouponAmountMap(memberCouponId, items);
- }
for (AddOrderItemDto item : addOrderDto.getItems()) {
- MallOrderItem orderItem = new MallOrderItem();
+ MallOrderItem orderItem = new MallOrderItem();
- // 积分商品提交订单
- if (addOrderDto.getOrderType() == 2) {
- MallGoods mallGoods = mallGoodsMapper.selectById(item.getSkuId());
- if (mallGoods.getStock() < item.getCnt()) {
- throw new FebsException(mallGoods.getGoodsName() + "库存不足");
- }
+ MallGoodsSku sku = mallGoodsSkuMapper.selectSkuInfoById(item.getSkuId());
+ if (sku == null) {
+ throw new FebsException("The product does not exist.");
+ }
- if (MallGoods.ISSALE_STATUS_DISABLED.equals(mallGoods.getIsSale())) {
- throw new FebsException(mallGoods.getGoodsName() + "已下架");
- }
+ if (sku.getStock() < item.getCnt()) {
+ throw new FebsException("Insufficient stock");
+ }
- BigDecimal amount = mallGoods.getScore().multiply(BigDecimal.valueOf(item.getCnt()));
- orderItem.setAmount(amount);
- orderItem.setCnt(item.getCnt());
- orderItem.setOrderId(orderInfo.getId());
- orderItem.setPrice(mallGoods.getScore());
- orderItem.setGoodsId(mallGoods.getId());
- orderItem.setGoodsName(mallGoods.getGoodsName());
- orderItem.setStyleName(mallGoods.getGoodsName());
- orderItem.setSkuName(mallGoods.getGoodsName());
- orderItem.setSkuImage(mallGoods.getThumb());
- orderItem.setState(1);
+ MallGoods mallGoods = mallGoodsMapper.selectById(sku.getGoodsId());
- if (addOrderDto.getType() == 1) {
- LambdaQueryWrapper<MallShoppingCart> delQuery = new LambdaQueryWrapper<>();
- delQuery.eq(MallShoppingCart::getGoodsId, item.getSkuId())
- .eq(MallShoppingCart::getMemberId, member.getId());
- mallShoppingCartMapper.delete(delQuery);
- }
- total = total.add(amount);
- } else {
- MallGoodsSku sku = mallGoodsSkuMapper.selectSkuInfoById(item.getSkuId());
- if (sku == null) {
- throw new FebsException("购买商品或sku不存在");
- }
+ if (MallGoods.ISSALE_STATUS_DISABLED.equals(mallGoods.getIsSale())) {
+ throw new FebsException("Discontinued");
+ }
+ //商品库存销量计算
+ Integer goodsResult = mallGoodsMapper.upDateStockAndVolumeByGoodsId(mallGoods.getId(), item.getCnt());
+ if(1 != goodsResult){
+ throw new FebsException("Discontinued");
+ }
- if (sku.getStock() < item.getCnt()) {
- throw new FebsException(sku.getSkuName() + "库存不足");
- }
+ BigDecimal amount = sku.getPresentPrice().multiply(BigDecimal.valueOf(item.getCnt()));
+ orderItem.setAmount(amount);
+ orderItem.setCnt(item.getCnt());
+ orderItem.setOrderId(orderInfo.getId());
+ orderItem.setPrice(sku.getPresentPrice());
+ orderItem.setGoodsId(sku.getGoodsId());
+ orderItem.setGoodsName(sku.getGoodsName());
+ orderItem.setSkuId(sku.getId());
+ orderItem.setState(1);
+ orderItem.setStyleName(sku.getStyleName());
+ orderItem.setSkuName(sku.getSkuName());
+ orderItem.setSkuImage(sku.getSkuImage());
+ orderItem.setIsNormal(mallGoods.getIsNormal());
+ orderItem.setCostPrice(sku.getCostPrice());
- MallGoods mallGoods = mallGoodsMapper.selectById(sku.getGoodsId());
- // 零撸专区购买
- if (new BigDecimal(mallGoods.getPresentPrice()).compareTo(BigDecimal.ZERO) == 0) {
- List<MallOrderItem> items = mallOrderItemMapper.selectItemByGoodsIdUnCancel(mallGoods.getId(), member.getId());
- if (CollUtil.isNotEmpty(items)) {
- throw new FebsException("无法重复领取同一个商品");
- }
- }
-
- if (MallGoods.ISSALE_STATUS_DISABLED.equals(mallGoods.getIsSale())) {
- throw new FebsException(mallGoods.getGoodsName() + "已下架");
- }
- //商品库存销量计算
- Integer goodsResult = mallGoodsMapper.upDateStockAndVolumeByGoodsId(mallGoods.getId(), item.getCnt());
- if(1 != goodsResult){
- throw new FebsException(mallGoods.getGoodsName() + "库存不足");
- }
-
- BigDecimal amount = sku.getPresentPrice().multiply(BigDecimal.valueOf(item.getCnt()));
- //是否使用优惠卷
- if(ObjectUtil.isNotEmpty(addOrderDto.getMemberCouponId())){
- Long memberCouponId = addOrderDto.getMemberCouponId();
- if(ObjectUtil.isNotEmpty(couponAmountMap.get(item.getSkuId()))){
- BigDecimal skuCouponAmount = couponAmountMap.get(item.getSkuId());//使用折扣卷后的应该支付的钱
- if(skuCouponAmount.compareTo(BigDecimal.ZERO) > 0){
- amount = skuCouponAmount;
- }
- orderItem.setMemberCouponId(memberCouponId);
- }
- }
- orderItem.setAmount(amount);
- orderItem.setCnt(item.getCnt());
- orderItem.setOrderId(orderInfo.getId());
- orderItem.setPrice(sku.getPresentPrice());
- orderItem.setGoodsId(sku.getGoodsId());
- orderItem.setGoodsName(sku.getGoodsName());
- orderItem.setSkuId(sku.getId());
- orderItem.setState(1);
- if(ObjectUtil.isNotEmpty(member.getReferrerId())){
- orderItem.setMemberInviteId(member.getReferrerId());
- }
- if(ObjectUtil.isNotEmpty(addOrderDto.getMemberInviteId())){
- orderItem.setMemberInviteId(addOrderDto.getMemberInviteId());
- }
-
- orderItem.setStyleName(sku.getStyleName());
- orderItem.setSkuName(sku.getSkuName());
- orderItem.setSkuImage(sku.getSkuImage());
- orderItem.setIsNormal(mallGoods.getIsNormal());
- orderItem.setCostPrice(sku.getCostPrice());
-
- total = total.add(amount);
- //规格的库存销量
- Integer skuResult = mallGoodsSkuMapper.upDateStockAndVolumeBySkuId(sku.getId(),item.getCnt());
- ValidateEntityUtils.ensureEqual(1,skuResult,sku.getSkuName() + "库存不足");
- if (addOrderDto.getType() == 1) {
- mallShoppingCartMapper.delBySkuId(sku.getId(), member.getId());
- }
- }
- mallOrderItemMapper.insert(orderItem);
+ total = total.add(amount);
+ //规格的库存销量
+ Integer skuResult = mallGoodsSkuMapper.upDateStockAndVolumeBySkuId(sku.getId(),item.getCnt());
+ ValidateEntityUtils.ensureEqual(1,skuResult,sku.getSkuName() + "Discontinued");
+ if (addOrderDto.getType() == 1) {
+ mallShoppingCartMapper.delBySkuId(sku.getId(), memberId);
+ }
+ mallOrderItemMapper.insert(orderItem);
}
- mallMemberCoupon.setState(2);
- mallMemberCouponMapper.updateById(mallMemberCoupon);
//运费
BigDecimal delivaryAmount = addOrderDto.getDeliveryAmount() == null ? BigDecimal.ZERO : addOrderDto.getDeliveryAmount();
orderInfo.setCarriage(delivaryAmount);
@@ -247,19 +170,15 @@
total = total.add(delivaryAmount);
orderInfo.setAmount(total);
orderInfo.setAddressId(address.getId());
- orderInfo.setName(address.getName());
+ orderInfo.setName(address.getFristName() + address.getName());
orderInfo.setPhone(address.getPhone());
- orderInfo.setIsHome(addOrderDto.getIsHome());
- if (StrUtil.isBlank(address.getLatitude())||StrUtil.isBlank(address.getLongitude())) {
- throw new FebsException("请添加地址");
- }
- orderInfo.setAddress(address.getProvince()+address.getCity()+address.getArea() + address.getAddress());
+ orderInfo.setAddress(address.getArea()+ address.getAddress()+address.getCity()+address.getProvince() + address.getCountry() );
orderInfo.setLatitude(address.getLatitude());
orderInfo.setLongitude(address.getLongitude());
this.baseMapper.updateById(orderInfo);
- //过期时间修改成24小时
- agentProducer.sendOrderCancelDelayMsg(orderInfo.getId(), 24 * 60 * 60 * 1000L);
+ //过期时间修改成30分钟
+ agentProducer.sendOrderCancelDelayMsg(orderInfo.getId(), 30 * 60 * 1000L);
return orderInfo.getId();
}
@@ -394,11 +313,11 @@
MallMember member = LoginUserUtil.getLoginUser();
MallOrderInfo orderInfo = this.baseMapper.selectOrderByMemberIdAndId(member.getId(), id);
if (orderInfo == null || AppContants.DEL_FLAG_Y == orderInfo.getDelFlag()) {
- throw new FebsException("订单不存在");
+ throw new FebsException("Order does not exist");
}
if (OrderStatusEnum.WAIT_PAY.getValue() != orderInfo.getStatus()) {
- throw new FebsException("订单不是待付款, 无法取消");
+ throw new FebsException("The order is not pending payment, so it cannot be canceled");
}
orderInfo.setStatus(OrderStatusEnum.CANCEL.getValue());
@@ -406,8 +325,6 @@
this.baseMapper.updateById(orderInfo);
if (orderInfo.getOrderType() == 2) {
-// mallMoneyFlowService.addMoneyFlow(member.getId(), orderInfo.getAmount(), MoneyFlowTypeEnum.REFUND.getValue(), orderInfo.getOrderNo(), FlowTypeEnum.PRIZE_SCORE.getValue());
-// memberWalletService.add(orderInfo.getAmount(), member.getId(), "prizeScore");
return;
}
@@ -416,22 +333,22 @@
for(MallOrderItem mallOrderItem : mallOrderItemList){
MallGoodsSku sku = mallGoodsSkuMapper.selectSkuInfoById(mallOrderItem.getSkuId());
if (sku == null) {
- throw new FebsException("购买商品或sku不存在");
+ throw new FebsException("The product does not exist.");
}
if (sku.getStock() < mallOrderItem.getCnt()) {
- throw new FebsException(sku.getSkuName() + "库存不足");
+ throw new FebsException("Insufficient stock");
}
MallGoods mallGoods = mallGoodsMapper.selectById(sku.getGoodsId());
Integer goodsResult = mallGoodsMapper.updateStockAndVolumeByGoodsId(mallGoods.getId(), mallOrderItem.getCnt());
if(1 != goodsResult){
- throw new FebsException(mallGoods.getGoodsName() + "库存不足");
+ throw new FebsException("Insufficient stock");
}
Integer skuResult = mallGoodsSkuMapper.updateStockAndVolumeBySkuId(sku.getId(),mallOrderItem.getCnt());
if(1 != skuResult){
- throw new FebsException(sku.getSkuName() + "库存不足");
+ throw new FebsException("Insufficient stock");
}
Long memberCouponId = mallOrderItem.getMemberCouponId();
MallMemberCoupon mallMemberCoupon = mallMemberCouponMapper.selectById(memberCouponId);
@@ -560,6 +477,36 @@
map.put("wxResultStr", wxResultStr);
return map;
+ }
+
+ /**
+ * 处理支付订单的请求
+ *
+ * @param payDto 包含支付订单所需信息的DTO
+ * @return 返回支付结果的AjaxResult对象
+ */
+ @Override
+ @Transactional
+ public FebsResponse payOrderByCoin(ApiOrderPayDto payDto) {
+ // 获取当前的用户
+ Long memberId = LoginUserUtil.getLoginUser().getId();
+ // 提取订单ID和支付类型
+ Long orderId = payDto.getOrderId();
+ Integer payType = payDto.getPayType();
+
+ // 验证订单是否存在
+
+ MallOrderInfo orderInfo =
+ ValidateEntityUtils.ensureColumnReturnEntity(orderId, MallOrderInfo::getId, this.baseMapper::selectOne, "Order does not exist");
+ ValidateEntityUtils.ensureEqual(memberId,orderInfo.getMemberId(),"Order does not exist");
+ ValidateEntityUtils.ensureEqual(OrderStatusEnum.WAIT_PAY.getValue(),orderInfo.getStatus(),"The order status is not pending payment");
+
+ // 根据支付类型调用相应的支付方法
+ if(OrderConstants.PAY_TYPE_USDT == payType){
+ return apiChatPayService.usPay(orderInfo);
+ }
+ // 如果支付类型不匹配或支付过程中出现异常,返回错误信息
+ return new FebsResponse().fail().message("Order exception, please contact us");
}
private String balancePay(MallOrderInfo orderInfo, String tradePwd, String field) {
@@ -991,32 +938,23 @@
@Override
public FebsResponse createOrderVerify(ApiCreateOrderVerifyDto apiCreateOrderVerifyDto) {
Long memberId = LoginUserUtil.getLoginUser().getId();
- MallMember member = memberMapper.selectById(memberId);
List<AddOrderItemDto> items = apiCreateOrderVerifyDto.getItems();
if(CollUtil.isEmpty(items)){
- return new FebsResponse().fail().message("请先挑选商品");
+ return new FebsResponse().fail().message("Please select the product first");
}
for (AddOrderItemDto item : apiCreateOrderVerifyDto.getItems()) {
MallGoodsSku sku = mallGoodsSkuMapper.selectSkuInfoById(item.getSkuId());
if (sku == null) {
- return new FebsResponse().fail().message("购买商品或sku不存在");
+ return new FebsResponse().fail().message("The product does not exist.");
}
if (sku.getStock() < item.getCnt()) {
- return new FebsResponse().fail().message(sku.getSkuName() + "库存不足");
+ return new FebsResponse().fail().message("Insufficient stock");
}
MallGoods mallGoods = mallGoodsMapper.selectById(sku.getGoodsId());
if (MallGoods.ISSALE_STATUS_DISABLED.equals(mallGoods.getIsSale())) {
- return new FebsResponse().fail().message(mallGoods.getGoodsName() + "已下架");
+ return new FebsResponse().fail().message("Discontinued");
}
- if(GoodsTypeEnum.HUO_DONG.getValue() == mallGoods.getIsNormal()){
- //活动商品判断是否在活动进行中
- MallActivity mallActivity = mallActivityMapper.selectById(mallGoods.getActivityId());
- if(mallActivity == null || mallActivity.getState() != 2){
- return new FebsResponse().fail().message("活动不在进行中");
- }
- }
-
}
return new FebsResponse().success();
--
Gitblit v1.9.1