Ver código fonte

开发支付订单的接口

jinshihui 10 horas atrás
pai
commit
db98fbd5b8

+ 18 - 0
nightFragrance-admin/src/main/java/com/ylx/web/controller/massage/ProductOrderController.java

@@ -4,6 +4,7 @@ import com.alibaba.fastjson.JSON;
 import com.ylx.common.core.controller.BaseController;
 import com.ylx.common.core.domain.R;
 import com.ylx.massage.domain.dto.ProductOrderCreateRequest;
+import com.ylx.massage.domain.dto.ProductOrderPayRequest;
 import com.ylx.massage.service.IProductOrderInfoService;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -41,4 +42,21 @@ public class ProductOrderController extends BaseController {
             return R.fail(e.getMessage());
         }
     }
+
+    /**
+     * 支付订单
+     *
+     * @param request 订单创建请求
+     * @return R<String> 订单编号
+     */
+    @PostMapping("/pay")
+    public R payProductOrder(@RequestBody ProductOrderPayRequest productOrderPayRequest) {
+        try {
+            log.info("支付订单,请求参数的值:{}", JSON.toJSONString(productOrderPayRequest));
+            return productOrderInfoService.payOrder(productOrderPayRequest);
+        } catch (Exception e) {
+            log.error("订单支付失败:{}", e.getMessage(), e);
+            return R.fail(e.getMessage());
+        }
+    }
 }

+ 1 - 1
nightFragrance-admin/src/main/resources/application-dev.yml

@@ -207,7 +207,7 @@ wx:
   mch-id: 1716293620
   # 商户秘钥
   mch-key: 29138927a706e34282df802feacfc18r
-  # 异步回调地址
+  # 微信支付异步回调地址
   notify-url: https://48131076.r21.cpolar.top/wx/pay/payNotify
   # 异步退款回调地址
   refund-Notify: https://48131076.r21.cpolar.top/wx/pay/refundNotify

+ 5 - 4
nightFragrance-massage/src/main/java/com/ylx/massage/domain/ProductOrderInfo.java

@@ -3,6 +3,7 @@ package com.ylx.massage.domain;
 import com.baomidou.mybatisplus.annotation.*;
 import lombok.Data;
 import java.io.Serializable;
+import java.math.BigDecimal;
 import java.time.LocalDateTime;
 
 /**
@@ -63,22 +64,22 @@ public class ProductOrderInfo implements Serializable {
     /**
      * 商品总金额(分)
      */
-    private Integer totalAmount;
+    private BigDecimal totalAmount;
 
     /**
      * 优惠金额(分)
      */
-    private Integer discountAmount;
+    private BigDecimal discountAmount;
 
     /**
      * 运费(分)
      */
-    private Integer freightAmount;
+    private BigDecimal freightAmount;
 
     /**
      * 实付金额(分)= total_amount - discount_amount + freight_amount
      */
-    private Integer payAmount;
+    private BigDecimal payAmount;
 
     /**
      * 使用的优惠券ID

+ 5 - 4
nightFragrance-massage/src/main/java/com/ylx/massage/domain/ProductOrderItem.java

@@ -3,6 +3,7 @@ package com.ylx.massage.domain;
 import com.baomidou.mybatisplus.annotation.*;
 import lombok.Data;
 import java.io.Serializable;
+import java.math.BigDecimal;
 import java.time.LocalDateTime;
 
 /**
@@ -78,19 +79,19 @@ public class ProductOrderItem implements Serializable {
      * 总金额(分)= price × quantity
      */
     @TableField
-    private Integer totalAmount;
+    private BigDecimal totalAmount;
 
     /**
      * 优惠金额(分)
      */
     @TableField
-    private Integer discountAmount;
+    private BigDecimal discountAmount;
 
     /**
      * 实付金额(分)
      */
     @TableField
-    private Integer actualAmount;
+    private BigDecimal actualAmount;
 
     /**
      * 退款状态 (0无退款 1退款中 2已退款 3退款失败)
@@ -102,7 +103,7 @@ public class ProductOrderItem implements Serializable {
      * 退款金额(分)
      */
     @TableField
-    private Integer refundAmount;
+    private BigDecimal refundAmount;
 
     /**
      * 创建时间

+ 42 - 89
nightFragrance-massage/src/main/java/com/ylx/massage/domain/TConsumptionLog.java

@@ -22,35 +22,40 @@ import java.util.Date;
 @Data
 @ApiModel(value = "TConsumptionLog", description = "余额记录")
 public class TConsumptionLog extends Model<TConsumptionLog> {
-    //id
+
+    /**
+     * 主键ID
+     */
     @ApiModelProperty("id")
     private String id;
