diff --git a/mall-shop/src/main/java/com/suisung/mall/shop/order/service/ShopOrderBaseService.java b/mall-shop/src/main/java/com/suisung/mall/shop/order/service/ShopOrderBaseService.java index 41a68fe5..0db71718 100644 --- a/mall-shop/src/main/java/com/suisung/mall/shop/order/service/ShopOrderBaseService.java +++ b/mall-shop/src/main/java/com/suisung/mall/shop/order/service/ShopOrderBaseService.java @@ -459,20 +459,20 @@ public interface ShopOrderBaseService extends IBaseService { * * @param order_id * @param shopOrderInfo - * @param check_paid_flag + * @param checkPaidState 订单是否未支付,默认值 true * @return */ - boolean cancel(String order_id, ShopOrderInfo shopOrderInfo, boolean check_paid_flag); + boolean cancel(String order_id, ShopOrderInfo shopOrderInfo, boolean checkPaidState); /** * 取消订单 * * @param order_ids * @param order_rows - * @param check_paid_flag + * @param isNotPaid 订单是否未支付,默认值 true * @return */ - boolean cancel(List order_ids, List order_rows, boolean check_paid_flag); + boolean cancel(List order_ids, List order_rows, boolean isNotPaid); void exportFile(HttpServletResponse response, ShopOrderBase shopOrderBase, List order_ids); diff --git a/mall-shop/src/main/java/com/suisung/mall/shop/order/service/impl/ShopOrderBaseServiceImpl.java b/mall-shop/src/main/java/com/suisung/mall/shop/order/service/impl/ShopOrderBaseServiceImpl.java index 13a0e99d..f6fbb494 100644 --- a/mall-shop/src/main/java/com/suisung/mall/shop/order/service/impl/ShopOrderBaseServiceImpl.java +++ b/mall-shop/src/main/java/com/suisung/mall/shop/order/service/impl/ShopOrderBaseServiceImpl.java @@ -1087,7 +1087,7 @@ public class ShopOrderBaseServiceImpl extends BaseServiceImpl order_ids, List order_rows, boolean check_paid_flag) { - List cancel_id_row = new ArrayList<>(order_ids.size()); + public boolean cancel(List orderIds, List orderRows, boolean checkPaidState) { + List cancelIdRow = new ArrayList<>(orderIds.size()); // 检测数据是否合法,过滤允许修改的数据 - if (CollUtil.isEmpty(order_ids)) { + if (CollUtil.isEmpty(orderIds)) { throw new ApiException(I18nUtil._("请选择需要取消的订单")); } - if (CollUtil.isEmpty(order_rows)) { - order_rows = Convert.toList(Map.class, shopOrderInfoService.gets(order_ids)); + if (CollUtil.isEmpty(orderRows)) { + orderRows = Convert.toList(Map.class, shopOrderInfoService.gets(orderIds)); } - for (String order_id : order_ids) { - Optional orderOpl = order_rows.stream().filter(s -> ObjectUtil.equal(order_id, Convert.toStr(s.get("order_id")))).findFirst(); - Map order = orderOpl.orElseGet(HashMap::new); + // 筛选可取消的订单 + for (String orderId : orderIds) { + Optional orderOpt = orderRows.stream() + .filter(s -> ObjectUtil.equal(orderId, Convert.toStr(s.get("order_id")))) + .findFirst(); + Map order = orderOpt.orElseGet(HashMap::new); + // 订单状态(LIST):2011-待订单审核;2013-待财务审核;2020-待配货/待出库审核;2030-待发货;2040-已发货/待收货确认;2060-已完成/已签收;2070-已取消/已作废; - Integer order_state_id = (Integer) order.get("order_state_id"); + Integer orderStateId = (Integer) order.get("order_state_id"); // 付款状态(ENUM):3010-未付款;3011-付款待审核;3012-部分付款;3013-已付款 - Integer order_is_paid = (Integer) order.get("order_is_paid"); - // 要检查订单付款状态 - if (check_paid_flag) { - if (ifCancel(order_state_id, order_is_paid)) { - // 未付款,未配送的订单才能取消订单 - cancel_id_row.add(order_id); + Integer orderIsPaid = (Integer) order.get("order_is_paid"); + + // 根据是否检查支付状态来判断订单是否可取消 + if (checkPaidState) { + // 检查订单是否可以取消(未付款且处于特定状态) + if (isOrderCancelable(orderStateId, orderIsPaid)) { + cancelIdRow.add(orderId); + } else { + // 订单已支付,检查是否允许退款 + boolean isOrderDenyReturn = shopOrderReturnService.isOrderDenyReturn(orderId); + if (!isOrderDenyReturn) { + // 支付的订单允许退款,立即发起退款流程,再由商家审核 + CommonResult refundResult = shopOrderReturnService.addRemainingItems(orderId, false, "用户取消订单"); + if (refundResult == null || refundResult.getStatus() != 200) { + logger.error("提交订单审核失败!"); + return false; + } + + return true; + } } } else { - // 不检查订单付款状态 - cancel_id_row.add(order_id); + // 不检查订单付款状态,直接加入可取消列表 + cancelIdRow.add(orderId); } } - if (CollUtil.isEmpty(cancel_id_row)) { + if (CollUtil.isEmpty(cancelIdRow)) { throw new ApiException(I18nUtil._("无符合取消条件的订单!")); } - order_ids = cancel_id_row; + orderIds = cancelIdRow; + // 更新订单主表状态为已取消 ShopOrderBase orderBase = new ShopOrderBase(); orderBase.setOrder_state_id(StateCode.ORDER_STATE_CANCEL); QueryWrapper baseQueryWrapper = new QueryWrapper<>(); - baseQueryWrapper.in("order_id", order_ids); + baseQueryWrapper.in("order_id", orderIds); baseQueryWrapper.ne("order_state_id", StateCode.ORDER_STATE_CANCEL); // 2070-已取消 - if (!edit(orderBase, baseQueryWrapper)) {// 批量更改状态 + if (!edit(orderBase, baseQueryWrapper)) { // 批量更改状态 throw new ApiException(ResultCode.FAILED); } + // 更新订单信息表状态为已取消 ShopOrderInfo shopOrderInfo = new ShopOrderInfo(); shopOrderInfo.setOrder_state_id(StateCode.ORDER_STATE_CANCEL); QueryWrapper infoQueryWrapper = new QueryWrapper<>(); - infoQueryWrapper.in("order_id", cancel_id_row); + infoQueryWrapper.in("order_id", cancelIdRow); infoQueryWrapper.ne("order_state_id", StateCode.ORDER_STATE_CANCEL); if (!shopOrderInfoService.edit(shopOrderInfo, infoQueryWrapper)) { - throw new ApiException(String.format("订单:%s 取消状态有误!", CollUtil.join(cancel_id_row, ","))); + throw new ApiException(String.format("订单:%s 取消状态有误!", CollUtil.join(cancelIdRow, ","))); } // 积分退还 order_resource_ext1 默认为积分。 - List order_data_rows = shopOrderDataService.gets(order_ids); - for (ShopOrderData order_data_row : order_data_rows) { - String orderId = order_data_row.getOrder_id(); + List orderDataRows = shopOrderDataService.gets(orderIds); + for (ShopOrderData orderDataRow : orderDataRows) { + String orderId = orderDataRow.getOrder_id(); - Optional orderOpl = order_rows.stream().filter(s -> ObjectUtil.equal(orderId, Convert.toStr(s.get("order_id")))).findFirst(); - Map order = orderOpl.orElseGet(HashMap::new); + Optional orderOpt = orderRows.stream() + .filter(s -> ObjectUtil.equal(orderId, Convert.toStr(s.get("order_id")))) + .findFirst(); + Map order = orderOpt.orElseGet(HashMap::new); - Integer buyer_user_id = (Integer) order.get("buyer_user_id"); - BigDecimal order_resource_ext1 = order_data_row.getOrder_resource_ext1();// 积分 - BigDecimal order_resource_ext2 = order_data_row.getOrder_resource_ext2();// 众宝 + Integer buyerUserId = (Integer) order.get("buyer_user_id"); + BigDecimal orderResourceExt1 = orderDataRow.getOrder_resource_ext1(); // 积分 + BigDecimal orderResourceExt2 = orderDataRow.getOrder_resource_ext2(); // 众宝 - if (ObjectUtil.compare(order_resource_ext1, BigDecimal.ZERO) > 0 && CheckUtil.isNotEmpty(buyer_user_id)) { - Integer store_id = (Integer) order.get("store_id"); + // 退还积分 + if (ObjectUtil.compare(orderResourceExt1, BigDecimal.ZERO) > 0 && CheckUtil.isNotEmpty(buyerUserId)) { + Integer storeId = (Integer) order.get("store_id"); // 扣除积分 - String desc = String.format("%s 积分退还,订单号 %s", order_resource_ext1, order_data_row.getOrder_id()); - if (!payService.points(buyer_user_id, order_resource_ext1, PointsType.POINTS_TYPE_CONSUME_RETRUN, desc, store_id, null, order_data_row.getOrder_id())) { + String desc = String.format("%s 积分退还,订单号 %s", orderResourceExt1, orderDataRow.getOrder_id()); + if (!payService.points(buyerUserId, orderResourceExt1, PointsType.POINTS_TYPE_CONSUME_RETRUN, desc, storeId, null, orderDataRow.getOrder_id())) { throw new ApiException(I18nUtil._("积分操作失败!")); } } // 程序没有编写完成,缺失众宝积分退回功能 - //if (ObjectUtil.compare(order_resource_ext2, BigDecimal.ZERO) > 0 && CheckUtil.isNotEmpty(buyer_user_id)) { - // String desc = String.format("%s 众宝退还", order_resource_ext2); - // todo shopUserPointsHistoryService.sp(buyer_user_id,order_resource_ext2,SpType.SP_TYPE_CONSUME_RETRUN, desc); - //} + // if (ObjectUtil.compare(orderResourceExt2, BigDecimal.ZERO) > 0 && CheckUtil.isNotEmpty(buyerUserId)) { + // String desc = String.format("%s 众宝退还", orderResourceExt2); + // todo shopUserPointsHistoryService.sp(buyerUserId, orderResourceExt2, SpType.SP_TYPE_CONSUME_RETRUN, desc); + // } } // 限购商品数量退还 QueryWrapper itemQueryWrapper = new QueryWrapper<>(); - itemQueryWrapper.in("order_id", order_ids); - List order_item_rows = shopOrderItemService.find(itemQueryWrapper); - - for (ShopOrderItem order_item_row : order_item_rows) { + itemQueryWrapper.in("order_id", orderIds); + List orderItemRows = shopOrderItemService.find(itemQueryWrapper); + for (ShopOrderItem orderItemRow : orderItemRows) { + // 退还用户购买数量限制 QueryWrapper buyQueryWrapper = new QueryWrapper<>(); - buyQueryWrapper.eq("product_id", order_item_row.getProduct_id()); - buyQueryWrapper.eq("item_id", order_item_row.getItem_id()); - buyQueryWrapper.eq("user_id", order_item_row.getBuyer_id()); + buyQueryWrapper.eq("product_id", orderItemRow.getProduct_id()); + buyQueryWrapper.eq("item_id", orderItemRow.getItem_id()); + buyQueryWrapper.eq("user_id", orderItemRow.getBuyer_id()); List productBuyList = shopUserProductBuyService.find(buyQueryWrapper); - Integer order_item_quantity = order_item_row.getOrder_item_quantity(); + Integer orderItemQuantity = orderItemRow.getOrder_item_quantity(); if (CollUtil.isNotEmpty(productBuyList)) { - + // 减少用户的已购买数量 for (ShopUserProductBuy productBuy : productBuyList) { - productBuy.setProduct_buy_num(productBuy.getProduct_buy_num() - order_item_quantity); + productBuy.setProduct_buy_num(productBuy.getProduct_buy_num() - orderItemQuantity); } if (!shopUserProductBuyService.saveOrUpdate(productBuyList)) { @@ -4242,29 +4265,29 @@ public class ShopOrderBaseServiceImpl extends BaseServiceImpl stockDeltaMap = new HashMap<>(); -// stockDeltaMap.put(shopProductItem.getItem_src_id() + "-" + order_item_row.getOrder_id(), order_item_quantity); -// syncThirdDataService.incrProductStockToRedis(stockDeltaMap); + // Map stockDeltaMap = new HashMap<>(); + // stockDeltaMap.put(shopProductItem.getItem_src_id() + "-" + orderItemRow.getOrder_id(), orderItemQuantity); + // syncThirdDataService.incrProductStockToRedis(stockDeltaMap); } } // 退还礼包活动 - if (order_item_row.getActivity_type_id().equals(StateCode.ACTIVITY_TYPE_GIFTPACK)) { + if (orderItemRow.getActivity_type_id().equals(StateCode.ACTIVITY_TYPE_GIFTPACK)) { QueryWrapper queryWrapper = new QueryWrapper<>(); - queryWrapper.eq("exchange_code", order_item_row.getActivity_code()); + queryWrapper.eq("exchange_code", orderItemRow.getActivity_code()); ShopStoreActivityCode shopStoreActivityCode = shopStoreActivityCodeService.findOne(queryWrapper); shopStoreActivityCode.setUser_id(0); shopStoreActivityCode.setOrder_id(""); @@ -4277,18 +4300,21 @@ public class ShopOrderBaseServiceImpl extends BaseServiceImpl voucherQueryWrapper = new QueryWrapper<>(); - voucherQueryWrapper.in("order_id", order_ids); + voucherQueryWrapper.in("order_id", orderIds); List userVouchers = shopUserVoucherService.find(voucherQueryWrapper); if (CollUtil.isNotEmpty(userVouchers)) { - userVouchers = userVouchers.stream().map(userVoucher -> userVoucher.setVoucher_state_id(StateCode.VOUCHER_STATE_UNUSED)).collect(Collectors.toList()); + // 将已使用的优惠券状态重置为未使用 + userVouchers = userVouchers.stream() + .map(userVoucher -> userVoucher.setVoucher_state_id(StateCode.VOUCHER_STATE_UNUSED)) + .collect(Collectors.toList()); if (!shopUserVoucherService.edit(userVouchers)) { throw new ApiException(I18nUtil._("退还优惠券失败!")); } } - // 取消拼团 - for (String order_id : order_ids) { - cancelActivity(order_id); + // 取消拼团活动 + for (String orderId : orderIds) { + cancelActivity(orderId); } return true; @@ -5227,7 +5253,7 @@ public class ShopOrderBaseServiceImpl extends BaseServiceImpl shopOrderInfos = shopOrderInfoService.gets(order_ids); List rows = Convert.toList(Map.class, shopOrderInfos); // 检查登录用户和订单店铺是否有权限操作取消动作 - if (CheckUtil.checkDataRights(user_id, rows, "buyer_user_id") || CheckUtil.checkDataRights(Convert.toInt(user.getStore_id()), rows, "store_id")) { + if (CheckUtil.checkDataRights(user_id, rows, "buyer_user_id") + || CheckUtil.checkDataRights(Convert.toInt(user.getStore_id()), rows, "store_id")) { cancel(order_ids, rows, true); } else { throw new ApiException(ResultCode.FORBIDDEN); @@ -5267,12 +5294,12 @@ public class ShopOrderBaseServiceImpl extends BaseServiceImpl order_states = Arrays.asList(StateCode.ORDER_STATE_WAIT_PAY, StateCode.ORDER_STATE_WAIT_REVIEW, StateCode.ORDER_STATE_WAIT_FINANCE_REVIEW, StateCode.ORDER_STATE_PICKING, StateCode.ORDER_STATE_WAIT_SHIPPING); - // 3010-未付款,未付款的订单才能取消 - return order_states.contains(order_state_id) && ObjectUtil.equal(order_is_paid, StateCode.ORDER_PAID_STATE_NO); + private boolean isOrderCancelable(Integer orderStateId, Integer orderIsPaid) { + // 可以取消订单的状态列表:待付款、待审核、待财务审核、待配货、待发货 + List cancelableStates = Arrays.asList( + StateCode.ORDER_STATE_WAIT_PAY, + StateCode.ORDER_STATE_WAIT_REVIEW, + StateCode.ORDER_STATE_WAIT_FINANCE_REVIEW, + StateCode.ORDER_STATE_PICKING, + StateCode.ORDER_STATE_WAIT_SHIPPING + ); + + // 订单必须处于可取消状态且未付款才能取消 + return cancelableStates.contains(orderStateId) && + ObjectUtil.equal(orderIsPaid, StateCode.ORDER_PAID_STATE_NO); } // QueryWrapper queryWrapper,