Browse Source

订单修改

weifanli 2 years ago
parent
commit
ce984a4e1f
21 changed files with 525 additions and 230 deletions
  1. 29 5
      cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/controller/UserWithdrawalController.java
  2. 10 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/UserOrderDao.java
  3. 8 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/UserOrderDetailDao.java
  4. 62 16
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/req/OrderReq.java
  5. 19 65
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/UserOrder.java
  6. 76 10
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/UserOrderDetail.java
  7. 11 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/UserOrderPayment.java
  8. 44 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/enums/GoodTypeEnum.java
  9. 2 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/enums/OrderStatusEnum.java
  10. 5 5
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/sdk/PaymentSdk.java
  11. 10 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/UserOrderDetailService.java
  12. 3 2
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/VipCardService.java
  13. 7 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/UserOrderDetailServiceImpl.java
  14. 155 94
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/UserOrderServiceImpl.java
  15. 10 8
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/VipCardServiceImpl.java
  16. 22 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/UserOrderDetailVo.java
  17. 6 5
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/UserOrderVo.java
  18. 13 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/res/OrderCreateRes.java
  19. 25 2
      cooleshow-user/user-biz/src/main/resources/config/mybatis/UserOrderDetailMapper.xml
  20. 6 14
      cooleshow-user/user-biz/src/main/resources/config/mybatis/UserOrderMapper.xml
  21. 2 0
      cooleshow-user/user-biz/src/main/resources/config/mybatis/UserOrderPaymentMapper.xml

+ 29 - 5
cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/controller/UserWithdrawalController.java

@@ -2,11 +2,8 @@ package com.yonge.cooleshow.admin.controller;
 
 import com.baomidou.mybatisplus.core.metadata.IPage;
 
-import com.yonge.cooleshow.biz.dal.dto.excel.UserOrderExport;
 import com.yonge.cooleshow.biz.dal.dto.excel.UserWithdrawalExport;
-import com.yonge.cooleshow.biz.dal.dto.search.OrderSearch;
 import com.yonge.cooleshow.biz.dal.support.PageUtil;
-import com.yonge.cooleshow.biz.dal.vo.UserOrderVo;
 import com.yonge.cooleshow.common.controller.BaseController;
 import com.yonge.cooleshow.common.entity.HttpResponseResult;
 import com.yonge.cooleshow.common.page.PageInfo;
