From f345ba9b7fe4957699ef43e44a8fc2c20e42212d Mon Sep 17 00:00:00 2001 From: wangw <1594593906@qq.com> Date: Thu, 20 Jun 2024 09:48:02 +0800 Subject: [PATCH] =?UTF-8?q?=E5=BA=93=E5=AD=98=E5=88=97=E8=A1=A8=20?= =?UTF-8?q?=E5=AF=BC=E5=85=A5=E5=AF=BC=E5=87=BA=20=E5=BA=93=E5=AD=98?= =?UTF-8?q?=E8=AE=B0=E5=BD=95=20=E6=9B=B4=E6=96=B0=E4=BE=9B=E5=BA=94?= =?UTF-8?q?=E5=95=86=20=E6=9C=80=E5=90=8E=E4=B8=80=E6=AC=A1=E8=BF=9B?= =?UTF-8?q?=E8=B4=A7=E6=97=B6=E9=97=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/product/StockController.java | 109 +++++++++++ .../product/TbProductController.java | 2 +- .../product/TbProductSpecController.java | 2 +- .../TbShopPurveyorTransactController.java | 10 +- .../ysk/cashier/dto/product/OutAndOnDto.java | 12 +- .../cashier/dto/product/StockImportDto.java | 10 + .../cashier/dto/product/StockQueryDto.java | 30 +++ .../TbShopPurveyorTransactQueryCriteria.java | 6 + .../pojo/product/TbProductStockOperate.java | 2 +- .../order/TbOrderDetailRepository.java | 6 +- .../product/TbProductRepository.java | 5 + .../product/TbProductSkuRepository.java | 52 +++-- .../shop/TbShopPurveyorRepository.java | 5 + .../service/impl/SummaryServiceImpl.java | 1 + .../impl/productimpl/StockServiceImpl.java | 73 +++++++ .../productimpl/TbProductServiceImpl.java | 6 + .../TbProductStockOperateServiceImpl.java | 181 +++++++++--------- .../cashier/service/product/StockService.java | 25 +++ .../service/product/TbProductService.java | 1 + .../ysk/cashier/vo/ProductStockOperateVO.java | 17 ++ .../main/java/cn/ysk/cashier/vo/StockVo.java | 69 +++++++ .../cashier/vo/TbOrderSalesCountByDayVo.java | 12 +- product/category/index.vue | 156 --------------- product/category/tbShopCategory.js | 27 --- 24 files changed, 515 insertions(+), 304 deletions(-) create mode 100644 eladmin-system/src/main/java/cn/ysk/cashier/controller/product/StockController.java create mode 100644 eladmin-system/src/main/java/cn/ysk/cashier/dto/product/StockImportDto.java create mode 100644 eladmin-system/src/main/java/cn/ysk/cashier/dto/product/StockQueryDto.java create mode 100644 eladmin-system/src/main/java/cn/ysk/cashier/service/impl/productimpl/StockServiceImpl.java create mode 100644 eladmin-system/src/main/java/cn/ysk/cashier/service/product/StockService.java create mode 100644 eladmin-system/src/main/java/cn/ysk/cashier/vo/StockVo.java delete mode 100644 product/category/index.vue delete mode 100644 product/category/tbShopCategory.js 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 new file mode 100644 index 00000000..09242f12 --- /dev/null +++ b/eladmin-system/src/main/java/cn/ysk/cashier/controller/product/StockController.java @@ -0,0 +1,109 @@ +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.service.TbProductStockOperateService; +import cn.ysk.cashier.service.product.StockService; +import cn.ysk.cashier.vo.StockVo; +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; + +@RestController +@RequiredArgsConstructor +@Api(tags = "库存管理") +@RequestMapping("/api/stock") +@Slf4j +public class StockController { + + private final StockService stockService; + private final TbProductStockOperateService stockOperateService; + + @ApiOperation("库存导出") + @PostMapping(value = "download") + public void exportTbOrderInfo(HttpServletResponse response, @RequestBody StockQueryDto criteria) throws IOException { + stockService.download(criteria,response); + } + + @Log("库存导入") + @PostMapping("/doImport") + @ApiOperation("文件导入库存") + public ResponseEntity importExcel(@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 { + //根据路径获取这个操作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){ + list.add(new StockVo( + Integer.valueOf(row.getCell(0).getRawValue()), + row.getCell(1).toString(), + row.getCell(4).toString(), + row.getCell(3).toString(), + row.getCell(5).toString())); + } + } + } + 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); + } catch (Exception e) { + log.error("文件导入库存异常:",e); + } + return new ResponseEntity<>(HttpStatus.OK); + } + + @GetMapping + @ApiOperation("查询库存") + public ResponseEntity queryTbProduct(StockQueryDto criteria, + @RequestParam(required = false, defaultValue = "0") Integer page, + @RequestParam(required = false, defaultValue = "10") Integer size){ + return new ResponseEntity<>(stockService.queryAll(criteria,page,size), HttpStatus.OK); + } + + @GetMapping("/isStock") + public ResponseEntity updateIsHot( + @RequestParam String shopId, + @RequestParam Integer proId, + @RequestParam Integer isStock){ + stockService.updateIsStock(proId,shopId,isStock); + return new ResponseEntity<>(HttpStatus.OK); + } + +} diff --git a/eladmin-system/src/main/java/cn/ysk/cashier/controller/product/TbProductController.java b/eladmin-system/src/main/java/cn/ysk/cashier/controller/product/TbProductController.java index 2e681fb8..2c7d352d 100644 --- a/eladmin-system/src/main/java/cn/ysk/cashier/controller/product/TbProductController.java +++ b/eladmin-system/src/main/java/cn/ysk/cashier/controller/product/TbProductController.java @@ -20,7 +20,7 @@ import java.util.List; **/ @RestController @RequiredArgsConstructor -@Api(tags = "/product管理") +@Api(tags = "商品管理") @RequestMapping("/api/tbProduct") public class TbProductController { diff --git a/eladmin-system/src/main/java/cn/ysk/cashier/controller/product/TbProductSpecController.java b/eladmin-system/src/main/java/cn/ysk/cashier/controller/product/TbProductSpecController.java index 5db4264b..dec28394 100644 --- a/eladmin-system/src/main/java/cn/ysk/cashier/controller/product/TbProductSpecController.java +++ b/eladmin-system/src/main/java/cn/ysk/cashier/controller/product/TbProductSpecController.java @@ -38,7 +38,7 @@ import javax.servlet.http.HttpServletResponse; **/ @RestController @RequiredArgsConstructor -@Api(tags = "product/spec管理") +@Api(tags = "商品规格管理") @RequestMapping("/api/tbProductSpec") public class TbProductSpecController { diff --git a/eladmin-system/src/main/java/cn/ysk/cashier/controller/shop/TbShopPurveyorTransactController.java b/eladmin-system/src/main/java/cn/ysk/cashier/controller/shop/TbShopPurveyorTransactController.java index c51f67ea..18a3c475 100644 --- a/eladmin-system/src/main/java/cn/ysk/cashier/controller/shop/TbShopPurveyorTransactController.java +++ b/eladmin-system/src/main/java/cn/ysk/cashier/controller/shop/TbShopPurveyorTransactController.java @@ -38,7 +38,7 @@ import javax.servlet.http.HttpServletResponse; **/ @RestController @RequiredArgsConstructor -@Api(tags = "/shop/purveyorTransact管理") +@Api(tags = "帐目往来管理") @RequestMapping("/api/tbShopPurveyorTransact") public class TbShopPurveyorTransactController { @@ -58,7 +58,7 @@ public class TbShopPurveyorTransactController { * @return */ @GetMapping - @ApiOperation("查询/shop/purveyorTransact") + @ApiOperation("查询帐目往来") public ResponseEntity queryTbShopPurveyorTransactSum(TbShopPurveyorTransactQueryCriteria criteria, Pageable pageable){ return new ResponseEntity<>(tbShopPurveyorTransactService.queryTransactDate(criteria,pageable),HttpStatus.OK); } @@ -84,20 +84,20 @@ public class TbShopPurveyorTransactController { } @PostMapping - @ApiOperation("新增/shop/purveyorTransact") + @ApiOperation("新增帐目往来") public ResponseEntity createTbShopPurveyorTransact(@Validated @RequestBody TbShopPurveyorTransact resources){ return new ResponseEntity<>(tbShopPurveyorTransactService.create(resources),HttpStatus.CREATED); } @PutMapping - @ApiOperation("修改/shop/purveyorTransact") + @ApiOperation("修改帐目往来") public ResponseEntity updateTbShopPurveyorTransact(@Validated @RequestBody TbShopPurveyorTransact resources){ tbShopPurveyorTransactService.update(resources); return new ResponseEntity<>(HttpStatus.NO_CONTENT); } @DeleteMapping - @ApiOperation("删除/shop/purveyorTransact") + @ApiOperation("删除帐目往来") public ResponseEntity deleteTbShopPurveyorTransact(@RequestBody Integer[] ids) { tbShopPurveyorTransactService.deleteAll(ids); return new ResponseEntity<>(HttpStatus.OK); diff --git a/eladmin-system/src/main/java/cn/ysk/cashier/dto/product/OutAndOnDto.java b/eladmin-system/src/main/java/cn/ysk/cashier/dto/product/OutAndOnDto.java index e1b24329..102dbe39 100644 --- a/eladmin-system/src/main/java/cn/ysk/cashier/dto/product/OutAndOnDto.java +++ b/eladmin-system/src/main/java/cn/ysk/cashier/dto/product/OutAndOnDto.java @@ -1,8 +1,6 @@ package cn.ysk.cashier.dto.product; -import lombok.Data; import lombok.NonNull; - import java.math.BigDecimal; import java.util.List; @@ -54,6 +52,8 @@ public class OutAndOnDto { @NonNull private String shopId; + private String isImport; + public String getBatchNumber() { return batchNumber; @@ -142,4 +142,12 @@ public class OutAndOnDto { public void setShopId(String shopId) { this.shopId = shopId; } + + public String getIsImport() { + return isImport; + } + + public void setIsImport(String isImport) { + this.isImport = isImport; + } } diff --git a/eladmin-system/src/main/java/cn/ysk/cashier/dto/product/StockImportDto.java b/eladmin-system/src/main/java/cn/ysk/cashier/dto/product/StockImportDto.java new file mode 100644 index 00000000..c3fb5216 --- /dev/null +++ b/eladmin-system/src/main/java/cn/ysk/cashier/dto/product/StockImportDto.java @@ -0,0 +1,10 @@ +package cn.ysk.cashier.dto.product; + +import lombok.Data; +import org.springframework.web.multipart.MultipartFile; +@Data +public class StockImportDto { + private String shopId; + private MultipartFile file; + +} diff --git a/eladmin-system/src/main/java/cn/ysk/cashier/dto/product/StockQueryDto.java b/eladmin-system/src/main/java/cn/ysk/cashier/dto/product/StockQueryDto.java new file mode 100644 index 00000000..92ccecf1 --- /dev/null +++ b/eladmin-system/src/main/java/cn/ysk/cashier/dto/product/StockQueryDto.java @@ -0,0 +1,30 @@ +package cn.ysk.cashier.dto.product; + +import lombok.Data; +import org.apache.commons.lang3.StringUtils; + +@Data +public class StockQueryDto { + + private String name; + private String shopId; + private Integer isStock; + + public void setName(String name) { + if (StringUtils.isNotBlank(name)) { + this.name = name; + } + } + + public void setShopId(String shopId) { + if (StringUtils.isNotBlank(shopId) && !shopId.equals("1")) { + this.shopId = shopId; + } + } + + public void setIsStock(Integer isStock) { + if (isStock!=null) { + this.isStock = isStock; + } + } +} diff --git a/eladmin-system/src/main/java/cn/ysk/cashier/dto/shop/TbShopPurveyorTransactQueryCriteria.java b/eladmin-system/src/main/java/cn/ysk/cashier/dto/shop/TbShopPurveyorTransactQueryCriteria.java index fdfae8bd..18e8d5a6 100644 --- a/eladmin-system/src/main/java/cn/ysk/cashier/dto/shop/TbShopPurveyorTransactQueryCriteria.java +++ b/eladmin-system/src/main/java/cn/ysk/cashier/dto/shop/TbShopPurveyorTransactQueryCriteria.java @@ -55,4 +55,10 @@ public class TbShopPurveyorTransactQueryCriteria{ private Integer size; private String sort; + + public void setStatus(Integer status) { + if (status != null) { + this.status = status; + } + } } \ No newline at end of file diff --git a/eladmin-system/src/main/java/cn/ysk/cashier/pojo/product/TbProductStockOperate.java b/eladmin-system/src/main/java/cn/ysk/cashier/pojo/product/TbProductStockOperate.java index 1785564e..f79c4f4c 100644 --- a/eladmin-system/src/main/java/cn/ysk/cashier/pojo/product/TbProductStockOperate.java +++ b/eladmin-system/src/main/java/cn/ysk/cashier/pojo/product/TbProductStockOperate.java @@ -25,7 +25,7 @@ import java.io.Serializable; /** * @website https://eladmin.vip -* @description / +* @description 操作记录 * @author lyf * @date 2024-01-25 **/ diff --git a/eladmin-system/src/main/java/cn/ysk/cashier/repository/order/TbOrderDetailRepository.java b/eladmin-system/src/main/java/cn/ysk/cashier/repository/order/TbOrderDetailRepository.java index cc39610a..dc641c4e 100644 --- a/eladmin-system/src/main/java/cn/ysk/cashier/repository/order/TbOrderDetailRepository.java +++ b/eladmin-system/src/main/java/cn/ysk/cashier/repository/order/TbOrderDetailRepository.java @@ -33,7 +33,7 @@ public interface TbOrderDetailRepository extends JpaRepository, @Modifying void updateIsHot(@Param("id") Integer id); + @Query(value = "update tb_product set is_stock=:isStock where id = :proId and shop_id=:shopId",nativeQuery = true) + @Modifying + void updateIsStock(@Param("proId") Integer proId,@Param("shopId") String shopId,@Param("isStock")Integer isStock); + + @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); 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 f779eb15..db23e3ed 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,21 +1,9 @@ -/* -* Copyright 2019-2020 Zheng Jie -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ package cn.ysk.cashier.repository.product; import cn.ysk.cashier.pojo.product.TbProductSku; +import cn.ysk.cashier.vo.StockVo; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.JpaSpecificationExecutor; import org.springframework.data.jpa.repository.Modifying; @@ -47,6 +35,36 @@ public interface TbProductSkuRepository extends JpaRepository searchProStock(@Param("shopId") String shopId, @Param("proName") String proName, @Param("isStock")Integer isStock, Pageable pageable); + @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" + + ") " + + "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 (:proName IS NULL OR pro.name LIKE %:proName%) " + + "AND (:isStock IS NULL OR pro.isStock = :isStock) " + + "ORDER BY " + + "pro.name DESC,sku.stockNumber DESC") + List searchProStock(@Param("shopId") String shopId, @Param("proName") String proName, @Param("isStock")Integer isStock); + + @Transactional @Modifying @Query("update FROM TbProductSku sku set sku.costPrice=:costPrice,sku.coverImg =:coverImg, " + @@ -61,4 +79,8 @@ public interface TbProductSkuRepository extends JpaRepository map = new LinkedHashMap<>(); map.put("商品分类", all.getCateName()); map.put("商品名称", all.getProductName()); + map.put("单 位", all.getUnitName()); map.put("商品规格", StringUtils.isBlank(all.getProductSkuName()) ? "" : all.getProductSkuName()); map.put("销 量", all.getSalesNum()); map.put("退单量", all.getRefNum()); 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 new file mode 100644 index 00000000..7ae49c25 --- /dev/null +++ b/eladmin-system/src/main/java/cn/ysk/cashier/service/impl/productimpl/StockServiceImpl.java @@ -0,0 +1,73 @@ +package cn.ysk.cashier.service.impl.productimpl; + +import cn.ysk.cashier.dto.product.StockQueryDto; +import cn.ysk.cashier.repository.product.TbProductSkuRepository; +import cn.ysk.cashier.service.product.StockService; +import cn.ysk.cashier.service.product.TbProductService; +import cn.ysk.cashier.utils.FileUtil; +import cn.ysk.cashier.utils.RedisUtils; +import cn.ysk.cashier.vo.StockVo; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.PageRequest; +import org.springframework.data.domain.Pageable; +import org.springframework.scheduling.annotation.Async; +import org.springframework.stereotype.Service; + +import javax.servlet.http.HttpServletResponse; +import javax.transaction.Transactional; +import java.io.IOException; +import java.util.*; + +@Slf4j +@Service +@RequiredArgsConstructor +public class StockServiceImpl implements StockService { + + private final TbProductSkuRepository tbProductSkuRepository; + private final TbProductService productService; + private final RedisUtils redisUtils; + + @Override + public Page queryAll(StockQueryDto criteria, Integer page, Integer size) { + Pageable pageable = PageRequest.of(page, size); + return tbProductSkuRepository.searchProStock(criteria.getShopId(), criteria.getName(), criteria.getIsStock(), pageable); + } + + @Override + public void download(StockQueryDto criteria, HttpServletResponse response) throws IOException { + List> list = new ArrayList<>(); + List stockVos = tbProductSkuRepository.searchProStock(criteria.getShopId(), criteria.getName(), criteria.getIsStock()); + for (StockVo all : stockVos) { + Map map = new LinkedHashMap<>(); + map.put("id(如需导入,该值不可变)", all.getId()); + map.put("商品名称", all.getName()); + map.put("商品类型", all.getType()); + map.put("商品规格", all.getSpecSnap()); + map.put("商品单位", all.getUnitName()); + map.put("库存数量", all.getNumber()); +// map.put("库存开关", all.getIsStock().equals(0)?"否":"是"); + list.add(map); + } + FileUtil.downloadExcel(list, response); + } + + @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 + @Override + public void updateIsStock(Integer proId, String shopId,Integer isStock) { + productService.updateIsStock(proId,shopId,isStock); + } + +} 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 2241bdf2..0bf73000 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 @@ -466,6 +466,12 @@ public class TbProductServiceImpl implements TbProductService { tbProductRepository.updateIsHot(id); } + @Transactional(rollbackFor = Exception.class) + @Override + public void updateIsStock(Integer proId, String shopId,Integer isStock) { + tbProductRepository.updateIsStock(proId,shopId,isStock); + } + @Transactional(rollbackFor = Exception.class) @Override public void upProSort(TbProductSortCriteria param) { 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 a0136bc9..568feaeb 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,20 +1,6 @@ -/* -* Copyright 2019-2020 Zheng Jie -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ package cn.ysk.cashier.service.impl.productimpl; +import cn.ysk.cashier.repository.shop.TbShopPurveyorRepository; import cn.ysk.cashier.utils.*; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; @@ -45,6 +31,7 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; +import org.springframework.util.CollectionUtils; import java.time.Instant; import java.util.*; @@ -65,6 +52,7 @@ public class TbProductStockOperateServiceImpl implements TbProductStockOperateSe private final TbProductStockOperateRepository tbProductStockOperateRepository; private final TbProductStockOperateMapper tbProductStockOperateMapper; private final TbShopPurveyorTransactRepository purveyorTransactRepository; + private final TbShopPurveyorRepository purveyorRepository; private final TbShopInfoRepository shopInfoRepository; private final TbProductSkuRepository tbProductSkuRepository; private final TbProductSkuService productSkuService; @@ -86,6 +74,7 @@ public class TbProductStockOperateServiceImpl implements TbProductStockOperateSe BeanUtils.copyProperties(stockOperate,stockOperateVO); stockOperateVO.setStockSnap(ListUtil.stringChangeList(stockOperate.getStockSnap())); stockOperateVO.setOperatorSnap(StringUtils.stringChangeMap(stockOperate.getOperatorSnap())); + stockOperateVO.setType(); stockOperateVOList.add(stockOperateVO); } HashMap map = new HashMap<>(); @@ -140,6 +129,9 @@ public class TbProductStockOperateServiceImpl implements TbProductStockOperateSe @Override @Transactional(rollbackFor = Exception.class) public OutAndOnDto createOutAndONOperate(OutAndOnDto resources) { + if(CollectionUtils.isEmpty(resources.getList())){ + throw new BadRequestException("出入库数据不可为空"); + } //用户相关 TbShopInfo byId = shopInfoRepository.findById(Integer.valueOf(resources.getShopId())).orElseGet(TbShopInfo::new); if (byId.getId() == null){ @@ -151,6 +143,7 @@ public class TbProductStockOperateServiceImpl implements TbProductStockOperateSe stockOperate.setShopId(resources.getShopId()); stockOperate.setStockSnap(resources.getList().toString()); stockOperate.setType(resources.getType()); + //其它入库 //purveyor 供应商入库 if ("purchase".equals(resources.getType()) || "purveyor".equals(resources.getType())){ stockOperate.setSubType(1); }else { @@ -168,87 +161,89 @@ public class TbProductStockOperateServiceImpl implements TbProductStockOperateSe stockOperate.setUpdatedAt(times); stockOperate.setStatus("normal"); TbProductStockOperate saveStockOperate = tbProductStockOperateRepository.save(stockOperate); - //帐目往来 - if (!"other-out".equals(resources.getType()) || !"purchase".equals(resources.getType())) { - TbShopPurveyorTransact purveyorTransact = new TbShopPurveyorTransact(); - purveyorTransact.setShopId(resources.getShopId()); - purveyorTransact.setPurveyorName(resources.getPurveyorName()); - purveyorTransact.setPurveyorId(resources.getPurveyorId()); - purveyorTransact.setRemark(resources.getRemark()); - purveyorTransact.setCreatedAt(times); - purveyorTransact.setUpdatedAt(times); - purveyorTransact.setTotalAmount(resources.getTotalAmount()); - purveyorTransact.setPaidAmount(resources.getPaidAmount()); - purveyorTransact.setWaitAmount(resources.getTotalAmount().subtract(resources.getPaidAmount())); - if (resources.getTotalAmount().compareTo(resources.getPaidAmount())<0){ - purveyorTransact.setStatus(1); - }else { - purveyorTransact.setStatus(0); + if (StringUtils.isNotBlank(resources.getIsImport()) && resources.getIsImport().equals("true")) { + //供应商退货 reject + //供应商入库 purveyor + if ("reject".equals(resources.getType()) || "purveyor".equals(resources.getType())) { + TbShopPurveyorTransact purveyorTransact = new TbShopPurveyorTransact(); + purveyorTransact.setShopId(resources.getShopId()); + purveyorTransact.setPurveyorName(resources.getPurveyorName()); + purveyorTransact.setPurveyorId(resources.getPurveyorId()); + purveyorTransact.setRemark(resources.getRemark()); + purveyorTransact.setCreatedAt(times); + purveyorTransact.setUpdatedAt(times); + purveyorTransact.setTotalAmount(resources.getTotalAmount()); + purveyorTransact.setPaidAmount(resources.getPaidAmount()); + purveyorTransact.setWaitAmount(resources.getTotalAmount().subtract(resources.getPaidAmount())); + if (resources.getTotalAmount().compareTo(resources.getPaidAmount()) < 0) { + purveyorTransact.setStatus(1); + } else { + purveyorTransact.setStatus(0); + } + purveyorTransact.setPaidAt(resources.getPaidAt()); + purveyorTransact.setType(resources.getType()); + purveyorTransactRepository.save(purveyorTransact); + if (resources.getPurveyorId() != null) { + purveyorRepository.upLastTransactAt(resources.getPurveyorId()); + } } - purveyorTransact.setPaidAt(resources.getPaidAt()); - purveyorTransact.setType(resources.getType()); - purveyorTransactRepository.save(purveyorTransact); - } - //库存记录 - if (resources.getList() == null){ - throw new BadRequestException("数据有误"); - } - Map idStockMap=new HashMap<>(); - for (Object date :resources.getList()) { - //商品详情 - ProductListDto productListDto= JSONObject.parseObject(JSONObject.toJSONString(date),ProductListDto.class); - TbProductSku tbProductSku = tbProductSkuRepository.findById(productListDto.getId()).orElseGet(TbProductSku::new); - TbProductStockDetail productStockDetail = new TbProductStockDetail(); - productStockDetail.setBatchNumber(resources.getBatchNumber()); - productStockDetail.setCreatedAt(times); - productStockDetail.setUpdatedAt(times); - productStockDetail.setIsStock(1); - Integer round = (int) Math.floor(tbProductSku.getStockNumber()); - productStockDetail.setLeftNumber(round); - productStockDetail.setProductId(productListDto.getProductId()); - productStockDetail.setProductName(productListDto.getName()); - productStockDetail.setRecordId(saveStockOperate.getId().toString()); - productStockDetail.setShopId(resources.getShopId()); - productStockDetail.setSkuId(productListDto.getId().toString()); - productStockDetail.setSourcePath("NORMAL"); - productListDto.setNumber(productListDto.getNumber() != null? productListDto.getNumber(): 0); - switch (resources.getType()) { - case "sale": - productStockDetail.setStockNumber((double) -productListDto.getNumber()); - productStockDetail.setSubType(-1); - break; - case "refund": - productStockDetail.setStockNumber((double) productListDto.getNumber()); - productStockDetail.setSubType(1); - break; - case "reject": - productStockDetail.setStockNumber((double) -productListDto.getNumber()); - productStockDetail.setSubType(-1); - break; - case "purveyor": - productStockDetail.setStockNumber((double) productListDto.getNumber()); - productStockDetail.setSubType(1); - break; - case "purchase": - productStockDetail.setStockNumber((double) productListDto.getNumber()); - productStockDetail.setSubType(1); - break; - case "other-out": - productStockDetail.setStockNumber((double) -productListDto.getNumber()); - productStockDetail.setSubType(-1); - break; - default: - break; + Map idStockMap = new HashMap<>(); + for (Object date : resources.getList()) { + //商品详情 + ProductListDto productListDto = JSONObject.parseObject(JSONObject.toJSONString(date), ProductListDto.class); + TbProductSku tbProductSku = tbProductSkuRepository.findById(productListDto.getId()).orElseGet(TbProductSku::new); + TbProductStockDetail productStockDetail = new TbProductStockDetail(); + productStockDetail.setBatchNumber(resources.getBatchNumber()); + productStockDetail.setCreatedAt(times); + productStockDetail.setUpdatedAt(times); + productStockDetail.setIsStock(1); + Integer round = (int) Math.floor(tbProductSku.getStockNumber()); + productStockDetail.setLeftNumber(round); + productStockDetail.setProductId(productListDto.getProductId()); + productStockDetail.setProductName(productListDto.getName()); + productStockDetail.setRecordId(saveStockOperate.getId().toString()); + productStockDetail.setShopId(resources.getShopId()); + productStockDetail.setSkuId(productListDto.getId().toString()); + productStockDetail.setSourcePath("NORMAL"); + productListDto.setNumber(productListDto.getNumber() != null ? productListDto.getNumber() : 0); + switch (resources.getType()) { + case "sale": + productStockDetail.setStockNumber((double) -productListDto.getNumber()); + productStockDetail.setSubType(-1); + break; + case "refund": + productStockDetail.setStockNumber((double) productListDto.getNumber()); + productStockDetail.setSubType(1); + break; + case "reject": + productStockDetail.setStockNumber((double) -productListDto.getNumber()); + productStockDetail.setSubType(-1); + break; + case "purveyor": + productStockDetail.setStockNumber((double) productListDto.getNumber()); + productStockDetail.setSubType(1); + break; + case "purchase": + productStockDetail.setStockNumber((double) productListDto.getNumber()); + productStockDetail.setSubType(1); + break; + case "other-out": + productStockDetail.setStockNumber((double) -productListDto.getNumber()); + productStockDetail.setSubType(-1); + break; + default: + break; + } + productStockDetail.setType(resources.getType()); + productStockDetail.setUnitName(productListDto.getUnitName()); + entityManager.persist(productStockDetail); + //sku数量 + tbProductSku.setStockNumber(tbProductSku.getStockNumber() + productStockDetail.getStockNumber()); + productSkuService.update(tbProductSku); + idStockMap.put(productListDto.getId(), productStockDetail.getStockNumber()); } - productStockDetail.setType(resources.getType()); - productStockDetail.setUnitName(productListDto.getUnitName()); - entityManager.persist(productStockDetail); - //sku数量 - tbProductSku.setStockNumber(tbProductSku.getStockNumber()+productStockDetail.getStockNumber()); - productSkuService.update(tbProductSku); - idStockMap.put(productListDto.getId(),productStockDetail.getStockNumber()); + redisUtils.redisUp(2, resources.getShopId(), idStockMap); } - redisUtils.redisUp(2,resources.getShopId(),idStockMap); return resources; } 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 new file mode 100644 index 00000000..04cb5e86 --- /dev/null +++ b/eladmin-system/src/main/java/cn/ysk/cashier/service/product/StockService.java @@ -0,0 +1,25 @@ +package cn.ysk.cashier.service.product; + +import cn.ysk.cashier.dto.product.StockQueryDto; +import cn.ysk.cashier.vo.StockVo; +import org.springframework.data.domain.Page; + +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.util.List; + +public interface StockService { + + /** + * 查询数据分页 + * @param criteria 条件 + * @return Map + */ + Page queryAll(StockQueryDto criteria, Integer page, Integer size); + + void download(StockQueryDto summaryDto, HttpServletResponse response) throws IOException; + + void inHouse(String shopId,List list); + + void updateIsStock(Integer proId, String shopId,Integer isStock); +} 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 8c72e8c5..59d5d7ad 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 @@ -74,4 +74,5 @@ public interface TbProductService { void download(List all, HttpServletResponse response) throws IOException; 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/ProductStockOperateVO.java b/eladmin-system/src/main/java/cn/ysk/cashier/vo/ProductStockOperateVO.java index 585d8992..eec732a2 100644 --- a/eladmin-system/src/main/java/cn/ysk/cashier/vo/ProductStockOperateVO.java +++ b/eladmin-system/src/main/java/cn/ysk/cashier/vo/ProductStockOperateVO.java @@ -45,4 +45,21 @@ public class ProductStockOperateVO { private String purveyorName; private String status; + + public void setType() { + switch (this.type) { + case "purchase": + this.type = "其他入库"; + break; + case "other-out": + this.type = "其他出库"; + break; + case "reject": + this.type = "供应商退货"; + break; + case "purveyor": + this.type = "供应商入库"; + break; + } + } } diff --git a/eladmin-system/src/main/java/cn/ysk/cashier/vo/StockVo.java b/eladmin-system/src/main/java/cn/ysk/cashier/vo/StockVo.java new file mode 100644 index 00000000..fffdab05 --- /dev/null +++ b/eladmin-system/src/main/java/cn/ysk/cashier/vo/StockVo.java @@ -0,0 +1,69 @@ +package cn.ysk.cashier.vo; +import lombok.Data; + + +@Data +public class StockVo { + 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 number; + + public StockVo(Integer id,String name,String unitName,String specSnap, Object number) { + this.id = id; + this.unitName = unitName; + this.specSnap = specSnap; + this.name = name; + this.number = number; + } + + public StockVo(Integer id, Integer proId,String img,String name,String unitName, String type, String specSnap, Object isStock, Object number) { + this.id = id; + this.proId = proId; + this.img = img; + this.name = name; + this.unitName = unitName; + setType(type); + this.specSnap = specSnap; + this.isStock = isStock; + this.number = number; + } + + 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 + "\"" + + "\"number\":\"" + number + "\"" + + "}"; + } +} diff --git a/eladmin-system/src/main/java/cn/ysk/cashier/vo/TbOrderSalesCountByDayVo.java b/eladmin-system/src/main/java/cn/ysk/cashier/vo/TbOrderSalesCountByDayVo.java index e0093e96..776b14c1 100644 --- a/eladmin-system/src/main/java/cn/ysk/cashier/vo/TbOrderSalesCountByDayVo.java +++ b/eladmin-system/src/main/java/cn/ysk/cashier/vo/TbOrderSalesCountByDayVo.java @@ -7,6 +7,7 @@ public class TbOrderSalesCountByDayVo { private String productName; private String productSkuName; private String cateName; + private String unitName; private Long salesNum; private Long refNum; private BigDecimal salesAmount; @@ -77,15 +78,24 @@ public class TbOrderSalesCountByDayVo { this.refAmount = refAmount; } + public String getUnitName() { + return unitName; + } + + public void setUnitName(String unitName) { + this.unitName = unitName; + } + public TbOrderSalesCountByDayVo(Long salesNum, Long refNum) { this.salesNum = salesNum; this.refNum = refNum; } - public TbOrderSalesCountByDayVo(String productName, String productSkuName, String cateName, Long salesNum, Long refNum, Long num, BigDecimal salesAmount, BigDecimal refAmount) { + public TbOrderSalesCountByDayVo(String productName, String productSkuName, String cateName,String unitName, Long salesNum, Long refNum, Long num, BigDecimal salesAmount, BigDecimal refAmount) { this.productName = productName; this.productSkuName = productSkuName; this.cateName = cateName; + this.unitName = unitName; this.salesNum = salesNum; this.refNum = refNum; this.salesAmount = salesAmount; diff --git a/product/category/index.vue b/product/category/index.vue deleted file mode 100644 index 52e36490..00000000 --- a/product/category/index.vue +++ /dev/null @@ -1,156 +0,0 @@ - - - - - diff --git a/product/category/tbShopCategory.js b/product/category/tbShopCategory.js deleted file mode 100644 index 5778cb4d..00000000 --- a/product/category/tbShopCategory.js +++ /dev/null @@ -1,27 +0,0 @@ -import request from '@/utils/request' - -export function add(data) { - return request({ - url: 'api/tbShopCategory', - method: 'post', - data - }) -} - -export function del(ids) { - return request({ - url: 'api/tbShopCategory/', - method: 'delete', - data: ids - }) -} - -export function edit(data) { - return request({ - url: 'api/tbShopCategory', - method: 'put', - data - }) -} - -export default { add, edit, del }