Răsfoiți Sursa

Merge branch 'dev' into 'mp-server-test'

Dev

See merge request quanshu/mp-server!438
zhong chunping 3 ani în urmă
părinte
comite
c4dd2b9a3d

+ 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-admin/src/main/java/com/qs/mp/web/controller/api/user/UserTicketController.java

@@ -148,7 +148,7 @@ public class UserTicketController extends BaseApiController {
     }*/
     TicketPackage ticketPackage = ticketPackageService.getById(ticket.getPkgId());
     if (ticketPackage.getStatus() != TicketPkgStatusEnum.SOLD) {
-      LogUtil.error(logger, "盲票未激活。sn:{0},pkgId:{1}", new Object[]{ticket.getSerialNo(), ticket.getPkgId()});
+      LogUtil.warn(logger, "盲票未激活。sn:{0},pkgId:{1}", new Object[]{ticket.getSerialNo(), ticket.getPkgId()});
       return AjaxResult.error(ErrorCodeEnum.ERROR_CODE_1023);
     }
 

+ 3 - 0
mp-framework/src/main/java/com/qs/mp/framework/monitor/SendErrorMsgAppender.java

@@ -27,6 +27,9 @@ public class SendErrorMsgAppender extends UnsynchronizedAppenderBase<ILoggingEve
         ThrowableProxy throwableProxy = (ThrowableProxy) iThrowableProxy;
         Throwable throwable = throwableProxy.getThrowable();
         String throwableMsg = throwable.getMessage();
