From 42e825c32315b055cf67567cdd0446084db6f5ad Mon Sep 17 00:00:00 2001 From: Jack <46790855@qq.com> Date: Wed, 22 Oct 2025 17:46:51 +0800 Subject: [PATCH 1/5] =?UTF-8?q?=E9=A1=BA=E4=B8=B0=E5=88=9B=E5=BB=BA?= =?UTF-8?q?=E5=86=85=E9=83=A8=E6=96=B9=E6=B3=95=E6=B7=BB=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../order/listener/OrderPayedListener.java | 2 +- .../impl/ShopOrderInfoServiceImpl.java | 24 ++-- .../admin/SFExpressAdminController.java | 24 +++- .../service/SFExpressApiService.java | 21 +++- .../service/impl/SFExpressApiServiceImpl.java | 110 +++++++++++++++--- .../src/main/resources/bootstrap-prod.yml | 4 +- 6 files changed, 159 insertions(+), 26 deletions(-) diff --git a/mall-shop/src/main/java/com/suisung/mall/shop/order/listener/OrderPayedListener.java b/mall-shop/src/main/java/com/suisung/mall/shop/order/listener/OrderPayedListener.java index 6cbbe8dc..149a70a8 100644 --- a/mall-shop/src/main/java/com/suisung/mall/shop/order/listener/OrderPayedListener.java +++ b/mall-shop/src/main/java/com/suisung/mall/shop/order/listener/OrderPayedListener.java @@ -173,7 +173,7 @@ public class OrderPayedListener { } - // 处理异常,不抛出,以免影响到主流程 + // 发送过推送消息,处理异常,不抛出,以免影响到主流程 try { // 检查是否已发送过推送消息(幂等性检查) String pushFlagKey = RedisConstant.New_Order_Push_Flag_Key + orderId; 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 bdd34815..ff6f2335 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 @@ -440,7 +440,7 @@ public class ShopOrderInfoServiceImpl extends BaseServiceImpl 3) { + if (times > 5) { return CommonResult.success("已通知配送人员,请稍候"); } @@ -827,45 +827,55 @@ public class ShopOrderInfoServiceImpl extends BaseServiceImpl checkBookingOrderArgs(Integer storeId, Integer bookingState, String bookingBeginTimeStr, String bookingEndTimeStr) { + // 1. 必填参数检查 if (CheckUtil.isEmpty(storeId) || CheckUtil.isEmpty(bookingState)) { return Pair.of(false, "[预约订单校验] 缺少必要参数"); } + // 2. 预约状态检查 if (!CommonConstant.Order_Booking_State_YY.equals(bookingState)) { return Pair.of(true, "[预约订单校验] 非预订单,跳过验证"); } + // 3. 时间格式检查 if (StrUtil.hasBlank(bookingBeginTimeStr, bookingEndTimeStr)) { return Pair.of(false, "[预约订单校验] 预约时间不能为空"); } Date bookingBeginTime = DateTimeUtils.tryParseDateTimeToDate(bookingBeginTimeStr); Date bookingEndTime = DateTimeUtils.tryParseDateTimeToDate(bookingEndTimeStr); - if (bookingBeginTime == null || bookingBeginTime == null) { + if (bookingBeginTime == null || bookingEndTime == null) { return Pair.of(false, "[预约订单校验] 预约时间格式有误"); } - // 验证开始时间是否早于结束时间 + // 4. 时间逻辑检查 - 开始时间不能晚于结束时间 if (bookingBeginTime.after(bookingEndTime)) { return Pair.of(false, "[预约订单校验] 开始时间不能晚于截止时间"); } - // 判断预约订单开始时间是否在店铺的营业时间段里? + // 5. 店铺信息检查 ShopStoreInfo shopStoreInfo = shopStoreInfoService.getShopStoreInfoByStoreId(storeId); if (shopStoreInfo == null) { return Pair.of(false, "[预约订单校验] 店铺信息有误"); } if (StrUtil.isBlank(shopStoreInfo.getStore_opening_hours()) || StrUtil.isBlank(shopStoreInfo.getStore_close_hours())) { - return Pair.of(false, "[预约订单校验] 店铺营业时间未设置"); + return Pair.of(false, "[预约订单校验] 店铺营业时间未设置,请联系商家"); } + // 6. 店铺营业时间检查 if (!DateTimeUtils.isTimeInRange(shopStoreInfo.getStore_opening_hours(), shopStoreInfo.getStore_close_hours(), bookingBeginTime)) { - return Pair.of(false, "[预约订单校验] 预约时间不在店铺营业时间内"); + return Pair.of(false, "[预约订单校验] 请在店铺营业时间内预约下单"); + } + + // 7. 预约时间范围检查 - 仅能预约45分钟后的订单 + Date fortyFiveMinutesLater = DateUtil.offsetMinute(new Date(), 45); + if (!bookingBeginTime.after(fortyFiveMinutesLater)) { + return Pair.of(false, "[预约订单校验] 仅能预约45分后的订单"); } return Pair.of(true, "[预约订单校验] 成功"); diff --git a/mall-shop/src/main/java/com/suisung/mall/shop/sfexpress/controller/admin/SFExpressAdminController.java b/mall-shop/src/main/java/com/suisung/mall/shop/sfexpress/controller/admin/SFExpressAdminController.java index 25009a7a..1113041e 100644 --- a/mall-shop/src/main/java/com/suisung/mall/shop/sfexpress/controller/admin/SFExpressAdminController.java +++ b/mall-shop/src/main/java/com/suisung/mall/shop/sfexpress/controller/admin/SFExpressAdminController.java @@ -33,7 +33,7 @@ public class SFExpressAdminController { @ApiOperation(value = "创建顺丰同城店铺", notes = "创建顺丰同城店铺") @RequestMapping(value = "/create-shop", method = RequestMethod.POST) - public CommonResult createSfExpressShopNotify(@RequestBody JSONObject requestBody) { + public CommonResult createSfExpressShop(@RequestBody JSONObject requestBody) { Pair result = sfExpressApiService.createSfExpressShop(requestBody.getLong("mch_id"), requestBody.getInt("store_id")); if (result.getFirst()) { Map data = new HashMap<>(); @@ -42,4 +42,26 @@ public class SFExpressAdminController { } return CommonResult.failed(result.getSecond()); } + + + @ApiOperation(value = "创建顺丰同城店铺", notes = "创建顺丰同城店铺") + @RequestMapping(value = "/create-shop-inner", method = RequestMethod.POST) + public CommonResult createSfExpressShopNotify(@RequestBody JSONObject requestBody) { + Pair result = sfExpressApiService.createSfExpressShopInner( + requestBody.getInt("store_id"), + requestBody.getStr("shop_name"), + requestBody.getStr("city_name"), + requestBody.getStr("shop_address"), + requestBody.getStr("contact_name"), + requestBody.getStr("contact_phone"), + requestBody.getStr("longitude"), + requestBody.getStr("latitude") + ); + if (result.getFirst()) { + Map data = new HashMap<>(); + data.put("shop_id", result.getSecond()); + return CommonResult.success(data, "创建成功!"); + } + return CommonResult.failed(result.getSecond()); + } } diff --git a/mall-shop/src/main/java/com/suisung/mall/shop/sfexpress/service/SFExpressApiService.java b/mall-shop/src/main/java/com/suisung/mall/shop/sfexpress/service/SFExpressApiService.java index 7e67864a..4ea70306 100644 --- a/mall-shop/src/main/java/com/suisung/mall/shop/sfexpress/service/SFExpressApiService.java +++ b/mall-shop/src/main/java/com/suisung/mall/shop/sfexpress/service/SFExpressApiService.java @@ -42,6 +42,23 @@ public interface SFExpressApiService { Pair createSfExpressShop(Integer storeId, String shopName, String cityName, String shopAddress, String contactName, String contactPhone, String longitude, String latitude); + /** + * 创建顺丰同城(普通型)店铺(直调顺丰同城的接口,脱离我们的业务) + * + * @param storeId 商家门店ID + * @param shopName 店名 + * @param cityName 城市 + * @param shopAddress 店铺详细地址 + * @param contactName 店铺联系人 + * @param contactPhone 店铺电话 + * @param longitude 经度 + * @param latitude 纬度 + * @return Pair 第一个元素表示是否成功,第二个元素表示结果信息或错误信息 + */ + Pair createSfExpressShopInner(Integer storeId, String shopName, String cityName, + String shopAddress, String contactName, String contactPhone, + String longitude, String latitude); + /** * 创建顺丰同城店铺-连锁店铺回调 * @@ -190,13 +207,15 @@ public interface SFExpressApiService { /** * 商家自行配送发货 + * * @param orderId * @return */ - CommonResult selDelivery( String orderId); + CommonResult selDelivery(String orderId); /** * 商家手动完成订单 + * * @param shopOrderId * @return */ 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 9262529c..4e3e6ce3 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 @@ -339,6 +339,85 @@ public class SFExpressApiServiceImpl implements SFExpressApiService { } } + + /** + * 创建顺丰同城(普通型)店铺(直调顺丰同城的接口,脱离我们的业务) + * + * @param storeId 商家门店ID + * @param shopName 店名 + * @param cityName 城市 + * @param shopAddress 店铺详细地址 + * @param contactName 店铺联系人 + * @param contactPhone 店铺电话 + * @param longitude 经度 + * @param latitude 纬度 + * @return Pair 第一个元素表示是否成功,第二个元素表示结果信息或错误信息 + */ + @Override + public Pair createSfExpressShopInner(Integer storeId, String shopName, String cityName, + String shopAddress, String contactName, String contactPhone, + String longitude, String latitude) { + logger.info("开始创建顺丰同城店铺, storeId: {}", storeId); + + try { + // 1. 验证必要参数 + if (CheckUtil.isEmpty(storeId) || StringUtils.isAnyBlank(shopName, shopAddress, contactName, contactPhone)) { + logger.error("创建顺丰店铺,缺少必要参数!storeId:{},shopName:{},shopAddress:{},contactName:{},contactPhone:{}", storeId, shopName, shopAddress, contactName, contactPhone); + return Pair.of(false, "创建顺丰店铺,缺少必要参数!"); + } + + // 4. 构建请求参数 + Map params = buildCommonParams(); + params.put("supplier_id", supplierId); // 店铺所属商家id + params.put("out_shop_id", storeId); // 外部店铺ID + params.put("shop_name", shopName); // 店铺名称 + params.put("city_name", cityName); // 城市名称 + params.put("shop_product_types", "33"); // 33:便利店 + params.put("shop_type", 1); // 店铺类型: 1-普通型 2-平台型 + params.put("shop_address", shopAddress); // 店铺地址 + params.put("longitude", longitude); // 经度 + params.put("latitude", latitude); // 纬度 + params.put("shop_contact_name", contactName); // 联系人姓名 + params.put("shop_contact_phone", contactPhone); // 联系电话 + + logger.debug("开始创建顺丰店铺,参数:{}", params); + + // 5. 发送请求到顺丰接口 + String paramJSON = JsonUtil.toJSONString(params); + String sendUrl = buildUrl("createShop", paramJSON); + String responseStr = HttpUtil.post(sendUrl, paramJSON); + logger.debug("创建顺丰店铺结果:{}", responseStr); + if (StrUtil.isBlank(responseStr)) { + logger.error("创建顺丰店铺异常,无返回值!"); + return Pair.of(false, "创建顺丰店铺异常,无返回值!"); + } + + ThirdApiRes apiRes = JSONUtil.toBean(responseStr, ThirdApiRes.class); + if (apiRes == null) { + logger.error("创建顺丰店铺异常,返回值有误!!"); + return Pair.of(false, "创建顺丰店铺异常,返回值有误!"); + } + + // 6. 检查接口调用结果 + if (!apiRes.getError_code().equals(0) || apiRes.getResult() == null) { + String errMsg = apiRes.getError_code().equals(0) ? "创建顺丰店铺失败!" : "创建顺丰店铺失败: " + apiRes.getError_msg(); + logger.error("创建顺丰店铺失败: {}", errMsg); + return Pair.of(false, errMsg); + } + + // 7. 提取顺丰店铺ID并更新数据库 + JSONObject result = (JSONObject) apiRes.getResult(); + String sfShopId = result.getStr("shop_id"); + + logger.info("成功创建顺丰店铺,店铺ID: {}", sfShopId); + return Pair.of(true, sfShopId); + + } catch (Exception e) { + logger.error("创建顺丰同城店铺时发生异常: ", e); + return Pair.of(false, "创建顺丰同城店铺时发生异常: " + e.getMessage()); + } + } + /** * 创建顺丰同城店铺异步通知回调 * @@ -1166,17 +1245,18 @@ public class SFExpressApiServiceImpl implements SFExpressApiService { /** * 自行发货 + * * @param orderId * @return */ @Override public CommonResult selDelivery(String orderId) { ShopOrderBase shopOrderBase = checkedOrder(orderId); - if(!shopOrderBase.getOperate_flag().equals("0")){ + if (!shopOrderBase.getOperate_flag().equals("0")) { return CommonResult.failed("该状态不允许发货操作"); } - Pair pair= wxOrderShippingService.uploadShippingInfoToWx(2,shopOrderBase.getOrder_id()); - if(pair.getFirst()){ + Pair pair = wxOrderShippingService.uploadShippingInfoToWx(2, shopOrderBase.getOrder_id()); + if (pair.getFirst()) { //完成订单后修改订单异常操作流程进入完成订单环节 shopOrderBase.setOperate_flag("1"); shopOrderBaseService.updateById(shopOrderBase); @@ -1185,11 +1265,11 @@ public class SFExpressApiServiceImpl implements SFExpressApiService { QueryWrapper itemQueryWrapper = new QueryWrapper<>(); itemQueryWrapper.eq("order_id", orderId); List order_item_rows = shopOrderItemService.find(itemQueryWrapper); - if(!order_item_rows.isEmpty()){ + if (!order_item_rows.isEmpty()) { for (ShopOrderItem shopOrderItem : order_item_rows) { Map stockDeltaMap = new HashMap<>(); - String item_src_id= shopOrderItem.getItem_src_id(); - Integer order_item_quantity=shopOrderItem.getOrder_item_quantity(); + String item_src_id = shopOrderItem.getItem_src_id(); + Integer order_item_quantity = shopOrderItem.getOrder_item_quantity(); stockDeltaMap.put(item_src_id + "-" + shopOrderItem.getOrder_id(), -order_item_quantity); syncThirdDataService.incrProductStockToRedis(stockDeltaMap); } @@ -1201,12 +1281,13 @@ public class SFExpressApiServiceImpl implements SFExpressApiService { /** * 商家自行配送完成订单 + * * @param shopOrderId */ public CommonResult selFinishOrder(String shopOrderId) { Integer orderStatus = StateCode.ORDER_STATE_RECEIVED; //已签收 ShopOrderBase shopOrderBase = checkedOrder(shopOrderId); - if(!shopOrderBase.getOperate_flag().equals("1")){ + if (!shopOrderBase.getOperate_flag().equals("1")) { return CommonResult.failed("该状态不允许完成订单操作"); } // 送达后,发出催促微信用户确认收货通知 (同城配送不能调用微信的确认收货) @@ -1223,27 +1304,28 @@ public class SFExpressApiServiceImpl implements SFExpressApiService { /** * 校验订单是否正确 + * * @param shopOrderId * @return */ - private ShopOrderBase checkedOrder(String shopOrderId){ - if(StringUtils.isBlank(shopOrderId)){ + private ShopOrderBase checkedOrder(String shopOrderId) { + if (StringUtils.isBlank(shopOrderId)) { logger.info("订单号不能为空"); throw new ApiException("订单号不能为空"); } - UserDto userDto= ContextUtil.getCurrentUser(); - if(userDto==null){ + UserDto userDto = ContextUtil.getCurrentUser(); + if (userDto == null) { logger.info("用户不能为空"); throw new ApiException("用户不能为空"); } - if(userDto.getRole_id()!=2){ + if (userDto.getRole_id() != 2) { throw new ApiException("用户无权限"); } QueryWrapper shopOrderBaseQueryWrapper = new QueryWrapper<>(); shopOrderBaseQueryWrapper.eq("order_id", shopOrderId); shopOrderBaseQueryWrapper.eq("store_id", Integer.valueOf(userDto.getStore_id())); - List shopOrderBaseList= shopOrderBaseService.list(shopOrderBaseQueryWrapper); - if(shopOrderBaseList.isEmpty()){ + List shopOrderBaseList = shopOrderBaseService.list(shopOrderBaseQueryWrapper); + if (shopOrderBaseList.isEmpty()) { logger.info("订单号不存在"); throw new ApiException("订单号不存在"); } diff --git a/mall-shop/src/main/resources/bootstrap-prod.yml b/mall-shop/src/main/resources/bootstrap-prod.yml index 1b38418c..841bb27d 100644 --- a/mall-shop/src/main/resources/bootstrap-prod.yml +++ b/mall-shop/src/main/resources/bootstrap-prod.yml @@ -184,8 +184,8 @@ feieyun: sf-express: # 顺丰同城 api 接口配置 dev_id: 1715091463 - # 桂平顺丰平台商家id - supplier_id: 2273453450129 + # 桂平顺丰平台商家id 2273453450129 + supplier_id: 2269768012593 appid: 1715091463 appkey: 47466ae69c530f831395e1bc405639fb # dev_id: 1715091463 From 0f76b38418b86aa0b4276d6654e5538df61236c6 Mon Sep 17 00:00:00 2001 From: Jack <46790855@qq.com> Date: Wed, 22 Oct 2025 17:48:18 +0800 Subject: [PATCH 2/5] =?UTF-8?q?=E9=A1=BA=E4=B8=B0=E5=88=9B=E5=BB=BA?= =?UTF-8?q?=E5=86=85=E9=83=A8=E6=96=B9=E6=B3=95=E6=B7=BB=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/impl/SFExpressApiServiceImpl.java | 109 +++++++++++++++--- 1 file changed, 95 insertions(+), 14 deletions(-) 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 9262529c..cde651bf 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 @@ -339,6 +339,84 @@ public class SFExpressApiServiceImpl implements SFExpressApiService { } } + /** + * 创建顺丰同城(普通型)店铺(直调顺丰同城的接口,脱离我们的业务) + * + * @param storeId 商家门店ID + * @param shopName 店名 + * @param cityName 城市 + * @param shopAddress 店铺详细地址 + * @param contactName 店铺联系人 + * @param contactPhone 店铺电话 + * @param longitude 经度 + * @param latitude 纬度 + * @return Pair 第一个元素表示是否成功,第二个元素表示结果信息或错误信息 + */ + @Override + public Pair createSfExpressShopInner(Integer storeId, String shopName, String cityName, + String shopAddress, String contactName, String contactPhone, + String longitude, String latitude) { + logger.info("开始创建顺丰同城店铺, storeId: {}", storeId); + + try { + // 1. 验证必要参数 + if (CheckUtil.isEmpty(storeId) || StringUtils.isAnyBlank(shopName, shopAddress, contactName, contactPhone)) { + logger.error("创建顺丰店铺,缺少必要参数!storeId:{},shopName:{},shopAddress:{},contactName:{},contactPhone:{}", storeId, shopName, shopAddress, contactName, contactPhone); + return Pair.of(false, "创建顺丰店铺,缺少必要参数!"); + } + + // 4. 构建请求参数 + Map params = buildCommonParams(); + params.put("supplier_id", supplierId); // 店铺所属商家id + params.put("out_shop_id", storeId); // 外部店铺ID + params.put("shop_name", shopName); // 店铺名称 + params.put("city_name", cityName); // 城市名称 + params.put("shop_product_types", "33"); // 33:便利店 + params.put("shop_type", 1); // 店铺类型: 1-普通型 2-平台型 + params.put("shop_address", shopAddress); // 店铺地址 + params.put("longitude", longitude); // 经度 + params.put("latitude", latitude); // 纬度 + params.put("shop_contact_name", contactName); // 联系人姓名 + params.put("shop_contact_phone", contactPhone); // 联系电话 + + logger.debug("开始创建顺丰店铺,参数:{}", params); + + // 5. 发送请求到顺丰接口 + String paramJSON = JsonUtil.toJSONString(params); + String sendUrl = buildUrl("createShop", paramJSON); + String responseStr = HttpUtil.post(sendUrl, paramJSON); + logger.debug("创建顺丰店铺结果:{}", responseStr); + if (StrUtil.isBlank(responseStr)) { + logger.error("创建顺丰店铺异常,无返回值!"); + return Pair.of(false, "创建顺丰店铺异常,无返回值!"); + } + + ThirdApiRes apiRes = JSONUtil.toBean(responseStr, ThirdApiRes.class); + if (apiRes == null) { + logger.error("创建顺丰店铺异常,返回值有误!!"); + return Pair.of(false, "创建顺丰店铺异常,返回值有误!"); + } + + // 6. 检查接口调用结果 + if (!apiRes.getError_code().equals(0) || apiRes.getResult() == null) { + String errMsg = apiRes.getError_code().equals(0) ? "创建顺丰店铺失败!" : "创建顺丰店铺失败: " + apiRes.getError_msg(); + logger.error("创建顺丰店铺失败: {}", errMsg); + return Pair.of(false, errMsg); + } + + // 7. 提取顺丰店铺ID并更新数据库 + JSONObject result = (JSONObject) apiRes.getResult(); + String sfShopId = result.getStr("shop_id"); + + logger.info("成功创建顺丰店铺,店铺ID: {}", sfShopId); + return Pair.of(true, sfShopId); + + } catch (Exception e) { + logger.error("创建顺丰同城店铺时发生异常: ", e); + return Pair.of(false, "创建顺丰同城店铺时发生异常: " + e.getMessage()); + } + } + /** * 创建顺丰同城店铺异步通知回调 * @@ -1166,17 +1244,18 @@ public class SFExpressApiServiceImpl implements SFExpressApiService { /** * 自行发货 + * * @param orderId * @return */ @Override public CommonResult selDelivery(String orderId) { ShopOrderBase shopOrderBase = checkedOrder(orderId); - if(!shopOrderBase.getOperate_flag().equals("0")){ + if (!shopOrderBase.getOperate_flag().equals("0")) { return CommonResult.failed("该状态不允许发货操作"); } - Pair pair= wxOrderShippingService.uploadShippingInfoToWx(2,shopOrderBase.getOrder_id()); - if(pair.getFirst()){ + Pair pair = wxOrderShippingService.uploadShippingInfoToWx(2, shopOrderBase.getOrder_id()); + if (pair.getFirst()) { //完成订单后修改订单异常操作流程进入完成订单环节 shopOrderBase.setOperate_flag("1"); shopOrderBaseService.updateById(shopOrderBase); @@ -1185,11 +1264,11 @@ public class SFExpressApiServiceImpl implements SFExpressApiService { QueryWrapper itemQueryWrapper = new QueryWrapper<>(); itemQueryWrapper.eq("order_id", orderId); List order_item_rows = shopOrderItemService.find(itemQueryWrapper); - if(!order_item_rows.isEmpty()){ + if (!order_item_rows.isEmpty()) { for (ShopOrderItem shopOrderItem : order_item_rows) { Map stockDeltaMap = new HashMap<>(); - String item_src_id= shopOrderItem.getItem_src_id(); - Integer order_item_quantity=shopOrderItem.getOrder_item_quantity(); + String item_src_id = shopOrderItem.getItem_src_id(); + Integer order_item_quantity = shopOrderItem.getOrder_item_quantity(); stockDeltaMap.put(item_src_id + "-" + shopOrderItem.getOrder_id(), -order_item_quantity); syncThirdDataService.incrProductStockToRedis(stockDeltaMap); } @@ -1201,12 +1280,13 @@ public class SFExpressApiServiceImpl implements SFExpressApiService { /** * 商家自行配送完成订单 + * * @param shopOrderId */ public CommonResult selFinishOrder(String shopOrderId) { Integer orderStatus = StateCode.ORDER_STATE_RECEIVED; //已签收 ShopOrderBase shopOrderBase = checkedOrder(shopOrderId); - if(!shopOrderBase.getOperate_flag().equals("1")){ + if (!shopOrderBase.getOperate_flag().equals("1")) { return CommonResult.failed("该状态不允许完成订单操作"); } // 送达后,发出催促微信用户确认收货通知 (同城配送不能调用微信的确认收货) @@ -1223,27 +1303,28 @@ public class SFExpressApiServiceImpl implements SFExpressApiService { /** * 校验订单是否正确 + * * @param shopOrderId * @return */ - private ShopOrderBase checkedOrder(String shopOrderId){ - if(StringUtils.isBlank(shopOrderId)){ + private ShopOrderBase checkedOrder(String shopOrderId) { + if (StringUtils.isBlank(shopOrderId)) { logger.info("订单号不能为空"); throw new ApiException("订单号不能为空"); } - UserDto userDto= ContextUtil.getCurrentUser(); - if(userDto==null){ + UserDto userDto = ContextUtil.getCurrentUser(); + if (userDto == null) { logger.info("用户不能为空"); throw new ApiException("用户不能为空"); } - if(userDto.getRole_id()!=2){ + if (userDto.getRole_id() != 2) { throw new ApiException("用户无权限"); } QueryWrapper shopOrderBaseQueryWrapper = new QueryWrapper<>(); shopOrderBaseQueryWrapper.eq("order_id", shopOrderId); shopOrderBaseQueryWrapper.eq("store_id", Integer.valueOf(userDto.getStore_id())); - List shopOrderBaseList= shopOrderBaseService.list(shopOrderBaseQueryWrapper); - if(shopOrderBaseList.isEmpty()){ + List shopOrderBaseList = shopOrderBaseService.list(shopOrderBaseQueryWrapper); + if (shopOrderBaseList.isEmpty()) { logger.info("订单号不存在"); throw new ApiException("订单号不存在"); } From ea4d5f334ed82049d32c7748dd7a5eac33835c7b Mon Sep 17 00:00:00 2001 From: Jack <46790855@qq.com> Date: Thu, 23 Oct 2025 02:04:05 +0800 Subject: [PATCH 3/5] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E9=A2=84=E5=AE=9A?= =?UTF-8?q?=E4=BB=BB=E5=8A=A1=E8=A1=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../modules/order/ShopOrderBooking.java | 53 +++++++++++++++++++ .../common/modules/order/ShopOrderInfo.java | 3 ++ .../order/mapper/ShopOrderBookingMapper.java | 15 ++++++ .../service/ShopOrderBookingService.java | 17 ++++++ .../impl/ShopOrderBookingServiceImpl.java | 22 ++++++++ .../mapper/order/ShopOrderBookingMapper.xml | 8 +++ 6 files changed, 118 insertions(+) create mode 100644 mall-common/src/main/java/com/suisung/mall/common/modules/order/ShopOrderBooking.java create mode 100644 mall-shop/src/main/java/com/suisung/mall/shop/order/mapper/ShopOrderBookingMapper.java create mode 100644 mall-shop/src/main/java/com/suisung/mall/shop/order/service/ShopOrderBookingService.java create mode 100644 mall-shop/src/main/java/com/suisung/mall/shop/order/service/impl/ShopOrderBookingServiceImpl.java create mode 100644 mall-shop/src/main/resources/mapper/order/ShopOrderBookingMapper.xml diff --git a/mall-common/src/main/java/com/suisung/mall/common/modules/order/ShopOrderBooking.java b/mall-common/src/main/java/com/suisung/mall/common/modules/order/ShopOrderBooking.java new file mode 100644 index 00000000..b99c673c --- /dev/null +++ b/mall-common/src/main/java/com/suisung/mall/common/modules/order/ShopOrderBooking.java @@ -0,0 +1,53 @@ +package com.suisung.mall.common.modules.order; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.util.Date; + +/** + *

+ * 预约订单任务表 + *

+ */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@TableName("shop_order_booking") +@ApiModel(value = "ShopOrderBooking对象", description = "预约订单任务表") +public class ShopOrderBooking implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "自增Id") + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + @ApiModelProperty(value = "订单Id") + private String order_id; + + @ApiModelProperty(value = "Redis 任务键") + private String task_key; + + @ApiModelProperty(value = "执行时间戳(秒)") + private Long run_at; + + @ApiModelProperty(value = "预约送达时间戳(秒)") + private Long booking_at; + + @ApiModelProperty(value = "状态:1-有效(任务待执行);2-无效(任务已执行);") + private Integer status = 1; + + @ApiModelProperty(value = "创建时间") + private Date created_at; + + @ApiModelProperty(value = "更改时间") + private Date updated_at; +} diff --git a/mall-common/src/main/java/com/suisung/mall/common/modules/order/ShopOrderInfo.java b/mall-common/src/main/java/com/suisung/mall/common/modules/order/ShopOrderInfo.java index e8e42e57..a920a637 100644 --- a/mall-common/src/main/java/com/suisung/mall/common/modules/order/ShopOrderInfo.java +++ b/mall-common/src/main/java/com/suisung/mall/common/modules/order/ShopOrderInfo.java @@ -213,6 +213,9 @@ public class ShopOrderInfo implements Serializable { @ApiModelProperty(value = "预约送达截止时间,格式如:yyyy-MM-dd HH:mm:ss") private Date booking_end_time; + @ApiModelProperty(value = "预订单到达时间戳(秒)") + private Date booking_at; + @ApiModelProperty(value = "新建时间") private Date created_at; diff --git a/mall-shop/src/main/java/com/suisung/mall/shop/order/mapper/ShopOrderBookingMapper.java b/mall-shop/src/main/java/com/suisung/mall/shop/order/mapper/ShopOrderBookingMapper.java new file mode 100644 index 00000000..939bc0fc --- /dev/null +++ b/mall-shop/src/main/java/com/suisung/mall/shop/order/mapper/ShopOrderBookingMapper.java @@ -0,0 +1,15 @@ +/* + * Copyright (c) 2025. Lorem ipsum dolor sit amet, consectetur adipiscing elit. + * Morbi non lorem porttitor neque feugiat blandit. Ut vitae ipsum eget quam lacinia accumsan. + * Etiam sed turpis ac ipsum condimentum fringilla. Maecenas magna. + * Proin dapibus sapien vel ante. Aliquam erat volutpat. Pellentesque sagittis ligula eget metus. + * Vestibulum commodo. Ut rhoncus gravida arcu. + */ + +package com.suisung.mall.shop.order.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.suisung.mall.common.modules.order.ShopOrderBooking; + +public interface ShopOrderBookingMapper extends BaseMapper { +} diff --git a/mall-shop/src/main/java/com/suisung/mall/shop/order/service/ShopOrderBookingService.java b/mall-shop/src/main/java/com/suisung/mall/shop/order/service/ShopOrderBookingService.java new file mode 100644 index 00000000..a34aa61b --- /dev/null +++ b/mall-shop/src/main/java/com/suisung/mall/shop/order/service/ShopOrderBookingService.java @@ -0,0 +1,17 @@ +/* + * Copyright (c) 2025. Lorem ipsum dolor sit amet, consectetur adipiscing elit. + * Morbi non lorem porttitor neque feugiat blandit. Ut vitae ipsum eget quam lacinia accumsan. + * Etiam sed turpis ac ipsum condimentum fringilla. Maecenas magna. + * Proin dapibus sapien vel ante. Aliquam erat volutpat. Pellentesque sagittis ligula eget metus. + * Vestibulum commodo. Ut rhoncus gravida arcu. + */ + +package com.suisung.mall.shop.order.service; + +import com.suisung.mall.common.modules.order.ShopOrderBooking; +import com.suisung.mall.core.web.service.IBaseService; + +public interface ShopOrderBookingService extends IBaseService { + + +} diff --git a/mall-shop/src/main/java/com/suisung/mall/shop/order/service/impl/ShopOrderBookingServiceImpl.java b/mall-shop/src/main/java/com/suisung/mall/shop/order/service/impl/ShopOrderBookingServiceImpl.java new file mode 100644 index 00000000..5083c174 --- /dev/null +++ b/mall-shop/src/main/java/com/suisung/mall/shop/order/service/impl/ShopOrderBookingServiceImpl.java @@ -0,0 +1,22 @@ +/* + * Copyright (c) 2025. Lorem ipsum dolor sit amet, consectetur adipiscing elit. + * Morbi non lorem porttitor neque feugiat blandit. Ut vitae ipsum eget quam lacinia accumsan. + * Etiam sed turpis ac ipsum condimentum fringilla. Maecenas magna. + * Proin dapibus sapien vel ante. Aliquam erat volutpat. Pellentesque sagittis ligula eget metus. + * Vestibulum commodo. Ut rhoncus gravida arcu. + */ + +package com.suisung.mall.shop.order.service.impl; + +import com.suisung.mall.common.modules.order.ShopOrderBooking; +import com.suisung.mall.core.web.service.impl.BaseServiceImpl; +import com.suisung.mall.shop.order.mapper.ShopOrderBookingMapper; +import com.suisung.mall.shop.order.service.ShopOrderBookingService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +@Slf4j +@Service +public class ShopOrderBookingServiceImpl extends BaseServiceImpl implements ShopOrderBookingService { + +} diff --git a/mall-shop/src/main/resources/mapper/order/ShopOrderBookingMapper.xml b/mall-shop/src/main/resources/mapper/order/ShopOrderBookingMapper.xml new file mode 100644 index 00000000..74d140ce --- /dev/null +++ b/mall-shop/src/main/resources/mapper/order/ShopOrderBookingMapper.xml @@ -0,0 +1,8 @@ + + + + + + * + + From 8fcfbe2c5ec2a552d75142172aee63c2785fa863 Mon Sep 17 00:00:00 2001 From: Jack <46790855@qq.com> Date: Thu, 23 Oct 2025 02:17:31 +0800 Subject: [PATCH 4/5] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E9=A2=84=E5=AE=9A?= =?UTF-8?q?=E5=8D=95=E5=AD=97=E6=AE=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/suisung/mall/common/modules/order/ShopOrderInfo.java | 2 +- .../mall/shop/order/service/impl/ShopOrderBaseServiceImpl.java | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/mall-common/src/main/java/com/suisung/mall/common/modules/order/ShopOrderInfo.java b/mall-common/src/main/java/com/suisung/mall/common/modules/order/ShopOrderInfo.java index a920a637..87758926 100644 --- a/mall-common/src/main/java/com/suisung/mall/common/modules/order/ShopOrderInfo.java +++ b/mall-common/src/main/java/com/suisung/mall/common/modules/order/ShopOrderInfo.java @@ -214,7 +214,7 @@ public class ShopOrderInfo implements Serializable { private Date booking_end_time; @ApiModelProperty(value = "预订单到达时间戳(秒)") - private Date booking_at; + private Long booking_at; @ApiModelProperty(value = "新建时间") private Date created_at; 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 545141eb..8af35887 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 @@ -6638,6 +6638,7 @@ public class ShopOrderBaseServiceImpl extends BaseServiceImpl Date: Thu, 23 Oct 2025 10:10:17 +0800 Subject: [PATCH 5/5] =?UTF-8?q?=E5=90=8C=E5=9F=8E=E9=85=8D=E9=80=81?= =?UTF-8?q?=E6=97=B6=E4=BF=AE=E6=94=B9=E5=85=BC=E5=AE=B9=E6=89=8B=E5=8A=A8?= =?UTF-8?q?=E9=85=8D=E9=80=81=E7=9A=84=E5=BE=AE=E4=BF=A1=E5=8F=91=E8=B4=A7?= =?UTF-8?q?=E6=93=8D=E4=BD=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/impl/SFExpressApiServiceImpl.java | 3 ++- .../service/impl/WxOrderShippingServiceImpl.java | 12 ++++++------ 2 files changed, 8 insertions(+), 7 deletions(-) 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 cde651bf..03591074 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 @@ -1273,9 +1273,10 @@ public class SFExpressApiServiceImpl implements SFExpressApiService { syncThirdDataService.incrProductStockToRedis(stockDeltaMap); } } + return CommonResult.success("操作成功"); //出库扣减思迅库存end } - return CommonResult.success("操作成功"); + return CommonResult.failed("操作失败:"+pair.getSecond()); } /** diff --git a/mall-shop/src/main/java/com/suisung/mall/shop/wechat/service/impl/WxOrderShippingServiceImpl.java b/mall-shop/src/main/java/com/suisung/mall/shop/wechat/service/impl/WxOrderShippingServiceImpl.java index 19ed7cdf..a0f605b9 100644 --- a/mall-shop/src/main/java/com/suisung/mall/shop/wechat/service/impl/WxOrderShippingServiceImpl.java +++ b/mall-shop/src/main/java/com/suisung/mall/shop/wechat/service/impl/WxOrderShippingServiceImpl.java @@ -113,16 +113,16 @@ public class WxOrderShippingServiceImpl implements WxOrderShippingService { shippingItem.set("tracking_no", shopOrderLogistics.getOrder_tracking_number()); shippingItem.set("express_company", shopOrderLogistics.getLogistics_number()); - } else if (logisticsType == 2) { + } else if (logisticsType == 2) {//同城配送tracking_no和express_company为非必填项,如果存在自行配送,也可以手动发货 ShopStoreSfOrder shopStoreSfOrder = shopStoreSfOrderService.getByShopOrderId(orderId); - if (shopStoreSfOrder == null) { + if (shopStoreSfOrder != null) { + shippingItem.set("tracking_no", shopStoreSfOrder.getSf_bill_id());//非必填字段 + shippingItem.set("express_company", "SF");//非必填字段 + }else { log.error("无法获取顺丰同城订单记录,订单ID: {}", orderId); - return Pair.of(false, "无法获取顺丰同城订单记录"); + // return Pair.of(false, "无法获取顺丰同城订单记录"); } - shippingItem.set("tracking_no", shopStoreSfOrder.getSf_bill_id()); - shippingItem.set("express_company", "SF"); } - shippingItem.putOpt("contact", new JSONObject() .set("receiver_contact", receiverContact));