@@ -55,9 +52,9 @@ public class UserWithdrawalController extends BaseController {
     /**
      * 查询导出
      */
-    @PostMapping("/export")
+    @PostMapping("/exportExcel")
     @ApiOperation(value = "查询导出", notes = "传入TeacherWithdrawalSearch")
-    public void export(@RequestBody TeacherWithdrawalSearch query) {
+    public void exportExcel(@RequestBody TeacherWithdrawalSearch query) {
         List<UserWithdrawalVo> withdrawalVoList = userWithdrawalService.selectList(query);
         List<UserWithdrawalExport> list = new ArrayList<>();
         withdrawalVoList.forEach(o-> {
@@ -81,6 +78,33 @@ public class UserWithdrawalController extends BaseController {
     }
 
 
+    /**
+     * 查询导出
+     */
+    @PostMapping("/importExcel")
+    @ApiOperation(value = "查询导出", notes = "传入TeacherWithdrawalSearch")
+    public void importExcel(@RequestBody TeacherWithdrawalSearch query) {
+        List<UserWithdrawalVo> withdrawalVoList = userWithdrawalService.selectList(query);
+        List<UserWithdrawalExport> list = new ArrayList<>();
+        withdrawalVoList.forEach(o-> {
+            UserWithdrawalExport export = new UserWithdrawalExport();
+            try {
+                BeanUtils.copyProperties(export,o);
+                StringBuffer buffer = new StringBuffer(export.getId().toString());
+                buffer.append(export.getAmount());
+                buffer.append(export.getActualAmount());
+                String s = DigestUtils.md5DigestAsHex(buffer.toString().getBytes());
+                export.setSign(s);
+                list.add(export);
+            } catch (IllegalAccessException e) {
+                e.printStackTrace();
+            } catch (InvocationTargetException e) {
+                e.printStackTrace();
+            }
+        });
+        ExcelUtils.exportExcel(list, "提现列表数据" + System.currentTimeMillis(),
+                "列表数据");
+    }
 
     
 

+ 10 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/UserOrderDao.java

@@ -5,6 +5,7 @@ import java.util.List;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.yonge.cooleshow.biz.dal.entity.UserOrder;
+import com.yonge.cooleshow.biz.dal.enums.OrderStatusEnum;
 import org.apache.ibatis.annotations.Param;
 import com.yonge.cooleshow.biz.dal.vo.UserOrderVo;
 import com.yonge.cooleshow.biz.dal.dto.search.OrderSearch;
@@ -46,4 +47,13 @@ public interface UserOrderDao extends BaseMapper<UserOrder>{
 	 * @return: java.util.List<com.yonge.cooleshow.biz.dal.entity.UserOrder>
 	 */
 	List<UserOrderVo> selectPendingList();
+	/***
+	 * 修改订单状态
+	 * @author liweifan
+	 * @param: orderNo
+	 * @param: paying
+	 * @updateTime 2022/4/19 10:57
+	 * @return: java.lang.Integer
+	 */
+    Integer updateStatusByOrderNo(@Param("orderNo")String orderNo,@Param("orderStatus") String orderStatus);
 }

+ 8 - 1
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/UserOrderDetailDao.java

@@ -32,5 +32,12 @@ public interface UserOrderDetailDao extends BaseMapper<UserOrderDetail>{
      * @return: com.yonge.cooleshow.biz.dal.vo.OrderDetailVo
 	 */
 	List<UserOrderDetailVo> selectPage(@Param("page") IPage page, @Param("param") OrderDetailSearch orderDetail);
-
+	/***
+	 * 通过订单号查询订单详情
+	 * @author liweifan
+	 * @param: orderNo
+	 * @updateTime 2022/4/19 14:01
+	 * @return: java.util.List<com.yonge.cooleshow.biz.dal.vo.UserOrderDetailVo>
+	 */
+    List<UserOrderDetailVo> getOrderDetilListByOrderNo(@Param("orderNo")String orderNo);
 }

+ 62 - 16
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/req/OrderReq.java

@@ -1,5 +1,6 @@
 package com.yonge.cooleshow.biz.dal.dto.req;
 
+import com.yonge.cooleshow.biz.dal.enums.GoodTypeEnum;
 import com.yonge.cooleshow.biz.dal.enums.OrderTypeEnum;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
@@ -7,6 +8,7 @@ import io.swagger.annotations.ApiModelProperty;
 import javax.validation.constraints.NotBlank;
 import javax.validation.constraints.NotNull;
 import java.math.BigDecimal;
+import java.util.List;
 
 /**
  * 下单请求
@@ -21,17 +23,53 @@ public class OrderReq {
     @NotBlank(message = "订单名称不能为空")
     @ApiModelProperty(value = "订单名称 ", required = true)
     private String orderName;
-    @ApiModelProperty(value = "订单描述信息 ")
-    private String orderDesc;
     @NotNull(message = "订单类型不能为空")
     @ApiModelProperty(value = "订单类型:  VIP、开通会员  PRACTICE、陪练课购买  LIVE、直播课购买 VIDEO、视频课购买 MUSIC、单曲点播 ", required = true)
     private OrderTypeEnum orderType;
+    @ApiModelProperty(value = "订单描述信息 ")
+    private String orderDesc;
     @ApiModelProperty("用户备注 ")
     private String userNote;
-    @ApiModelProperty(value = "业务内容 订单业务内容json")
-    private String bizContent;
     @ApiModelProperty(value = "优惠券id")
     private Long couponId;
+    @ApiModelProperty(value = "订单金额", required = true)
+    private BigDecimal actualPrice;
+    @ApiModelProperty(value = "业务请求详情", required = true)
+    private List<OrderReqInfo> orderInfos;
+
+    @ApiModel(value = "OrderReqInfo", description = "下单请求业务详情对象")
+    public class OrderReqInfo {
+        private Long userId;
+        @NotNull(message = "商品类型不能为空")
+        @ApiModelProperty(value = "商品类型:  VIP、开通会员  PRACTICE、陪练课购买  LIVE、直播课购买 VIDEO、视频课购买 MUSIC、单曲点播 ", required = true)
+        private GoodTypeEnum goodType;
+        @ApiModelProperty(value = "业务内容 订单业务内容json")
+        private String bizContent;
+
+        public Long getUserId() {
+            return userId;
+        }
+
+        public void setUserId(Long userId) {
+            this.userId = userId;
+        }
+
+        public GoodTypeEnum getGoodType() {
+            return goodType;
+        }
+
+        public void setGoodType(GoodTypeEnum goodType) {
+            this.goodType = goodType;
+        }
+
+        public String getBizContent() {
+            return bizContent;
+        }
+
+        public void setBizContent(String bizContent) {
+            this.bizContent = bizContent;
+        }
+    }
 
     public Long getUserId() {
         return userId;
@@ -49,14 +87,6 @@ public class OrderReq {
         this.orderName = orderName;
     }
 
-    public String getOrderDesc() {
-        return orderDesc;
-    }
-
-    public void setOrderDesc(String orderDesc) {
-        this.orderDesc = orderDesc;
-    }
-
     public OrderTypeEnum getOrderType() {
         return orderType;
     }
@@ -65,12 +95,20 @@ public class OrderReq {
         this.orderType = orderType;
     }
 
-    public String getBizContent() {
-        return bizContent;
+    public String getOrderDesc() {
+        return orderDesc;
+    }
+
+    public void setOrderDesc(String orderDesc) {
+        this.orderDesc = orderDesc;
     }
 
-    public void setBizContent(String bizContent) {
-        this.bizContent = bizContent;
+    public List<OrderReqInfo> getOrderInfos() {
+        return orderInfos;
+    }
+
+    public void setOrderInfos(List<OrderReqInfo> orderInfos) {
+        this.orderInfos = orderInfos;
     }
 
     public String getUserNote() {
@@ -88,4 +126,12 @@ public class OrderReq {
     public void setCouponId(Long couponId) {
         this.couponId = couponId;
     }
+
+    public BigDecimal getActualPrice() {
+        return actualPrice;
+    }
+
+    public void setActualPrice(BigDecimal actualPrice) {
+        this.actualPrice = actualPrice;
+    }
 }

+ 19 - 65
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/UserOrder.java

@@ -32,12 +32,12 @@ public class UserOrder implements Serializable {
     @ApiModelProperty("买家id ")
     @TableField(value = "user_id_")
     private Long userId;
-    @ApiModelProperty("卖家id ")
-    @TableField(value = "merch_id_")
-    private Long merchId;
     @ApiModelProperty("订单名称 ")
     @TableField(value = "order_name_")
     private String orderName;
+    @ApiModelProperty("订单类型:  VIP、开通会员  PRACTICE、陪练课购买  LIVE、直播课购买 VIDEO、视频课购买 MUSIC、单曲点播")
+    @TableField(value = "order_type_")
+    private OrderTypeEnum orderType;
     @ApiModelProperty("订单描述信息 ")
     @TableField(value = "order_desc_")
     private String orderDesc;
@@ -59,18 +59,9 @@ public class UserOrder implements Serializable {
     @ApiModelProperty("平台服务费 ")
     @TableField(value = "plantform_fee_")
     private BigDecimal plantformFee;
-    @ApiModelProperty("平台服务费比例% ")
-    @TableField(value = "plantform_fee_rate_")
-    private BigDecimal plantformFeeRate;
-    @ApiModelProperty("退款金额 ")
-    @TableField(value = "refund_amount_")
-    private BigDecimal refundAmount;
     @ApiModelProperty("用户备注 ")
     @TableField(value = "user_note_")
     private String userNote;
-    @ApiModelProperty("订单类型:  VIP、开通会员  PRACTICE、陪练课购买  LIVE、直播课购买 VIDEO、视频课购买 MUSIC、单曲点播")
-    @TableField(value = "order_type_")
-    private OrderTypeEnum orderType;
     @ApiModelProperty("下单时间 ")
     @TableField(value = "create_time_")
     @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@@ -81,11 +72,6 @@ public class UserOrder implements Serializable {
     @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
     private Date payTime;
-    @ApiModelProperty("退款时间 ")
-    @TableField(value = "refund_time_")
-    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
-    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
-    private Date refundTime;
     @TableField(value = "update_time_")
     @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
@@ -115,14 +101,6 @@ public class UserOrder implements Serializable {
         this.userId = userId;
     }
 
-    public Long getMerchId() {
-        return merchId;
-    }
-
-    public void setMerchId(Long merchId) {
-        this.merchId = merchId;
-    }
-
     public String getOrderName() {
         return orderName;
     }
@@ -131,6 +109,14 @@ public class UserOrder implements Serializable {
         this.orderName = orderName;
     }
 
+    public OrderTypeEnum getOrderType() {
+        return orderType;
+    }
+
+    public void setOrderType(OrderTypeEnum orderType) {
+        this.orderType = orderType;
+    }
+
     public String getOrderDesc() {
         return orderDesc;
     }
@@ -139,6 +125,14 @@ public class UserOrder implements Serializable {
         this.orderDesc = orderDesc;
     }
 
+    public OrderStatusEnum getStatus() {
+        return status;
+    }
+
+    public void setStatus(OrderStatusEnum status) {
+        this.status = status;
+    }
+
     public BigDecimal getOriginalPrice() {
         return originalPrice;
     }
@@ -179,22 +173,6 @@ public class UserOrder implements Serializable {
         this.plantformFee = plantformFee;
     }
 
-    public BigDecimal getPlantformFeeRate() {
-        return plantformFeeRate;
-    }
-
-    public void setPlantformFeeRate(BigDecimal plantformFeeRate) {
-        this.plantformFeeRate = plantformFeeRate;
-    }
-
-    public BigDecimal getRefundAmount() {
-        return refundAmount;
-    }
-
-    public void setRefundAmount(BigDecimal refundAmount) {
-        this.refundAmount = refundAmount;
-    }
-
     public String getUserNote() {
         return userNote;
     }
@@ -219,14 +197,6 @@ public class UserOrder implements Serializable {
         this.payTime = payTime;
     }
 
-    public Date getRefundTime() {
-        return refundTime;
-    }
-
-    public void setRefundTime(Date refundTime) {
-        this.refundTime = refundTime;
-    }
-
     public Date getUpdateTime() {
         return updateTime;
     }
@@ -234,20 +204,4 @@ public class UserOrder implements Serializable {
     public void setUpdateTime(Date updateTime) {
         this.updateTime = updateTime;
     }
-
-    public OrderStatusEnum getStatus() {
-        return status;
-    }
-
-    public void setStatus(OrderStatusEnum status) {
-        this.status = status;
-    }
-
-    public OrderTypeEnum getOrderType() {
-        return orderType;
-    }
-
-    public void setOrderType(OrderTypeEnum orderType) {
-        this.orderType = orderType;
-    }
 }

+ 76 - 10
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/UserOrderDetail.java

@@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.annotation.IdType;
 import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
+import com.yonge.cooleshow.biz.dal.enums.GoodTypeEnum;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 
@@ -25,18 +26,36 @@ public class UserOrderDetail implements Serializable {
     @ApiModelProperty("订单号 ")
 	@TableField(value = "order_no_")
     private String orderNo;
+    @ApiModelProperty("卖家id ")
+    @TableField(value = "merch_id_")
+    private Long merchId;
+    @ApiModelProperty("订单类型:  VIP、开通会员  PRACTICE、陪练课购买  LIVE、直播课购买 VIDEO、视频课购买 MUSIC、单曲点播")
+    @TableField(value = "good_type_")
+    private GoodTypeEnum goodType;
     @ApiModelProperty("业务id ")
 	@TableField(value = "biz_id_")
     private Long bizId;
     @ApiModelProperty("业务内容 ")
 	@TableField(value = "biz_content_")
     private String bizContent;
+    @ApiModelProperty("原价 ")
+    @TableField(value = "original_price_")
+    private BigDecimal originalPrice;
+    @ApiModelProperty("预计价格 ")
+    @TableField(value = "expect_price_")
+    private BigDecimal expectPrice;
     @ApiModelProperty("商品数量 ")
     @TableField(value = "good_num_")
     private Integer goodNum;
     @ApiModelProperty("商品单价 ")
     @TableField(value = "good_price_")
     private BigDecimal goodPrice;
+    @ApiModelProperty("平台服务费 ")
+    @TableField(value = "plantform_fee_")
+    private BigDecimal plantformFee;
+    @ApiModelProperty("平台服务费比例% ")
+    @TableField(value = "plantform_fee_rate_")
+    private BigDecimal plantformFeeRate;
     @ApiModelProperty("下单时间 ")
 	@TableField(value = "create_time_")
     @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@@ -47,31 +66,47 @@ public class UserOrderDetail implements Serializable {
     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone="GMT+8")
     private Date updateTime;
 
-	public Long getId() {
+    public Long getId() {
         return id;
     }
 
     public void setId(Long id) {
         this.id = id;
     }
-    
-	public String getOrderNo() {
+
+    public String getOrderNo() {
         return orderNo;
     }
 
     public void setOrderNo(String orderNo) {
         this.orderNo = orderNo;
     }
-    
-	public Long getBizId() {
+
+    public Long getMerchId() {
+        return merchId;
+    }
+
+    public void setMerchId(Long merchId) {
+        this.merchId = merchId;
+    }
+
+    public GoodTypeEnum getGoodType() {
+        return goodType;
+    }
+
+    public void setGoodType(GoodTypeEnum goodType) {
+        this.goodType = goodType;
+    }
+
+    public Long getBizId() {
         return bizId;
     }
 
     public void setBizId(Long bizId) {
         this.bizId = bizId;
     }
-    
-	public String getBizContent() {
+
+    public String getBizContent() {
         return bizContent;
     }
 
@@ -79,6 +114,22 @@ public class UserOrderDetail implements Serializable {
         this.bizContent = bizContent;
     }
 
+    public BigDecimal getOriginalPrice() {
+        return originalPrice;
+    }
+
+    public void setOriginalPrice(BigDecimal originalPrice) {
+        this.originalPrice = originalPrice;
+    }
+
+    public BigDecimal getExpectPrice() {
+        return expectPrice;
+    }
+
+    public void setExpectPrice(BigDecimal expectPrice) {
+        this.expectPrice = expectPrice;
+    }
+
     public Integer getGoodNum() {
         return goodNum;
     }
@@ -95,6 +146,22 @@ public class UserOrderDetail implements Serializable {
         this.goodPrice = goodPrice;
     }
 
+    public BigDecimal getPlantformFee() {
+        return plantformFee;
+    }
+
+    public void setPlantformFee(BigDecimal plantformFee) {
+        this.plantformFee = plantformFee;
+    }
+
+    public BigDecimal getPlantformFeeRate() {
+        return plantformFeeRate;
+    }
+
+    public void setPlantformFeeRate(BigDecimal plantformFeeRate) {
+        this.plantformFeeRate = plantformFeeRate;
+    }
+
     public Date getCreateTime() {
         return createTime;
     }
@@ -102,13 +169,12 @@ public class UserOrderDetail implements Serializable {
     public void setCreateTime(Date createTime) {
         this.createTime = createTime;
     }
-    
-	public Date getUpdateTime() {
+
+    public Date getUpdateTime() {
         return updateTime;
     }
 
     public void setUpdateTime(Date updateTime) {
         this.updateTime = updateTime;
     }
-    
 }

+ 11 - 1
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/UserOrderPayment.java

@@ -45,12 +45,14 @@ public class UserOrderPayment implements Serializable {
     @ApiModelProperty("交易状态 pending 交易处理中 succeeded 交易成功 failed 交易失败")
     @TableField(value = "status_")
     private PayStatusEnum status;
+    @ApiModelProperty("失败信息 ")
+    @TableField(value = "pay_fail_msg_")
+    private String payFailMsg;
     @ApiModelProperty("到账时间 ")
 	@TableField(value = "arrival_time_")
     @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone="GMT+8")
     private Date arrivalTime;
-
     @ApiModelProperty("创建时间 ")
     @TableField(value = "create_time_")
     @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@@ -149,4 +151,12 @@ public class UserOrderPayment implements Serializable {
     public void setFeeAmt(BigDecimal feeAmt) {
         this.feeAmt = feeAmt;
     }
+
+    public String getPayFailMsg() {
+        return payFailMsg;
+    }
+
+    public void setPayFailMsg(String payFailMsg) {
+        this.payFailMsg = payFailMsg;
+    }
 }

+ 44 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/enums/GoodTypeEnum.java

@@ -0,0 +1,44 @@
+package com.yonge.cooleshow.biz.dal.enums;
+
+import com.baomidou.mybatisplus.annotation.EnumValue;
+import com.yonge.cooleshow.common.enums.BaseEnum;
+
+/**
+ * 商品类型
+ * @Author: liweifan
+ * @Data: 2022/3/31 14:59
+ */
+public enum GoodTypeEnum implements BaseEnum<String, GoodTypeEnum> {
+    VIP("VIP","开通会员"),
+    PRACTICE("PRACTICE","陪练课购买"),
+    LIVE("LIVE","直播课购买"),
+    VIDEO("VIDEO","视频课购买"),
+    MUSIC("MUSIC","单曲点播")
+    ;
+    @EnumValue
+    private String code;
+    private String msg;
+
+    GoodTypeEnum(String code, String msg) {
+        this.code = code;
+        this.msg = msg;
+    }
+
+    public void setCode(String code) {
+        this.code = code;
+    }
+
+    public String getMsg() {
+        return msg;
+    }
+
+    public void setMsg(String msg) {
+        this.msg = msg;
+    }
+
+    @Override
+    public String getCode() {
+        return this.code;
+    }
+
+}

+ 2 - 1
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/enums/OrderStatusEnum.java

@@ -12,7 +12,8 @@ public enum OrderStatusEnum implements BaseEnum<String, OrderStatusEnum> {
     WAIT_PAY("WAIT_PAY","待支付"),
     PAYING("PAYING","支付中"),
     PAID("PAID","已付款"),
-    CLOSE("CLOSE","已关闭")
+    CLOSE("CLOSE","已关闭"),
+    FAIL("FAIL","支付失败"),
     ;
     @EnumValue
     private String code;

+ 5 - 5
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/sdk/PaymentSdk.java

@@ -31,7 +31,7 @@ public class PaymentSdk {
      * @return 创建的支付对象
      * @throws Exception 异常
      */
-    public Map<String, Object> executePayment(PaymentReq paymentReq) {
+    public HttpResponseResult<Map<String, Object>> executePayment(PaymentReq paymentReq) {
         paymentReq.setApp_id(HuifuConfiguration.getHuifuProperties().getAppId());
         //创建分账对象
         Map<String, String> div_member = new HashMap<>();
@@ -48,18 +48,18 @@ public class PaymentSdk {
         try {
             res = Payment.create(paymentParams);
         } catch (BaseAdaPayException e) {
-            throw new ThirdpartyException(e.getMessage());
+            return HttpResponseResult.failed(e.getMessage());
         }
         if (null == res) {
-            throw new ThirdpartyException("请求失败");
+            return HttpResponseResult.failed("请求失败");
         }
         log.info("汇付[创建支付对象] Resp:{}", res);
         String errorCode = (String) res.get("error_code");
         if (null != errorCode) {
             String errorMsg = (String) res.get("error_msg");
-            throw new BizException(errorMsg);
+            return HttpResponseResult.failed(errorMsg);
         }
-        return res;
+        return HttpResponseResult.succeed(res);
     }
 
     /**

+ 10 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/UserOrderDetailService.java

@@ -6,6 +6,8 @@ import com.yonge.cooleshow.biz.dal.vo.UserOrderDetailVo;
 import com.yonge.cooleshow.biz.dal.dto.search.OrderDetailSearch;
 import com.yonge.cooleshow.biz.dal.entity.UserOrderDetail;
 
+import java.util.List;
+
 /**
  * 平台订单表 服务类
  * @author liweifan
@@ -25,6 +27,14 @@ public interface UserOrderDetailService extends IService<UserOrderDetail>  {
 	 * @date 2022-03-30
 	 */
 	UserOrderDetailVo detail(String orderNo);
+	/***
+	 * 通过订单号查询订单详情
+	 * @author liweifan
+	 * @param: orderNo
+	 * @updateTime 2022/4/19 14:00
+	 * @return: com.yonge.cooleshow.biz.dal.vo.UserOrderDetailVo
+	 */
+	List<UserOrderDetailVo> getOrderDetilListByOrderNo(String orderNo);
     /**
      * 分页查询
      * @author liweifan

+ 3 - 2
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/VipCardService.java

@@ -2,6 +2,7 @@ package com.yonge.cooleshow.biz.dal.service;
 
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.yonge.cooleshow.biz.dal.dto.req.OrderReq;
+import com.yonge.cooleshow.biz.dal.vo.UserOrderDetailVo;
 import com.yonge.cooleshow.biz.dal.vo.UserOrderVo;
 import com.yonge.cooleshow.biz.dal.vo.VipCardVo;
 import com.yonge.cooleshow.biz.dal.entity.VipCard;
@@ -37,12 +38,12 @@ public interface VipCardService extends IService<VipCard>  {
 	 * @updateTime 2022/3/31 15:47
 	 * @return: com.yonge.cooleshow.common.entity.HttpResponseResult<java.lang.Boolean>
 	 */
-	HttpResponseResult<OrderCreateRes> orderCreate(OrderReq orderReq);
+	HttpResponseResult<OrderCreateRes> orderCreate(OrderReq.OrderReqInfo orderReqInfo);
 	/***
 	 * 订单下单后操作
 	 * @author liweifan
 	 * @param: orderVo
 	 * @updateTime 2022/3/31 17:24
 	 */
-	void orderSuccess(UserOrderVo orderVo);
+	void orderSuccess(UserOrderDetailVo orderDetailVo);
 }

+ 7 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/UserOrderDetailServiceImpl.java

@@ -9,6 +9,8 @@ import com.yonge.cooleshow.biz.dal.dto.search.OrderDetailSearch;
 import com.yonge.cooleshow.biz.dal.dao.UserOrderDetailDao;
 import com.yonge.cooleshow.biz.dal.service.UserOrderDetailService;
 
+import java.util.List;
+
 
 @Service
 public class UserOrderDetailServiceImpl extends ServiceImpl<UserOrderDetailDao, UserOrderDetail> implements UserOrderDetailService {
@@ -26,6 +28,11 @@ public class UserOrderDetailServiceImpl extends ServiceImpl<UserOrderDetailDao,
     }
 
     @Override
+    public List<UserOrderDetailVo> getOrderDetilListByOrderNo(String orderNo) {
+        return baseMapper.getOrderDetilListByOrderNo(orderNo);
+    }
+
+    @Override
     public IPage<UserOrderDetailVo> selectPage(IPage<UserOrderDetailVo> page, OrderDetailSearch query){
         return page.setRecords(baseMapper.selectPage(page, query));
     }

+ 155 - 94
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/UserOrderServiceImpl.java

@@ -4,6 +4,7 @@ import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.yonge.cooleshow.biz.dal.config.HuifuConfiguration;
+import com.yonge.cooleshow.biz.dal.enums.*;
 import com.yonge.cooleshow.biz.dal.vo.UserOrderDetailVo;
 import com.yonge.cooleshow.common.constant.SysConfigConstant;
 import com.yonge.cooleshow.biz.dal.dto.req.OrderPayReq;
@@ -11,10 +12,6 @@ import com.yonge.cooleshow.biz.dal.dto.req.OrderReq;
 import com.yonge.cooleshow.biz.dal.entity.UserOrderDetail;
 import com.yonge.cooleshow.biz.dal.entity.UserOrder;
 import com.yonge.cooleshow.biz.dal.entity.UserOrderPayment;
-import com.yonge.cooleshow.biz.dal.enums.OrderStatusEnum;
-import com.yonge.cooleshow.biz.dal.enums.OrderTypeEnum;
-import com.yonge.cooleshow.biz.dal.enums.PayChannelEnum;
-import com.yonge.cooleshow.biz.dal.enums.PayStatusEnum;
 import com.yonge.cooleshow.biz.dal.sdk.PaymentSdk;
 import com.yonge.cooleshow.biz.dal.sdk.req.DeviceInfo;
 import com.yonge.cooleshow.biz.dal.sdk.req.PaymentReq;
@@ -59,26 +56,28 @@ public class UserOrderServiceImpl extends ServiceImpl<UserOrderDao, UserOrder> i
     private IdGeneratorService idGeneratorService;
 
     //验证订单是否可以下单
-    private static final Map<OrderTypeEnum, Function<OrderReq, HttpResponseResult<OrderCreateRes>>> orderCreate = new HashMap<>();
+    private static final Map<GoodTypeEnum, Function<OrderReq.OrderReqInfo, HttpResponseResult<OrderCreateRes>>> orderCreate = new HashMap<>();
     //插入订单后执行
-    private static final Map<OrderTypeEnum, Consumer<UserOrderVo>> orderAfter = new HashMap<>();
+    private static final Map<GoodTypeEnum, Consumer<UserOrderDetailVo>> orderAfter = new HashMap<>();
+
+
     //订单完成后执行
-    private static final Map<OrderTypeEnum, Consumer<UserOrderVo>> orderSuccess = new HashMap<>();
+    private static final Map<GoodTypeEnum, Consumer<UserOrderDetailVo>> orderSuccess = new HashMap<>();
     //订单取消后执行
-    private static final Map<OrderTypeEnum, Consumer<UserOrderVo>> orderCancel = new HashMap<>();
+    private static final Map<GoodTypeEnum, Consumer<UserOrderDetailVo>> orderCancel = new HashMap<>();
 
     @PostConstruct
     private void init() {
         /**********订单生成前******************/
         //vip开通缴费
-        orderCreate.put(OrderTypeEnum.VIP, vipCardService::orderCreate);
+        orderCreate.put(GoodTypeEnum.VIP, vipCardService::orderCreate);
 
         /**********订单生成后******************/
         //orderAfter.put(OrderTypeEnum.VIP, vipCardService::orderAfter);
 
         /**********订单完成后******************/
         //vip开通缴费
-        orderSuccess.put(OrderTypeEnum.VIP, vipCardService::orderSuccess);
+        orderSuccess.put(GoodTypeEnum.VIP, vipCardService::orderSuccess);
 
 
         /**********订单取消后******************/
@@ -89,7 +88,7 @@ public class UserOrderServiceImpl extends ServiceImpl<UserOrderDao, UserOrder> i
     public UserOrderVo detail(Long id) {
         UserOrderVo userOrderVo = baseMapper.detailById(id);
         if (null != userOrderVo) {
-            userOrderVo.setOrderDetail(orderDetailService.detail(userOrderVo.getOrderNo()));
+            userOrderVo.setOrderDetailList(orderDetailService.getOrderDetilListByOrderNo(userOrderVo.getOrderNo()));
         }
         return userOrderVo;
     }
@@ -98,7 +97,7 @@ public class UserOrderServiceImpl extends ServiceImpl<UserOrderDao, UserOrder> i
     public UserOrderVo detail(String orderNo) {
         UserOrderVo userOrderVo = baseMapper.detailByOrderNo(orderNo);
         if (null != userOrderVo) {
-            userOrderVo.setOrderDetail(orderDetailService.detail(userOrderVo.getOrderNo()));
+            userOrderVo.setOrderDetailList(orderDetailService.getOrderDetilListByOrderNo(userOrderVo.getOrderNo()));
         }
         return userOrderVo;
     }
@@ -118,27 +117,36 @@ public class UserOrderServiceImpl extends ServiceImpl<UserOrderDao, UserOrder> i
     public HttpResponseResult<UserOrder> executeOrder(OrderReq orderReq) {
         log.info("订单[创建订单] Req:{}", JSONObject.toJSONString(orderReq));
         //验证参数,必须验证参数
-        Function<OrderReq, HttpResponseResult<OrderCreateRes>> checkFunction = orderCreate.get(orderReq.getOrderType());
-        if (Objects.isNull(checkFunction)) {
-            return HttpResponseResult.failed("订单商品信息获取失败");
-        }
-        HttpResponseResult<OrderCreateRes> checkResult = checkFunction.apply(orderReq);
-        OrderCreateRes createRes = checkResult.getData();
-        if (!checkResult.getStatus() || null == createRes || !createRes.getRes()) {
-            log.info("订单[创建订单] Res:{}", JSONObject.toJSONString(checkResult));
-            return HttpResponseResult.failed("订单商品信息获取失败");
-        }
-        if (!checkPositiveOrZero(createRes.getOriginalPrice())
-                || !checkPositiveOrZero(createRes.getExpectPrice())
-        ) {
-            return HttpResponseResult.failed("金额校验失败");
+        List<OrderCreateRes> resList = new ArrayList<>();
+        for (OrderReq.OrderReqInfo info : orderReq.getOrderInfos()) {
+            Function<OrderReq.OrderReqInfo, HttpResponseResult<OrderCreateRes>> createFunction = orderCreate.get(info.getGoodType());
+            if (Objects.isNull(createFunction)) {
+                return HttpResponseResult.failed("订单商品信息获取失败");
+            }
+            info.setUserId(orderReq.getUserId());
+            HttpResponseResult<OrderCreateRes> createResult = createFunction.apply(info);
+            OrderCreateRes createRes = createResult.getData();
+            createRes.setGoodType(info.getGoodType());
+            if (!createResult.getStatus() || null == createRes || !createRes.getRes()) {
+                log.info("订单[创建订单] Res:{}", JSONObject.toJSONString(createResult));
+                return HttpResponseResult.failed("订单商品信息获取失败");
+            }
+            resList.add(createRes);
         }
+
         //验证成功后,订单入库
-        UserOrderVo orderVo = insertOrder(orderReq, checkResult.getData());
+        UserOrderVo orderVo = insertOrder(orderReq, resList);
+
+        List<UserOrderDetailVo> orderDetailList = orderVo.getOrderDetailList();
+
+        for(UserOrderDetailVo orderDetailVo : orderDetailList){
+            orderDetailVo.setUserId(orderReq.getUserId());
+            orderDetailVo.setOrderId(orderVo.getId());
 
-        Consumer<UserOrderVo> afterFunction = orderAfter.get(orderReq.getOrderType());
-        if (!Objects.isNull(afterFunction)) {
-            afterFunction.accept(orderVo);
+            Consumer<UserOrderDetailVo> afterFunction = orderAfter.get(orderDetailVo.getGoodType());
+            if (!Objects.isNull(afterFunction)) {
+                afterFunction.accept(orderDetailVo);
+            }
         }
         return HttpResponseResult.succeed(orderVo);
     }
@@ -151,7 +159,7 @@ public class UserOrderServiceImpl extends ServiceImpl<UserOrderDao, UserOrder> i
         if (null == detail || !payReq.getUserId().equals(detail.getUserId())) {
             return HttpResponseResult.failed("订单不存在");
         }
-        if (OrderStatusEnum.WAIT_PAY.equals(detail.getStatus())) {
+        if (OrderStatusEnum.WAIT_PAY.equals(detail.getStatus()) || OrderStatusEnum.FAIL.equals(detail.getStatus())) {
             //处于待支付状态,需要调用汇付发起付款请求接口
             return orderPayWaitPay(payReq, detail);
         } else if (OrderStatusEnum.PAYING.equals(detail.getStatus())) {
@@ -171,7 +179,9 @@ public class UserOrderServiceImpl extends ServiceImpl<UserOrderDao, UserOrder> i
                 log.error("汇付支付回调,订单未找到。 req is {}", data);
                 return;
             }
-            if (detail.getStatus().equals(OrderStatusEnum.PAYING)) {
+            if (!detail.getStatus().equals(OrderStatusEnum.PAID)
+                    && !detail.getStatus().equals(OrderStatusEnum.WAIT_PAY)
+                    && !detail.getStatus().equals(OrderStatusEnum.CLOSE)) {
                 orderSuccess(detail, hfRes);
             } else {
                 log.error("汇付支付回调,订单状态异常。 req is {}", data);
@@ -186,6 +196,9 @@ public class UserOrderServiceImpl extends ServiceImpl<UserOrderDao, UserOrder> i
         List<UserOrderVo> orderList = baseMapper.selectPendingList();
         for (UserOrderVo userOrder : orderList) {
             //待支付订单直接取消
+            if (OrderStatusEnum.FAIL.equals(userOrder.getStatus())) {
+                failPayOrderHandle(userOrder);
+            }
             if (OrderStatusEnum.WAIT_PAY.equals(userOrder.getStatus())) {
                 waitPayOrderHandle(userOrder);
             }
@@ -196,6 +209,16 @@ public class UserOrderServiceImpl extends ServiceImpl<UserOrderDao, UserOrder> i
     }
 
     /***
+     * 处理支付失败订单
+     * @author liweifan
+     * @param: userOrder
+     * @updateTime 2022/4/13 16:51
+     */
+    private void failPayOrderHandle(UserOrderVo userOrder) {
+        orderCancel(userOrder);
+    }
+
+    /***
      * 处理待支付订单
      * @author liweifan
      * @param: userOrder
@@ -263,15 +286,24 @@ public class UserOrderServiceImpl extends ServiceImpl<UserOrderDao, UserOrder> i
             paymentReq.setExpend(expend);
         }
         //付款请求
-        Map<String, Object> res = paymentSdk.executePayment(paymentReq);
-
-        OrderPayRes orderPayRes = new OrderPayRes();
-        orderPayRes.setPay_amt(detail.getActualPrice().setScale(2).toString());
-        String pay_info = ((JSONObject) res.get("expend")).getString("pay_info");
-        orderPayRes.setPay_info(pay_info);
-        //入订单付款表,同时修改订单状态
-        insertOrderPayment(res, payReq);
-        return HttpResponseResult.succeed(orderPayRes);
+        HttpResponseResult<Map<String, Object>> responseResult = paymentSdk.executePayment(paymentReq);
+        if (responseResult.getStatus()) {
+            OrderPayRes orderPayRes = new OrderPayRes();
+            orderPayRes.setPay_amt(detail.getActualPrice().setScale(2).toString());
+            String pay_info = ((JSONObject) responseResult.getData().get("expend")).getString("pay_info");
+            orderPayRes.setPay_info(pay_info);
+
+            //入订单付款表,同时修改订单状态
+            insertOrderPayment(responseResult, payReq);
+            baseMapper.updateStatusByOrderNo(payReq.getOrderNo(), OrderStatusEnum.PAYING.getCode());
+            return HttpResponseResult.succeed(orderPayRes);
+        } else {
+            //入订单付款表,同时修改订单状态
+            insertOrderPayment(responseResult, payReq);
+            baseMapper.updateStatusByOrderNo(payReq.getOrderNo(), OrderStatusEnum.FAIL.getCode());
+            return HttpResponseResult.failed(responseResult.getMsg());
+        }
+
     }
 
     /***
@@ -282,19 +314,23 @@ public class UserOrderServiceImpl extends ServiceImpl<UserOrderDao, UserOrder> i
      * @updateTime 2022/4/13 17:56
      * @return: com.yonge.cooleshow.biz.dal.entity.UserOrderPayment
      */
-    private UserOrderPayment insertOrderPayment(Map<String, Object> res, OrderPayReq payReq) {
+    private UserOrderPayment insertOrderPayment(HttpResponseResult<Map<String, Object>> responseResult, OrderPayReq payReq) {
         UserOrderPayment orderPayment = new UserOrderPayment();
         orderPayment.setOrderNo(payReq.getOrderNo());
         orderPayment.setPayChannel(payReq.getPayChannel());
-
-        orderPayment.setTransNo(res.get("id").toString());
-        orderPayment.setPayAmt(
-                new BigDecimal(res.get("pay_amt").toString()).setScale(2)
-        );
-        String pay_info = ((JSONObject) res.get("expend")).getString("pay_info");
-        orderPayment.setPayInfo(pay_info);
-        orderPayment.setStatus(PayStatusEnum.pending);
-
+        if (responseResult.getStatus()) {
+            Map<String, Object> res = responseResult.getData();
+            orderPayment.setTransNo(res.get("id").toString());
+            orderPayment.setPayAmt(
+                    new BigDecimal(res.get("pay_amt").toString()).setScale(2)
+            );
+            String pay_info = ((JSONObject) res.get("expend")).getString("pay_info");
+            orderPayment.setPayInfo(pay_info);
+            orderPayment.setStatus(PayStatusEnum.pending);
+        } else {
+            orderPayment.setPayFailMsg(responseResult.getMsg());
+            orderPayment.setStatus(PayStatusEnum.failed);
+        }
         orderPaymentService.save(orderPayment);
         return orderPayment;
     }
@@ -326,52 +362,65 @@ public class UserOrderServiceImpl extends ServiceImpl<UserOrderDao, UserOrder> i
      * @updateTime 2022/3/31 16:15
      * @return: com.yonge.cooleshow.biz.dal.entity.Order
      */
-    private UserOrderVo insertOrder(OrderReq orderReq, OrderCreateRes data) {
+    private UserOrderVo insertOrder(OrderReq orderReq, List<OrderCreateRes> resList) {
         UserOrder userOrder = new UserOrder();
         //订单号生成
         Long orderNo = idGeneratorService.generatorId("userOrder");
         userOrder.setOrderNo(orderNo.toString());
         userOrder.setUserId(orderReq.getUserId());
-        userOrder.setMerchId(data.getMerchId());
         userOrder.setOrderName(orderReq.getOrderName());
+        userOrder.setOrderType(orderReq.getOrderType());
         userOrder.setOrderDesc(orderReq.getOrderDesc());
         userOrder.setStatus(OrderStatusEnum.WAIT_PAY);
-        userOrder.setOriginalPrice(data.getOriginalPrice());
-        userOrder.setExpectPrice(data.getExpectPrice());
+        userOrder.setUserNote(orderReq.getUserNote());
+        userOrder.setCreateTime(new Date());
+        userOrder.setOriginalPrice(new BigDecimal(0));
+        userOrder.setExpectPrice(new BigDecimal(0));
+        userOrder.setPlantformFee(new BigDecimal(0));
+        List<UserOrderDetailVo> orderDetailList = new ArrayList<>();
+        for (OrderCreateRes res : resList) {
+            UserOrderDetailVo orderDetail = new UserOrderDetailVo();
+            orderDetail.setOrderNo(userOrder.getOrderNo());
+            orderDetail.setMerchId(res.getMerchId());
+            orderDetail.setGoodType(res.getGoodType());
+            orderDetail.setBizId(res.getBizId());
+            orderDetail.setBizContent(res.getBizContent());
+            orderDetail.setOriginalPrice(null != res.getOriginalPrice() ? res.getOriginalPrice() : new BigDecimal(0));
+            orderDetail.setExpectPrice(null != res.getExpectPrice() ? res.getExpectPrice() : new BigDecimal(0));
+            orderDetail.setGoodNum(null != res.getGoodNum() ? res.getGoodNum() : 1);
+            //商品单价计算,使用商品原价计算,退费计算公式(退费金额=实际订单金额-(商品单价 * 已经使用商品数))
+            //其中,已经使用的商品单价按照原价算
+            orderDetail.setGoodPrice(
+                    orderDetail.getOriginalPrice().divide(new BigDecimal(orderDetail.getGoodNum())).setScale(2)
+            );
+            //平台服务费
+            BigDecimal serviceFeeRate = getServiceFeeRate(res.getGoodType());
+            orderDetail.setPlantformFee(userOrder.getActualPrice().multiply(serviceFeeRate));
+            orderDetail.setPlantformFeeRate(serviceFeeRate);
+
+            orderDetail.setCreateTime(new Date());
+            orderDetailService.save(orderDetail);
+            orderDetailList.add(orderDetail);
+
+            userOrder.setOriginalPrice(userOrder.getOriginalPrice().add(orderDetail.getOriginalPrice()));
+            userOrder.setExpectPrice(userOrder.getExpectPrice().add(orderDetail.getExpectPrice()));
+            userOrder.setPlantformFee(userOrder.getPlantformFee().add(orderDetail.getPlantformFee()));
+        }
 
         //todo 优惠券优惠金额,暂时为0
         BigDecimal couponAmount = new BigDecimal(0);
-
-        userOrder.setActualPrice(data.getExpectPrice().subtract(couponAmount).setScale(2));
+        userOrder.setActualPrice(userOrder.getExpectPrice().subtract(couponAmount).setScale(2));
         userOrder.setCouponAmount(couponAmount);
-        //平台服务费
-        BigDecimal serviceFeeRate = getServiceFeeRate(orderReq.getOrderType());
-        userOrder.setPlantformFee(userOrder.getActualPrice().multiply(serviceFeeRate));
-        userOrder.setPlantformFeeRate(serviceFeeRate);
-        userOrder.setUserNote(orderReq.getUserNote());
-        userOrder.setOrderType(orderReq.getOrderType());
-        userOrder.setCreateTime(new Date());
+        if (userOrder.getActualPrice().subtract(orderReq.getActualPrice()).abs()
+                .compareTo(new BigDecimal(0.01)) > 0) {
+            throw new BizException("交易金额异常");
+        }
+
         int insert = baseMapper.insert(userOrder);
 
         if (insert == 0 || null == userOrder.getId()) {
             throw new BizException("插入失败");
         }
-        UserOrderDetail orderDetail = new UserOrderDetail();
-        orderDetail.setOrderNo(userOrder.getOrderNo());
-        orderDetail.setBizId(data.getBizId());
-        orderDetail.setBizContent(data.getBizContent());
-        if (null != data.getGoodNum()) {
-            orderDetail.setGoodNum(data.getGoodNum());
-        }
-
-        //商品单价计算,使用商品原价计算,退费计算公式(退费金额=实际订单金额-(商品单价 * 已经使用商品数))
-        //其中,已经使用的商品单价按照原价算
-        orderDetail.setGoodPrice(
-                data.getOriginalPrice().divide(new BigDecimal(data.getGoodNum())).setScale(2)
-        );
-        orderDetail.setCreateTime(new Date());
-        orderDetailService.save(orderDetail);
-
         UserOrderVo vo = new UserOrderVo();
         try {
             BeanUtils.copyProperties(vo, userOrder);
@@ -379,7 +428,7 @@ public class UserOrderServiceImpl extends ServiceImpl<UserOrderDao, UserOrder> i
             e.printStackTrace();
             throw new BizException("对象转换失败");
         }
-        vo.setOrderDetail(orderDetail);
+        vo.setOrderDetailList(orderDetailList);
         return vo;
     }
 
@@ -390,15 +439,15 @@ public class UserOrderServiceImpl extends ServiceImpl<UserOrderDao, UserOrder> i
      * @updateTime 2022/3/31 16:49
      * @return: java.math.BigDecimal
      */
-    private BigDecimal getServiceFeeRate(OrderTypeEnum orderTypeEnum) {
+    private BigDecimal getServiceFeeRate(GoodTypeEnum goodTypeEnum) {
         String configValue = "0";
-        if (OrderTypeEnum.VIDEO.equals(orderTypeEnum)) {
+        if (GoodTypeEnum.VIDEO.equals(goodTypeEnum)) {
             configValue = sysConfigService.findConfigValue(SysConfigConstant.VIDEO_LESSON_SERVICE_FEE);
-        } else if (OrderTypeEnum.PRACTICE.equals(orderTypeEnum)) {
+        } else if (GoodTypeEnum.PRACTICE.equals(goodTypeEnum)) {
             configValue = sysConfigService.findConfigValue(SysConfigConstant.PRACTICE_SERVICE_FEE);
-        } else if (OrderTypeEnum.LIVE.equals(orderTypeEnum)) {
+        } else if (GoodTypeEnum.LIVE.equals(goodTypeEnum)) {
             configValue = sysConfigService.findConfigValue(SysConfigConstant.LIVE_SERVICE_RATE);
-        } else if (OrderTypeEnum.MUSIC.equals(orderTypeEnum)) {
+        } else if (GoodTypeEnum.MUSIC.equals(goodTypeEnum)) {
             configValue = sysConfigService.findConfigValue(SysConfigConstant.MUSIC_SHEET_SERVICE_FEE);
         }
         return new BigDecimal(configValue).divide(new BigDecimal(100));
@@ -429,12 +478,18 @@ public class UserOrderServiceImpl extends ServiceImpl<UserOrderDao, UserOrder> i
         if (null != orderPayment) {
             //更新付款单
             orderPayment.setStatus(PayStatusEnum.failed);
+            orderPayment.setPayFailMsg("交易取消");
             orderPaymentService.updateById(orderPayment);
         }
-        //调用业务
-        Consumer<UserOrderVo> userOrderVoConsumer = orderCancel.get(userOrder.getOrderType());
-        if (!Objects.isNull(userOrderVoConsumer)) {
-            userOrderVoConsumer.accept(userOrder);
+        List<UserOrderDetailVo> orderDetailList = orderDetailService.getOrderDetilListByOrderNo(userOrder.getOrderNo());
+        for(UserOrderDetailVo orderDetailVo : orderDetailList){
+            orderDetailVo.setUserId(userOrder.getUserId());
+            orderDetailVo.setOrderId(userOrder.getId());
+            //调用业务
+            Consumer<UserOrderDetailVo> userOrderVoConsumer = orderCancel.get(orderDetailVo.getGoodType());
+            if (!Objects.isNull(userOrderVoConsumer)) {
+                userOrderVoConsumer.accept(orderDetailVo);
+            }
         }
     }
 
@@ -468,10 +523,16 @@ public class UserOrderServiceImpl extends ServiceImpl<UserOrderDao, UserOrder> i
             }
         }
         orderPaymentService.updateById(orderPayment);
-        //调用业务
-        Consumer<UserOrderVo> userOrderVoConsumer = orderSuccess.get(detail.getOrderType());
-        if (!Objects.isNull(userOrderVoConsumer)) {
-            userOrderVoConsumer.accept(detail);
+
+        List<UserOrderDetailVo> orderDetailList = orderDetailService.getOrderDetilListByOrderNo(detail.getOrderNo());
+        for(UserOrderDetailVo orderDetailVo : orderDetailList){
+            orderDetailVo.setUserId(detail.getUserId());
+            orderDetailVo.setOrderId(detail.getId());
+            //调用业务
+            Consumer<UserOrderDetailVo> userOrderVoConsumer = orderSuccess.get(orderDetailVo.getGoodType());
+            if (!Objects.isNull(userOrderVoConsumer)) {
+                userOrderVoConsumer.accept(orderDetailVo);
+            }
         }
     }
 }

+ 10 - 8
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/VipCardServiceImpl.java

@@ -5,10 +5,12 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.fasterxml.jackson.annotation.JsonFormat;
 import com.yonge.cooleshow.biz.dal.dto.req.OrderReq;
 import com.yonge.cooleshow.biz.dal.entity.VipCardRecord;
+import com.yonge.cooleshow.biz.dal.enums.OrderTypeEnum;
 import com.yonge.cooleshow.biz.dal.enums.VipTimeTypeEnum;
 import com.yonge.cooleshow.biz.dal.service.StudentService;
 import com.yonge.cooleshow.biz.dal.service.VipCardRecordService;
 import com.yonge.cooleshow.biz.dal.vo.StudentVo;
+import com.yonge.cooleshow.biz.dal.vo.UserOrderDetailVo;
 import com.yonge.cooleshow.biz.dal.vo.UserOrderVo;
 import com.yonge.cooleshow.biz.dal.vo.res.OrderCreateRes;
 import com.yonge.cooleshow.common.entity.HttpResponseResult;
@@ -52,8 +54,8 @@ public class VipCardServiceImpl extends ServiceImpl<VipCardDao, VipCard> impleme
     }
 
     @Override
-    public HttpResponseResult<OrderCreateRes> orderCreate(OrderReq orderReq) {
-        VipCardVo detail = detail(Long.parseLong(orderReq.getBizContent()));
+    public HttpResponseResult<OrderCreateRes> orderCreate(OrderReq.OrderReqInfo orderReqInfo) {
+        VipCardVo detail = detail(Long.parseLong(orderReqInfo.getBizContent()));
         if (null == detail) {
             return HttpResponseResult.failed("未找到会员卡信息");
         }
@@ -62,7 +64,7 @@ public class VipCardServiceImpl extends ServiceImpl<VipCardDao, VipCard> impleme
         orderCreateRes.setRes(true);
         orderCreateRes.setBizId(detail.getId());
         orderCreateRes.setBizContent("会员卡购买-" + detail.getTimeTypeName());
-
+        orderCreateRes.setGoodNum(1);
         orderCreateRes.setOriginalPrice(detail.getOriginalPrice());
         orderCreateRes.setExpectPrice(detail.getActualPrice());
         return HttpResponseResult.succeed(orderCreateRes);
@@ -70,19 +72,19 @@ public class VipCardServiceImpl extends ServiceImpl<VipCardDao, VipCard> impleme
 
 
     @Override
-    public void orderSuccess(UserOrderVo orderVo) {
-        VipCardVo detail = detail(orderVo.getOrderDetail().getBizId());
+    public void orderSuccess(UserOrderDetailVo orderDetailVo) {
+        VipCardVo detail = detail(orderDetailVo.getBizId());
         if (null == detail) {
             return;
         }
-        StudentVo studentVo = studentService.detail(orderVo.getUserId());
+        StudentVo studentVo = studentService.detail(orderDetailVo.getUserId());
         //修改用户会员时长
         Date membershipEndTime = studentVo.getMembershipEndTime();
         Calendar now = Calendar.getInstance();
 
         VipCardRecord vipCardRecord = new VipCardRecord();
-        vipCardRecord.setUserId(orderVo.getUserId());
-        vipCardRecord.setOrderId(orderVo.getId());
+        vipCardRecord.setUserId(orderDetailVo.getUserId());
+        vipCardRecord.setOrderId(orderDetailVo.getOrderId());
         vipCardRecord.setVipCardId(detail.getId());
 
 

+ 22 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/UserOrderDetailVo.java

@@ -2,6 +2,7 @@ package com.yonge.cooleshow.biz.dal.vo;
 
 import com.yonge.cooleshow.biz.dal.entity.UserOrderDetail;
 import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
 
 /**
  * @Author: liweifan
@@ -11,4 +12,25 @@ import io.swagger.annotations.ApiModel;
 public class UserOrderDetailVo extends UserOrderDetail {
 	private static final long serialVersionUID = 1L;
 
+	@ApiModelProperty("买家id ")
+	private Long userId;
+
+	@ApiModelProperty("订单id ")
+	private Long orderId;
+
+	public Long getUserId() {
+		return userId;
+	}
+
+	public void setUserId(Long userId) {
+		this.userId = userId;
+	}
+
+	public Long getOrderId() {
+		return orderId;
+	}
+
+	public void setOrderId(Long orderId) {
+		this.orderId = orderId;
+	}
 }

+ 6 - 5
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/UserOrderVo.java

@@ -6,6 +6,7 @@ import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 
 import java.math.BigDecimal;
+import java.util.List;
 
 /**
  * @Author: liweifan
@@ -15,7 +16,7 @@ import java.math.BigDecimal;
 public class UserOrderVo extends UserOrder {
 	private static final long serialVersionUID = 1L;
 	@ApiModelProperty("订单详情 ")
-	private UserOrderDetail orderDetail;
+	private List<UserOrderDetailVo> orderDetailList;
 	@ApiModelProperty("交易流水号 ")
 	private String transNo;
 	@ApiModelProperty("汇付收取的服务费 ")
@@ -25,12 +26,12 @@ public class UserOrderVo extends UserOrder {
 	@ApiModelProperty(value = "手机号")
 	private String phone;
 
-	public UserOrderDetail getOrderDetail() {
-		return orderDetail;
+	public List<UserOrderDetailVo> getOrderDetailList() {
+		return orderDetailList;
 	}
 
-	public void setOrderDetail(UserOrderDetail orderDetail) {
-		this.orderDetail = orderDetail;
+	public void setOrderDetailList(List<UserOrderDetailVo> orderDetailList) {
+		this.orderDetailList = orderDetailList;
 	}
 
 	public String getTransNo() {

+ 13 - 1
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/res/OrderCreateRes.java

@@ -1,5 +1,8 @@
 package com.yonge.cooleshow.biz.dal.vo.res;
 
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.yonge.cooleshow.biz.dal.enums.GoodTypeEnum;
+import com.yonge.cooleshow.biz.dal.enums.OrderTypeEnum;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 
@@ -15,13 +18,14 @@ public class OrderCreateRes {
     private Boolean res;
     @ApiModelProperty("商家id")
     private Long merchId;
+    @ApiModelProperty("商品类型:  VIP、开通会员  PRACTICE、陪练课购买  LIVE、直播课购买 VIDEO、视频课购买 MUSIC、单曲点播")
+    private GoodTypeEnum goodType;
     @ApiModelProperty("业务id")
     private Long bizId;
     @ApiModelProperty(value = "业务内容")
     private String bizContent;
     @ApiModelProperty("商品数量 ")
     private Integer goodNum;
-
     @ApiModelProperty(value = "原价 ")
     private BigDecimal originalPrice;
     @ApiModelProperty(value = "预计价格 ")
@@ -82,4 +86,12 @@ public class OrderCreateRes {
     public void setGoodNum(Integer goodNum) {
         this.goodNum = goodNum;
     }
+
+    public GoodTypeEnum getGoodType() {
+        return goodType;
+    }
+
+    public void setGoodType(GoodTypeEnum goodType) {
+        this.goodType = goodType;
+    }
 }

+ 25 - 2
cooleshow-user/user-biz/src/main/resources/config/mybatis/UserOrderDetailMapper.xml

@@ -4,8 +4,16 @@
 	<resultMap id="BaseResultMap" type="com.yonge.cooleshow.biz.dal.entity.UserOrderDetail">
             <result column="id_" property="id" />
 	        <result column="order_no_" property="orderNo" />
-	        <result column="biz_id_" property="bizId" />
+            <result column="merch_id_" property="merchId" />
+            <result column="good_type_" property="goodType" />
+            <result column="biz_id_" property="bizId" />
 	        <result column="biz_content_" property="bizContent" />
+            <result column="original_price_" property="originalPrice" />
+            <result column="expect_price_" property="expectPrice" />
+            <result column="good_num_" property="goodNum" />
+            <result column="good_price_" property="goodPrice" />
+            <result column="plantform_fee_" property="plantformFee" />
+            <result column="plantform_fee_rate_" property="plantformFeeRate" />
 	        <result column="create_time_" property="createTime" />
 	        <result column="update_time_" property="updateTime" />
 		</resultMap>
@@ -14,8 +22,16 @@
     <sql id="baseColumns">
          t.id_ as id
         , t.order_no_ as orderNo
+        , t.merch_id_ as merchId
+        , t.good_type_ as goodType
         , t.biz_id_ as bizId
         , t.biz_content_ as bizContent
+        , t.original_price_ as originalPrice
+        , t.expect_price_ as expectPrice
+        , t.good_num_ as goodNum
+        , t.good_price_ as goodPrice
+        , t.plantform_fee_ as plantformFee
+        , t.plantform_fee_rate_ as plantformFeeRate
         , t.create_time_ as createTime
         , t.update_time_ as updateTime
         </sql>
@@ -33,9 +49,16 @@
         where t.order_no_ = #{orderNo}
     </select>
 
-    <select id="selectPage" resultMap="BaseResultMap">
+    <select id="selectPage" resultType="com.yonge.cooleshow.biz.dal.vo.UserOrderDetailVo">
 		SELECT         
         	<include refid="baseColumns" />
 		FROM user_order_detail t
 	</select>
+
+    <select id="getOrderDetilListByOrderNo" resultType="com.yonge.cooleshow.biz.dal.vo.UserOrderDetailVo">
+        SELECT
+            <include refid="baseColumns" />
+        FROM user_order_detail t
+        where t.order_no_ = #{orderNo}
+    </select>
 </mapper>

+ 6 - 14
cooleshow-user/user-biz/src/main/resources/config/mybatis/UserOrderMapper.xml

@@ -5,22 +5,18 @@
             <result column="id_" property="id" />
 	        <result column="order_no_" property="orderNo" />
 	        <result column="user_id_" property="userId" />
-	        <result column="merch_id_" property="merchId" />
 	        <result column="order_name_" property="orderName" />
-	        <result column="order_desc_" property="orderDesc" />
+            <result column="order_type_" property="orderType" />
+            <result column="order_desc_" property="orderDesc" />
 	        <result column="status_" property="status" />
 	        <result column="original_price_" property="originalPrice" />
 	        <result column="expect_price_" property="expectPrice" />
 	        <result column="actual_price_" property="actualPrice" />
 	        <result column="coupon_amount_" property="couponAmount" />
 	        <result column="plantform_fee_" property="plantformFee" />
-	        <result column="plantform_fee_rate_" property="plantformFeeRate" />
-	        <result column="refund_amount_" property="refundAmount" />
 	        <result column="user_note_" property="userNote" />
-	        <result column="order_type_" property="orderType" />
 	        <result column="create_time_" property="createTime" />
 	        <result column="pay_time_" property="payTime" />
-	        <result column="refund_time_" property="refundTime" />
 	        <result column="update_time_" property="updateTime" />
 		</resultMap>  
     
@@ -29,8 +25,8 @@
          t.id_ as id
         , t.order_no_ as orderNo
         , t.user_id_ as userId
-        , t.merch_id_ as merchId
         , t.order_name_ as orderName
+        , t.order_type_ as orderType
         , t.order_desc_ as orderDesc
         , t.status_ as status
         , t.original_price_ as originalPrice
@@ -38,13 +34,9 @@
         , t.actual_price_ as actualPrice
         , t.coupon_amount_ as couponAmount
         , t.plantform_fee_ as plantformFee
-        , t.plantform_fee_rate_ as plantformFeeRate
-        , t.refund_amount_ as refundAmount
         , t.user_note_ as userNote
-        , t.order_type_ as orderType
         , t.create_time_ as createTime
         , t.pay_time_ as payTime
-        , t.refund_time_ as refundTime
         , t.update_time_ as updateTime
         </sql>
 
@@ -114,9 +106,6 @@
             <if test="param.userId !=null">
                 AND t.user_id_ = #{param.userId}
             </if>
-            <if test="param.merchId !=null">
-                AND t.merch_id_ = #{param.merchId}
-            </if>
         </where>
         order by t.create_time_ desc
         </sql>
@@ -133,4 +122,7 @@
         and t.create_time_ &lt;= date_sub(now(),interval 30 minute)
     </select>
 
+    <update id="updateStatusByOrderNo">
+        update user_order set status_ = #{orderStatus} where order_no_ = #{orderNo}
+    </update>
 </mapper>

+ 2 - 0
cooleshow-user/user-biz/src/main/resources/config/mybatis/UserOrderPaymentMapper.xml

@@ -10,6 +10,7 @@
         <result column="fee_amt_" property="feeAmt" />
         <result column="pay_info_" property="payInfo" />
         <result column="status_" property="status" />
+        <result column="pay_fail_msg_" property="payFailMsg" />
         <result column="arrival_time_" property="arrivalTime" />
         <result column="create_time_" property="createTime" />
         <result column="update_time_" property="updateTime" />
@@ -25,6 +26,7 @@
         , t.fee_amt_ as feeAmt
         , t.pay_info_ as payInfo
         , t.status_ as status
+        , t.pay_fail_msg_ as payFailMsg
         , t.arrival_time_ as arrivalTime
         , t.create_time_ as createTime
         , t.update_time_ as updateTime