购物车,直接下单 打包费 fix bug

This commit is contained in:
Jack 2025-08-16 17:36:06 +08:00
parent 147793f4d4
commit 655f71abfd
6 changed files with 1034 additions and 870 deletions

View File

@ -1,6 +0,0 @@
package com.suisung.mall.account.RedisKeyManage;
public class RedisKey {
public static final String SINGLEPUSHTOKE="singlePush:toke";
}

View File

@ -1,5 +1,7 @@
package com.suisung.mall.account.service.impl;
import cn.hutool.core.date.DateField;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
@ -51,16 +53,22 @@ public class AccountUserBindGeTuiServiceImpl extends BaseServiceImpl<UserDeviceB
.eq("status", CommonConstant.Enable)
.orderByDesc("id");
boolean isSuccess;
// 查询是否存在记录
AccountUserBindGeTui existAccountUserBindGeTui = findOne(wrapper);
if (existAccountUserBindGeTui == null) {
return add(accountUserBindGeTui);
isSuccess = add(accountUserBindGeTui);
} else {
// 更新记录
accountUserBindGeTui.setId(existAccountUserBindGeTui.getId());
accountUserBindGeTui.setUpdatedAt(new Date());
isSuccess = updateById(accountUserBindGeTui);
}
// 更新记录
accountUserBindGeTui.setId(existAccountUserBindGeTui.getId());
accountUserBindGeTui.setUpdatedAt(new Date());
return this.updateById(accountUserBindGeTui);
// 清理一年未登录的个推绑定记录
clearAccountUserBindGeTui();
return isSuccess;
} catch (Exception e) {
// 捕获异常并记录错误日志
log.error("执行 saveAccountUserBindGeTui 方法时发生异常: {}", e.getMessage(), e);
@ -86,4 +94,28 @@ public class AccountUserBindGeTuiServiceImpl extends BaseServiceImpl<UserDeviceB
if (userId == null || userId <= 0) return Collections.singletonList(new AccountUserBindGeTui());
return list(new QueryWrapper<AccountUserBindGeTui>().eq("user_id", userId).eq("status", CommonConstant.Enable));
}
/**
* 清理一年没有登录的账号推送绑定关系列表
* 异步执行以避免阻塞主线程
*/
private void clearAccountUserBindGeTui() {
// 使用新线程异步执行清理任务
new Thread(() -> {
try {
// 计算一年前的时间
Date oneYearAgo = DateUtil.offset(new Date(), DateField.YEAR, -1);
// 删除一年未更新的记录
boolean result = remove(new QueryWrapper<AccountUserBindGeTui>().lt("updated_at", oneYearAgo));
if (result) {
log.info("成功清理 {} 条一年未登录的个推绑定记录", result);
}
} catch (Exception e) {
// 捕获并记录异常避免影响主线程
log.error("异步清理一年未登录的个推绑定记录时发生异常: {}", e.getMessage(), e);
}
}, "ClearGeTuiBindThread").start();
}
}

View File

