From a1178b2e22ea2e23c3fa530133e8939d7a8fd68b Mon Sep 17 00:00:00 2001 From: cabbage <281119120@qq.com> Date: Mon, 11 Aug 2025 18:00:55 +0800 Subject: [PATCH] =?UTF-8?q?##=20=E5=85=A8=E7=BD=91=E5=95=86=E5=93=81?= =?UTF-8?q?=E5=BA=93=E5=AD=98=E5=90=8C=E6=AD=A5=EF=BC=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../api/ApiAllProductController.java | 118 ++++++++++++++++++ .../manage/AllProductDetailController.java | 6 +- .../sale/all/param/SyncDataDetailParam.java | 18 +++ .../com/hzs/sale/all/param/SyncDateParam.java | 24 ++++ .../service/impl/AllProductServiceImpl.java | 4 +- .../service/impl/SaOrderServiceImpl.java | 64 ++++++++++ .../enums/controller/EnumsController.java | 2 +- .../com/hzs/common/core/config/BdConfig.java | 12 ++ .../hzs/common/core/enums/EProductSource.java | 55 -------- .../com/hzs/common/core/enums/ESysName.java | 34 ++++- .../hzs/common/core/utils/ThreadUtils.java | 11 +- bd-gateway/src/main/resources/bootstrap.yml | 11 +- 12 files changed, 276 insertions(+), 83 deletions(-) create mode 100644 bd-business/bd-business-sale/src/main/java/com/hzs/sale/all/controller/api/ApiAllProductController.java create mode 100644 bd-business/bd-business-sale/src/main/java/com/hzs/sale/all/param/SyncDataDetailParam.java create mode 100644 bd-business/bd-business-sale/src/main/java/com/hzs/sale/all/param/SyncDateParam.java delete mode 100644 bd-common/bd-common-core/src/main/java/com/hzs/common/core/enums/EProductSource.java diff --git a/bd-business/bd-business-sale/src/main/java/com/hzs/sale/all/controller/api/ApiAllProductController.java b/bd-business/bd-business-sale/src/main/java/com/hzs/sale/all/controller/api/ApiAllProductController.java new file mode 100644 index 00000000..c8932031 --- /dev/null +++ b/bd-business/bd-business-sale/src/main/java/com/hzs/sale/all/controller/api/ApiAllProductController.java @@ -0,0 +1,118 @@ +package com.hzs.sale.all.controller.api; + +import cn.hutool.core.codec.Base64Decoder; +import cn.hutool.core.codec.Base64Encoder; +import cn.hutool.core.collection.CollectionUtil; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.hzs.common.core.constant.MagicNumberConstants; +import com.hzs.common.core.enums.ESysName; +import com.hzs.common.core.utils.StringUtils; +import com.hzs.common.core.web.controller.BaseController; +import com.hzs.common.core.web.domain.AjaxResult; +import com.hzs.common.domain.sale.all.AllProduct; +import com.hzs.common.domain.sale.all.AllProductDetail; +import com.hzs.sale.all.param.SyncDataDetailParam; +import com.hzs.sale.all.param.SyncDateParam; +import com.hzs.sale.all.service.IAllProductDetailService; +import com.hzs.sale.all.service.IAllProductService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.stream.Collectors; + +@RestController +@RequestMapping("/api/all-product") +@Slf4j +public class ApiAllProductController extends BaseController { + + @Autowired + private IAllProductService iAllProductService; + @Autowired + private IAllProductDetailService iAllProductDetailService; + + @PostMapping("/sync-data") + public AjaxResult syncData(@RequestHeader("authorization") String authorization, + @RequestBody SyncDateParam param) { + log.info("全网产品同步数据, authorization: {}", authorization); + if (StringUtils.isEmpty(authorization)) { + return AjaxResult.error("缺少参数"); + } + log.info("全网产品同步数据, param: {}", param); + if (null == param) { + return AjaxResult.error("缺少参数"); + } + + String header = new String(Base64Decoder.decode(authorization)); + ESysName headSys = ESysName.getEnumByValue(header.split("!")[0]); + if (null == headSys) { + log.warn("head请求来源为空"); + return AjaxResult.error("数据错误"); + } + if (!headSys.getValue().equals(param.getSource())) { + log.warn("head请求来源错误"); + return AjaxResult.error("数据错误"); + } + String headOrder = header.split("!")[1]; + if (null == headOrder) { + log.warn("head请求订单为空"); + return AjaxResult.error("数据错误"); + } + if (!headOrder.equals(param.getOrderCode())) { + log.warn("head请求订单错误"); + return AjaxResult.error("数据错误"); + } + + if (iAllProductDetailService.count(Wrappers.lambdaQuery() + .eq(AllProductDetail::getSource, param.getSource()) + .eq(AllProductDetail::getOrderCode, param.getOrderCode()) + ) > 0) { + log.info("订单已经处理过"); + return AjaxResult.success(); + } + + // 产品明细 + List detailList = param.getDetailList(); + if (CollectionUtil.isNotEmpty(detailList)) { + // 获取仓储编号等数据 + Set wmsCodeList = detailList.stream().map(SyncDataDetailParam::getWmsCode).collect(Collectors.toSet()); + List productList = iAllProductService.list(Wrappers.lambdaQuery() + .in(AllProduct::getWmsCode, wmsCodeList) + ); + Map wmsCodeMap = productList.stream().collect(Collectors.toMap(AllProduct::getWmsCode, item -> item)); + + // 商品明细列表 + List productDetailList = new ArrayList<>(); + for (SyncDataDetailParam syncDataDetailParam : detailList) { + AllProduct allProduct = wmsCodeMap.get(syncDataDetailParam.getWmsCode()); + if (null == allProduct) { + // 仓储编号不存在,则创建 + allProduct = AllProduct.builder() + .wmsCode(syncDataDetailParam.getWmsCode()) + .remark("仓储编号不存在,自动创建") + .build(); + allProduct.setPkCreator(MagicNumberConstants.PK_ADMIN); + iAllProductService.save(allProduct); + wmsCodeMap.put(syncDataDetailParam.getWmsCode(), allProduct); + } + + AllProductDetail productDetail = AllProductDetail.builder() + .pkAllProduct(allProduct.getPkId()) + .source(param.getSource()) + .orderCode(param.getOrderCode()) + .changeNum(syncDataDetailParam.getChangeNum() * -1) + .remark(param.getSource() + "系统,订单编号:" + param.getOrderCode() + ",扣减:" + syncDataDetailParam.getWmsCode() + "库存" + syncDataDetailParam.getChangeNum()) + .build(); + productDetail.setPkCreator(1L); + productDetailList.add(productDetail); + } + iAllProductService.syncData(productDetailList); + } + return AjaxResult.success(); + } + +} diff --git a/bd-business/bd-business-sale/src/main/java/com/hzs/sale/all/controller/manage/AllProductDetailController.java b/bd-business/bd-business-sale/src/main/java/com/hzs/sale/all/controller/manage/AllProductDetailController.java index eb0f3fde..3b0e119f 100644 --- a/bd-business/bd-business-sale/src/main/java/com/hzs/sale/all/controller/manage/AllProductDetailController.java +++ b/bd-business/bd-business-sale/src/main/java/com/hzs/sale/all/controller/manage/AllProductDetailController.java @@ -3,7 +3,7 @@ package com.hzs.sale.all.controller.manage; import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.collection.CollectionUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import com.hzs.common.core.enums.EProductSource; +import com.hzs.common.core.enums.ESysName; import com.hzs.common.core.utils.DateUtils; import com.hzs.common.core.utils.StringUtils; import com.hzs.common.core.utils.poi.ExcelUtil; @@ -62,7 +62,7 @@ public class AllProductDetailController extends BaseController { if (CollectionUtil.isNotEmpty(productList)) { for (AllProductDetail allProductDetail : productList) { AllProductDetailQueryVO vo = BeanUtil.copyProperties(allProductDetail, AllProductDetailQueryVO.class); - vo.setSourceVal(EProductSource.getLabelByValue(vo.getSource())); + vo.setSourceVal(ESysName.getLabelByValue(vo.getSource())); resultList.add(vo); } } @@ -101,7 +101,7 @@ public class AllProductDetailController extends BaseController { if (CollectionUtil.isNotEmpty(productList)) { for (AllProductDetail allProductDetail : productList) { AllProductDetailQueryVO vo = BeanUtil.copyProperties(allProductDetail, AllProductDetailQueryVO.class); - vo.setSourceVal(EProductSource.getLabelByValue(vo.getSource())); + vo.setSourceVal(ESysName.getLabelByValue(vo.getSource())); resultList.add(vo); } } diff --git a/bd-business/bd-business-sale/src/main/java/com/hzs/sale/all/param/SyncDataDetailParam.java b/bd-business/bd-business-sale/src/main/java/com/hzs/sale/all/param/SyncDataDetailParam.java new file mode 100644 index 00000000..f1db64d8 --- /dev/null +++ b/bd-business/bd-business-sale/src/main/java/com/hzs/sale/all/param/SyncDataDetailParam.java @@ -0,0 +1,18 @@ +package com.hzs.sale.all.param; + +import lombok.Data; + +@Data +public class SyncDataDetailParam { + + /** + * 仓储编号 + */ + private String wmsCode; + + /** + * 变动数量 + */ + private Integer changeNum; + +} diff --git a/bd-business/bd-business-sale/src/main/java/com/hzs/sale/all/param/SyncDateParam.java b/bd-business/bd-business-sale/src/main/java/com/hzs/sale/all/param/SyncDateParam.java new file mode 100644 index 00000000..325b8bca --- /dev/null +++ b/bd-business/bd-business-sale/src/main/java/com/hzs/sale/all/param/SyncDateParam.java @@ -0,0 +1,24 @@ +package com.hzs.sale.all.param; + +import lombok.Data; + +import java.util.List; + +@Data +public class SyncDateParam { + + /** + * 来源系统 + */ + private String source; + /** + * 订单编号 + */ + private String orderCode; + + /** + * 产品明细列表 + */ + private List detailList; + +} diff --git a/bd-business/bd-business-sale/src/main/java/com/hzs/sale/all/service/impl/AllProductServiceImpl.java b/bd-business/bd-business-sale/src/main/java/com/hzs/sale/all/service/impl/AllProductServiceImpl.java index f24d8c00..a6d9a0c4 100644 --- a/bd-business/bd-business-sale/src/main/java/com/hzs/sale/all/service/impl/AllProductServiceImpl.java +++ b/bd-business/bd-business-sale/src/main/java/com/hzs/sale/all/service/impl/AllProductServiceImpl.java @@ -3,7 +3,7 @@ package com.hzs.sale.all.service.impl; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.hzs.common.core.enums.EDelFlag; -import com.hzs.common.core.enums.EProductSource; +import com.hzs.common.core.enums.ESysName; import com.hzs.common.domain.sale.all.AllProduct; import com.hzs.common.domain.sale.all.AllProductDetail; import com.hzs.sale.all.mapper.AllProductMapper; @@ -32,7 +32,7 @@ public class AllProductServiceImpl extends ServiceImpl impl @Autowired private ISaOrderItemsService iSaOrderItemsService; @Autowired + private IBdProductService iBdProductService; + @Autowired private IBdProductExtendService iBdProductExtendService; @Autowired private IBdWaresSpecsRelationService iBdWaresSpecsRelationService; @@ -759,6 +768,9 @@ public class SaOrderServiceImpl extends ServiceImpl impl } try { + // 同步全网产品库存 + this.allProductSync(saOrderExt); + log.info("生产活动消息,activity.exchange:{}", JSONUtil.toJsonStr(saOrderExt)); rabbitTemplate.convertAndSend(RabbitMqConstants.ACTIVITY_EXCHANGE, RabbitMqConstants.ACTIVITY_KEY, saOrderExt); // 推送秒结数据处理 -- 注册订单 @@ -871,6 +883,9 @@ public class SaOrderServiceImpl extends ServiceImpl impl throw new RuntimeException("保存会员失败!!!"); } try { + // 同步全网产品库存 + this.allProductSync(saOrderExt); + rabbitTemplate.convertAndSend(RabbitMqConstants.ACTIVITY_EXCHANGE, RabbitMqConstants.ACTIVITY_KEY, saOrderExt); // 推送秒结数据处理 -- 升级订单 rabbitTemplate.convertAndSend(RabbitMqConstants.ORDER_SECOND_EXCHANGE, RabbitMqConstants.ORDER_SECOND_KEY, saOrderExt); @@ -967,6 +982,9 @@ public class SaOrderServiceImpl extends ServiceImpl impl } try { + // 同步全网产品库存 + this.allProductSync(saOrderExt); + // 推送秒结数据处理 -- 其它订单 rabbitTemplate.convertAndSend(RabbitMqConstants.ORDER_SECOND_EXCHANGE, RabbitMqConstants.ORDER_SECOND_KEY, saOrderExt); // if (EOrderType.RENEWAL_ORDER.getValue() == saOrderExt.getOrderType()) { @@ -2437,4 +2455,50 @@ public class SaOrderServiceImpl extends ServiceImpl impl } } + /** + * 同步全网产品库存 + * + * @param saOrderExt + */ + private void allProductSync(SaOrderExt saOrderExt) { + Map productMap = iBdProductService.queryProductMap(saOrderExt.getOrderItemsList().stream().map(SaOrderItems::getPkProduct).collect(Collectors.toSet()), null); + // 开启线程调用全网产品库存 + // 请求参数 + Map bodyMap = new HashMap<>(); + bodyMap.put("source", BdConfig.getSysName()); + bodyMap.put("orderCode", saOrderExt.getOrderCode()); + List> bodyDetailList = new ArrayList<>(); + for (SaOrderItems saOrderItems : saOrderExt.getOrderItemsList()) { + Map detailMap = new HashMap<>(); + detailMap.put("wmsCode", productMap.get(saOrderItems.getPkProduct()).getWmsCode()); + detailMap.put("changeNum", saOrderItems.getQuantity()); + bodyDetailList.add(detailMap); + } + bodyMap.put("detailList", bodyDetailList); + // 请求头 + String header = Base64Encoder.encode(BdConfig.getSysName() + "!" + saOrderExt.getOrderCode()); + ThreadUtils.threadPoolExecutor.submit(() -> { + log.info("===header: {}", header); + log.info("===bodyMap: {}", bodyMap); + HttpRequest httpRequest = HttpUtil.createPost(BdConfig.getProductSyncUrl()); + httpRequest.header("authorization", header); + httpRequest.body(JSONUtil.toJsonStr(bodyMap)); + httpRequest.setReadTimeout(5000); + String resultStr; + try { + resultStr = httpRequest.execute().body(); + AjaxResult ajaxResult = JSONUtil.toBean(resultStr, AjaxResult.class); + log.info("同步产品,resultStr: {}", resultStr); + if (!ajaxResult.isSuccess()) { + resultStr = httpRequest.execute().body(); + log.info("同步产品失败重试,resultStr: {}", resultStr); + } + } catch (Exception e) { + log.error("同步产品库存失败", e); + resultStr = httpRequest.execute().body(); + log.info("同步产品异常重试,resultStr: {}", resultStr); + } + }); + } + } diff --git a/bd-business/bd-business-system/src/main/java/com/hzs/system/enums/controller/EnumsController.java b/bd-business/bd-business-system/src/main/java/com/hzs/system/enums/controller/EnumsController.java index 08243a1d..01daaf44 100644 --- a/bd-business/bd-business-system/src/main/java/com/hzs/system/enums/controller/EnumsController.java +++ b/bd-business/bd-business-system/src/main/java/com/hzs/system/enums/controller/EnumsController.java @@ -2631,7 +2631,7 @@ public class EnumsController extends BaseController { @GetMapping("/product-source") public AjaxResult productSource() { List> enumEntityList = new ArrayList<>(); - for (EProductSource value : EProductSource.values()) { + for (ESysName value : ESysName.values()) { HashMap tmpEnumEntity = new HashMap<>(); tmpEnumEntity.put("value", value.getValue()); tmpEnumEntity.put("label", value.getLabel()); diff --git a/bd-common/bd-common-core/src/main/java/com/hzs/common/core/config/BdConfig.java b/bd-common/bd-common-core/src/main/java/com/hzs/common/core/config/BdConfig.java index dbc4128c..e42cc107 100644 --- a/bd-common/bd-common-core/src/main/java/com/hzs/common/core/config/BdConfig.java +++ b/bd-common/bd-common-core/src/main/java/com/hzs/common/core/config/BdConfig.java @@ -37,6 +37,11 @@ public class BdConfig { */ private static String android; + /** + * 商品同步地址 + */ + private static String productSyncUrl; + public static String getSysName() { return sysName; } @@ -85,4 +90,11 @@ public class BdConfig { BdConfig.android = android; } + public static String getProductSyncUrl() { + return productSyncUrl; + } + + public void setProductSyncUrl(String productSyncUrl) { + BdConfig.productSyncUrl = productSyncUrl; + } } diff --git a/bd-common/bd-common-core/src/main/java/com/hzs/common/core/enums/EProductSource.java b/bd-common/bd-common-core/src/main/java/com/hzs/common/core/enums/EProductSource.java deleted file mode 100644 index 50edd419..00000000 --- a/bd-common/bd-common-core/src/main/java/com/hzs/common/core/enums/EProductSource.java +++ /dev/null @@ -1,55 +0,0 @@ -package com.hzs.common.core.enums; - -import lombok.AllArgsConstructor; -import lombok.Getter; - -/** - * 产品数据来源 - */ -@AllArgsConstructor -@Getter -public enum EProductSource { - - /** - * 管理后台 - */ - MANAGE("MANAGE", "管理后台"), - - /** - * 乐学 - */ - CN("CN", "CN"), - /** - * 北大 - */ - BD("BD", "BD"), - /** - * 新零售 - */ - BF("BF", "BF"), - /** - * 新零售店铺 - */ - BL("BL", "BL"), - - ; - - /** - * 实际值 - */ - private final String value; - /** - * 显示标签 - */ - private final String label; - - public static String getLabelByValue(String value) { - for (EProductSource enums : EProductSource.values()) { - if (enums.getValue().equals(value)) { - return enums.getLabel(); - } - } - return ""; - } - -} diff --git a/bd-common/bd-common-core/src/main/java/com/hzs/common/core/enums/ESysName.java b/bd-common/bd-common-core/src/main/java/com/hzs/common/core/enums/ESysName.java index 7262476f..c739ce20 100644 --- a/bd-common/bd-common-core/src/main/java/com/hzs/common/core/enums/ESysName.java +++ b/bd-common/bd-common-core/src/main/java/com/hzs/common/core/enums/ESysName.java @@ -10,15 +10,24 @@ import lombok.Getter; @Getter public enum ESysName { + MANAGE("manage", "后台管理"), + /** * 乐学 */ - LX("lx", "乐学"), - + LX("lx", "乐学CN"), /** * 北大 */ - BD("bd", "北大"), + BD("bd", "北大BD"), + /** + * 新零售 + */ + BF("bf", "新零售BF"), + /** + * 新零售店铺 + */ + BL("bl", "新零售店铺BL"), ; @@ -31,4 +40,23 @@ public enum ESysName { */ private final String label; + public static ESysName getEnumByValue(String value) { + for (ESysName enums : ESysName.values()) { + if (enums.getValue().equals(value)) { + return enums; + } + } + return null; + } + + + public static String getLabelByValue(String value) { + for (ESysName enums : ESysName.values()) { + if (enums.getValue().equals(value)) { + return enums.getLabel(); + } + } + return ""; + } + } diff --git a/bd-common/bd-common-core/src/main/java/com/hzs/common/core/utils/ThreadUtils.java b/bd-common/bd-common-core/src/main/java/com/hzs/common/core/utils/ThreadUtils.java index a1b48ce4..053704b0 100644 --- a/bd-common/bd-common-core/src/main/java/com/hzs/common/core/utils/ThreadUtils.java +++ b/bd-common/bd-common-core/src/main/java/com/hzs/common/core/utils/ThreadUtils.java @@ -6,21 +6,12 @@ import org.springframework.stereotype.Component; import java.util.concurrent.*; /** - * Description: 线程工具类 - * Author: jiang chao - * Time: 2022/8/30 10:10 - * Classname: ThreadUtil - * PackageName: com.hzs.common.core.utils + * 线程工具类 */ @Slf4j @Component public class ThreadUtils { - /** - * 初始化创建4个长度的固定线程池 - */ - public static ExecutorService executorService = Executors.newFixedThreadPool(4); - /** * 创建线程池 */ diff --git a/bd-gateway/src/main/resources/bootstrap.yml b/bd-gateway/src/main/resources/bootstrap.yml index d01ba077..5b27e7c1 100644 --- a/bd-gateway/src/main/resources/bootstrap.yml +++ b/bd-gateway/src/main/resources/bootstrap.yml @@ -149,15 +149,6 @@ security: - /member/manage/handle-business/online-petition-confirm - /member/manage/member-empty/submit - /member/manager/zeroRevoke/petition - - /activity/manage/gift-benefits/save-petition - - /activity/manage/gift-benefits/up-petition - - /activity/manage/gift-benefits/del-petition - - /activity/manage/new-people/save-petition - - /activity/manage/new-people/up-petition - - /activity/manage/new-people/del-petition - - /activity/manage/ac-bean-rule-config/save-petition - - /activity/manage/ac-bean-rule-config/up-petition - - /activity/manage/ac-bean-rule-config/del-petition - /activity/manage/tourism/online-petition - /activity/manage/wares-rule-config/save-activity - /activity/manage/wares-rule-config/update @@ -189,6 +180,8 @@ security: # 188分享注册白名单 - /member/api/member/fans-convert-code/* - /member/api/member/fans-order/* + # 库存商品同步 + - /sale/api/all-product/sync-data # 日志配置 logging: