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 new file mode 100644 index 00000000..1bfae312 --- /dev/null +++ b/eladmin-system/src/main/java/cn/ysk/cashier/config/RabbitConfig.java @@ -0,0 +1,30 @@ +package cn.ysk.cashier.config; + +import org.springframework.amqp.core.Binding; +import org.springframework.amqp.core.BindingBuilder; +import org.springframework.amqp.core.DirectExchange; +import org.springframework.amqp.core.Queue; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +@Configuration +public class RabbitConfig { + public static final String QUEUE_STOCK_RECORD_SALE = "queue.stock.record.sale"; + public static final String EXCHANGE_STOCK_RECORD = "exchange.stock.record"; + public static final String ROUTING_STOCK_RECORD_SALE = "routing.stock.record.sale"; + + @Bean + Queue stockRecordSaleQueue() { + return new Queue(QUEUE_STOCK_RECORD_SALE); + } + + @Bean + DirectExchange stockRecordExchange() { + return new DirectExchange(EXCHANGE_STOCK_RECORD); + } + + @Bean + Binding binding(Queue stockRecordSaleQueue, DirectExchange stockRecordExchange) { + return BindingBuilder.bind(stockRecordSaleQueue).to(stockRecordExchange).with(ROUTING_STOCK_RECORD_SALE); + } +} diff --git a/eladmin-system/src/main/java/cn/ysk/cashier/controller/product/StockController.java b/eladmin-system/src/main/java/cn/ysk/cashier/controller/product/StockController.java index be5c91f4..dbf8901f 100644 --- a/eladmin-system/src/main/java/cn/ysk/cashier/controller/product/StockController.java +++ b/eladmin-system/src/main/java/cn/ysk/cashier/controller/product/StockController.java @@ -1,6 +1,7 @@ package cn.ysk.cashier.controller.product; import cn.hutool.core.util.StrUtil; +import cn.ysk.cashier.annotation.AnonymousAccess; import cn.ysk.cashier.annotation.Log; import cn.ysk.cashier.annotation.rest.AnonymousPostMapping; import cn.ysk.cashier.dto.product.StockQueryDto; @@ -112,6 +113,18 @@ public class StockController { return new ResponseEntity<>(dataMap, HttpStatus.OK); } + @AnonymousAccess + @PutMapping("/grounding") + @ApiOperation("上下架商品") + public ResponseEntity grounding( + @RequestParam Integer shopId, + @RequestParam Integer skuId, + @RequestParam Boolean isGrounding + ){ + stockService.grounding(shopId,skuId, isGrounding); + return ResponseEntity.ok("success"); + } + @GetMapping("/sku") @ApiOperation("查询库存") public ResponseEntity queryProductSku(String productId){ diff --git a/eladmin-system/src/main/java/cn/ysk/cashier/controller/product/TbProductStockDetailController.java b/eladmin-system/src/main/java/cn/ysk/cashier/controller/product/TbProductStockDetailController.java index 7bd4110e..e9774b71 100644 --- a/eladmin-system/src/main/java/cn/ysk/cashier/controller/product/TbProductStockDetailController.java +++ b/eladmin-system/src/main/java/cn/ysk/cashier/controller/product/TbProductStockDetailController.java @@ -15,6 +15,7 @@ */ package cn.ysk.cashier.controller.product; +import cn.ysk.cashier.annotation.AnonymousAccess; import cn.ysk.cashier.annotation.Log; import cn.ysk.cashier.pojo.product.TbProductStockDetail; import cn.ysk.cashier.service.product.TbProductStockDetailService; @@ -91,4 +92,4 @@ public class TbProductStockDetailController { tbProductStockDetailService.deleteAll(ids); return new ResponseEntity<>(HttpStatus.OK); } -} \ No newline at end of file +} diff --git a/eladmin-system/src/main/java/cn/ysk/cashier/pojo/product/TbProductSku.java b/eladmin-system/src/main/java/cn/ysk/cashier/pojo/product/TbProductSku.java index fe42c0ca..b19fe427 100644 --- a/eladmin-system/src/main/java/cn/ysk/cashier/pojo/product/TbProductSku.java +++ b/eladmin-system/src/main/java/cn/ysk/cashier/pojo/product/TbProductSku.java @@ -127,6 +127,10 @@ public class TbProductSku implements Serializable { @ApiModelProperty(value = "是否暂停销售") private Integer isPauseSale = 0; + @Column(name = "`is_grounding`") + @ApiModelProperty(value = "是否上架") + private Integer isGrounding = 0; + public void setIsDel(Integer isDel) { if(isDel!=null){ this.isDel = isDel; 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 new file mode 100644 index 00000000..9fc4ada5 --- /dev/null +++ b/eladmin-system/src/main/java/cn/ysk/cashier/rabbit/StockListener.java @@ -0,0 +1,36 @@ +package cn.ysk.cashier.rabbit; + +import cn.ysk.cashier.config.RabbitConfig; +import cn.ysk.cashier.pojo.product.TbProductStockDetail; +import cn.ysk.cashier.service.product.TbProductStockDetailService; +import com.alibaba.fastjson.JSONObject; +import lombok.extern.slf4j.Slf4j; +import org.springframework.amqp.rabbit.annotation.RabbitHandler; +import org.springframework.amqp.rabbit.annotation.RabbitListener; +import org.springframework.stereotype.Component; + +@Component +@Slf4j +public class StockListener { + + private final TbProductStockDetailService productStockDetailService; + + public StockListener(TbProductStockDetailService productStockDetailService) { + this.productStockDetailService = productStockDetailService; + } + + @RabbitListener(queues = RabbitConfig.QUEUE_STOCK_RECORD_SALE) + public void recordSaleHandler(String message) { + log.info("接收到下单保存库存信息mq消息,消息内容: {}", message); + JSONObject jsonObject = JSONObject.parseObject(message); + if (!jsonObject.containsKey("orderId")) { + log.info("mq消息体有误,确实orderId"); + return; + } + try { + productStockDetailService.addSaleRecord(jsonObject.getInteger("orderId")); + }catch (Exception e) { + log.error("执行保存库存mq失败", e); + } + } +} diff --git a/eladmin-system/src/main/java/cn/ysk/cashier/repository/order/StockCountRepository.java b/eladmin-system/src/main/java/cn/ysk/cashier/repository/order/StockCountRepository.java index 0f3e8353..3933e174 100644 --- a/eladmin-system/src/main/java/cn/ysk/cashier/repository/order/StockCountRepository.java +++ b/eladmin-system/src/main/java/cn/ysk/cashier/repository/order/StockCountRepository.java @@ -2,6 +2,7 @@ package cn.ysk.cashier.repository.order; import cn.ysk.cashier.dto.product.StockCountDTO; import org.apache.ibatis.annotations.Param; +import org.apache.ibatis.annotations.Select; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; @@ -32,4 +33,20 @@ public interface StockCountRepository extends JpaRepository countStock( @Param("startTime") String startTime, @Param("endTime") String endTime); -} \ No newline at end of file + @Query(value = "SELECT pro.shop_id as shop_id, pro.id as pro_id, info.product_name as pro_name, pro.is_stock," + + " info.product_sku_name as sku_name, unit.NAME as unit_name ," + + "SUM( CASE WHEN orders.order_type != 'return' THEN info.num ELSE 0 END )- SUM( CASE WHEN orders.order_type = 'return' THEN info.num ELSE 0 END ) as stock_count," + + "CASE WHEN pro.is_distribute = '0' THEN sku.stock_number ELSE pro.stock_number END AS stock_number " + + "FROM " + + "tb_order_info orders " + + "LEFT JOIN tb_order_detail info ON orders.id = info.order_id " + + "LEFT JOIN tb_product pro ON info.product_id = pro.id " + + "LEFT JOIN (SELECT product_id,sum(stock_number) as stock_number from tb_product_sku GROUP BY product_id) sku ON info.product_id = sku.product_id " + + "LEFT JOIN tb_shop_unit unit ON unit.id = pro.unit_id " + + "WHERE " + + "orders.id = :orderId " + + "AND ( info.STATUS = 'closed' OR info.STATUS = 'refund' ) " + + "GROUP BY " + + "info.product_id ",nativeQuery = true) + List countStockById(Integer orderId); +} diff --git a/eladmin-system/src/main/java/cn/ysk/cashier/repository/product/TbProductRepository.java b/eladmin-system/src/main/java/cn/ysk/cashier/repository/product/TbProductRepository.java index 4538c363..aa50c29b 100644 --- a/eladmin-system/src/main/java/cn/ysk/cashier/repository/product/TbProductRepository.java +++ b/eladmin-system/src/main/java/cn/ysk/cashier/repository/product/TbProductRepository.java @@ -55,4 +55,7 @@ public interface TbProductRepository extends JpaRepository, @Modifying @Query("update TbProduct set stockNumber=stockNumber+:num where id=:id") void incrStock(@Param("id") Integer id, @Param("num") Integer num); + + @Query("select product from TbProduct product where product.id=:id and product.shopId=:shopId") + TbProduct selectByShopIdAndId(Integer id, String shopId); } diff --git a/eladmin-system/src/main/java/cn/ysk/cashier/repository/product/TbProductSkuRepository.java b/eladmin-system/src/main/java/cn/ysk/cashier/repository/product/TbProductSkuRepository.java index 0ea3964b..83a0fb42 100644 --- a/eladmin-system/src/main/java/cn/ysk/cashier/repository/product/TbProductSkuRepository.java +++ b/eladmin-system/src/main/java/cn/ysk/cashier/repository/product/TbProductSkuRepository.java @@ -3,6 +3,7 @@ package cn.ysk.cashier.repository.product; import cn.ysk.cashier.pojo.product.TbProductSku; import cn.ysk.cashier.vo.StockV2Vo; import cn.ysk.cashier.vo.StockVo; +import org.apache.ibatis.annotations.Param; import org.apache.ibatis.annotations.Update; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; @@ -10,7 +11,6 @@ import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.JpaSpecificationExecutor; import org.springframework.data.jpa.repository.Modifying; import org.springframework.data.jpa.repository.Query; -import org.springframework.data.repository.query.Param; import javax.transaction.Transactional; import java.math.BigDecimal; @@ -170,4 +170,14 @@ public interface TbProductSkuRepository extends JpaRepository queryAll(TbProductStockDetailQueryCriteria criteria, Pageable pageable){ Page page = tbProductStockDetailRepository.findAll((root, criteriaQuery, criteriaBuilder) -> QueryHelp.getPredicate(root,criteria,criteriaBuilder),pageable); @@ -66,10 +76,23 @@ public class TbProductStockDetailServiceImpl implements TbProductStockDetailServ Page page = tbProductStockDetailRepository.findAll((root, criteriaQuery, criteriaBuilder) -> QueryHelp.getPredicate(root,criteria,criteriaBuilder),pageable); Page map = page.map(tbProductStockDetailMapper::toDto); + + ArrayList> contents = new ArrayList<>(); for (TbProductStockDetailDto tbProductStockDetailDto : map.getContent()) { + if (StrUtil.isNotBlank(tbProductStockDetailDto.getOrderId())) { + TbOrderInfo tbOrderInfo = tbOrderInfoRepository.findById(Integer.valueOf(tbProductStockDetailDto.getOrderId())).orElse(null); + Map map1 = BeanUtil.transBean2Map(tbProductStockDetailDto); + if (tbOrderInfo != null) { + map1.put("orderNo", tbOrderInfo.getOrderNo()); + } + contents.add(map1); + } tbProductStockDetailDto.setTypes(); } - return PageUtil.toPage(map); + Map info = new LinkedHashMap<>(2); + info.put("content",contents); + info.put("totalElements",page.getTotalElements()); + return info; } @@ -152,4 +175,33 @@ public class TbProductStockDetailServiceImpl implements TbProductStockDetailServ } FileUtil.downloadExcel(list, response); } -} \ No newline at end of file + + @Override + public void addSaleRecord(Integer orderId) { + List stockCountDTOS = stockCountRepository.countStockById(orderId); + log.info("查询到订单id: {}的所有库存数据: {}", orderId, stockCountDTOS); + stockCountDTOS.forEach(s->{ + if (s.getStockCount() > 0) { + TbProductStockDetail productStockDetail = new TbProductStockDetail(); + productStockDetail.setCreatedAt(System.currentTimeMillis()); + productStockDetail.setUpdatedAt(System.currentTimeMillis()); + productStockDetail.setShopId(s.getShopId()); + productStockDetail.setProductId(s.getProId().toString()); + productStockDetail.setProductName(s.getProName()); + productStockDetail.setOrderId(orderId.toString()); +// productStockDetail.setSkuId(s.getSkuId().toString()); + productStockDetail.setIsStock(s.getIsStock());//是否开启库存 + productStockDetail.setLeftNumber(s.getStockNumber()+s.getStockCount());//原库存 +// productStockDetail.setSpecSnap(s.getSkuName()); + productStockDetail.setUnitName(s.getUnitName()); + productStockDetail.setStockNumber(-Double.valueOf(s.getStockCount())); + productStockDetail.setSourcePath("NORMAL"); + productStockDetail.setType("售出记录"); + productStockDetail.setRemark("售出记录:" + orderId); + productStockDetail.setSubType(-1); + tbProductStockDetailRepository.save(productStockDetail); + } + + }); + } +} diff --git a/eladmin-system/src/main/java/cn/ysk/cashier/service/product/StockService.java b/eladmin-system/src/main/java/cn/ysk/cashier/service/product/StockService.java index 16e2209d..47329894 100644 --- a/eladmin-system/src/main/java/cn/ysk/cashier/service/product/StockService.java +++ b/eladmin-system/src/main/java/cn/ysk/cashier/service/product/StockService.java @@ -44,4 +44,13 @@ public interface StockService { * @param stockUpdateWarnLineVO 警戒线 */ void updateProductWarnLine(StockUpdateWarnLineVO stockUpdateWarnLineVO); + + /** + * 上下架商品 + * + * @param shopId 店铺id + * @param skuId ski + * @param isGrounding + */ + void grounding(Integer shopId, Integer skuId, Boolean isGrounding); } 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 a3783d29..5764d35e 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 @@ -86,4 +86,6 @@ public interface TbProductStockDetailService { * @throws IOException / */ void download(List all, HttpServletResponse response) throws IOException; -} \ No newline at end of file + + void addSaleRecord(Integer orderId); +} diff --git a/eladmin-system/src/main/java/cn/ysk/cashier/utils/Utils.java b/eladmin-system/src/main/java/cn/ysk/cashier/utils/Utils.java new file mode 100644 index 00000000..9fa7ad22 --- /dev/null +++ b/eladmin-system/src/main/java/cn/ysk/cashier/utils/Utils.java @@ -0,0 +1,18 @@ +package cn.ysk.cashier.utils; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.function.Supplier; + +public class Utils { + private static final Logger log = LoggerFactory.getLogger(Utils.class); + + public static void catchErrNoReturn(Supplier supplier) { + try { + supplier.get(); + }catch (Exception e) { + log.error("执行方法出现异常", e); + } + } +}