@ -52,9 +52,10 @@ import java.util.Map;
@Service
public class SFExpressApiServiceImpl implements SFExpressApiService {
private final static String sfExpressApiDomain = "https://openic.sf-express.com/open/api/external/";
private static final Logger logger = LoggerFactory.getLogger(SFExpressApiServiceImpl.class);
private static final String sfExpressApiDomain = "https://openic.sf-express.com/open/api/external/";
@Value("${sf-express.appid}")
private String appId;
@Value("${sf-express.appkey}")
@ -112,93 +113,100 @@ public class SFExpressApiServiceImpl implements SFExpressApiService {
String longitude, String latitude) {
logger.info("开始创建顺丰同城店铺, storeId: {}", storeId);
// 1. 验证必要参数
if (CheckUtil.isEmpty(storeId) || StringUtils.isAnyBlank(shopName, shopAddress, contactName, contactPhone)) {
return Pair.of(false, "顺丰同城店铺,缺少必要参数!");
}
// 2. 获取或初始化商家配送信息
ShopStoreSameCityTransportBase transportBase = shopStoreSameCityTransportBaseService
.getShopStoreSameCityTransportBaseById(Long.valueOf(storeId));
if (transportBase == null) {
// 如果没有商家配送运费设置则初始化
Pair<Boolean, String> initResult = shopStoreSameCityTransportBaseService.initDefaultSameCityTransport(storeId);
if (!initResult.getFirst()) {
logger.error("初始化商家配送运费设置失败!");
return initResult;
try {
// 1. 验证必要参数
if (CheckUtil.isEmpty(storeId) || StringUtils.isAnyBlank(shopName, shopAddress, contactName, contactPhone)) {
return Pair.of(false, "创建顺丰店铺,缺少必要参数!");
}
transportBase = shopStoreSameCityTransportBaseService.getShopStoreSameCityTransportBaseById(Long.valueOf(storeId));
}
// 3. 如果已存在顺丰店铺ID验证其有效性
if (CheckUtil.isNotEmpty(transportBase.getShop_id())) {
ThirdApiRes shopInfo = getSfShopInfo(transportBase.getShop_id());
if (shopInfo != null && shopInfo.getError_code().equals(0)) {
logger.info("已成功创建顺丰同城店铺!");
return Pair.of(true, transportBase.getShop_id());
// 2. 获取或初始化商家配送信息
ShopStoreSameCityTransportBase transportBase = shopStoreSameCityTransportBaseService
.getShopStoreSameCityTransportBaseById(Long.valueOf(storeId));
if (transportBase == null) {
// 如果没有商家配送运费设置则初始化
Pair<Boolean, String> initResult = shopStoreSameCityTransportBaseService.initDefaultSameCityTransport(storeId);
if (!initResult.getFirst()) {
logger.error("初始化商家配送运费设置失败!");
return initResult;
}
transportBase = shopStoreSameCityTransportBaseService.getShopStoreSameCityTransportBaseById(Long.valueOf(storeId));
}
// 3. 如果已存在顺丰店铺ID验证其有效性
if (CheckUtil.isNotEmpty(transportBase.getShop_id())) {
logger.debug("如果存在店铺Id从顺丰同城平台查询店铺ID开始验证其有效性");
ThirdApiRes shopInfo = getSfShopInfo(transportBase.getShop_id());
if (shopInfo != null && shopInfo.getError_code().equals(0)) {
logger.info("已成功创建顺丰同城店铺!");
return Pair.of(true, transportBase.getShop_id());
}
}
// 4. 构建请求参数
Map<String, Object> params = buildCommonParams();
params.put("supplier_id", supplierId); // 店铺所属商家id
params.put("out_shop_id", storeId); // 外部店铺ID
params.put("shop_name", shopName); // 店铺名称
params.put("city_name", cityName); // 城市名称
// RMK 1:快餐 2:药品 3:百货 4:脏衣服收 5:干净衣服派 6:生鲜 8:高端饮品 9:现场勘验 10:快递 12:文件 13:蛋糕 14:鲜花 15:数码 16:服装 17:
//汽配 18:珠宝 20:披萨 21:中餐 22:水产 27:专人直送 32:中端饮品 33:便利店 34:面包糕点 35:火锅 36:证照 40:烧烤小龙虾 41:外部落地配 47:烟酒
// 48:成人用品 99:其他
// 经营类型: 快餐,百货,生鲜,高端饮品,蛋糕,鲜花,数码,服装,披萨,水产,中端饮品,便利店,面包糕点,烟酒,其他
params.put("shop_product_types", "1,3,6,8,13,14,15,16,20,22,32,33,34,47,99");
params.put("shop_type", 1); // 店铺类型: 1-普通型 2-平台型
params.put("shop_address", shopAddress); // 店铺地址
params.put("longitude", longitude); // 经度
params.put("latitude", latitude); // 纬度
params.put("shop_contact_name", contactName); // 联系人姓名
params.put("shop_contact_phone", contactPhone); // 联系电话
// 5. 发送请求到顺丰接口
String paramJSON = JsonUtil.toJSONString(params);
String sendUrl = buildUrl("createShop", paramJSON);
String responseStr = HttpUtil.post(sendUrl, paramJSON);
if (StrUtil.isBlank(responseStr)) {
logger.error("创建顺丰店铺异常,无返回值!");
return Pair.of(false, "创建顺丰店铺异常,无返回值!");
}
ThirdApiRes apiRes = JSONUtil.toBean(responseStr, ThirdApiRes.class);
if (apiRes == null) {
logger.error("创建顺丰店铺异常,返回值有误!!");
return Pair.of(false, "创建顺丰店铺异常,返回值有误!");
}
// 6. 检查接口调用结果
if (!apiRes.getError_code().equals(0) || apiRes.getResult() == null) {
String errMsg = apiRes.getError_code().equals(0) ? "创建顺丰店铺失败!" : "创建顺丰店铺失败: " + apiRes.getError_msg();
logger.error("创建顺丰店铺失败: {}", errMsg);
return Pair.of(false, errMsg);
}
// 7. 提取顺丰店铺ID并更新数据库
JSONObject result = (JSONObject) apiRes.getResult();
String sfShopId = result.getStr("shop_id");
transportBase.setShop_id(sfShopId);
transportBase.setShop_state(CommonConstant.Enable);// 顺丰同城快递商品特惠
transportBase.setDelivery_brand(CommonConstant.DELIVERY_BRAND_SF);
Pair<Long, String> updateResult = shopStoreSameCityTransportBaseService
.saveOrUpdateShopStoreSameCityTransportBase(transportBase);
if (updateResult.getFirst() <= 0) {
logger.error("更新店铺信息失败");
return Pair.of(false, "更新店铺信息失败");
}
logger.info("成功创建顺丰店铺店铺ID: {}", sfShopId);
return Pair.of(true, sfShopId);
} catch (Exception e) {
logger.error("创建顺丰同城店铺时发生异常: ", e);
return Pair.of(false, "创建顺丰同城店铺时发生异常: " + e.getMessage());
}
// 4. 构建请求参数
Map<String, Object> params = buildCommonParams();
params.put("supplier_id", supplierId); // 店铺所属商家id
params.put("out_shop_id", storeId); // 外部店铺ID
params.put("shop_name", shopName); // 店铺名称
params.put("city_name", cityName); // 城市名称
// RMK 1:快餐 2:药品 3:百货 4:脏衣服收 5:干净衣服派 6:生鲜 8:高端饮品 9:现场勘验 10:快递 12:文件 13:蛋糕 14:鲜花 15:数码 16:服装 17:
//汽配 18:珠宝 20:披萨 21:中餐 22:水产 27:专人直送 32:中端饮品 33:便利店 34:面包糕点 35:火锅 36:证照 40:烧烤小龙虾 41:外部落地配 47:烟酒
// 48:成人用品 99:其他
// 经营类型: 快餐,百货,生鲜,高端饮品,蛋糕,鲜花,数码,服装,披萨,水产,中端饮品,便利店,面包糕点,烟酒,其他
params.put("shop_product_types", "1,3,6,8,13,14,15,16,20,22,32,33,34,47,99");
params.put("shop_type", 1); // 店铺类型: 1-普通型 2-平台型
params.put("shop_address", shopAddress); // 店铺地址
params.put("longitude", longitude); // 经度
params.put("latitude", latitude); // 纬度
params.put("shop_contact_name", contactName); // 联系人姓名
params.put("shop_contact_phone", contactPhone); // 联系电话
// 5. 发送请求到顺丰接口
String paramJSON = JsonUtil.toJSONString(params);
String sendUrl = buildUrl("createShop", paramJSON);
String responseStr = HttpUtil.post(sendUrl, paramJSON);
if (StrUtil.isBlank(responseStr)) {
logger.error("创建顺丰店铺异常,无返回值!");
return Pair.of(false, "创建顺丰店铺异常,无返回值!");
}
ThirdApiRes apiRes = JSONUtil.toBean(responseStr, ThirdApiRes.class);
if (apiRes == null) {
logger.error("创建顺丰店铺异常,返回值有误!!");
return Pair.of(false, "创建顺丰店铺异常,返回值有误!");
}
// 6. 检查接口调用结果
if (!apiRes.getError_code().equals(0) || apiRes.getResult() == null) {
String errMsg = apiRes.getError_code().equals(0) ? "创建顺丰店铺失败!" : "创建顺丰店铺失败: " + apiRes.getError_msg();
logger.error("创建顺丰店铺失败: {}", errMsg);
return Pair.of(false, errMsg);
}
// 7. 提取顺丰店铺ID并更新数据库
JSONObject result = (JSONObject) apiRes.getResult();
String sfShopId = result.getStr("shop_id");
transportBase.setShop_id(sfShopId);
transportBase.setShop_state(CommonConstant.Enable);// 顺丰同城快递商品特惠
transportBase.setDelivery_brand(CommonConstant.DELIVERY_BRAND_SF);
Pair<Long, String> updateResult = shopStoreSameCityTransportBaseService
.saveOrUpdateShopStoreSameCityTransportBase(transportBase);
if (updateResult.getFirst() <= 0) {
logger.error("更新店铺信息失败");
return Pair.of(false, "更新店铺信息失败");
}
logger.info("成功创建顺丰店铺店铺ID: {}", sfShopId);
return Pair.of(true, sfShopId);
}
/**

View File

@ -62,6 +62,7 @@ import com.suisung.mall.shop.plantform.service.ShopPlantformSubsiteService;
import com.suisung.mall.shop.product.mapper.ShopProductIndexMapper;
import com.suisung.mall.shop.product.service.ShopProductBaseService;
import com.suisung.mall.shop.product.service.ShopProductIndexService;
import com.suisung.mall.shop.sfexpress.service.SFExpressApiService;
import com.suisung.mall.shop.store.mapper.ShopStoreBaseMapper;
import com.suisung.mall.shop.store.service.*;
import com.suisung.mall.shop.user.service.ShopUserFavoritesStoreService;
@ -107,6 +108,7 @@ public class ShopStoreBaseServiceImpl extends BaseServiceImpl<ShopStoreBaseMappe
private static final Logger logger = LoggerFactory.getLogger(ShopStoreBaseServiceImpl.class);
private static List<Map> StoreFilterOptData;
@Autowired
private ShopPlantformSubsiteService shopPlantformSubsiteService;
@Autowired
@ -184,6 +186,10 @@ public class ShopStoreBaseServiceImpl extends BaseServiceImpl<ShopStoreBaseMappe
@Autowired
private BaiduMapServiceImpl baiduMapService;
@Lazy
@Autowired
private SFExpressApiService sfExpressApiService;
@Lazy
@Autowired
private WxQrCodeService wxQrCodeService;
@ -3204,7 +3210,7 @@ public class ShopStoreBaseServiceImpl extends BaseServiceImpl<ShopStoreBaseMappe
// 联系人
shopStoreCompany.setContacts_name(shopMchEntry.getContact_name());
shopStoreCompany.setContacts_phone(shopMchEntry.getLogin_mobile());
shopStoreCompany.setContacts_phone(contact_mobile);
// 公司名
String companyName = StrUtil.isBlank(shopMchEntry.getBiz_license_company()) ? shopMchEntry.getStore_name() : shopMchEntry.getBiz_license_company();
@ -3282,7 +3288,12 @@ public class ShopStoreBaseServiceImpl extends BaseServiceImpl<ShopStoreBaseMappe
shopMchEntryService.updateMerchEntryStoreId(shopMchEntry.getId(), storeId);
// 初始化同城配送默认设置
storeSameCityTransportBaseService.initDefaultSameCityTransport(storeId);
// storeSameCityTransportBaseService.initDefaultSameCityTransport(storeId);
// 立即创建顺丰店铺附带初始化同城配送默认设置
String[] areaNames = StrUtil.isNotBlank(shopStoreBase.getStore_area()) ? shopStoreBase.getStore_area().split("/") : new String[0];
String cityName = areaNames.length >= 2 ? areaNames[1] : shopStoreBase.getStore_area().replace("/", "");
sfExpressApiService.createSfExpressShop(storeId, shopStoreBase.getStore_name(), cityName, shopStoreBase.getStore_address(), shopMchEntry.getContact_name(), contact_mobile, shopStoreBase.getStore_longitude(), shopStoreBase.getStore_longitude());
return Pair.of(storeId, "新增成功");
} catch (Exception e) {

View File

@ -126,9 +126,9 @@ public interface ShopUserCartService extends IBaseService<ShopUserCart> {
* 5根据选择计算订单信息将上一步权限验证并将结果计入数据中, 店铺商品总价 = 加价购商品总价 + 购物车非活动商品总价按照限时折扣和团购价计算
* 6
*
* @param cart_rows 购物车数据
* @param cartItems 购物车数据
*/
Map formatCartRows(List<Map> cart_rows, Map activity_rows, ProductVo productVo, FixOrderVo fixOrderVo);
Map formatCartRows(List<Map> cartItems, Map activityData, ProductVo productVo, FixOrderVo fixOrderVo);
/**
* 尝试去操作配送区域判断及运费, 并修正最终数据