diff --git a/mall-shop/src/main/java/com/suisung/mall/shop/esign/service/impl/EsignContractFillingFileServiceImpl.java b/mall-shop/src/main/java/com/suisung/mall/shop/esign/service/impl/EsignContractFillingFileServiceImpl.java index cecc2b57..f39b49d3 100644 --- a/mall-shop/src/main/java/com/suisung/mall/shop/esign/service/impl/EsignContractFillingFileServiceImpl.java +++ b/mall-shop/src/main/java/com/suisung/mall/shop/esign/service/impl/EsignContractFillingFileServiceImpl.java @@ -104,55 +104,54 @@ public class EsignContractFillingFileServiceImpl extends BaseServiceImpl() {{ @@ -407,7 +406,7 @@ public class EsignContractFillingFileServiceImpl extends BaseServiceImpl 0; - log.info("合同文件生成完成, storeId: {}, 总模版数: {}, 成功处理数: {}, 结果: {}", + log.info("[合同生成] 商家合同文件全部生成完毕, storeId: {}, 总模板数: {}, 成功处理数: {}, 最终结果: {}", storeId, templates.size(), successCnt, result); return result; diff --git a/mall-shop/src/main/java/com/suisung/mall/shop/esign/service/impl/EsignContractServiceImpl.java b/mall-shop/src/main/java/com/suisung/mall/shop/esign/service/impl/EsignContractServiceImpl.java index fbfa2ae5..e5147939 100644 --- a/mall-shop/src/main/java/com/suisung/mall/shop/esign/service/impl/EsignContractServiceImpl.java +++ b/mall-shop/src/main/java/com/suisung/mall/shop/esign/service/impl/EsignContractServiceImpl.java @@ -202,7 +202,7 @@ public class EsignContractServiceImpl extends BaseServiceImpl receiveCompleteNotify(HttpServletRequest request) { // 完整地址: https://mall.gpxscs.cn/api/mobile/shop/lakala/trans/receive/completeNotify JSONObject resp = lakalaPayService.receiveCompleteNotify(request); 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 97d9b323..97ea60b3 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 @@ -5022,7 +5022,7 @@ public class ShopOrderBaseServiceImpl extends BaseServiceImpl queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("order_id", shopOrderId); + ShopOrderReturn shopOrderReturn = findOne(queryWrapper); + if (shopOrderReturn == null) { + logger.error("[顺丰超时自动退款] 订单信息异常,未找到退货单: shopOrderId={}", shopOrderId); + return false; + } + + if (ObjectUtil.equal(shopOrderReturn.getReturn_state_id(), StateCode.RETURN_PROCESS_FINISH) + || ObjectUtil.equal(shopOrderReturn.getReturn_is_paid(), CommonConstant.Enable)) { + logger.warn("[顺丰超时自动退款] 订单之前已处理完成,请勿重复处理: shopOrderId={}", shopOrderId); + return true; + } + // 对已存在部分退款的订单,进行剩余商品的全部退款 CommonResult commonResult = addRemainingItems(shopOrderId, true, remark); commonResult.checkFenResult(); logger.debug("[顺丰超时自动退款] 整单退货申请创建成功: shopOrderId={}", shopOrderId); - QueryWrapper queryWrapper = new QueryWrapper<>(); - queryWrapper.eq("order_id", shopOrderId); - ShopOrderReturn shopOrderReturn = findOne(queryWrapper); - - if (shopOrderReturn == null) { - logger.error("[顺丰超时自动退款] 订单信息异常,未找到退货单: shopOrderId={}", shopOrderId); - throw new ApiException(I18nUtil._("订单信息异常!")); - } - shopOrderReturn.setReturn_flag(0); // 0-不用退货;1-需要退货 shopOrderReturn.setReturn_buyer_message(remark); shopOrderReturn.setReturn_store_message(remark); @@ -1886,7 +1891,7 @@ public class ShopOrderReturnServiceImpl extends BaseServiceImpl updateWrapper = new QueryWrapper<>(); 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 c6898d0a..73f6e8d2 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 @@ -164,6 +164,14 @@ public interface SFExpressApiService { */ ThirdApiRes notifyProductReady(Map params); + /** + * 订单实时信息查询 + * https://openic.sf-express.com/open/api/external/getorderstatus?sign=$sign + * + * @param sfOrderId + * @return + */ + ThirdApiRes getOrderStatus(String sfOrderId); // *********** 顺丰同城回调相关业务 **************** @@ -194,18 +202,6 @@ public interface SFExpressApiService { */ ThirdApiRes receiveOrderCompleteNotify(String jsonData, String sign); -// -// /** -// * 个推推送消息到员工 -// * -// * @param storeId -// * @param orderId -// * @param message -// * @param payloadJson -// * @return -// */ -// void pushMessageToStoreEmployee(Integer storeId, String orderId, String message, String payloadJson); - /** * 商家自行配送发货 * 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 701b3620..b4e5af13 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 @@ -675,9 +675,10 @@ public class SFExpressApiServiceImpl implements SFExpressApiService { public ThirdApiRes cancelOrder(String orderId, Integer cancelCode, String cancelReason) { Map params = buildCommonParams(); params.put("order_id", shopStoreSfOrderService.getSfOrderIdByShopOrderId(orderId)); // 商家 orderId 转 顺丰的订单号 + params.put("cancel_type", 1); //1、顺丰订单号 2、商家订单号 if (StrUtil.isNotBlank(cancelReason) && cancelCode != null) { - params.put("cancel_code", orderId); - params.put("cancel_reason", orderId); + params.put("cancel_code", cancelCode); + params.put("cancel_reason", cancelReason); } return cancelOrder(params); } @@ -691,18 +692,33 @@ public class SFExpressApiServiceImpl implements SFExpressApiService { @Override @Transactional public ThirdApiRes cancelOrder(Map params) { - logger.info("[顺丰] 开始取消订单流程"); + logger.info("[取消顺丰订单] 开始取消顺丰订单流程"); // 1. 参数校验 if (params == null || ObjectUtil.isEmpty(params.get("order_id"))) { - logger.warn("[顺丰] 取消订单参数校验失败: 参数为空或缺少order_id"); + logger.warn("[取消顺丰订单] 取消订单参数校验失败: 参数为空或缺少order_id"); return new ThirdApiRes().fail(1003, "请求参数有误!"); } try { // 2. 获取顺丰订单号 String sfOrderId = params.get("order_id").toString(); - logger.debug("[顺丰] 准备取消订单: sfOrderId={}", sfOrderId); + logger.debug("[取消顺丰订单] 准备取消订单: sfOrderId={}", sfOrderId); + + // 先实时查询顺丰订单状态 + ThirdApiRes thirdApiRes = getOrderStatus(sfOrderId); + if (thirdApiRes != null && ObjectUtil.equal(thirdApiRes.getError_code(), 0)) { + Object resultObj = thirdApiRes.getResult(); + if (resultObj != null) { + JSONObject result = JSONUtil.parseObj(resultObj); + Integer orderStatus = result.getInt("order_status"); + if (orderStatus != null && + (ObjectUtil.equal(orderStatus, SFExpressConstant.Cons_CanceledOrder) || + ObjectUtil.equal(orderStatus, SFExpressConstant.Cons_CancelingOrder))) { + return new ThirdApiRes().success("订单已取消过!"); + } + } + } // 3. 添加公共参数 params.putAll(buildCommonParams()); @@ -710,34 +726,34 @@ public class SFExpressApiServiceImpl implements SFExpressApiService { // 4. 调用顺丰取消订单接口 String sendUrl = buildUrl("cancelorder", paramJSON); - logger.debug("[顺丰] 调用取消订单接口: url={}, params={}", sendUrl, paramJSON); + logger.debug("[取消顺丰订单] 调用取消订单接口: url={}, params={}", sendUrl, paramJSON); String responseStr = HttpUtil.post(sendUrl, paramJSON); if (StrUtil.isBlank(responseStr)) { - logger.error("[顺丰] 取消订单接口调用失败: 无返回值, sfOrderId={}", sfOrderId); + logger.error("[取消顺丰订单] 取消订单接口调用失败: 无返回值, sfOrderId={}", sfOrderId); return new ThirdApiRes().fail(2, "顺丰同城:无返回值!"); } // 5. 解析接口响应 ThirdApiRes sfExpressApiRes = JsonUtil.json2object(responseStr, ThirdApiRes.class); if (sfExpressApiRes == null) { - logger.error("[顺丰] 取消订单接口响应解析失败: {}, sfOrderId={}", responseStr, sfOrderId); + logger.error("[取消顺丰订单] 取消订单接口响应解析失败: {}, sfOrderId={}", responseStr, sfOrderId); return new ThirdApiRes().fail(2, "顺丰同城:响应解析失败!"); } // 6. 检查接口调用结果 if (!sfExpressApiRes.getError_code().equals(0)) { - logger.error("[顺丰] 取消订单接口调用失败: errorCode={}, errorMsg={}, sfOrderId={}", + logger.error("[取消顺丰订单] 取消订单接口调用失败: errorCode={}, errorMsg={}, sfOrderId={}", sfExpressApiRes.getError_code(), sfExpressApiRes.getError_msg(), sfOrderId); return new ThirdApiRes().fail(2, sfExpressApiRes.getError_msg()); } - logger.info("[顺丰] 顺丰接口取消订单成功: sfOrderId={}", sfOrderId); + logger.info("[取消顺丰订单] 顺丰接口取消订单成功: sfOrderId={}", sfOrderId); // 7. 检查本地订单状态 - ShopStoreSfOrder existingOrder = shopStoreSfOrderService.getByShopOrderId(sfOrderId); + ShopStoreSfOrder existingOrder = shopStoreSfOrderService.getBySfOrderId(sfOrderId); if (existingOrder == null) { - logger.error("[顺丰] 本地订单不存在: sfOrderId={}", sfOrderId); + logger.error("[取消顺丰订单] 本地订单不存在: sfOrderId={}", sfOrderId); return new ThirdApiRes().fail(2, "订单不存在!"); } @@ -745,7 +761,7 @@ public class SFExpressApiServiceImpl implements SFExpressApiService { if (existingOrder.getOrder_status() != null && (existingOrder.getOrder_status().equals(StateCode.SF_ORDER_STATUS_CANCELED) || existingOrder.getOrder_status().equals(StateCode.SF_ORDER_STATUS_CANCELING))) { - logger.info("[顺丰] 订单已处于取消状态,无需重复操作: sfOrderId={}, status={}", + logger.info("[取消顺丰订单] 订单已处于取消状态,无需重复操作: sfOrderId={}, status={}", sfOrderId, existingOrder.getOrder_status()); return new ThirdApiRes().success("订单已取消过!"); } @@ -758,15 +774,15 @@ public class SFExpressApiServiceImpl implements SFExpressApiService { Boolean updateSuccess = shopStoreSfOrderService.updateShopStoreSfOrderStatus(updateOrder); if (!updateSuccess) { - logger.error("[顺丰] 更新本地订单状态失败: sfOrderId={}", sfOrderId); + logger.error("[取消顺丰订单] 更新本地订单状态失败: sfOrderId={}", sfOrderId); throw new ApiException(_("取消顺丰订单失败!")); } - logger.info("[顺丰] 本地订单状态更新成功: sfOrderId={}", sfOrderId); + logger.info("[取消顺丰订单] 本地订单状态更新成功: sfOrderId={}", sfOrderId); return sfExpressApiRes; } catch (Exception e) { - logger.error("[顺丰] 取消订单过程中发生异常: ", e); + logger.error("[取消顺丰订单] 取消订单过程中发生异常: ", e); return new ThirdApiRes().fail(-1, "系统异常: " + e.getMessage()); } } @@ -974,6 +990,39 @@ public class SFExpressApiServiceImpl implements SFExpressApiService { return JsonUtil.json2object(retRespStr, ThirdApiRes.class); } + /** + * 订单实时信息查询 + * https://openic.sf-express.com/open/api/external/getorderstatus?sign=$sign + * + * @param sfOrderId + * @return + */ + @Override + public ThirdApiRes getOrderStatus(String sfOrderId) { + if (StrUtil.isBlank(sfOrderId)) { + return new ThirdApiRes().fail(1003, "缺少必要参数!"); + } + + Map params = buildCommonParams(); + params.put("order_id", sfOrderId); + params.put("order_type", 1);//查询订单ID类型:1、顺丰订单号 2、商家订单号 + + + // 转换 json 字符串参数 + String paramJSON = JsonUtil.toJSONString(params); + logger.debug("订单实时信息查询:" + paramJSON); + + // 根据参数生成请求签名 + String send_url = buildUrl("getorderstatus", paramJSON); + String retRespStr = HttpUtil.post(send_url, paramJSON); + if (StrUtil.isBlank(retRespStr)) { + logger.error("顺丰同城:订单实时信息查询,无返回值!"); + return new ThirdApiRes().fail(-1, "顺丰同城:无返回值!"); + } + + return JsonUtil.json2object(retRespStr, ThirdApiRes.class); + } + /** * 接收顺丰原因订单取消回调 diff --git a/mall-shop/src/main/java/com/suisung/mall/shop/store/service/impl/ShopStoreBaseServiceImpl.java b/mall-shop/src/main/java/com/suisung/mall/shop/store/service/impl/ShopStoreBaseServiceImpl.java index a941e594..4c541f73 100644 --- a/mall-shop/src/main/java/com/suisung/mall/shop/store/service/impl/ShopStoreBaseServiceImpl.java +++ b/mall-shop/src/main/java/com/suisung/mall/shop/store/service/impl/ShopStoreBaseServiceImpl.java @@ -1538,6 +1538,7 @@ public class ShopStoreBaseServiceImpl extends BaseServiceImpl) data.get("items"), true)); @@ -1586,6 +1589,7 @@ public class ShopStoreBaseServiceImpl extends BaseServiceImpl wrapper = new QueryWrapper<>(); - wrapper.eq("shop_order_id", shopOrderId); - return getOne(wrapper); + + if (StrUtil.startWith(shopOrderId, "JS")) { // 顺丰同城的订单号标志 + return getBySfOrderId(shopOrderId); + } else { + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("shop_order_id", shopOrderId); + return getOne(wrapper); + } } /** diff --git a/pom.xml b/pom.xml index 993e72b7..68a9333d 100644 --- a/pom.xml +++ b/pom.xml @@ -581,7 +581,6 @@ true ${docker.ca} - openjdk:8-jre @@ -600,11 +599,6 @@ ["sh", "-c", "mkdir -p /tmp /app/temp /root/nacos/naming/public && chmod -R 777 /tmp /app/temp /root/nacos && java -Djava.io.tmpdir=/app/temp -Dnacos.naming.cache.dir=/root/nacos/naming -jar -Xms256m -Xmx512m -XX:MetaspaceSize=256m -XX:MaxMetaspaceSize=256m -XX:+UseContainerSupport -XX:MaxRAMPercentage=60.0 -XX:+UseSerialGC -XX:MinHeapFreeRatio=40 -XX:MaxHeapFreeRatio=60 -XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:./gc.log -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=5 -XX:GCLogFileSize=10M -Dspring.profiles.active=${spring.profile} -Duser.timezone=Asia/Shanghai /${project.build.finalName}.jar"] - - - - - /