diff --git a/mall-common/src/main/java/com/suisung/mall/common/modules/sync/SyncApp.java b/mall-common/src/main/java/com/suisung/mall/common/modules/sync/SyncApp.java new file mode 100644 index 00000000..a7d39508 --- /dev/null +++ b/mall-common/src/main/java/com/suisung/mall/common/modules/sync/SyncApp.java @@ -0,0 +1,62 @@ +/* + * Copyright (c) 2025. 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.common.modules.sync; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; + +import java.io.Serializable; +import java.util.Date; + +@Data +@NoArgsConstructor +@AllArgsConstructor +@EqualsAndHashCode +@ApiModel(value = "第三方App同步设置", description = "第三方App同步设置") +public class SyncApp implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "自增ID") + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + @ApiModelProperty(value = "app id") + private String app_id; + + @ApiModelProperty(value = "app key") + private String app_key; + + @ApiModelProperty(value = "app 密钥") + private String app_secret; + + @ApiModelProperty(value = "关联店铺Id") + private String store_id; + + @ApiModelProperty(value = "名称") + private String name; + + @ApiModelProperty(value = "介绍") + private String intro; + + @ApiModelProperty(value = "状态") + private Integer status; + + @ApiModelProperty(value = "新增时间") + private Date created_at; + + @ApiModelProperty(value = "更新时间") + private Date updated_at; +} diff --git a/mall-common/src/main/java/com/suisung/mall/common/pojo/res/SFExpressApiRes.java b/mall-common/src/main/java/com/suisung/mall/common/pojo/res/ThirdApiRes.java similarity index 79% rename from mall-common/src/main/java/com/suisung/mall/common/pojo/res/SFExpressApiRes.java rename to mall-common/src/main/java/com/suisung/mall/common/pojo/res/ThirdApiRes.java index 3448ea23..b4d6f95e 100644 --- a/mall-common/src/main/java/com/suisung/mall/common/pojo/res/SFExpressApiRes.java +++ b/mall-common/src/main/java/com/suisung/mall/common/pojo/res/ThirdApiRes.java @@ -23,7 +23,8 @@ import java.io.Serializable; @NoArgsConstructor @AllArgsConstructor @JsonInclude(JsonInclude.Include.NON_NULL) -public class SFExpressApiRes implements Serializable { +public class ThirdApiRes implements Serializable { + private static final long serialVersionUID = 1L; @ApiModelProperty(value = "错误码") private Integer error_code; @@ -34,11 +35,11 @@ public class SFExpressApiRes implements Serializable { @ApiModelProperty(value = "错误数据") public Object error_data; - public SFExpressApiRes fail(Integer errorCode, String errorMsg) { - return new SFExpressApiRes(errorCode, errorMsg, null, null); + public ThirdApiRes fail(Integer errorCode, String errorMsg) { + return new ThirdApiRes(errorCode, errorMsg, null, null); } - public SFExpressApiRes success(String errorMsg) { - return new SFExpressApiRes(0, errorMsg, null, null); + public ThirdApiRes success(String errorMsg) { + return new ThirdApiRes(0, errorMsg, null, null); } } diff --git a/mall-common/src/main/java/com/suisung/mall/common/utils/CommonUtil.java b/mall-common/src/main/java/com/suisung/mall/common/utils/CommonUtil.java index 8dbe7bf3..c3b754c3 100644 --- a/mall-common/src/main/java/com/suisung/mall/common/utils/CommonUtil.java +++ b/mall-common/src/main/java/com/suisung/mall/common/utils/CommonUtil.java @@ -253,7 +253,7 @@ public class CommonUtil { MessageDigest md = MessageDigest.getInstance("MD5"); byte[] md5 = md.digest(sb.toString().getBytes(StandardCharsets.UTF_8)); int i; - StringBuffer buf = new StringBuffer(""); + StringBuffer buf = new StringBuffer(); for (byte b : md5) { i = b; if (i < 0) { @@ -272,6 +272,14 @@ public class CommonUtil { } } + /** + * 验证MD5摘要签名 + * @param sign + * @param postData + * @param appId + * @param appKey + * @return + */ public static boolean checkOpenSign(String sign, String postData, String appId, String appKey) { if (StrUtil.isBlank(sign) || StrUtil.isBlank(postData)|| StrUtil.isBlank(appId)|| StrUtil.isBlank(appKey)) { logger.error("验签时缺少必要参数!"); diff --git a/mall-gateway/src/main/resources/application.yml b/mall-gateway/src/main/resources/application.yml index 0d2e73f5..fb7cf8f5 100644 --- a/mall-gateway/src/main/resources/application.yml +++ b/mall-gateway/src/main/resources/application.yml @@ -83,6 +83,7 @@ secure: - "/shop/sf-express/cancel-order/notify" - "/shop/sf-express/rider-order-status/notify" - "/shop/sf-express/order-complete/notify" + - "/shop/sync/third/**" - "/mobile/shop/sf-express/order/status/listening/**" - "/admin/shop/open/**" - "/admin/account/open/**" diff --git a/mall-shop/src/main/java/com/suisung/mall/shop/base/service/ShopBaseProductBrandService.java b/mall-shop/src/main/java/com/suisung/mall/shop/base/service/ShopBaseProductBrandService.java index e489f044..d8322f56 100644 --- a/mall-shop/src/main/java/com/suisung/mall/shop/base/service/ShopBaseProductBrandService.java +++ b/mall-shop/src/main/java/com/suisung/mall/shop/base/service/ShopBaseProductBrandService.java @@ -27,6 +27,27 @@ public interface ShopBaseProductBrandService extends IBaseService selectByBrandName(String brand_name); + + /** + * 新增或更新品牌,判断品牌名一样后,不一样新增,再判断关键字段是否一样,不一样更改。 + * @param shopBaseProductBrand + * @return + */ + int saveOrUpdateBrand2(ShopBaseProductBrand shopBaseProductBrand); + Map brand(); } diff --git a/mall-shop/src/main/java/com/suisung/mall/shop/base/service/ShopBaseProductCategoryService.java b/mall-shop/src/main/java/com/suisung/mall/shop/base/service/ShopBaseProductCategoryService.java index 37f3fc12..f6b6b877 100644 --- a/mall-shop/src/main/java/com/suisung/mall/shop/base/service/ShopBaseProductCategoryService.java +++ b/mall-shop/src/main/java/com/suisung/mall/shop/base/service/ShopBaseProductCategoryService.java @@ -110,6 +110,13 @@ public interface ShopBaseProductCategoryService extends IBaseService queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("brand_name", brand_name); + return count(queryWrapper) > 0; + } + + /** + * 根据品牌名称查询记录列表 + * + * @param brand_name + * @return + */ + @Override + public List selectByBrandName(String brand_name) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("brand_name", brand_name); + return list(queryWrapper); + } + + /** + * 新增或更新品牌,判断品牌名一样后,不一样新增,再判断关键字段是否一样,不一样更改。 + * + * @param shopBaseProductBrand + * @return + */ + @Override + public int saveOrUpdateBrand2(ShopBaseProductBrand shopBaseProductBrand) { + + List list = selectByBrandName(shopBaseProductBrand.getBrand_name()); + if (ObjectUtil.isEmpty(list)) { + // 新增记录 + if (saveOrUpdateBrand(shopBaseProductBrand)) { + // 根据id判断新增或更新 + return 1; + } + return 0; + } + + int cnt = 0; + for (ShopBaseProductBrand spb : list) { + if (!spb.getBrand_image().equals(shopBaseProductBrand.getBrand_image()) + || !spb.getBrand_desc().equals(shopBaseProductBrand.getBrand_desc()) + || !spb.getCategory_id().equals(shopBaseProductBrand.getCategory_id())) { + + // TODO 外网图片需要本地上传 + + shopBaseProductBrand.setBrand_id(spb.getBrand_id()); + if (saveOrUpdateBrand(shopBaseProductBrand)) { // 根据id判断新增或更新 + cnt++; + } + + } + } + return cnt; + } + @Override public Map brand() { diff --git a/mall-shop/src/main/java/com/suisung/mall/shop/base/service/impl/ShopBaseProductCategoryServiceImpl.java b/mall-shop/src/main/java/com/suisung/mall/shop/base/service/impl/ShopBaseProductCategoryServiceImpl.java index 673d6aa3..748c88dc 100644 --- a/mall-shop/src/main/java/com/suisung/mall/shop/base/service/impl/ShopBaseProductCategoryServiceImpl.java +++ b/mall-shop/src/main/java/com/suisung/mall/shop/base/service/impl/ShopBaseProductCategoryServiceImpl.java @@ -1115,6 +1115,25 @@ public class ShopBaseProductCategoryServiceImpl extends BaseServiceImpl queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("category_name", categoryName); + queryWrapper.orderByAsc("category_parent_id").orderByAsc("category_order"); + List list = list(queryWrapper); + if (CollUtil.isNotEmpty(list)) { + return list.get(0); + } + + return null; + } + /** * 把思迅的商品分类转出澜弛的商品分类 * 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 d0bae320..d6bdb225 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 @@ -8,7 +8,7 @@ package com.suisung.mall.shop.sfexpress.controller.api; -import com.suisung.mall.common.pojo.res.SFExpressApiRes; +import com.suisung.mall.common.pojo.res.ThirdApiRes; import com.suisung.mall.shop.sfexpress.service.SFExpressApiService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; @@ -29,19 +29,19 @@ public class SFExpressApiController { @ApiOperation(value = "顺丰原因订单取消回调", notes = "顺丰原因订单取消回调") @RequestMapping(value = "/cancel-order/notify", method = RequestMethod.POST) - public SFExpressApiRes cancelOrderNotify(@RequestBody String requestBody, @RequestParam(name = "sign") String sign) { + public ThirdApiRes cancelOrderNotify(@RequestBody String requestBody, @RequestParam(name = "sign") String sign) { return sfExpressApiService.receiveCancelOrderNotify(requestBody, sign); } @ApiOperation(value = "接收顺丰配送状态更改回调", notes = "接收顺丰配送状态更改回调") @RequestMapping(value = "/rider-order-status/notify", method = RequestMethod.POST) - public SFExpressApiRes receiveRiderOrderStatusNotify(@RequestBody String requestBody, @RequestParam(name = "sign") String sign) { + public ThirdApiRes receiveRiderOrderStatusNotify(@RequestBody String requestBody, @RequestParam(name = "sign") String sign) { return sfExpressApiService.receiveRiderOrderStatusNotify(requestBody, sign); } @ApiOperation(value = "接收顺丰订单完成回调", notes = "接收顺丰订单完成回调") @RequestMapping(value = "/order-complete/notify", method = RequestMethod.POST) - public SFExpressApiRes receiveOrderCompleteNotify(@RequestBody String requestBody, @RequestParam(name = "sign") String sign) { + public ThirdApiRes receiveOrderCompleteNotify(@RequestBody String requestBody, @RequestParam(name = "sign") String sign) { return sfExpressApiService.receiveOrderCompleteNotify(requestBody, sign); } } diff --git a/mall-shop/src/main/java/com/suisung/mall/shop/sfexpress/controller/mobile/SFExpressController.java b/mall-shop/src/main/java/com/suisung/mall/shop/sfexpress/controller/mobile/SFExpressController.java index 8bf0f119..a7cd9814 100644 --- a/mall-shop/src/main/java/com/suisung/mall/shop/sfexpress/controller/mobile/SFExpressController.java +++ b/mall-shop/src/main/java/com/suisung/mall/shop/sfexpress/controller/mobile/SFExpressController.java @@ -9,7 +9,7 @@ package com.suisung.mall.shop.sfexpress.controller.mobile; import com.suisung.mall.common.api.CommonResult; -import com.suisung.mall.common.pojo.res.SFExpressApiRes; +import com.suisung.mall.common.pojo.res.ThirdApiRes; import com.suisung.mall.common.utils.SseEmitterUtil; import com.suisung.mall.shop.sfexpress.service.SFExpressApiService; import com.suisung.mall.shop.store.service.ShopStoreSfOrderService; @@ -38,13 +38,13 @@ public class SFExpressController { @ApiOperation(value = "顺丰同城店铺发单", notes = "顺丰同城店铺发单") @RequestMapping(value = "/create-order", method = RequestMethod.POST) - public SFExpressApiRes createOrder(@RequestParam(name = "shop_order_id", defaultValue = "") String shopOrderId) { + public ThirdApiRes createOrder(@RequestParam(name = "shop_order_id", defaultValue = "") String shopOrderId) { return sfExpressApiService.createOrder(shopOrderId); } @ApiOperation(value = "用户或店铺取消顺丰同城订单", notes = "用户或店铺取消顺丰同城订单") @RequestMapping(value = "/cancel-order", method = RequestMethod.POST) - public SFExpressApiRes cancelOrder(@RequestParam(name = "order_id", defaultValue = "") String orderId) { + public ThirdApiRes cancelOrder(@RequestParam(name = "order_id", defaultValue = "") String orderId) { Map params = new HashMap<>(); params.put("order_id", shopStoreSfOrderService.getSfOrderIdByShopOrderId(orderId)); return sfExpressApiService.cancelOrder(params); @@ -52,8 +52,8 @@ public class SFExpressController { @ApiOperation(value = "给顺丰同城配送员加小费", notes = "给顺丰同城配送员加小费") @RequestMapping(value = "/add-order-gratuity-fee", method = RequestMethod.POST) - public SFExpressApiRes addOrderGratuityFee(@RequestParam(name = "order_id", defaultValue = "") String orderId, - @RequestParam(name = "gratuity_fee", defaultValue = "DD-20241119-0001") Integer gratuityFee) { + public ThirdApiRes addOrderGratuityFee(@RequestParam(name = "order_id", defaultValue = "") String orderId, + @RequestParam(name = "gratuity_fee", defaultValue = "DD-20241119-0001") Integer gratuityFee) { Map params = new HashMap<>(); params.put("order_id", shopStoreSfOrderService.getSfOrderIdByShopOrderId(orderId)); params.put("gratuity_fee", gratuityFee); @@ -62,7 +62,7 @@ public class SFExpressController { @ApiOperation(value = "向配送员或顺丰同城平台催单", notes = "向配送员或顺丰同城平台催单") @RequestMapping(value = "/reminder-order", method = RequestMethod.POST) - public SFExpressApiRes reminderOrder(@RequestParam(name = "order_id", defaultValue = "") String orderId) { + public ThirdApiRes reminderOrder(@RequestParam(name = "order_id", defaultValue = "") String orderId) { Map params = new HashMap<>(); params.put("order_id", shopStoreSfOrderService.getSfOrderIdByShopOrderId(orderId)); return sfExpressApiService.reminderOrder(params); @@ -70,7 +70,7 @@ public class SFExpressController { @ApiOperation(value = "查询顺丰同城订单状态流", notes = "查询顺丰同城订单状态流") @RequestMapping(value = "/list-order-feed", method = RequestMethod.POST) - public SFExpressApiRes listOrderFeed(@RequestParam(name = "order_id", defaultValue = "") String orderId) { + public ThirdApiRes listOrderFeed(@RequestParam(name = "order_id", defaultValue = "") String orderId) { Map params = new HashMap<>(); params.put("order_id", shopStoreSfOrderService.getSfOrderIdByShopOrderId(orderId)); return sfExpressApiService.listOrderFeed(params); @@ -78,7 +78,7 @@ public class SFExpressController { @ApiOperation(value = "获取配送员实时坐标接口", notes = "获取配送员实时坐标接口") @RequestMapping(value = "/rider-latest-position", method = RequestMethod.POST) - public SFExpressApiRes riderLatestPosition(@RequestParam(name = "order_id", defaultValue = "") String orderId) { + public ThirdApiRes riderLatestPosition(@RequestParam(name = "order_id", defaultValue = "") String orderId) { Map params = new HashMap<>(); params.put("order_id", shopStoreSfOrderService.getSfOrderIdByShopOrderId(orderId)); return sfExpressApiService.riderLatestPosition(params); @@ -86,7 +86,7 @@ public class SFExpressController { @ApiOperation(value = "获取配送员轨迹H5", notes = "获取配送员轨迹H5") @RequestMapping(value = "/rider-view/v2", method = RequestMethod.POST) - public SFExpressApiRes riderViewV2(@RequestParam(name = "order_id", defaultValue = "") String orderId) { + public ThirdApiRes riderViewV2(@RequestParam(name = "order_id", defaultValue = "") String orderId) { Map params = new HashMap<>(); params.put("order_id", shopStoreSfOrderService.getSfOrderIdByShopOrderId(orderId)); return sfExpressApiService.riderViewV2(params); 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 7e371686..21689673 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 @@ -8,7 +8,7 @@ package com.suisung.mall.shop.sfexpress.service; -import com.suisung.mall.common.pojo.res.SFExpressApiRes; +import com.suisung.mall.common.pojo.res.ThirdApiRes; import org.springframework.data.util.Pair; import java.util.Map; @@ -21,7 +21,7 @@ public interface SFExpressApiService { * @param shopOrderId 商家订单号 * @return */ - SFExpressApiRes createOrder(String shopOrderId); + ThirdApiRes createOrder(String shopOrderId); /** @@ -42,7 +42,7 @@ public interface SFExpressApiService { * @param cancelReason 取消原因 * @return */ - SFExpressApiRes cancelOrder(String sfOrderId, Integer cancelCode, String cancelReason); + ThirdApiRes cancelOrder(String sfOrderId, Integer cancelCode, String cancelReason); /** @@ -51,7 +51,7 @@ public interface SFExpressApiService { * @param params 综合参数,顺丰订单号必填项,请参考:https://openic.sf-express.com/open/api/docs/index/#/apidoc * @return */ - SFExpressApiRes cancelOrder(Map params); + ThirdApiRes cancelOrder(Map params); /** * 订单加小费,订单创建后,骑士未接单的情况下通过该接口对订单进行加小费,促进订单接单,截止订单完成前,都可以对订单加小费 @@ -59,7 +59,7 @@ public interface SFExpressApiService { * @param params 综合参数,顺丰订单号order_id,订单小费 gratuity_fee,必填项,请参考:https://openic.sf-express.com/open/api/docs/index/#/apidoc * @return */ - SFExpressApiRes addOrderGratuityFee(Map params); + ThirdApiRes addOrderGratuityFee(Map params); /** * 催单,当订单为配送状态中,可通过该接口发起催单 @@ -67,7 +67,7 @@ public interface SFExpressApiService { * @param params 综合参数,顺丰订单号order_id必填项,请参考:https://openic.sf-express.com/open/api/docs/index/#/apidoc * @return */ - SFExpressApiRes reminderOrder(Map params); + ThirdApiRes reminderOrder(Map params); /** * 订单状态流查询,此接口可获取到指定订单操作记录;当接收顺丰状态回调失败时,可以主动查询此接口补齐订单操作与状态。 @@ -76,7 +76,7 @@ public interface SFExpressApiService { * @param params * @return */ - SFExpressApiRes listOrderFeed(Map params); + ThirdApiRes listOrderFeed(Map params); /** * 获取配送员实时坐标接口,此接口用于获取订单配送员的实时经纬度坐标,一般情况下骑士经纬度30s更新一次。 @@ -84,7 +84,7 @@ public interface SFExpressApiService { * @param params 综合参数,顺丰订单号order_id必填项,请参考:https://openic.sf-express.com/open/api/docs/index/#/apidoc * @return */ - SFExpressApiRes riderLatestPosition(Map params); + ThirdApiRes riderLatestPosition(Map params); /** * 获取配送员轨迹H5,此接口可获取一个订单的骑士位置H5链接,可进行内嵌或发送给用户(内嵌时无法保证界面的兼容性,如发现兼容性问题可使用获取配送员坐标接口自行开发轨迹H5)。 @@ -92,7 +92,7 @@ public interface SFExpressApiService { * @param params 综合参数,顺丰订单号order_id必填项,请参考:https://openic.sf-express.com/open/api/docs/index/#/apidoc * @return */ - SFExpressApiRes riderViewV2(Map params); + ThirdApiRes riderViewV2(Map params); /** * 改单,支持店铺和企业客户改单,当订单生成后,可通过该接口修改收件人信息,可修改字段:收件地址、物品重量等,详情可参考请求参数列表 @@ -100,7 +100,7 @@ public interface SFExpressApiService { * @param params 综合参数,请参考:https://openic.sf-express.com/open/api/docs/index/#/apidoc * @return */ - SFExpressApiRes changeOrder(Map params); + ThirdApiRes changeOrder(Map params); // *********** 顺丰同城回调相关业务 **************** @@ -112,7 +112,7 @@ public interface SFExpressApiService { * @param sign * @return */ - SFExpressApiRes receiveCancelOrderNotify(String jsonData, String sign); + ThirdApiRes receiveCancelOrderNotify(String jsonData, String sign); /** * 接收顺丰配送状态更改回调 @@ -121,7 +121,7 @@ public interface SFExpressApiService { * @param sign * @return */ - SFExpressApiRes receiveRiderOrderStatusNotify(String jsonData, String sign); + ThirdApiRes receiveRiderOrderStatusNotify(String jsonData, String sign); /** * 接收顺丰订单完成回调 @@ -130,5 +130,5 @@ public interface SFExpressApiService { * @param sign * @return */ - SFExpressApiRes receiveOrderCompleteNotify(String jsonData, String sign); + ThirdApiRes receiveOrderCompleteNotify(String jsonData, String sign); } 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 e9f959b4..e2ce4266 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 @@ -20,7 +20,7 @@ import com.suisung.mall.common.constant.SFExpressConstant; import com.suisung.mall.common.exception.ApiException; import com.suisung.mall.common.modules.store.ShopStoreSfOrder; import com.suisung.mall.common.pojo.req.*; -import com.suisung.mall.common.pojo.res.SFExpressApiRes; +import com.suisung.mall.common.pojo.res.ThirdApiRes; import com.suisung.mall.common.utils.CommonUtil; import com.suisung.mall.common.utils.I18nUtil; import com.suisung.mall.common.utils.JsonUtil; @@ -29,7 +29,6 @@ import com.suisung.mall.shop.order.service.ShopOrderBaseService; import com.suisung.mall.shop.order.service.ShopOrderInfoService; import com.suisung.mall.shop.sfexpress.service.SFExpressApiService; import com.suisung.mall.shop.store.service.ShopStoreSfOrderService; -import org.apache.commons.codec.binary.Base64; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Value; @@ -38,8 +37,6 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import javax.annotation.Resource; -import java.nio.charset.StandardCharsets; -import java.security.MessageDigest; import java.util.ArrayList; import java.util.HashMap; import java.util.List; @@ -67,7 +64,7 @@ public class SFExpressApiServiceImpl implements SFExpressApiService { private ShopOrderInfoService shopOrderInfoService; @Override - public SFExpressApiRes createOrder(String shopOrderId) { + public ThirdApiRes createOrder(String shopOrderId) { // 组织请求参数 // Map params = buildCommonParams(); // params.put("app_id", appId); @@ -137,7 +134,7 @@ public class SFExpressApiServiceImpl implements SFExpressApiService { return null; } - return JsonUtil.json2object(retRespStr, SFExpressApiRes.class); + return JsonUtil.json2object(retRespStr, ThirdApiRes.class); } /** @@ -217,7 +214,7 @@ public class SFExpressApiServiceImpl implements SFExpressApiService { * @return */ @Override - public SFExpressApiRes cancelOrder(String orderId, Integer cancelCode, String cancelReason) { + public ThirdApiRes cancelOrder(String orderId, Integer cancelCode, String cancelReason) { Map params = buildCommonParams(); params.put("order_id", orderId); if (StrUtil.isNotBlank(cancelReason) && cancelCode != null) { @@ -235,11 +232,11 @@ public class SFExpressApiServiceImpl implements SFExpressApiService { */ @Override @Transactional - public SFExpressApiRes cancelOrder(Map params) { + public ThirdApiRes cancelOrder(Map params) { // TODO 检验用户权限 if (params == null || ObjectUtil.isEmpty(params.get("order_id"))) { - return new SFExpressApiRes().fail(1003, "请求参数有误!"); + return new ThirdApiRes().fail(1003, "请求参数有误!"); } // 转换 json 字符串参数 @@ -253,30 +250,30 @@ public class SFExpressApiServiceImpl implements SFExpressApiService { String retRespStr = HttpUtil.post(send_url, paramJSON); if (StrUtil.isBlank(retRespStr)) { logger.error("顺丰同城:取消订单异常,无返回值!"); - return new SFExpressApiRes().fail(2, "顺丰同城:无返回值!"); + return new ThirdApiRes().fail(2, "顺丰同城:无返回值!"); } - SFExpressApiRes sfExpressApiRes = JsonUtil.json2object(retRespStr, SFExpressApiRes.class); + ThirdApiRes sfExpressApiRes = JsonUtil.json2object(retRespStr, ThirdApiRes.class); if (sfExpressApiRes == null) { logger.error("顺丰同城:取消订单,返回值异常!{}", retRespStr); - return new SFExpressApiRes().fail(2, "顺丰同城:无返回值!"); + return new ThirdApiRes().fail(2, "顺丰同城:无返回值!"); } if (!sfExpressApiRes.getError_code().equals(0)) { logger.error("顺丰同城:取消订单失败!{}", retRespStr); - return new SFExpressApiRes().fail(2, sfExpressApiRes.getError_msg()); + return new ThirdApiRes().fail(2, sfExpressApiRes.getError_msg()); } // 判断订单的状态,是否已经取消了?已取消,不再执行 ShopStoreSfOrder shopStoreSfOrderExist = shopStoreSfOrderService.getBySfOrderId(orderId); if (shopStoreSfOrderExist == null) { - return new SFExpressApiRes().fail(2, "订单有误!"); + return new ThirdApiRes().fail(2, "订单有误!"); } if (shopStoreSfOrderExist.getOrder_status() != null && (shopStoreSfOrderExist.getOrder_status().equals(StateCode.SF_ORDER_STATUS_CANCELED) || (shopStoreSfOrderExist.getOrder_status().equals(StateCode.SF_ORDER_STATUS_CANCELING)))) { - return new SFExpressApiRes().success("订单已取消过!"); + return new ThirdApiRes().success("订单已取消过!"); } // 更改商城订单状态为:已取消,注意事务问题 @@ -308,9 +305,9 @@ public class SFExpressApiServiceImpl implements SFExpressApiService { * @return */ @Override - public SFExpressApiRes addOrderGratuityFee(Map params) { + public ThirdApiRes addOrderGratuityFee(Map params) { if (params == null || ObjectUtil.isEmpty(params.get("order_id")) || params.get("gratuity_fee") == null) { - return new SFExpressApiRes().fail(1003, "请求参数有误!"); + return new ThirdApiRes().fail(1003, "请求参数有误!"); } params.putAll(buildCommonParams()); @@ -323,10 +320,10 @@ public class SFExpressApiServiceImpl implements SFExpressApiService { String retRespStr = HttpUtil.post(send_url, paramJSON); if (StrUtil.isBlank(retRespStr)) { logger.error("顺丰同城:订单加小费,无返回值!{}", retRespStr); - return new SFExpressApiRes().fail(-1, "顺丰同城:无返回值!"); + return new ThirdApiRes().fail(-1, "顺丰同城:无返回值!"); } - return JsonUtil.json2object(retRespStr, SFExpressApiRes.class); + return JsonUtil.json2object(retRespStr, ThirdApiRes.class); } /** @@ -336,9 +333,9 @@ public class SFExpressApiServiceImpl implements SFExpressApiService { * @return */ @Override - public SFExpressApiRes reminderOrder(Map params) { + public ThirdApiRes reminderOrder(Map params) { if (params == null || ObjectUtil.isEmpty(params.get("order_id"))) { - return new SFExpressApiRes().fail(1003, "请求参数有误!"); + return new ThirdApiRes().fail(1003, "请求参数有误!"); } params.putAll(buildCommonParams()); @@ -351,10 +348,10 @@ public class SFExpressApiServiceImpl implements SFExpressApiService { String retRespStr = HttpUtil.post(send_url, paramJSON); if (StrUtil.isBlank(retRespStr)) { logger.error("顺丰同城:催单异常,无返回值!"); - return new SFExpressApiRes().fail(-1, "顺丰同城:无返回值!"); + return new ThirdApiRes().fail(-1, "顺丰同城:无返回值!"); } - return JsonUtil.json2object(retRespStr, SFExpressApiRes.class); + return JsonUtil.json2object(retRespStr, ThirdApiRes.class); } @@ -366,9 +363,9 @@ public class SFExpressApiServiceImpl implements SFExpressApiService { * @return */ @Override - public SFExpressApiRes listOrderFeed(Map params) { + public ThirdApiRes listOrderFeed(Map params) { if (params == null || ObjectUtil.isEmpty(params.get("order_id"))) { - return new SFExpressApiRes().fail(1003, "请求参数有误!"); + return new ThirdApiRes().fail(1003, "请求参数有误!"); } params.putAll(buildCommonParams()); @@ -381,10 +378,10 @@ public class SFExpressApiServiceImpl implements SFExpressApiService { String retRespStr = HttpUtil.post(send_url, paramJSON); if (StrUtil.isBlank(retRespStr)) { logger.error("顺丰同城:订单状态流查询异常,无返回值!"); - return new SFExpressApiRes().fail(-1, "顺丰同城:无返回值!"); + return new ThirdApiRes().fail(-1, "顺丰同城:无返回值!"); } - return JsonUtil.json2object(retRespStr, SFExpressApiRes.class); + return JsonUtil.json2object(retRespStr, ThirdApiRes.class); } /** @@ -394,9 +391,9 @@ public class SFExpressApiServiceImpl implements SFExpressApiService { * @return */ @Override - public SFExpressApiRes riderLatestPosition(Map params) { + public ThirdApiRes riderLatestPosition(Map params) { if (params == null || ObjectUtil.isEmpty(params.get("order_id"))) { - return new SFExpressApiRes().fail(1003, "请求参数有误!"); + return new ThirdApiRes().fail(1003, "请求参数有误!"); } params.putAll(buildCommonParams()); @@ -409,10 +406,10 @@ public class SFExpressApiServiceImpl implements SFExpressApiService { String retRespStr = HttpUtil.post(send_url, paramJSON); if (StrUtil.isBlank(retRespStr)) { logger.error("顺丰同城:获取配送员实时坐标异常,无返回值!"); - return new SFExpressApiRes().fail(-1, "顺丰同城:无返回值!"); + return new ThirdApiRes().fail(-1, "顺丰同城:无返回值!"); } - return JsonUtil.json2object(retRespStr, SFExpressApiRes.class); + return JsonUtil.json2object(retRespStr, ThirdApiRes.class); } /** @@ -422,9 +419,9 @@ public class SFExpressApiServiceImpl implements SFExpressApiService { * @return */ @Override - public SFExpressApiRes riderViewV2(Map params) { + public ThirdApiRes riderViewV2(Map params) { if (params == null || ObjectUtil.isEmpty(params.get("order_id"))) { - return new SFExpressApiRes().fail(1003, "请求参数有误!"); + return new ThirdApiRes().fail(1003, "请求参数有误!"); } params.putAll(buildCommonParams()); @@ -437,10 +434,10 @@ public class SFExpressApiServiceImpl implements SFExpressApiService { String retRespStr = HttpUtil.post(send_url, paramJSON); if (StrUtil.isBlank(retRespStr)) { logger.error("顺丰同城:获取配送员轨迹H5异常,无返回值!"); - return new SFExpressApiRes().fail(-1, "顺丰同城:无返回值!"); + return new ThirdApiRes().fail(-1, "顺丰同城:无返回值!"); } - return JsonUtil.json2object(retRespStr, SFExpressApiRes.class); + return JsonUtil.json2object(retRespStr, ThirdApiRes.class); } /** @@ -450,7 +447,7 @@ public class SFExpressApiServiceImpl implements SFExpressApiService { * @return */ @Override - public SFExpressApiRes changeOrder(Map params) { + public ThirdApiRes changeOrder(Map params) { return null; } @@ -463,13 +460,13 @@ public class SFExpressApiServiceImpl implements SFExpressApiService { * @return */ @Override - public SFExpressApiRes receiveCancelOrderNotify(String jsonData, String sign) { + public ThirdApiRes receiveCancelOrderNotify(String jsonData, String sign) { if (StrUtil.isBlank(jsonData) || StrUtil.isBlank(sign)) { - return new SFExpressApiRes().fail(1003, "缺少必要参数!"); + return new ThirdApiRes().fail(1003, "缺少必要参数!"); } if (!checkOpenSign(sign, jsonData)) { - return new SFExpressApiRes().fail(2002, "请求签名sign校验失败!"); + return new ThirdApiRes().fail(2002, "请求签名sign校验失败!"); } logger.info("接收顺丰原因订单取消回调返回的 JSON 数据:{}", jsonData); @@ -482,12 +479,12 @@ public class SFExpressApiServiceImpl implements SFExpressApiService { if (shopStoreSfOrderExist != null && shopStoreSfOrderExist.getOrder_status() != null && (shopStoreSfOrderExist.getOrder_status().equals(StateCode.SF_ORDER_STATUS_CANCELED) || (shopStoreSfOrderExist.getOrder_status().equals(StateCode.SF_ORDER_STATUS_CANCELING)))) { - return new SFExpressApiRes().success("success"); + return new ThirdApiRes().success("success"); } Boolean success = shopStoreSfOrderService.updateShopStoreSfOrderStatus(shopStoreSfOrder); if (!success) { - return new SFExpressApiRes().fail(-1, "状态处理失败!"); + return new ThirdApiRes().fail(-1, "状态处理失败!"); } // 更改商城订单状态为:已取消,注意事务问题 @@ -495,10 +492,10 @@ public class SFExpressApiServiceImpl implements SFExpressApiService { orderList.add(shopStoreSfOrder.getShop_order_id()); success = shopOrderBaseService.cancel(orderList, null, false); if (!success) { - return new SFExpressApiRes().fail(-1, "取消订单业务处理失败!"); + return new ThirdApiRes().fail(-1, "取消订单业务处理失败!"); } - return new SFExpressApiRes().success("success"); + return new ThirdApiRes().success("success"); } /** @@ -511,13 +508,13 @@ public class SFExpressApiServiceImpl implements SFExpressApiService { */ @Transactional @Override - public SFExpressApiRes receiveRiderOrderStatusNotify(String jsonData, String sign) { + public ThirdApiRes receiveRiderOrderStatusNotify(String jsonData, String sign) { if (StrUtil.isBlank(jsonData) || StrUtil.isBlank(sign)) { - return new SFExpressApiRes().fail(1003, "缺少必要参数!"); + return new ThirdApiRes().fail(1003, "缺少必要参数!"); } if (!checkOpenSign(sign, jsonData)) { - return new SFExpressApiRes().fail(2002, "请求签名sign校验失败!"); + return new ThirdApiRes().fail(2002, "请求签名sign校验失败!"); } logger.info("接收顺丰配送状态更改回调返回的 JSON 数据:{}", jsonData); @@ -528,7 +525,7 @@ public class SFExpressApiServiceImpl implements SFExpressApiService { // 获取顺丰同城的物流轨迹 Map params = new HashMap<>(); params.put("order_id", shopStoreSfOrder.getSf_order_id()); - SFExpressApiRes feedRes = listOrderFeed(params); + ThirdApiRes feedRes = listOrderFeed(params); logger.info("获取配送员物流轨迹:{}", feedRes); if (feedRes != null && feedRes.getError_code().equals(0)) { JSONObject result = JSONUtil.parseObj(feedRes.getResult()); @@ -576,7 +573,7 @@ public class SFExpressApiServiceImpl implements SFExpressApiService { SseEmitterUtil.sendMessage(shopStoreSfOrder.getSf_order_id(), jsonData); // logger.debug("向 SSE 通道 {} 发送了:{}", shopStoreSfOrder.getSf_order_id(), jsonData); - return new SFExpressApiRes().success("success"); + return new ThirdApiRes().success("success"); } /** @@ -588,13 +585,13 @@ public class SFExpressApiServiceImpl implements SFExpressApiService { */ @Transactional @Override - public SFExpressApiRes receiveOrderCompleteNotify(String jsonData, String sign) { + public ThirdApiRes receiveOrderCompleteNotify(String jsonData, String sign) { if (StrUtil.isBlank(jsonData) || StrUtil.isBlank(sign)) { - return new SFExpressApiRes().fail(1003, "缺少必要参数!"); + return new ThirdApiRes().fail(1003, "缺少必要参数!"); } if (!checkOpenSign(sign, jsonData)) { - return new SFExpressApiRes().fail(2002, "请求签名sign校验失败!"); + return new ThirdApiRes().fail(2002, "请求签名sign校验失败!"); } logger.info("接收顺丰订单完成回调返回的 JSON 数据:{}", jsonData); @@ -603,23 +600,23 @@ public class SFExpressApiServiceImpl implements SFExpressApiService { // 更改顺丰同城订单状态 ShopStoreSfOrder shopStoreSfOrder = toShopStoreSfOrder(jsonData); if (shopStoreSfOrder == null) { - return new SFExpressApiRes().fail(-1, "返回数据转换失败!"); + return new ThirdApiRes().fail(-1, "返回数据转换失败!"); } ShopStoreSfOrder order = shopStoreSfOrderService.getBySfOrderId(shopStoreSfOrder.getSf_order_id()); if (order == null) { - return new SFExpressApiRes().fail(-1, "订单不存在!"); + return new ThirdApiRes().fail(-1, "订单不存在!"); } // 订单状态已经更改过,无需更改 if (order.getOrder_status().equals(StateCode.SF_ORDER_STATUS_FINISH)) { - return new SFExpressApiRes().success("success"); + return new ThirdApiRes().success("success"); } // 获取顺丰同城的物流轨迹 Map params = new HashMap<>(); params.put("order_id", shopStoreSfOrder.getSf_order_id()); - SFExpressApiRes feedRes = listOrderFeed(params); + ThirdApiRes feedRes = listOrderFeed(params); logger.info("获取配送员物流轨迹:{}", feedRes); if (feedRes != null && feedRes.getError_code().equals(0)) { JSONObject result = JSONUtil.parseObj(feedRes.getResult()); @@ -645,7 +642,7 @@ public class SFExpressApiServiceImpl implements SFExpressApiService { // logger.debug("准备发送SSE消息..."); SseEmitterUtil.sendMessage(shopStoreSfOrder.getSf_order_id(), jsonData); - return new SFExpressApiRes().success("success"); + return new ThirdApiRes().success("success"); } diff --git a/mall-shop/src/main/java/com/suisung/mall/shop/sync/controller/SyncThirdDataController.java b/mall-shop/src/main/java/com/suisung/mall/shop/sync/controller/SyncThirdDataController.java new file mode 100644 index 00000000..24f459b2 --- /dev/null +++ b/mall-shop/src/main/java/com/suisung/mall/shop/sync/controller/SyncThirdDataController.java @@ -0,0 +1,60 @@ +/* + * Copyright (c) 2025. 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.sync.controller; + +import com.suisung.mall.common.api.CommonResult; +import com.suisung.mall.common.modules.base.ShopBaseProductBrand; +import com.suisung.mall.common.pojo.res.ThirdApiRes; +import com.suisung.mall.shop.sync.service.SyncThirdDataService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import java.util.List; + +@Api(tags = "第三方数据同步") +@RestController +@RequestMapping("/shop/sync/third") +public class SyncThirdDataController { + @Resource + private SyncThirdDataService syncThirdDataService; + + @ApiOperation(value = "商品品牌数据同步", notes = "商品品牌数据同步") + @RequestMapping(value = "/goods/brand", method = RequestMethod.POST) + public ThirdApiRes syncGoodsBrand(@RequestBody String brandListJSON) { + return syncThirdDataService.saveOrUpdateShopBaseProductBrandBatch(brandListJSON); + } + + @ApiOperation(value = "商品辅助属性数据同步", notes = "商品辅助属性数据同步") + @RequestMapping(value = "/goods/assist", method = RequestMethod.POST) + public ThirdApiRes syncGoodsAssist(@RequestBody String reqBody) { + return null; + } + + @ApiOperation(value = "商品分类数据同步", notes = "商品分类数据同步") + @RequestMapping(value = "/goods/category", method = RequestMethod.POST) + public ThirdApiRes syncGoodsCategory(@RequestBody String reqBody) { + return null; + } + + @ApiOperation(value = "商品数据同步", notes = "商品数据同步") + @RequestMapping(value = "/goods", method = RequestMethod.POST) + public ThirdApiRes syncGoods(@RequestBody String reqBody) { + return null; + } + + @ApiOperation(value = "会员数据同步", notes = "会员数据同步") + @RequestMapping(value = "/member", method = RequestMethod.POST) + public ThirdApiRes syncMember(@RequestBody String reqBody) { + return null; + } + + +} diff --git a/mall-shop/src/main/java/com/suisung/mall/shop/sync/mapper/SyncAppMapper.java b/mall-shop/src/main/java/com/suisung/mall/shop/sync/mapper/SyncAppMapper.java new file mode 100644 index 00000000..7a59d401 --- /dev/null +++ b/mall-shop/src/main/java/com/suisung/mall/shop/sync/mapper/SyncAppMapper.java @@ -0,0 +1,17 @@ +/* + * Copyright (c) 2025. 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.sync.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.suisung.mall.common.modules.sync.SyncApp; +import org.springframework.stereotype.Repository; + +@Repository +public interface SyncAppMapper extends BaseMapper { +} diff --git a/mall-shop/src/main/java/com/suisung/mall/shop/sync/mapper/SyncThirdDataMapper.java b/mall-shop/src/main/java/com/suisung/mall/shop/sync/mapper/SyncThirdDataMapper.java new file mode 100644 index 00000000..4c3e4173 --- /dev/null +++ b/mall-shop/src/main/java/com/suisung/mall/shop/sync/mapper/SyncThirdDataMapper.java @@ -0,0 +1,15 @@ +/* + * Copyright (c) 2025. 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.sync.mapper; + +import org.springframework.stereotype.Repository; + +@Repository +public interface SyncThirdDataMapper { +} diff --git a/mall-shop/src/main/java/com/suisung/mall/shop/sync/service/SyncAppService.java b/mall-shop/src/main/java/com/suisung/mall/shop/sync/service/SyncAppService.java new file mode 100644 index 00000000..b3c741a1 --- /dev/null +++ b/mall-shop/src/main/java/com/suisung/mall/shop/sync/service/SyncAppService.java @@ -0,0 +1,69 @@ +/* + * Copyright (c) 2025. 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.sync.service; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.suisung.mall.common.modules.sync.SyncApp; + +public interface SyncAppService { + + /** + * 根据 appId 获取一条记录 + * @param appId + * @return + */ + SyncApp getSyncApp(String appId); + + /** + * 根据关键字搜索记录分页列表 + * @param keyword + * @param status + * @param pageNum + * @param pageSize + * @return + */ + IPage pageSyncAppList(String keyword, Integer status, Integer pageNum, Integer pageSize); + + /** + * 新增一条记录 + * @param syncApp + * @return + */ + Boolean addSyncApp(SyncApp syncApp); + + /** + * 修改一条记录 + * @param syncApp + * @return + */ + Boolean updateSyncApp(SyncApp syncApp); + + /** + * 修改 app key 和 app 密钥 + * @param appId + * @param appKey + * @param appSecret + * @return + */ + Boolean updateAppKey(String appId, String appKey, String appSecret); + + /** + * 删除一条记录 + * @param appId + * @return + */ + Boolean deleteSyncApp(String appId); + + /** + * 删除一条记录 + * @param id + * @return + */ + Boolean deleteSyncApp(Long id); +} diff --git a/mall-shop/src/main/java/com/suisung/mall/shop/sync/service/SyncThirdDataService.java b/mall-shop/src/main/java/com/suisung/mall/shop/sync/service/SyncThirdDataService.java new file mode 100644 index 00000000..5a659b7c --- /dev/null +++ b/mall-shop/src/main/java/com/suisung/mall/shop/sync/service/SyncThirdDataService.java @@ -0,0 +1,24 @@ +/* + * Copyright (c) 2025. 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.sync.service; + +import com.suisung.mall.common.modules.base.ShopBaseProductBrand; +import com.suisung.mall.common.pojo.res.ThirdApiRes; + +import java.util.List; + +public interface SyncThirdDataService { + + /** + * 批量保存商品品牌记录 + * @param brandListJSON + * @return + */ + ThirdApiRes saveOrUpdateShopBaseProductBrandBatch(String brandListJSON); +} diff --git a/mall-shop/src/main/java/com/suisung/mall/shop/sync/service/impl/SyncAppServiceImpl.java b/mall-shop/src/main/java/com/suisung/mall/shop/sync/service/impl/SyncAppServiceImpl.java new file mode 100644 index 00000000..08b7ffb2 --- /dev/null +++ b/mall-shop/src/main/java/com/suisung/mall/shop/sync/service/impl/SyncAppServiceImpl.java @@ -0,0 +1,159 @@ +/* + * Copyright (c) 2025. 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.sync.service.impl; + +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.suisung.mall.common.modules.sixun.SxSyncGoods; +import com.suisung.mall.common.modules.sync.SyncApp; +import com.suisung.mall.core.web.service.impl.BaseServiceImpl; +import com.suisung.mall.shop.sixun.mapper.SxSyncGoodsMapper; +import com.suisung.mall.shop.sixun.service.SxSyncGoodsService; +import com.suisung.mall.shop.sync.mapper.SyncAppMapper; +import com.suisung.mall.shop.sync.service.SyncAppService; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.function.Consumer; + +@Service +public class SyncAppServiceImpl extends BaseServiceImpl implements SyncAppService { + + @Resource + private SyncAppMapper syncAppMapper; + + /** + * 根据 appId 获取一条记录 + * + * @param appId + * @return + */ + @Override + public SyncApp getSyncApp(String appId) { + if (StrUtil.isBlank(appId)) { + return null; + } + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("app_id", appId); + return getOne(queryWrapper); + } + + /** + * 根据关键字搜索记录分页列表 + * + * @param keyword + * @param status + * @param pageNum + * @param pageSize + * @return + */ + @Override + public IPage pageSyncAppList(String keyword, Integer status, Integer pageNum, Integer pageSize) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.like("name", keyword); + + QueryWrapper queryWrapper2 = new QueryWrapper<>(); + queryWrapper2.like("intro", keyword).or((Consumer>) queryWrapper); + + if(status!=null && status>0){ + queryWrapper.eq("status",status); + queryWrapper2.eq("status",status); + } + + return lists(queryWrapper2,pageNum,pageSize); + } + + /** + * 新增一条记录 + * + * @param syncApp + * @return + */ + @Override + public Boolean addSyncApp(SyncApp syncApp) { + if(syncApp==null){ + return false; + } + return add(syncApp); + } + + /** + * 修改一条记录 + * + * @param syncApp + * @return + */ + @Override + public Boolean updateSyncApp(SyncApp syncApp) { + if(syncApp==null){ + return false; + } + return updateById(syncApp); + } + + /** + * 修改 app key 和 app 密钥 + * + * @param appId + * @param appKey + * @param appSecret + * @return + */ + @Override + public Boolean updateAppKey(String appId, String appKey, String appSecret) { + if (appId == null || (appKey == null && appSecret == null)) { + return false; + } + + UpdateWrapper updateWrapper = new UpdateWrapper<>(); + updateWrapper.eq("app_id", appId); + if (StrUtil.isNotBlank(appKey)) { + updateWrapper.eq("app_key", appKey); + } + + if (StrUtil.isNotBlank(appSecret)) { + updateWrapper.eq("app_secret", appSecret); + } + + return update(updateWrapper); + } + + /** + * 删除一条记录 + * + * @param appId + * @return + */ + @Override + public Boolean deleteSyncApp(String appId) { + if (appId == null) { + return false; + } + + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("app_id", appId); + return remove(queryWrapper); + } + + /** + * 删除一条记录 + * + * @param id + * @return + */ + @Override + public Boolean deleteSyncApp(Long id) { + if (id == null) { + return false; + } + return remove(id); + } +} 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 new file mode 100644 index 00000000..ac61c348 --- /dev/null +++ b/mall-shop/src/main/java/com/suisung/mall/shop/sync/service/impl/SyncThirdDataServiceImpl.java @@ -0,0 +1,78 @@ +/* + * Copyright (c) 2025. 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.sync.service.impl; + +import cn.hutool.core.util.StrUtil; +import cn.hutool.json.JSONArray; +import cn.hutool.json.JSONObject; +import cn.hutool.json.JSONUtil; +import com.suisung.mall.common.modules.base.ShopBaseProductBrand; +import com.suisung.mall.common.modules.base.ShopBaseProductCategory; +import com.suisung.mall.common.pojo.res.ThirdApiRes; +import com.suisung.mall.common.utils.I18nUtil; +import com.suisung.mall.shop.base.service.ShopBaseProductBrandService; +import com.suisung.mall.shop.base.service.ShopBaseProductCategoryService; +import com.suisung.mall.shop.sync.service.SyncThirdDataService; +import org.springframework.stereotype.Service; +import org.springframework.util.StringUtils; + +import javax.annotation.Resource; +import java.util.List; + +@Service +public class SyncThirdDataServiceImpl implements SyncThirdDataService { + @Resource + private ShopBaseProductBrandService productBrandService; + + @Resource + private ShopBaseProductCategoryService productCategoryService; + + /** + * 批量保存商品品牌记录 + * + * @param brandListJSON + * @return + */ + @Override + public ThirdApiRes saveOrUpdateShopBaseProductBrandBatch(String brandListJSON) { + // TODO 验签、appid,必要参数判断 + + if (StringUtils.isEmpty(brandListJSON)) { + return new ThirdApiRes().fail(1003, I18nUtil._("缺少必要参数!")); + } + + List goodBrandList = JSONUtil.toList(brandListJSON, ShopBaseProductBrand.class); + if (goodBrandList == null) { + return new ThirdApiRes().fail(1004, I18nUtil._("请求参数发生异常!")); + } + + if (goodBrandList != null && goodBrandList.size() > 500) { + return new ThirdApiRes().fail(1004, I18nUtil._("单次同步记录最多500条!")); + } + + JSONArray brandListJSONObj = JSONUtil.parseArray(brandListJSON); + + int count = 0; + for (int i = 0; i < goodBrandList.size(); i++) { + goodBrandList.get(i).setStore_id(3); // app 记录传进来 + // 处理大分类字段 + JSONObject o = (JSONObject) brandListJSONObj.get(i); + if (o != null && StrUtil.isNotBlank(o.getStr("category"))) { + ShopBaseProductCategory cate = productCategoryService.getCategoryByName(o.getStr("category")); + if (cate != null) { + goodBrandList.get(i).setCategory_id(cate.getCategory_id()); + } + } + + count += productBrandService.saveOrUpdateBrand2(goodBrandList.get(i)); + } + + return new ThirdApiRes().success("成功同步" + count + "条记录!"); + } +} diff --git a/pom.xml b/pom.xml index fe21f449..aa6e894c 100644 --- a/pom.xml +++ b/pom.xml @@ -315,11 +315,11 @@ 114.132.210.208:8718 - 127.0.0.1 + 42.194.196.179 3306 mall_dev root - 123456 + B1x1GuKZr55PPmox com.mysql.cj.jdbc.Driver 114.132.210.208 @@ -362,11 +362,11 @@ 114.132.210.208:8718 - 114.132.210.208 + 42.194.196.179 3306 - fafamall - web_dev - Abc654321$^ + mall_dev + fafamall + brCnv0qLt8s0VqhI com.mysql.cj.jdbc.Driver 114.132.210.208