顺丰创建内部方法添加

This commit is contained in:
Jack 2025-10-22 17:46:51 +08:00
parent 20cab88cf9
commit 42e825c323
6 changed files with 159 additions and 26 deletions

View File

@ -173,7 +173,7 @@ public class OrderPayedListener {
} }
// 处理异常不抛出以免影响到主流程 // 发送过推送消息处理异常不抛出以免影响到主流程
try { try {
// 检查是否已发送过推送消息幂等性检查 // 检查是否已发送过推送消息幂等性检查
String pushFlagKey = RedisConstant.New_Order_Push_Flag_Key + orderId; String pushFlagKey = RedisConstant.New_Order_Push_Flag_Key + orderId;

View File

@ -440,7 +440,7 @@ public class ShopOrderInfoServiceImpl extends BaseServiceImpl<ShopOrderInfoMappe
} }
Integer times = orderInfo.getOrder_picked_notice_count() == null ? 0 : orderInfo.getOrder_picked_notice_count(); Integer times = orderInfo.getOrder_picked_notice_count() == null ? 0 : orderInfo.getOrder_picked_notice_count();
if (times > 3) { if (times > 5) {
return CommonResult.success("已通知配送人员,请稍候"); return CommonResult.success("已通知配送人员,请稍候");
} }
@ -827,45 +827,55 @@ public class ShopOrderInfoServiceImpl extends BaseServiceImpl<ShopOrderInfoMappe
* @param bookingState 预约配送状态 * @param bookingState 预约配送状态
* @param bookingBeginTimeStr 预约开始时间 * @param bookingBeginTimeStr 预约开始时间
* @param bookingEndTimeStr 预约截止时间 * @param bookingEndTimeStr 预约截止时间
* @return * @return 验证结果Pair第一个元素表示是否通过验证第二个元素为提示信息
*/ */
@Override @Override
public Pair<Boolean, String> checkBookingOrderArgs(Integer storeId, Integer bookingState, String bookingBeginTimeStr, String bookingEndTimeStr) { public Pair<Boolean, String> checkBookingOrderArgs(Integer storeId, Integer bookingState, String bookingBeginTimeStr, String bookingEndTimeStr) {
// 1. 必填参数检查
if (CheckUtil.isEmpty(storeId) || CheckUtil.isEmpty(bookingState)) { if (CheckUtil.isEmpty(storeId) || CheckUtil.isEmpty(bookingState)) {
return Pair.of(false, "[预约订单校验] 缺少必要参数"); return Pair.of(false, "[预约订单校验] 缺少必要参数");
} }
// 2. 预约状态检查
if (!CommonConstant.Order_Booking_State_YY.equals(bookingState)) { if (!CommonConstant.Order_Booking_State_YY.equals(bookingState)) {
return Pair.of(true, "[预约订单校验] 非预订单,跳过验证"); return Pair.of(true, "[预约订单校验] 非预订单,跳过验证");
} }
// 3. 时间格式检查
if (StrUtil.hasBlank(bookingBeginTimeStr, bookingEndTimeStr)) { if (StrUtil.hasBlank(bookingBeginTimeStr, bookingEndTimeStr)) {
return Pair.of(false, "[预约订单校验] 预约时间不能为空"); return Pair.of(false, "[预约订单校验] 预约时间不能为空");
} }
Date bookingBeginTime = DateTimeUtils.tryParseDateTimeToDate(bookingBeginTimeStr); Date bookingBeginTime = DateTimeUtils.tryParseDateTimeToDate(bookingBeginTimeStr);
Date bookingEndTime = DateTimeUtils.tryParseDateTimeToDate(bookingEndTimeStr); Date bookingEndTime = DateTimeUtils.tryParseDateTimeToDate(bookingEndTimeStr);
if (bookingBeginTime == null || bookingBeginTime == null) { if (bookingBeginTime == null || bookingEndTime == null) {
return Pair.of(false, "[预约订单校验] 预约时间格式有误"); return Pair.of(false, "[预约订单校验] 预约时间格式有误");
} }
// 验证开始时间是否早于结束时间 // 4. 时间逻辑检查 - 开始时间不能晚于结束时间
if (bookingBeginTime.after(bookingEndTime)) { if (bookingBeginTime.after(bookingEndTime)) {
return Pair.of(false, "[预约订单校验] 开始时间不能晚于截止时间"); return Pair.of(false, "[预约订单校验] 开始时间不能晚于截止时间");
} }
// 判断预约订单开始时间是否在店铺的营业时间段里 // 5. 店铺信息检查
ShopStoreInfo shopStoreInfo = shopStoreInfoService.getShopStoreInfoByStoreId(storeId); ShopStoreInfo shopStoreInfo = shopStoreInfoService.getShopStoreInfoByStoreId(storeId);
if (shopStoreInfo == null) { if (shopStoreInfo == null) {
return Pair.of(false, "[预约订单校验] 店铺信息有误"); return Pair.of(false, "[预约订单校验] 店铺信息有误");
} }
if (StrUtil.isBlank(shopStoreInfo.getStore_opening_hours()) || StrUtil.isBlank(shopStoreInfo.getStore_close_hours())) { if (StrUtil.isBlank(shopStoreInfo.getStore_opening_hours()) || StrUtil.isBlank(shopStoreInfo.getStore_close_hours())) {
return Pair.of(false, "[预约订单校验] 店铺营业时间未设置"); return Pair.of(false, "[预约订单校验] 店铺营业时间未设置,请联系商家");
} }
// 6. 店铺营业时间检查
if (!DateTimeUtils.isTimeInRange(shopStoreInfo.getStore_opening_hours(), shopStoreInfo.getStore_close_hours(), bookingBeginTime)) { if (!DateTimeUtils.isTimeInRange(shopStoreInfo.getStore_opening_hours(), shopStoreInfo.getStore_close_hours(), bookingBeginTime)) {
return Pair.of(false, "[预约订单校验] 预约时间不在店铺营业时间内"); return Pair.of(false, "[预约订单校验] 请在店铺营业时间内预约下单");
}
// 7. 预约时间范围检查 - 仅能预约45分钟后的订单
Date fortyFiveMinutesLater = DateUtil.offsetMinute(new Date(), 45);
if (!bookingBeginTime.after(fortyFiveMinutesLater)) {
return Pair.of(false, "[预约订单校验] 仅能预约45分后的订单");
} }
return Pair.of(true, "[预约订单校验] 成功"); return Pair.of(true, "[预约订单校验] 成功");

View File

@ -33,7 +33,7 @@ public class SFExpressAdminController {
@ApiOperation(value = "创建顺丰同城店铺", notes = "创建顺丰同城店铺") @ApiOperation(value = "创建顺丰同城店铺", notes = "创建顺丰同城店铺")
@RequestMapping(value = "/create-shop", method = RequestMethod.POST) @RequestMapping(value = "/create-shop", method = RequestMethod.POST)
public CommonResult createSfExpressShopNotify(@RequestBody JSONObject requestBody) { public CommonResult createSfExpressShop(@RequestBody JSONObject requestBody) {
Pair<Boolean, String> result = sfExpressApiService.createSfExpressShop(requestBody.getLong("mch_id"), requestBody.getInt("store_id")); Pair<Boolean, String> result = sfExpressApiService.createSfExpressShop(requestBody.getLong("mch_id"), requestBody.getInt("store_id"));
if (result.getFirst()) { if (result.getFirst()) {
Map<String, Object> data = new HashMap<>(); Map<String, Object> data = new HashMap<>();
@ -42,4 +42,26 @@ public class SFExpressAdminController {
} }
return CommonResult.failed(result.getSecond()); return CommonResult.failed(result.getSecond());
} }
@ApiOperation(value = "创建顺丰同城店铺", notes = "创建顺丰同城店铺")
@RequestMapping(value = "/create-shop-inner", method = RequestMethod.POST)
public CommonResult createSfExpressShopNotify(@RequestBody JSONObject requestBody) {
Pair<Boolean, String> result = sfExpressApiService.createSfExpressShopInner(
requestBody.getInt("store_id"),
requestBody.getStr("shop_name"),
requestBody.getStr("city_name"),
requestBody.getStr("shop_address"),
requestBody.getStr("contact_name"),
requestBody.getStr("contact_phone"),
requestBody.getStr("longitude"),
requestBody.getStr("latitude")
);
if (result.getFirst()) {
Map<String, Object> data = new HashMap<>();
data.put("shop_id", result.getSecond());
return CommonResult.success(data, "创建成功!");
}
return CommonResult.failed(result.getSecond());
}
} }

View File

@ -42,6 +42,23 @@ public interface SFExpressApiService {
Pair<Boolean, String> createSfExpressShop(Integer storeId, String shopName, String cityName, String shopAddress, String contactName, String contactPhone, String longitude, String latitude); Pair<Boolean, String> createSfExpressShop(Integer storeId, String shopName, String cityName, String shopAddress, String contactName, String contactPhone, String longitude, String latitude);
/**
* 创建顺丰同城普通型店铺直调顺丰同城的接口脱离我们的业务
*
* @param storeId 商家门店ID
* @param shopName 店名
* @param cityName 城市
* @param shopAddress 店铺详细地址
* @param contactName 店铺联系人
* @param contactPhone 店铺电话
* @param longitude 经度
* @param latitude 纬度
* @return Pair<Boolean, String> 第一个元素表示是否成功第二个元素表示结果信息或错误信息
*/
Pair<Boolean, String> createSfExpressShopInner(Integer storeId, String shopName, String cityName,
String shopAddress, String contactName, String contactPhone,
String longitude, String latitude);
/** /**
* 创建顺丰同城店铺-连锁店铺回调 * 创建顺丰同城店铺-连锁店铺回调
* *
@ -190,13 +207,15 @@ public interface SFExpressApiService {
/** /**
* 商家自行配送发货 * 商家自行配送发货
*
* @param orderId * @param orderId
* @return * @return
*/ */
CommonResult selDelivery( String orderId); CommonResult selDelivery(String orderId);
/** /**
* 商家手动完成订单 * 商家手动完成订单
*
* @param shopOrderId * @param shopOrderId
* @return * @return
*/ */

View File

@ -339,6 +339,85 @@ public class SFExpressApiServiceImpl implements SFExpressApiService {
} }
} }
/**
* 创建顺丰同城普通型店铺直调顺丰同城的接口脱离我们的业务
*
* @param storeId 商家门店ID
* @param shopName 店名
* @param cityName 城市
* @param shopAddress 店铺详细地址
* @param contactName 店铺联系人
* @param contactPhone 店铺电话
* @param longitude 经度
* @param latitude 纬度
* @return Pair<Boolean, String> 第一个元素表示是否成功第二个元素表示结果信息或错误信息
*/
@Override
public Pair<Boolean, String> createSfExpressShopInner(Integer storeId, String shopName, String cityName,
String shopAddress, String contactName, String contactPhone,
String longitude, String latitude) {
logger.info("开始创建顺丰同城店铺, storeId: {}", storeId);
try {
// 1. 验证必要参数
if (CheckUtil.isEmpty(storeId) || StringUtils.isAnyBlank(shopName, shopAddress, contactName, contactPhone)) {
logger.error("创建顺丰店铺缺少必要参数storeId:{},shopName:{},shopAddress:{},contactName:{},contactPhone:{}", storeId, shopName, shopAddress, contactName, contactPhone);
return Pair.of(false, "创建顺丰店铺,缺少必要参数!");
}
// 4. 构建请求参数
Map<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); // 城市名称
params.put("shop_product_types", "33"); // 33:便利店
params.put("shop_type", 1); // 店铺类型: 1-普通型 2-平台型
params.put("shop_address", shopAddress); // 店铺地址
params.put("longitude", longitude); // 经度
params.put("latitude", latitude); // 纬度
params.put("shop_contact_name", contactName); // 联系人姓名
params.put("shop_contact_phone", contactPhone); // 联系电话
logger.debug("开始创建顺丰店铺,参数:{}", params);
// 5. 发送请求到顺丰接口
String paramJSON = JsonUtil.toJSONString(params);
String sendUrl = buildUrl("createShop", paramJSON);
String responseStr = HttpUtil.post(sendUrl, paramJSON);
logger.debug("创建顺丰店铺结果:{}", responseStr);
if (StrUtil.isBlank(responseStr)) {
logger.error("创建顺丰店铺异常,无返回值!");
return Pair.of(false, "创建顺丰店铺异常,无返回值!");
}
ThirdApiRes apiRes = JSONUtil.toBean(responseStr, ThirdApiRes.class);
if (apiRes == null) {
logger.error("创建顺丰店铺异常,返回值有误!!");
return Pair.of(false, "创建顺丰店铺异常,返回值有误!");
}
// 6. 检查接口调用结果
if (!apiRes.getError_code().equals(0) || apiRes.getResult() == null) {
String errMsg = apiRes.getError_code().equals(0) ? "创建顺丰店铺失败!" : "创建顺丰店铺失败: " + apiRes.getError_msg();
logger.error("创建顺丰店铺失败: {}", errMsg);
return Pair.of(false, errMsg);
}
// 7. 提取顺丰店铺ID并更新数据库
JSONObject result = (JSONObject) apiRes.getResult();
String sfShopId = result.getStr("shop_id");
logger.info("成功创建顺丰店铺店铺ID: {}", sfShopId);
return Pair.of(true, sfShopId);
} catch (Exception e) {
logger.error("创建顺丰同城店铺时发生异常: ", e);
return Pair.of(false, "创建顺丰同城店铺时发生异常: " + e.getMessage());
}
}
/** /**
* 创建顺丰同城店铺异步通知回调 * 创建顺丰同城店铺异步通知回调
* *
@ -1166,17 +1245,18 @@ public class SFExpressApiServiceImpl implements SFExpressApiService {
/** /**
* 自行发货 * 自行发货
*
* @param orderId * @param orderId
* @return * @return
*/ */
@Override @Override
public CommonResult selDelivery(String orderId) { public CommonResult selDelivery(String orderId) {
ShopOrderBase shopOrderBase = checkedOrder(orderId); ShopOrderBase shopOrderBase = checkedOrder(orderId);
if(!shopOrderBase.getOperate_flag().equals("0")){ if (!shopOrderBase.getOperate_flag().equals("0")) {
return CommonResult.failed("该状态不允许发货操作"); return CommonResult.failed("该状态不允许发货操作");
} }
Pair<Boolean, String> pair= wxOrderShippingService.uploadShippingInfoToWx(2,shopOrderBase.getOrder_id()); Pair<Boolean, String> pair = wxOrderShippingService.uploadShippingInfoToWx(2, shopOrderBase.getOrder_id());
if(pair.getFirst()){ if (pair.getFirst()) {
//完成订单后修改订单异常操作流程进入完成订单环节 //完成订单后修改订单异常操作流程进入完成订单环节
shopOrderBase.setOperate_flag("1"); shopOrderBase.setOperate_flag("1");
shopOrderBaseService.updateById(shopOrderBase); shopOrderBaseService.updateById(shopOrderBase);
@ -1185,11 +1265,11 @@ public class SFExpressApiServiceImpl implements SFExpressApiService {
QueryWrapper<ShopOrderItem> itemQueryWrapper = new QueryWrapper<>(); QueryWrapper<ShopOrderItem> itemQueryWrapper = new QueryWrapper<>();
itemQueryWrapper.eq("order_id", orderId); itemQueryWrapper.eq("order_id", orderId);
List<ShopOrderItem> order_item_rows = shopOrderItemService.find(itemQueryWrapper); List<ShopOrderItem> order_item_rows = shopOrderItemService.find(itemQueryWrapper);
if(!order_item_rows.isEmpty()){ if (!order_item_rows.isEmpty()) {
for (ShopOrderItem shopOrderItem : order_item_rows) { for (ShopOrderItem shopOrderItem : order_item_rows) {
Map<String, Integer> stockDeltaMap = new HashMap<>(); Map<String, Integer> stockDeltaMap = new HashMap<>();
String item_src_id= shopOrderItem.getItem_src_id(); String item_src_id = shopOrderItem.getItem_src_id();
Integer order_item_quantity=shopOrderItem.getOrder_item_quantity(); Integer order_item_quantity = shopOrderItem.getOrder_item_quantity();
stockDeltaMap.put(item_src_id + "-" + shopOrderItem.getOrder_id(), -order_item_quantity); stockDeltaMap.put(item_src_id + "-" + shopOrderItem.getOrder_id(), -order_item_quantity);
syncThirdDataService.incrProductStockToRedis(stockDeltaMap); syncThirdDataService.incrProductStockToRedis(stockDeltaMap);
} }
@ -1201,12 +1281,13 @@ public class SFExpressApiServiceImpl implements SFExpressApiService {
/** /**
* 商家自行配送完成订单 * 商家自行配送完成订单
*
* @param shopOrderId * @param shopOrderId
*/ */
public CommonResult selFinishOrder(String shopOrderId) { public CommonResult selFinishOrder(String shopOrderId) {
Integer orderStatus = StateCode.ORDER_STATE_RECEIVED; //已签收 Integer orderStatus = StateCode.ORDER_STATE_RECEIVED; //已签收
ShopOrderBase shopOrderBase = checkedOrder(shopOrderId); ShopOrderBase shopOrderBase = checkedOrder(shopOrderId);
if(!shopOrderBase.getOperate_flag().equals("1")){ if (!shopOrderBase.getOperate_flag().equals("1")) {
return CommonResult.failed("该状态不允许完成订单操作"); return CommonResult.failed("该状态不允许完成订单操作");
} }
// 送达后发出催促微信用户确认收货通知 (同城配送不能调用微信的确认收货) // 送达后发出催促微信用户确认收货通知 (同城配送不能调用微信的确认收货)
@ -1223,27 +1304,28 @@ public class SFExpressApiServiceImpl implements SFExpressApiService {
/** /**
* 校验订单是否正确 * 校验订单是否正确
*
* @param shopOrderId * @param shopOrderId
* @return * @return
*/ */
private ShopOrderBase checkedOrder(String shopOrderId){ private ShopOrderBase checkedOrder(String shopOrderId) {
if(StringUtils.isBlank(shopOrderId)){ if (StringUtils.isBlank(shopOrderId)) {
logger.info("订单号不能为空"); logger.info("订单号不能为空");
throw new ApiException("订单号不能为空"); throw new ApiException("订单号不能为空");
} }
UserDto userDto= ContextUtil.getCurrentUser(); UserDto userDto = ContextUtil.getCurrentUser();
if(userDto==null){ if (userDto == null) {
logger.info("用户不能为空"); logger.info("用户不能为空");
throw new ApiException("用户不能为空"); throw new ApiException("用户不能为空");
} }
if(userDto.getRole_id()!=2){ if (userDto.getRole_id() != 2) {
throw new ApiException("用户无权限"); throw new ApiException("用户无权限");
} }
QueryWrapper<ShopOrderBase> shopOrderBaseQueryWrapper = new QueryWrapper<>(); QueryWrapper<ShopOrderBase> shopOrderBaseQueryWrapper = new QueryWrapper<>();
shopOrderBaseQueryWrapper.eq("order_id", shopOrderId); shopOrderBaseQueryWrapper.eq("order_id", shopOrderId);
shopOrderBaseQueryWrapper.eq("store_id", Integer.valueOf(userDto.getStore_id())); shopOrderBaseQueryWrapper.eq("store_id", Integer.valueOf(userDto.getStore_id()));
List<ShopOrderBase> shopOrderBaseList= shopOrderBaseService.list(shopOrderBaseQueryWrapper); List<ShopOrderBase> shopOrderBaseList = shopOrderBaseService.list(shopOrderBaseQueryWrapper);
if(shopOrderBaseList.isEmpty()){ if (shopOrderBaseList.isEmpty()) {
logger.info("订单号不存在"); logger.info("订单号不存在");
throw new ApiException("订单号不存在"); throw new ApiException("订单号不存在");
} }

View File

@ -184,8 +184,8 @@ feieyun:
sf-express: sf-express:
# 顺丰同城 api 接口配置 # 顺丰同城 api 接口配置
dev_id: 1715091463 dev_id: 1715091463
# 桂平顺丰平台商家id # 桂平顺丰平台商家id 2273453450129
supplier_id: 2273453450129 supplier_id: 2269768012593
appid: 1715091463 appid: 1715091463
appkey: 47466ae69c530f831395e1bc405639fb appkey: 47466ae69c530f831395e1bc405639fb
# dev_id: 1715091463 # dev_id: 1715091463