1.增加库存记录mq处理
This commit is contained in:
parent
d32f9705a0
commit
b8a60a1549
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
|
@ -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
|
|||
|
||||
});
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue