Просмотр исходного кода

feat(order): 实现商家主动取消订单及售后退款联动处理

- smqjh-oms新增商家取消订单后触发售后退款的逻辑,设置取消原因与状态
- smqjh-oms订单状态更新时,检测商家取消已支付订单,自动启动退款流程
- smqjh-platform新增市民请集合订单取消接口,推送取消状态到海博并触发退款处理
- smqjh-multishop优化商家取消订单接口,添加订单状态校验并完善异常处理
- 调整积分使用记录导出编码方式,避免编码异常
- OrderRefundSummaryVo新增退款名称字段,区分商家取消和售后进度两种退款场景
- 优化订单取消时售后单及订单状态的判断与更新逻辑,提高数据一致性与业务准确性
Sheep 1 день назад
Родитель
Сommit
718e6033c8

+ 14 - 10
yami-shop-multishop/src/main/java/com/yami/shop/multishop/controller/OrderController.java

@@ -208,6 +208,20 @@ public class OrderController {
     @ApiOperation(value = "商家主动取消订单", notes = "商家主动取消订单")
 //    public ResponseEntity<String> cancelOrder(@Valid @RequestBody com.yami.shop.bean.app.param.OrderRefundParam orderRefundParam) {
     public ResponseEntity<String> cancelOrder(@Valid @RequestBody CancelOrderParam cancelOrderParam) {
+
+        // 获取订单信息
+        Order order = orderService.getOne(new LambdaQueryWrapper<Order>().eq(Order::getOrderNumber, cancelOrderParam.getOrderNumber()));
+        if (order == null) {
+            throw new GlobalException("订单不存在");
+        }
+        if (!Objects.equals(order.getIsPayed(), 1)) {
+            throw new GlobalException("当前订单还未付款,无法取消");
+        }
+        if (Objects.equals(order.getHbOrderStatus(), OrderStatus.CLOSE.value())) {
+            throw new GlobalException("当前订单已失败");
+        }
+
+        // ========== 非市民请集合订单:原有逻辑 ==========
         com.yami.shop.bean.app.param.OrderRefundParam orderRefundParam = new com.yami.shop.bean.app.param.OrderRefundParam();
         orderRefundParam.setOrderNumber(cancelOrderParam.getOrderNumber());
         orderRefundParam.setRefundType(cancelOrderParam.getRefundType());
@@ -216,18 +230,8 @@ public class OrderController {
         orderRefundParam.setBuyerReason("商家主动取消订单");
         orderRefundParam.setBuyerDesc("商家后台取消订单");
 
-//        String userId = SecurityUtils.getUser().getUserId();
-        // 获取订单信息
-//        Order order = orderService.getOrderByOrderNumberAndUserId(orderRefundParam.getOrderNumber(), userId, true);
-        Order order = orderService.getOne(new LambdaQueryWrapper<Order>().eq(Order::getOrderNumber,orderRefundParam.getOrderNumber()));
-        if (!Objects.equals(order.getIsPayed(), 1)) {
-            throw new GlobalException("当前订单还未付款,无法取消");
-        }
         orderRefundParam.setBuyerMobile(order.getUserMobile());
         orderRefundParam.setRefundAmount(order.getTotal());
-        if (Objects.equals(order.getHbOrderStatus(), OrderStatus.CLOSE.value())) {
-            throw new GlobalException("当前订单已失败");
-        }
 
         if (Objects.equals(order.getHbOrderStatus(), OrderStatus.WAIT_GROUP.value())) {
             throw new GlobalException("当前订单正在等待成团状态,需等待成团才能进行下一步操作");

+ 39 - 0
yami-shop-platform/src/main/java/com/yami/shop/platform/controller/OrderController.java

@@ -29,6 +29,7 @@ import com.yami.shop.security.comment.dao.AppConnectMapper;
 import com.yami.shop.security.comment.model.AppConnect;
 import com.yami.shop.security.platform.util.SecurityUtils;
 import com.yami.shop.service.*;
+import com.yami.shop.service.hb.IHBOrderService;
 import com.yami.shop.sys.service.SysUserService;
 import com.yami.shop.utils.CullenUtils;
 import com.yami.shop.utils.SmqjhUtil;
@@ -74,6 +75,9 @@ public class OrderController {
     @Autowired
     private SysUserService sysUserService;
 
+    @Autowired
+    private IHBOrderService hbOrderService;
+
     @Autowired
     private ExportTaskService exportTaskService;
 
@@ -396,4 +400,39 @@ public class OrderController {
         orderService.deleteTempSubOrder(subOrderNumber);
         return R.SUCCESS();
     }
+
+    /**
+     * 商家主动取消市民请集合订单
+     * 推送取消到海博 + 通知smqjh-oms处理退款
+     */
+    @PostMapping("/cancelOrder")
+    @ApiOperation(value = "商家主动取消订单", notes = "商家主动取消订单")
+    public R<String> cancelOrder(@RequestBody CancelOrderParam cancelOrderParam) {
+        Order order = orderService.getOne(new LambdaQueryWrapper<Order>().eq(Order::getOrderNumber, cancelOrderParam.getOrderNumber()));
+        if (order == null) {
+            throw new GlobalException("订单不存在");
+        }
+        if (!Objects.equals(order.getIsPayed(), 1)) {
+            throw new GlobalException("当前订单还未付款,无法取消");
+        }
+        if (Objects.equals(order.getHbOrderStatus(), OrderStatus.CLOSE.value())) {
+            throw new GlobalException("当前订单已取消");
+        }
+        if (Objects.equals(order.getHbOrderStatus(), OrderStatus.SUCCESS.value())) {
+            throw new GlobalException("当前订单已完成,无法取消");
+        }
+        // 1. 推送取消状态到海博
+        hbOrderService.changeOrderStatus(order.getOrderNumber(), 60);
+        // 2. 更新本地订单状态
+        order.setHbOrderStatus(60);
+        orderService.updateById(order);
+        // 3. 市民请集合订单推送到smqjh-oms,触发退款处理
+        if (order.getOrderType() != null && order.getOrderType() == 4) {
+            Map<Object, Object> map = new LinkedTreeMap<>();
+            map.put("orderNumber", order.getOrderNumber());
+            map.put("hbOrderStatus", 60);
+            HttpUtil.post(smqjhUtil.getOmsBaseUrl() + "/api/v1/xsb/order/updateHbOrderStatus", map);
+        }
+        return R.SUCCESS("ok");
+    }
 }

+ 1 - 1
yami-shop-service/src/main/java/com/yami/shop/service/impl/PointsRecordServiceImpl.java

@@ -81,7 +81,7 @@ public class PointsRecordServiceImpl extends ServiceImpl<PointsRecordMapper, Poi
         try {
             List<PointsRecordVo> list = baseMapper.backendPointsRecordList2(po);
             response.setCharacterEncoding("utf-8");
-            String fileName = URLEncoder.encode("积分使用记录表", StandardCharsets.UTF_8).replaceAll("\\+", "%20");
+            String fileName = URLEncoder.encode("积分使用记录表", String.valueOf(StandardCharsets.UTF_8)).replaceAll("\\+", "%20");
             response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileName + ".xlsx");
             EasyExcel.write(response.getOutputStream(), PointsRecordVo.class)
                     .registerWriteHandler(new LongestMatchColumnWidthStyleStrategy())