diff --git a/ShopOrderBaseServiceImpl.java b/ShopOrderBaseServiceImpl.java new file mode 100644 index 00000000..7de57f26 --- /dev/null +++ b/ShopOrderBaseServiceImpl.java @@ -0,0 +1,119 @@ +/** + * 确认收货处理 + * @param order_ids 订单ID列表 + * @param order_rows 订单数据列表 + * @return 是否处理成功 + */ +public boolean receive(List order_ids, List order_rows) { + // 检测数据是否合法,过滤允许修改的数据 + if (CollUtil.isEmpty(order_ids)) { + throw new ApiException(I18nUtil._("请选择需要确认收货的订单!")); + } + + if (CollUtil.isEmpty(order_rows)) { + order_rows = gets(order_ids); + } + + List receive_id_row = new ArrayList<>(); + + for (ShopOrderBase order_row : order_rows) { + // 判断订单是否可以确认收货 + if (ifReceive(order_row.getOrder_state_id())) { + receive_id_row.add(order_row.getOrder_id()); + + // 增加积分和经验 + // todo 目前付款支付积分,此处为收货后发放 + Integer user_id = order_row.getBuyer_user_id(); + String order_id = order_row.getOrder_id(); + Integer store_id = order_row.getStore_id(); + + ShopOrderData order_data_row = shopOrderDataService.get(order_id); + BigDecimal order_points_add = order_data_row.getOrder_points_add(); + + BigDecimal order_points_add_all = order_points_add.add(order_data_row.getOrder_double_points_add()); + + // 发放购物积分 + if (CheckUtil.isNotEmpty(order_points_add_all)) { + String desc = String.format(I18nUtil._("购物获取积分 %s,订单号 %s"), order_points_add_all, order_id); + if (!payService.points(user_id, order_points_add_all, PointsType.POINTS_TYPE_CONSUME, desc, store_id, null, order_id)) { + throw new ApiException(I18nUtil._("积分操作失败!")); + } + } + + // todo 根据送花郎插件是否开启显示是否需要分钱给不同商户 + /* + boolean hall_enable = accountBaseConfigService.getConfig("hall_enable", false); + if (hall_enable) { + BigDecimal order_commission_fee = order_data_row.getOrder_commission_fee(); + sendMoneyForTransfer(order_row, order_commission_fee); + } + */ + + // 分销功能处理 + String fx_settle_type = accountBaseConfigService.getConfig("fx_settle_type", "receive"); + if (StrUtil.equals(fx_settle_type, "receive")) { + // todo settleDistributionUserOrder + shopDistributionUserOrderService.settleDistributionUserOrder(order_id); + } + + // 重要:拉卡拉给平台和代理商分账 + Pair retOrderSeparateRet = lakalaApiService.innerDoOrderSeparate(order_row.getOrder_id(), Convert.toStr(order_row.getStore_id())); + if (!retOrderSeparateRet.getFirst()) { + throw new ApiException(I18nUtil._("平台或代理商分账失败: " + retOrderSeparateRet.getSecond())); + } + + // 统计总营业额 + ShopStoreAnalytics analytics_row = shopStoreAnalyticsService.get(store_id); + BigDecimal order_payment_amount = order_row.getOrder_payment_amount(); + analytics_row.setStore_trade_amount(NumberUtil.add(analytics_row.getStore_trade_amount(), order_payment_amount)); + if (!shopStoreAnalyticsService.edit(analytics_row)) { + throw new ApiException(ResultCode.FAILED); + } + } + } + + // 检查是否有符合条件的订单 + if (CollUtil.isEmpty(receive_id_row)) { + throw new ApiException(I18nUtil._("无符合确认收货条件的订单!")); + } + + // 修改订单状态, 随机去一个订单获取店铺编号 + ShopOrderBase shopOrderBase = order_rows.get(0); + Integer store_id = shopOrderBase.getStore_id(); + editNextState(receive_id_row, store_id, StateCode.ORDER_STATE_SHIPPED, order_rows, 0); + + // 如果是商家,且启用供应商,则商家看到供应商店铺商品 store_type = 2 + boolean ifSupplierMarket = accountBaseConfigService.ifSupplierMarket(); + UserDto user = getCurrentUser(); + store_id = user != null ? Convert.toInt(user.getStore_id(), 0) : 0; + + // 处理供应商市场的库存增加逻辑 + if (ifSupplierMarket && CheckUtil.isNotEmpty(store_id)) { + // 供应商商品,增加商家库存 + QueryWrapper itemQueryWrapper = new QueryWrapper<>(); + itemQueryWrapper.in("order_id", receive_id_row); + List order_item_rows = shopOrderItemService.find(itemQueryWrapper); + + List item_src_ids = order_item_rows.stream().map(ShopOrderItem::getItem_id).distinct().collect(Collectors.toList()); + if (CollUtil.isNotEmpty(item_src_ids)) { + QueryWrapper productItemQueryWrapper = new QueryWrapper<>(); + productItemQueryWrapper.in("item_src_id", item_src_ids).eq("store_id", store_id); + List product_item_rows = shopProductItemService.find(productItemQueryWrapper); + + // 更新供应商商品库存 + for (ShopProductItem product_item_row : product_item_rows) { + String item_src_id = product_item_row.getItem_src_id(); + Optional orderItemOpl = order_item_rows.stream().filter(s -> ObjectUtil.equal(s.getItem_id(), item_src_id)).findFirst(); + if (orderItemOpl.isPresent()) { + ShopOrderItem shopOrderItem = orderItemOpl.get(); + Integer order_item_quantity = shopOrderItem.getOrder_item_quantity(); + product_item_row.setItem_quantity(product_item_row.getItem_quantity() + order_item_quantity); + if (!shopProductItemService.edit(product_item_row)) { + throw new ApiException(ResultCode.FAILED); + } + } + } + } + } + return true; +} \ No newline at end of file diff --git a/mall-shop/src/main/java/com/suisung/mall/shop/order/controller/admin/ShopOrderBaseController.java b/mall-shop/src/main/java/com/suisung/mall/shop/order/controller/admin/ShopOrderBaseController.java index 135e3c40..fd82bf33 100644 --- a/mall-shop/src/main/java/com/suisung/mall/shop/order/controller/admin/ShopOrderBaseController.java +++ b/mall-shop/src/main/java/com/suisung/mall/shop/order/controller/admin/ShopOrderBaseController.java @@ -103,8 +103,7 @@ public class ShopOrderBaseController extends BaseControllerImpl { public CommonResult cancel(@RequestParam(name = "order_id") String order_id) { return shopOrderBaseService.cancel(order_id); } - - + @ApiOperation(value = "确认收货", notes = "确认收货") @RequestMapping(value = "/receive", method = {RequestMethod.GET, RequestMethod.POST}) public CommonResult receive(@RequestParam(name = "order_id") String order_id) { 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 4722d08c..3ff3b808 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 @@ -4793,7 +4793,7 @@ public class ShopOrderBaseServiceImpl extends BaseServiceImpl baseList = new ArrayList<>(); if (CollUtil.isNotEmpty(order_info_rows)) { + // 过重供应商代发订单 dist_order_id = order_info_rows.stream().map(ShopOrderInfo::getOrder_id).distinct().collect(Collectors.toList()); baseList = shopOrderBaseService.gets(dist_order_id); } @@ -4856,6 +4858,7 @@ public class ShopOrderBaseServiceImpl extends BaseServiceImpl receive_id_row = new ArrayList<>(); for (ShopOrderBase order_row : order_rows) { + // 是否允许确认收货? if (ifReceive(order_row.getOrder_state_id())) { receive_id_row.add(order_row.getOrder_id()); @@ -5016,7 +5020,7 @@ public class ShopOrderBaseServiceImpl extends BaseServiceImpl order_id_receipt = shopOrderInfoService.getAutoFinishOrderId(); - if (CollUtil.isNotEmpty(order_id_receipt)) { - for (String order_id : order_id_receipt) { - try { - if (!shopOrderBaseService.receive(Collections.singletonList(order_id), null)) { - LogUtil.error(String.format(I18nUtil._("order_id : %s 确认出错"), order_id)); - } - } catch (Exception e) { - LogUtil.error(String.format(I18nUtil._("order_id : %s 确认出错"), order_id), e); + if (CollUtil.isEmpty(order_id_receipt)) { + return; + } + + for (String order_id : order_id_receipt) { + try { + if (!shopOrderBaseService.receive(Collections.singletonList(order_id), null)) { + LogUtil.error(String.format(I18nUtil._("order_id : %s 确认收货出错"), order_id)); } + } catch (Exception e) { + LogUtil.error(String.format(I18nUtil._("order_id : %s 确认收货发生异常"), order_id), e); } } } diff --git a/mall-shop/src/main/java/com/suisung/mall/shop/order/service/impl/ShopOrderInfoServiceImpl.java b/mall-shop/src/main/java/com/suisung/mall/shop/order/service/impl/ShopOrderInfoServiceImpl.java index 24096bb8..78952ec2 100644 --- a/mall-shop/src/main/java/com/suisung/mall/shop/order/service/impl/ShopOrderInfoServiceImpl.java +++ b/mall-shop/src/main/java/com/suisung/mall/shop/order/service/impl/ShopOrderInfoServiceImpl.java @@ -181,15 +181,19 @@ public class ShopOrderInfoServiceImpl extends BaseServiceImpl getAutoFinishOrderId() { QueryWrapper queryWrapper = new QueryWrapper<>(); + // 已发货,已签收 queryWrapper.in("order_state_id", StateCode.ORDER_STATE_SHIPPED, StateCode.ORDER_STATE_RECEIVED); - Float order_autofinish_time = accountBaseConfigService.getConfig("order_autofinish_time", 10f); + + // 默认7天,自动收货 + // 配置了发货或已签收的订单,1天自动收货 + Float order_autofinish_time = accountBaseConfigService.getConfig("order_autofinish_time", 7f); int second = NumberUtil.mul(order_autofinish_time, 24, 60, 60).intValue(); long time = DateUtil.offsetSecond(new Date(), -second).getTime(); queryWrapper.lt("order_deal_time", time); diff --git a/mall-shop/src/main/java/com/suisung/mall/shop/sfexpress/service/impl/SFExpressApiServiceImpl.java b/mall-shop/src/main/java/com/suisung/mall/shop/sfexpress/service/impl/SFExpressApiServiceImpl.java index 6e516522..9d6a4556 100644 --- a/mall-shop/src/main/java/com/suisung/mall/shop/sfexpress/service/impl/SFExpressApiServiceImpl.java +++ b/mall-shop/src/main/java/com/suisung/mall/shop/sfexpress/service/impl/SFExpressApiServiceImpl.java @@ -958,8 +958,11 @@ public class SFExpressApiServiceImpl implements SFExpressApiService { // 顺丰同城状态:17-配送员妥投完单; pushRemark = "已完成配送"; - // 通知微信用户确认收货 + // 通知微信用户确认收货(同城配送不能调用微信的确认收货) // wxOrderShippingService.notifyConfirmReceive(shopStoreSfOrder.getShop_order_id()); + // 订单确认收货 + shopOrderBaseService.receive(shopStoreSfOrder.getShop_order_id(), null); + } success = shopOrderInfoService.changeOrderStatus(shopStoreSfOrder.getShop_order_id(), orderStatus, orderIsOutStatus, orderIsShippedStatus); @@ -1057,14 +1060,18 @@ public class SFExpressApiServiceImpl implements SFExpressApiService { // logger.debug("准备发送SSE消息..."); // SseEmitterUtil.sendMessage(shopStoreSfOrder.getSf_order_id(), jsonData); + // 通知微信用户确认收货(同城配送不能调用该微信接口) + // wxOrderShippingService.notifyConfirmReceive(shopStoreSfOrder.getShop_order_id()); + + // 订单确认收货 + shopOrderBaseService.receive(shopStoreSfOrder.getShop_order_id(), null); + // 消息推送 JSONObject payload = new JSONObject(); payload.put("category", CommonConstant.PUSH_MSG_CATE_MCH_ORDER_DETAIL); payload.put("orderId", orderId); pushMessageService.noticeMerchantEmployeeOrderAction(null, orderId, "", "顺丰同城订单[" + orderId + "]已完成配送。", null); - // 通知微信用户确认收货 - // wxOrderShippingService.notifyConfirmReceive(shopStoreSfOrder.getShop_order_id()); return new ThirdApiRes().success("success"); }