Browse Source

通过业务id查询用户正在交易中的订单,批量完成订单

weifanli 2 years ago
parent
commit
7ad7b7e629
22 changed files with 531 additions and 278 deletions
  1. 3 3
      cooleshow-auth/auth-api/src/main/java/com/yonge/cooleshow/auth/api/dto/RealnameAuthReq.java
  2. 4 4
      cooleshow-auth/auth-api/src/main/java/com/yonge/cooleshow/auth/api/vo/UserSetVo.java
  3. 28 31
      cooleshow-mall/mall-pay/src/main/java/com/yonge/cooleshow/sdk/res/OrderPayRes.java
  4. 8 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/UserOrderDao.java
  5. 10 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/req/OrderPayReq.java
  6. 19 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/search/OrderSearch.java
  7. 49 27
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/UserOrderPayment.java
  8. 0 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/UserWithdrawal.java
  9. 2 2
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/enums/TradeStatusEnum.java
  10. 1 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/props/HuifuProperties.java
  11. 24 14
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/sdk/PaymentSdk.java
  12. 8 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/UserOrderPaymentService.java
  13. 91 63
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/UserOrderService.java
  14. 18 18
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/UserAccountServiceImpl.java
  15. 7 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/UserOrderPaymentServiceImpl.java
  16. 176 69
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/UserOrderServiceImpl.java
  17. 0 18
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/HomeTotalVo.java
  18. 7 7
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/res/AccountTotal.java
  19. 23 15
      cooleshow-user/user-biz/src/main/resources/config/mybatis/UserOrderMapper.xml
  20. 4 0
      cooleshow-user/user-biz/src/main/resources/config/mybatis/UserOrderPaymentMapper.xml
  21. 9 2
      cooleshow-user/user-student/src/main/java/com/yonge/cooleshow/student/controller/PaymentController.java
  22. 40 1
      cooleshow-user/user-student/src/main/java/com/yonge/cooleshow/student/controller/UserOrderController.java

+ 3 - 3
cooleshow-auth/auth-api/src/main/java/com/yonge/cooleshow/auth/api/dto/RealnameAuthReq.java

