diff --git a/mall-account/src/main/java/com/suisung/mall/account/service/impl/AccountUserBaseServiceImpl.java b/mall-account/src/main/java/com/suisung/mall/account/service/impl/AccountUserBaseServiceImpl.java index b8d723e3..5fe3f5e1 100644 --- a/mall-account/src/main/java/com/suisung/mall/account/service/impl/AccountUserBaseServiceImpl.java +++ b/mall-account/src/main/java/com/suisung/mall/account/service/impl/AccountUserBaseServiceImpl.java @@ -2994,7 +2994,7 @@ public class AccountUserBaseServiceImpl extends BaseServiceImpl { -// if (ack) { -// String msgId = data.getId(); -// mqMessageService.setMessageStatus(msgId, MqConstant.DELIVERED); -// } else { -// log.error("消息未能发送成功,消息编号:{},失败原因:{}", data.getId(), cause); -// -// String msgId = data.getId(); -// mqMessageService.setMessageStatus(msgId, MqConstant.FAILURE); -// } -// }); -// // 消息投递失败通知 -// rabbitTemplate.setReturnCallback((msg, respCode, respText, exchange, routingKey) -> { -// log.error("交换机抵达队列失败,消息编号:{},状态码:{},失败原因:{},当前交换机:{},当前路由键: {}", msg, respCode, respText, exchange, routingKey); -// String msgId = msg.getMessageProperties().getMessageId(); -// mqMessageService.setMessageStatus(msgId, MqConstant.FAILURE); -// }); -// -// // 配置序列化配置 -// // rabbitTemplate.setMessageConverter(new SimpleMessageConverter()); -// -// Jackson2JsonMessageConverter converter = new Jackson2JsonMessageConverter(); -// converter.setAssumeSupportedContentType(true); -// rabbitTemplate.setMessageConverter(converter); -// -// return rabbitTemplate; -// } - - /** - * 反序列化 + * 配置监听容器工厂 */ @Bean public SimpleRabbitListenerContainerFactory rabbitListenerContainerFactory(ConnectionFactory connectionFactory) { @@ -75,24 +33,6 @@ public class RabbitMqConfig { return new SimpleMessageConverter(); } - // @Bean -// public Jackson2JsonMessageConverter jackson2JsonMessageConverter() { -// return new Jackson2JsonMessageConverter(); -// } - - - /** - * 反序列化 - */ -// @Bean -// public SimpleRabbitListenerContainerFactory rabbitListenerContainerFactory(ConnectionFactory connectionFactory) { -// SimpleRabbitListenerContainerFactory factory = new SimpleRabbitListenerContainerFactory(); -// factory.setConnectionFactory(connectionFactory); -// factory.setMessageConverter(new SimpleMessageConverter()); -// factory.setAcknowledgeMode(AcknowledgeMode.MANUAL); -// return factory; -// } - /** * 默认交换机 * @@ -178,7 +118,6 @@ public class RabbitMqConfig { null); } - /** * 声明延迟交换机 */ @@ -248,5 +187,4 @@ public class RabbitMqConfig { .to(deadLetterExchange()) .with(MqConstant.DEAD_LETTER_ROUTING_KEY); } - } \ No newline at end of file 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 2e269bd1..24cc9c4a 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 @@ -89,6 +89,13 @@ public class OrderPayedListener { int order_state_id = orderInfoOld.getOrder_state_id().intValue(); logger.info("#### 当前订单状态: {} ####", order_state_id); + // 检查订单是否已经处理过(幂等性检查) +// if (isOrderPaid(orderInfoOld)) { +// logger.info("订单已支付,无需重复处理,订单ID: {}", orderId); +// flag = true; +// continue; +// } + if (order_state_id == StateCode.ORDER_STATE_WAIT_PAY) { // 待支付状态 logger.info("#### 待支付业务分支 ####"); @@ -183,5 +190,20 @@ public class OrderPayedListener { } } + /** + * 检查订单是否已经支付(幂等性检查) + * + * @param orderInfo 订单信息 + * @return 是否已支付 + */ + private boolean isOrderPaid(ShopOrderInfo orderInfo) { +// public static final int ORDER_PAID_STATE_NO = 3010; //未付款 +// public static final int ORDER_PAID_STATE_FINANCE_REVIEW = 3011; //待付款审核 +// public static final int ORDER_PAID_STATE_PART = 3012; //部分付款 +// public static final int ORDER_PAID_STATE_YES = 3013; //已付款 + return orderInfo.getOrder_is_paid() != null && + orderInfo.getOrder_is_paid().equals(StateCode.ORDER_PAID_STATE_YES); + } + } diff --git a/mall-shop/src/main/java/com/suisung/mall/shop/sfexpress/controller/admin/SFExpressAdminController.java b/mall-shop/src/main/java/com/suisung/mall/shop/sfexpress/controller/admin/SFExpressAdminController.java new file mode 100644 index 00000000..25009a7a --- /dev/null +++ b/mall-shop/src/main/java/com/suisung/mall/shop/sfexpress/controller/admin/SFExpressAdminController.java @@ -0,0 +1,45 @@ +/* + * Copyright (c) 2024. Lorem ipsum dolor sit amet, consectetur adipiscing elit. + * Morbi non lorem porttitor neque feugiat blandit. Ut vitae ipsum eget quam lacinia accumsan. + * Etiam sed turpis ac ipsum condimentum fringilla. Maecenas magna. + * Proin dapibus sapien vel ante. Aliquam erat volutpat. Pellentesque sagittis ligula eget metus. + * Vestibulum commodo. Ut rhoncus gravida arcu. + */ + +package com.suisung.mall.shop.sfexpress.controller.admin; + +import cn.hutool.json.JSONObject; +import com.suisung.mall.common.api.CommonResult; +import com.suisung.mall.shop.sfexpress.service.SFExpressApiService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.util.Pair; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RestController; + +import java.util.HashMap; +import java.util.Map; + +@Api(tags = "顺丰同城Api端") +@RestController +@RequestMapping("/admin/shop/sf-express") +public class SFExpressAdminController { + + @Autowired + private SFExpressApiService sfExpressApiService; + + @ApiOperation(value = "创建顺丰同城店铺", notes = "创建顺丰同城店铺") + @RequestMapping(value = "/create-shop", method = RequestMethod.POST) + public CommonResult createSfExpressShopNotify(@RequestBody JSONObject requestBody) { + Pair result = sfExpressApiService.createSfExpressShop(requestBody.getLong("mch_id"), requestBody.getInt("store_id")); + if (result.getFirst()) { + Map data = new HashMap<>(); + data.put("shop_id", result.getSecond()); + return CommonResult.success(data, "创建成功!"); + } + return CommonResult.failed(result.getSecond()); + } +} diff --git a/mall-shop/src/main/java/com/suisung/mall/shop/sfexpress/controller/api/SFExpressApiController.java b/mall-shop/src/main/java/com/suisung/mall/shop/sfexpress/controller/api/SFExpressApiController.java index 8f968d8f..ce91a895 100644 --- a/mall-shop/src/main/java/com/suisung/mall/shop/sfexpress/controller/api/SFExpressApiController.java +++ b/mall-shop/src/main/java/com/suisung/mall/shop/sfexpress/controller/api/SFExpressApiController.java @@ -20,7 +20,6 @@ import org.springframework.web.bind.annotation.*; @RestController @RequestMapping("/shop/sf-express") public class SFExpressApiController { - @Lazy @Autowired private SFExpressApiService sfExpressApiService; diff --git a/mall-shop/src/main/java/com/suisung/mall/shop/sfexpress/service/SFExpressApiService.java b/mall-shop/src/main/java/com/suisung/mall/shop/sfexpress/service/SFExpressApiService.java index 8d780a39..9cb6f0b7 100644 --- a/mall-shop/src/main/java/com/suisung/mall/shop/sfexpress/service/SFExpressApiService.java +++ b/mall-shop/src/main/java/com/suisung/mall/shop/sfexpress/service/SFExpressApiService.java @@ -16,6 +16,15 @@ import java.util.Map; public interface SFExpressApiService { + /** + * 创建顺丰同店铺-连锁店铺 + * + * @param mchId 入驻记录Id, 必填项(mchId 和 storeId 其中一个必填) + * @param storeId 商家门店ID 必填项(mchId 和 storeId 其中一个必填) + * @return + */ + Pair createSfExpressShop(Long mchId, Integer storeId); + /** * 创建顺丰同店铺-连锁店铺 * @@ -31,6 +40,7 @@ public interface SFExpressApiService { */ Pair createSfExpressShop(Integer storeId, String shopName, String cityName, String shopAddress, String contactName, String contactPhone, String longitude, String latitude); + /** * 创建顺丰同城店铺-连锁店铺回调 * 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 c1781ec4..6e516522 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 @@ -19,6 +19,7 @@ import com.suisung.mall.common.api.StateCode; import com.suisung.mall.common.constant.CommonConstant; import com.suisung.mall.common.constant.SFExpressConstant; import com.suisung.mall.common.exception.ApiException; +import com.suisung.mall.common.modules.store.ShopMchEntry; import com.suisung.mall.common.modules.store.ShopStoreSameCityTransportBase; import com.suisung.mall.common.modules.store.ShopStoreSfOrder; import com.suisung.mall.common.pojo.req.*; @@ -32,6 +33,7 @@ import com.suisung.mall.shop.order.service.ShopOrderBaseService; import com.suisung.mall.shop.order.service.ShopOrderInfoService; import com.suisung.mall.shop.order.service.ShopOrderReturnService; import com.suisung.mall.shop.sfexpress.service.SFExpressApiService; +import com.suisung.mall.shop.store.service.ShopMchEntryService; import com.suisung.mall.shop.store.service.ShopStoreSameCityTransportBaseService; import com.suisung.mall.shop.store.service.ShopStoreSfOrderService; import com.suisung.mall.shop.wechat.service.WxOrderShippingService; @@ -89,11 +91,97 @@ public class SFExpressApiServiceImpl implements SFExpressApiService { @Autowired private WxOrderShippingService wxOrderShippingService; + @Lazy + @Autowired + private ShopMchEntryService shopMchEntryService; + + @Lazy @Autowired private PushMessageService pushMessageService; + /** + * 创建顺丰同店铺-连锁店铺 + * + * @param mchId 入驻记录Id, 必填项(mchId 和 storeId 其一必填) 优先 + * @param storeId 商家门店ID 必填项(mchId 和 storeId 其一必填) + * @return + */ + @Override + public Pair createSfExpressShop(Long mchId, Integer storeId) { + // 参数校验 + if (ObjectUtil.isEmpty(mchId) && ObjectUtil.isEmpty(storeId)) { + logger.error("创建顺丰同店铺:mchId 和 storeId 其一必填"); + return Pair.of(false, "缺少必填参数"); + } + + ShopMchEntry shopMchEntry; + if (ObjectUtil.isEmpty(mchId)) { + shopMchEntry = shopMchEntryService.shopMerchEntryByStoreId(storeId); + } else { + shopMchEntry = shopMchEntryService.shopMerchEntryById(mchId); + } + + if (shopMchEntry == null) { + logger.error("创建顺丰同店铺:入驻信息不能为空"); + return Pair.of(false, "入驻信息不能为空"); + } + + // 校验必要字段 + if (shopMchEntry.getStore_id() == null || StrUtil.isBlank(shopMchEntry.getStore_id())) { + logger.error("创建顺丰同店铺:门店ID无效,storeId: {}", shopMchEntry.getStore_id()); + return Pair.of(false, "门店ID无效"); + } + + if (StrUtil.isBlank(shopMchEntry.getStore_name())) { + logger.error("创建顺丰同店铺:门店名称不能为空"); + return Pair.of(false, "门店名称不能为空"); + } + + if (StrUtil.isBlank(shopMchEntry.getStore_address())) { + logger.error("创建顺丰同店铺:门店地址不能为空"); + return Pair.of(false, "门店地址不能为空"); + } + + if (StrUtil.isBlank(shopMchEntry.getContact_name())) { + logger.error("创建顺丰同店铺:联系人姓名不能为空"); + return Pair.of(false, "联系人姓名不能为空"); + } + + String contact_mobile = StrUtil.isBlank(shopMchEntry.getLegal_person_mobile()) ? + shopMchEntry.getLogin_mobile() : shopMchEntry.getLegal_person_mobile(); + + if (StrUtil.isBlank(contact_mobile)) { + logger.error("创建顺丰同店铺:联系人手机号不能为空"); + return Pair.of(false, "联系人手机号不能为空"); + } + + // shopMchEntry.getStore_area() == 广西壮族自治区/贵港市/桂平市 or 广西壮族自治区/贵港市 + String[] areaNames = StrUtil.isNotBlank(shopMchEntry.getStore_area()) ? + shopMchEntry.getStore_area().split("/") : new String[0]; + String cityName = areaNames.length > 0 ? + areaNames[areaNames.length - 1] : + shopMchEntry.getStore_area() != null ? shopMchEntry.getStore_area().replace("/", "") : ""; + + // 如果城市名为空,使用默认值 + if (StrUtil.isBlank(cityName)) { + cityName = "桂平市"; // 默认城市 + logger.warn("城市名为空,使用默认城市: {}", cityName); + } + + return createSfExpressShop( + Convert.toInt(shopMchEntry.getStore_id()), + shopMchEntry.getStore_name(), + cityName, + shopMchEntry.getStore_address(), + shopMchEntry.getContact_name(), + contact_mobile, + shopMchEntry.getStore_longitude(), + shopMchEntry.getStore_latitude() + ); + } + /** * 创建顺丰同城(普通型)店铺 * diff --git a/mall-shop/src/main/java/com/suisung/mall/shop/store/service/ShopMchEntryService.java b/mall-shop/src/main/java/com/suisung/mall/shop/store/service/ShopMchEntryService.java index 86b68d9b..a34bb96d 100644 --- a/mall-shop/src/main/java/com/suisung/mall/shop/store/service/ShopMchEntryService.java +++ b/mall-shop/src/main/java/com/suisung/mall/shop/store/service/ShopMchEntryService.java @@ -108,6 +108,14 @@ public interface ShopMchEntryService { */ ShopMchEntry shopMerchEntryById(Long mchId); + /** + * 根据店铺 ID 获取商户入驻信息 + * + * @param storeId + * @return + */ + ShopMchEntry shopMerchEntryByStoreId(Integer storeId); + /** * 根据商家手机号、营业执照、审批状态获取有效的商家入驻申请记录 diff --git a/mall-shop/src/main/java/com/suisung/mall/shop/store/service/impl/ShopMchEntryServiceImpl.java b/mall-shop/src/main/java/com/suisung/mall/shop/store/service/impl/ShopMchEntryServiceImpl.java index bab62f97..89051844 100644 --- a/mall-shop/src/main/java/com/suisung/mall/shop/store/service/impl/ShopMchEntryServiceImpl.java +++ b/mall-shop/src/main/java/com/suisung/mall/shop/store/service/impl/ShopMchEntryServiceImpl.java @@ -1103,6 +1103,34 @@ public class ShopMchEntryServiceImpl extends BaseServiceImpl queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("store_id", storeId) // 修正字段名:应为"id"而非"mch_id" + .eq("status", CommonConstant.Enable).orderByDesc("id"); + + // 3. 执行查询并返回结果 + return findOne(queryWrapper); + } catch (Exception e) { + // 4. 异常处理:记录异常信息,避免程序中断 + log.error("根据商户ID获取商户入驻信息时发生异常, storeId: {}", storeId, e); + return null; // 发生异常时返回null + } + } + /** * 根据商家手机号、营业执照、审批状态获取有效的商家入驻申请记录 * 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 92a5a7bb..b2646b46 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 @@ -3329,9 +3329,9 @@ public class ShopStoreBaseServiceImpl extends BaseServiceImpl 0 ? areaNames[areaNames.length - 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()); + String[] areaNames = StrUtil.isNotBlank(shopMchEntry.getStore_area()) ? shopMchEntry.getStore_area().split("/") : new String[0]; + String cityName = areaNames.length > 0 ? areaNames[areaNames.length - 1] : shopMchEntry.getStore_area().replace("/", ""); + sfExpressApiService.createSfExpressShop(storeId, shopMchEntry.getStore_name(), cityName, shopMchEntry.getStore_address(), shopMchEntry.getContact_name(), contact_mobile, shopMchEntry.getStore_longitude(), shopMchEntry.getStore_longitude()); return Pair.of(storeId, "新增成功"); } catch (Exception e) {