From b7701a86851ca18e836b3d413c9d61cf5cd51734 Mon Sep 17 00:00:00 2001 From: Jack <46790855@qq.com> Date: Sat, 18 Oct 2025 10:12:16 +0800 Subject: [PATCH 01/23] =?UTF-8?q?=E5=90=8C=E4=B8=80=E5=95=86=E6=88=B7?= =?UTF-8?q?=E5=88=86=E8=B4=A6=E5=90=88=E5=B9=B6=EF=BC=8C=E5=A2=9E=E5=8A=A0?= =?UTF-8?q?=E6=89=93=E7=A5=A8=E6=9C=BA=E6=89=93=E5=8D=B0=E6=97=A5=E5=BF=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dto/LklSeparateWithTotalAmountDTO.java | 2 +- .../shop/lakala/service/LakalaApiService.java | 3 +- .../service/impl/LakalaApiServiceImpl.java | 26 +++-- .../service/impl/ShopOrderLklServiceImpl.java | 8 +- .../store/service/ShopStoreInfoService.java | 8 ++ .../impl/ShopStoreBaseServiceImpl.java | 106 +++++++++--------- .../impl/ShopStoreInfoServiceImpl.java | 7 ++ 7 files changed, 93 insertions(+), 67 deletions(-) diff --git a/mall-common/src/main/java/com/suisung/mall/common/pojo/dto/LklSeparateWithTotalAmountDTO.java b/mall-common/src/main/java/com/suisung/mall/common/pojo/dto/LklSeparateWithTotalAmountDTO.java index 8721b4a1..60840f8c 100644 --- a/mall-common/src/main/java/com/suisung/mall/common/pojo/dto/LklSeparateWithTotalAmountDTO.java +++ b/mall-common/src/main/java/com/suisung/mall/common/pojo/dto/LklSeparateWithTotalAmountDTO.java @@ -62,7 +62,7 @@ public class LklSeparateWithTotalAmountDTO { // 测试用例1: 所有参与方都参与分账(符合比例要求) System.out.println("=== 测试用例1: 所有参与方都参与分账 ==="); LklSeparateWithTotalAmountDTO dto1 = new LklSeparateWithTotalAmountDTO(); - dto1.setTotalSeparateAmount(5500); // 总金额100元(10000分) + dto1.setTotalSeparateAmount(1696); // 总金额100元(10000分) dto1.setShippingFee(500); // dto1.setRefCanSeparateAmount(1496); dto1.setLklRatio(new BigDecimal("0.0025")); // 拉卡拉分账比例0.25% diff --git a/mall-shop/src/main/java/com/suisung/mall/shop/lakala/service/LakalaApiService.java b/mall-shop/src/main/java/com/suisung/mall/shop/lakala/service/LakalaApiService.java index f4c12f23..8b653e06 100644 --- a/mall-shop/src/main/java/com/suisung/mall/shop/lakala/service/LakalaApiService.java +++ b/mall-shop/src/main/java/com/suisung/mall/shop/lakala/service/LakalaApiService.java @@ -208,9 +208,10 @@ public interface LakalaApiService { * @param lklMerchantNo 拉卡拉商户号 * @param receiveTradeNo 收货交易号(对应拉卡拉的trade_no) * @param receiveLogNo 收货流水号(对应拉卡拉的log_no) + * @param logDate posp日期,yyyyMMdd,查清结算用, 一般是值交易完成日期(确认收货的日期) * @return Pair 处理结果对,first为是否成功,second为结果描述信息 */ - Pair innerDoOrderSeparateByMerchantAndLogNo(String lklMerchantNo, String receiveTradeNo, String receiveLogNo); + Pair innerDoOrderSeparateByMerchantAndLogNo(String lklMerchantNo, String receiveTradeNo, String receiveLogNo, String logDate); /** * 分账结果通知 diff --git a/mall-shop/src/main/java/com/suisung/mall/shop/lakala/service/impl/LakalaApiServiceImpl.java b/mall-shop/src/main/java/com/suisung/mall/shop/lakala/service/impl/LakalaApiServiceImpl.java index 9a34c6f8..ba045ddf 100644 --- a/mall-shop/src/main/java/com/suisung/mall/shop/lakala/service/impl/LakalaApiServiceImpl.java +++ b/mall-shop/src/main/java/com/suisung/mall/shop/lakala/service/impl/LakalaApiServiceImpl.java @@ -11,6 +11,7 @@ package com.suisung.mall.shop.lakala.service.impl; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.convert.Convert; +import cn.hutool.core.date.DateUtil; import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; import cn.hutool.json.JSONArray; @@ -823,7 +824,15 @@ public class LakalaApiServiceImpl implements LakalaApiService { // 分账用途 String logNo = paramsJSON.getStr("log_no"); String tradeNo = paramsJSON.getStr("trade_no"); - log.debug("[确认收货通知] 获取基础交易信息: logNo={} tradeNo={}", logNo, tradeNo); + String tradeTime = paramsJSON.getStr("trade_time"); // 实际交易完成时间。yyyyMMddHHmmss + // 直接截取前8位,获取日期部分 + String logDate = tradeTime != null && tradeTime.length() >= 8 ? tradeTime.substring(0, 8) : null; + if (logDate == null) { + logDate = DateUtil.format(new Date(), "yyyyMMdd"); // 当前时间 + } + + + log.debug("[确认收货通知] 获取基础交易信息: logNo={} tradeNo={} logDate={}", logNo, tradeNo, logDate); // 查询用途 String originTradeNo = paramsJSON.getStr("origin_trade_no"); @@ -900,7 +909,7 @@ public class LakalaApiServiceImpl implements LakalaApiService { // 重要:准备发起分账指令 log.info("[确认收货通知] 开始发起分账指令: merchantNo={}, receiveTradeNo={}, logNo={}", merchantNo, shopOrderLkl.getLkl_receive_trade_no(), logNo); - Pair separateResult = innerDoOrderSeparateByMerchantAndLogNo(merchantNo, shopOrderLkl.getLkl_receive_trade_no(), shopOrderLkl.getLkl_receive_log_no()); + Pair separateResult = innerDoOrderSeparateByMerchantAndLogNo(merchantNo, shopOrderLkl.getLkl_receive_trade_no(), shopOrderLkl.getLkl_receive_log_no(), logDate); if (!separateResult.getFirst()) { shopOrderLkl.setSeparate_msg(separateResult.getSecond()); @@ -2451,15 +2460,16 @@ public class LakalaApiServiceImpl implements LakalaApiService { * @param lklMerchantNo 拉卡拉商户号 * @param receiveTradeNo 收货交易号(对应拉卡拉的trade_no) * @param receiveLogNo 收货流水号(对应拉卡拉的log_no) + * @param logDate posp日期,yyyyMMdd,查清结算用, 一般是值交易完成日期(确认收货的日期) * @return Pair 处理结果对,first为是否成功,second为结果描述信息 */ @Transactional @Override - public Pair innerDoOrderSeparateByMerchantAndLogNo(String lklMerchantNo, String receiveTradeNo, String receiveLogNo) { + public Pair innerDoOrderSeparateByMerchantAndLogNo(String lklMerchantNo, String receiveTradeNo, String receiveLogNo, String logDate) { // 1. 输入参数校验 - if (StrUtil.hasBlank(lklMerchantNo, receiveTradeNo, receiveLogNo)) { - log.warn("[分账操作] 参数校验失败:缺少必要参数, lklMerchantNo={}, receiveTradeNo={}, receiveLogNo={}", - lklMerchantNo, receiveTradeNo, receiveLogNo); + if (StrUtil.hasBlank(lklMerchantNo, receiveTradeNo, receiveLogNo, logDate)) { + log.warn("[分账操作] 参数校验失败:缺少必要参数, lklMerchantNo={}, receiveTradeNo={}, receiveLogNo={}, logDate={}", + lklMerchantNo, receiveTradeNo, receiveLogNo, logDate); return Pair.of(false, "缺少必要参数"); } @@ -2639,7 +2649,7 @@ public class LakalaApiServiceImpl implements LakalaApiService { receiver.setSeparateValue(Convert.toStr(merchantAmount)); recvDatas.add(receiver); } - + // 是否有二级代理商? boolean has2ndAgent = CheckUtil.isNotEmpty(agent2ndSplitRatio) && agent2ndReceiver != null && StrUtil.isNotBlank(agent2ndReceiver.getReceiver_no()) && @@ -2695,7 +2705,7 @@ public class LakalaApiServiceImpl implements LakalaApiService { separateRequest.setMerchantNo(merchantNo); separateRequest.setOutSeparateNo(shopOrderLkl.getOut_separate_no()); separateRequest.setLogNo(shopOrderLkl.getLkl_receive_log_no()); // 使用确认收货流水号作为分账流水号 - separateRequest.setLogDate(shopOrderLkl.getLkl_log_date()); + separateRequest.setLogDate(logDate); // 重要:确认收货后的交易时间 separateRequest.setTotalAmt(refCanSeparateAmt.toString()); separateRequest.setLklOrgNo(orgCode); separateRequest.setCalType("0"); // 0- 按照指定金额,1- 按照指定比例。默认 0 diff --git a/mall-shop/src/main/java/com/suisung/mall/shop/order/service/impl/ShopOrderLklServiceImpl.java b/mall-shop/src/main/java/com/suisung/mall/shop/order/service/impl/ShopOrderLklServiceImpl.java index 14ebbf37..4b97d081 100644 --- a/mall-shop/src/main/java/com/suisung/mall/shop/order/service/impl/ShopOrderLklServiceImpl.java +++ b/mall-shop/src/main/java/com/suisung/mall/shop/order/service/impl/ShopOrderLklServiceImpl.java @@ -519,11 +519,11 @@ public class ShopOrderLklServiceImpl extends BaseServiceImpl updateWrapper = new UpdateWrapper<>(); updateWrapper.eq("lkl_receive_log_no", lklReceiveLogNo); updateWrapper.set("separate_status", separateStatus); - if (StrUtil.isNotBlank(separateRemark)) { - updateWrapper.set("separate_remark", separateRemark); + if (StrUtil.isNotBlank(separateMsg)) { + updateWrapper.set("separate_msg", separateMsg); } boolean result = update(updateWrapper); diff --git a/mall-shop/src/main/java/com/suisung/mall/shop/store/service/ShopStoreInfoService.java b/mall-shop/src/main/java/com/suisung/mall/shop/store/service/ShopStoreInfoService.java index ba5a1a99..fb64de28 100644 --- a/mall-shop/src/main/java/com/suisung/mall/shop/store/service/ShopStoreInfoService.java +++ b/mall-shop/src/main/java/com/suisung/mall/shop/store/service/ShopStoreInfoService.java @@ -20,6 +20,14 @@ public interface ShopStoreInfoService extends IBaseService { Map getStoreInfoById(Integer store_id); + /** + * 根据店铺id获取店铺信息 + * + * @param storeId + * @return + */ + ShopStoreInfo getShopStoreInfoByStoreId(Integer storeId); + Map getInfoList(QueryWrapper queryWrapper, Integer pageNum, Integer pageSize); /** 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 c3d207de..5ca7fa9d 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 @@ -80,7 +80,6 @@ import org.springframework.transaction.annotation.Transactional; import org.springframework.web.context.request.RequestContextHolder; import org.springframework.web.context.request.ServletRequestAttributes; -import javax.annotation.Resource; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.io.Serializable; @@ -176,9 +175,6 @@ public class ShopStoreBaseServiceImpl extends BaseServiceImpl shopStoreInfoUpdateWrapper=new UpdateWrapper<>(); - shopStoreInfoUpdateWrapper.eq("store_id",storeId); - shopStoreInfoUpdateWrapper.set("store_opening_hours",store_opening_hours); - shopStoreInfoUpdateWrapper.set("store_close_hours",store_close_hours); + if (StringUtils.isNotEmpty(store_close_hours)) { + UpdateWrapper shopStoreInfoUpdateWrapper = new UpdateWrapper<>(); + shopStoreInfoUpdateWrapper.eq("store_id", storeId); + shopStoreInfoUpdateWrapper.set("store_opening_hours", store_opening_hours); + shopStoreInfoUpdateWrapper.set("store_close_hours", store_close_hours); shopStoreInfoService.update(shopStoreInfoUpdateWrapper); } // 使用 UpdateWrapper 更新店铺营业状态 diff --git a/mall-shop/src/main/java/com/suisung/mall/shop/store/service/impl/ShopStoreInfoServiceImpl.java b/mall-shop/src/main/java/com/suisung/mall/shop/store/service/impl/ShopStoreInfoServiceImpl.java index bcef4bea..7cc18e27 100644 --- a/mall-shop/src/main/java/com/suisung/mall/shop/store/service/impl/ShopStoreInfoServiceImpl.java +++ b/mall-shop/src/main/java/com/suisung/mall/shop/store/service/impl/ShopStoreInfoServiceImpl.java @@ -53,6 +53,13 @@ public class ShopStoreInfoServiceImpl extends BaseServiceImpl queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("store_id", storeId); + return findOne(queryWrapper); + } + @Override public Map getInfoList(QueryWrapper queryWrapper, Integer pageNum, Integer pageSize) { Page lists = lists(queryWrapper, pageNum, pageSize); From d061510a5e18a38369560befa5052442b39d201a Mon Sep 17 00:00:00 2001 From: Jack <46790855@qq.com> Date: Sat, 18 Oct 2025 16:36:34 +0800 Subject: [PATCH 02/23] =?UTF-8?q?=E9=A1=BA=E4=B8=B0=E5=88=9B=E5=BB=BA?= =?UTF-8?q?=E5=BA=97=E9=93=BA=EF=BC=8C=E5=9C=B0=E5=9D=80=E6=94=B9=E6=88=90?= =?UTF-8?q?=20=E5=8E=BB=E6=8E=89=E7=9C=81=E5=B8=82=E5=8C=BA=E7=9A=84?= =?UTF-8?q?=E8=AF=A6=E7=BB=86=E5=9C=B0=E5=9D=80=E3=80=82=20=E6=8F=90?= =?UTF-8?q?=E7=8E=B0=E9=80=9A=E7=9F=A5=E6=97=A5=E5=BF=97=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/pojo/to/AddressParseResultTO.java | 2 +- .../mall/common/utils/AddressUtil.java | 2 +- .../service/impl/LakalaApiServiceImpl.java | 20 +++++++++---------- .../service/impl/SFExpressApiServiceImpl.java | 19 ++++++++++++------ 4 files changed, 25 insertions(+), 18 deletions(-) diff --git a/mall-common/src/main/java/com/suisung/mall/common/pojo/to/AddressParseResultTO.java b/mall-common/src/main/java/com/suisung/mall/common/pojo/to/AddressParseResultTO.java index 5907b161..900eca77 100644 --- a/mall-common/src/main/java/com/suisung/mall/common/pojo/to/AddressParseResultTO.java +++ b/mall-common/src/main/java/com/suisung/mall/common/pojo/to/AddressParseResultTO.java @@ -33,7 +33,7 @@ public class AddressParseResultTO implements java.io.Serializable { private String joinArea; /** - * 详细地址 + * (去掉省市县的)详细地址 */ private String detailAddress; diff --git a/mall-common/src/main/java/com/suisung/mall/common/utils/AddressUtil.java b/mall-common/src/main/java/com/suisung/mall/common/utils/AddressUtil.java index e4013607..e6aa08c7 100644 --- a/mall-common/src/main/java/com/suisung/mall/common/utils/AddressUtil.java +++ b/mall-common/src/main/java/com/suisung/mall/common/utils/AddressUtil.java @@ -112,7 +112,7 @@ public class AddressUtil { * System.out.println("详细地址: " + parsedAddress.getDetailAddress()); // 西山镇新安街粤桂花城1102号 */ public static void main(String[] args) { - String fullAddress = "广西壮族自治区贵港市桂平市西山镇新安街粤桂花城1102号"; + String fullAddress = "广西壮族自治区贵港市桂平市桂平西山镇新安街粤桂花城1102号"; AddressParseResultTO parsedAddress = AddressUtil.parseAddress(fullAddress); System.out.println("省: " + parsedAddress.getProvince()); System.out.println("市: " + parsedAddress.getCity()); diff --git a/mall-shop/src/main/java/com/suisung/mall/shop/lakala/service/impl/LakalaApiServiceImpl.java b/mall-shop/src/main/java/com/suisung/mall/shop/lakala/service/impl/LakalaApiServiceImpl.java index ba045ddf..f7dcddf1 100644 --- a/mall-shop/src/main/java/com/suisung/mall/shop/lakala/service/impl/LakalaApiServiceImpl.java +++ b/mall-shop/src/main/java/com/suisung/mall/shop/lakala/service/impl/LakalaApiServiceImpl.java @@ -3628,13 +3628,13 @@ public class LakalaApiServiceImpl implements LakalaApiService { */ @Override public JSONObject ewalletWithDrawNotify(HttpServletRequest request) { - log.debug("[拉卡拉提现结果通知] 开始处理拉卡拉提现结果通知"); + log.debug("[拉卡拉D1提现结果通知] 开始处理拉卡拉提现结果通知"); try { // 1. 验签处理 - 验证通知来源的合法性 Pair signCheckResult = LakalaUtil.chkLklApiNotifySign(request, lklNotifyCerPath, false); if (!signCheckResult.getFirst()) { - log.warn("[LklOrderDraw] 验签失败: {}", signCheckResult.getSecond()); + log.warn("[拉卡拉D1提现结果通知] 验签失败: {}", signCheckResult.getSecond()); return JSONUtil.createObj() .set("code", "FAIL") .set("message", signCheckResult.getSecond()); @@ -3643,7 +3643,7 @@ public class LakalaApiServiceImpl implements LakalaApiService { // 2. 解析回调参数 JSONObject paramsJSON = JSONUtil.parseObj(signCheckResult.getSecond()); if (paramsJSON == null) { - log.warn("[拉卡拉提现结果通知] 回调参数解析失败"); + log.warn("[拉卡拉D1提现结果通知] 回调参数解析失败"); return JSONUtil.createObj() .set("code", "FAIL") .set("message", "回调参数解析失败"); @@ -3653,7 +3653,7 @@ public class LakalaApiServiceImpl implements LakalaApiService { String mercId = paramsJSON.getStr("mercId"); String merOrderNo = paramsJSON.getStr("merOrderNo"); - log.info("[拉卡拉提现结果通知] 提现通知参数: drawState={}, mercId={}, merOrderNo={}", drawState, mercId, merOrderNo); + log.info("[拉卡拉D1提现结果通知] 提现通知参数: drawState={}, mercId={}, merOrderNo={}", drawState, mercId, merOrderNo); if (StrUtil.isBlank(mercId) || StrUtil.isBlank(merOrderNo) || StrUtil.isBlank(drawState)) { log.warn("[拉卡拉提现结果通知] 回调参数缺失: drawState={}, mercId={}, merOrderNo={}", drawState, mercId, merOrderNo); @@ -3664,7 +3664,7 @@ public class LakalaApiServiceImpl implements LakalaApiService { // 只处理成功的提现状态 if (!"DRAW.SUCCESS".equals(drawState)) { - log.debug("[拉卡拉提现结果通知] 提现状态未成功,忽略处理: drawState={}", drawState); + log.debug("[拉卡拉D1提现结果通知] 提现状态未成功,忽略处理: drawState={}", drawState); return JSONUtil.createObj() .set("code", "SUCCESS") // 返回成功,避免重复通知 .set("message", "状态未成功,忽略处理"); @@ -3673,7 +3673,7 @@ public class LakalaApiServiceImpl implements LakalaApiService { // 3. 转换参数并更新数据 String snakeCaseJson = StringUtils.convertCamelToSnake(signCheckResult.getSecond()); if (StringUtils.isBlank(snakeCaseJson)) { - log.error("[拉卡拉提现结果通知] 回调参数转换失败,mercId={} merOrderNo={}", mercId, merOrderNo); + log.error("[拉卡拉D1提现结果通知] 回调参数转换失败,mercId={} merOrderNo={}", mercId, merOrderNo); return JSONUtil.createObj() .set("code", "FAIL") .set("message", "回调参数转换失败"); @@ -3681,7 +3681,7 @@ public class LakalaApiServiceImpl implements LakalaApiService { LklOrderDraw lklOrderDraw = JSONUtil.toBean(snakeCaseJson, LklOrderDraw.class); if (lklOrderDraw == null) { - log.error("[拉卡拉提现结果通知] 回调参数转换为对象失败,mercId={} merOrderNo={}", mercId, merOrderNo); + log.error("[拉卡拉D1提现结果通知] 回调参数转换为对象失败,mercId={} merOrderNo={}", mercId, merOrderNo); return JSONUtil.createObj() .set("code", "FAIL") .set("message", "回调参数转换失败"); @@ -3689,13 +3689,13 @@ public class LakalaApiServiceImpl implements LakalaApiService { boolean isSuccess = lklOrderDrawService.addOrUpdateByMercIdAndMerOrderNo(lklOrderDraw); if (!isSuccess) { - log.error("[拉卡拉提现结果通知] 数据更新失败,mercId={} merOrderNo={}", mercId, merOrderNo); + log.error("[拉卡拉D1提现结果通知] 数据更新失败,mercId={} merOrderNo={}", mercId, merOrderNo); return JSONUtil.createObj() .set("code", "FAIL") .set("message", "数据更新失败"); } - log.info("[拉卡拉提现结果通知] 拉卡拉提现结果通知处理成功,mercId={} merOrderNo={}", mercId, merOrderNo); + log.info("[拉卡拉D1提现结果通知] 拉卡拉提现结果通知处理成功,mercId={} merOrderNo={}", mercId, merOrderNo); // 4. 返回成功响应 return JSONUtil.createObj() @@ -3703,7 +3703,7 @@ public class LakalaApiServiceImpl implements LakalaApiService { .set("message", "处理成功"); } catch (Exception e) { - log.error("[拉卡拉提现结果通知] 处理拉卡拉提现结果通知异常", e); + log.error("[拉卡拉D1提现结果通知] 处理拉卡拉提现结果通知异常", e); return JSONUtil.createObj() .set("code", "FAIL") .set("message", "系统处理异常"); 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 492a9e7f..3f3f298d 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 @@ -24,10 +24,8 @@ import com.suisung.mall.common.modules.store.ShopStoreSameCityTransportBase; import com.suisung.mall.common.modules.store.ShopStoreSfOrder; import com.suisung.mall.common.pojo.req.*; import com.suisung.mall.common.pojo.res.ThirdApiRes; -import com.suisung.mall.common.utils.CheckUtil; -import com.suisung.mall.common.utils.CommonUtil; -import com.suisung.mall.common.utils.I18nUtil; -import com.suisung.mall.common.utils.JsonUtil; +import com.suisung.mall.common.pojo.to.AddressParseResultTO; +import com.suisung.mall.common.utils.*; import com.suisung.mall.shop.message.service.PushMessageService; import com.suisung.mall.shop.order.service.ShopOrderBaseService; import com.suisung.mall.shop.order.service.ShopOrderInfoService; @@ -162,15 +160,23 @@ public class SFExpressApiServiceImpl implements SFExpressApiService { return Pair.of(false, "联系人手机号不能为空"); } + + AddressParseResultTO addressParseResultTO = AddressUtil.parseAddress(shopMchEntry.getStore_address()); // 解析城市名称 String cityName = "桂平市"; // 默认城市 + + // 去掉省市区的详细地址 + String storeAddress = addressParseResultTO.getDetailAddress(); + if (StrUtil.isNotBlank(shopMchEntry.getStore_area())) { String[] areaNames = shopMchEntry.getStore_area().split("/"); - if (areaNames.length > 0) { + if (areaNames.length >= 3) { cityName = areaNames[areaNames.length - 1]; } else { cityName = shopMchEntry.getStore_area().replace("/", ""); } + } else { + cityName = addressParseResultTO.getCity(); } // 如果解析后城市名为空,使用默认值 @@ -184,12 +190,13 @@ public class SFExpressApiServiceImpl implements SFExpressApiService { // 为了其他顺丰店同名,店铺名称加上[门店ID]; 如:xxxx[xxxx] 聚万家生鲜超市[69] String shopStoreName = String.format("%s[%s]", shopMchEntry.getStore_name(), shopMchEntry.getStore_id()); + // 调用创建店铺方法 Pair result = createSfExpressShop( Convert.toInt(shopMchEntry.getStore_id()), shopStoreName, cityName, - shopMchEntry.getStore_address(), + storeAddress, shopMchEntry.getContact_name(), contactMobile, shopMchEntry.getStore_longitude(), From a334cfce293c46d5acc144c42d3833e6af7290be Mon Sep 17 00:00:00 2001 From: Jack <46790855@qq.com> Date: Sun, 19 Oct 2025 01:14:27 +0800 Subject: [PATCH 03/23] =?UTF-8?q?=E9=A1=BA=E4=B8=B0=E5=88=9B=E5=BB=BA?= =?UTF-8?q?=E5=BA=97=E9=93=BA=EF=BC=8C=E5=9C=B0=E5=9D=80=E6=94=B9=E6=88=90?= =?UTF-8?q?=20=E5=8E=BB=E6=8E=89=E7=9C=81=E5=B8=82=E5=8C=BA=E7=9A=84?= =?UTF-8?q?=E8=AF=A6=E7=BB=86=E5=9C=B0=E5=9D=80=E3=80=82=20=E6=8F=90?= =?UTF-8?q?=E7=8E=B0=E9=80=9A=E7=9F=A5=E6=97=A5=E5=BF=97=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/admin/ShopOrderBaseController.java | 9 ++++++--- .../order/service/impl/ShopOrderBaseServiceImpl.java | 12 ++++++------ .../order/service/impl/ShopOrderInfoServiceImpl.java | 2 +- .../service/impl/SFExpressApiServiceImpl.java | 1 - .../resources/mapper/order/ShopOrderBaseMapper.xml | 5 +++-- 5 files changed, 16 insertions(+), 13 deletions(-) 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 fd82bf33..37287b1c 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,7 +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) { @@ -326,9 +326,12 @@ public class ShopOrderBaseController extends BaseControllerImpl { return CommonResult.failed(ResultCode.FORBIDDEN); } - // 同城订单超时秒数 + // 初定同城订单超时的秒数 long mchOrderExpireSeconds = shopOrderBaseService.sameCityOrderExpireSeconds(2100L); // 35分钟超时,60秒*35分钟 = 2100秒 + //同城配送订单状态(delivery=1时才生效):无值 or 0-全部订单;1-进行中订单;2-异常(超时)订单;3-退款订单;9-已完成订单 + Integer status = params.getInt("status"); + // === 构建响应数据 === Map respMap = new HashMap<>(); // 订单列表数据(缓存时间25分钟) @@ -336,7 +339,7 @@ public class ShopOrderBaseController extends BaseControllerImpl { storeId, params.getStr("keyword"), params.getInt("delivery"), - params.getInt("status"), + status, params.getInt("logistics_status"), mchOrderExpireSeconds, params.getLong("begin_time"), 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 5a02f88c..222b0d10 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 @@ -8907,17 +8907,16 @@ public class ShopOrderBaseServiceImpl extends BaseServiceImpl= StateCode.ORDER_STATE_SHIPPED - && orderStateId <= StateCode.ORDER_STATE_FINISH + } else if (CommonService.isSFExpress(deliveryTypeId) + && orderStateId.intValue() >= StateCode.ORDER_STATE_SHIPPED + && orderStateId.intValue() <= StateCode.ORDER_STATE_FINISH && order.getSf_order_info() != null - && order.getSf_order_info().getFeed() == null) { + && StrUtil.isBlank(order.getSf_order_info().getFeed())) { // 获取顺丰同城的物流轨迹 Map params = new HashMap<>(); params.put("order_id", order.getSf_order_info().getSf_order_id()); try { + ThirdApiRes feedRes = sfExpressApiService.listOrderFeed(params); logger.info("获取配送员物流轨迹:{}", feedRes); if (feedRes != null && feedRes.getError_code() != null && feedRes.getError_code().equals(0)) { @@ -8926,6 +8925,7 @@ public class ShopOrderBaseServiceImpl extends BaseServiceImpl 3) { - return CommonResult.success("已提交,请勿重复提交"); + return CommonResult.success("已通知配送人员,请稍候"); } // 更新订单拣货时间 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 3f3f298d..1c9e8289 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 @@ -190,7 +190,6 @@ public class SFExpressApiServiceImpl implements SFExpressApiService { // 为了其他顺丰店同名,店铺名称加上[门店ID]; 如:xxxx[xxxx] 聚万家生鲜超市[69] String shopStoreName = String.format("%s[%s]", shopMchEntry.getStore_name(), shopMchEntry.getStore_id()); - // 调用创建店铺方法 Pair result = createSfExpressShop( Convert.toInt(shopMchEntry.getStore_id()), diff --git a/mall-shop/src/main/resources/mapper/order/ShopOrderBaseMapper.xml b/mall-shop/src/main/resources/mapper/order/ShopOrderBaseMapper.xml index a4b55af8..0a7ab502 100644 --- a/mall-shop/src/main/resources/mapper/order/ShopOrderBaseMapper.xml +++ b/mall-shop/src/main/resources/mapper/order/ShopOrderBaseMapper.xml @@ -655,6 +655,7 @@ + @@ -684,12 +685,12 @@ - AND ob.order_state_id IN (2011,2012,2013, 2014, 2020, 2030, 2040) + AND ob.order_state_id IN (2011,2012,2013,2014,2020,2030,2040) AND (oi.order_time + #{expireSeconds}*1000) =]]> UNIX_TIMESTAMP() * 1000 - AND ob.order_state_id IN (2011,2012,2013, 2014, 2020, 2030, 2040) + AND ob.order_state_id IN (2011,2012,2013,2014,2020,2030,2040) AND (oi.order_time + #{expireSeconds}*1000) UNIX_TIMESTAMP() * 1000 From 71a2b5acb851f7a471e2e899e8bbe323c0e1d9f0 Mon Sep 17 00:00:00 2001 From: liyj <1617420630@qq.com> Date: Mon, 20 Oct 2025 11:20:27 +0800 Subject: [PATCH 04/23] =?UTF-8?q?=E6=80=9D=E8=BF=85=E5=90=8C=E6=AD=A5?= =?UTF-8?q?=E5=BA=93=E5=AD=98=E9=97=AE=E9=A2=98=E4=BF=AE=E6=94=B9=EF=BC=8C?= =?UTF-8?q?=E7=B1=BB=E5=9E=8B=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../shop/sync/service/impl/SyncThirdDataServiceImpl.java | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/mall-shop/src/main/java/com/suisung/mall/shop/sync/service/impl/SyncThirdDataServiceImpl.java b/mall-shop/src/main/java/com/suisung/mall/shop/sync/service/impl/SyncThirdDataServiceImpl.java index 55006bbf..b36b16dd 100644 --- a/mall-shop/src/main/java/com/suisung/mall/shop/sync/service/impl/SyncThirdDataServiceImpl.java +++ b/mall-shop/src/main/java/com/suisung/mall/shop/sync/service/impl/SyncThirdDataServiceImpl.java @@ -780,7 +780,7 @@ public class SyncThirdDataServiceImpl extends SyncBaseThirdSxAbstract implements } //持久化保存数据到数据库队列 String key=RedisKey.STOREDATARELEASE+":"+syncAppO.getStore_id(); - Map redisHash = redisTemplate.opsForHash().entries(key); + Map redisHash = redisTemplate.opsForHash().entries(key); List productQuantityConsumptionList=getProductStockFromRedis(syncAppO.getStore_id(),redisHash); List productQuantityConsumptions=new ArrayList<>(); if (!productQuantityConsumptionList.isEmpty()) { @@ -884,7 +884,7 @@ public class SyncThirdDataServiceImpl extends SyncBaseThirdSxAbstract implements @Override - public List getProductStockFromRedis(String storeId,Map redisHash) { + public List getProductStockFromRedis(String storeId,Map redisHash) { try { // 从 Redis 获取 hash 结构的所有键值对 if (redisHash.isEmpty()) { @@ -894,7 +894,8 @@ public class SyncThirdDataServiceImpl extends SyncBaseThirdSxAbstract implements List productQuantityConsumptionList=new ArrayList<>(); redisHash.forEach((k, v)->{ ProductQuantityConsumption productQuantityConsumption=new ProductQuantityConsumption(); - String[] productKeyArrys=k.split("-"); + String productKey= (String) k; + String[] productKeyArrys=productKey.split("-"); if(productKeyArrys.length!=2){ return; } From e252475a34f7c3144bb46a85bb172012c77e524a Mon Sep 17 00:00:00 2001 From: liyj <1617420630@qq.com> Date: Mon, 20 Oct 2025 15:19:19 +0800 Subject: [PATCH 05/23] =?UTF-8?q?=E6=80=9D=E8=BF=85=E5=90=8C=E6=AD=A5?= =?UTF-8?q?=E5=BA=93=E5=AD=98=E9=97=AE=E9=A2=98=E4=BF=AE=E6=94=B9=EF=BC=8C?= =?UTF-8?q?=E7=B1=BB=E5=9E=8B=E9=97=AE=E9=A2=98=E6=89=A3=E5=87=8F=E9=97=AE?= =?UTF-8?q?=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../shop/sync/service/impl/SyncThirdDataServiceImpl.java | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/mall-shop/src/main/java/com/suisung/mall/shop/sync/service/impl/SyncThirdDataServiceImpl.java b/mall-shop/src/main/java/com/suisung/mall/shop/sync/service/impl/SyncThirdDataServiceImpl.java index b36b16dd..5471e585 100644 --- a/mall-shop/src/main/java/com/suisung/mall/shop/sync/service/impl/SyncThirdDataServiceImpl.java +++ b/mall-shop/src/main/java/com/suisung/mall/shop/sync/service/impl/SyncThirdDataServiceImpl.java @@ -766,7 +766,9 @@ public class SyncThirdDataServiceImpl extends SyncBaseThirdSxAbstract implements @Override public ThirdApiRes getStoreDataRelease(String appKey, String sign) { - // incrProductStockToRedis(new HashMap<>()); +// Map map=new HashMap<>(); +// map.put("33638-DD_20251020_3",-1); +// incrProductStockToRedis(map); if (StrUtil.isBlank(appKey) || StrUtil.isBlank(sign)) { return new ThirdApiRes().fail(1003, I18nUtil._("缺少必要参数!")); } @@ -781,6 +783,7 @@ public class SyncThirdDataServiceImpl extends SyncBaseThirdSxAbstract implements //持久化保存数据到数据库队列 String key=RedisKey.STOREDATARELEASE+":"+syncAppO.getStore_id(); Map redisHash = redisTemplate.opsForHash().entries(key); + logger.info("获取扣减库存数据redisHash:{}",redisHash); List productQuantityConsumptionList=getProductStockFromRedis(syncAppO.getStore_id(),redisHash); List productQuantityConsumptions=new ArrayList<>(); if (!productQuantityConsumptionList.isEmpty()) { @@ -886,6 +889,7 @@ public class SyncThirdDataServiceImpl extends SyncBaseThirdSxAbstract implements @Override public List getProductStockFromRedis(String storeId,Map redisHash) { try { + logger.info("获取redis的库存扣减redisHash:{}",redisHash); // 从 Redis 获取 hash 结构的所有键值对 if (redisHash.isEmpty()) { return Collections.emptyList(); @@ -896,6 +900,8 @@ public class SyncThirdDataServiceImpl extends SyncBaseThirdSxAbstract implements ProductQuantityConsumption productQuantityConsumption=new ProductQuantityConsumption(); String productKey= (String) k; String[] productKeyArrys=productKey.split("-"); + logger.info("productNumber:{}",productKeyArrys[0]); + logger.info("orderId:{}",productKeyArrys[0]); if(productKeyArrys.length!=2){ return; } @@ -918,7 +924,6 @@ public class SyncThirdDataServiceImpl extends SyncBaseThirdSxAbstract implements @Override public void incrProductStockToRedis(Map stockDeltaMap) { - // stockDeltaMap.put("5458", 1); // 校验参数,避免空指针 if (CollectionUtil.isEmpty(stockDeltaMap)) { return; From 6637180cbf93f1e6410713706580c57541dc34d1 Mon Sep 17 00:00:00 2001 From: liyj <1617420630@qq.com> Date: Mon, 20 Oct 2025 15:36:19 +0800 Subject: [PATCH 06/23] =?UTF-8?q?=E6=80=9D=E8=BF=85=E5=90=8C=E6=AD=A5?= =?UTF-8?q?=E5=BA=93=E5=AD=98=E9=97=AE=E9=A2=98=E4=BF=AE=E6=94=B9=EF=BC=8C?= =?UTF-8?q?=E7=B1=BB=E5=9E=8B=E9=97=AE=E9=A2=98=E6=89=A3=E5=87=8F=E9=97=AE?= =?UTF-8?q?=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mall/shop/sync/service/impl/SyncThirdDataServiceImpl.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mall-shop/src/main/java/com/suisung/mall/shop/sync/service/impl/SyncThirdDataServiceImpl.java b/mall-shop/src/main/java/com/suisung/mall/shop/sync/service/impl/SyncThirdDataServiceImpl.java index 5471e585..7763519c 100644 --- a/mall-shop/src/main/java/com/suisung/mall/shop/sync/service/impl/SyncThirdDataServiceImpl.java +++ b/mall-shop/src/main/java/com/suisung/mall/shop/sync/service/impl/SyncThirdDataServiceImpl.java @@ -901,7 +901,7 @@ public class SyncThirdDataServiceImpl extends SyncBaseThirdSxAbstract implements String productKey= (String) k; String[] productKeyArrys=productKey.split("-"); logger.info("productNumber:{}",productKeyArrys[0]); - logger.info("orderId:{}",productKeyArrys[0]); + logger.info("orderId:{}",productKeyArrys[1]); if(productKeyArrys.length!=2){ return; } @@ -958,7 +958,7 @@ public class SyncThirdDataServiceImpl extends SyncBaseThirdSxAbstract implements String itemId=productBase.getProduct_number(); cn.hutool.json.JSONArray array_item_spec= JSONUtil.parseArray(spuItem.getItem_spec()); if(array_item_spec.isEmpty()){ - redisTemplate.opsForHash().increment(key, itemId, delta.doubleValue()); + redisTemplate.opsForHash().increment(key, itemId+"-"+orderId, delta.doubleValue()); continue; } cn.hutool.json.JSONObject item = (cn.hutool.json.JSONObject) ((cn.hutool.json.JSONObject) array_item_spec.get(0)).get("item"); From 56a62f667398d1931465b4ac46b211ce0f99175f Mon Sep 17 00:00:00 2001 From: Jack <46790855@qq.com> Date: Mon, 20 Oct 2025 17:26:12 +0800 Subject: [PATCH 07/23] =?UTF-8?q?=E9=A1=BA=E4=B8=B0=E5=AE=8C=E6=88=90?= =?UTF-8?q?=E8=AE=A2=E5=8D=95=E6=97=B6=E5=80=99=EF=BC=8C=E5=8F=91=E5=87=BA?= =?UTF-8?q?=E5=82=AC=E4=BF=83=E7=A1=AE=E8=AE=A4=E6=94=B6=E8=B4=A7=E7=9A=84?= =?UTF-8?q?=E9=80=9A=E7=9F=A5->=20=E5=BE=AE=E4=BF=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/impl/LakalaApiServiceImpl.java | 1 - .../impl/ShopOrderBaseServiceImpl.java | 17 +++++++++++++-- .../impl/ShopOrderInfoServiceImpl.java | 2 +- .../impl/ShopOrderReturnServiceImpl.java | 21 ++++++++++++------- .../service/impl/SFExpressApiServiceImpl.java | 10 ++++----- .../impl/WxOrderShippingServiceImpl.java | 12 ++++------- 6 files changed, 39 insertions(+), 24 deletions(-) diff --git a/mall-shop/src/main/java/com/suisung/mall/shop/lakala/service/impl/LakalaApiServiceImpl.java b/mall-shop/src/main/java/com/suisung/mall/shop/lakala/service/impl/LakalaApiServiceImpl.java index f7dcddf1..9ebb96b4 100644 --- a/mall-shop/src/main/java/com/suisung/mall/shop/lakala/service/impl/LakalaApiServiceImpl.java +++ b/mall-shop/src/main/java/com/suisung/mall/shop/lakala/service/impl/LakalaApiServiceImpl.java @@ -831,7 +831,6 @@ public class LakalaApiServiceImpl implements LakalaApiService { logDate = DateUtil.format(new Date(), "yyyyMMdd"); // 当前时间 } - log.debug("[确认收货通知] 获取基础交易信息: logNo={} tradeNo={} logDate={}", logNo, tradeNo, logDate); // 查询用途 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 222b0d10..08116afb 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 @@ -99,6 +99,7 @@ import com.suisung.mall.shop.sfexpress.service.SFExpressApiService; import com.suisung.mall.shop.store.service.*; import com.suisung.mall.shop.sync.service.SyncThirdDataService; import com.suisung.mall.shop.user.service.*; +import com.suisung.mall.shop.wechat.service.WxOrderShippingService; import io.seata.common.util.StringUtils; import io.seata.core.context.RootContext; import io.seata.core.exception.TransactionException; @@ -376,6 +377,10 @@ public class ShopOrderBaseServiceImpl extends BaseServiceImpl= 0) { 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 5375ee43..c4b620c4 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 @@ -498,7 +498,7 @@ public class ShopOrderInfoServiceImpl extends BaseServiceImpl 0) { is_denyreturn = true; - throw new ApiException(I18nUtil._("此商品已过退货期,不允许退货!")); + //throw new ApiException(I18nUtil._("此商品已过退货期,不允许退货!")); } } @@ -2550,12 +2554,14 @@ public class ShopOrderReturnServiceImpl extends BaseServiceImpl orderItems = shopOrderItemService.find(new QueryWrapper().eq("order_id", orderId)); - if (CollectionUtil.isEmpty(orderItems)) return CommonResult.failed("无可退货商品"); + if (CollectionUtil.isEmpty(orderItems)) { + return CommonResult.failed("无可退货商品"); + } // === 3. 检查退货单 === ShopOrderReturn refundOrder = findOne(new QueryWrapper() @@ -2712,9 +2718,10 @@ public class ShopOrderReturnServiceImpl extends BaseServiceImpl 0) { 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 1c9e8289..5f579562 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 @@ -1021,7 +1021,7 @@ public class SFExpressApiServiceImpl implements SFExpressApiService { pushRemark = "已完成配送"; orderStatus = StateCode.ORDER_STATE_RECEIVED; //已签收 - // 通知微信用户确认收货(同城配送不能调用微信的确认收货) + // 顺丰送达后,发出催促微信用户确认收货通知 (同城配送不能调用微信的确认收货) wxOrderShippingService.notifyConfirmReceive(shopStoreSfOrder.getShop_order_id()); // 不要提前 订单确认收货,等微信拉卡拉确认通知 @@ -1117,13 +1117,14 @@ public class SFExpressApiServiceImpl implements SFExpressApiService { throw new ApiException(I18nUtil._("状态处理失败!")); } - // 通知微信用户确认收货(同城配送不能调用该微信接口) - // wxOrderShippingService.notifyConfirmReceive(shopStoreSfOrder.getShop_order_id()); + String orderId = shopStoreSfOrder.getShop_order_id(); + + // 顺丰送达后,发出催促微信用户确认收货通知 (同城配送不能调用微信的确认收货) + wxOrderShippingService.notifyConfirmReceive(orderId); // 订单确认收货 // shopOrderBaseService.receive(shopStoreSfOrder.getShop_order_id(), null); - String orderId = shopStoreSfOrder.getShop_order_id(); // 消息推送 // JSONObject payload = new JSONObject(); @@ -1131,7 +1132,6 @@ public class SFExpressApiServiceImpl implements SFExpressApiService { // payload.put("orderId", orderId); // pushMessageService.noticeMerchantEmployeeOrderAction(null, orderId, "", "顺丰同城订单[" + orderId + "]已完成配送。", null); - return new ThirdApiRes().success("success"); } 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 36c23633..19ed7cdf 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 @@ -128,21 +128,17 @@ public class WxOrderShippingServiceImpl implements WxOrderShippingService { // Step 4: Prepare request payload JSONArray shippingList = new JSONArray().put(shippingItem); -// String mchId = orderBaseInfo.getMch_id(); - JSONObject paramsJSON = new JSONObject() .set("order_key", new JSONObject().set("order_number_type", 2).set("transaction_id", orderBaseInfo.getTransaction_id())) -// .set("order_key", new JSONObject().set("order_number_type", 1).set("out_trade_no", orderBaseInfo.getOut_trade_no()).set("mchid", mchId)) .set("delivery_mode", 1) .set("logistics_type", logisticsType) .set("shipping_list", shippingList) .set("upload_time", DateTimeUtils.formatDateTimeRFC3339(new Date())) .set("payer", new JSONObject().set("openid", orderBaseInfo.getOpen_id())); - // Step 5: Send request to WeChat API String postUrl = "https://api.weixin.qq.com/wxa/sec/order/upload_shipping_info?access_token=" + accessToken; - log.debug("发货信息录入请求: {} \n {}", postUrl, paramsJSON); + log.debug("发货信息录入请求: {} \n 响应数据 {}", postUrl, paramsJSON); JSONObject respObj = RestTemplateHttpUtil.sendPost( postUrl, @@ -161,7 +157,7 @@ public class WxOrderShippingServiceImpl implements WxOrderShippingService { return Pair.of(false, "发货信息录入失败: " + errorMsg); } - // 跳转链接设置 + // 服务号发货通知跳转链接设置 setMsgJumpPath(orderId); log.info("发货信息录入成功, 订单ID: {}", orderId); @@ -235,9 +231,9 @@ public class WxOrderShippingServiceImpl implements WxOrderShippingService { return Pair.of(false, "通知微信用户确认收货失败: " + errorMsg); } - // 跳转链接设置 + /// 服务号催促确认收货通知跳转链接设置 setMsgJumpPath(orderId); - + log.info("通知微信用户确认收货成功, 订单ID: {}", orderId); return Pair.of(true, "通知微信用户确认收货成功"); From 8abac2a5b3e595e160f70b7fc8700d7c3d7a55ca Mon Sep 17 00:00:00 2001 From: liyj <1617420630@qq.com> Date: Mon, 20 Oct 2025 20:46:58 +0800 Subject: [PATCH 08/23] =?UTF-8?q?=E6=80=9D=E8=BF=85=E5=90=8C=E6=AD=A5?= =?UTF-8?q?=E5=BA=93=E5=AD=98=E9=97=AE=E9=A2=98=E4=BF=AE=E6=94=B9=EF=BC=8C?= =?UTF-8?q?=E7=B1=BB=E5=9E=8B=E9=97=AE=E9=A2=98=E6=89=A3=E5=87=8F=E9=97=AE?= =?UTF-8?q?=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mall/shop/sync/service/impl/SyncThirdDataServiceImpl.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/mall-shop/src/main/java/com/suisung/mall/shop/sync/service/impl/SyncThirdDataServiceImpl.java b/mall-shop/src/main/java/com/suisung/mall/shop/sync/service/impl/SyncThirdDataServiceImpl.java index 7763519c..71b66ff2 100644 --- a/mall-shop/src/main/java/com/suisung/mall/shop/sync/service/impl/SyncThirdDataServiceImpl.java +++ b/mall-shop/src/main/java/com/suisung/mall/shop/sync/service/impl/SyncThirdDataServiceImpl.java @@ -956,6 +956,9 @@ public class SyncThirdDataServiceImpl extends SyncBaseThirdSxAbstract implements continue; } String itemId=productBase.getProduct_number(); + if(itemId.isEmpty()){ + continue; + } cn.hutool.json.JSONArray array_item_spec= JSONUtil.parseArray(spuItem.getItem_spec()); if(array_item_spec.isEmpty()){ redisTemplate.opsForHash().increment(key, itemId+"-"+orderId, delta.doubleValue()); From 501d3761e6b60fb6fcd52ad3bdf6dc9203a8da8d Mon Sep 17 00:00:00 2001 From: liyj <1617420630@qq.com> Date: Mon, 20 Oct 2025 21:14:39 +0800 Subject: [PATCH 09/23] =?UTF-8?q?=E6=80=9D=E8=BF=85=E5=90=8C=E6=AD=A5?= =?UTF-8?q?=E5=BA=93=E5=AD=98=E9=97=AE=E9=A2=98=E4=BF=AE=E6=94=B9=EF=BC=8C?= =?UTF-8?q?=E7=B1=BB=E5=9E=8B=E9=97=AE=E9=A2=98=E6=89=A3=E5=87=8F=E9=97=AE?= =?UTF-8?q?=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mall/shop/sync/service/impl/SyncThirdDataServiceImpl.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/mall-shop/src/main/java/com/suisung/mall/shop/sync/service/impl/SyncThirdDataServiceImpl.java b/mall-shop/src/main/java/com/suisung/mall/shop/sync/service/impl/SyncThirdDataServiceImpl.java index 71b66ff2..13a3bea2 100644 --- a/mall-shop/src/main/java/com/suisung/mall/shop/sync/service/impl/SyncThirdDataServiceImpl.java +++ b/mall-shop/src/main/java/com/suisung/mall/shop/sync/service/impl/SyncThirdDataServiceImpl.java @@ -900,8 +900,6 @@ public class SyncThirdDataServiceImpl extends SyncBaseThirdSxAbstract implements ProductQuantityConsumption productQuantityConsumption=new ProductQuantityConsumption(); String productKey= (String) k; String[] productKeyArrys=productKey.split("-"); - logger.info("productNumber:{}",productKeyArrys[0]); - logger.info("orderId:{}",productKeyArrys[1]); if(productKeyArrys.length!=2){ return; } From 10bc17df0ece3b262174c33b6c09a310be5ef541 Mon Sep 17 00:00:00 2001 From: Jack <46790855@qq.com> Date: Mon, 20 Oct 2025 21:30:56 +0800 Subject: [PATCH 10/23] =?UTF-8?q?=E7=BC=96=E5=86=99=E7=A6=81=E6=AD=A2?= =?UTF-8?q?=E9=80=80=E8=B4=A7=E7=9A=84=E6=96=B9=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/modules/lakala/LklOrderDraw.java | 3 + .../admin/LakalaAdminController.java | 2 +- .../shop/lakala/service/LakalaApiService.java | 3 +- .../lakala/service/LklOrderDrawService.java | 8 ++ .../service/impl/LakalaApiServiceImpl.java | 22 +++-- .../service/impl/LklOrderDrawServiceImpl.java | 37 ++++++++- .../mobile/UserReturnController.java | 3 +- .../impl/ShopOrderReturnServiceImpl.java | 82 ++++++++++++++++--- 8 files changed, 136 insertions(+), 24 deletions(-) diff --git a/mall-common/src/main/java/com/suisung/mall/common/modules/lakala/LklOrderDraw.java b/mall-common/src/main/java/com/suisung/mall/common/modules/lakala/LklOrderDraw.java index d41b1abf..0a3afff3 100644 --- a/mall-common/src/main/java/com/suisung/mall/common/modules/lakala/LklOrderDraw.java +++ b/mall-common/src/main/java/com/suisung/mall/common/modules/lakala/LklOrderDraw.java @@ -110,6 +110,9 @@ public class LklOrderDraw { @ApiModelProperty(value = "商户订单号", example = "MER2023100100001") private String mer_order_no; + @ApiModelProperty(value = "商城订单Id") + private String order_id; + /** * 结算流水号 */ diff --git a/mall-shop/src/main/java/com/suisung/mall/shop/lakala/controller/admin/LakalaAdminController.java b/mall-shop/src/main/java/com/suisung/mall/shop/lakala/controller/admin/LakalaAdminController.java index f1da4113..fe9b4ca8 100644 --- a/mall-shop/src/main/java/com/suisung/mall/shop/lakala/controller/admin/LakalaAdminController.java +++ b/mall-shop/src/main/java/com/suisung/mall/shop/lakala/controller/admin/LakalaAdminController.java @@ -49,7 +49,7 @@ public class LakalaAdminController extends BaseControllerImpl { } // 执行业务逻辑 - Boolean success = lakalaPayService.ewalletWithDrawD1(paramsJSON.getStr("mercId"), paramsJSON.getStr("merOrderNo"), paramsJSON.getStr("drawAmt"), paramsJSON.getStr("summary")); + Boolean success = lakalaPayService.ewalletWithDrawD1(paramsJSON.getStr("mercId"), paramsJSON.getStr("merOrderNo"), paramsJSON.getStr("drawAmt"), paramsJSON.getStr("orderId"), paramsJSON.getStr("summary")); if (success) { return CommonResult.success("账户D1提现提交成功"); } diff --git a/mall-shop/src/main/java/com/suisung/mall/shop/lakala/service/LakalaApiService.java b/mall-shop/src/main/java/com/suisung/mall/shop/lakala/service/LakalaApiService.java index 8b653e06..9f7631f3 100644 --- a/mall-shop/src/main/java/com/suisung/mall/shop/lakala/service/LakalaApiService.java +++ b/mall-shop/src/main/java/com/suisung/mall/shop/lakala/service/LakalaApiService.java @@ -340,9 +340,10 @@ public interface LakalaApiService { * @param mercId 822商户号或receiveNo * @param merOrderNo 商户订单号 * @param drawAmt 提现金额(分) + * @param orderId 商城订单Id * @param summary */ - Boolean ewalletWithDrawD1(String mercId, String merOrderNo, String drawAmt, String summary); + Boolean ewalletWithDrawD1(String mercId, String merOrderNo, String drawAmt, String orderId, String summary); /** * 拉卡拉账户D1提现结果通知 diff --git a/mall-shop/src/main/java/com/suisung/mall/shop/lakala/service/LklOrderDrawService.java b/mall-shop/src/main/java/com/suisung/mall/shop/lakala/service/LklOrderDrawService.java index 8d074ae6..f98153b5 100644 --- a/mall-shop/src/main/java/com/suisung/mall/shop/lakala/service/LklOrderDrawService.java +++ b/mall-shop/src/main/java/com/suisung/mall/shop/lakala/service/LklOrderDrawService.java @@ -29,4 +29,12 @@ public interface LklOrderDrawService extends IBaseService { * @return */ LklOrderDraw getByByMercIdAndMerOrderNo(String mercId, String merOrderNo); + + /** + * 判断订单是否已经提现完成 + * + * @param orderId + * @return + */ + Boolean isOrderDrawed(String orderId); } diff --git a/mall-shop/src/main/java/com/suisung/mall/shop/lakala/service/impl/LakalaApiServiceImpl.java b/mall-shop/src/main/java/com/suisung/mall/shop/lakala/service/impl/LakalaApiServiceImpl.java index 9ebb96b4..dffb287d 100644 --- a/mall-shop/src/main/java/com/suisung/mall/shop/lakala/service/impl/LakalaApiServiceImpl.java +++ b/mall-shop/src/main/java/com/suisung/mall/shop/lakala/service/impl/LakalaApiServiceImpl.java @@ -2808,11 +2808,12 @@ public class LakalaApiServiceImpl implements LakalaApiService { public JSONObject sacsSeparateNotify(HttpServletRequest request, String merchantNoParam, String separateNoParam) { String channel = ""; try { - JSONObject paramsJson = null; + JSONObject paramsJson; if (!StrUtil.hasBlank(merchantNoParam, separateNoParam)) { channel = "(补偿)"; log.info("[拉卡拉分账通知] 开始处理拉卡拉分账结果通知异步回调{},merchantNoParam={},separateNoParam={}", channel, merchantNoParam, separateNoParam); + // 主动从拉卡拉获取分账结果 paramsJson = sacsQuery(merchantNoParam, separateNoParam); } else { log.info("[拉卡拉分账通知] 开始处理拉卡拉分账结果通知异步回调"); @@ -2931,13 +2932,15 @@ public class LakalaApiServiceImpl implements LakalaApiService { continue; } + // 分账成功之后,立即申请提现 String recvNo = Convert.toStr(detailData.get("recv_no"), ""); String amt = Convert.toStr(detailData.get("amt"), ""); if (StrUtil.isNotBlank(recvNo) && StrUtil.isNotBlank(amt)) { - String outSeparateNoTemp = String.format("%s_%d", outSeparateNo, idx); - Boolean drawSuccess = ewalletWithDrawD1(recvNo, outSeparateNoTemp, amt, JSONUtil.toJsonStr(detailDatas)); + String merOrderNo = String.format("%s_%d", outSeparateNo, idx); + // 账户D1提现 + Boolean drawSuccess = ewalletWithDrawD1(recvNo, merOrderNo, amt, outSeparateNo, JSONUtil.toJsonStr(detailDatas)); log.info("[拉卡拉分账通知] 账户D1提现{},商户号={},分账单号={},金额={}分", - Boolean.TRUE.equals(drawSuccess) ? "成功" : "失败", recvNo, outSeparateNoTemp, amt); + Boolean.TRUE.equals(drawSuccess) ? "成功" : "失败", recvNo, merOrderNo, amt); idx++; } } @@ -3508,11 +3511,12 @@ public class LakalaApiServiceImpl implements LakalaApiService { * @param mercId 822商户号或receiveNo * @param merOrderNo 商户订单号 * @param drawAmt 提现金额(分) + * @param orderId 商城订单Id * @param summary 摘要信息 * @return 操作结果,成功返回true,失败返回false */ @Override - public Boolean ewalletWithDrawD1(String mercId, String merOrderNo, String drawAmt, String summary) { + public Boolean ewalletWithDrawD1(String mercId, String merOrderNo, String drawAmt, String orderId, String summary) { // 1. 参数校验 if (StrUtil.hasBlank(mercId, merOrderNo, drawAmt)) { log.warn("[D1提现申请] D1提现参数校验失败,关键参数为空: mercId={}, merOrderNo={}, drawAmt={}", @@ -3557,7 +3561,8 @@ public class LakalaApiServiceImpl implements LakalaApiService { if (StrUtil.isNotBlank(summary)) { request.setSummary(summary); } - request.setNotifyUrl(projectDomain + "/api/mobile/shop/lakala/ewallet/ewallet/drawNotify"); + + request.setNotifyUrl(projectDomain + "/api/mobile/shop/lakala/ewallet/drawNotify"); // 4. 发送请求 String responseStr = LKLSDK.httpPost(request); @@ -3583,6 +3588,7 @@ public class LakalaApiServiceImpl implements LakalaApiService { LklOrderDraw lklOrderDraw = new LklOrderDraw(); lklOrderDraw.setMerc_id(mercId); lklOrderDraw.setMer_order_no(merOrderNo); + lklOrderDraw.setOrder_id(orderId); lklOrderDraw.setDraw_jnl(Convert.toStr(drawJnl)); lklOrderDraw.setDraw_amt(drawAmtYuan); lklOrderDraw.setBatch_auto_settle(payType); @@ -3654,7 +3660,7 @@ public class LakalaApiServiceImpl implements LakalaApiService { log.info("[拉卡拉D1提现结果通知] 提现通知参数: drawState={}, mercId={}, merOrderNo={}", drawState, mercId, merOrderNo); - if (StrUtil.isBlank(mercId) || StrUtil.isBlank(merOrderNo) || StrUtil.isBlank(drawState)) { + if (StrUtil.hasBlank(mercId, merOrderNo, drawState)) { log.warn("[拉卡拉提现结果通知] 回调参数缺失: drawState={}, mercId={}, merOrderNo={}", drawState, mercId, merOrderNo); return JSONUtil.createObj() .set("code", "FAIL") @@ -3665,7 +3671,7 @@ public class LakalaApiServiceImpl implements LakalaApiService { if (!"DRAW.SUCCESS".equals(drawState)) { log.debug("[拉卡拉D1提现结果通知] 提现状态未成功,忽略处理: drawState={}", drawState); return JSONUtil.createObj() - .set("code", "SUCCESS") // 返回成功,避免重复通知 + .set("code", "FAIL") // 返回成功,避免重复通知 .set("message", "状态未成功,忽略处理"); } diff --git a/mall-shop/src/main/java/com/suisung/mall/shop/lakala/service/impl/LklOrderDrawServiceImpl.java b/mall-shop/src/main/java/com/suisung/mall/shop/lakala/service/impl/LklOrderDrawServiceImpl.java index 22e7043c..d676e913 100644 --- a/mall-shop/src/main/java/com/suisung/mall/shop/lakala/service/impl/LklOrderDrawServiceImpl.java +++ b/mall-shop/src/main/java/com/suisung/mall/shop/lakala/service/impl/LklOrderDrawServiceImpl.java @@ -38,7 +38,7 @@ public class LklOrderDrawServiceImpl extends BaseServiceImpl 0) { // 更新记录 log.info("[LklOrderDraw] 记录已存在,执行更新操作,ID={}", existsRecord.getId()); @@ -102,4 +102,39 @@ public class LklOrderDrawServiceImpl extends BaseServiceImpl() + .eq("order_id", orderId) + .eq("draw_state", "DRAW.SUCCESS") + .orderByDesc("id")); + + // 根据查询结果判断是否已提现 + if (lklOrderDraw != null) { + log.debug("订单[{}]提现已完成", orderId); + return true; + } else { + log.debug("订单[{}]提现未完成或不存在提现记录", orderId); + return false; + } + } catch (Exception e) { + log.error("查询订单[{}]提现状态异常", orderId, e); + return false; + } + } } diff --git a/mall-shop/src/main/java/com/suisung/mall/shop/order/controller/mobile/UserReturnController.java b/mall-shop/src/main/java/com/suisung/mall/shop/order/controller/mobile/UserReturnController.java index 95db5e8d..5fa657ae 100644 --- a/mall-shop/src/main/java/com/suisung/mall/shop/order/controller/mobile/UserReturnController.java +++ b/mall-shop/src/main/java/com/suisung/mall/shop/order/controller/mobile/UserReturnController.java @@ -85,7 +85,8 @@ public class UserReturnController extends BaseControllerImpl { return CommonResult.failed(ResultCode.NEED_LOGIN); } - return shopOrderReturnService.addWholeItems(order_id, false, ""); + // return shopOrderReturnService.addWholeItems(order_id, false, ""); + return shopOrderReturnService.addRemainingItems(order_id, true, ""); } @ApiOperation(value = "取消退款订单", notes = "取消退款订单") diff --git a/mall-shop/src/main/java/com/suisung/mall/shop/order/service/impl/ShopOrderReturnServiceImpl.java b/mall-shop/src/main/java/com/suisung/mall/shop/order/service/impl/ShopOrderReturnServiceImpl.java index d86c9b22..c9aa5a49 100644 --- a/mall-shop/src/main/java/com/suisung/mall/shop/order/service/impl/ShopOrderReturnServiceImpl.java +++ b/mall-shop/src/main/java/com/suisung/mall/shop/order/service/impl/ShopOrderReturnServiceImpl.java @@ -43,6 +43,7 @@ import com.suisung.mall.shop.base.service.ShopBaseStateCodeService; import com.suisung.mall.shop.distribution.service.ShopDistributionUserCommissionService; import com.suisung.mall.shop.distribution.service.ShopDistributionUserOrderItemService; import com.suisung.mall.shop.distribution.service.ShopDistributionUserOrderService; +import com.suisung.mall.shop.lakala.service.LklOrderDrawService; import com.suisung.mall.shop.lakala.service.LklOrderSeparateService; import com.suisung.mall.shop.message.service.PushMessageService; import com.suisung.mall.shop.number.service.ShopNumberSeqService; @@ -195,7 +196,7 @@ public class ShopOrderReturnServiceImpl extends BaseServiceImpl contractTypeIds = Convert.toList(Integer.class, shopProductIndex.getContract_type_ids()); //start判断是否可以申请退款 - // 1、商品是否允许 + // 1、商品是否禁止退货 if (contractTypeIds.contains(new Integer(StateCode.CONTRACT_TYPE_DENY_RETURN))) { - is_denyreturn = true; - // throw new ApiException(I18nUtil._("此商品不允许退货!")); + log.error("此商品不允许退货!"); + return true; } // 2、是否已经可结算, 进入可结算,不允许退货。 @@ -2133,14 +2136,69 @@ public class ShopOrderReturnServiceImpl extends BaseServiceImpl 0) { - is_denyreturn = true; - //throw new ApiException(I18nUtil._("此商品已过退货期,不允许退货!")); + log.error("此商品已过退货期,不允许退货!"); + return true; } } - return is_denyreturn; + return is_deny_return; } + + /** + * 判断订单是否禁止退货 + * + * @param orderId 订单ID + * @return 如果订单禁止退货返回true,否则返回false + */ + public boolean isOrderDenyReturn(String orderId) { + // 参数校验 + if (StrUtil.isBlank(orderId)) { + log.warn("订单ID为空,无法判断退货状态"); + return true; + } + + try { + // 获取订单信息 + ShopOrderInfo shopOrderInfo = shopOrderInfoService.get(orderId); + if (shopOrderInfo == null) { + log.error("订单信息不存在,订单ID: {}", orderId); + return true; + } + + // 检查订单状态是否已收货或已完成 + Integer orderStateId = shopOrderInfo.getOrder_state_id(); + if (ObjectUtil.equal(orderStateId, StateCode.ORDER_STATE_RECEIVED) || + ObjectUtil.equal(orderStateId, StateCode.ORDER_STATE_FINISH)) { + + // 获取可提现时间戳 + Long withdrawTime = shopOrderBaseService.getWithdrawTime(); + Long orderDealTime = shopOrderInfo.getOrder_deal_time(); + + // 如果订单成交时间早于可提现时间,说明已过退货期 + if (orderDealTime != null && withdrawTime.compareTo(orderDealTime) > 0) { + log.debug("订单[{}]已过退货期,不允许退货", orderId); + return true; + } + } + + // 检查拉卡拉分账和提现状态 + if (lklOrderSeparateService.isOrderSeparated(orderId) && + lklOrderDrawService.isOrderDrawed(orderId)) { + log.debug("订单[{}]已提现,不允许退货", orderId); + return true; + } + + // 默认允许退货 + return false; + + } catch (Exception e) { + log.error("查询订单[{}]退货状态异常", orderId, e); + return true; + } + } + + /** * 该函数用于判断指定订单商品是否禁止退货。 * 根据 order_item_id 获取订单商品信息; @@ -2284,7 +2342,7 @@ public class ShopOrderReturnServiceImpl extends BaseServiceImpl Date: Mon, 20 Oct 2025 21:54:50 +0800 Subject: [PATCH 11/23] =?UTF-8?q?=E7=BC=96=E5=86=99=E7=A6=81=E6=AD=A2?= =?UTF-8?q?=E9=80=80=E8=B4=A7=E7=9A=84=E6=96=B9=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../impl/ShopOrderReturnServiceImpl.java | 121 +++++++++++++----- 1 file changed, 87 insertions(+), 34 deletions(-) diff --git a/mall-shop/src/main/java/com/suisung/mall/shop/order/service/impl/ShopOrderReturnServiceImpl.java b/mall-shop/src/main/java/com/suisung/mall/shop/order/service/impl/ShopOrderReturnServiceImpl.java index c9aa5a49..ee0caf18 100644 --- a/mall-shop/src/main/java/com/suisung/mall/shop/order/service/impl/ShopOrderReturnServiceImpl.java +++ b/mall-shop/src/main/java/com/suisung/mall/shop/order/service/impl/ShopOrderReturnServiceImpl.java @@ -1595,12 +1595,8 @@ public class ShopOrderReturnServiceImpl extends BaseServiceImpl forbiddenStates = Arrays.asList( - StateCode.ORDER_STATE_SHIPPED, - StateCode.ORDER_STATE_RECEIVED, - StateCode.ORDER_STATE_FINISH); - if (order_state_id != null && !forbiddenStates.contains(order_state_id)) { + // 订单不是禁止退货(能退货)的情况下 + if (order_state_id != null && !isOrderDenyReturn(order_id)) { logger.info("处理运费和打包费事宜:{}", order_id); ShopOrderData order_data_row = shopOrderDataService.get(order_id); @@ -2097,51 +2093,108 @@ public class ShopOrderReturnServiceImpl extends BaseServiceImpl contractTypeIds = Convert.toList(Integer.class, shopProductIndex.getContract_type_ids()); + // 获取商品索引信息 + ShopProductIndex productIndex = shopProductIndex; + if (productIndex == null) { + productIndex = shopProductIndexService.get(shopOrderItem.getProduct_id()); + } - //start判断是否可以申请退款 - // 1、商品是否禁止退货 - if (contractTypeIds.contains(new Integer(StateCode.CONTRACT_TYPE_DENY_RETURN))) { - log.error("此商品不允许退货!"); + if (productIndex == null) { + log.warn("商品索引信息不存在,product_id: {}", shopOrderItem.getProduct_id()); return true; } - // 2、是否已经可结算, 进入可结算,不允许退货。 - if (shopOrderInfo.getOrder_state_id().intValue() == StateCode.ORDER_STATE_RECEIVED || shopOrderInfo.getOrder_state_id().intValue() == StateCode.ORDER_STATE_FINISH) { - // 可提现时间 - Long withdrawTime = shopOrderBaseService.getWithdrawTime(); + String orderId = shopOrderInfo.getOrder_id(); - //order_deal_time - if (withdrawTime.compareTo(shopOrderInfo.getOrder_deal_time()) > 0) { - log.error("此商品已过退货期,不允许退货!"); - return true; + // 1. 检查商品是否设置了禁止退货标识 + String contractTypeIdsStr = productIndex.getContract_type_ids(); + if (StrUtil.isNotBlank(contractTypeIdsStr)) { + try { + List contractTypeIds = Convert.toList(Integer.class, contractTypeIdsStr); + if (contractTypeIds != null && contractTypeIds.contains(StateCode.CONTRACT_TYPE_DENY_RETURN)) { + log.debug("商品设置了禁止退货标识,order_id: {}, product_id: {}", orderId, shopOrderItem.getProduct_id()); + return true; + } + } catch (Exception e) { + log.error("解析商品保障类型失败,order_id: {}, product_id: {}", orderId, shopOrderItem.getProduct_id(), e); } } - return is_deny_return; + // 2. 检查订单状态是否为已收货或已完成 + Integer orderStateId = shopOrderInfo.getOrder_state_id(); + if (ObjectUtil.equal(orderStateId, StateCode.ORDER_STATE_RECEIVED) || + ObjectUtil.equal(orderStateId, StateCode.ORDER_STATE_FINISH)) { + + try { + // 获取可提现时间戳 + Long withdrawTime = shopOrderBaseService.getWithdrawTime(); + Long orderDealTime = shopOrderInfo.getOrder_deal_time(); + + // 检查是否超过退货期限 + if (orderDealTime != null && withdrawTime.compareTo(orderDealTime) > 0) { + log.debug("订单已超过退货期限,order_id: {}, product_id: {}", orderId, shopOrderItem.getProduct_id()); + return true; + } + } catch (Exception e) { + log.error("检查订单退货期限时发生异常,order_id: {}, product_id: {}", orderId, shopOrderItem.getProduct_id(), e); + } + } + + // 3. 检查拉卡拉分账订单是否已提现 + try { + if (lklOrderSeparateService != null && lklOrderDrawService != null) { + boolean isSeparated = lklOrderSeparateService.isOrderSeparated(orderId); + boolean isDrawn = lklOrderDrawService.isOrderDrawed(orderId); + + if (isSeparated && isDrawn) { + log.debug("拉卡拉分账订单已提现,不允许退货,order_id: {}, product_id: {}", orderId, shopOrderItem.getProduct_id()); + return true; + } + } + } catch (Exception e) { + log.error("检查拉卡拉分账状态时发生异常,order_id: {}, product_id: {}", orderId, shopOrderItem.getProduct_id(), e); + } + + // 默认允许退货 + return false; + } + + /** + * 判断订单中某个商品是否禁止退货 + *

+ * 该方法用于检查指定订单中的特定商品是否允许退货,主要检查以下几种情况: + * 1. 商品是否设置了"禁止退货"的消费者保障标识 + * 2. 订单是否已超过退货期限(已收货或已完成状态,且超过可提现时间) + * 3. 拉卡拉分账订单是否已完成提现 + * + * @param orderId 订单ID + * @param productId 商品ID + * @return boolean true表示禁止退货,false表示允许退货 + */ + public boolean ifOrderItemDenyReturn(String orderId, Long productId) { + // 复用已有的方法逻辑,避免重复代码 + return ifDenyReturn( + shopOrderInfoService.get(orderId), + null, // 不需要具体的订单商品项信息 + shopProductIndexService.get(productId) + ); } From 66498ff82d4dfd28152da40e016005d465512cb9 Mon Sep 17 00:00:00 2001 From: liyj <1617420630@qq.com> Date: Mon, 20 Oct 2025 22:09:48 +0800 Subject: [PATCH 12/23] =?UTF-8?q?=E6=80=9D=E8=BF=85=E5=90=8C=E6=AD=A5?= =?UTF-8?q?=E5=BA=93=E5=AD=98=E9=97=AE=E9=A2=98=E4=BF=AE=E6=94=B9=EF=BC=8C?= =?UTF-8?q?=E7=B1=BB=E5=9E=8B=E9=97=AE=E9=A2=98=E6=89=A3=E5=87=8F=E4=B8=BA?= =?UTF-8?q?=E7=A9=BA=E9=97=AE=E9=A2=98=E6=97=A5=E5=BF=97=20=E8=AE=B0?= =?UTF-8?q?=E5=BD=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../shop/sync/service/impl/SyncThirdDataServiceImpl.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/mall-shop/src/main/java/com/suisung/mall/shop/sync/service/impl/SyncThirdDataServiceImpl.java b/mall-shop/src/main/java/com/suisung/mall/shop/sync/service/impl/SyncThirdDataServiceImpl.java index 13a3bea2..e422980e 100644 --- a/mall-shop/src/main/java/com/suisung/mall/shop/sync/service/impl/SyncThirdDataServiceImpl.java +++ b/mall-shop/src/main/java/com/suisung/mall/shop/sync/service/impl/SyncThirdDataServiceImpl.java @@ -950,16 +950,21 @@ public class SyncThirdDataServiceImpl extends SyncBaseThirdSxAbstract implements String key=RedisKey.STOREDATARELEASE+":"+spuItem.getStore_id(); Long productId = spuItem.getProduct_id(); ShopProductBase productBase = shopProductBaseService.get(productId); + logger.info("productBase--{}",productBase); if(productBase==null){ continue; } String itemId=productBase.getProduct_number(); + logger.info("Product_number:{}",itemId); if(itemId.isEmpty()){ continue; } cn.hutool.json.JSONArray array_item_spec= JSONUtil.parseArray(spuItem.getItem_spec()); + logger.info("array_item_spec:{}",array_item_spec); + logger.info("key:{},Product_number:{}",key,itemId); if(array_item_spec.isEmpty()){ redisTemplate.opsForHash().increment(key, itemId+"-"+orderId, delta.doubleValue()); + logger.info("存储无规格库存成功"); continue; } cn.hutool.json.JSONObject item = (cn.hutool.json.JSONObject) ((cn.hutool.json.JSONObject) array_item_spec.get(0)).get("item"); @@ -967,6 +972,7 @@ public class SyncThirdDataServiceImpl extends SyncBaseThirdSxAbstract implements BigDecimal itemQuaryty = getBigDecimal(delta, name); // 使用 Redis 的 HINCRBY 保证原子性和高性能 redisTemplate.opsForHash().increment(key, itemId+"-"+orderId, itemQuaryty.doubleValue()); + logger.info("存储有规格库存成功"); } catch (Exception e) { logger.error("库存累计失败,productKey={}, delta={}, error={}", productKey, delta, e.getMessage(), e); } From 2471d2b4c2d2ce72c562de6cd271f030f2836138 Mon Sep 17 00:00:00 2001 From: Jack <46790855@qq.com> Date: Mon, 20 Oct 2025 22:15:35 +0800 Subject: [PATCH 13/23] =?UTF-8?q?=E4=BC=98=E5=8C=96=E7=A6=81=E6=AD=A2?= =?UTF-8?q?=E9=80=80=E8=B4=A7=E7=9A=84=E6=96=B9=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../impl/ShopOrderReturnServiceImpl.java | 89 ++++++++++--------- 1 file changed, 48 insertions(+), 41 deletions(-) diff --git a/mall-shop/src/main/java/com/suisung/mall/shop/order/service/impl/ShopOrderReturnServiceImpl.java b/mall-shop/src/main/java/com/suisung/mall/shop/order/service/impl/ShopOrderReturnServiceImpl.java index ee0caf18..8f322ac8 100644 --- a/mall-shop/src/main/java/com/suisung/mall/shop/order/service/impl/ShopOrderReturnServiceImpl.java +++ b/mall-shop/src/main/java/com/suisung/mall/shop/order/service/impl/ShopOrderReturnServiceImpl.java @@ -2099,49 +2099,29 @@ public class ShopOrderReturnServiceImpl extends BaseServiceImpl contractTypeIds = Convert.toList(Integer.class, contractTypeIdsStr); - if (contractTypeIds != null && contractTypeIds.contains(StateCode.CONTRACT_TYPE_DENY_RETURN)) { - log.debug("商品设置了禁止退货标识,order_id: {}, product_id: {}", orderId, shopOrderItem.getProduct_id()); - return true; - } - } catch (Exception e) { - log.error("解析商品保障类型失败,order_id: {}, product_id: {}", orderId, shopOrderItem.getProduct_id(), e); - } + Integer orderStateId = shopOrderInfo.getOrder_state_id(); + if (StrUtil.isBlank(orderId) || CheckUtil.isEmpty(orderStateId)) { + log.warn("[是否禁止退货] 订单ID或订单状态为空"); + return true; } - // 2. 检查订单状态是否为已收货或已完成 - Integer orderStateId = shopOrderInfo.getOrder_state_id(); - if (ObjectUtil.equal(orderStateId, StateCode.ORDER_STATE_RECEIVED) || - ObjectUtil.equal(orderStateId, StateCode.ORDER_STATE_FINISH)) { + // 2. 先判断整个订单是否可以退货(订单级别检查) + // 2.1 检查订单状态是否为已收货或已完成 + if (orderStateId.intValue() == StateCode.ORDER_STATE_RECEIVED || + orderStateId.intValue() == StateCode.ORDER_STATE_FINISH) { try { // 获取可提现时间戳 Long withdrawTime = shopOrderBaseService.getWithdrawTime(); @@ -2149,33 +2129,60 @@ public class ShopOrderReturnServiceImpl extends BaseServiceImpl 0) { - log.debug("订单已超过退货期限,order_id: {}, product_id: {}", orderId, shopOrderItem.getProduct_id()); + log.debug("[是否禁止退货] 订单已超过退货期限,order_id: {}", orderId); return true; } } catch (Exception e) { - log.error("检查订单退货期限时发生异常,order_id: {}, product_id: {}", orderId, shopOrderItem.getProduct_id(), e); + log.error("[是否禁止退货] 检查订单退货期限时发生异常,order_id: {}", orderId, e); } } - // 3. 检查拉卡拉分账订单是否已提现 + // 2.2 检查拉卡拉分账订单是否已提现 try { if (lklOrderSeparateService != null && lklOrderDrawService != null) { boolean isSeparated = lklOrderSeparateService.isOrderSeparated(orderId); boolean isDrawn = lklOrderDrawService.isOrderDrawed(orderId); if (isSeparated && isDrawn) { - log.debug("拉卡拉分账订单已提现,不允许退货,order_id: {}, product_id: {}", orderId, shopOrderItem.getProduct_id()); + log.debug("[是否禁止退货] 拉卡拉分账订单已提现,不允许退货,order_id: {}", orderId); return true; } } } catch (Exception e) { - log.error("检查拉卡拉分账状态时发生异常,order_id: {}, product_id: {}", orderId, shopOrderItem.getProduct_id(), e); + log.error("[是否禁止退货] 检查拉卡拉分账状态时发生异常,order_id: {}", orderId, e); + } + + // 3. 再判断具体商品是否可以退货(商品级别检查) + // 获取商品索引信息 + ShopProductIndex productIndex = shopProductIndex; + if (productIndex == null) { + productIndex = shopProductIndexService.get(shopOrderItem.getProduct_id()); + } + + if (productIndex == null) { + log.warn("[是否禁止退货] 商品索引信息不存在,product_id: {}", shopOrderItem.getProduct_id()); + return true; + } + + // 3.1 检查商品是否设置了禁止退货标识 + String contractTypeIdsStr = productIndex.getContract_type_ids(); + if (StrUtil.isNotBlank(contractTypeIdsStr)) { + try { + List contractTypeIds = Convert.toList(Integer.class, contractTypeIdsStr); + if (contractTypeIds != null && contractTypeIds.contains(StateCode.CONTRACT_TYPE_DENY_RETURN)) { + log.debug("[是否禁止退货] 商品设置了禁止退货标识,order_id: {}, product_id: {}", orderId, shopOrderItem.getProduct_id()); + return true; + } + } catch (Exception e) { + log.error("[是否禁止退货] 解析商品保障类型失败,order_id: {}, product_id: {}", orderId, shopOrderItem.getProduct_id(), e); + } } // 默认允许退货 return false; } + /** * 判断订单中某个商品是否禁止退货 *

@@ -2207,7 +2214,7 @@ public class ShopOrderReturnServiceImpl extends BaseServiceImpl 0) { - log.debug("订单[{}]已过退货期,不允许退货", orderId); + log.debug("[订单是否禁止退货]订单[{}]已过退货期,不允许退货", orderId); return true; } } @@ -2238,7 +2245,7 @@ public class ShopOrderReturnServiceImpl extends BaseServiceImpl Date: Tue, 21 Oct 2025 09:15:21 +0800 Subject: [PATCH 14/23] =?UTF-8?q?=E6=80=9D=E8=BF=85=E5=90=8C=E6=AD=A5?= =?UTF-8?q?=E5=BA=93=E5=AD=98=E9=97=AE=E9=A2=98=E4=BF=AE=E6=94=B9=EF=BC=8C?= =?UTF-8?q?=E7=B1=BB=E5=9E=8B=E9=97=AE=E9=A2=98=E6=89=A3=E5=87=8F=E8=B4=A7?= =?UTF-8?q?=E6=9E=B6=E5=8F=B7=E5=8F=96=E5=80=BC=E4=BB=8Eproduct=5Fnumber?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../shop/sync/service/impl/SyncThirdDataServiceImpl.java | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/mall-shop/src/main/java/com/suisung/mall/shop/sync/service/impl/SyncThirdDataServiceImpl.java b/mall-shop/src/main/java/com/suisung/mall/shop/sync/service/impl/SyncThirdDataServiceImpl.java index e422980e..0f9e06ef 100644 --- a/mall-shop/src/main/java/com/suisung/mall/shop/sync/service/impl/SyncThirdDataServiceImpl.java +++ b/mall-shop/src/main/java/com/suisung/mall/shop/sync/service/impl/SyncThirdDataServiceImpl.java @@ -957,7 +957,14 @@ public class SyncThirdDataServiceImpl extends SyncBaseThirdSxAbstract implements String itemId=productBase.getProduct_number(); logger.info("Product_number:{}",itemId); if(itemId.isEmpty()){ - continue; + ShopProductIndex shopProductIndex=shopProductIndexService.get(productId); + if(shopProductIndex==null){ + continue; + } + itemId=shopProductIndex.getProduct_number(); + if(itemId.isEmpty()){ + continue; + } } cn.hutool.json.JSONArray array_item_spec= JSONUtil.parseArray(spuItem.getItem_spec()); logger.info("array_item_spec:{}",array_item_spec); From 12523f13da4b7c46ef9033f1f36bb57b530d91d3 Mon Sep 17 00:00:00 2001 From: Jack <46790855@qq.com> Date: Tue, 21 Oct 2025 10:35:52 +0800 Subject: [PATCH 15/23] =?UTF-8?q?=E4=BC=98=E5=8C=96=E7=A6=81=E6=AD=A2?= =?UTF-8?q?=E9=80=80=E8=B4=A7=E7=9A=84=E6=96=B9=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../modules/order/dto/MchOrderInfoDTO.java | 4 +- .../modules/order/dto/MchOrderItemDTO.java | 3 ++ .../order/service/ShopOrderReturnService.java | 24 ++++++++++++ .../impl/ShopOrderBaseServiceImpl.java | 10 +++++ .../impl/ShopOrderReturnServiceImpl.java | 38 ++++++++++++------- 5 files changed, 64 insertions(+), 15 deletions(-) diff --git a/mall-common/src/main/java/com/suisung/mall/common/modules/order/dto/MchOrderInfoDTO.java b/mall-common/src/main/java/com/suisung/mall/common/modules/order/dto/MchOrderInfoDTO.java index 05f732dc..cdfdf29b 100644 --- a/mall-common/src/main/java/com/suisung/mall/common/modules/order/dto/MchOrderInfoDTO.java +++ b/mall-common/src/main/java/com/suisung/mall/common/modules/order/dto/MchOrderInfoDTO.java @@ -91,6 +91,6 @@ public class MchOrderInfoDTO implements Serializable { private BigDecimal order_income_amount; @ApiModelProperty(value = "两点距离,单位米") private Integer distance; - - // 快递鸟物流信息 + @ApiModelProperty(value = "是否禁止退款:1-是;2-否;") + private Integer is_deny_return; } diff --git a/mall-common/src/main/java/com/suisung/mall/common/modules/order/dto/MchOrderItemDTO.java b/mall-common/src/main/java/com/suisung/mall/common/modules/order/dto/MchOrderItemDTO.java index dac88fd2..a13b4649 100644 --- a/mall-common/src/main/java/com/suisung/mall/common/modules/order/dto/MchOrderItemDTO.java +++ b/mall-common/src/main/java/com/suisung/mall/common/modules/order/dto/MchOrderItemDTO.java @@ -61,4 +61,7 @@ public class MchOrderItemDTO implements Serializable { @ApiModelProperty(value = "退款金额:同意额度") private BigDecimal order_item_return_agree_amount; + + @ApiModelProperty(value = "是否禁止退款:1-是;2-否;") + private Integer is_deny_return; } diff --git a/mall-shop/src/main/java/com/suisung/mall/shop/order/service/ShopOrderReturnService.java b/mall-shop/src/main/java/com/suisung/mall/shop/order/service/ShopOrderReturnService.java index 4ae76f0f..a64e8d7c 100644 --- a/mall-shop/src/main/java/com/suisung/mall/shop/order/service/ShopOrderReturnService.java +++ b/mall-shop/src/main/java/com/suisung/mall/shop/order/service/ShopOrderReturnService.java @@ -159,6 +159,28 @@ public interface ShopOrderReturnService extends IBaseService { */ boolean ifDenyReturn(Long order_item_id); + /** + * 判断订单中某个商品是否禁止退货 + *

+ * 该方法用于检查指定订单中的特定商品是否允许退货,主要检查以下几种情况: + * 1. 商品是否设置了"禁止退货"的消费者保障标识 + * 2. 订单是否已超过退货期限(已收货或已完成状态,且超过可提现时间) + * 3. 拉卡拉分账订单是否已完成提现 + * + * @param orderId 订单ID + * @param productId 商品ID + * @return boolean true表示禁止退货,false表示允许退货 + */ + boolean ifOrderItemDenyReturn(String orderId, Long productId); + + /** + * 判断订单是否禁止退货 + * + * @param orderId 订单ID + * @return 如果订单禁止退货返回true,否则返回false + */ + boolean isOrderDenyReturn(String orderId); + /** * 该方法用于处理整单退货申请,具体功能如下: * 根据订单ID获取订单信息,若为空则抛异常。 @@ -201,4 +223,6 @@ public interface ShopOrderReturnService extends IBaseService { * @return */ CommonResult doRefundForMch(JSONObject params); + + } 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 08116afb..a2eea4a7 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 @@ -8947,6 +8947,16 @@ public class ShopOrderBaseServiceImpl extends BaseServiceImpl { + item.setIs_deny_return(isOrderDenyReturn); + }); + }); return pageList; diff --git a/mall-shop/src/main/java/com/suisung/mall/shop/order/service/impl/ShopOrderReturnServiceImpl.java b/mall-shop/src/main/java/com/suisung/mall/shop/order/service/impl/ShopOrderReturnServiceImpl.java index 8f322ac8..4035bf4a 100644 --- a/mall-shop/src/main/java/com/suisung/mall/shop/order/service/impl/ShopOrderReturnServiceImpl.java +++ b/mall-shop/src/main/java/com/suisung/mall/shop/order/service/impl/ShopOrderReturnServiceImpl.java @@ -2119,7 +2119,6 @@ public class ShopOrderReturnServiceImpl extends BaseServiceImpl contractTypeIds = Convert.toList(Integer.class, contractTypeIdsStr); if (contractTypeIds != null && contractTypeIds.contains(StateCode.CONTRACT_TYPE_DENY_RETURN)) { - log.debug("[是否禁止退货] 商品设置了禁止退货标识,order_id: {}, product_id: {}", orderId, shopOrderItem.getProduct_id()); + log.debug("[是否禁止退货] 商品设置了禁止退货标识,order_id: {}, product_id: {}", orderId, productId); return true; } } catch (Exception e) { - log.error("[是否禁止退货] 解析商品保障类型失败,order_id: {}, product_id: {}", orderId, shopOrderItem.getProduct_id(), e); + log.error("[是否禁止退货] 解析商品保障类型失败,order_id: {}, product_id: {}", orderId, productId, e); } } @@ -2211,10 +2216,11 @@ public class ShopOrderReturnServiceImpl extends BaseServiceImpl 0) { - log.debug("[订单是否禁止退货]订单[{}]已过退货期,不允许退货", orderId); + log.debug("[订单是否禁止退货] 订单:{} 已过退货期,不允许退货", orderId); return true; } } @@ -2245,7 +2257,7 @@ public class ShopOrderReturnServiceImpl extends BaseServiceImpl Date: Tue, 21 Oct 2025 11:07:38 +0800 Subject: [PATCH 16/23] =?UTF-8?q?=E6=98=AF=E5=90=A6=E8=83=BD=E7=A6=81?= =?UTF-8?q?=E6=AD=A2=E9=80=80=E8=B4=A7=EF=BC=8C=E5=85=B3=E8=81=94=E5=88=B0?= =?UTF-8?q?=E7=94=A8=E6=88=B7=E8=AE=A2=E5=8D=95=E8=AF=A6=E6=83=85=E5=92=8C?= =?UTF-8?q?=E5=95=86=E5=AE=B6=E8=AE=A2=E5=8D=95=E5=88=97=E8=A1=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../order/service/impl/ShopOrderBaseServiceImpl.java | 6 +++++- .../service/impl/ShopOrderReturnServiceImpl.java | 12 ++++++++++++ 2 files changed, 17 insertions(+), 1 deletion(-) 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 a2eea4a7..3c3c94bb 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 @@ -670,6 +670,7 @@ public class ShopOrderBaseServiceImpl extends BaseServiceImpl userOrderQueryWrapper = new QueryWrapper<>(); userOrderQueryWrapper.eq("user_id", user_id).in("order_id", order_ids); ShopDistributionUserOrder distributionUserOrder = shopDistributionUserOrderService.findOne(userOrderQueryWrapper); @@ -761,11 +762,14 @@ public class ShopOrderBaseServiceImpl extends BaseServiceImpl Date: Tue, 21 Oct 2025 11:15:20 +0800 Subject: [PATCH 17/23] =?UTF-8?q?=E6=98=AF=E5=90=A6=E8=83=BD=E7=A6=81?= =?UTF-8?q?=E6=AD=A2=E9=80=80=E8=B4=A7=EF=BC=8C=E5=85=B3=E8=81=94=E5=88=B0?= =?UTF-8?q?=E7=94=A8=E6=88=B7=E8=AE=A2=E5=8D=95=E8=AF=A6=E6=83=85=E5=92=8C?= =?UTF-8?q?=E5=95=86=E5=AE=B6=E8=AE=A2=E5=8D=95=E5=88=97=E8=A1=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../order/controller/admin/ShopOrderBaseController.java | 1 + .../order/service/impl/ShopOrderBaseServiceImpl.java | 9 +++++++++ 2 files changed, 10 insertions(+) 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 37287b1c..6a7145d8 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 @@ -391,6 +391,7 @@ public class ShopOrderBaseController extends BaseControllerImpl { return CommonResult.failed(ResultCode.FORBIDDEN); } + // 5. 返回结果 return CommonResult.success(mchOrderInfoDTO); } catch (Exception e) { 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 3c3c94bb..99202c21 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 @@ -9058,6 +9058,15 @@ public class ShopOrderBaseServiceImpl extends BaseServiceImpl { + item.setIs_deny_return(isOrderDenyReturn); + }); + return orderDetail; } From 8058773aacfaa90f6dcd978a8a4062bbf962288c Mon Sep 17 00:00:00 2001 From: Jack <46790855@qq.com> Date: Tue, 21 Oct 2025 11:15:49 +0800 Subject: [PATCH 18/23] =?UTF-8?q?=E6=98=AF=E5=90=A6=E8=83=BD=E7=A6=81?= =?UTF-8?q?=E6=AD=A2=E9=80=80=E8=B4=A7=EF=BC=8C=E5=85=B3=E8=81=94=E5=88=B0?= =?UTF-8?q?=E7=94=A8=E6=88=B7=E8=AE=A2=E5=8D=95=E8=AF=A6=E6=83=85=E5=92=8C?= =?UTF-8?q?=E5=95=86=E5=AE=B6=E8=AE=A2=E5=8D=95=E5=88=97=E8=A1=A8=E8=AF=A6?= =?UTF-8?q?=E6=83=85=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mall/shop/order/service/impl/ShopOrderBaseServiceImpl.java | 1 - 1 file changed, 1 deletion(-) 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 99202c21..91ef27f9 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 @@ -9070,7 +9070,6 @@ public class ShopOrderBaseServiceImpl extends BaseServiceImpl Date: Tue, 21 Oct 2025 15:13:31 +0800 Subject: [PATCH 19/23] =?UTF-8?q?=E4=BC=98=E5=8C=96=E8=87=AA=E5=8A=A8?= =?UTF-8?q?=E5=8F=96=E6=B6=88=E8=AE=A2=E5=8D=95=E6=89=B9=E6=AC=A1=EF=BC=8C?= =?UTF-8?q?=E6=94=B9=E4=B8=BA=E5=88=86=E9=A1=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../quartz/job/UpdateOrderStatusJob.java | 76 ++++++++++--------- .../order/service/ShopOrderInfoService.java | 13 ++++ .../impl/ShopOrderInfoServiceImpl.java | 36 +++++++++ 3 files changed, 89 insertions(+), 36 deletions(-) diff --git a/mall-shop/src/main/java/com/suisung/mall/shop/components/quartz/job/UpdateOrderStatusJob.java b/mall-shop/src/main/java/com/suisung/mall/shop/components/quartz/job/UpdateOrderStatusJob.java index 33fc9268..9cf3c70c 100644 --- a/mall-shop/src/main/java/com/suisung/mall/shop/components/quartz/job/UpdateOrderStatusJob.java +++ b/mall-shop/src/main/java/com/suisung/mall/shop/components/quartz/job/UpdateOrderStatusJob.java @@ -7,6 +7,7 @@ import com.suisung.mall.shop.config.SpringUtil; import com.suisung.mall.shop.distribution.service.ShopDistributionUserOrderService; import com.suisung.mall.shop.order.service.ShopOrderBaseService; import com.suisung.mall.shop.order.service.ShopOrderInfoService; +import com.suisung.mall.shop.sixun.utils.CommonUtil; import org.quartz.JobExecutionContext; import org.quartz.JobExecutionException; import org.slf4j.Logger; @@ -23,6 +24,8 @@ public class UpdateOrderStatusJob extends QuartzJobBean { private static final Logger logger = LoggerFactory.getLogger(UpdateOrderStatusJob.class); + private static final Integer PAGESIZE = 100; + @Override protected void executeInternal(JobExecutionContext jobExecutionContext) throws JobExecutionException { ShopOrderBaseService shopOrderBaseService = SpringUtil.getBean(ShopOrderBaseService.class); @@ -36,51 +39,52 @@ public class UpdateOrderStatusJob extends QuartzJobBean { //shopOrderBaseService.autoCancelOrder(); // 更新未付款订单,取消超时订单 - List order_id_row = shopOrderInfoService.getAutoCancelOrderId(); - if (CollUtil.isNotEmpty(order_id_row)) { - for (String order_id : order_id_row) { - try { - List ids = Collections.singletonList(order_id); - if (!shopOrderBaseService.cancel(ids, null, true)) { - LogUtil.error(String.format(I18nUtil._("order_id : %s 取消出错"), order_id)); + long total = shopOrderInfoService.countgetAutoCancelOrderId(); + if (total > 0) { + int pages = CommonUtil.getPagesCount(Math.toIntExact(total), PAGESIZE); + for (int i = 1; i <= pages; i++) { + List order_id_row = shopOrderInfoService.getAutoCancelOrderIdByPage(i, PAGESIZE); + for (String order_id : order_id_row) { + try { + List ids = Collections.singletonList(order_id); + if (!shopOrderBaseService.cancel(ids, null, true)) { + LogUtil.error(String.format(I18nUtil._("order_id : %s 取消出错"), order_id)); + } + } catch (Exception e) { + LogUtil.error(String.format(I18nUtil._("order_id : %s 取消出错"), order_id), e); } - } catch (Exception e) { - LogUtil.error(String.format(I18nUtil._("order_id : %s 取消出错"), order_id), e); } } } + // 自动确认收货 + //shopOrderBaseService.autoReceive(); - // 自动确认收货 - //shopOrderBaseService.autoReceive(); - - - // 2. 更新为确认收货 - List order_id_receipt = shopOrderInfoService.getAutoFinishOrderId(); - if (CollUtil.isNotEmpty(order_id_receipt)) { - for (String order_id : order_id_receipt) { - try { - if (!shopOrderBaseService.receive(order_id, null)) { - LogUtil.error(String.format(I18nUtil._("order_id : %s 确认收货出错"), order_id)); + // 2. 更新为确认收货 + List order_id_receipt = shopOrderInfoService.getAutoFinishOrderId(); + if (CollUtil.isNotEmpty(order_id_receipt)) { + for (String order_id : order_id_receipt) { + try { + if (!shopOrderBaseService.receive(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); } - } catch (Exception e) { - LogUtil.error(String.format(I18nUtil._("order_id : %s 确认收货出错"), order_id), e); } } - } - // 3.分销结算 - List order_id_settle_commission = shopOrderBaseService.getWaitingSettleCommissionOrder(null, null); - if (CollUtil.isNotEmpty(order_id_settle_commission)) { - for (String order_id : order_id_settle_commission) { - try { - if (!shopDistributionUserOrderService.settleDistributionUserOrder(order_id)) { - LogUtil.error(String.format(I18nUtil._("order_id : %s 确认佣金结算出错"), order_id)); + // 3.分销结算 + List order_id_settle_commission = shopOrderBaseService.getWaitingSettleCommissionOrder(null, null); + if (CollUtil.isNotEmpty(order_id_settle_commission)) { + for (String order_id : order_id_settle_commission) { + try { + if (!shopDistributionUserOrderService.settleDistributionUserOrder(order_id)) { + LogUtil.error(String.format(I18nUtil._("order_id : %s 确认佣金结算出错"), order_id)); + } + } catch (Exception e) { + LogUtil.error(String.format(I18nUtil._("order_id : %s 确认佣金结算出错"), order_id), e); + } } - } catch (Exception e) { - LogUtil.error(String.format(I18nUtil._("order_id : %s 确认佣金结算出错"), order_id), e); } } - } - } - -} +} \ No newline at end of file diff --git a/mall-shop/src/main/java/com/suisung/mall/shop/order/service/ShopOrderInfoService.java b/mall-shop/src/main/java/com/suisung/mall/shop/order/service/ShopOrderInfoService.java index c0488662..ca98676e 100644 --- a/mall-shop/src/main/java/com/suisung/mall/shop/order/service/ShopOrderInfoService.java +++ b/mall-shop/src/main/java/com/suisung/mall/shop/order/service/ShopOrderInfoService.java @@ -89,4 +89,17 @@ public interface ShopOrderInfoService extends IBaseService { */ Boolean updateOrderReceived(String orderId); + /** + * 分页查询取消订单 + * @param pageNum + * @param pageSize + * @return + */ + List getAutoCancelOrderIdByPage(Integer pageNum, Integer pageSize); + + /** + * 查询取消订单总数 + * @return + */ + long countgetAutoCancelOrderId(); } 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 c4b620c4..a10f925d 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 @@ -56,6 +56,7 @@ import java.math.BigDecimal; import java.util.*; import java.util.concurrent.CompletableFuture; import java.util.concurrent.ThreadPoolExecutor; +import java.util.stream.Collectors; import static com.suisung.mall.common.utils.ContextUtil.getCurrentUser; @@ -180,6 +181,9 @@ public class ShopOrderInfoServiceImpl extends BaseServiceImpl getAutoCancelOrderIdByPage(Integer pageNum, Integer pageSize) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.select("order_id","order_state_id"); + queryWrapper.eq("order_state_id", StateCode.ORDER_STATE_WAIT_PAY) + .eq("order_is_paid", StateCode.ORDER_PAID_STATE_NO) + .eq("payment_type_id", StateCode.PAYMENT_TYPE_ONLINE); + + Float order_autocancel_time = accountBaseConfigService.getConfig("order_autocancel_time", 0.5f); + int second = NumberUtil.mul(order_autocancel_time, 60, 60).intValue(); + long time = DateUtil.offsetSecond(new Date(), -second).getTime(); + queryWrapper.lt("order_time", time); + List shopOrderInfos=this.lists(queryWrapper,pageNum,pageSize).getRecords(); + return shopOrderInfos.stream().map(ShopOrderInfo::getOrder_id).collect(Collectors.toList()); + } + + @Override + public long countgetAutoCancelOrderId() { + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("order_state_id", StateCode.ORDER_STATE_WAIT_PAY) + .eq("order_is_paid", StateCode.ORDER_PAID_STATE_NO) + .eq("payment_type_id", StateCode.PAYMENT_TYPE_ONLINE); + + Float order_autocancel_time = accountBaseConfigService.getConfig("order_autocancel_time", 0.5f); + int second = NumberUtil.mul(order_autocancel_time, 60, 60).intValue(); + long time = DateUtil.offsetSecond(new Date(), -second).getTime(); + queryWrapper.lt("order_time", time); + return this.count(queryWrapper); + } + + } From aeb3c0d029197a7630806d5857707bb2eed4d797 Mon Sep 17 00:00:00 2001 From: liyj <1617420630@qq.com> Date: Tue, 21 Oct 2025 15:15:09 +0800 Subject: [PATCH 20/23] =?UTF-8?q?=E6=80=9D=E8=BF=85=E5=90=8C=E6=AD=A5?= =?UTF-8?q?=E5=BA=93=E5=AD=98=E9=97=AE=E9=A2=98=E4=BF=AE=E6=94=B9=EF=BC=8C?= =?UTF-8?q?=E6=96=B0=E5=A2=9E=E5=8F=96=E6=B6=88=E8=AE=A2=E5=8D=95=E5=92=8C?= =?UTF-8?q?=E5=95=86=E5=AE=B6=E5=90=8C=E6=84=8F=E9=80=80=E8=B4=A7=E6=97=B6?= =?UTF-8?q?=E8=A7=A6=E5=8F=91=E5=BA=93=E5=AD=98=E5=9B=9E=E9=80=80=E5=88=B0?= =?UTF-8?q?=E6=80=9D=E8=BF=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/impl/ShopOrderReturnServiceImpl.java | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/mall-shop/src/main/java/com/suisung/mall/shop/order/service/impl/ShopOrderReturnServiceImpl.java b/mall-shop/src/main/java/com/suisung/mall/shop/order/service/impl/ShopOrderReturnServiceImpl.java index 0c6b99d3..6a23db36 100644 --- a/mall-shop/src/main/java/com/suisung/mall/shop/order/service/impl/ShopOrderReturnServiceImpl.java +++ b/mall-shop/src/main/java/com/suisung/mall/shop/order/service/impl/ShopOrderReturnServiceImpl.java @@ -59,6 +59,7 @@ import com.suisung.mall.shop.sfexpress.service.SFExpressApiService; import com.suisung.mall.shop.store.service.ShopStoreBaseService; import com.suisung.mall.shop.store.service.ShopStoreConfigService; import com.suisung.mall.shop.store.service.ShopStoreShippingAddressService; +import com.suisung.mall.shop.sync.service.SyncThirdDataService; import io.seata.spring.annotation.GlobalTransactional; import lombok.extern.slf4j.Slf4j; import org.slf4j.Logger; @@ -204,6 +205,9 @@ public class ShopOrderReturnServiceImpl extends BaseServiceImpl> statisticState() { UserDto user = getCurrentUser(); @@ -1510,6 +1514,13 @@ public class ShopOrderReturnServiceImpl extends BaseServiceImpl stockDeltaMap = new HashMap<>(); + String item_src_id= productItem.getItem_src_id(); + stockDeltaMap.put(item_src_id + "-" + shopOrderItem.getOrder_id(), returnNum); + syncThirdDataService.incrProductStockToRedis(stockDeltaMap); + logger.info("退货返回给思迅,存入redis成功,item_src_id:{},订单号:{},数量:{}",item_src_id,shopOrderReturn.getOrder_id(),returnNum); } else { logger.warn("退货数量为空,无法增加库存,订单项ID: {}", orderItemId); } From 2b03dee62dfbf3573cba4de7e5daadf3aa4542e2 Mon Sep 17 00:00:00 2001 From: Jack <46790855@qq.com> Date: Tue, 21 Oct 2025 16:27:24 +0800 Subject: [PATCH 21/23] =?UTF-8?q?order=20info=20=E5=A2=9E=E5=8A=A0?= =?UTF-8?q?=E9=A2=84=E7=BA=A6=E4=B8=8B=E5=8D=95=E7=9A=84=E7=9B=B8=E5=85=B3?= =?UTF-8?q?=E4=B8=89=E5=AD=97=E6=AE=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/modules/order/ShopOrderInfo.java | 11 +- .../service/impl/LakalaApiServiceImpl.java | 152 +++++++++--------- .../order/listener/OrderPayedListener.java | 15 +- .../mapper/order/ShopOrderInfoMapper.xml | 3 +- 4 files changed, 99 insertions(+), 82 deletions(-) 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 0b5ab844..5fe5661b 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 @@ -75,7 +75,7 @@ public class ShopOrderInfo implements Serializable { @ApiModelProperty(value = "下单时间:检索使用") private Long order_time; - @ApiModelProperty(value = "当前状态的处理时间") + @ApiModelProperty(value = "当前状态的处理时间,一般是确认收货时间") private Long order_deal_time; @ApiModelProperty(value = "买家删除(BOOL): 1-是; 0-否") @@ -204,6 +204,15 @@ public class ShopOrderInfo implements Serializable { @ApiModelProperty(value = "拣货完成时间戳") private Long order_picked_time; + @ApiModelProperty(value = "订单配送预约状态:1-立即配送;2-预约配送") + private Integer booking_state; + + @ApiModelProperty(value = "预约送达起始时间,格式如:10:15") + private String booking_begin_time; + + @ApiModelProperty(value = "预约送达截止时间,格式如:10:45") + private String booking_end_time; + @ApiModelProperty(value = "新建时间") private Date created_at; diff --git a/mall-shop/src/main/java/com/suisung/mall/shop/lakala/service/impl/LakalaApiServiceImpl.java b/mall-shop/src/main/java/com/suisung/mall/shop/lakala/service/impl/LakalaApiServiceImpl.java index dffb287d..ba7fe700 100644 --- a/mall-shop/src/main/java/com/suisung/mall/shop/lakala/service/impl/LakalaApiServiceImpl.java +++ b/mall-shop/src/main/java/com/suisung/mall/shop/lakala/service/impl/LakalaApiServiceImpl.java @@ -3050,9 +3050,9 @@ public class LakalaApiServiceImpl implements LakalaApiService { public Integer fixUnSuccessSeparateStatusJob() { log.info("[分账状态修复任务] 开始执行未成功分账记录的状态修复任务"); - // 获取2天前分账状态未成功的记录 - Date now = new Date(); - Date threeDaysAgo = DateUtils.addHours(now, -48); + // 获取3天前分账状态未成功的记录 + Date endDate = new Date(); + Date beginDate = DateUtils.addDays(endDate, -3); // 3天前 // 分页参数 int pageSize = 200; @@ -3062,100 +3062,104 @@ public class LakalaApiServiceImpl implements LakalaApiService { // 记录处理开始时间 long startTime = System.currentTimeMillis(); + String redisPrefKey = "lkl:separate:status:retry:"; - List lklOrderSeparates; - do { - // 分页获取未成功分账的记录 - lklOrderSeparates = lklOrderSeparateService.getUnSuccessSeparateList(threeDaysAgo, now, currentPage, pageSize); + try { + List lklOrderSeparates; + do { + // 分页获取未成功分账的记录 + lklOrderSeparates = lklOrderSeparateService.getUnSuccessSeparateList(beginDate, endDate, currentPage, pageSize); - if (CollectionUtil.isEmpty(lklOrderSeparates)) { - break; - } - - log.info("[分账状态修复任务] 获取到第{}页数据,共{}条记录", currentPage, lklOrderSeparates.size()); - - String redisPrefKey = "lkl:separate:status:retry:"; - - // 按处理次数排序,从未处理过的记录优先处理,处理次数越多优先级越低 - lklOrderSeparates.sort((o1, o2) -> { - String redisKey1 = redisPrefKey + o1.getSeparate_no(); - String redisKey2 = redisPrefKey + o2.getSeparate_no(); - - int retryCount1 = Convert.toInt(redisService.get(redisKey1), 0); - int retryCount2 = Convert.toInt(redisService.get(redisKey2), 0); - - return Integer.compare(retryCount1, retryCount2); - }); - - // 处理当前页中的记录 - for (LklOrderSeparate record : lklOrderSeparates) { - // 检查该记录的处理次数是否已达到上限(5次) - String redisKey = redisPrefKey + record.getSeparate_no(); - int retryCount = Convert.toInt(redisService.get(redisKey), 0); - - if (retryCount >= 5) { - log.warn("[分账状态修复任务] 记录已达到最大重试次数,跳过处理: merchantNo={}, separateNo={}", - record.getMerchant_no(), record.getSeparate_no()); - continue; + if (CollectionUtil.isEmpty(lklOrderSeparates)) { + break; } - totalProcessed++; - // 每处理10条记录才输出一次详细日志,减少日志量 - if (totalProcessed % 10 == 1) { - log.info("[分账状态修复任务] 正在处理第 {} 条记录: merchantNo={}, separateNo={}, 已重试{}次", - totalProcessed, record.getMerchant_no(), record.getSeparate_no(), retryCount); - } + log.info("[分账状态修复任务] 获取到第{}页数据,共{}条记录", currentPage, lklOrderSeparates.size()); - try { - // 增加处理次数计数并设置3天过期时间 - redisService.incr(redisKey, 1); - redisService.expire(redisKey, 3 * 24 * 60 * 60); + // 按处理次数排序,从未处理过的记录优先处理,处理次数越多优先级越低 + lklOrderSeparates.sort((o1, o2) -> { + String redisKey1 = redisPrefKey + o1.getSeparate_no(); + String redisKey2 = redisPrefKey + o2.getSeparate_no(); - // 调用分账通知回调接口进行状态补偿 - JSONObject notifyResp = sacsSeparateNotify(null, record.getMerchant_no(), record.getSeparate_no()); + int retryCount1 = Convert.toInt(redisService.get(redisKey1), 0); + int retryCount2 = Convert.toInt(redisService.get(redisKey2), 0); - // 检查处理结果 - if (notifyResp != null && "SUCCESS".equals(notifyResp.getStr("code"))) { - totalSuccessCount++; - log.debug("[分账状态修复任务] 记录处理成功: merchantNo={}, separateNo={}", + return Integer.compare(retryCount1, retryCount2); + }); + + // 处理当前页中的记录 + for (LklOrderSeparate record : lklOrderSeparates) { + // 检查该记录的处理次数是否已达到上限(5次) + String redisKey = redisPrefKey + record.getSeparate_no(); + int retryCount = Convert.toInt(redisService.get(redisKey), 0); + + if (retryCount >= 5) { + log.warn("[分账状态修复任务] 记录已达到最大重试次数,跳过处理: merchantNo={}, separateNo={}", record.getMerchant_no(), record.getSeparate_no()); - } else { - String errorMsg = notifyResp != null ? notifyResp.getStr("message") : "未知错误"; - log.warn("[分账状态修复任务] 记录处理失败: merchantNo={}, separateNo={}, errorMsg={}", - record.getMerchant_no(), record.getSeparate_no(), errorMsg); + continue; + } + + totalProcessed++; + // 每处理10条记录才输出一次详细日志,减少日志量 + if (totalProcessed % 10 == 1) { + log.info("[分账状态修复任务] 正在处理第 {} 条记录: merchantNo={}, separateNo={}, 已重试{}次", + totalProcessed, record.getMerchant_no(), record.getSeparate_no(), retryCount); + } + + try { + // 增加处理次数计数并设置3天过期时间 + redisService.incr(redisKey, 1); + redisService.expire(redisKey, 3 * 24 * 60 * 60); + + // 调用拉卡拉分账通知回调接口进行状态补偿 + JSONObject notifyResp = sacsSeparateNotify(null, record.getMerchant_no(), record.getSeparate_no()); + + // 检查处理结果 + if (notifyResp != null && "SUCCESS".equals(notifyResp.getStr("code"))) { + totalSuccessCount++; + log.debug("[分账状态修复任务] 记录处理成功: merchantNo={}, separateNo={}", + record.getMerchant_no(), record.getSeparate_no()); + } else { + String errorMsg = notifyResp != null ? notifyResp.getStr("message") : "未知错误"; + log.warn("[分账状态修复任务] 记录处理失败: merchantNo={}, separateNo={}, errorMsg={}", + record.getMerchant_no(), record.getSeparate_no(), errorMsg); + } + } catch (Exception e) { + log.error("[分账状态修复任务] 处理记录时发生异常: merchantNo={}, separateNo={}", + record.getMerchant_no(), record.getSeparate_no(), e); } - } catch (Exception e) { - log.error("[分账状态修复任务] 处理记录时发生异常: merchantNo={}, separateNo={}", - record.getMerchant_no(), record.getSeparate_no(), e); } - } - log.info("[分账状态修复任务] 第{}页处理完成,已处理 {} 条记录,总成功 {} 条", - currentPage, totalProcessed, totalSuccessCount); + log.info("[分账状态修复任务] 第{}页处理完成,已处理 {} 条记录,总成功 {} 条", + currentPage, totalProcessed, totalSuccessCount); - // 如果当前页数据少于页面大小,说明已经是最后一页 - if (lklOrderSeparates.size() < pageSize) { - break; - } + // 如果当前页数据少于页面大小,说明已经是最后一页 + if (lklOrderSeparates.size() < pageSize) { + break; + } - currentPage++; + currentPage++; - // 添加短暂延迟,避免对系统造成过大压力 - try { + // 添加短暂延迟,避免对系统造成过大压力 Thread.sleep(100); - } catch (InterruptedException e) { - Thread.currentThread().interrupt(); - break; - } - } while (!CollectionUtil.isEmpty(lklOrderSeparates)); + } while (!CollectionUtil.isEmpty(lklOrderSeparates)); + + } catch (InterruptedException e) { + log.warn("[分账状态修复任务] 任务被中断"); + Thread.currentThread().interrupt(); + } catch (Exception e) { + log.error("[分账状态修复任务] 任务执行过程中发生异常", e); + } long endTime = System.currentTimeMillis(); log.info("[分账状态修复任务] 任务执行完成,总共处理 {} 条记录,成功处理 {} 条记录,耗时 {} ms", totalProcessed, totalSuccessCount, (endTime - startTime)); + return totalSuccessCount; } + /** * 检测修复补全商户的商户分账业务信息及分账接收方绑定关系(分账业务申请异步通知的补偿机制) * 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 a506e727..6cbbe8dc 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 @@ -9,6 +9,7 @@ import com.suisung.mall.common.constant.CommonConstant; import com.suisung.mall.common.constant.MqConstant; import com.suisung.mall.common.constant.RedisConstant; import com.suisung.mall.common.modules.order.ShopOrderInfo; +import com.suisung.mall.common.utils.CheckUtil; import com.suisung.mall.common.utils.DateTimeUtils; import com.suisung.mall.core.web.service.RedisService; import com.suisung.mall.shop.message.service.PushMessageService; @@ -138,10 +139,10 @@ public class OrderPayedListener { } } - logger.info("[订单支付监听] 支付异步通知回调处理结果: {}, 订单ID: {}", flag, orderId); + logger.info("[订单支付监听] 订单ID: {},支付异步通知回调处理是否成功: {} ", flag, orderId); + // 生成取单号和打印小票 if (flag) { - // TODO 以下仅处理下单打印的情况,还需要处理退单打印分支。 // 原始状态 2010-待付款;2011--待订单审核;2013-待财务审核 变成 2020-待配货;2016-已经付款 的时候 // 生成取单号,打票机打印订单,向顺丰同城下单 @@ -152,12 +153,14 @@ public class OrderPayedListener { Long orderPickupNum = shopOrderInfoService.isPaidOrderGenPickNumAndPrint(orderInfoOld.getStore_id(), orderId); // 如果配送方式是 顺丰同城下单 - if (orderInfoOld.getDelivery_type_id() != null && orderInfoOld.getDelivery_type_id().equals(StateCode.DELIVERY_TYPE_SAME_CITY) - && orderPickupNum > 0) { - // 发送顺丰同城快递 + if (CheckUtil.isNotEmpty(orderInfoOld.getDelivery_type_id()) + && orderInfoOld.getDelivery_type_id().equals(StateCode.DELIVERY_TYPE_SAME_CITY) + && CheckUtil.isNotEmpty(orderPickupNum)) { + + // 顺丰同城下单 Pair pairCreateSfOrder = sfExpressApiService.innerCreateSfExpressOrder(orderId, orderPickupNum); if (pairCreateSfOrder == null) { - logger.error("[订单支付监听] 顺丰同城下单失败!pairCreateSfOrder 返回空值. 订单ID: {}", orderId); + logger.error("[订单支付监听] 顺丰同城下单失败,无返回值 订单ID: {}", orderId); continue; } diff --git a/mall-shop/src/main/resources/mapper/order/ShopOrderInfoMapper.xml b/mall-shop/src/main/resources/mapper/order/ShopOrderInfoMapper.xml index 11d0ac88..2ebafc3f 100644 --- a/mall-shop/src/main/resources/mapper/order/ShopOrderInfoMapper.xml +++ b/mall-shop/src/main/resources/mapper/order/ShopOrderInfoMapper.xml @@ -11,7 +11,8 @@ order_is_received, chain_id, delivery_type_id, order_is_offline, cart_type_id, order_express_print, activity_id, activity_type_id, salesperson_id, order_is_sync, store_is_selfsupport, store_type, order_erp_id, distributor_user_id, order_is_cb, order_is_cb_sync, src_order_id, order_is_transfer, order_is_transfer_note, - order_fx_is_settlemented, order_fx_settlement_time, order_pickup_num,order_picked_notice_count,order_picked_time + order_fx_is_settlemented, order_fx_settlement_time, order_pickup_num,order_picked_notice_count,order_picked_time, + booking_state, booking_begin_time, booking_end_time,created_at, updated_at