@@ -27,7 +27,7 @@ public class RealnameAuthReq implements Serializable {
 
     @NotNull(message = "缺少是否修改用户信息")
     @ApiModelProperty(value = "是否修改用户信息", required = true)
-    private Boolean isSave;
+    private Boolean save;
 
     private Long userId;
     // 性别(1,男 0,女)
@@ -62,11 +62,11 @@ public class RealnameAuthReq implements Serializable {
     }
 
     public Boolean getSave() {
-        return isSave;
+        return save;
     }
 
     public void setSave(Boolean save) {
-        isSave = save;
+        this.save = save;
     }
 
     public int getGender() {

+ 4 - 4
cooleshow-auth/auth-api/src/main/java/com/yonge/cooleshow/auth/api/vo/UserSetVo.java

@@ -18,8 +18,8 @@ public class UserSetVo {
     private Integer gender;
     @ApiModelProperty(value = "手机号")
     private String phone;
-    @ApiModelProperty(value = "是否实名 0否 1是")
-    private Boolean isReal;
+    @ApiModelProperty(value = "是否实名")
+    private Boolean real;
 
     public String getAvatar() {
         return avatar;
@@ -54,10 +54,10 @@ public class UserSetVo {
     }
 
     public Boolean getReal() {
-        return isReal;
+        return real;
     }
 
     public void setReal(Boolean real) {
-        isReal = real;
+        this.real = real;
     }
 }

+ 28 - 31
cooleshow-mall/mall-pay/src/main/java/com/yonge/cooleshow/sdk/res/OrderPayRes.java

@@ -14,10 +14,8 @@ public class OrderPayRes {
     private String pay_amt;
     @ApiModelProperty("pay_info")
     private String pay_info;
-
     @ApiModelProperty("执行状态")
     private boolean status = true;
-
     @ApiModelProperty("订单状态")
     private OrderStatusEnum orderStatus;
 
@@ -33,29 +31,28 @@ public class OrderPayRes {
     @ApiModelProperty("交易流水号")
     private String transNo;
 
-
-    public String getTransNo() {
-        return transNo;
+    public String getPay_amt() {
+        return pay_amt;
     }
 
-    public void setTransNo(String transNo) {
-        this.transNo = transNo;
+    public void setPay_amt(String pay_amt) {
+        this.pay_amt = pay_amt;
     }
 
-    public String getOrderNo() {
-        return orderNo;
+    public String getPay_info() {
+        return pay_info;
     }
 
-    public void setOrderNo(String orderNo) {
-        this.orderNo = orderNo;
+    public void setPay_info(String pay_info) {
+        this.pay_info = pay_info;
     }
 
-    public String getPayChannel() {
-        return payChannel;
+    public boolean isStatus() {
+        return status;
     }
 
-    public void setPayChannel(String payChannel) {
-        this.payChannel = payChannel;
+    public void setStatus(boolean status) {
+        this.status = status;
     }
 
     public OrderStatusEnum getOrderStatus() {
@@ -66,14 +63,6 @@ public class OrderPayRes {
         this.orderStatus = orderStatus;
     }
 
-    public boolean isStatus() {
-        return status;
-    }
-
-    public void setStatus(boolean status) {
-        this.status = status;
-    }
-
     public String getMessage() {
         return message;
     }
@@ -82,19 +71,27 @@ public class OrderPayRes {
         this.message = message;
     }
 
-    public String getPay_amt() {
-        return pay_amt;
+    public String getOrderNo() {
+        return orderNo;
     }
 
-    public void setPay_amt(String pay_amt) {
-        this.pay_amt = pay_amt;
+    public void setOrderNo(String orderNo) {
+        this.orderNo = orderNo;
     }
 
-    public String getPay_info() {
-        return pay_info;
+    public String getPayChannel() {
+        return payChannel;
     }
 
-    public void setPay_info(String pay_info) {
-        this.pay_info = pay_info;
+    public void setPayChannel(String payChannel) {
+        this.payChannel = payChannel;
+    }
+
+    public String getTransNo() {
+        return transNo;
+    }
+
+    public void setTransNo(String transNo) {
+        this.transNo = transNo;
     }
 }

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

@@ -34,6 +34,14 @@ public interface UserOrderDao extends BaseMapper<UserOrder>{
 	 * @return: com.yonge.cooleshow.biz.dal.vo.UserOrderVo
 	 */
 	UserOrderVo detailApp(@Param("param") UserOrder param);
+	/***
+	 * 通过业务id查询用户正在交易中的订单
+	 * @author liweifan
+	 * @param: param
+	 * @updateTime 2022/4/27 17:05
+	 * @return: com.yonge.cooleshow.biz.dal.vo.UserOrderVo
+	 */
+	UserOrderVo getPendingOrder(@Param("param") OrderSearch param);
 	/**
 	 * 分页查询
      * @author liweifan

+ 10 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/req/OrderPayReq.java

@@ -27,6 +27,8 @@ public class OrderPayReq {
     private String ipAddress;
     @ApiModelProperty(value = "微信用户openId(微信支付必传)")
     private String openId;
+    @ApiModelProperty(value = "用户说明 ")
+    private String reason;
 
     public String getOrderNo() {
         return orderNo;
@@ -67,4 +69,12 @@ public class OrderPayReq {
     public void setOpenId(String openId) {
         this.openId = openId;
     }
+
+    public String getReason() {
+        return reason;
+    }
+
+    public void setReason(String reason) {
+        this.reason = reason;
+    }
 }

+ 19 - 1
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/search/OrderSearch.java

@@ -35,10 +35,12 @@ public class OrderSearch extends QueryInfo{
 	private Long userId;
 	@ApiModelProperty("卖家id")
 	private Long merchId;
-
 	@ApiModelProperty("查询时间(yyyy-mm) ")
 	private String searchDate;
 
+	private String goodType;
+	private Long bizId;
+
 	public String getSearchNo() {
 		return searchNo;
 	}
@@ -103,4 +105,20 @@ public class OrderSearch extends QueryInfo{
 	public void setSearchDate(String searchDate) {
 		this.searchDate = searchDate;
 	}
+
+	public String getGoodType() {
+		return goodType;
+	}
+
+	public void setGoodType(String goodType) {
+		this.goodType = goodType;
+	}
+
+	public Long getBizId() {
+		return bizId;
+	}
+
+	public void setBizId(Long bizId) {
+		this.bizId = bizId;
+	}
 }

+ 49 - 27
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/UserOrderPayment.java

@@ -5,7 +5,7 @@ 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.PayChannelEnum;
-import com.yonge.cooleshow.biz.dal.enums.PayStatusEnum;
+import com.yonge.cooleshow.biz.dal.enums.TradeStatusEnum;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 
@@ -44,7 +44,7 @@ public class UserOrderPayment implements Serializable {
     private String payInfo;
     @ApiModelProperty("交易状态 pending 交易处理中 succeeded 交易成功 failed 交易失败")
     @TableField(value = "status_")
-    private PayStatusEnum status;
+    private TradeStatusEnum status;
     @ApiModelProperty("失败信息 ")
     @TableField(value = "pay_fail_msg_")
     private String payFailMsg;
@@ -53,6 +53,12 @@ public class UserOrderPayment implements Serializable {
     @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone="GMT+8")
     private Date arrivalTime;
+    @ApiModelProperty("关单状态 pending 交易处理中 succeeded 交易成功 failed 交易失败")
+    @TableField(value = "close_status_")
+    private TradeStatusEnum closeStatus;
+    @ApiModelProperty("关单失败信息 ")
+    @TableField(value = "close_fail_msg_")
+    private String closeFailMsg;
     @ApiModelProperty("创建时间 ")
     @TableField(value = "create_time_")
     @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@@ -64,23 +70,23 @@ public class UserOrderPayment 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 String getTransNo() {
+
+    public String getTransNo() {
         return transNo;
     }
 
@@ -103,8 +109,16 @@ public class UserOrderPayment implements Serializable {
     public void setPayAmt(BigDecimal payAmt) {
         this.payAmt = payAmt;
     }
-    
-	public String getPayInfo() {
+
+    public BigDecimal getFeeAmt() {
+        return feeAmt;
+    }
+
+    public void setFeeAmt(BigDecimal feeAmt) {
+        this.feeAmt = feeAmt;
+    }
+
+    public String getPayInfo() {
         return payInfo;
     }
 
@@ -112,14 +126,22 @@ public class UserOrderPayment implements Serializable {
         this.payInfo = payInfo;
     }
 
-    public PayStatusEnum getStatus() {
+    public TradeStatusEnum getStatus() {
         return status;
     }
 
-    public void setStatus(PayStatusEnum status) {
+    public void setStatus(TradeStatusEnum status) {
         this.status = status;
     }
 
+    public String getPayFailMsg() {
+        return payFailMsg;
+    }
+
+    public void setPayFailMsg(String payFailMsg) {
+        this.payFailMsg = payFailMsg;
+    }
+
     public Date getArrivalTime() {
         return arrivalTime;
     }
@@ -128,35 +150,35 @@ public class UserOrderPayment implements Serializable {
         this.arrivalTime = arrivalTime;
     }
 
-    public Date getCreateTime() {
-        return createTime;
+    public TradeStatusEnum getCloseStatus() {
+        return closeStatus;
     }
 
-    public void setCreateTime(Date createTime) {
-        this.createTime = createTime;
+    public void setCloseStatus(TradeStatusEnum closeStatus) {
+        this.closeStatus = closeStatus;
     }
 
-    public Date getUpdateTime() {
-        return updateTime;
+    public String getCloseFailMsg() {
+        return closeFailMsg;
     }
 
-    public void setUpdateTime(Date updateTime) {
-        this.updateTime = updateTime;
+    public void setCloseFailMsg(String closeFailMsg) {
+        this.closeFailMsg = closeFailMsg;
     }
 
-    public BigDecimal getFeeAmt() {
-        return feeAmt;
+    public Date getCreateTime() {
+        return createTime;
     }
 
-    public void setFeeAmt(BigDecimal feeAmt) {
-        this.feeAmt = feeAmt;
+    public void setCreateTime(Date createTime) {
+        this.createTime = createTime;
     }
 
-    public String getPayFailMsg() {
-        return payFailMsg;
+    public Date getUpdateTime() {
+        return updateTime;
     }
 
-    public void setPayFailMsg(String payFailMsg) {
-        this.payFailMsg = payFailMsg;
+    public void setUpdateTime(Date updateTime) {
+        this.updateTime = updateTime;
     }
 }

+ 0 - 1
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/UserWithdrawal.java

@@ -67,7 +67,6 @@ public class UserWithdrawal implements Serializable {
     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone="GMT+8")
     private Date updateTime;
 
-
 	public Long getId() {
         return id;
     }

+ 2 - 2
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/enums/PayStatusEnum.java → cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/enums/TradeStatusEnum.java

@@ -8,7 +8,7 @@ import com.yonge.cooleshow.common.enums.BaseEnum;
  * @Author: liweifan
  * @Data: 2022/3/31 14:59
  */
-public enum PayStatusEnum implements BaseEnum<String, PayStatusEnum> {
+public enum TradeStatusEnum implements BaseEnum<String, TradeStatusEnum> {
     pending("pending","交易处理中"),
     succeeded("succeeded","交易成功"),
     failed("failed","交易失败")
@@ -17,7 +17,7 @@ public enum PayStatusEnum implements BaseEnum<String, PayStatusEnum> {
     private String code;
     private String msg;
 
-    PayStatusEnum(String code, String msg) {
+    TradeStatusEnum(String code, String msg) {
         this.code = code;
         this.msg = msg;
     }

+ 1 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/props/HuifuProperties.java

@@ -107,4 +107,5 @@ public class HuifuProperties {
     public void setNotifyUrl(String notifyUrl) {
         this.notifyUrl = notifyUrl;
     }
+
 }

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

@@ -18,6 +18,7 @@ import com.yonge.toolset.utils.string.StringUtil;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.stereotype.Component;
+import org.springframework.util.CollectionUtils;
 
 import java.util.*;
 
@@ -50,7 +51,7 @@ public class PaymentSdk {
         } catch (BaseAdaPayException e) {
             return HttpResponseResult.failed(e.getMessage());
         }
-        if (null == res) {
+        if (CollectionUtils.isEmpty(res)) {
             return HttpResponseResult.failed("请求失败");
         }
         log.info("汇付[创建支付对象] Resp:{}", res);
@@ -87,21 +88,29 @@ public class PaymentSdk {
      * @return 关闭的支付对象
      * @throws Exception 异常
      */
-    public Map<String, Object> closePayment(String paymentId) throws Exception {
-        Map<String, Object> payment = new HashMap<>();
+    public HttpResponseResult<Map<String, Object>> closePayment(String paymentId, String reason, String expend) {
         Map<String, Object> paymentParams = new HashMap<>(10);
         paymentParams.put("payment_id", paymentId);
-        paymentParams.put("reason", "reason");
-        paymentParams.put("expend", "expend");
-        paymentParams.put("notify_url", "notify_url");
-        payment = com.huifu.adapay.model.Payment.close(paymentParams);
+        paymentParams.put("reason", reason);
+        paymentParams.put("expend", expend);
+        paymentParams.put("notify_url", HuifuConfiguration.getHuifuProperties().getNotifyUrl());
 
-        String error_code = (String) payment.get("error_code");
-        if (null != error_code) {
-            String errorMsg = (String) payment.get("error_msg");
-            throw new ThirdpartyException(errorMsg);
+        Map<String, Object> res;
+        try {
+            res = Payment.close(paymentParams);
+        } catch (BaseAdaPayException e) {
+            return HttpResponseResult.failed(e.getMessage());
         }
-        return payment;
+        if (CollectionUtils.isEmpty(res)) {
+            return HttpResponseResult.failed("请求失败");
+        }
+        log.info("汇付[创建支付对象] Resp:{}", res);
+        String errorCode = (String) res.get("error_code");
+        if (null != errorCode) {
+            String errorMsg = (String) res.get("error_msg");
+            return HttpResponseResult.failed(errorMsg);
+        }
+        return HttpResponseResult.succeed(res);
     }
 
     /**
@@ -133,6 +142,7 @@ public class PaymentSdk {
         System.out.println("=======query payment end=======");
         return payment;
     }
+
     /***
      * 获取openId
      * @author liweifan
@@ -153,12 +163,12 @@ public class PaymentSdk {
             JSONObject jsonObject = JSONObject.parseObject(res);
             log.info("微信[获取用户openId] Res:{}", jsonObject.toJSONString());
             String errcode = jsonObject.getString("errcode");
-            if(StringUtil.isEmpty(errcode) || "0".equals(errcode)){
+            if (StringUtil.isEmpty(errcode) || "0".equals(errcode)) {
                 Map<String, String> resMap = new HashMap<>();
                 resMap.put("openid", jsonObject.getString("openid"));
                 resMap.put("session_key", jsonObject.getString("session_key"));
                 return HttpResponseResult.succeed(resMap);
-            }else{
+            } else {
                 return HttpResponseResult.failed(jsonObject.getString("errmsg"));
             }
         } catch (Exception e) {

+ 8 - 1
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/UserOrderPaymentService.java

@@ -18,5 +18,12 @@ public interface UserOrderPaymentService extends IService<UserOrderPayment> {
      * @return: com.yonge.cooleshow.biz.dal.entity.UserOrderPayment
      */
     UserOrderPayment detailByOrderNo(String orderNo);
-
+    /***
+     * 通过交易流水号查询付款单
+     * @author liweifan
+     * @param: orderNo
+     * @updateTime 2022/4/13 16:09
+     * @return: com.yonge.cooleshow.biz.dal.entity.UserOrderPayment
+     */
+    UserOrderPayment detailByTransNo(String transNo);
 }

+ 91 - 63
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/UserOrderService.java

@@ -14,54 +14,72 @@ import java.util.List;
 
 /**
  * 平台订单表 服务类
+ *
  * @author liweifan
  * @date 2022-03-30
  */
-public interface UserOrderService extends IService<UserOrder>  {
+public interface UserOrderService extends IService<UserOrder> {
 
-	/**
+    /**
      * 查询详情 通过订单id
+     *
      * @author liweifan
- 	 * @date 2022-03-30
+     * @date 2022-03-30
      */
-	UserOrderVo detail(Long id);
-	/**
-	 * 查询详情 通过订单号
-	 * @author liweifan
-	 * @date 2022-03-30
-	 */
-	UserOrderVo detail(String orderNo);
-	/**
+    UserOrderVo detail(Long id);
+
+    /**
+     * 查询详情 通过订单号
+     *
+     * @author liweifan
+     * @date 2022-03-30
+     */
+    UserOrderVo detail(String orderNo);
+
+    /**
      * 分页查询
+     *
      * @author liweifan
- 	 * @date 2022-03-30
+     * @date 2022-03-30
      */
     IPage<UserOrderVo> selectPage(IPage<UserOrderVo> page, OrderSearch query);
-	/***
-	 * 查询集合
-	 * @author liweifan
-	 * @param: query
-	 * @updateTime 2022/4/15 15:05
-	 * @return: java.util.List<com.yonge.cooleshow.biz.dal.vo.UserOrderVo>
-	 */
-	List<UserOrderVo> selectList(OrderSearch query);
 
-	/***
-	 * 下单接口
-	 * @author liweifan
-	 * @param: orderReq
-	 * @updateTime 2022/3/31 15:42
-	 * @return: com.yonge.cooleshow.common.entity.HttpResponseResult<com.yonge.cooleshow.biz.dal.entity.Order>
-	 */
+    /***
+     * 查询集合
+     * @author liweifan
+     * @param: query
+     * @updateTime 2022/4/15 15:05
+     * @return: java.util.List<com.yonge.cooleshow.biz.dal.vo.UserOrderVo>
+     */
+    List<UserOrderVo> selectList(OrderSearch query);
+
+    /***
+     * 下单接口
+     * @author liweifan
+     * @param: orderReq
+     * @updateTime 2022/3/31 15:42
+     * @return: com.yonge.cooleshow.common.entity.HttpResponseResult<com.yonge.cooleshow.biz.dal.entity.Order>
+     */
     HttpResponseResult<UserOrder> executeOrder(OrderReq orderReq);
-	/***
-	 * 订单付款
-	 * @author liweifan
-	 * @param: payReq
-	 * @updateTime 2022/3/31 17:23
-	 * @return: com.yonge.cooleshow.common.entity.HttpResponseResult
-	 */
+
+    /***
+     * 订单付款
+     * @author liweifan
+     * @param: payReq
+     * @updateTime 2022/3/31 17:23
+     * @return: com.yonge.cooleshow.common.entity.HttpResponseResult
+     */
     HttpResponseResult<OrderPayRes> orderPay(OrderPayReq payReq);
+
+    /***
+     * 通过业务id查询用户正在交易中的订单
+     * @author liweifan
+     * @param: query
+     * @updateTime 2022/4/27 16:56
+     * @return: com.yonge.cooleshow.common.entity.HttpResponseResult<com.yonge.cooleshow.biz.dal.vo.UserOrderVo>
+     */
+    HttpResponseResult<UserOrderVo> getPendingOrder(OrderSearch query);
+
     /***
      * 支付中订单付款
      * @author liweifan
@@ -69,34 +87,44 @@ public interface UserOrderService extends IService<UserOrder>  {
      * @updateTime 2022/4/21 19:32
      * @return: com.yonge.cooleshow.common.entity.HttpResponseResult<com.yonge.cooleshow.biz.dal.vo.res.OrderPayRes>
      */
-	HttpResponseResult<OrderPayRes> orderPaytoPaying(OrderPayReq payReq);
-	/***
-	 * 用户付款回调
-	 * @author liweifan
-	 * @param: data
-	 * @updateTime 2022/4/8 18:24
-	 */
-	void orderCallback(String data);
-	/***
-	 * 轮询用户订单
-	 * @author liweifan
-	 * @updateTime 2022/4/13 16:27
-	 */
+    HttpResponseResult<OrderPayRes> orderPaytoPaying(OrderPayReq payReq);
+
+    /***
+     * 用户付款回调
+     * @author liweifan
+     * @param: data
+     * @updateTime 2022/4/8 18:24
+     */
+    void orderCallback(String data, String type);
+
+    /***
+     * 轮询用户订单
+     * @author liweifan
+     * @updateTime 2022/4/13 16:27
+     */
     void pollingOrder();
-	/***
-	 * app查询订单详情
-	 * @author liweifan
-	 * @param: orderNo
-	 * @updateTime 2022/4/24 17:49
-	 * @return: com.yonge.cooleshow.biz.dal.vo.UserOrderVo
-	 */
-	UserOrderVo detailApp(UserOrder param);
-	/***
-	 * 取消订单
-	 * @author liweifan
-	 * @param: payReq
-	 * @updateTime 2022/4/21 19:39
-	 * @return: com.yonge.cooleshow.common.entity.HttpResponseResult<java.lang.Boolean>
-	 */
-	HttpResponseResult<Boolean> orderCancel(OrderPayReq payReq);
+
+    /***
+     * app查询订单详情
+     * @author liweifan
+     * @param: orderNo
+     * @updateTime 2022/4/24 17:49
+     * @return: com.yonge.cooleshow.biz.dal.vo.UserOrderVo
+     */
+    UserOrderVo detailApp(UserOrder param);
+
+    /***
+     * 取消订单
+     * @author liweifan
+     * @param: payReq
+     * @updateTime 2022/4/21 19:39
+     * @return: com.yonge.cooleshow.common.entity.HttpResponseResult<java.lang.Boolean>
+     */
+    HttpResponseResult<Boolean> orderCancel(OrderPayReq payReq);
+    /***
+     * 完成所有订单
+     * @author liweifan
+     * @updateTime 2022/4/27 17:38
+     */
+    void setSuccessStatus();
 }

+ 18 - 18
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/UserAccountServiceImpl.java

@@ -90,23 +90,23 @@ public class UserAccountServiceImpl extends ServiceImpl<UserAccountDao, UserAcco
         AccountTotal total = new AccountTotal();
 
         total.setTotalInAmount(practiceAmount.add(liveAmount).add(musicAmount));
-        total.setPracticeAmount(practiceAmount);
-        BigDecimal practiceRate = total.getPracticeAmount()
-                .divide(total.getTotalInAmount(), 4, RoundingMode.HALF_UP).multiply(new BigDecimal("100"));
-        total.setPracticeRate(practiceRate);
-
-        total.setLiveAmount(liveAmount);
-        BigDecimal liveRate = total.getLiveAmount()
-                .divide(total.getTotalInAmount(), 4, RoundingMode.HALF_UP).multiply(new BigDecimal("100"));
-        total.setLiveRate(liveRate);
-
-        total.setMusicAmount(musicAmount);
-        BigDecimal musicRate = total.getMusicAmount()
-                .divide(total.getTotalInAmount(), 4, RoundingMode.HALF_UP).multiply(new BigDecimal("100"));
-        total.setMusicRate(musicRate);
-
+        if (!BigDecimal.ZERO.equals(total.getTotalInAmount())) {
+            total.setPracticeAmount(practiceAmount);
+            BigDecimal practiceRate = total.getPracticeAmount()
+                    .divide(total.getTotalInAmount(), 4, RoundingMode.HALF_UP).multiply(new BigDecimal("100"));
+            total.setPracticeRate(practiceRate);
+
+            total.setLiveAmount(liveAmount);
+            BigDecimal liveRate = total.getLiveAmount()
+                    .divide(total.getTotalInAmount(), 4, RoundingMode.HALF_UP).multiply(new BigDecimal("100"));
+            total.setLiveRate(liveRate);
+
+            total.setMusicAmount(musicAmount);
+            BigDecimal musicRate = total.getMusicAmount()
+                    .divide(total.getTotalInAmount(), 4, RoundingMode.HALF_UP).multiply(new BigDecimal("100"));
+            total.setMusicRate(musicRate);
+        }
         total.setInfoList(infoList);
-
         return HttpResponseResult.succeed(total);
     }
 
@@ -117,7 +117,7 @@ public class UserAccountServiceImpl extends ServiceImpl<UserAccountDao, UserAcco
             baseMapper.frozenDeductChangeAccount(accountRecordDto.getUserId(), accountRecordDto.getTransAmount(), accountRecordDto.getInOrOut().getCode());
         } else if (FrozenTypeEnum.FROZEN_BACK.equals(accountRecordDto.getFrozenType())) {
             baseMapper.frozenBackChangeAccount(accountRecordDto.getUserId(), accountRecordDto.getTransAmount(), accountRecordDto.getInOrOut().getCode());
-        }  else {
+        } else {
             baseMapper.changeAccount(accountRecordDto.getUserId(), accountRecordDto.getTransAmount(), accountRecordDto.getInOrOut().getCode());
         }
 
@@ -126,7 +126,7 @@ public class UserAccountServiceImpl extends ServiceImpl<UserAccountDao, UserAcco
                 || detail.getAmountUsable().doubleValue() < 0 || detail.getAmountFrozen().doubleValue() < 0) {
             throw new BizException("账户变更失败");
         }
-        if(accountRecordDto.getSaveRecord()){
+        if (accountRecordDto.getSaveRecord()) {
             //插入账户变更记录
             accountRecordDto.setAccountId(accountRecordDto.getUserId());
             accountRecordDto.setAccountBalance(detail.getAmountUsable());

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

@@ -14,6 +14,12 @@ public class UserOrderPaymentServiceImpl extends ServiceImpl<UserOrderPaymentDao
     @Override
     public UserOrderPayment detailByOrderNo(String orderNo) {
         return baseMapper.selectOne(Wrappers.<UserOrderPayment>lambdaQuery()
-                .eq(UserOrderPayment::getOrderNo,orderNo));
+                .eq(UserOrderPayment::getOrderNo, orderNo));
+    }
+
+    @Override
+    public UserOrderPayment detailByTransNo(String transNo) {
+        return baseMapper.selectOne(Wrappers.<UserOrderPayment>lambdaQuery()
+                .eq(UserOrderPayment::getTransNo, transNo));
     }
 }

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

@@ -4,7 +4,6 @@ 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.entity.StudentTime;
 import com.yonge.cooleshow.biz.dal.enums.*;
 import com.yonge.cooleshow.biz.dal.vo.UserOrderDetailVo;
 import com.yonge.cooleshow.common.constant.SysConfigConstant;
@@ -22,6 +21,7 @@ import com.yonge.cooleshow.biz.dal.vo.res.OrderPayRes;
 import com.yonge.cooleshow.common.entity.HttpResponseResult;
 import com.yonge.cooleshow.common.exception.BizException;
 import com.yonge.cooleshow.common.service.IdGeneratorService;
+import com.yonge.toolset.utils.string.StringUtil;
 import org.apache.commons.beanutils.BeanUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -88,14 +88,14 @@ public class UserOrderServiceImpl extends ServiceImpl<UserOrderDao, UserOrder> i
         orderCreate.put(GoodTypeEnum.VIDEO, recordService::buyVideoCourse);
 
         //曲目购买
-        orderCreate.put(GoodTypeEnum.MUSIC,musicSheetService::buyMusicSheetCheck);
+        orderCreate.put(GoodTypeEnum.MUSIC, musicSheetService::buyMusicSheetCheck);
 
 
         /**********订单生成后******************/
 
 
         //曲目购买
-        orderAfter.put(GoodTypeEnum.MUSIC,musicSheetService::orderAfterSheet);
+        orderAfter.put(GoodTypeEnum.MUSIC, musicSheetService::orderAfterSheet);
 
         /**********订单完成后******************/
         //vip开通缴费
@@ -110,7 +110,7 @@ public class UserOrderServiceImpl extends ServiceImpl<UserOrderDao, UserOrder> i
 
 
         //曲目购买
-        orderSuccess.put(GoodTypeEnum.MUSIC,musicSheetService::buyMusicSheetSuccess);
+        orderSuccess.put(GoodTypeEnum.MUSIC, musicSheetService::buyMusicSheetSuccess);
 
         /**********订单取消后******************/
         //陪练课购买
@@ -121,7 +121,7 @@ public class UserOrderServiceImpl extends ServiceImpl<UserOrderDao, UserOrder> i
         orderCancel.put(GoodTypeEnum.LIVE, courseGroupService::buyLiveCourseCancel);
 
         // 曲目购买
-        orderCancel.put(GoodTypeEnum.MUSIC,musicSheetService::buyMusicSheetCancel);
+        orderCancel.put(GoodTypeEnum.MUSIC, musicSheetService::buyMusicSheetCancel);
     }
 
     @Override
@@ -145,6 +145,8 @@ public class UserOrderServiceImpl extends ServiceImpl<UserOrderDao, UserOrder> i
     @Override
     public UserOrderVo detailApp(UserOrder param) {
         UserOrderVo userOrderVo = baseMapper.detailApp(param);
+        userOrderVo.setFeeAmt(null);
+        userOrderVo.setPlantformFee(null);
         if (null != userOrderVo) {
             List<UserOrderDetailVo> orderDetilList = orderDetailService.getOrderDetilListByOrderNo(userOrderVo.getOrderNo());
             orderDetilList.forEach(o -> {
@@ -159,11 +161,24 @@ public class UserOrderServiceImpl extends ServiceImpl<UserOrderDao, UserOrder> i
     @Override
     public HttpResponseResult<Boolean> orderCancel(OrderPayReq payReq) {
         UserOrderVo detail = detail(payReq.getOrderNo());
-        orderCancel(detail);
+        if (null == detail) {
+            return HttpResponseResult.failed("未找到订单信息");
+        }
+        doOrderCancel(detail, OrderStatusEnum.CLOSE, StringUtil.isEmpty(payReq.getReason()) ? "用户取消订单" : payReq.getReason());
         return HttpResponseResult.succeed(true);
     }
 
     @Override
+    public void setSuccessStatus() {
+        OrderSearch query = new OrderSearch();
+        query.setStatus("WAIT_PAY,PAYING");
+        List<UserOrderVo> userOrderVos = selectList(query);
+        for(UserOrderVo userOrderVo : userOrderVos){
+            orderSuccess(userOrderVo);
+        }
+    }
+
+    @Override
     public IPage<UserOrderVo> selectPage(IPage<UserOrderVo> page, OrderSearch query) {
         return page.setRecords(baseMapper.selectPage(page, query));
     }
@@ -237,6 +252,15 @@ public class UserOrderServiceImpl extends ServiceImpl<UserOrderDao, UserOrder> i
     }
 
     @Override
+    public HttpResponseResult<UserOrderVo> getPendingOrder(OrderSearch query) {
+        UserOrderVo userOrderVo = baseMapper.getPendingOrder(query);
+        if (null != userOrderVo) {
+            userOrderVo.setOrderDetailList(orderDetailService.getOrderDetilListByOrderNo(userOrderVo.getOrderNo()));
+        }
+        return HttpResponseResult.succeed(userOrderVo);
+    }
+
+    @Override
     public HttpResponseResult<OrderPayRes> orderPaytoPaying(OrderPayReq payReq) {
         //查询订单
         UserOrderVo detail = detail(payReq.getOrderNo());
@@ -248,25 +272,108 @@ public class UserOrderServiceImpl extends ServiceImpl<UserOrderDao, UserOrder> i
     }
 
     @Override
-    public void orderCallback(String data) {
+    public void orderCallback(String data, String type) {
         JSONObject hfRes = JSONObject.parseObject(data);
-        if (PayStatusEnum.succeeded.getCode().equals(hfRes.getString("status"))) {
-            //订单完成
-            UserOrderVo detail = detail(hfRes.getString("order_no"));
-            if (null == detail) {
-                log.error("汇付支付回调,订单未找到。 req is {}", data);
+        if (type.equals("payment.succeeded")) {//支付成功
+            paymentSucceededHandle(hfRes);
+        } else if (type.equals("payment.failed")) {//支付失败
+            paymentFailedHandle(hfRes);
+        } else if (type.equals("payment.close.succeeded")) {//支付关单成功
+            paymentCloseSucceededHandle(hfRes);
+        } else if (type.equals("payment.close.failed")) {//支付关单失败
+            paymentCloseFailedHandle(hfRes);
+        }
+    }
+
+
+    /***
+     * 处理回调-支付成功
+     * @author liweifan
+     * @param: hfRes
+     * @updateTime 2022/4/27 15:09
+     */
+    private void paymentSucceededHandle(JSONObject hfRes) {
+        //订单完成
+        UserOrderVo detail = detail(hfRes.getString("order_no"));
+        if (null == detail) {
+            log.error("汇付支付回调,订单未找到。 req is {}", hfRes.toJSONString());
+            return;
+        }
+        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 {}", hfRes.toJSONString());
+        }
+    }
+
+    /***
+     * 处理回调-支付失败
+     * @author liweifan
+     * @param: hfRes
+     * @updateTime 2022/4/27 15:09
+     */
+    private void paymentFailedHandle(JSONObject hfRes) {
+        //订单完成
+        UserOrderVo detail = detail(hfRes.getString("order_no"));
+
+        if (null == detail) {
+            log.error("汇付支付回调,订单未找到。 req is {}", hfRes.toJSONString());
+            return;
+        }
+        if (!detail.getStatus().equals(OrderStatusEnum.PAID)
+                && !detail.getStatus().equals(OrderStatusEnum.WAIT_PAY)
+                && !detail.getStatus().equals(OrderStatusEnum.CLOSE)) {
+
+            doOrderCancel(detail, OrderStatusEnum.FAIL, "支付失败");
+            //查询
+            UserOrderPayment orderPayment = orderPaymentService.detailByOrderNo(hfRes.getString("order_no"));
+            if (null == orderPayment) {
                 return;
             }
-            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);
-            }
+            orderPayment.setPayFailMsg("支付回调失败");
+            orderPayment.setStatus(TradeStatusEnum.failed);
+            orderPayment.setUpdateTime(new Date());
+            orderPaymentService.updateById(orderPayment);
+        } else {
+            log.error("汇付支付回调,订单状态异常。 req is {}", hfRes.toJSONString());
         }
     }
 
+    /***
+     * 支付关单成功
+     * @author liweifan
+     * @param: hfRes
+     * @updateTime 2022/4/27 15:33
+     */
+    private void paymentCloseSucceededHandle(JSONObject hfRes) {
+        UserOrderPayment orderPayment = orderPaymentService.detailByTransNo(hfRes.getString("payment_id"));
+        if (null == orderPayment) {
+            return;
+        }
+        orderPayment.setStatus(TradeStatusEnum.succeeded);
+        orderPayment.setUpdateTime(new Date());
+        orderPaymentService.updateById(orderPayment);
+    }
+
+    /***
+     * 支付关单失败
+     * @author liweifan
+     * @param: hfRes
+     * @updateTime 2022/4/27 15:33
+     */
+    private void paymentCloseFailedHandle(JSONObject hfRes) {
+        UserOrderPayment orderPayment = orderPaymentService.detailByTransNo(hfRes.getString("payment_id"));
+        if (null == orderPayment) {
+            return;
+        }
+        orderPayment.setStatus(TradeStatusEnum.failed);
+        orderPayment.setPayFailMsg("支付关单回调失败-" + hfRes.getString("error_msg"));
+        orderPayment.setUpdateTime(new Date());
+        orderPaymentService.updateById(orderPayment);
+    }
+
     @Override
     public void pollingOrder() {
         //WAIT_PAY状态的订单,半个小时自动关闭
@@ -275,7 +382,7 @@ public class UserOrderServiceImpl extends ServiceImpl<UserOrderDao, UserOrder> i
         for (UserOrderVo userOrder : orderList) {
             //待支付订单直接取消
             if (OrderStatusEnum.WAIT_PAY.equals(userOrder.getStatus())) {
-                waitPayOrderHandle(userOrder);
+                doOrderCancel(userOrder, OrderStatusEnum.CLOSE, "订单超时");
             }
             if (OrderStatusEnum.PAYING.equals(userOrder.getStatus())) {
                 payingOrderHandle(userOrder);
@@ -284,16 +391,6 @@ public class UserOrderServiceImpl extends ServiceImpl<UserOrderDao, UserOrder> i
     }
 
     /***
-     * 处理待支付订单
-     * @author liweifan
-     * @param: userOrder
-     * @updateTime 2022/4/13 16:51
-     */
-    private void waitPayOrderHandle(UserOrderVo userOrder) {
-        orderCancel(userOrder);
-    }
-
-    /***
      * 处理支付中订单
      * @author liweifan
      * @param: userOrder
@@ -309,10 +406,11 @@ public class UserOrderServiceImpl extends ServiceImpl<UserOrderDao, UserOrder> i
         try {
             Map<String, Object> resMap = paymentSdk.queryPayment(orderPayment.getTransNo());
             //支付成功
-            if (PayStatusEnum.succeeded.getCode().equals(resMap.get("status").toString())) {
+            if (TradeStatusEnum.succeeded.getCode().equals(resMap.get("status").toString())) {
                 orderSuccess(userOrder);
             } else {
-                orderCancel(userOrder);
+                //关闭订单
+                doOrderCancel(userOrder, OrderStatusEnum.CLOSE, "订单超时");
             }
         } catch (Exception e) {
             e.printStackTrace();
@@ -363,9 +461,8 @@ public class UserOrderServiceImpl extends ServiceImpl<UserOrderDao, UserOrder> i
             return HttpResponseResult.succeed(orderPayRes);
         } else {
             //入订单付款表,同时修改订单状态
-            orderCancel(detail);
+            doOrderCancel(detail, OrderStatusEnum.FAIL, "订单超时");
             errOrderPayment(responseResult, payReq);
-            baseMapper.updateStatusByOrderNo(payReq.getOrderNo(), OrderStatusEnum.FAIL.getCode());
             return HttpResponseResult.failed(responseResult.getMsg());
         }
 
@@ -391,10 +488,10 @@ public class UserOrderServiceImpl extends ServiceImpl<UserOrderDao, UserOrder> i
             );
             String pay_info = ((JSONObject) res.get("expend")).getString("pay_info");
             orderPayment.setPayInfo(pay_info);
-            orderPayment.setStatus(PayStatusEnum.pending);
+            orderPayment.setStatus(TradeStatusEnum.pending);
         } else {
             orderPayment.setPayFailMsg(responseResult.getMsg());
-            orderPayment.setStatus(PayStatusEnum.failed);
+            orderPayment.setStatus(TradeStatusEnum.failed);
         }
         orderPaymentService.save(orderPayment);
         return orderPayment;
@@ -417,7 +514,7 @@ public class UserOrderServiceImpl extends ServiceImpl<UserOrderDao, UserOrder> i
             orderPayment.setPayChannel(payReq.getPayChannel());
         }
         orderPayment.setPayFailMsg(responseResult.getMsg());
-        orderPayment.setStatus(PayStatusEnum.failed);
+        orderPayment.setStatus(TradeStatusEnum.failed);
         orderPayment.setUpdateTime(new Date());
 
         orderPaymentService.saveOrUpdate(orderPayment);
@@ -434,7 +531,7 @@ public class UserOrderServiceImpl extends ServiceImpl<UserOrderDao, UserOrder> i
      */
     private HttpResponseResult<OrderPayRes> orderPayPaying(OrderPayReq payReq, UserOrderVo detail) {
         UserOrderPayment orderPayment = orderPaymentService.detailByOrderNo(payReq.getOrderNo());
-        if (PayStatusEnum.pending.equals(orderPayment.getStatus())) {
+        if (TradeStatusEnum.pending.equals(orderPayment.getStatus())) {
             OrderPayRes orderPayRes = new OrderPayRes();
             orderPayRes.setPay_info(orderPayment.getPayInfo());
             orderPayRes.setPay_amt(orderPayment.getPayAmt().toString());
@@ -601,18 +698,35 @@ public class UserOrderServiceImpl extends ServiceImpl<UserOrderDao, UserOrder> i
      * @updateTime 2022/4/13 17:23
      */
     @Transactional(rollbackFor = Exception.class)
-    void orderCancel(UserOrderVo userOrder) {
-        userOrder.setStatus(OrderStatusEnum.CLOSE);
-        userOrder.setUpdateTime(new Date());
-        baseMapper.updateById(userOrder);
+    void doOrderCancel(UserOrderVo userOrder, OrderStatusEnum orderStatus, String reason) {
+        //已经取消过的订单,不能再取消
+        if (OrderStatusEnum.CLOSE.equals(userOrder.getStatus())
+                || OrderStatusEnum.FAIL.equals(userOrder.getStatus())) {
+            return;
+        }
+        //状态只能是关闭和失败
+        if (!OrderStatusEnum.CLOSE.equals(orderStatus)
+                && !OrderStatusEnum.FAIL.equals(orderStatus)) {
+            return;
+        }
 
         UserOrderPayment orderPayment = orderPaymentService.detailByOrderNo(userOrder.getOrderNo());
         if (null != orderPayment) {
             //更新付款单
-            orderPayment.setStatus(PayStatusEnum.failed);
-            orderPayment.setPayFailMsg("交易取消");
+            orderPayment.setStatus(TradeStatusEnum.failed);
+            orderPayment.setPayFailMsg(StringUtil.isEmpty(reason) ? "交易取消" : reason);
             orderPayment.setUpdateTime(new Date());
-            orderPaymentService.updateById(orderPayment);
+            //发送支付关单请求
+            HttpResponseResult<Map<String, Object>> responseResult = paymentSdk.closePayment(userOrder.getTransNo(), reason, "");
+            if (!responseResult.getStatus()) {
+                orderPayment.setCloseStatus(TradeStatusEnum.failed);
+                orderPayment.setCloseFailMsg(responseResult.getMsg());
+                orderPaymentService.updateById(orderPayment);
+                return;
+            } else {
+                orderPayment.setCloseStatus(TradeStatusEnum.pending);
+                orderPaymentService.updateById(orderPayment);
+            }
         }
         List<UserOrderDetailVo> orderDetailList = orderDetailService.getOrderDetilListByOrderNo(userOrder.getOrderNo());
         for (UserOrderDetailVo orderDetailVo : orderDetailList) {
@@ -624,6 +738,10 @@ public class UserOrderServiceImpl extends ServiceImpl<UserOrderDao, UserOrder> i
                 userOrderVoConsumer.accept(orderDetailVo);
             }
         }
+
+        userOrder.setStatus(orderStatus);
+        userOrder.setUpdateTime(new Date());
+        baseMapper.updateById(userOrder);
     }
 
     void orderSuccess(UserOrderVo detail) {
@@ -646,22 +764,21 @@ public class UserOrderServiceImpl extends ServiceImpl<UserOrderDao, UserOrder> i
         updateById(detail);
         //更新付款单
         UserOrderPayment orderPayment = orderPaymentService.detailByOrderNo(detail.getOrderNo());
-        orderPayment.setStatus(PayStatusEnum.succeeded);
-        orderPayment.setArrivalTime(now);
-        orderPayment.setUpdateTime(now);
-        if (null != hfRes) {
-            try {
-                orderPayment.setPayAmt(new BigDecimal(hfRes.getString("pay_amt")));
-                orderPayment.setFeeAmt(new BigDecimal(hfRes.getString("fee_amt")));
-            } catch (Exception e) {
-                e.printStackTrace();
-                log.error("完成订单,付款单金额格式化失败,参数{}", hfRes.toJSONString());
+        if(null != orderPayment){
+            orderPayment.setStatus(TradeStatusEnum.succeeded);
+            orderPayment.setArrivalTime(now);
+            orderPayment.setUpdateTime(now);
+            if (null != hfRes) {
+                try {
+                    orderPayment.setPayAmt(new BigDecimal(hfRes.getString("pay_amt")));
+                    orderPayment.setFeeAmt(new BigDecimal(hfRes.getString("fee_amt")));
+                } catch (Exception e) {
+                    e.printStackTrace();
+                    log.error("完成订单,付款单金额格式化失败,参数{}", hfRes.toJSONString());
+                }
             }
+            orderPaymentService.updateById(orderPayment);
         }
-        orderPaymentService.updateById(orderPayment);
-
-        //StudentTime studentTime = studentTimeService.getById(detail.getUserId());
-
         List<UserOrderDetailVo> orderDetailList = orderDetailService.getOrderDetilListByOrderNo(detail.getOrderNo());
         for (UserOrderDetailVo orderDetailVo : orderDetailList) {
             orderDetailVo.setUserId(detail.getUserId());
@@ -671,16 +788,6 @@ public class UserOrderServiceImpl extends ServiceImpl<UserOrderDao, UserOrder> i
             if (!Objects.isNull(userOrderVoConsumer)) {
                 userOrderVoConsumer.accept(orderDetailVo);
             }
-            //设置第一次购买时间
-            //studentTimeService.setTimeByGoodType(studentTime,orderDetailVo.getGoodType());
         }
-
-        //记录第一次购买时间
-        /*if(null == studentTime || null == studentTime.getUserId()){
-            studentTime.setUserId(detail.getUserId());
-            studentTimeService.save(studentTime);
-        }else{
-            studentTimeService.updateById(studentTime);
-        }*/
     }
 }

+ 0 - 18
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/HomeTotalVo.java

@@ -1,18 +0,0 @@
-package com.yonge.cooleshow.biz.dal.vo;
-
-import io.swagger.annotations.ApiModel;
-import io.swagger.annotations.ApiModelProperty;
-
-import java.util.List;
-
-/**
- * @Author: liweifan
- * @Data: 2022/3/30 17:53
- */
-public class HomeTotalVo {
-    public static class UserToDoNum{
-
-    }
-
-
-}

+ 7 - 7
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/res/AccountTotal.java

@@ -13,19 +13,19 @@ import java.util.List;
 @ApiModel(value = "AccountTotal", description = "用户账户统计对象")
 public class AccountTotal {
     @ApiModelProperty("总收入")
-    private BigDecimal totalInAmount;
+    private BigDecimal totalInAmount = BigDecimal.ZERO;
     @ApiModelProperty("陪练课")
-    private BigDecimal practiceAmount;
+    private BigDecimal practiceAmount = BigDecimal.ZERO;
     @ApiModelProperty("陪练课-百分比")
-    private BigDecimal practiceRate;
+    private BigDecimal practiceRate = BigDecimal.ZERO;
     @ApiModelProperty("直播课")
-    private BigDecimal liveAmount;
+    private BigDecimal liveAmount = BigDecimal.ZERO;
     @ApiModelProperty("直播课-百分比")
-    private BigDecimal liveRate;
+    private BigDecimal liveRate = BigDecimal.ZERO;
     @ApiModelProperty("乐谱")
-    private BigDecimal musicAmount;
+    private BigDecimal musicAmount = BigDecimal.ZERO;
     @ApiModelProperty("乐谱-百分比")
-    private BigDecimal musicRate;
+    private BigDecimal musicRate = BigDecimal.ZERO;
 
     @ApiModelProperty("时间(详情数据中使用)")
     private String timeStr;

+ 23 - 15
cooleshow-user/user-biz/src/main/resources/config/mybatis/UserOrderMapper.xml

@@ -55,25 +55,11 @@
 
     <select id="detailApp" resultType="com.yonge.cooleshow.biz.dal.vo.UserOrderVo">
         SELECT
-            t.id_ as id
-            , t.order_no_ as orderNo
-            , t.user_id_ as userId
-            , t.order_name_ as orderName
-            , t.order_type_ as orderType
-            , t.order_desc_ as orderDesc
-            , t.status_ as status
-            , t.original_price_ as originalPrice
-            , t.expect_price_ as expectPrice
-            , t.actual_price_ as actualPrice
-            , t.coupon_amount_ as couponAmount
-            , t.user_note_ as userNote
-            , t.pay_time_ as payTime
-            , t.create_time_ as createTime
+            <include refid="baseColumns"/>,
             , p.trans_no_ as transNo
             , p.pay_channel_ as payChannel
         FROM user_order t
         left join user_order_payment p on t.order_no_ = p.order_no_
-        left join sys_user u on t.user_id_ = u.id_
         <where>
             <if test="param.id != null">
                 and t.id_ = #{param.id}
@@ -154,6 +140,28 @@
         where (t.status_ = 'WAIT_PAY' and t.create_time_ &lt;= date_sub(now(), interval 30 minute))
         or ( t.status_ = 'PAYING' and p.create_time_ &lt;= date_sub(now(), interval 120 minute))
     </select>
+    <select id="getPendingOrder" resultType="com.yonge.cooleshow.biz.dal.vo.UserOrderVo">
+        SELECT
+            <include refid="baseColumns"/>,
+            p.trans_no_ as transNo,
+            p.pay_channel_ as payChannel
+        FROM user_order t
+        left join user_order_payment p on t.order_no_ = p.order_no_
+        where t.status_ in ('WAIT_PAY','PAYING')
+        and t.user_id_ = #{param.userId}
+        and exists (
+            select 1 from user_order_detail d where t.order_no_ = d.order_no_
+            and d.good_type_ = #{param.goodType}
+            <choose>
+                <when test="param.goodType != null and param.goodType == 'PRACTICE'">
+                    and d.merch_id_ = #{param.bizId}
+                </when>
+                <otherwise>
+                    and d.biz_id_ = #{param.bizId}
+                </otherwise>
+            </choose>
+        )
+    </select>
 
     <update id="updateStatusByOrderNo">
         update user_order set status_ = #{orderStatus},update_time_ = now() where order_no_ = #{orderNo}

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

@@ -12,6 +12,8 @@
         <result column="status_" property="status" />
         <result column="pay_fail_msg_" property="payFailMsg" />
         <result column="arrival_time_" property="arrivalTime" />
+        <result column="close_status_" property="closeStatus" />
+        <result column="close_fail_msg_" property="closeFailMsg" />
         <result column="create_time_" property="createTime" />
         <result column="update_time_" property="updateTime" />
     </resultMap>
@@ -28,6 +30,8 @@
         , t.status_ as status
         , t.pay_fail_msg_ as payFailMsg
         , t.arrival_time_ as arrivalTime
+        , close_status_ as closeStatus
+        , close_fail_msg_ as closeFailMsg
         , t.create_time_ as createTime
         , t.update_time_ as updateTime
         </sql>

+ 9 - 2
cooleshow-user/user-student/src/main/java/com/yonge/cooleshow/student/controller/PaymentController.java

@@ -3,6 +3,7 @@ package com.yonge.cooleshow.student.controller;
 import com.alibaba.fastjson.JSONObject;
 import com.huifu.adapay.core.AdapayCore;
 import com.huifu.adapay.core.util.AdapaySign;
+import com.huifu.adapay.core.util.StringUtil;
 import com.yonge.cooleshow.auth.api.client.SysUserFeignService;
 import com.yonge.cooleshow.auth.api.entity.SysUser;
 import com.yonge.cooleshow.biz.dal.sdk.PaymentSdk;
@@ -75,15 +76,21 @@ public class PaymentController extends BaseController {
             String data = request.getParameter("data");
             //验签传参sign
             String sign = request.getParameter("sign");
+            //回调业务类型
+            String type = request.getParameter("type");
+            log.info("汇付回调,type is {}, res is {}", type, data);
+            if (StringUtil.isEmpty(type)) {
+                log.error("汇付回调参数异常");
+                return;
+            }
             //验签传参publicKey
             String publicKey = AdapayCore.PUBLIC_KEY;
             //验签
             boolean checkSign = AdapaySign.verifySign(data, sign, publicKey);
-            log.info("汇付回调,res is {}", data);
             if (checkSign) {
                 //验签成功逻辑
                 log.info("验签成功");
-                userOrderService.orderCallback(data);
+                userOrderService.orderCallback(data, type);
             }
         } catch (Exception e) {
             e.printStackTrace();

+ 40 - 1
cooleshow-user/user-student/src/main/java/com/yonge/cooleshow/student/controller/UserOrderController.java

@@ -8,6 +8,7 @@ import com.yonge.cooleshow.biz.dal.dto.req.OrderReq;
 import com.yonge.cooleshow.biz.dal.dto.search.OrderSearch;
 import com.yonge.cooleshow.biz.dal.entity.UserOrder;
 import com.yonge.cooleshow.biz.dal.enums.CacheNameEnum;
+import com.yonge.cooleshow.biz.dal.enums.GoodTypeEnum;
 import com.yonge.cooleshow.biz.dal.service.UserOrderService;
 import com.yonge.cooleshow.biz.dal.support.DistributedLock;
 import com.yonge.cooleshow.biz.dal.support.PageUtil;
@@ -99,10 +100,38 @@ public class UserOrderController extends BaseController {
         }
     }
 
+    @ApiOperation(value = "通过业务id查询用户正在交易中的订单")
+    @PostMapping("/getPendingOrder")
+    @ApiImplicitParams({
+            @ApiImplicitParam(
+                    name = "goodType",
+                    value = "订单类型:  PRACTICE、陪练课购买  LIVE、直播课购买 VIDEO、视频课购买 MUSIC、单曲点播",
+                    paramType = "query", dataType = "String", required = true
+            ),
+            @ApiImplicitParam(
+                    name = "bizId",
+                    value = "业务id 直播课、陪练课购买为课程组id;陪练课为老师id;单曲点播传曲子id",
+                    paramType = "query", dataType = "Long"
+            )
+    })
+    public HttpResponseResult<UserOrderVo> getPendingOrder(@ApiIgnore @RequestBody OrderSearch query) {
+        if (null == query.getGoodType()
+                || (!GoodTypeEnum.VIP.equals(query.getGoodType()) && null == query.getBizId())) {
+            return HttpResponseResult.failed("参数异常");
+        }
+        SysUser user = sysUserFeignService.queryUserInfo();
+        if (user == null || null == user.getId()) {
+            return failed(HttpStatus.FORBIDDEN, "请登录");
+        }
+        query.setUserId(user.getId());
+        return userOrderService.getPendingOrder(query);
+    }
+
     @ApiOperation(value = "取消订单")
     @PostMapping("/orderCancel")
     @ApiImplicitParams({
-            @ApiImplicitParam(name = "orderNo", value = "订单号", paramType = "query", dataType = "String")
+            @ApiImplicitParam(name = "orderNo", value = "订单号", paramType = "query", dataType = "String", required = true),
+            @ApiImplicitParam(name = "reason", value = "取消说明", paramType = "query", dataType = "String")
     })
     public HttpResponseResult<Boolean> orderCancel(@ApiIgnore @RequestBody OrderPayReq payReq, HttpServletRequest request) {
         SysUser user = sysUserFeignService.queryUserInfo();
@@ -204,4 +233,14 @@ public class UserOrderController extends BaseController {
         UserOrderVo detail = userOrderService.detailApp(param);
         return succeed(detail);
     }
+
+    /**
+     * 查询单条
+     */
+    @GetMapping("/setSuccessStatus")
+    @ApiOperation(value = "完成所有订单")
+    public HttpResponseResult<Boolean> setSuccessStatus() {
+        userOrderService.setSuccessStatus();
+        return succeed(true);
+    }
 }