From b0f0aec94b2df0e872cc71d3622424b1496b3235 Mon Sep 17 00:00:00 2001 From: wangw <1594593906@qq.com> Date: Fri, 10 Apr 2026 13:59:52 +0800 Subject: [PATCH] =?UTF-8?q?=E5=95=86=E5=93=81=E5=88=97=E8=A1=A8=20?= =?UTF-8?q?=E7=BB=93=E6=9E=84=20=E8=80=97=E6=9D=90=E5=BA=93=E5=AD=98=20?= =?UTF-8?q?=E5=88=97=E8=A1=A8=E6=8E=A5=E5=8F=A3=20=E8=80=97=E6=9D=90=20?= =?UTF-8?q?=E5=BA=93=E5=AD=98=E9=A2=84=E8=AD=A6=E5=80=BC=E6=8E=A8=E9=80=81?= =?UTF-8?q?=E6=9B=B4=E6=96=B0=20cons.info.change.queue?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/admin/ConsInfoController.java | 29 +++++------- .../controller/admin/ProductController.java | 4 +- .../java/com/czg/config/RabbitConfig.java | 10 +++++ .../java/com/czg/config/RabbitConstants.java | 1 + .../java/com/czg/config/RabbitPublisher.java | 9 ++++ .../java/com/czg/product/dto/ConsInfoDTO.java | 4 -- .../czg/product/dto/ProdConsRelationDTO.java | 4 ++ .../java/com/czg/product/entity/ConsInfo.java | 4 -- .../czg/product/service/ConsInfoService.java | 4 ++ .../product/service/ConsStockFlowService.java | 13 +++++- .../service/ProdConsRelationService.java | 2 +- .../czg/product/service/ProductService.java | 7 +-- .../com/czg/product/vo/ConsStockRecord.java | 6 +++ .../impl/OrderInfoCustomServiceImpl.java | 6 +-- .../service/impl/OrderInfoRpcServiceImpl.java | 23 ++-------- .../service/impl/OrderPayServiceImpl.java | 1 + .../mapper/ProdConsRelationMapper.java | 2 + .../service/impl/ConsInfoServiceImpl.java | 12 +++-- .../impl/ConsStockFlowServiceImpl.java | 45 ++++++++++++------- .../impl/ProdConsRelationServiceImpl.java | 10 +++++ .../service/impl/ProductRpcServiceImpl.java | 44 +++--------------- .../service/impl/ProductServiceImpl.java | 23 +++++++--- .../mapper/ProdConsRelationMapper.xml | 13 ++++++ 23 files changed, 151 insertions(+), 125 deletions(-) create mode 100644 cash-common/cash-common-service/src/main/java/com/czg/product/vo/ConsStockRecord.java diff --git a/cash-api/product-server/src/main/java/com/czg/controller/admin/ConsInfoController.java b/cash-api/product-server/src/main/java/com/czg/controller/admin/ConsInfoController.java index b4a58f8f3..0710cae7b 100644 --- a/cash-api/product-server/src/main/java/com/czg/controller/admin/ConsInfoController.java +++ b/cash-api/product-server/src/main/java/com/czg/controller/admin/ConsInfoController.java @@ -9,6 +9,7 @@ import com.czg.product.param.ConsSubUnitParam; import com.czg.product.service.ConsInfoService; import com.czg.product.service.ShopSyncService; import com.czg.product.vo.ConsStatisticsVo; +import com.czg.product.vo.ConsStockRecord; import com.czg.resp.CzgResult; import com.czg.sa.StpKit; import com.czg.utils.AssertUtil; @@ -44,18 +45,25 @@ public class ConsInfoController { * 分页 */ @GetMapping("page") - @OperationLog("耗材信息-分页") //@SaAdminCheckPermission("consInfo:page") public CzgResult> getConsInfoPage(ConsInfoDTO param) { Page data = consInfoService.getConsInfoPage(param); return CzgResult.success(data); } + /** + * 列表 + */ + @GetMapping("consStock") + public CzgResult> getConsStockList(Long shopId) { + return CzgResult.success(consInfoService.getConsStockList(shopId)); + } + + /** * 列表 */ @GetMapping("list") - @OperationLog("耗材信息-列表") //@SaAdminCheckPermission("consInfo:list") public CzgResult> getConsInfoList(ConsInfoDTO param) { List data = consInfoService.getConsInfoList(param); @@ -68,7 +76,6 @@ public class ConsInfoController { * @param id 耗材信息id */ @GetMapping("{id}") - @OperationLog("耗材信息-详情") //@SaAdminCheckPermission("consInfo:info") public CzgResult getConsInfoById(@PathVariable("id") Long id) { AssertUtil.isNull(id, "{}不能为空", "id"); @@ -164,21 +171,6 @@ public class ConsInfoController { return CzgResult.success(); } - /** - * 退款退回开关 - * - * @param id 耗材信息id - */ - @PostMapping("onOffIsRefundStock") - @OperationLog("耗材信息-退款退回开关") - //@SaAdminCheckPermission("consInfo:on-off") - public CzgResult onOffIsRefundStock(@RequestParam Long id, @RequestParam Integer isRefundStockConsInfo) { - //效验数据 - AssertUtil.isNull(id, "{}不能为空", "id"); - AssertUtil.isNull(isRefundStockConsInfo, "退款退回开关值不能为空"); - consInfoService.isRefundStockConsInfo(id, isRefundStockConsInfo); - return CzgResult.success(); - } /** * 编辑副单位 @@ -200,7 +192,6 @@ public class ConsInfoController { * 统计 */ @GetMapping("statistics") - @OperationLog("耗材信息-统计") //@SaAdminCheckPermission("consInfo:info") public CzgResult getConsInfoById(ConsInfoParam param) { Long shopId = StpKit.USER.getShopId(0L); diff --git a/cash-api/product-server/src/main/java/com/czg/controller/admin/ProductController.java b/cash-api/product-server/src/main/java/com/czg/controller/admin/ProductController.java index c47597d53..00b998667 100644 --- a/cash-api/product-server/src/main/java/com/czg/controller/admin/ProductController.java +++ b/cash-api/product-server/src/main/java/com/czg/controller/admin/ProductController.java @@ -30,6 +30,7 @@ import jakarta.servlet.http.HttpServletResponse; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; +import java.util.List; import java.util.Map; @@ -83,7 +84,7 @@ public class ProductController { */ @GetMapping("list") @OperationLog("商品-列表") - public CzgResult> getProductList(@RequestParam(required = false) Long categoryId) { + public CzgResult> getProductList(@RequestParam(required = false) Long categoryId) { return CzgResult.success(productService.getProductCacheList(StpKit.USER.getShopId(), categoryId)); } @@ -231,7 +232,6 @@ public class ProductController { @PostMapping("reportDamage") @OperationLog("商品-报损") public CzgResult reportDamage(@RequestBody ProductReportDamageParam param) { - //TODO 报损功能 ValidatorUtil.validateEntity(param, DefaultGroup.class); productService.reportDamage(param); return CzgResult.success(); diff --git a/cash-common/cash-common-mq/src/main/java/com/czg/config/RabbitConfig.java b/cash-common/cash-common-mq/src/main/java/com/czg/config/RabbitConfig.java index ab5b007cc..5ef28b588 100644 --- a/cash-common/cash-common-mq/src/main/java/com/czg/config/RabbitConfig.java +++ b/cash-common/cash-common-mq/src/main/java/com/czg/config/RabbitConfig.java @@ -125,6 +125,16 @@ public class RabbitConfig { public Binding bindingProductInfoChange(Queue productInfoChangeQueue, DirectExchange exchange) { return BindingBuilder.bind(productInfoChangeQueue).to(exchange).with(activeProfile + "-" + RabbitConstants.Queue.PRODUCT_INFO_CHANGE_QUEUE); } + //------------------------------------------------------ 耗材信息更新 + @Bean + public Queue consInfoChangeQueue() { + return new Queue(activeProfile + "-" + RabbitConstants.Queue.CONS_INFO_CHANGE_QUEUE, true); + } + + @Bean + public Binding bindingConsInfoChange(Queue consInfoChangeQueue, DirectExchange exchange) { + return BindingBuilder.bind(consInfoChangeQueue).to(exchange).with(activeProfile + "-" + RabbitConstants.Queue.CONS_INFO_CHANGE_QUEUE); + } //------------------------------------------------------ 订单退款 @Bean diff --git a/cash-common/cash-common-mq/src/main/java/com/czg/config/RabbitConstants.java b/cash-common/cash-common-mq/src/main/java/com/czg/config/RabbitConstants.java index d4a0a9b69..852d607aa 100644 --- a/cash-common/cash-common-mq/src/main/java/com/czg/config/RabbitConstants.java +++ b/cash-common/cash-common-mq/src/main/java/com/czg/config/RabbitConstants.java @@ -19,6 +19,7 @@ public interface RabbitConstants { public static final String ORDER_HANDOVER_PRINT_QUEUE = "order.handover.print.queue"; public static final String CALL_TABLE_QUEUE = "call.table.print.queue"; public static final String PRODUCT_INFO_CHANGE_QUEUE = "product.info.change.queue"; + public static final String CONS_INFO_CHANGE_QUEUE = "cons.info.change.queue"; /** * 订单商品状态队列 diff --git a/cash-common/cash-common-mq/src/main/java/com/czg/config/RabbitPublisher.java b/cash-common/cash-common-mq/src/main/java/com/czg/config/RabbitPublisher.java index 75137abae..d938d36c7 100644 --- a/cash-common/cash-common-mq/src/main/java/com/czg/config/RabbitPublisher.java +++ b/cash-common/cash-common-mq/src/main/java/com/czg/config/RabbitPublisher.java @@ -102,6 +102,15 @@ public class RabbitPublisher { sendMsg(RabbitConstants.Queue.PRODUCT_INFO_CHANGE_QUEUE, shopId); } + /** + * 商品信息变动消息 + * + * @param shopId 店铺id + */ + public void sendConsInfoChangeMsg(String shopId) { + sendMsg(RabbitConstants.Queue.CONS_INFO_CHANGE_QUEUE, shopId); + } + /** * 排队叫号小票打印 * diff --git a/cash-common/cash-common-service/src/main/java/com/czg/product/dto/ConsInfoDTO.java b/cash-common/cash-common-service/src/main/java/com/czg/product/dto/ConsInfoDTO.java index 0b3a4c4de..89b475ac7 100644 --- a/cash-common/cash-common-service/src/main/java/com/czg/product/dto/ConsInfoDTO.java +++ b/cash-common/cash-common-service/src/main/java/com/czg/product/dto/ConsInfoDTO.java @@ -76,10 +76,6 @@ public class ConsInfoDTO implements Serializable { * 是否检测耗材: 1 检测 0 不检测 */ private Integer isStock; - /** - * 是否退款退回: 1 退回 0 不退回 - */ - private Integer isRefundStock; /** * 第二单位 */ diff --git a/cash-common/cash-common-service/src/main/java/com/czg/product/dto/ProdConsRelationDTO.java b/cash-common/cash-common-service/src/main/java/com/czg/product/dto/ProdConsRelationDTO.java index 419807a92..c0fa507bc 100644 --- a/cash-common/cash-common-service/src/main/java/com/czg/product/dto/ProdConsRelationDTO.java +++ b/cash-common/cash-common-service/src/main/java/com/czg/product/dto/ProdConsRelationDTO.java @@ -41,6 +41,10 @@ public class ProdConsRelationDTO implements Serializable { */ @NotNull(message = "使用数量不能为空", groups = DefaultGroup.class) private BigDecimal surplusStock; + /** + * 耗材预警值 + */ + private BigDecimal conWarning; /** * 创建时间 */ diff --git a/cash-common/cash-common-service/src/main/java/com/czg/product/entity/ConsInfo.java b/cash-common/cash-common-service/src/main/java/com/czg/product/entity/ConsInfo.java index df4239c48..8fdb6eb30 100644 --- a/cash-common/cash-common-service/src/main/java/com/czg/product/entity/ConsInfo.java +++ b/cash-common/cash-common-service/src/main/java/com/czg/product/entity/ConsInfo.java @@ -69,10 +69,6 @@ public class ConsInfo implements Serializable { * 是否检测耗材: 1 检测 0 不检测 */ private Integer isStock; - /** - * 是否退款退回: 1 退回 0 不退回 - */ - private Integer isRefundStock; /** * 第二单位 */ diff --git a/cash-common/cash-common-service/src/main/java/com/czg/product/service/ConsInfoService.java b/cash-common/cash-common-service/src/main/java/com/czg/product/service/ConsInfoService.java index d8f56ab73..1a61fca70 100644 --- a/cash-common/cash-common-service/src/main/java/com/czg/product/service/ConsInfoService.java +++ b/cash-common/cash-common-service/src/main/java/com/czg/product/service/ConsInfoService.java @@ -5,6 +5,7 @@ import com.czg.product.entity.ConsInfo; import com.czg.product.param.ConsInfoParam; import com.czg.product.param.ConsSubUnitParam; import com.czg.product.vo.ConsStatisticsVo; +import com.czg.product.vo.ConsStockRecord; import com.mybatisflex.core.paginate.Page; import com.mybatisflex.core.service.IService; @@ -33,6 +34,9 @@ public interface ConsInfoService extends IService { */ List getConsInfoList(ConsInfoDTO param); + + List getConsStockList(Long shopId); + /** * 获取耗材信息详情 * diff --git a/cash-common/cash-common-service/src/main/java/com/czg/product/service/ConsStockFlowService.java b/cash-common/cash-common-service/src/main/java/com/czg/product/service/ConsStockFlowService.java index a2e308d43..9732df0cf 100644 --- a/cash-common/cash-common-service/src/main/java/com/czg/product/service/ConsStockFlowService.java +++ b/cash-common/cash-common-service/src/main/java/com/czg/product/service/ConsStockFlowService.java @@ -10,6 +10,7 @@ import com.czg.product.vo.ConsCheckStockRecordVo; import com.mybatisflex.core.paginate.Page; import com.mybatisflex.core.service.IService; +import java.math.BigDecimal; import java.util.List; /** @@ -66,6 +67,7 @@ public interface ConsStockFlowService extends IService { /** * 获取耗材库存变动记录 + * * @param param 查询参数 * @return 分页数据 */ @@ -73,7 +75,16 @@ public interface ConsStockFlowService extends IService { /** * 保存库存变动记录 + * * @param entity 库存变动记录实体 */ - void saveFlow(ConsStockFlow entity); + void saveFlow(ConsStockFlow entity, BigDecimal conWarning); + + /** + * 发送库存消息 + * + * @param entity 库存变动记录实体 + * @param warning 警戒值 + */ + boolean sendStockMsg(ConsStockFlow entity, BigDecimal warning); } diff --git a/cash-common/cash-common-service/src/main/java/com/czg/product/service/ProdConsRelationService.java b/cash-common/cash-common-service/src/main/java/com/czg/product/service/ProdConsRelationService.java index 48493e083..6ca51cfb6 100644 --- a/cash-common/cash-common-service/src/main/java/com/czg/product/service/ProdConsRelationService.java +++ b/cash-common/cash-common-service/src/main/java/com/czg/product/service/ProdConsRelationService.java @@ -26,10 +26,10 @@ public interface ProdConsRelationService extends IService { * 保存商品耗材绑定关系 * * @param dto 商品耗材绑定关系DTO - * @return 保存结果 */ void saveProdConsRelation(ProdConsBindDTO dto); List selectListByProdId(Long prodId); + List selectStockByProdId(Long prodId); } \ No newline at end of file diff --git a/cash-common/cash-common-service/src/main/java/com/czg/product/service/ProductService.java b/cash-common/cash-common-service/src/main/java/com/czg/product/service/ProductService.java index eee997a77..146392210 100644 --- a/cash-common/cash-common-service/src/main/java/com/czg/product/service/ProductService.java +++ b/cash-common/cash-common-service/src/main/java/com/czg/product/service/ProductService.java @@ -1,7 +1,6 @@ package com.czg.product.service; import com.czg.product.dto.ProductDTO; -import com.czg.product.entity.ConsStockFlow; import com.czg.product.entity.Product; import com.czg.product.entity.ProductStockFlow; import com.czg.product.enums.InOutItemEnum; @@ -13,9 +12,7 @@ import com.mybatisflex.core.paginate.Page; import com.mybatisflex.core.service.IService; import jakarta.servlet.http.HttpServletResponse; -import java.math.BigDecimal; import java.util.List; -import java.util.Map; /** * 商品 @@ -49,7 +46,7 @@ public interface ProductService extends IService { * @param categoryId 商品分类ID * @return 商品列表数据 */ - Map getProductCacheList(Long shopId, Long categoryId); + List getProductCacheList(Long shopId, Long categoryId); /** * 清除某个商品分类的缓存 @@ -133,5 +130,5 @@ public interface ProductService extends IService { /** * 通过商品 进行耗材库存增减 */ - void consStockByProduct(InOutTypeEnum type, InOutItemEnum item, List products, Long orderId, String remark); + void consStockByProduct(Long shopId, InOutTypeEnum type, InOutItemEnum item, List products, Long orderId, String remark); } diff --git a/cash-common/cash-common-service/src/main/java/com/czg/product/vo/ConsStockRecord.java b/cash-common/cash-common-service/src/main/java/com/czg/product/vo/ConsStockRecord.java new file mode 100644 index 000000000..4ecbed90a --- /dev/null +++ b/cash-common/cash-common-service/src/main/java/com/czg/product/vo/ConsStockRecord.java @@ -0,0 +1,6 @@ +package com.czg.product.vo; + +import java.math.BigDecimal; + +public record ConsStockRecord(Long consId, BigDecimal stockNumber) { +} diff --git a/cash-service/order-service/src/main/java/com/czg/service/order/service/impl/OrderInfoCustomServiceImpl.java b/cash-service/order-service/src/main/java/com/czg/service/order/service/impl/OrderInfoCustomServiceImpl.java index c5400d8f0..467252fab 100644 --- a/cash-service/order-service/src/main/java/com/czg/service/order/service/impl/OrderInfoCustomServiceImpl.java +++ b/cash-service/order-service/src/main/java/com/czg/service/order/service/impl/OrderInfoCustomServiceImpl.java @@ -1698,11 +1698,7 @@ public class OrderInfoCustomServiceImpl implements OrderInfoCustomService { List details = orderDetailService.list(QueryWrapper.create().eq(OrderDetail::getOrderId, orderId).eq(OrderDetail::getPlaceNum, placeNum)); List> dataList = new ArrayList<>(); for (OrderDetail detail : details) { - Map data = new HashMap<>(); - data.put("shopId", shopId); - data.put("productId", detail.getProductId()); - data.put("num", NumberUtil.sub(detail.getNum(), detail.getReturnNum())); - dataList.add(data); + dataList.add(Map.of("productId", detail.getProductId(), "number", NumberUtil.sub(detail.getNum(), detail.getReturnNum()))); } orderDetailService.remove(new QueryWrapper().eq(OrderDetail::getOrderId, orderId).eq(OrderDetail::getPlaceNum, placeNum)); if (CollUtil.isNotEmpty(dataList)) { diff --git a/cash-service/order-service/src/main/java/com/czg/service/order/service/impl/OrderInfoRpcServiceImpl.java b/cash-service/order-service/src/main/java/com/czg/service/order/service/impl/OrderInfoRpcServiceImpl.java index d1c03a327..428a335ed 100644 --- a/cash-service/order-service/src/main/java/com/czg/service/order/service/impl/OrderInfoRpcServiceImpl.java +++ b/cash-service/order-service/src/main/java/com/czg/service/order/service/impl/OrderInfoRpcServiceImpl.java @@ -97,14 +97,10 @@ public class OrderInfoRpcServiceImpl implements OrderInfoRpcService { // 封装扣减库存数据 List> dataList = new ArrayList<>(); for (OrderDetail orderDetail : detailList) { - Map data = new HashMap<>(16); Long productId = orderDetail.getProductId(); BigDecimal num = orderDetail.getNum(); BigDecimal refundNum = orderDetail.getRefundNum(); - data.put("shopId", shopId); - data.put("productId", productId); - data.put("num", NumberUtil.sub(num, refundNum)); - dataList.add(data); + dataList.add(Map.of("productId", productId, "number", NumberUtil.sub(num, refundNum))); } try { // 调用商品服务扣减库存 @@ -130,22 +126,17 @@ public class OrderInfoRpcServiceImpl implements OrderInfoRpcService { if (CollUtil.isEmpty(detailList)) { throw new CzgException("该订单下不存在商品"); } - Long shopId = orderInfo.getShopId(); // 封装扣减库存数据 List> dataList = new ArrayList<>(); for (OrderDetail orderDetail : detailList) { - Map data = new HashMap<>(16); Long productId = orderDetail.getProductId(); BigDecimal num = orderDetail.getNum(); BigDecimal refundNum = orderDetail.getRefundNum(); - data.put("shopId", shopId); - data.put("productId", productId); - data.put("num", NumberUtil.sub(num, refundNum)); - dataList.add(data); + dataList.add(Map.of("productId", productId, "number", NumberUtil.sub(num, refundNum))); } try { // 调用商品服务扣减库存 - productRpcService.orderCancelRecoverStock(shopId, orderId, dataList); + productRpcService.orderCancelRecoverStock(orderInfo.getShopId(), orderId, dataList); } catch (Exception e) { log.error("调用商品服务恢复库存", e); throw e; @@ -171,13 +162,7 @@ public class OrderInfoRpcServiceImpl implements OrderInfoRpcService { // 封装扣减库存数据 List> dataList = new ArrayList<>(); for (String key : keys) { - Long productId = Convert.toLong(key); - BigDecimal num = obj.getBigDecimal(key); - Map row = new HashMap<>(3); - row.put("shopId", orderInfo.getShopId()); - row.put("productId", productId); - row.put("num", num); - dataList.add(row); + dataList.add(Map.of("productId", key, "number", obj.getBigDecimal(key))); } try { // 调用商品服务回退库存 diff --git a/cash-service/order-service/src/main/java/com/czg/service/order/service/impl/OrderPayServiceImpl.java b/cash-service/order-service/src/main/java/com/czg/service/order/service/impl/OrderPayServiceImpl.java index 4f44a246c..89322b67d 100644 --- a/cash-service/order-service/src/main/java/com/czg/service/order/service/impl/OrderPayServiceImpl.java +++ b/cash-service/order-service/src/main/java/com/czg/service/order/service/impl/OrderPayServiceImpl.java @@ -520,6 +520,7 @@ public class OrderPayServiceImpl implements OrderPayService { } //退款返还库存 if (!returnProMap.isEmpty()) { + //TODO 退款 商品退不退的 校验 rabbitPublisher.sendOrderRefundMsg(JSONObject.toJSONString(Map.of("orderId", orderInfo.getId(), "returnProMap", returnProMap))); } refundOrderAfter(orderInfo.getId(), orderInfo.getShopId(), orderInfo.getUserId(), orderInfo.getOrderNo(), diff --git a/cash-service/product-service/src/main/java/com/czg/service/product/mapper/ProdConsRelationMapper.java b/cash-service/product-service/src/main/java/com/czg/service/product/mapper/ProdConsRelationMapper.java index 347b6f526..e4b5bc679 100644 --- a/cash-service/product-service/src/main/java/com/czg/service/product/mapper/ProdConsRelationMapper.java +++ b/cash-service/product-service/src/main/java/com/czg/service/product/mapper/ProdConsRelationMapper.java @@ -21,4 +21,6 @@ public interface ProdConsRelationMapper extends BaseMapper { List getProductListByConId(@Param("conId") Long conId); List selectListByProdId(@Param("prodId") Long prodId); + + List selectStockByProdId(@Param("prodId") Long prodId); } \ No newline at end of file diff --git a/cash-service/product-service/src/main/java/com/czg/service/product/service/impl/ConsInfoServiceImpl.java b/cash-service/product-service/src/main/java/com/czg/service/product/service/impl/ConsInfoServiceImpl.java index 816efadb1..35b00e27e 100644 --- a/cash-service/product-service/src/main/java/com/czg/service/product/service/impl/ConsInfoServiceImpl.java +++ b/cash-service/product-service/src/main/java/com/czg/service/product/service/impl/ConsInfoServiceImpl.java @@ -15,6 +15,7 @@ import com.czg.product.param.ConsInfoParam; import com.czg.product.param.ConsSubUnitParam; import com.czg.product.service.ConsInfoService; import com.czg.product.vo.ConsStatisticsVo; +import com.czg.product.vo.ConsStockRecord; import com.czg.sa.StpKit; import com.czg.service.product.mapper.ConsGroupMapper; import com.czg.service.product.mapper.ConsInfoMapper; @@ -99,6 +100,11 @@ public class ConsInfoServiceImpl extends ServiceImpl i return list; } + @Override + public List getConsStockList(Long shopId) { + return listAs(query().eq(ConsInfo::getShopId, shopId).eq(ConsInfo::getIsStock, SystemConstants.OneZero.ONE), ConsStockRecord.class); + } + @Override public ConsInfoDTO getConsInfoById(Long id) { Long shopId = StpKit.USER.getShopId(0L); @@ -178,12 +184,10 @@ public class ConsInfoServiceImpl extends ServiceImpl i @Override public void isRefundStockConsInfo(Long id, Integer isRefundStock) { - Long shopId = StpKit.USER.getShopId(); - ConsInfo entity = super.getOne(query().eq(ConsInfo::getId, id).eq(ConsInfo::getShopId, shopId)); - entity.setIsRefundStock(isRefundStock); - super.updateById(entity); + } + @Override public void modifySubUnit(ConsSubUnitParam param) { Long shopId = StpKit.USER.getShopId(0L); diff --git a/cash-service/product-service/src/main/java/com/czg/service/product/service/impl/ConsStockFlowServiceImpl.java b/cash-service/product-service/src/main/java/com/czg/service/product/service/impl/ConsStockFlowServiceImpl.java index e6022211e..357e4e95b 100644 --- a/cash-service/product-service/src/main/java/com/czg/service/product/service/impl/ConsStockFlowServiceImpl.java +++ b/cash-service/product-service/src/main/java/com/czg/service/product/service/impl/ConsStockFlowServiceImpl.java @@ -3,10 +3,12 @@ package com.czg.service.product.service.impl; import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.bean.copier.CopyOptions; import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.convert.Convert; import cn.hutool.core.thread.ThreadUtil; import cn.hutool.core.util.NumberUtil; import cn.hutool.core.util.StrUtil; import com.alibaba.fastjson2.JSON; +import com.czg.config.RabbitPublisher; import com.czg.exception.CzgException; import com.czg.product.dto.ConsStockFlowDTO; import com.czg.product.entity.ConsInfo; @@ -52,6 +54,8 @@ public class ConsStockFlowServiceImpl extends ServiceImpl openIdList = consInfoMapper.findOpenIdList(shopId, "con"); - if (CollUtil.isEmpty(openIdList)) { - return; - } - String conName = StrUtil.format("{}数量<预警值{}", consInfo.getConName(), conWarning); - ThreadUtil.execAsync(() -> openIdList.parallelStream().forEach(openId -> - wxAccountUtil.sendStockMsg("耗材库存预警", shopName, conName, afterNumber, openId))); + boolean b = sendStockMsg(entity, conWarning); + if (b) { + ThreadUtil.execAsync(() -> rabbitPublisher.sendConsInfoChangeMsg(Convert.toStr(entity.getShopId()))); } } + + @Override + public boolean sendStockMsg(ConsStockFlow entity, BigDecimal warning) { + boolean result = false; + // 库存小于警告值,发送消息提醒 + if (NumberUtil.isLess(entity.getAfterNumber(), warning)) { + result = true; + List openIdList = consInfoMapper.findOpenIdList(entity.getShopId(), "con"); + if (CollUtil.isEmpty(openIdList)) { + return result; + } + String shopName = productMapper.getShopName(entity.getShopId()); + String conName = StrUtil.format("{}数量<预警值{}", entity.getConName(), warning); + ThreadUtil.execAsync(() -> openIdList.parallelStream().forEach(openId -> + wxAccountUtil.sendStockMsg("耗材库存预警", shopName, conName, entity.getAfterNumber(), openId))); + } + return result; + } } diff --git a/cash-service/product-service/src/main/java/com/czg/service/product/service/impl/ProdConsRelationServiceImpl.java b/cash-service/product-service/src/main/java/com/czg/service/product/service/impl/ProdConsRelationServiceImpl.java index 25221f5c2..e76f8f443 100644 --- a/cash-service/product-service/src/main/java/com/czg/service/product/service/impl/ProdConsRelationServiceImpl.java +++ b/cash-service/product-service/src/main/java/com/czg/service/product/service/impl/ProdConsRelationServiceImpl.java @@ -80,4 +80,14 @@ public class ProdConsRelationServiceImpl extends ServiceImpl selectStockByProdId(Long prodId) { + return mapper.selectStockByProdId(prodId); + } + } \ No newline at end of file diff --git a/cash-service/product-service/src/main/java/com/czg/service/product/service/impl/ProductRpcServiceImpl.java b/cash-service/product-service/src/main/java/com/czg/service/product/service/impl/ProductRpcServiceImpl.java index f17e72d77..71663587a 100644 --- a/cash-service/product-service/src/main/java/com/czg/service/product/service/impl/ProductRpcServiceImpl.java +++ b/cash-service/product-service/src/main/java/com/czg/service/product/service/impl/ProductRpcServiceImpl.java @@ -2,43 +2,23 @@ package com.czg.service.product.service.impl; import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.collection.CollUtil; -import cn.hutool.core.convert.Convert; -import cn.hutool.core.thread.ThreadUtil; -import cn.hutool.core.util.NumberUtil; -import cn.hutool.core.util.StrUtil; -import com.czg.config.RabbitPublisher; -import com.czg.constants.SystemConstants; -import com.czg.product.dto.ProductStockSubtractDTO; -import com.czg.product.entity.ConsInfo; -import com.czg.product.entity.ConsStockFlow; -import com.czg.product.entity.ProdConsRelation; -import com.czg.product.entity.Product; import com.czg.product.enums.InOutItemEnum; import com.czg.product.enums.InOutTypeEnum; -import com.czg.product.service.ConsStockFlowService; import com.czg.product.service.ProductRpcService; import com.czg.product.service.ProductService; -import com.czg.product.service.ProductStockFlowService; import com.czg.product.vo.ProductStockVO; import com.czg.product.vo.ProductVO; import com.czg.service.RedisService; -import com.czg.service.product.mapper.ConsInfoMapper; -import com.czg.service.product.mapper.ProdConsRelationMapper; import com.czg.service.product.mapper.ProductMapper; -import com.mybatisflex.core.query.QueryWrapper; import jakarta.annotation.Resource; import lombok.extern.slf4j.Slf4j; import org.apache.dubbo.config.annotation.DubboService; import org.springframework.transaction.annotation.Transactional; -import java.math.BigDecimal; -import java.time.LocalDate; -import java.util.ArrayList; import java.util.List; import java.util.Map; import static com.czg.constant.CacheConstant.ADMIN_CLIENT_PRODUCT_LIST; -import static com.czg.constant.CacheConstant.SHOP_PRODUCT_STOCK; /** * 商品RPC远程调用服务接口实现 @@ -60,44 +40,32 @@ public class ProductRpcServiceImpl implements ProductRpcService { @Override @Transactional(rollbackFor = Exception.class) public void paySuccessSubtractStock(Long shopId, Long orderId, List> dataList) { - List list = BeanUtil.copyToList(dataList, ProductStockSubtractDTO.class); + List list = BeanUtil.copyToList(dataList, ProductStockVO.class); if (CollUtil.isEmpty(list)) { return; } - List productStockList = new ArrayList<>(); - for (ProductStockSubtractDTO dto : list) { - productStockList.add(new ProductStockVO(dto.getProductId(), dto.getNum())); - } - productService.consStockByProduct(InOutTypeEnum.OUT, InOutItemEnum.ORDER_OUT, productStockList, orderId, "订单消费"); + productService.consStockByProduct(shopId, InOutTypeEnum.OUT, InOutItemEnum.ORDER_OUT, list, orderId, "订单消费"); } @Override @Transactional(rollbackFor = Exception.class) public void orderCancelRecoverStock(Long shopId, Long orderId, List> dataList) { - List list = BeanUtil.copyToList(dataList, ProductStockSubtractDTO.class); + List list = BeanUtil.copyToList(dataList, ProductStockVO.class); if (CollUtil.isEmpty(list)) { return; } - List productStockList = new ArrayList<>(); - for (ProductStockSubtractDTO dto : list) { - productStockList.add(new ProductStockVO(dto.getProductId(), dto.getNum())); - } - productService.consStockByProduct(InOutTypeEnum.IN, InOutItemEnum.ORDER_IN, productStockList, orderId, "订单取消/过期返还库存"); + productService.consStockByProduct(shopId, InOutTypeEnum.IN, InOutItemEnum.ORDER_IN, list, orderId, "订单取消/过期返还库存"); } @Override @Transactional(rollbackFor = Exception.class) public void orderRefundReturnStock(Long shopId, Long orderId, List> dataList) { - List list = BeanUtil.copyToList(dataList, ProductStockSubtractDTO.class); + List list = BeanUtil.copyToList(dataList, ProductStockVO.class); if (CollUtil.isEmpty(list)) { return; } - List productStockList = new ArrayList<>(); - for (ProductStockSubtractDTO dto : list) { - productStockList.add(new ProductStockVO(dto.getProductId(), dto.getNum())); - } - productService.consStockByProduct(InOutTypeEnum.IN, InOutItemEnum.ORDER_IN, productStockList, orderId, "订单退菜/退款返还库存"); + productService.consStockByProduct(shopId, InOutTypeEnum.IN, InOutItemEnum.ORDER_IN, list, orderId, "订单退菜/退款返还库存"); } @Override diff --git a/cash-service/product-service/src/main/java/com/czg/service/product/service/impl/ProductServiceImpl.java b/cash-service/product-service/src/main/java/com/czg/service/product/service/impl/ProductServiceImpl.java index db7dbdb40..6e2bca310 100644 --- a/cash-service/product-service/src/main/java/com/czg/service/product/service/impl/ProductServiceImpl.java +++ b/cash-service/product-service/src/main/java/com/czg/service/product/service/impl/ProductServiceImpl.java @@ -2,6 +2,8 @@ package com.czg.service.product.service.impl; import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.convert.Convert; +import cn.hutool.core.thread.ThreadUtil; import cn.hutool.core.util.NumberUtil; import cn.hutool.core.util.ObjUtil; import cn.hutool.core.util.StrUtil; @@ -9,6 +11,7 @@ import com.alibaba.excel.write.handler.SheetWriteHandler; import com.alibaba.fastjson2.JSON; import com.alibaba.fastjson2.JSONArray; import com.alibaba.fastjson2.JSONWriter; +import com.czg.config.RabbitPublisher; import com.czg.constant.CacheConstant; import com.czg.constants.SystemConstants; import com.czg.excel.ExcelExportUtil; @@ -32,6 +35,7 @@ import com.mybatisflex.core.paginate.Page; import com.mybatisflex.core.query.QueryWrapper; import com.mybatisflex.core.update.UpdateChain; import com.mybatisflex.spring.service.impl.ServiceImpl; +import jakarta.annotation.Resource; import jakarta.servlet.http.HttpServletResponse; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -72,6 +76,8 @@ public class ProductServiceImpl extends ServiceImpl impl private final ProdGroupRelationMapper prodGroupRelationMapper; private final ProductStockFlowService productStockFlowService; private final RedisService redisService; + @Resource + private RabbitPublisher rabbitPublisher; private QueryWrapper buildQueryWrapper(ProductDTO param) { QueryWrapper queryWrapper = PageUtil.buildSortQueryWrapper(); @@ -334,7 +340,7 @@ public class ProductServiceImpl extends ServiceImpl impl } @Override - public Map getProductCacheList(Long shopId, Long categoryId) { + public List getProductCacheList(Long shopId, Long categoryId) { String key = ADMIN_CLIENT_PRODUCT_LIST + "::" + shopId; List list; if (categoryId == null) { @@ -361,8 +367,7 @@ public class ProductServiceImpl extends ServiceImpl impl .sorted(Comparator.comparingLong(ProductDTO::getId).reversed()) .toList(); } - List consInfos = consInfoMapper.selectListByQuery(query().eq(ConsInfo::getShopId, shopId).eq(ConsInfo::getStatus, SystemConstants.OneZero.ONE)); - return Map.of("productList", list, "cons", consInfos); + return list; } /** @@ -731,7 +736,7 @@ public class ProductServiceImpl extends ServiceImpl impl productStockFlowService.save(flow); List productStockList = new ArrayList<>(); productStockList.add(new ProductStockVO(param.getProductId(), BigDecimal.valueOf(param.getNumber()))); - consStockByProduct(InOutTypeEnum.OUT, InOutItemEnum.DAMAGE_OUT, productStockList, null, "【商品报损,自动报损相关耗材】"); + consStockByProduct(shopId, InOutTypeEnum.OUT, InOutItemEnum.DAMAGE_OUT, productStockList, null, "【商品报损,自动报损相关耗材】"); } @Override @@ -758,10 +763,11 @@ public class ProductServiceImpl extends ServiceImpl impl } @Override - public void consStockByProduct(InOutTypeEnum type, InOutItemEnum item, List products, Long orderId, String remark) { + public void consStockByProduct(Long shopId, InOutTypeEnum type, InOutItemEnum item, List products, Long orderId, String remark) { if (CollUtil.isEmpty(products)) return; + boolean isSendUp = false; for (ProductStockVO product : products) { - List consList = prodConsRelationService.selectListByProdId(product.productId()); + List consList = prodConsRelationService.selectStockByProdId(product.productId()); if (CollUtil.isEmpty(consList)) return; for (ProdConsRelationDTO consInfo : consList) { BigDecimal surplusStock = consInfo.getSurplusStock(); @@ -799,8 +805,13 @@ public class ProductServiceImpl extends ServiceImpl impl flow.setOrderId(orderId); flow.setRemark(remark); consStockFlowService.save(flow); + boolean b = consStockFlowService.sendStockMsg(flow, consInfo.getConWarning()); + if (b) isSendUp = b; } } + if (isSendUp) { + ThreadUtil.execAsync(() -> rabbitPublisher.sendConsInfoChangeMsg(Convert.toStr(shopId))); + } } diff --git a/cash-service/product-service/src/main/resources/mapper/ProdConsRelationMapper.xml b/cash-service/product-service/src/main/resources/mapper/ProdConsRelationMapper.xml index 5171b4f16..27b4797b0 100644 --- a/cash-service/product-service/src/main/resources/mapper/ProdConsRelationMapper.xml +++ b/cash-service/product-service/src/main/resources/mapper/ProdConsRelationMapper.xml @@ -23,4 +23,17 @@ inner JOIN tb_cons_info t2 on t1.cons_info_id = t2.id WHERE t1.product_id = #{prodId} + + \ No newline at end of file