Ver código fonte

经销商取消订单

cup 3 anos atrás
pai
commit
7b2ab1898e

+ 10 - 4
mp-admin/src/main/java/com/qs/mp/web/controller/api/admin/ChannelOrderMgrController.java

@@ -4,10 +4,7 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.qs.mp.admin.domain.TicketPackage;
-import com.qs.mp.admin.domain.param.ChannelOrderPkgParam;
-import com.qs.mp.admin.domain.param.ChannelOrderQueryParam;
-import com.qs.mp.admin.domain.param.ChannelOrderShipParam;
-import com.qs.mp.admin.domain.param.UserDeliverOrderQueryParam;
+import com.qs.mp.admin.domain.param.*;
 import com.qs.mp.admin.domain.vo.TicketPackageVO;
 import com.qs.mp.admin.service.ITicketPackageService;
 import com.qs.mp.channel.domain.Channel;
@@ -52,6 +49,7 @@ import ma.glasnost.orika.MapperFacade;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
@@ -112,6 +110,14 @@ public class ChannelOrderMgrController extends BaseApiController {
     return getDataTable(channelOrderVOList);
   }
 
+
+  @PostMapping("/order/cancel")
+  @PreAuthorize("@ss.hasPermi('order:channel:edit')")
+  @ApiOperation("经销商订单取消")
+  public AjaxResult cancelOrder(@Validated @RequestBody ChannelOrderCancelParam param) {
+	  return AjaxResult.success(channelOrderService.cancelOrder(param));
+  }
+
   /**
    * 订单详情
    */

+ 1 - 1
mp-quartz/src/main/java/com/qs/mp/quartz/task/OperateToolTask.java

@@ -50,7 +50,7 @@ public class OperateToolTask {
   public void refund(String orderNo, Integer refundAmount){
     LogUtil.info(logger, "...退款任务开始...");
 
-    walletService.refund(orderNo, refundAmount);
+    walletService.refundByUser(orderNo, refundAmount, "后台人工操作");
 
     LogUtil.info(logger, "...退款任务结束...");
 

+ 24 - 0
mp-service/src/main/java/com/qs/mp/admin/domain/param/ChannelOrderCancelParam.java

@@ -0,0 +1,24 @@
+package com.qs.mp.admin.domain.param;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.Value;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+
+/**
+ * 经销商订单取消入参类
+ * @author Cup
+ * @date 2022/4/26
+ */
+@ApiModel("经销商订单取消入参类")
+@Data
+public class ChannelOrderCancelParam {
+
+    @NotBlank(message = "订单id不能为空")
+    @ApiModelProperty(value = "订单id",required = true)
+    private String orderId;
+
+}

+ 8 - 1
mp-service/src/main/java/com/qs/mp/channel/service/IChannelOrderService.java

@@ -1,5 +1,6 @@
 package com.qs.mp.channel.service;
 
+import com.qs.mp.admin.domain.param.ChannelOrderCancelParam;
 import com.qs.mp.admin.domain.vo.TicketCntVO;
 import com.qs.mp.channel.domain.ChannelOrder;
 import com.qs.mp.channel.domain.ChannelOrderDetail;
@@ -73,5 +74,11 @@ public interface IChannelOrderService extends IService<ChannelOrder> {
 	 * @return
 	 */
 	int selectChannelOrderCount(Wrapper<ChannelOrder> wrapper);
-	
+
+	/**
+	 * 经销商取消订单
+	 * @param param
+	 * @return
+	 */
+    boolean cancelOrder(ChannelOrderCancelParam param);
 }

+ 60 - 1
mp-service/src/main/java/com/qs/mp/channel/service/impl/ChannelOrderServiceImpl.java

@@ -4,12 +4,16 @@ import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.Wrapper;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
 import com.baomidou.mybatisplus.core.toolkit.StringUtils;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.qs.mp.admin.domain.TicketBox;
 import com.qs.mp.admin.domain.TicketPackage;
+import com.qs.mp.admin.domain.param.ChannelOrderCancelParam;
 import com.qs.mp.admin.service.ITicketBoxService;
 import com.qs.mp.admin.service.ITicketPackageService;
+import com.qs.mp.pay.service.IPayOrderService;
+import com.qs.mp.pay.service.IWalletService;
 import com.qs.mp.user.domain.UserAddr;
 import com.qs.mp.channel.domain.ChannelOrder;
 import com.qs.mp.channel.domain.ChannelOrderDetail;
@@ -32,6 +36,7 @@ import com.qs.mp.pay.domain.PayOrder;
 import com.qs.mp.system.service.id.BizIdGenerator;
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Objects;
 import java.util.stream.Collectors;
 
 import org.slf4j.Logger;
@@ -75,6 +80,12 @@ public class ChannelOrderServiceImpl extends
   @Autowired
   private IChannelOrderDetailService channelOrderDetailervice;
 
+  @Autowired
+  private IWalletService walletService;
+
+  @Autowired
+  private IPayOrderService payOrderService;
+
   @Override
   @Transactional
   public String submitOrder(Long channelId, String memo, ChannelOrderSettleVO orderSettleVO) {
@@ -188,7 +199,55 @@ public class ChannelOrderServiceImpl extends
     return true;
   }
 
-  @Override
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public boolean cancelOrder(ChannelOrderCancelParam param) {
+        ChannelOrder channelOrder = this.getById(param.getOrderId());
+        if (Objects.isNull(channelOrder)) {
+            throw new ServiceException("订单不存在");
+        }
+        if (!ChannelOrderStatusEnum.NOT_DELIVER.equals(channelOrder.getStatus())) {
+            throw new ServiceException("订单状态异常,不能取消");
+        }
+
+        // 更新订单状态
+        ChannelOrder channelOrderParam  = new ChannelOrder();
+        channelOrderParam.setOrderId(channelOrder.getOrderId());
+        channelOrderParam.setStatus(ChannelOrderStatusEnum.CANCELED);
+        this.updateById(channelOrderParam);
+
+        // 更新销量
+        List<ChannelOrderItem> list = channelOrderItemService.list(new LambdaQueryWrapper<ChannelOrderItem>().eq(ChannelOrderItem::getOrderId, param.getOrderId()));
+        if (CollectionUtils.isEmpty(list)) {
+            throw new ServiceException("订单商品不存在");
+        }
+        for (ChannelOrderItem channelOrderItem : list) {
+            TicketBox ticketBox = ticketBoxService.getById(channelOrderItem.getBoxId());
+            // 回滚销量
+            int salePkgQty = ticketBox.getSalePkgQty() - channelOrderItem.getOrderNum();
+            boolean flag = ticketBoxService.update(new LambdaUpdateWrapper<TicketBox>()
+                    .set(TicketBox::getSalePkgQty, salePkgQty)
+                    .eq(TicketBox::getBoxId, ticketBox.getBoxId())
+                    .eq(TicketBox::getSalePkgQty, ticketBox.getSalePkgQty()));
+            if (!flag) {
+                throw new ServiceException("操作繁忙,请稍后再试!");
+            }
+
+        }
+
+        // 获取支付订单号
+        PayOrder payOrder = payOrderService.getOne(new LambdaQueryWrapper<PayOrder>().eq(PayOrder::getBizId, channelOrder.getOrderId()));
+        if (Objects.isNull(payOrder)) {
+            throw new ServiceException("支付订单不存在");
+        }
+
+        // 退款
+        walletService.refundByChannel(payOrder.getOrderId(), channelOrder.getPayAmt(),"经销商取消订单");
+
+        return true;
+    }
+
+    @Override
   public void paySuccess(PayOrder payOrder) {
     ChannelOrder channelOrder = getById(payOrder.getBizId());
     if (null == channelOrder || channelOrder.getStatus() != ChannelOrderStatusEnum.NOT_PAY) {

+ 8 - 2
mp-service/src/main/java/com/qs/mp/pay/service/IWalletService.java

@@ -22,10 +22,16 @@ public interface IWalletService {
   JSONObject pay(BizTypeEnum bizType, String bizId, String openId, int money);
 
   /**
-   * 订单退款
+   * 用户订单退款
    * @return
    */
-  boolean refund(String orderNo, Integer refundAmount);
+  boolean refundByUser(String orderNo, Integer refundAmount, String remark);
+
+  /**
+   * 经销商订单退款
+   * @return
+   */
+  boolean refundByChannel(String orderNo, Integer refundAmount, String remark);
 
   /**
    *

+ 34 - 4
mp-service/src/main/java/com/qs/mp/pay/service/impl/WalletServiceImpl.java

@@ -1,5 +1,7 @@
 package com.qs.mp.pay.service.impl;
 
+import cn.hutool.json.JSON;
+import cn.hutool.json.JSONUtil;
 import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
@@ -127,7 +129,7 @@ public class WalletServiceImpl implements IWalletService {
   }
 
   @Override
-  public boolean refund(String orderNo, Integer refundAmount) {
+  public boolean refundByUser(String orderNo, Integer refundAmount, String remark) {
 
     String reqUrl = baseUrl + "/pay/refundOrder";
 
@@ -136,12 +138,40 @@ public class WalletServiceImpl implements IWalletService {
     sendData.put("timestamp",System.currentTimeMillis());
     sendData.put("order_no",orderNo);
     sendData.put("refund_amount", refundAmount);
-    sendData.put("order_remark", "测试退款");
+    sendData.put("order_remark", remark);
     sendData.put("type","sno");
     sendData.put("sign",userPaySign);
-    System.err.println(sendData.toJSONString());
     String result = OkHttpUtil.postJsonParams(reqUrl, sendData.toJSONString());
-    System.err.println(result);
+    JSONObject jsonObject = JSONObject.parseObject(result);
+    String code = jsonObject.getString("code");
+    logger.info("用户订单退款 -> request params:" + sendData.toJSONString() + "  result:" + result);
+    if ("E0001".equals(code)) {
+      throw new ServiceException(jsonObject.getString("result"));
+    }
+    return true;
+  }
+
+
+  @Override
+  public boolean refundByChannel(String orderNo, Integer refundAmount, String remark) {
+
+    String reqUrl = baseUrl + "/pay/refundOrder";
+
+    JSONObject sendData = new JSONObject();
+    sendData.put("shop_no", channelPayShopNo);
+    sendData.put("timestamp",System.currentTimeMillis());
+    sendData.put("order_no",orderNo);
+    sendData.put("refund_amount", refundAmount);
+    sendData.put("order_remark", remark);
+    sendData.put("type","sno");
+    sendData.put("sign",channelPaySign);
+    String result = OkHttpUtil.postJsonParams(reqUrl, sendData.toJSONString());
+    JSONObject jsonObject = JSONObject.parseObject(result);
+    String code = jsonObject.getString("code");
+    logger.info("经销商订单退款 -> request params:" + sendData.toJSONString() + "  result:" + result);
+    if ("E0001".equals(code)) {
+      throw new ServiceException(jsonObject.getString("result"));
+    }
     return true;
   }