+        if ("验证码失效".equals(throwableMsg) || "重复购买,请稍后再试".equals(throwableMsg)) {
+          return;
+        }
         StackTraceElementProxy[] stackTraceElementProxy = iThrowableProxy.getStackTraceElementProxyArray();
         //获取服务器Ip,告知哪台服务器抛异常
         /*String ip = Context.getContext().getIp();

+ 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;
+
+}

+ 3 - 0
mp-service/src/main/java/com/qs/mp/admin/domain/param/TicketBoxUpdateParam.java

@@ -25,6 +25,9 @@ public class TicketBoxUpdateParam {
     @ApiModelProperty(value = "盲票组标题")
     private String title;
 
+    @ApiModelProperty(value = "图片")
+    private String picUrl;
+
     @NotNull(message = "售价不能为空")
     @ApiModelProperty(value = "售价",required=true)
     private Integer salePrice;

+ 51 - 54
mp-service/src/main/java/com/qs/mp/admin/service/impl/TicketBoxServiceImpl.java

@@ -113,6 +113,7 @@ public class TicketBoxServiceImpl extends ServiceImpl<TicketBoxMapper, TicketBox
     TicketBox ticketBox = new TicketBox();
     ticketBox.setBoxId(param.getBoxId());
     ticketBox.setTitle(param.getTitle());
+    ticketBox.setPicUrl(param.getPicUrl());
     ticketBox.setSalePrice(param.getSalePrice());
     ticketBox.setPkgSalePrice(param.getPkgSalePrice());
     ticketBox.setSaleCommRate(param.getSaleCommRate());
@@ -134,71 +135,67 @@ public class TicketBoxServiceImpl extends ServiceImpl<TicketBoxMapper, TicketBox
         throw new ServiceException("奖品列表不能为空");
        }
 
-      Map<String,TicketAwardsPrize> prizeMap = new HashMap<>();
+       List<TicketAwardsPrize> ticketAwardsPrizeList = new ArrayList<>();
       List<String> prizeIdList = ticketAwardsParam.getPrizeList().stream().map(ticketAwardsPrizeParam -> {
+        // 奖品id为空则封装要新增的奖品
         if (StringUtils.isBlank(ticketAwardsPrizeParam.getPrizeId())) {
-          throw new ServiceException("奖品ID不能为空");
-        }
-        // 封装奖品信息
-        TicketAwardsPrize awardsPrize = mapperFacade.map(ticketAwardsPrizeParam, TicketAwardsPrize.class);
-        awardsPrize.setPrizeId(ticketAwardsPrizeParam.getPrizeId());
-        awardsPrize.setBoxId(ticketBox.getBoxId());
-        awardsPrize.setAwardsId(ticketAwardsParam.getAwardsId());
-        if (null == awardsPrize.getQuantity() || 0 == awardsPrize.getQuantity()) {
-          // 页面没设置奖品的具体数量,则默认为整个奖项的数量
-          awardsPrize.setQuantity(ticketAwardsParam.getQuantity());
-        }
-        awardsPrize.setRemainQty(awardsPrize.getQuantity());
-        awardsPrize.setCashedQty(0);
-        if (ticketAwardsPrizeParam.getPrizeType() == TicketPrizeTypeEnum.GOODS) {
-          Goods goods = goodsService.getById(awardsPrize.getRefId());
-          awardsPrize.setTitle(goods.getTitle());
-          awardsPrize.setPicUrl(goods.getPicUrl());
-          awardsPrize.setValue(goods.getValue());
-        } else if (ticketAwardsPrizeParam.getPrizeType() == TicketPrizeTypeEnum.COUPON) {
-          Coupon coupon = couponService.getById(awardsPrize.getRefId());
-          awardsPrize.setTitle(coupon.getTitle());
-          awardsPrize.setPicUrl(coupon.getPicUrl());
-          awardsPrize.setValue(coupon.getDiscount());
-        } else {
-          awardsPrize.setTitle("盲豆");
-          awardsPrize.setPicUrl("md.jpeg");
+          // 封装奖品信息
+          TicketAwardsPrize awardsPrize = mapperFacade.map(ticketAwardsPrizeParam, TicketAwardsPrize.class);
+          awardsPrize.setPrizeId(bizIdGenerator.newId());
+          awardsPrize.setBoxId(ticketBox.getBoxId());
+          awardsPrize.setAwardsId(ticketAwardsParam.getAwardsId());
+          if (null == awardsPrize.getQuantity() || 0 == awardsPrize.getQuantity()) {
+            // 页面没设置奖品的具体数量,则默认为整个奖项的数量
+            awardsPrize.setQuantity(ticketAwardsParam.getQuantity());
+          }
+          awardsPrize.setRemainQty(awardsPrize.getQuantity());
+          awardsPrize.setCashedQty(0);
+          if (ticketAwardsPrizeParam.getPrizeType() == TicketPrizeTypeEnum.GOODS) {
+            Goods goods = goodsService.getById(awardsPrize.getRefId());
+            awardsPrize.setTitle(goods.getTitle());
+            awardsPrize.setPicUrl(goods.getPicUrl());
+            awardsPrize.setValue(goods.getValue());
+          } else if (ticketAwardsPrizeParam.getPrizeType() == TicketPrizeTypeEnum.COUPON) {
+            Coupon coupon = couponService.getById(awardsPrize.getRefId());
+            awardsPrize.setTitle(coupon.getTitle());
+            awardsPrize.setPicUrl(coupon.getPicUrl());
+            awardsPrize.setValue(coupon.getDiscount());
+          } else {
+            awardsPrize.setTitle("盲豆");
+            awardsPrize.setPicUrl("md.jpeg");
+          }
+          ticketAwardsPrizeList.add(awardsPrize);
         }
-        prizeMap.put(ticketAwardsPrizeParam.getPrizeId(), awardsPrize);
         return ticketAwardsPrizeParam.getPrizeId();
       }).collect(Collectors.toList());
 
-      List<String> tempList = new ArrayList<>();
-      tempList.addAll(prizeIdList);
-
-      // 查询原来的奖品信息
-      List<TicketAwardsPrize> oldTicketAwardsPrizeList = ticketAwardsPrizeService.list(new LambdaQueryWrapper<TicketAwardsPrize>()
-              .select(TicketAwardsPrize::getPrizeId)
-              .eq(TicketAwardsPrize::getAwardsId, ticketAwardsParam.getAwardsId()));
-      if (CollectionUtils.isEmpty(oldTicketAwardsPrizeList)) {
-        throw new ServiceException("原奖品列表为空");
-      }
-      List<String> oldPrizeIdList = oldTicketAwardsPrizeList.stream().map(TicketAwardsPrize::getPrizeId).collect(Collectors.toList());
-
-      // 去重原来的奖品信息
-      prizeIdList.removeAll(oldPrizeIdList);
+      // 如果新的奖品id为空,则清除原来的所有奖品
+      if (CollectionUtils.isEmpty(prizeIdList)) {
+        ticketAwardsPrizeService.remove(new LambdaUpdateWrapper<TicketAwardsPrize>().eq(TicketAwardsPrize::getAwardsId, ticketAwardsParam.getAwardsId()));
+      } else {
+        // 去重后,清除原来的奖品
+        // 查询原来的奖品信息
+        List<TicketAwardsPrize> oldTicketAwardsPrizeList = ticketAwardsPrizeService.list(new LambdaQueryWrapper<TicketAwardsPrize>()
+                .select(TicketAwardsPrize::getPrizeId)
+                .eq(TicketAwardsPrize::getAwardsId, ticketAwardsParam.getAwardsId()));
+        if (CollectionUtils.isEmpty(oldTicketAwardsPrizeList)) {
+          throw new ServiceException("原奖品列表为空");
+        }
+        List<String> oldPrizeIdList = oldTicketAwardsPrizeList.stream().map(TicketAwardsPrize::getPrizeId).collect(Collectors.toList());
+        // 去重原来的奖品信息
+        oldPrizeIdList.removeAll(prizeIdList);
 
-      // 删除原来的奖品信息
-      oldPrizeIdList.removeAll(tempList);
-      if (CollectionUtils.isNotEmpty(oldPrizeIdList)) {
-        ticketAwardsPrizeService.removeByIds(oldPrizeIdList);
+        if (CollectionUtils.isNotEmpty(oldPrizeIdList)) {
+          // 删除原来的奖品信息
+          ticketAwardsPrizeService.removeByIds(oldPrizeIdList);
+        }
       }
 
-      // 新增的奖品信息
-      if (CollectionUtils.isNotEmpty(prizeIdList)) {
-        List<TicketAwardsPrize> ticketAwardsPrizeList = new ArrayList<>();
-        for (String id : prizeIdList) {
-          if (prizeMap.get(id) != null) {
-            ticketAwardsPrizeList.add(prizeMap.get(id));
-          }
-        }
+      // 新增奖品
+      if (CollectionUtils.isNotEmpty(ticketAwardsPrizeList)) {
         ticketAwardsPrizeService.saveBatch(ticketAwardsPrizeList);
       }
+
     }
 
     return true;

+ 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;
   }
 

+ 1 - 1
mp-service/src/main/java/com/qs/mp/user/service/impl/UserTicketOrderServiceImpl.java

@@ -221,7 +221,7 @@ public class UserTicketOrderServiceImpl extends
         "盲票已付款,ticketId:" + ticket.getTicketId());
     if (null != redisCache.getCacheObject(
         RedisKey.build(RedisKey.OFFLINE_TICKET_ID_KEY, ticket.getTicketId()))) {
-      LogUtil.error(logger, "线下盲票重复购买,ticketNo:{0}", ticket.getSerialNo());
+      LogUtil.warn(logger, "线下盲票重复购买,ticketNo:{0}", ticket.getSerialNo());
       throw new ServiceException("重复购买,请稍后再试");
     }
     redisCache.setCacheObject(RedisKey.build(RedisKey.OFFLINE_TICKET_ID_KEY, ticket.getTicketId()),