-    //金额
+
+    /**
+     * 金额
+     */
     @ApiModelProperty("金额")
     private BigDecimal amount;
-    //业务类型 1充值,2余额支付,3技师收益,4技师提现
 
     /**
      * 业务类型 1充值,2余额支付,3技师收益,4技师提现
      */
     @ApiModelProperty("业务类型 1充值,2余额支付,3技师收益,4技师提现")
     private Integer billType;
-    //业务单号
+
+    /**
+     * 业务单号
+     */
     @ApiModelProperty("业务单号")
     private String billNo;
-    //openId
+
+    /**
+     * openId
+     */
     @ApiModelProperty("openId")
     private String openId;
 
-    //部门id
-    @ApiModelProperty("部门id")
-    private String deptId;
-
-    //deptName
-    @ApiModelProperty("deptName")
-    private String deptName;
-
-    //是否可提0否1是
+    /**
+     * 是否可提0否1是
+     */
     @ApiModelProperty("是否可提0否1是")
     private Integer isGet;
 
@@ -60,90 +65,38 @@ public class TConsumptionLog extends Model<TConsumptionLog> {
     @ApiModelProperty("备注")
     private String note;
 
-    //系统创建时间
+    /**
+     * 部门id
+     */
+    @ApiModelProperty("部门id")
+    private String deptId;
+
+    /**
+     * 部门名称
+     */
+    @ApiModelProperty("部门名称")
+    private String deptName;
+
+    /**
+     * 系统创建时间
+     */
     @ApiModelProperty("系统创建时间")
     private Date createTime;
-    //系统修改时间
+
+    /**
+     * 系统修改时间
+     */
     @ApiModelProperty("系统修改时间")
     private Date updateTime;
-    //是否删除0否1是
+
+    /**
+     * 是否删除0否1是
+     */
     @TableLogic
     @ApiModelProperty("是否删除0否1是")
     private Integer isDelete;
 
 
-    public String getId() {
-        return id;
-    }
-
-    public void setId(String id) {
-        this.id = id;
-    }
-
-    public BigDecimal getAmount() {
-        return amount;
-    }
-
-    public void setAmount(BigDecimal amount) {
-        this.amount = amount;
-    }
-
-    public Integer getBillType() {
-        return billType;
-    }
-
-    public void setBillType(Integer billType) {
-        this.billType = billType;
-    }
-
-    public String getBillNo() {
-        return billNo;
-    }
-
-    public void setBillNo(String billNo) {
-        this.billNo = billNo;
-    }
-
-    public String getOpenId() {
-        return openId;
-    }
-
-    public void setOpenId(String openId) {
-        this.openId = openId;
-    }
-
-    public String getNote() {
-        return note;
-    }
-
-    public void setNote(String note) {
-        this.note = note;
-    }
-
-    public Date getCreateTime() {
-        return createTime;
-    }
-
-    public void setCreateTime(Date createTime) {
-        this.createTime = createTime;
-    }
-
-    public Date getUpdateTime() {
-        return updateTime;
-    }
-
-    public void setUpdateTime(Date updateTime) {
-        this.updateTime = updateTime;
-    }
-
-    public Integer getIsDelete() {
-        return isDelete;
-    }
-
-    public void setIsDelete(Integer isDelete) {
-        this.isDelete = isDelete;
-    }
-
     /**
      * 获取主键值
      *

+ 4 - 3
nightFragrance-massage/src/main/java/com/ylx/massage/domain/dto/ProductOrderCreateRequest.java

@@ -3,6 +3,7 @@ package com.ylx.massage.domain.dto;
 import lombok.Data;
 
 import java.io.Serializable;
+import java.math.BigDecimal;
 import java.util.List;
 
 /**
@@ -61,17 +62,17 @@ public class ProductOrderCreateRequest implements Serializable {
     /**
      * 运费(分)
      */
-    private Integer freightAmount;
+    private BigDecimal freightAmount;
 
     /**
      * 总金额(分)
      */
-    private Integer totalAmount;
+    private BigDecimal totalAmount;
 
     /**
      * 支付金额(分)
      */
-    private Integer payAmount;
+    private BigDecimal payAmount;
 
     /**
      * 使用的积分

+ 32 - 0
nightFragrance-massage/src/main/java/com/ylx/massage/domain/dto/ProductOrderPayRequest.java

@@ -0,0 +1,32 @@
+package com.ylx.massage.domain.dto;
+
+import lombok.Data;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.List;
+
+/**
+ * 商品订单创建请求DTO
+ */
+@Data
+public class ProductOrderPayRequest implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 订单编号
+     */
+    private String orderNo;
+
+    /**
+     * 支付方式:1微信支付 2:余额支付
+     */
+    private Integer payType;
+
+    /**
+     * 订单总金额
+     */
+    private BigDecimal totalPrice;
+
+}

