1.增加库存记录mq处理

This commit is contained in:
SongZhang 2024-08-16 13:38:52 +08:00
parent d32f9705a0
commit b8a60a1549
7 changed files with 142 additions and 2 deletions

View File

@ -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);

View File

@ -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;
}

View File

@ -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);
}
}
}

View File

@ -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<TbProductStockOperate> all, HttpServletResponse response) throws IOException;
void addStockRecord(StockRecordMsg stockRecordMsg);
}

View File

@ -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
});
}
}

View File

@ -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<TbProduct>()
.eq(TbProduct::getShopId, stockRecordMsg.getShopId())
.eq(TbProduct::getId, stockRecordMsg.getProductId())
.eq(TbProduct::getIsDel, 0));
TbProductSku productSku = producSkutMapper.selectOne(new LambdaUpdateWrapper<TbProductSku>()
.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<String, Object> 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<HashMap<String, Object>> 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<String, String> 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);
}
}

View File

@ -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<TbProductStockDetailDto> all, HttpServletResponse response) throws IOException;
void addSaleRecord(Integer orderId);
}