From b9b35849c365c9752dac91c166434ca22a33a021 Mon Sep 17 00:00:00 2001 From: GYJ <1157756119@qq.com> Date: Mon, 24 Jun 2024 11:42:41 +0800 Subject: [PATCH 1/5] =?UTF-8?q?=E5=85=B1=E4=BA=AB=E5=BA=93=E5=AD=98?= =?UTF-8?q?=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/product/StockController.java | 98 ++++--- .../ysk/cashier/dto/product/TbProductDto.java | 5 +- .../mapper/product/TbProductMapper.java | 5 +- .../ysk/cashier/pojo/product/TbProduct.java | 4 + .../cashier/pojo/product/TbProductSku.java | 4 + .../product/TbProductRepository.java | 6 +- .../product/TbProductSkuRepository.java | 61 +++- .../impl/productimpl/StockServiceImpl.java | 264 +++++++++++++++++- .../productimpl/TbProductServiceImpl.java | 7 +- .../cashier/service/product/StockService.java | 15 + .../service/product/TbProductService.java | 4 +- .../cn/ysk/cashier/vo/StockUpdateValueVO.java | 14 + .../java/cn/ysk/cashier/vo/StockV2Vo.java | 83 ++++++ .../main/resources/config/application-dev.yml | 5 +- .../src/main/resources/config/application.yml | 18 +- 15 files changed, 520 insertions(+), 73 deletions(-) create mode 100644 eladmin-system/src/main/java/cn/ysk/cashier/vo/StockUpdateValueVO.java create mode 100644 eladmin-system/src/main/java/cn/ysk/cashier/vo/StockV2Vo.java 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 beebebb7..ea203e2a 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,31 +1,21 @@ package cn.ysk.cashier.controller.product; import cn.ysk.cashier.annotation.Log; -import cn.ysk.cashier.dto.product.OutAndOnDto; import cn.ysk.cashier.dto.product.StockQueryDto; import cn.ysk.cashier.exception.BadRequestException; -import cn.ysk.cashier.pojo.product.TbProductSku; -import cn.ysk.cashier.repository.product.TbProductSkuRepository; -import cn.ysk.cashier.service.TbProductStockOperateService; import cn.ysk.cashier.service.product.StockService; -import cn.ysk.cashier.vo.StockVo; +import cn.ysk.cashier.vo.StockUpdateValueVO; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.apache.poi.xssf.usermodel.XSSFRow; -import org.apache.poi.xssf.usermodel.XSSFSheet; -import org.apache.poi.xssf.usermodel.XSSFWorkbook; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; + import javax.servlet.http.HttpServletResponse; import java.io.IOException; -import java.math.BigDecimal; -import java.util.ArrayList; -import java.util.List; -import java.util.Optional; @RestController @RequiredArgsConstructor @@ -35,8 +25,6 @@ import java.util.Optional; public class StockController { private final StockService stockService; - private final TbProductStockOperateService stockOperateService; - private final TbProductSkuRepository skuRepository; @ApiOperation("库存导出") @PostMapping(value = "download") @@ -44,6 +32,12 @@ public class StockController { stockService.download(criteria,response); } + @ApiOperation("库存导出") + @PostMapping(value = "download/v2") + public void exportTbOrderInfoV2(HttpServletResponse response, @RequestBody StockQueryDto criteria) throws IOException { + stockService.downloadV2(criteria,response); + } + @Log("库存导入") @PostMapping("/doImport") @ApiOperation("文件导入库存") @@ -56,42 +50,26 @@ public class StockController { throw new BadRequestException("文件格式不正确"); } try { - //根据路径获取这个操作excel的实例 - XSSFWorkbook xssfWorkbook = new XSSFWorkbook(file.getInputStream()); - //根据页面index 获取sheet页 - XSSFSheet sheet = xssfWorkbook.getSheetAt(0); - XSSFRow row = null; - List list=new ArrayList<>(); - for (int i = 1; i < sheet.getPhysicalNumberOfRows(); i++) { - row = sheet.getRow(i); - if(row!=null){ - if(row.getCell(0)!=null){ - Optional byId = skuRepository.findById(Integer.valueOf(row.getCell(0).getRawValue())); - if(byId.isPresent()){ - TbProductSku sku = byId.get(); - list.add(new StockVo( - sku.getId(), - row.getCell(1).toString(), - row.getCell(4).toString(), - row.getCell(3).toString(), - row.getCell(5).toString(), - sku.getStockNumber())); - } - } - } - } - log.info("库存导入.importExcel.data:"+list); - OutAndOnDto outAndOnDto=new OutAndOnDto(); - outAndOnDto.setShopId(shopId); - outAndOnDto.setList(new ArrayList<>(list)); - outAndOnDto.setType("purchase"); - outAndOnDto.setRemark("一次性导入 库存数会覆盖"); - outAndOnDto.setIsImport("true"); - outAndOnDto.setTime(System.currentTimeMillis()); - outAndOnDto.setTotalAmount(BigDecimal.ZERO); - outAndOnDto.setPaidAmount(BigDecimal.ZERO); - stockOperateService.createOutAndONOperate(outAndOnDto); - stockService.inHouse(shopId,list); + stockService.importExcel(shopId,file); + } catch (Exception e) { + log.error("文件导入库存异常:",e); + } + return new ResponseEntity<>(HttpStatus.OK); + } + + @Log("库存导入") + @PostMapping("/doImport/v2") + @ApiOperation("文件导入库存") + public ResponseEntity importExcelV2(@RequestParam String shopId,@RequestParam("file") MultipartFile file) { + String fileName = file.getOriginalFilename(); + if (file.isEmpty()) { + throw new BadRequestException("文件不能为空"); + } + if (!fileName.contains("xls") && !fileName.contains("xlsx")) { + throw new BadRequestException("文件格式不正确"); + } + try { + stockService.importExcelV2(shopId,file); } catch (Exception e) { log.error("文件导入库存异常:",e); } @@ -106,6 +84,20 @@ public class StockController { return new ResponseEntity<>(stockService.queryAll(criteria,page,size), HttpStatus.OK); } + @GetMapping("/v2") + @ApiOperation("查询库存") + public ResponseEntity queryTbProductV2(StockQueryDto criteria, + @RequestParam(required = false, defaultValue = "0") Integer page, + @RequestParam(required = false, defaultValue = "10") Integer size){ + return new ResponseEntity<>(stockService.queryAllV2(criteria,page,size), HttpStatus.OK); + } + + @GetMapping("/sku") + @ApiOperation("查询库存") + public ResponseEntity queryProductSku(String productId){ + return new ResponseEntity<>(stockService.queryProductSku(productId), HttpStatus.OK); + } + @GetMapping("/isStock") public ResponseEntity updateIsHot( @RequestParam String shopId, @@ -115,4 +107,10 @@ public class StockController { return new ResponseEntity<>(HttpStatus.OK); } + @PutMapping("productStatus") + public ResponseEntity updateProductStatus(@RequestBody StockUpdateValueVO updateValueVO) { + stockService.updateProductStatus(updateValueVO); + return new ResponseEntity<>("修改成功", HttpStatus.OK); + } + } diff --git a/eladmin-system/src/main/java/cn/ysk/cashier/dto/product/TbProductDto.java b/eladmin-system/src/main/java/cn/ysk/cashier/dto/product/TbProductDto.java index 4a69498d..e8941726 100644 --- a/eladmin-system/src/main/java/cn/ysk/cashier/dto/product/TbProductDto.java +++ b/eladmin-system/src/main/java/cn/ysk/cashier/dto/product/TbProductDto.java @@ -212,6 +212,9 @@ public class TbProductDto implements Serializable { /** 税率 */ private String taxConfigId; + + private Integer stockNumber; + /** * 团购卷分类Id */ @@ -221,4 +224,4 @@ public class TbProductDto implements Serializable { * 商品sku信息 */ private List skuList; -} \ No newline at end of file +} diff --git a/eladmin-system/src/main/java/cn/ysk/cashier/mapper/product/TbProductMapper.java b/eladmin-system/src/main/java/cn/ysk/cashier/mapper/product/TbProductMapper.java index 430be901..9b87648f 100644 --- a/eladmin-system/src/main/java/cn/ysk/cashier/mapper/product/TbProductMapper.java +++ b/eladmin-system/src/main/java/cn/ysk/cashier/mapper/product/TbProductMapper.java @@ -33,6 +33,9 @@ import java.util.stream.Collectors; @Mapper(componentModel = "spring", unmappedTargetPolicy = ReportingPolicy.IGNORE) public interface TbProductMapper extends BaseMapper { default List map(String value) { + if (value == null || value.isEmpty()) { + return null; + } return ListUtil.stringChangeIntegerList(value); } @@ -46,4 +49,4 @@ public interface TbProductMapper extends BaseMapper { .map(String::valueOf) .collect(Collectors.joining(",")); } -} \ No newline at end of file +} diff --git a/eladmin-system/src/main/java/cn/ysk/cashier/pojo/product/TbProduct.java b/eladmin-system/src/main/java/cn/ysk/cashier/pojo/product/TbProduct.java index 719574f7..08c19e03 100644 --- a/eladmin-system/src/main/java/cn/ysk/cashier/pojo/product/TbProduct.java +++ b/eladmin-system/src/main/java/cn/ysk/cashier/pojo/product/TbProduct.java @@ -316,6 +316,10 @@ public class TbProduct implements Serializable { @ApiModelProperty(value = "团购卷分类Id") private String groupCategoryId; + @Column(name = "stock_number") + @ApiModelProperty("库存数量") + private Integer stockNumber; + public void copy(TbProduct source){ BeanUtil.copyProperties(source,this, CopyOptions.create().setIgnoreNullValue(true)); 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 12df97c8..a28d820c 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 @@ -135,4 +135,8 @@ public class TbProductSku implements Serializable { public void copy(TbProductSku source){ BeanUtil.copyProperties(source,this, CopyOptions.create().setIgnoreNullValue(true)); } + + @Column(name = "`is_pause_sale`") + @ApiModelProperty(value = "是否暂停销售") + private Integer isPauseSale = 0; } 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 ccbe80f0..5d389d4c 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 @@ -35,4 +35,8 @@ public interface TbProductRepository extends JpaRepository, @Query(value = "update tb_product set is_hot=0 where shop_id = :shopId and is_hot = 1",nativeQuery = true) @Modifying void updateNullHot(@Param("shopId")String shopId); -} \ No newline at end of file + + @Modifying + @Query("update FROM TbProduct pro set pro.stockNumber=:stockNumber WHERE pro.id =:productId") + void updateProductStockNumber(@Param("productId") Integer productId,@Param("stockNumber") Integer stockNumber); +} 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 0538b63c..d9820c82 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 @@ -1,6 +1,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.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; @@ -51,6 +52,64 @@ public interface TbProductSkuRepository extends JpaRepository searchProStock(@Param("shopId") String shopId, @Param("proName") String proName, @Param("isStock")Integer isStock,@Param("num")Double num, Pageable pageable); + + @Query("SELECT new cn.ysk.cashier.vo.StockV2Vo(" + + "sku.id,pro.id,pro.coverImg,pro.name,unit.name,pro.typeEnum,sku.specSnap,pro.isStock, " + + "CASE " + + " WHEN pro.isDistribute = 1 THEN pro.stockNumber " + + " ELSE SUM(sku.stockNumber) " + + " END " + + ", pro.isDistribute, pro.isPauseSale) " + + "from " + + "TbProduct pro " + + "LEFT JOIN TbProductSku sku on pro.id = sku.productId " + + "LEFT JOIN TbShopUnit unit ON pro.unitId = unit.id " + + "WHERE " + + "pro.shopId = :shopId " + + "AND pro.status = 1 " + + "AND (:proName IS NULL OR pro.name LIKE %:proName%) " + + "AND (:isStock IS NULL OR pro.isStock = :isStock) " + + "group by pro.id " + + "ORDER BY " + + "pro.name DESC,sku.stockNumber DESC") + Page searchProStockV2(@Param("shopId") String shopId, @Param("proName") String proName, @Param("isStock")Integer isStock, Pageable pageable); + + @Query("SELECT new cn.ysk.cashier.vo.StockV2Vo(" + + "sku.id,pro.id,pro.coverImg,pro.name,unit.name,pro.typeEnum,sku.specSnap,pro.isStock, " + + "CASE " + + " WHEN pro.isDistribute = 1 THEN pro.stockNumber " + + " ELSE SUM(sku.stockNumber) " + + " END " + + ", pro.isDistribute, pro.isPauseSale) " + + "from " + + "TbProduct pro " + + "LEFT JOIN TbProductSku sku on pro.id = sku.productId " + + "LEFT JOIN TbShopUnit unit ON pro.unitId = unit.id " + + "WHERE " + + "pro.shopId = :shopId " + + "AND pro.status = 1 " + + "AND (:proName IS NULL OR pro.name LIKE %:proName%) " + + "AND (:isStock IS NULL OR pro.isStock = :isStock) " + + "group by pro.id " + + "ORDER BY " + + "pro.name DESC,sku.stockNumber DESC") + List searchProStockV2(@Param("shopId") String shopId, @Param("proName") String proName, @Param("isStock")Integer isStock); + + + @Query("SELECT new cn.ysk.cashier.vo.StockV2Vo(" + + "sku.id,pro.id,pro.coverImg,pro.name,unit.name,pro.typeEnum,sku.specSnap,pro.isStock,sku.stockNumber, 1, sku.isPauseSale" + + ") " + + "from " + + "TbProductSku sku " + + "left join TbProduct pro on sku.productId = pro.id " + + "left join TbShopUnit unit on pro.unitId = unit.id " + + "where " + + "sku.productId = :productId " + + "order by " + + "sku.stockNumber desc " + ) + List searchProductSkuByProductId(@Param("productId") String productId); + @Query("SELECT new cn.ysk.cashier.vo.StockVo(" + "sku.id,pro.id,pro.coverImg,pro.name,unit.name,pro.typeEnum,sku.specSnap,pro.isStock,sku.stockNumber" + ") " + @@ -87,4 +146,4 @@ public interface TbProductSkuRepository extends JpaRepository queryProductSku(String productId) { + return tbProductSkuRepository.searchProductSkuByProductId(productId); } @Override public void download(StockQueryDto criteria, HttpServletResponse response) throws IOException { List> list = new ArrayList<>(); - List stockVos = tbProductSkuRepository.searchProStock(criteria.getShopId(), criteria.getName(), criteria.getIsStock(),criteria.getNum()); + List stockVos = tbProductSkuRepository.searchProStock(criteria.getShopId(), criteria.getName(), criteria.getIsStock(), criteria.getNum()); for (StockVo all : stockVos) { Map map = new LinkedHashMap<>(); map.put("id(如需导入,该值不可变)", all.getId()); @@ -54,20 +89,227 @@ public class StockServiceImpl implements StockService { } @Override - @Transactional - public void inHouse(String shopId,List list) { - Map idStockMap=new HashMap<>(); - for (StockVo stockVo : list) { - tbProductSkuRepository.updateStockNumber2(stockVo.getId(),shopId,Double.parseDouble(stockVo.getNumber().toString())); - idStockMap.put(stockVo.getId(),Double.parseDouble(stockVo.getNumber().toString())); + public void downloadV2(StockQueryDto summaryDto, HttpServletResponse response) throws IOException { + List> list = new ArrayList<>(); + List stockVos = tbProductSkuRepository.searchProStockV2(summaryDto.getShopId(), summaryDto.getName(), summaryDto.getIsStock()); + for (StockV2Vo all : stockVos) { + Map map = new LinkedHashMap<>(); + map.put("id(如需导入,该值不可变)", all.getProId()); + map.put("商品名称", all.getName()); + map.put("商品skuId(如需导入,该值不可变)", all.getId()); + map.put("商品类型", all.getType()); + map.put("商品规格", all.getSpecSnap()); + map.put("商品单位", all.getUnitName()); + map.put("库存数量", all.getStockNumber()); + map.put("库存开关", all.getIsStock().equals(0) ? "否" : "是"); + map.put("是否共享库存", all.getIsDistribute().equals(0) ? "否" : "是"); + map.put("是否售罄", all.getIsPauseSale().equals(0) ? "否" : "是"); + list.add(map); + + if (all.getIsDistribute().equals(1)) { + continue; + } + + List skuList = queryProductSku(all.getProId().toString()); + for (StockV2Vo sku : skuList) { + Map skuMap = new LinkedHashMap<>(); + skuMap.put("id(如需导入,该值不可变)", all.getProId()); + skuMap.put("商品名称", all.getName()); + skuMap.put("商品skuId(如需导入,该值不可变)", sku.getId()); + skuMap.put("商品类型", sku.getType()); + skuMap.put("商品规格", sku.getSpecSnap()); + skuMap.put("商品单位", sku.getUnitName()); + skuMap.put("库存数量", sku.getStockNumber()); + skuMap.put("库存开关", sku.getIsStock().equals(0) ? "否" : "是"); + skuMap.put("是否共享库存", sku.getIsDistribute().equals(0) ? "否" : "是"); + skuMap.put("是否售罄", sku.getIsPauseSale().equals(0) ? "否" : "是"); + list.add(skuMap); + } } - redisUtils.redisUp(2,shopId,idStockMap); + FileUtil.downloadExcel(list, response); + } + + @Override + public void importExcel(String shopId, MultipartFile file) throws IOException { + //根据路径获取这个操作excel的实例 + XSSFWorkbook xssfWorkbook = new XSSFWorkbook(file.getInputStream()); + //根据页面index 获取sheet页 + XSSFSheet sheet = xssfWorkbook.getSheetAt(0); + XSSFRow row = null; + List list = new ArrayList<>(); + for (int i = 1; i < sheet.getPhysicalNumberOfRows(); i++) { + row = sheet.getRow(i); + if (row != null) { + if (row.getCell(0) != null) { + Optional byId = skuRepository.findById(Integer.valueOf(row.getCell(0).getRawValue())); + if (byId.isPresent()) { + TbProductSku sku = byId.get(); + list.add(new StockVo( + sku.getId(), + row.getCell(1).toString(), + row.getCell(4).toString(), + row.getCell(3).toString(), + row.getCell(5).toString(), + sku.getStockNumber())); + } + } + } + } + log.info("库存导入.importExcel.data:" + list); + OutAndOnDto outAndOnDto = new OutAndOnDto(); + outAndOnDto.setShopId(shopId); + outAndOnDto.setList(new ArrayList<>(list)); + outAndOnDto.setType("purchase"); + outAndOnDto.setRemark("一次性导入 库存数会覆盖"); + outAndOnDto.setIsImport("true"); + outAndOnDto.setTime(System.currentTimeMillis()); + outAndOnDto.setTotalAmount(BigDecimal.ZERO); + outAndOnDto.setPaidAmount(BigDecimal.ZERO); + stockOperateService.createOutAndONOperate(outAndOnDto); + inHouse(shopId, list); + } + + @Override + @Transactional + public void importExcelV2(String shopId, MultipartFile file) throws IOException { + //根据路径获取这个操作excel的实例 + XSSFWorkbook xssfWorkbook = new XSSFWorkbook(file.getInputStream()); + //根据页面index 获取sheet页 + XSSFSheet sheet = xssfWorkbook.getSheetAt(0); + XSSFRow row = null; + List list = new ArrayList<>(); + for (int i = 1; i < sheet.getPhysicalNumberOfRows(); i++) { + row = sheet.getRow(i); + if (row != null) { + XSSFCell cell0 = row.getCell(0); + if (cell0 == null || "".equals(cell0)) { + Optional byId = skuRepository.findById(Integer.valueOf(row.getCell(0).getRawValue())); + if (byId.isPresent()) { + TbProductSku sku = byId.get(); + list.add(new StockV2Vo( + 0, + sku.getId(), + row.getCell(1).getRawValue(), + row.getCell(5).toString(), + row.getCell(4).toString(), + row.getCell(6).toString(), + sku.getStockNumber(), + 0 + )); + } + } else { + TbProductDto product = productService.findById(Integer.valueOf(cell0.getRawValue())); + if (product != null) { + Object number = "0"; + if (product.getIsDistribute().equals(1)) { + number = row.getCell(6).toString(); + } + list.add(new StockV2Vo( + product.getId(), + 0, + product.getName(), + row.getCell(5).toString(), + row.getCell(4).toString(), + number, + product.getStockNumber(), + product.getIsDistribute() + )); + } + } + } + } + log.info("库存导入.importExcel.data:" + list); + OutAndOnDto outAndOnDto = new OutAndOnDto(); + outAndOnDto.setShopId(shopId); + outAndOnDto.setList(new ArrayList<>(list)); + outAndOnDto.setType("purchase"); + outAndOnDto.setRemark("一次性导入 库存数会覆盖"); + outAndOnDto.setIsImport("true"); + outAndOnDto.setTime(System.currentTimeMillis()); + outAndOnDto.setTotalAmount(BigDecimal.ZERO); + outAndOnDto.setPaidAmount(BigDecimal.ZERO); + stockOperateService.createOutAndONOperate(outAndOnDto); + inHouseV2(shopId, list); + } + + @Override + @Transactional + public void inHouse(String shopId, List list) { + Map idStockMap = new HashMap<>(); + for (StockVo stockVo : list) { + tbProductSkuRepository.updateStockNumber2(stockVo.getId(), shopId, Double.parseDouble(stockVo.getNumber().toString())); + idStockMap.put(stockVo.getId(), Double.parseDouble(stockVo.getNumber().toString())); + } + redisUtils.redisUp(2, shopId, idStockMap); + } + + @Transactional + public void inHouseV2(String shopId, List list) { + Map idStockMap = new HashMap<>(); + for (StockV2Vo stockVo : list) { + if (stockVo.getProId() == 0) { + tbProductSkuRepository.updateStockNumber2(stockVo.getId(), shopId, Double.parseDouble(stockVo.getNumber().toString())); + } else { + productService.updateStockNumber(stockVo.getProId(), Double.parseDouble(stockVo.getNumber().toString())); + } + idStockMap.put(stockVo.getId(), Double.parseDouble(stockVo.getNumber().toString())); + } + redisUtils.redisUp(2, shopId, idStockMap); } @Transactional @Override - public void updateIsStock(Integer proId, String shopId,Integer isStock) { - productService.updateIsStock(proId,shopId,isStock); + public void updateIsStock(Integer proId, String shopId, Integer isStock) { + productService.updateIsStock(proId, shopId, isStock); } + @Override + @Transactional + public void updateProductStatus(StockUpdateValueVO updateValueVO) { + if (!"0".equals(updateValueVO.getUpdateValue()) && !"1".equals(updateValueVO.getUpdateValue())) { + throw new BadRequestException("无效值"); + } + if (StringUtils.isBlank(updateValueVO.getTargetId())) { + throw new BadRequestException("更新id不能为空"); + } + StringBuilder sqlQuery = new StringBuilder("update tb_product "); + + switch (updateValueVO.getUpdateKey()) { + case "pauseSaleSku": + sqlQuery = new StringBuilder("update tb_product_sku set is_pause_sale = "). + append(updateValueVO.getUpdateValue()). + append(" where id = "). + append(updateValueVO.getTargetId()). + append(";"); + + System.out.println(sqlQuery); + Query nativeQuery = em.createNativeQuery(String.valueOf(sqlQuery)); + nativeQuery.executeUpdate(); + return; + case "stock": + sqlQuery.append(" set is_stock = ").append(updateValueVO.getUpdateValue()); + break; + case "distribute": + sqlQuery.append(" set is_distribute = ").append(updateValueVO.getUpdateValue()); + break; + case "pauseSale": + sqlQuery.append(" set is_pause_sale = ").append(updateValueVO.getUpdateValue()); + break; + default: + throw new BadRequestException("无效更新类型"); + } + + sqlQuery.append(" where "); + + if (StringUtils.isNotBlank(updateValueVO.getShopId())) { + sqlQuery.append(" shop_id = ").append(updateValueVO.getShopId()); + sqlQuery.append(" and "); + } + sqlQuery.append(" id = ").append(updateValueVO.getTargetId()); + + sqlQuery.append(" ;"); + + Query nativeQuery = em.createNativeQuery(String.valueOf(sqlQuery)); + nativeQuery.executeUpdate(); + } } diff --git a/eladmin-system/src/main/java/cn/ysk/cashier/service/impl/productimpl/TbProductServiceImpl.java b/eladmin-system/src/main/java/cn/ysk/cashier/service/impl/productimpl/TbProductServiceImpl.java index 0bf73000..646429f4 100644 --- a/eladmin-system/src/main/java/cn/ysk/cashier/service/impl/productimpl/TbProductServiceImpl.java +++ b/eladmin-system/src/main/java/cn/ysk/cashier/service/impl/productimpl/TbProductServiceImpl.java @@ -520,6 +520,11 @@ public class TbProductServiceImpl implements TbProductService { } } + @Override + public void updateStockNumber(Integer id, Double stockNumber) { + tbProductRepository.updateProductStockNumber(id, stockNumber.intValue()); + } + @Override @Transactional public void deleteAll(Integer[] ids) { @@ -604,4 +609,4 @@ public class TbProductServiceImpl implements TbProductService { } FileUtil.downloadExcel(list, response); } -} \ No newline at end of file +} 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 04cb5e86..d293b5a3 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 @@ -1,8 +1,11 @@ package cn.ysk.cashier.service.product; import cn.ysk.cashier.dto.product.StockQueryDto; +import cn.ysk.cashier.vo.StockUpdateValueVO; +import cn.ysk.cashier.vo.StockV2Vo; import cn.ysk.cashier.vo.StockVo; import org.springframework.data.domain.Page; +import org.springframework.web.multipart.MultipartFile; import javax.servlet.http.HttpServletResponse; import java.io.IOException; @@ -17,9 +20,21 @@ public interface StockService { */ Page queryAll(StockQueryDto criteria, Integer page, Integer size); + Page queryAllV2(StockQueryDto criteria, Integer page, Integer size); + + List queryProductSku(String productId); + void download(StockQueryDto summaryDto, HttpServletResponse response) throws IOException; + void downloadV2(StockQueryDto summaryDto, HttpServletResponse response) throws IOException; + + void importExcel(String shopId, MultipartFile file) throws IOException; + + void importExcelV2(String shopId, MultipartFile file) throws IOException; + void inHouse(String shopId,List list); void updateIsStock(Integer proId, String shopId,Integer isStock); + + void updateProductStatus(StockUpdateValueVO updateValueVO); } diff --git a/eladmin-system/src/main/java/cn/ysk/cashier/service/product/TbProductService.java b/eladmin-system/src/main/java/cn/ysk/cashier/service/product/TbProductService.java index 59d5d7ad..31d4f609 100644 --- a/eladmin-system/src/main/java/cn/ysk/cashier/service/product/TbProductService.java +++ b/eladmin-system/src/main/java/cn/ysk/cashier/service/product/TbProductService.java @@ -59,6 +59,8 @@ public interface TbProductService { void upProSort(TbProductSortCriteria param); + void updateStockNumber(Integer id, Double stockNumber); + /** * 多选删除 * @param ids / @@ -75,4 +77,4 @@ public interface TbProductService { void updateIsHot(Integer id, String shopId); void updateIsStock(Integer proId, String shopId,Integer isStock); -} \ No newline at end of file +} diff --git a/eladmin-system/src/main/java/cn/ysk/cashier/vo/StockUpdateValueVO.java b/eladmin-system/src/main/java/cn/ysk/cashier/vo/StockUpdateValueVO.java new file mode 100644 index 00000000..c7ee21c4 --- /dev/null +++ b/eladmin-system/src/main/java/cn/ysk/cashier/vo/StockUpdateValueVO.java @@ -0,0 +1,14 @@ +package cn.ysk.cashier.vo; + +import lombok.Data; + +/** + * @author GYJ + */ +@Data +public class StockUpdateValueVO { + private String updateValue; + private String updateKey; + private String targetId; + private String shopId; +} diff --git a/eladmin-system/src/main/java/cn/ysk/cashier/vo/StockV2Vo.java b/eladmin-system/src/main/java/cn/ysk/cashier/vo/StockV2Vo.java new file mode 100644 index 00000000..c52ac8d9 --- /dev/null +++ b/eladmin-system/src/main/java/cn/ysk/cashier/vo/StockV2Vo.java @@ -0,0 +1,83 @@ +package cn.ysk.cashier.vo; + +import lombok.Data; + +import java.util.List; + +/** + * @author GYJ + */ +@Data +public class StockV2Vo { + private Integer id; + private Integer proId; + private String img; + private String name; + private String unitName; + private String type; + private String specSnap; + private Object isStock; + private Object stockNumber; + private Integer isDistribute; + private Integer isPauseSale; + private Object number; + + public StockV2Vo(Integer proId, Integer skuId, String name, String unitName,String specSnap, Object number,Object stockNumber, Integer isDistribute) { + this.proId = proId; + this.id = skuId; + this.name = name; + this.unitName = unitName; + this.specSnap = specSnap; + this.number = number; + this.stockNumber = stockNumber; + this.isDistribute = isDistribute; + } + + public StockV2Vo(Integer id, Integer proId,String img,String name,String unitName, String type, String specSnap, + Object isStock, Object number, Integer isDistribute, Integer isPauseSale) { + this.id = id; + this.proId = proId; + this.img = img; + this.name = name; + this.unitName = unitName; + setType(type); + this.specSnap = specSnap; + this.isStock = isStock; + this.stockNumber = number; + this.isDistribute = isDistribute; + this.isPauseSale = isPauseSale; + } + + public void setType(String type) { + switch (type) { + case "normal": + this.type = "单规格"; + break; + case "sku": + this.type = "多规格"; + break; + case "weight": + this.type = "称重商品"; + break; + case "currentPrice": + this.type = "套餐商品/团购卷"; + break; + case "group": + this.type = "时价商品"; + break; + default: + this.type = type; + break; + } + } + + @Override + public String toString() { + return "{" + + "\"name\":\"" + name + "\","+ + "\"unitName\":\"" + unitName +"\","+ + "\"specSnap\":\"" + specSnap + "\"," + + "\"stockNumber\":\"" + stockNumber + "\"," + + "}"; + } +} diff --git a/eladmin-system/src/main/resources/config/application-dev.yml b/eladmin-system/src/main/resources/config/application-dev.yml index e74c0fc4..2954817d 100644 --- a/eladmin-system/src/main/resources/config/application-dev.yml +++ b/eladmin-system/src/main/resources/config/application-dev.yml @@ -3,10 +3,13 @@ spring: datasource: druid: db-type: com.alibaba.druid.pool.DruidDataSource - #driverClassName: net.sf.log4jdbc.sql.jdbcapi.DriverSpy +# driverClassName: net.sf.log4jdbc.sql.jdbcapi.DriverSpy url: jdbc:mysql://101.37.12.135:3306/fycashier?useUnicode=true&characterEncoding=utf8&characterSetResults=utf8&useJDBCCompliantTimezoneShift=true&serverTimezone=Asia/Shanghai&useSSL=false&allowMultiQueries=true username: fycashier password: Twc6MrzzjBiWSsjh +# url: jdbc:mysql://127.0.0.1:3306/fycashier?useUnicode=true&characterEncoding=utf8&characterSetResults=utf8&useJDBCCompliantTimezoneShift=true&serverTimezone=Asia/Shanghai&useSSL=false&allowMultiQueries=true +# username: root +# password: gongyijieqp002 driver-class-name: com.mysql.cj.jdbc.Driver # 初始连接数 initial-size: 5 diff --git a/eladmin-system/src/main/resources/config/application.yml b/eladmin-system/src/main/resources/config/application.yml index ce970c14..b0b30b71 100644 --- a/eladmin-system/src/main/resources/config/application.yml +++ b/eladmin-system/src/main/resources/config/application.yml @@ -29,7 +29,7 @@ spring: properties: hibernate: dialect: org.hibernate.dialect.MySQL5InnoDBDialect - show_sql: false + show_sql: true # redisdb5: # #数据库索引 @@ -38,12 +38,20 @@ spring: # port: ${REDIS_PORT:6379} # password: ${REDIS_PWD:111111} +# redis: +# #数据库索引 +# database: ${REDIS_DB:0} +# host: ${REDIS_HOST:127.0.0.1} +# port: ${REDIS_PORT:6379} +# password: ${REDIS_PWD:111111} +# #连接超时时间 +# timeout: 5000 redis: #数据库索引 - database: ${REDIS_DB:0} - host: ${REDIS_HOST:127.0.0.1} - port: ${REDIS_PORT:6379} - password: ${REDIS_PWD:111111} + database: 0 + host: 127.0.0.1 + port: 6379 + password: #连接超时时间 timeout: 5000 From 063d5731f38ac8227f11bbbdfbcd2c673f8738a2 Mon Sep 17 00:00:00 2001 From: GYJ <1157756119@qq.com> Date: Mon, 24 Jun 2024 15:25:06 +0800 Subject: [PATCH 2/5] =?UTF-8?q?=E5=85=B1=E4=BA=AB=E5=BA=93=E5=AD=98?= =?UTF-8?q?=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../product/TbProductSkuRepository.java | 4 ++-- .../impl/productimpl/StockServiceImpl.java | 4 ++-- .../impl/productimpl/TbProductServiceImpl.java | 16 ++++++++++------ .../main/java/cn/ysk/cashier/vo/StockV2Vo.java | 8 +++++--- 4 files changed, 19 insertions(+), 13 deletions(-) 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 d9820c82..be2a0255 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 @@ -54,7 +54,7 @@ public interface TbProductSkuRepository extends JpaRepository searchProStock(@Param("shopId") String shopId, @Param("proName") String proName, @Param("isStock")Integer isStock,@Param("num")Double num, Pageable pageable); @Query("SELECT new cn.ysk.cashier.vo.StockV2Vo(" + - "sku.id,pro.id,pro.coverImg,pro.name,unit.name,pro.typeEnum,sku.specSnap,pro.isStock, " + + "0,pro.id,pro.coverImg,pro.name,unit.name,pro.typeEnum,sku.specSnap,pro.isStock, " + "CASE " + " WHEN pro.isDistribute = 1 THEN pro.stockNumber " + " ELSE SUM(sku.stockNumber) " + @@ -75,7 +75,7 @@ public interface TbProductSkuRepository extends JpaRepository searchProStockV2(@Param("shopId") String shopId, @Param("proName") String proName, @Param("isStock")Integer isStock, Pageable pageable); @Query("SELECT new cn.ysk.cashier.vo.StockV2Vo(" + - "sku.id,pro.id,pro.coverImg,pro.name,unit.name,pro.typeEnum,sku.specSnap,pro.isStock, " + + "sku.id,0,pro.coverImg,pro.name,unit.name,pro.typeEnum,sku.specSnap,pro.isStock, " + "CASE " + " WHEN pro.isDistribute = 1 THEN pro.stockNumber " + " ELSE SUM(sku.stockNumber) " + diff --git a/eladmin-system/src/main/java/cn/ysk/cashier/service/impl/productimpl/StockServiceImpl.java b/eladmin-system/src/main/java/cn/ysk/cashier/service/impl/productimpl/StockServiceImpl.java index 2281ce27..c96a0fee 100644 --- a/eladmin-system/src/main/java/cn/ysk/cashier/service/impl/productimpl/StockServiceImpl.java +++ b/eladmin-system/src/main/java/cn/ysk/cashier/service/impl/productimpl/StockServiceImpl.java @@ -248,11 +248,11 @@ public class StockServiceImpl implements StockService { Map idStockMap = new HashMap<>(); for (StockV2Vo stockVo : list) { if (stockVo.getProId() == 0) { - tbProductSkuRepository.updateStockNumber2(stockVo.getId(), shopId, Double.parseDouble(stockVo.getNumber().toString())); + tbProductSkuRepository.updateStockNumber2(stockVo.getSkuId(), shopId, Double.parseDouble(stockVo.getNumber().toString())); } else { productService.updateStockNumber(stockVo.getProId(), Double.parseDouble(stockVo.getNumber().toString())); } - idStockMap.put(stockVo.getId(), Double.parseDouble(stockVo.getNumber().toString())); + idStockMap.put(stockVo.getSkuId(), Double.parseDouble(stockVo.getNumber().toString())); } redisUtils.redisUp(2, shopId, idStockMap); } diff --git a/eladmin-system/src/main/java/cn/ysk/cashier/service/impl/productimpl/TbProductServiceImpl.java b/eladmin-system/src/main/java/cn/ysk/cashier/service/impl/productimpl/TbProductServiceImpl.java index 646429f4..6dbaf19a 100644 --- a/eladmin-system/src/main/java/cn/ysk/cashier/service/impl/productimpl/TbProductServiceImpl.java +++ b/eladmin-system/src/main/java/cn/ysk/cashier/service/impl/productimpl/TbProductServiceImpl.java @@ -126,12 +126,16 @@ public class TbProductServiceImpl implements TbProductService { List skuList = new ArrayList<>(); TbProductVo tbProductVo = new TbProductVo(); //sku,并且计算销量以及库存 - Double stockNumber = 0.00; - for (TbProductSku sku : tbProductSkus) { - //sku - if (sku.getProductId().equals(product.getId().toString())) { - skuList.add(sku); - stockNumber = stockNumber + sku.getStockNumber(); + double stockNumber = 0.00; + if (product.getIsDistribute() == 1) { + stockNumber = Double.valueOf(product.getStockNumber()); + } else { + for (TbProductSku sku : tbProductSkus) { + //sku + if (sku.getProductId().equals(product.getId().toString())) { + skuList.add(sku); + stockNumber = stockNumber + sku.getStockNumber(); + } } } tbProductVo.setStockNumber(stockNumber); diff --git a/eladmin-system/src/main/java/cn/ysk/cashier/vo/StockV2Vo.java b/eladmin-system/src/main/java/cn/ysk/cashier/vo/StockV2Vo.java index c52ac8d9..28b3bf45 100644 --- a/eladmin-system/src/main/java/cn/ysk/cashier/vo/StockV2Vo.java +++ b/eladmin-system/src/main/java/cn/ysk/cashier/vo/StockV2Vo.java @@ -9,7 +9,8 @@ import java.util.List; */ @Data public class StockV2Vo { - private Integer id; + private String id; + private Integer skuId; private Integer proId; private String img; private String name; @@ -24,7 +25,7 @@ public class StockV2Vo { public StockV2Vo(Integer proId, Integer skuId, String name, String unitName,String specSnap, Object number,Object stockNumber, Integer isDistribute) { this.proId = proId; - this.id = skuId; + this.skuId = skuId; this.name = name; this.unitName = unitName; this.specSnap = specSnap; @@ -35,7 +36,8 @@ public class StockV2Vo { public StockV2Vo(Integer id, Integer proId,String img,String name,String unitName, String type, String specSnap, Object isStock, Object number, Integer isDistribute, Integer isPauseSale) { - this.id = id; + this.id = id.toString() + "-" + proId.toString(); + this.skuId = id; this.proId = proId; this.img = img; this.name = name; From 6f9488928c4c18da5314e44d5ad26561e7e19a32 Mon Sep 17 00:00:00 2001 From: GYJ <1157756119@qq.com> Date: Mon, 24 Jun 2024 18:01:45 +0800 Subject: [PATCH 3/5] =?UTF-8?q?=E6=89=B9=E9=87=8F=E5=AF=BC=E5=85=A5?= =?UTF-8?q?=E5=BA=93=E5=AD=98bug=20fix?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../product/TbProductSkuRepository.java | 10 +++++----- .../impl/productimpl/StockServiceImpl.java | 19 ++++++++++--------- .../java/cn/ysk/cashier/vo/StockV2Vo.java | 7 ++++++- 3 files changed, 21 insertions(+), 15 deletions(-) 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 be2a0255..5bc2a8f9 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 @@ -54,12 +54,12 @@ public interface TbProductSkuRepository extends JpaRepository searchProStock(@Param("shopId") String shopId, @Param("proName") String proName, @Param("isStock")Integer isStock,@Param("num")Double num, Pageable pageable); @Query("SELECT new cn.ysk.cashier.vo.StockV2Vo(" + - "0,pro.id,pro.coverImg,pro.name,unit.name,pro.typeEnum,sku.specSnap,pro.isStock, " + + "sku.id,pro.id,pro.coverImg,pro.name,unit.name,pro.typeEnum,sku.specSnap,pro.isStock, " + "CASE " + " WHEN pro.isDistribute = 1 THEN pro.stockNumber " + " ELSE SUM(sku.stockNumber) " + " END " + - ", pro.isDistribute, pro.isPauseSale) " + + ", pro.isDistribute, pro.isPauseSale, true) " + "from " + "TbProduct pro " + "LEFT JOIN TbProductSku sku on pro.id = sku.productId " + @@ -75,12 +75,12 @@ public interface TbProductSkuRepository extends JpaRepository searchProStockV2(@Param("shopId") String shopId, @Param("proName") String proName, @Param("isStock")Integer isStock, Pageable pageable); @Query("SELECT new cn.ysk.cashier.vo.StockV2Vo(" + - "sku.id,0,pro.coverImg,pro.name,unit.name,pro.typeEnum,sku.specSnap,pro.isStock, " + + "sku.id,pro.id,pro.coverImg,pro.name,unit.name,pro.typeEnum,sku.specSnap,pro.isStock, " + "CASE " + " WHEN pro.isDistribute = 1 THEN pro.stockNumber " + " ELSE SUM(sku.stockNumber) " + " END " + - ", pro.isDistribute, pro.isPauseSale) " + + ", pro.isDistribute, pro.isPauseSale, true ) " + "from " + "TbProduct pro " + "LEFT JOIN TbProductSku sku on pro.id = sku.productId " + @@ -97,7 +97,7 @@ public interface TbProductSkuRepository extends JpaRepository map = new LinkedHashMap<>(); map.put("id(如需导入,该值不可变)", all.getProId()); map.put("商品名称", all.getName()); - map.put("商品skuId(如需导入,该值不可变)", all.getId()); + map.put("商品skuId(如需导入,该值不可变)", all.getSkuId()); map.put("商品类型", all.getType()); map.put("商品规格", all.getSpecSnap()); map.put("商品单位", all.getUnitName()); @@ -113,9 +113,9 @@ public class StockServiceImpl implements StockService { List skuList = queryProductSku(all.getProId().toString()); for (StockV2Vo sku : skuList) { Map skuMap = new LinkedHashMap<>(); - skuMap.put("id(如需导入,该值不可变)", all.getProId()); + skuMap.put("id(如需导入,该值不可变)", ""); skuMap.put("商品名称", all.getName()); - skuMap.put("商品skuId(如需导入,该值不可变)", sku.getId()); + skuMap.put("商品skuId(如需导入,该值不可变)", sku.getSkuId()); skuMap.put("商品类型", sku.getType()); skuMap.put("商品规格", sku.getSpecSnap()); skuMap.put("商品单位", sku.getUnitName()); @@ -141,7 +141,7 @@ public class StockServiceImpl implements StockService { row = sheet.getRow(i); if (row != null) { if (row.getCell(0) != null) { - Optional byId = skuRepository.findById(Integer.valueOf(row.getCell(0).getRawValue())); + Optional byId = skuRepository.findById(Integer.valueOf(row.getCell(0).toString())); if (byId.isPresent()) { TbProductSku sku = byId.get(); list.add(new StockVo( @@ -182,14 +182,15 @@ public class StockServiceImpl implements StockService { row = sheet.getRow(i); if (row != null) { XSSFCell cell0 = row.getCell(0); - if (cell0 == null || "".equals(cell0)) { - Optional byId = skuRepository.findById(Integer.valueOf(row.getCell(0).getRawValue())); + String productIdStr = cell0.toString(); + if (StringUtils.isBlank(productIdStr)) { + Optional byId = skuRepository.findById(Double.valueOf(row.getCell(2).toString()).intValue()); if (byId.isPresent()) { TbProductSku sku = byId.get(); list.add(new StockV2Vo( 0, sku.getId(), - row.getCell(1).getRawValue(), + row.getCell(1).toString(), row.getCell(5).toString(), row.getCell(4).toString(), row.getCell(6).toString(), @@ -198,7 +199,7 @@ public class StockServiceImpl implements StockService { )); } } else { - TbProductDto product = productService.findById(Integer.valueOf(cell0.getRawValue())); + TbProductDto product = productService.findById(Double.valueOf(productIdStr).intValue()); if (product != null) { Object number = "0"; if (product.getIsDistribute().equals(1)) { @@ -282,7 +283,6 @@ public class StockServiceImpl implements StockService { append(updateValueVO.getTargetId()). append(";"); - System.out.println(sqlQuery); Query nativeQuery = em.createNativeQuery(String.valueOf(sqlQuery)); nativeQuery.executeUpdate(); return; @@ -308,6 +308,7 @@ public class StockServiceImpl implements StockService { sqlQuery.append(" id = ").append(updateValueVO.getTargetId()); sqlQuery.append(" ;"); + System.out.println(sqlQuery); Query nativeQuery = em.createNativeQuery(String.valueOf(sqlQuery)); nativeQuery.executeUpdate(); diff --git a/eladmin-system/src/main/java/cn/ysk/cashier/vo/StockV2Vo.java b/eladmin-system/src/main/java/cn/ysk/cashier/vo/StockV2Vo.java index 28b3bf45..d8979eec 100644 --- a/eladmin-system/src/main/java/cn/ysk/cashier/vo/StockV2Vo.java +++ b/eladmin-system/src/main/java/cn/ysk/cashier/vo/StockV2Vo.java @@ -35,8 +35,13 @@ public class StockV2Vo { } public StockV2Vo(Integer id, Integer proId,String img,String name,String unitName, String type, String specSnap, - Object isStock, Object number, Integer isDistribute, Integer isPauseSale) { + Object isStock, Object number, Integer isDistribute, Integer isPauseSale, boolean isPro) { this.id = id.toString() + "-" + proId.toString(); + if (isPro) { + this.id += proId; + } else { + this.id += id; + } this.skuId = id; this.proId = proId; this.img = img; From f51fcece8e7fc35cce090503acc02d5349f398c1 Mon Sep 17 00:00:00 2001 From: GYJ <1157756119@qq.com> Date: Tue, 25 Jun 2024 09:25:27 +0800 Subject: [PATCH 4/5] =?UTF-8?q?=E5=87=BA=E5=BA=93=E5=BA=93=E5=AD=98?= =?UTF-8?q?=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../TbProductStockOperateServiceImpl.java | 26 +++++++++++++++---- 1 file changed, 21 insertions(+), 5 deletions(-) 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 1509fd67..373ad303 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,6 +1,8 @@ package cn.ysk.cashier.service.impl.productimpl; +import cn.ysk.cashier.pojo.product.TbProduct; import cn.ysk.cashier.pojo.shop.TbShopPurveyor; +import cn.ysk.cashier.repository.product.TbProductRepository; import cn.ysk.cashier.repository.shop.TbShopPurveyorRepository; import cn.ysk.cashier.utils.*; import com.alibaba.fastjson.JSON; @@ -60,6 +62,7 @@ public class TbProductStockOperateServiceImpl implements TbProductStockOperateSe private final EntityManager entityManager; private final RedisUtils redisUtils; + private final TbProductRepository tbProductRepository; @Override @@ -205,12 +208,20 @@ public class TbProductStockOperateServiceImpl implements TbProductStockOperateSe continue; } TbProductSku tbProductSku = tbProductSkuRepository.findById(productListDto.getId()).orElseGet(TbProductSku::new); + + TbProduct product = tbProductRepository.findById(Integer.valueOf(productListDto.getProductId())).orElseGet(TbProduct::new); + if (product.getId() == null) { + throw new BadRequestException("商品有误"); + } + + boolean isDistribute = product.getIsDistribute() == 1; + TbProductStockDetail productStockDetail = new TbProductStockDetail(); productStockDetail.setBatchNumber(resources.getBatchNumber()); productStockDetail.setCreatedAt(times); productStockDetail.setUpdatedAt(times); productStockDetail.setIsStock(1); - Integer round = (int) Math.floor(tbProductSku.getStockNumber()); + Integer round = (int) Math.floor(isDistribute ? product.getStockNumber() : tbProductSku.getStockNumber()); productStockDetail.setLeftNumber(round); productStockDetail.setProductId(productListDto.getProductId()); productStockDetail.setProductName(productListDto.getName()); @@ -251,9 +262,14 @@ public class TbProductStockOperateServiceImpl implements TbProductStockOperateSe productStockDetail.setType(resources.getType()); productStockDetail.setUnitName(productListDto.getUnitName()); entityManager.persist(productStockDetail); - //sku数量 - tbProductSku.setStockNumber(tbProductSku.getStockNumber() + productStockDetail.getStockNumber()); - productSkuService.update(tbProductSku); + if (isDistribute) { + product.setStockNumber(product.getStockNumber() + productStockDetail.getStockNumber().intValue()); + tbProductRepository.save(product); + } else { + //sku数量 + tbProductSku.setStockNumber(tbProductSku.getStockNumber() + productStockDetail.getStockNumber()); + productSkuService.update(tbProductSku); + } idStockMap.put(productListDto.getId(), productStockDetail.getStockNumber()); } redisUtils.redisUp(2, resources.getShopId(), idStockMap); @@ -316,4 +332,4 @@ public class TbProductStockOperateServiceImpl implements TbProductStockOperateSe } FileUtil.downloadExcel(list, response); } -} \ No newline at end of file +} From 98439a14b80c1ff11819c8d63e74b8e8b8e4d971 Mon Sep 17 00:00:00 2001 From: SongZhang <2064194730@qq.com> Date: Tue, 25 Jun 2024 11:06:48 +0800 Subject: [PATCH 5/5] =?UTF-8?q?=E6=B8=85=E7=A9=BA=E8=B4=AD=E7=89=A9?= =?UTF-8?q?=E8=BD=A6=E5=90=8C=E6=97=B6=E8=BF=94=E8=BF=98=E5=BA=93=E5=AD=98?= =?UTF-8?q?=E5=8F=8A=E9=94=80=E9=87=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/cn/ysk/cashier/utils/CacheKey.java | 4 ++ .../java/cn/ysk/cashier/utils/RedisUtils.java | 4 ++ .../cn/ysk/cashier/quartz/task/TestTask.java | 10 ++++- .../product/TbProductRepository.java | 4 ++ .../impl/order/TbCashierCartServiceImpl.java | 42 +++++++++++++++++-- .../productimpl/TbProductServiceImpl.java | 5 +++ .../service/order/TbCashierCartService.java | 6 +++ .../service/product/TbProductService.java | 7 ++++ 8 files changed, 77 insertions(+), 5 deletions(-) diff --git a/eladmin-common/src/main/java/cn/ysk/cashier/utils/CacheKey.java b/eladmin-common/src/main/java/cn/ysk/cashier/utils/CacheKey.java index 65084cfa..57f3db87 100644 --- a/eladmin-common/src/main/java/cn/ysk/cashier/utils/CacheKey.java +++ b/eladmin-common/src/main/java/cn/ysk/cashier/utils/CacheKey.java @@ -67,4 +67,8 @@ public interface CacheKey { * 库存 PRODUCT:shopid:skuid */ String PRODUCT_SKU = "PRODUCT:"; + /** + * 商品库存 + */ + String PRODUCT = "PRODUCT:"; } diff --git a/eladmin-common/src/main/java/cn/ysk/cashier/utils/RedisUtils.java b/eladmin-common/src/main/java/cn/ysk/cashier/utils/RedisUtils.java index 6b712a5b..a7447e8d 100644 --- a/eladmin-common/src/main/java/cn/ysk/cashier/utils/RedisUtils.java +++ b/eladmin-common/src/main/java/cn/ysk/cashier/utils/RedisUtils.java @@ -716,6 +716,10 @@ public class RedisUtils { redisTemplate.opsForValue().increment(key, delta); } + public void decrBy(String key, long delta) { + redisTemplate.opsForValue().decrement(key, delta); + } + /** * @param prefix 前缀 * @param ids id diff --git a/eladmin-system/src/main/java/cn/ysk/cashier/quartz/task/TestTask.java b/eladmin-system/src/main/java/cn/ysk/cashier/quartz/task/TestTask.java index 14ee26d7..ca351839 100644 --- a/eladmin-system/src/main/java/cn/ysk/cashier/quartz/task/TestTask.java +++ b/eladmin-system/src/main/java/cn/ysk/cashier/quartz/task/TestTask.java @@ -3,12 +3,14 @@ package cn.ysk.cashier.quartz.task; import cn.ysk.cashier.pojo.order.TbCashierCart; import cn.ysk.cashier.repository.order.TbCashierCartRepository; import cn.ysk.cashier.repository.product.TbProductSkuRepository; +import cn.ysk.cashier.service.order.TbCashierCartService; import cn.ysk.cashier.service.shop.TbShopStorageService; import cn.ysk.cashier.utils.CacheKey; import cn.ysk.cashier.utils.QueryHelp; import cn.ysk.cashier.utils.RedisUtils; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -36,6 +38,12 @@ public class TestTask { @Autowired private RedisUtils redisUtils; + private final TbCashierCartService tbCashierCartService; + + public TestTask(TbCashierCartService tbCashierCartService) { + this.tbCashierCartService = tbCashierCartService; + } + public void run(){ log.info("run 执行成功"); @@ -70,7 +78,7 @@ public class TestTask { }); Set keys = new HashSet<>(); for (TbCashierCart cart : all) { - skuRepository.updateStockNumber(Integer.valueOf(cart.getSkuId()),cart.getNumber().doubleValue()); + tbCashierCartService.clearExpireOrder(cart); cart.setStatus("cancelled"); cartService.save(cart); keys.add(CacheKey.PRODUCT_SKU + cart.getShopId() + ":" + cart.getSkuId()); 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 5d389d4c..ed474244 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 @@ -39,4 +39,8 @@ public interface TbProductRepository extends JpaRepository, @Modifying @Query("update FROM TbProduct pro set pro.stockNumber=:stockNumber WHERE pro.id =:productId") void updateProductStockNumber(@Param("productId") Integer productId,@Param("stockNumber") Integer stockNumber); + + @Modifying + @Query("update FROM TbProduct pro set pro.stockNumber=pro.stockNumber+:number WHERE pro.id =:productId") + void incrProductStockNumber(Integer productId, Integer number); } diff --git a/eladmin-system/src/main/java/cn/ysk/cashier/service/impl/order/TbCashierCartServiceImpl.java b/eladmin-system/src/main/java/cn/ysk/cashier/service/impl/order/TbCashierCartServiceImpl.java index 9f2cf34d..8b73c237 100644 --- a/eladmin-system/src/main/java/cn/ysk/cashier/service/impl/order/TbCashierCartServiceImpl.java +++ b/eladmin-system/src/main/java/cn/ysk/cashier/service/impl/order/TbCashierCartServiceImpl.java @@ -15,24 +15,31 @@ */ package cn.ysk.cashier.service.impl.order; +import cn.ysk.cashier.dto.product.TbProductDto; import cn.ysk.cashier.pojo.order.TbCashierCart; -import cn.ysk.cashier.utils.ValidationUtil; -import cn.ysk.cashier.utils.FileUtil; +import cn.ysk.cashier.pojo.product.TbProduct; +import cn.ysk.cashier.repository.product.TbProductRepository; +import cn.ysk.cashier.repository.product.TbProductSkuRepository; +import cn.ysk.cashier.service.product.TbProductService; +import cn.ysk.cashier.utils.*; import lombok.RequiredArgsConstructor; import cn.ysk.cashier.repository.order.TbCashierCartRepository; import cn.ysk.cashier.service.order.TbCashierCartService; import cn.ysk.cashier.dto.order.TbCashierCartDto; import cn.ysk.cashier.dto.order.TbCashierCartQueryCriteria; import cn.ysk.cashier.mapper.order.TbCashierCartMapper; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.data.jpa.domain.Specification; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; -import cn.ysk.cashier.utils.PageUtil; -import cn.ysk.cashier.utils.QueryHelp; + import java.util.List; import java.util.Map; import java.io.IOException; +import javax.persistence.criteria.*; import javax.servlet.http.HttpServletResponse; import java.util.ArrayList; import java.util.LinkedHashMap; @@ -47,8 +54,14 @@ import java.util.LinkedHashMap; @RequiredArgsConstructor public class TbCashierCartServiceImpl implements TbCashierCartService { + private static final Logger log = LoggerFactory.getLogger(TbCashierCartServiceImpl.class); private final TbCashierCartRepository tbCashierCartRepository; private final TbCashierCartMapper tbCashierCartMapper; + private final TbProductService tbproductService; + private final TbProductSkuRepository skuRepository; + private final RedisUtils redisUtils; + private final TbProductRepository tbProductRepository; + @Override public Map queryAll(TbCashierCartQueryCriteria criteria, Pageable pageable){ @@ -127,4 +140,25 @@ public class TbCashierCartServiceImpl implements TbCashierCartService { } FileUtil.downloadExcel(list, response); } + + @Override + public void clearExpireOrder(TbCashierCart cart) { + String key = CacheKey.PRODUCT + cart.getShopId() + ":product" + cart.getProductId(); + TbProduct tbProduct = tbProductRepository.findById(Integer.valueOf(cart.getProductId())).orElse(null); + if (tbProduct == null) { + log.warn("清空购物车查询订单失败,product id: {}", cart.getProductId()); + return; + } + if (tbProduct.getIsDistribute() == 1) { + tbproductService.incrStockNumber(cart.getProductId(), cart.getNumber()); + } else { + key = CacheKey.PRODUCT + cart.getShopId() + ":" + cart.getId(); + skuRepository.updateStockNumber(Integer.valueOf(cart.getSkuId()),cart.getNumber().doubleValue()); + } + + // 减去销量 + if (cart.getNumber() > 0) { + redisUtils.decrBy(key, cart.getNumber()); + } + } } \ No newline at end of file diff --git a/eladmin-system/src/main/java/cn/ysk/cashier/service/impl/productimpl/TbProductServiceImpl.java b/eladmin-system/src/main/java/cn/ysk/cashier/service/impl/productimpl/TbProductServiceImpl.java index 6dbaf19a..eb2c0010 100644 --- a/eladmin-system/src/main/java/cn/ysk/cashier/service/impl/productimpl/TbProductServiceImpl.java +++ b/eladmin-system/src/main/java/cn/ysk/cashier/service/impl/productimpl/TbProductServiceImpl.java @@ -613,4 +613,9 @@ public class TbProductServiceImpl implements TbProductService { } FileUtil.downloadExcel(list, response); } + + @Override + public void incrStockNumber(String productId, Integer number) { + tbProductRepository.incrProductStockNumber(Integer.valueOf(productId), number); + } } diff --git a/eladmin-system/src/main/java/cn/ysk/cashier/service/order/TbCashierCartService.java b/eladmin-system/src/main/java/cn/ysk/cashier/service/order/TbCashierCartService.java index 25a424a8..b55da150 100644 --- a/eladmin-system/src/main/java/cn/ysk/cashier/service/order/TbCashierCartService.java +++ b/eladmin-system/src/main/java/cn/ysk/cashier/service/order/TbCashierCartService.java @@ -80,4 +80,10 @@ public interface TbCashierCartService { * @throws IOException / */ void download(List all, HttpServletResponse response) throws IOException; + + /** + * 清除过期订单 + * @param cart 购物车订单 + */ + void clearExpireOrder(TbCashierCart cart); } \ No newline at end of file diff --git a/eladmin-system/src/main/java/cn/ysk/cashier/service/product/TbProductService.java b/eladmin-system/src/main/java/cn/ysk/cashier/service/product/TbProductService.java index 31d4f609..aab71170 100644 --- a/eladmin-system/src/main/java/cn/ysk/cashier/service/product/TbProductService.java +++ b/eladmin-system/src/main/java/cn/ysk/cashier/service/product/TbProductService.java @@ -77,4 +77,11 @@ public interface TbProductService { void updateIsHot(Integer id, String shopId); void updateIsStock(Integer proId, String shopId,Integer isStock); + + /** + * 增加库存 + * @param productId 商品id + * @param number 增加数量 + */ + void incrStockNumber(String productId, Integer number); }