+ 106 - 0
nightFragrance-massage/src/main/java/com/ylx/massage/enums/ProductOrderStatusEnum.java

@@ -0,0 +1,106 @@
+package com.ylx.massage.enums;
+
+import com.ylx.common.utils.StringUtils;
+import lombok.Getter;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * 商品订单状态枚举
+ */
+@Getter
+public enum ProductOrderStatusEnum {
+
+    /**
+     * 待付款
+     */
+    WAIT_PAY(0, "待付款"),
+
+    /**
+     * 待发货
+     */
+    WAIT_DELIVERY(1, "待发货"),
+
+    /**
+     * 已发货
+     */
+    DELIVERED(2, "已发货"),
+
+    /**
+     * 待收货
+     */
+    WAIT_RECEIVE(3, "待收货"),
+
+    /**
+     * 已收货
+     */
+    RECEIVED(4, "已收货"),
+
+    /**
+     * 换货待审核
+     */
+    EXCHANGE_PENDING(5, "换货待审核"),
+
+    /**
+     * 换货中
+     */
+    EXCHANGING(6, "换货中"),
+
+    /**
+     * 退货待审核
+     */
+    RETURN_PENDING(7, "退货待审核"),
+
+    /**
+     * 退货中
+     */
+    RETURNING(8, "退货中"),
+
+    /**
+     * 退款中
+     */
+    REFUNDING(9, "退款中"),
+
+    /**
+     * 退款完成
+     */
+    REFUND_COMPLETE(10, "退款完成");
+
+    private final Integer code;
+    private final String info;
+
+    ProductOrderStatusEnum(Integer code, String info) {
+        this.code = code;
+        this.info = info;
+    }
+
+    public static String getDescByCode(Integer code) {
+        if (code == null) {
+            return StringUtils.EMPTY;
+        }
+        for (ProductOrderStatusEnum value : ProductOrderStatusEnum.values()) {
+            if (value.getCode().equals(code)) {
+                return value.getInfo();
+            }
+        }
+        return StringUtils.EMPTY;
+    }
+
+    public static List<EnumProject> getStatusEnum() {
+        List<EnumProject> list = new ArrayList<>();
+        for (ProductOrderStatusEnum value : ProductOrderStatusEnum.values()) {
+            EnumProject enumProject = new EnumProject();
+            enumProject.setCode(value.getCode());
+            enumProject.setInfo(value.getInfo());
+            list.add(enumProject);
+        }
+        return list;
+    }
+
+    @lombok.Data
+    public static class EnumProject {
+        private Integer code;
+        private String info;
+    }
+}

+ 11 - 0
nightFragrance-massage/src/main/java/com/ylx/massage/service/IProductOrderInfoService.java

@@ -1,8 +1,11 @@
 package com.ylx.massage.service;
 
 import com.baomidou.mybatisplus.extension.service.IService;
+import com.ylx.common.core.domain.R;
 import com.ylx.massage.domain.ProductOrderInfo;
+import com.ylx.massage.domain.TOrder;
 import com.ylx.massage.domain.dto.ProductOrderCreateRequest;
+import com.ylx.massage.domain.dto.ProductOrderPayRequest;
 
 /**
  * 商品订单信息Service接口
@@ -16,4 +19,12 @@ public interface IProductOrderInfoService extends IService<ProductOrderInfo> {
      * @return 订单编号
      */
     String createProductOrder(ProductOrderCreateRequest request);
+
+    /**
+     * 支付订单
+     *
+     * @param productOrderPayRequest 订单支付请求
+     * @return R 支付结果
+     */
+    public R payOrder(ProductOrderPayRequest productOrderPayRequest) throws Exception;
 }

+ 119 - 9
nightFragrance-massage/src/main/java/com/ylx/massage/service/impl/ProductOrderInfoServiceImpl.java

@@ -1,23 +1,39 @@
 package com.ylx.massage.service.impl;
 
 import cn.hutool.json.JSONUtil;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
+import com.baomidou.mybatisplus.core.toolkit.StringUtils;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ylx.common.constant.MassageConstants;
+import com.ylx.common.core.domain.R;
 import com.ylx.common.exception.ServiceException;
-import com.ylx.massage.domain.Product;
-import com.ylx.massage.domain.ProductOrderInfo;
-import com.ylx.massage.domain.ProductOrderItem;
+import com.ylx.massage.domain.*;
 import com.ylx.massage.domain.dto.ProductOrderCreateRequest;
