Browse Source

订单修改

weifanli 2 years ago
parent
commit
9b6645943f

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

@@ -49,6 +49,8 @@ public class OrderReq {
         private GoodTypeEnum goodType;
         @ApiModelProperty("商品名称 ")
         private String goodName;
+        @ApiModelProperty(value = "优惠券id")
+        private Long couponId;
         @ApiModelProperty(value = "业务内容")
         private Object bizContent;
 
@@ -91,6 +93,14 @@ public class OrderReq {
         public void setGoodName(String goodName) {
             this.goodName = goodName;
         }
+
+        public Long getCouponId() {
+            return couponId;
+        }
+
+        public void setCouponId(Long couponId) {
+            this.couponId = couponId;
+        }
     }
 
     public Long getUserId() {

+ 22 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/UserOrderDetail.java

@@ -50,6 +50,12 @@ public class UserOrderDetail implements Serializable {
     @ApiModelProperty("预计价格 ")
     @TableField(value = "expect_price_")
     private BigDecimal expectPrice;
+    @ApiModelProperty("实际价格 ")
+    @TableField(value = "actual_price_")
+    private BigDecimal actualPrice;
+    @ApiModelProperty("优惠金额 ")
+    @TableField(value = "coupon_amount_")
+    private BigDecimal couponAmount;
     @ApiModelProperty("商品数量 ")
     @TableField(value = "good_num_")
     private Integer goodNum;
@@ -199,4 +205,20 @@ public class UserOrderDetail implements Serializable {
     public void setUpdateTime(Date updateTime) {
         this.updateTime = updateTime;
     }
+
+    public BigDecimal getActualPrice() {
+        return actualPrice;
+    }
+
+    public void setActualPrice(BigDecimal actualPrice) {
+        this.actualPrice = actualPrice;
+    }
+
+    public BigDecimal getCouponAmount() {
+        return couponAmount;
+    }
+
+    public void setCouponAmount(BigDecimal couponAmount) {
+        this.couponAmount = couponAmount;
+    }
 }

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

@@ -16,7 +16,7 @@ public enum CacheNameEnum implements BaseEnum<String, CacheNameEnum> {
     TEACHER_TOTAL("老师统计缓存"),
     STUDENT_TOTAL("学生统计缓存"),
 
-    LOCK_EXECUTE_ORDER("用户下单锁"),
+    LOCK_EXECUTE_ORDER("用户下单/取消订单锁"),
     LOCK_PAY_ORDER("用户付款锁"),
     LOCK_CHANGE_ACCOUNT("账户变更锁"),
     ;

+ 17 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/UserOrderService.java

@@ -62,6 +62,14 @@ public interface UserOrderService extends IService<UserOrder>  {
 	 * @return: com.yonge.cooleshow.common.entity.HttpResponseResult
 	 */
     HttpResponseResult<OrderPayRes> orderPay(OrderPayReq payReq);
+    /***
+     * 支付中订单付款
+     * @author liweifan
+     * @param: payReq
+     * @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
@@ -77,4 +85,13 @@ public interface UserOrderService extends IService<UserOrder>  {
     void pollingOrder();
 
 	UserOrderVo detailApp(Long id);
+
+	/***
+	 * 取消订单
+	 * @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);
 }

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

@@ -30,6 +30,7 @@ import org.springframework.stereotype.Service;
 import com.yonge.cooleshow.biz.dal.dto.search.OrderSearch;
 import com.yonge.cooleshow.biz.dal.dao.UserOrderDao;
 import org.springframework.transaction.annotation.Transactional;
+import springfox.documentation.spring.web.json.Json;
 
 import javax.annotation.PostConstruct;
 import java.math.BigDecimal;
@@ -129,6 +130,13 @@ public class UserOrderServiceImpl extends ServiceImpl<UserOrderDao, UserOrder> i
     }
 
     @Override
+    public HttpResponseResult<Boolean> orderCancel(OrderPayReq payReq) {
+        UserOrderVo detail = detail(payReq.getOrderNo());
+        orderCancel(detail);
+        return HttpResponseResult.succeed(true);
+    }
+
+    @Override
     public IPage<UserOrderVo> selectPage(IPage<UserOrderVo> page, OrderSearch query) {
         return page.setRecords(baseMapper.selectPage(page, query));
     }
@@ -160,11 +168,16 @@ public class UserOrderServiceImpl extends ServiceImpl<UserOrderDao, UserOrder> i
                 return HttpResponseResult.failed("订单商品信息获取失败");
             }
             createRes.setGoodType(info.getGoodType());
+            //todo 优惠券优惠金额,暂时为0
+            BigDecimal couponAmount = BigDecimal.ZERO;
+            createRes.setActualPrice(createRes.getExpectPrice().subtract(couponAmount).setScale(2, RoundingMode.HALF_UP));
+            createRes.setCouponAmount(couponAmount);
             resList.add(createRes);
         }
 
         //验证成功后,订单入库
         UserOrderVo orderVo = insertOrder(orderNo,orderReq, resList);
+
         List<UserOrderDetailVo> orderDetailList = orderVo.getOrderDetailList();
         for (UserOrderDetailVo orderDetailVo : orderDetailList) {
             orderDetailVo.setUserId(orderReq.getUserId());
@@ -197,6 +210,17 @@ public class UserOrderServiceImpl extends ServiceImpl<UserOrderDao, UserOrder> i
     }
 
     @Override
+    public HttpResponseResult<OrderPayRes> orderPaytoPaying(OrderPayReq payReq) {
+        //查询订单
+        UserOrderVo detail = detail(payReq.getOrderNo());
+        if(OrderStatusEnum.PAYING.equals(detail.getStatus())){
+            //处于付款中状态,需要拉起付款接口返回信息,并且去到汇付
+            return orderPayPaying(payReq, detail);
+        }
+        return HttpResponseResult.failed("订单状态异常");
+    }
+
+    @Override
     public void orderCallback(String data) {
         JSONObject hfRes = JSONObject.parseObject(data);
         if (PayStatusEnum.succeeded.getCode().equals(hfRes.getString("status"))) {
@@ -393,7 +417,7 @@ public class UserOrderServiceImpl extends ServiceImpl<UserOrderDao, UserOrder> i
      */
     private UserOrderVo insertOrder(Long orderNo, OrderReq orderReq, List<OrderCreateRes> resList) {
         UserOrder userOrder = new UserOrder();
-        //订单号生成
+
         userOrder.setOrderNo(Long.toString(orderNo));
         userOrder.setUserId(orderReq.getUserId());
         userOrder.setOrderName(orderReq.getOrderName());
@@ -402,8 +426,11 @@ public class UserOrderServiceImpl extends ServiceImpl<UserOrderDao, UserOrder> i
         userOrder.setStatus(OrderStatusEnum.WAIT_PAY);
         userOrder.setUserNote(orderReq.getUserNote());
         userOrder.setCreateTime(new Date());
+
         userOrder.setOriginalPrice(BigDecimal.ZERO);
         userOrder.setExpectPrice(BigDecimal.ZERO);
+        userOrder.setActualPrice(BigDecimal.ZERO);
+        userOrder.setCouponAmount(BigDecimal.ZERO);
         userOrder.setPlantformFee(BigDecimal.ZERO);
         List<UserOrderDetailVo> orderDetailList = new ArrayList<>();
         for (OrderCreateRes res : resList) {
@@ -431,6 +458,7 @@ public class UserOrderServiceImpl extends ServiceImpl<UserOrderDao, UserOrder> i
             orderReq.getOrderInfos().forEach(o -> {
                 if (o.getGoodType().equals(res.getGoodType())) {
                     orderDetail.setGoodName(o.getGoodName());
+                    orderDetail.setBizContent(JSONObject.toJSONString(o.getBizContent()));
                 }
             });
             orderDetail.setGoodUrl(getGoodUrlByType(res.getGoodType()));
@@ -440,13 +468,16 @@ public class UserOrderServiceImpl extends ServiceImpl<UserOrderDao, UserOrder> i
 
             userOrder.setOriginalPrice(userOrder.getOriginalPrice().add(orderDetail.getOriginalPrice()));
             userOrder.setExpectPrice(userOrder.getExpectPrice().add(orderDetail.getExpectPrice()));
+            userOrder.setActualPrice(userOrder.getActualPrice().add(orderDetail.getActualPrice()));
+            userOrder.setCouponAmount(userOrder.getCouponAmount().add(orderDetail.getCouponAmount()));
             userOrder.setPlantformFee(userOrder.getPlantformFee().add(orderDetail.getPlantformFee()));
         }
 
         //todo 优惠券优惠金额,暂时为0
         BigDecimal couponAmount = BigDecimal.ZERO;
-        userOrder.setActualPrice(userOrder.getExpectPrice().subtract(couponAmount).setScale(2, RoundingMode.HALF_UP));
-        userOrder.setCouponAmount(couponAmount);
+        userOrder.setActualPrice(userOrder.getActualPrice().subtract(couponAmount));
+        userOrder.setCouponAmount(userOrder.getCouponAmount().add(couponAmount));
+
         if (userOrder.getActualPrice().subtract(orderReq.getActualPrice()).abs()
                 .compareTo(new BigDecimal("0.01")) > 0) {
             throw new BizException("交易金额异常");

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

@@ -1,5 +1,6 @@
 package com.yonge.cooleshow.biz.dal.vo.res;
 
+import com.baomidou.mybatisplus.annotation.TableField;
 import com.yonge.cooleshow.biz.dal.enums.GoodTypeEnum;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
@@ -28,6 +29,11 @@ public class OrderCreateRes {
     private BigDecimal originalPrice;
     @ApiModelProperty(value = "预计价格 ")
     private BigDecimal expectPrice;
+    @ApiModelProperty("实际价格 ")
+    private BigDecimal actualPrice;
+    @ApiModelProperty("优惠金额 ")
+    private BigDecimal couponAmount;
+
     @ApiModelProperty(value = "冗余字段,用于传递参数用")
     private Object bizParam;
 
@@ -102,4 +108,20 @@ public class OrderCreateRes {
     public void setBizParam(Object bizParam) {
         this.bizParam = bizParam;
     }
+
+    public BigDecimal getActualPrice() {
+        return actualPrice;
+    }
+
+    public void setActualPrice(BigDecimal actualPrice) {
+        this.actualPrice = actualPrice;
+    }
+
+    public BigDecimal getCouponAmount() {
+        return couponAmount;
+    }
+
+    public void setCouponAmount(BigDecimal couponAmount) {
+        this.couponAmount = couponAmount;
+    }
 }

+ 3 - 2
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/res/OrderPayRes.java

@@ -12,11 +12,12 @@ import io.swagger.annotations.ApiModelProperty;
 public class OrderPayRes {
     @ApiModelProperty("支付金额")
     private String pay_amt;
-    @ApiModelProperty(value = "支付渠道:  alipay 支付宝  wx_lite 微信 ", required = true)
-    private PayChannelEnum payChannel;
     @ApiModelProperty("pay_info")
     private String pay_info;
 
+    @ApiModelProperty(value = "支付渠道:  alipay 支付宝  wx_lite 微信 ")
+    private PayChannelEnum payChannel;
+
     public String getPay_amt() {
         return pay_amt;
     }

+ 1 - 0
cooleshow-user/user-biz/src/main/resources/config/mybatis/TeacherAuthEntryRecordMapper.xml

@@ -88,6 +88,7 @@
                 AND t.teacher_auth_status_ = #{param.authStatus}
             </if>
         </where>
+        order by t.create_time_ desc
     </select>
 
     <select id="detail" resultType="com.yonge.cooleshow.biz.dal.vo.TeacherAuthEntryRecordVo">

+ 1 - 0
cooleshow-user/user-biz/src/main/resources/config/mybatis/TeacherAuthMusicianRecordMapper.xml

@@ -67,6 +67,7 @@
                 AND t.teacher_auth_status_ = #{param.authStatus}
             </if>
         </where>
+        order by t.create_time_ desc
     </select>
     <select id="getLastRecordByUserId"
             resultType="com.yonge.cooleshow.biz.dal.entity.TeacherAuthMusicianRecord">

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

@@ -12,6 +12,8 @@
             <result column="good_url_" property="goodUrl" />
             <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="good_num_" property="goodNum" />
             <result column="good_price_" property="goodPrice" />
             <result column="plantform_fee_" property="plantformFee" />
@@ -32,6 +34,8 @@
         , t.good_url_ as goodUrl
         , t.original_price_ as originalPrice
         , t.expect_price_ as expectPrice
+        , t.actual_price_ as actualPrice
+        , t.coupon_amount_ as couponAmount
         , t.good_num_ as goodNum
         , t.good_price_ as goodPrice
         , t.plantform_fee_ as plantformFee

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

@@ -22,11 +22,14 @@ import com.yonge.toolset.utils.string.StringUtil;
 import com.yonge.toolset.utils.string.ValueUtil;
 import com.yonge.toolset.utils.web.WebUtil;
 import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
 import io.swagger.annotations.ApiOperation;
 import org.redisson.api.RedissonClient;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.http.HttpStatus;
 import org.springframework.web.bind.annotation.*;
+import springfox.documentation.annotations.ApiIgnore;
 
 import javax.servlet.http.HttpServletRequest;
 import javax.validation.Valid;
@@ -70,13 +73,16 @@ public class UserOrderController extends BaseController {
         }
     }
 
-    @ApiOperation(value = "订单付款")
+    @ApiOperation(value = "订单下单付款")
     @PostMapping("/orderPay")
     public HttpResponseResult<OrderPayRes> orderPay(@Valid @RequestBody OrderPayReq payReq, HttpServletRequest request) {
         SysUser user = sysUserFeignService.queryUserInfo();
         if (user == null || null == user.getId()) {
             return failed(HttpStatus.FORBIDDEN, "请登录");
         }
+        if(StringUtil.isEmpty(payReq.getOrderNo())){
+            return failed("订单号不能为空");
+        }
         payReq.setUserId(user.getId());
         payReq.setIpAddress(WebUtil.getRemoteIp(request));
 
@@ -92,6 +98,57 @@ public class UserOrderController extends BaseController {
         }
     }
 
+    @ApiOperation(value = "取消订单")
+    @PostMapping("/orderCancel")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "orderNo", value = "订单号", paramType = "query", dataType = "String")
+    })
+    public HttpResponseResult<Boolean> orderCancel(@ApiIgnore @RequestBody OrderPayReq payReq, HttpServletRequest request) {
+        SysUser user = sysUserFeignService.queryUserInfo();
+        if (user == null || null == user.getId()) {
+            return failed(HttpStatus.FORBIDDEN, "请登录");
+        }
+        if(StringUtil.isEmpty(payReq.getOrderNo())){
+            return failed("订单号不能为空");
+        }
+        payReq.setUserId(user.getId());
+
+        Future<HttpResponseResult<Boolean>> httpResponseResultFuture = DistributedLock.of(redissonClient)
+                .callIfLockCanGet(CacheNameEnum.LOCK_EXECUTE_ORDER.getRedisKey(user.getId())
+                        , () -> userOrderService.orderCancel(payReq), 60L, TimeUnit.SECONDS);
+
+        try {
+            return httpResponseResultFuture.get();
+        } catch (Exception e) {
+            e.printStackTrace();
+            return HttpResponseResult.failed("付款失败");
+        }
+    }
+
+    @ApiOperation(value = "支付中订单付款")
+    @PostMapping("/orderPay")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "orderNo", value = "订单号", paramType = "query", dataType = "String")
+    })
+    public HttpResponseResult<OrderPayRes> orderPaytoPaying(@ApiIgnore @RequestBody OrderPayReq payReq, HttpServletRequest request) {
+        SysUser user = sysUserFeignService.queryUserInfo();
+        if (user == null || null == user.getId()) {
+            return failed(HttpStatus.FORBIDDEN, "请登录");
+        }
+        payReq.setUserId(user.getId());
+
+        Future<HttpResponseResult<OrderPayRes>> httpResponseResultFuture = DistributedLock.of(redissonClient)
+                .callIfLockCanGet(CacheNameEnum.LOCK_PAY_ORDER.getRedisKey(user.getId())
+                        , () -> userOrderService.orderPaytoPaying(payReq), 60L, TimeUnit.SECONDS);
+
+        try {
+            return httpResponseResultFuture.get();
+        } catch (Exception e) {
+            e.printStackTrace();
+            return HttpResponseResult.failed("付款失败");
+        }
+    }
+
     /**
      * 查询分页
      */