diff --git a/eladmin-system/src/main/java/cn/ysk/cashier/config/RabbitConfig.java b/eladmin-system/src/main/java/cn/ysk/cashier/config/RabbitConfig.java index 1bfae312..8771c6b5 100644 --- a/eladmin-system/src/main/java/cn/ysk/cashier/config/RabbitConfig.java +++ b/eladmin-system/src/main/java/cn/ysk/cashier/config/RabbitConfig.java @@ -13,6 +13,8 @@ public class RabbitConfig { public static final String EXCHANGE_STOCK_RECORD = "exchange.stock.record"; public static final String ROUTING_STOCK_RECORD_SALE = "routing.stock.record.sale"; + public static final String QUEUE_STOCK_RECORD = "queue.stock.record"; + @Bean Queue stockRecordSaleQueue() { return new Queue(QUEUE_STOCK_RECORD_SALE); diff --git a/eladmin-system/src/main/java/cn/ysk/cashier/dto/rabbit/StockRecordMsg.java b/eladmin-system/src/main/java/cn/ysk/cashier/dto/rabbit/StockRecordMsg.java new file mode 100644 index 00000000..b9eba98c --- /dev/null +++ b/eladmin-system/src/main/java/cn/ysk/cashier/dto/rabbit/StockRecordMsg.java @@ -0,0 +1,12 @@ +package cn.ysk.cashier.dto.rabbit; + +import lombok.Data; + +@Data +public class StockRecordMsg { + private Integer shopId; + private Integer skuId; + private Integer productId; + private String type; + private Integer currentNumber; +} diff --git a/eladmin-system/src/main/java/cn/ysk/cashier/rabbit/StockListener.java b/eladmin-system/src/main/java/cn/ysk/cashier/rabbit/StockListener.java index 9fc4ada5..1a6949dc 100644 --- a/eladmin-system/src/main/java/cn/ysk/cashier/rabbit/StockListener.java +++ b/eladmin-system/src/main/java/cn/ysk/cashier/rabbit/StockListener.java @@ -1,7 +1,10 @@ package cn.ysk.cashier.rabbit; +import cn.hutool.core.util.StrUtil; import cn.ysk.cashier.config.RabbitConfig; +import cn.ysk.cashier.dto.rabbit.StockRecordMsg; import cn.ysk.cashier.pojo.product.TbProductStockDetail; +import cn.ysk.cashier.service.TbProductStockOperateService; import cn.ysk.cashier.service.product.TbProductStockDetailService; import com.alibaba.fastjson.JSONObject; import lombok.extern.slf4j.Slf4j; @@ -15,8 +18,11 @@ public class StockListener { private final TbProductStockDetailService productStockDetailService; - public StockListener(TbProductStockDetailService productStockDetailService) { + private final TbProductStockOperateService productStockOperateService; + + public StockListener(TbProductStockDetailService productStockDetailService, TbProductStockOperateService productStockOperateService) { this.productStockDetailService = productStockDetailService; + this.productStockOperateService = productStockOperateService; } @RabbitListener(queues = RabbitConfig.QUEUE_STOCK_RECORD_SALE) @@ -33,4 +39,22 @@ public class StockListener { log.error("执行保存库存mq失败", e); } } + +// @RabbitListener(queues = RabbitConfig.QUEUE_STOCK_RECORD_SALE) + public void recordStockHandler(String message) { + log.info("接收到下单保存库存信息mq消息,消息内容: {}", message); + + if (StrUtil.isBlank(message)) { + log.warn("错误消息体"); + return; + } + + StockRecordMsg stockRecordMsg = JSONObject.parseObject(message, StockRecordMsg.class); + + try { + productStockOperateService.addStockRecord(stockRecordMsg); + }catch (Exception e) { + log.error("执行保存库存mq失败", e); + } + } } diff --git a/eladmin-system/src/main/java/cn/ysk/cashier/service/TbProductStockOperateService.java b/eladmin-system/src/main/java/cn/ysk/cashier/service/TbProductStockOperateService.java index 27db0611..d8ab34f0 100644 --- a/eladmin-system/src/main/java/cn/ysk/cashier/service/TbProductStockOperateService.java +++ b/eladmin-system/src/main/java/cn/ysk/cashier/service/TbProductStockOperateService.java @@ -1,5 +1,6 @@ package cn.ysk.cashier.service; +import cn.ysk.cashier.dto.rabbit.StockRecordMsg; import cn.ysk.cashier.pojo.product.TbProductStockOperate; import cn.ysk.cashier.vo.ProductStockOperateVO; import cn.ysk.cashier.dto.product.OutAndOnDto; @@ -74,4 +75,6 @@ public interface TbProductStockOperateService { * @throws IOException / */ void download(List all, HttpServletResponse response) throws IOException; -} \ No newline at end of file + + void addStockRecord(StockRecordMsg stockRecordMsg); +} diff --git a/eladmin-system/src/main/java/cn/ysk/cashier/service/impl/productimpl/TbProductStockDetailServiceImpl.java b/eladmin-system/src/main/java/cn/ysk/cashier/service/impl/productimpl/TbProductStockDetailServiceImpl.java index 9bd4e11d..3c7ac737 100644 --- a/eladmin-system/src/main/java/cn/ysk/cashier/service/impl/productimpl/TbProductStockDetailServiceImpl.java +++ b/eladmin-system/src/main/java/cn/ysk/cashier/service/impl/productimpl/TbProductStockDetailServiceImpl.java @@ -17,6 +17,7 @@ package cn.ysk.cashier.service.impl.productimpl; import cn.hutool.core.util.StrUtil; import cn.ysk.cashier.dto.product.StockCountDTO; +import cn.ysk.cashier.dto.rabbit.StockRecordMsg; import cn.ysk.cashier.pojo.order.TbOrderInfo; import cn.ysk.cashier.pojo.product.TbProductStockDetail; import cn.ysk.cashier.repository.order.StockCountRepository; @@ -205,4 +206,5 @@ public class TbProductStockDetailServiceImpl implements TbProductStockDetailServ }); } + } diff --git a/eladmin-system/src/main/java/cn/ysk/cashier/service/impl/productimpl/TbProductStockOperateServiceImpl.java b/eladmin-system/src/main/java/cn/ysk/cashier/service/impl/productimpl/TbProductStockOperateServiceImpl.java index 096ffb01..14dd5af2 100644 --- a/eladmin-system/src/main/java/cn/ysk/cashier/service/impl/productimpl/TbProductStockOperateServiceImpl.java +++ b/eladmin-system/src/main/java/cn/ysk/cashier/service/impl/productimpl/TbProductStockOperateServiceImpl.java @@ -1,9 +1,15 @@ package cn.ysk.cashier.service.impl.productimpl; +import cn.ysk.cashier.dto.rabbit.StockRecordMsg; +import cn.ysk.cashier.mybatis.mapper.TbProducSkutMapper; +import cn.ysk.cashier.mybatis.mapper.TbProductMapper; import cn.ysk.cashier.pojo.product.TbProduct; import cn.ysk.cashier.pojo.shop.TbShopPurveyor; +import cn.ysk.cashier.pojo.shop.TbShopUnit; import cn.ysk.cashier.repository.product.TbProductRepository; +import cn.ysk.cashier.repository.product.TbProductStockDetailRepository; import cn.ysk.cashier.repository.shop.TbShopPurveyorRepository; +import cn.ysk.cashier.repository.shop.TbShopUnitRepository; import cn.ysk.cashier.utils.*; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; @@ -23,12 +29,14 @@ import cn.ysk.cashier.repository.shop.TbShopInfoRepository; import cn.ysk.cashier.pojo.shop.TbShopPurveyorTransact; import cn.ysk.cashier.repository.shop.TbShopPurveyorTransactRepository; import com.alipay.api.domain.Product; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import lombok.RequiredArgsConstructor; import cn.ysk.cashier.repository.product.TbProductStockOperateRepository; import cn.ysk.cashier.service.TbProductStockOperateService; import cn.ysk.cashier.dto.product.TbProductStockOperateDto; import cn.ysk.cashier.dto.product.TbProductStockOperateQueryCriteria; import cn.ysk.cashier.mapper.product.TbProductStockOperateMapper; +import lombok.extern.slf4j.Slf4j; import org.springframework.beans.BeanUtils; import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.Sort; @@ -53,6 +61,7 @@ import javax.servlet.http.HttpServletResponse; **/ @Service @RequiredArgsConstructor +@Slf4j public class TbProductStockOperateServiceImpl implements TbProductStockOperateService { private final TbProductStockOperateRepository tbProductStockOperateRepository; @@ -429,4 +438,90 @@ public class TbProductStockOperateServiceImpl implements TbProductStockOperateSe } FileUtil.downloadExcel(list, response); } + + + private final TbProductMapper productMapper; + private final TbProducSkutMapper producSkutMapper; + private final TbShopUnitRepository shopUnitRepository; + private final TbProductStockOperateRepository productStockOperateRepository; + private final TbProductStockDetailRepository productStockDetailRepository; + @Override + public void addStockRecord(StockRecordMsg stockRecordMsg) { + TbShopInfo byId = shopInfoRepository.findById(stockRecordMsg.getShopId()).orElseGet(TbShopInfo::new); + if (byId.getId() == null) { + throw new BadRequestException("商户号有误"); + } + + TbProduct product = productMapper.selectOne(new LambdaUpdateWrapper() + .eq(TbProduct::getShopId, stockRecordMsg.getShopId()) + .eq(TbProduct::getId, stockRecordMsg.getProductId()) + .eq(TbProduct::getIsDel, 0)); + + TbProductSku productSku = producSkutMapper.selectOne(new LambdaUpdateWrapper() + .eq(TbProductSku::getShopId, stockRecordMsg.getShopId()) + .eq(TbProductSku::getId, stockRecordMsg.getSkuId()) + .eq(TbProductSku::getIsDel, 0)); + if (product == null || productSku == null) { + log.info("商品或sku不存在"); + throw new BadRequestException("商品或sku不存在"); + } + + double difference = product.getIsDistribute().equals(1) ? stockRecordMsg.getCurrentNumber() - product.getStockNumber() + : stockRecordMsg.getCurrentNumber() - productSku.getStockNumber(); + + TbShopUnit tbShopUnit = shopUnitRepository.findById(product.getUnitId()).orElse(null); + + //增加操作日志 + long times = Instant.now().toEpochMilli(); + HashMap snapItem = new HashMap<>(); + snapItem.put("stockNumber", product.getIsDistribute().equals(1) ? product.getStockNumber() : productSku.getStockNumber()); + snapItem.put("number", product.getIsDistribute().equals(1) ? stockRecordMsg.getCurrentNumber() - product.getStockNumber() + : stockRecordMsg.getCurrentNumber() - productSku.getStockNumber()); + snapItem.put("coverImg", product.getCoverImg()); + snapItem.put("productId", product.getId()); + snapItem.put("name", product.getName()); + snapItem.put("unitName", tbShopUnit == null ? "" : tbShopUnit.getName()); + + ArrayList> stockSnap = new ArrayList<>(); + stockSnap.add(snapItem); + + TbProductStockOperate stockOperate = new TbProductStockOperate(); + stockOperate.setShopId(String.valueOf(stockRecordMsg.getShopId())); + stockOperate.setStockSnap(JSONObject.toJSONString(stockSnap)); + stockOperate.setType(stockRecordMsg.getType()); + + Map operatorSnapMap = new HashMap<>(); + operatorSnapMap.put("name", byId.getShopName()); + operatorSnapMap.put("account", byId.getAccount()); + + stockOperate.setOperatorSnap(JSON.toJSONString(operatorSnapMap)); + stockOperate.setStockTime(times); + stockOperate.setCreatedAt(times); + stockOperate.setUpdatedAt(times); + stockOperate.setStatus("normal"); + productStockOperateRepository.save(stockOperate); + + + TbProductStockDetail productStockDetail = new TbProductStockDetail(); + productStockDetail.setCreatedAt(times); + productStockDetail.setUpdatedAt(times); + productStockDetail.setIsStock(1); + productStockDetail.setProductId(String.valueOf(product.getId())); + productStockDetail.setProductName(product.getName()); + productStockDetail.setUnitName(tbShopUnit == null ? null : tbShopUnit.getName()); + productStockDetail.setShopId(String.valueOf(stockRecordMsg.getShopId())); + productStockDetail.setSkuId(String.valueOf(stockRecordMsg.getSkuId())); + productStockDetail.setSubType(product.getIsDistribute().equals(1) ? stockRecordMsg.getCurrentNumber() - product.getStockNumber() > 0 ? 1 : -1 + : stockRecordMsg.getCurrentNumber() - productSku.getStockNumber() > 0 ? 1 : -1); + productStockDetail.setType(stockRecordMsg.getType()); + productStockDetail.setSpecSnap(productSku.getSpecSnap()); + productStockDetail.setStockNumber(difference); + productStockDetail.setCostAmount(productSku.getSalePrice().multiply(BigDecimal.valueOf(Math.abs(difference)))); + productStockDetail.setLeftNumber(product.getIsDistribute().equals(1) ? product.getStockNumber() : productSku.getStockNumber().intValue()); + productStockDetail.setRecordId(stockOperate.getId().toString()); + productStockDetail.setStockSnap(JSONObject.toJSONString(snapItem)); + productStockDetail.setSourcePath("NORMAL"); + productStockDetailRepository.save(productStockDetail); + + } } diff --git a/eladmin-system/src/main/java/cn/ysk/cashier/service/product/TbProductStockDetailService.java b/eladmin-system/src/main/java/cn/ysk/cashier/service/product/TbProductStockDetailService.java index 5764d35e..7df93d24 100644 --- a/eladmin-system/src/main/java/cn/ysk/cashier/service/product/TbProductStockDetailService.java +++ b/eladmin-system/src/main/java/cn/ysk/cashier/service/product/TbProductStockDetailService.java @@ -15,6 +15,7 @@ */ package cn.ysk.cashier.service.product; +import cn.ysk.cashier.dto.rabbit.StockRecordMsg; import cn.ysk.cashier.pojo.product.TbProductStockDetail; import cn.ysk.cashier.dto.product.TbProductStockDetailDto; import cn.ysk.cashier.dto.product.TbProductStockDetailQueryCriteria; @@ -88,4 +89,5 @@ public interface TbProductStockDetailService { void download(List all, HttpServletResponse response) throws IOException; void addSaleRecord(Integer orderId); + }