+import com.ylx.massage.domain.dto.ProductOrderPayRequest;
+import com.ylx.massage.enums.BillTypeEnum;
+import com.ylx.massage.enums.OrderStatusEnum;
+import com.ylx.massage.enums.ProductOrderStatusEnum;
 import com.ylx.massage.mapper.ProductMapper;
 import com.ylx.massage.mapper.ProductOrderInfoMapper;
 import com.ylx.massage.mapper.ProductOrderItemMapper;
 import com.ylx.massage.service.IProductOrderInfoService;
+import com.ylx.massage.service.TConsumptionLogService;
+import com.ylx.massage.service.TRechargeService;
+import com.ylx.massage.service.TWxUserService;
 import com.ylx.massage.utils.OrderNumberGenerator;
+import com.ylx.massage.utils.Sendvoice;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
+import javax.annotation.Resource;
+import java.math.BigDecimal;
 import java.time.LocalDateTime;
+import java.util.Date;
 
 /**
  * 商品订单信息Service实现类
@@ -38,6 +54,14 @@ public class ProductOrderInfoServiceImpl extends ServiceImpl<ProductOrderInfoMap
     @Autowired
     private ProductMapper productMapper;
 
+    @Resource
+    private TRechargeService rechargeService;
+
+    @Resource
+    private TWxUserService wxUserService;
+
+    @Resource
+    private TConsumptionLogService consumptionLogService;
 
 
     /**
@@ -111,10 +135,10 @@ public class ProductOrderInfoServiceImpl extends ServiceImpl<ProductOrderInfoMap
         if (request.getPayType() == null || (request.getPayType() != 1 && request.getPayType() != 2)) {
             throw new ServiceException("支付方式不正确");
         }
-        if (request.getTotalAmount() == null || request.getTotalAmount() < 0) {
+        if (request.getTotalAmount() == null || request.getTotalAmount().compareTo(BigDecimal.ZERO) < 0) {
             throw new ServiceException("总金额不能为空");
         }
-        if (request.getPayAmount() == null || request.getPayAmount() < 0) {
+        if (request.getPayAmount() == null || request.getPayAmount().compareTo(BigDecimal.ZERO) < 0) {
             throw new ServiceException("支付金额不能为空");
         }
     }
@@ -134,8 +158,8 @@ public class ProductOrderInfoServiceImpl extends ServiceImpl<ProductOrderInfoMap
         orderInfo.setPayStatus(0); // 未支付
         orderInfo.setPayType(request.getPayType());
         orderInfo.setTotalAmount(request.getTotalAmount());
-        orderInfo.setDiscountAmount(0); // 优惠金额暂无
-        orderInfo.setFreightAmount(request.getFreightAmount() != null ? request.getFreightAmount() : 0);
+        orderInfo.setDiscountAmount(BigDecimal.ZERO); // 优惠金额暂无
+        orderInfo.setFreightAmount(request.getFreightAmount() != null ? request.getFreightAmount() : BigDecimal.ZERO);
         orderInfo.setPayAmount(request.getPayAmount());
         orderInfo.setPointsUsed(request.getPointsUsed() != null ? request.getPointsUsed() : 0);
         orderInfo.setAddressId(request.getAddressId());
@@ -167,12 +191,98 @@ public class ProductOrderInfoServiceImpl extends ServiceImpl<ProductOrderInfoMap
         }
         orderItem.setSkuImage(request.getProductMainImage());
         // 单价 = 总金额 / 数量
-        orderItem.setPrice(request.getTotalAmount() / request.getQuantity());
+        orderItem.setPrice(request.getTotalAmount().intValue() / request.getQuantity());
         orderItem.setQuantity(request.getQuantity());
         orderItem.setTotalAmount(request.getTotalAmount());
-        orderItem.setDiscountAmount(0); // 优惠金额暂无
+        orderItem.setDiscountAmount(BigDecimal.ZERO); // 优惠金额暂无
         orderItem.setActualAmount(request.getPayAmount());
         orderItem.setRefundStatus(0); // 无退款
         return orderItem;
     }
+
+
+    @Override
+    public R payOrder(ProductOrderPayRequest productOrderPayRequest) throws Exception {
+        // 1、校验订单是否存在
+        LambdaQueryWrapper<ProductOrderInfo> lambdaQueryWrapper = new LambdaQueryWrapper<ProductOrderInfo>().eq(ProductOrderInfo::getOrderNo, productOrderPayRequest.getOrderNo());
+        ProductOrderInfo orderInfo = productOrderInfoMapper.selectOne(lambdaQueryWrapper);
+        if (orderInfo == null) {
+            throw new ServiceException("订单不存在");
+        }
+        // 2、校验订单状态是否为待付款
+        if (orderInfo.getOrderStatus() != 0) {
+            throw new ServiceException("订单状态错误");
+        }
+        // 3、校验支付金额是否正确
+        if (orderInfo.getTotalAmount().compareTo(productOrderPayRequest.getTotalPrice()) != 0) {
+            throw new ServiceException("支付金额错误");
+        }
+        // 4、校验支付方式是否正确
+        if (orderInfo.getPayType() != productOrderPayRequest.getPayType()) {
+            throw new ServiceException("支付方式错误");
+        }
+        //判断支付方式
+        if (productOrderPayRequest.getPayType().equals(MassageConstants.INTEGER_ONE)) {
+            //微信支付
+            R resp = rechargeService.getPay(orderInfo.getOrderNo(), orderInfo.getTotalAmount(), orderInfo.getOpenId(), BillTypeEnum.WX_PAY.getInfo(), BillTypeEnum.WX_PAY.getCode().toString());
+            return resp;
+        }else{
+            //余额支付
+            TWxUser user = wxUserService.getByOpenId(orderInfo.getOpenId());
+            if (null == user) {
+                throw new ServiceException("用户不存在");
+            }
+            if (user.getdBalance().compareTo(orderInfo.getTotalAmount()) < MassageConstants.INTEGER_ZERO) {
+                throw new ServiceException("账户金额不够请充值");
+            } else {
+                orderPayManage(user, orderInfo);
+                return R.ok();
+            }
+        }
+    }
+
+    /**
+     * 订单支付管理
+     *
+     * @param user
+     * @param orderInfo
+     */
+    @Transactional(rollbackFor = Exception.class)
+    public void orderPayManage(TWxUser user, ProductOrderInfo orderInfo) {
+        // 更新用户金额 及下单此时
+        TWxUser paramUser = new TWxUser();
+        paramUser.setcOpenid(user.getcOpenid());
+        // 余额支付
+        if (orderInfo.getPayType().equals(MassageConstants.INTEGER_TWO)) {
+            paramUser.setdBalance(user.getdBalance().subtract(orderInfo.getTotalAmount()));
+        }
+        paramUser.setdMoney(user.getdMoney().add(orderInfo.getTotalAmount()));
+        paramUser.setnNum(user.getnNum() + MassageConstants.INTEGER_ONE);
+        paramUser.setId(user.getId());
+        wxUserService.updateById(paramUser);
+        //增加消费记录
+        TConsumptionLog tConsumptionLog = new TConsumptionLog();
+        tConsumptionLog.setAmount(orderInfo.getTotalAmount().negate());
+        tConsumptionLog.setBillNo(orderInfo.getOrderNo());
+        tConsumptionLog.setOpenId(orderInfo.getOpenId());
+        if (orderInfo.getPayType().equals(MassageConstants.INTEGER_TWO)) {
+            tConsumptionLog.setBillType(BillTypeEnum.BALANCE_PAYMENT.getCode());
+            tConsumptionLog.setNote("余额支付");
+        } else if(orderInfo.getPayType().equals(MassageConstants.INTEGER_ONE)){
+            tConsumptionLog.setBillType(BillTypeEnum.WX_PAY.getCode());
+            tConsumptionLog.setNote("微信支付");
+        }
+
+        consumptionLogService.save(tConsumptionLog);
+
+        ProductOrderInfo productOrderInfo = new ProductOrderInfo();
+        productOrderInfo.setId(orderInfo.getId());
+        productOrderInfo.setPayType(orderInfo.getPayType());
+        productOrderInfo.setOpenId(orderInfo.getOpenId());
+        //更新订单状态为待发货
+        productOrderInfo.setOrderStatus(ProductOrderStatusEnum.WAIT_DELIVERY.getCode());
+        productOrderInfo.setPayTime(LocalDateTime.now());
+        //更新订单表
+        updateById(productOrderInfo);
+    }
 }

+ 4 - 0
nightFragrance-massage/src/main/java/com/ylx/massage/service/impl/TOrderServiceImpl.java

@@ -1274,6 +1274,10 @@ public class TOrderServiceImpl extends ServiceImpl<TOrderMapper, TOrder> impleme
         orderNotificationService.sendTechnicianReceivedNotification(orderNew);
     }
 
+    /**
+     * 更新技师状态
+     * @param orderNew
+     */
     private void updateJs(TOrder orderNew) {
         TJs js = jsService.getById(orderNew.getcJsId());
         if (js == null) {