共享库存修改

This commit is contained in:
GYJ
2024-06-24 11:42:41 +08:00
parent 1675e5d45b
commit b9b35849c3
15 changed files with 520 additions and 73 deletions

View File

@@ -1,23 +1,40 @@
package cn.ysk.cashier.service.impl.productimpl;
import cn.ysk.cashier.dto.product.OutAndOnDto;
import cn.ysk.cashier.dto.product.StockQueryDto;
import cn.ysk.cashier.dto.product.TbProductDto;
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.service.product.TbProductService;
import cn.ysk.cashier.utils.FileUtil;
import cn.ysk.cashier.utils.RedisUtils;
import cn.ysk.cashier.utils.StringUtils;
import cn.ysk.cashier.vo.StockUpdateValueVO;
import cn.ysk.cashier.vo.StockV2Vo;
import cn.ysk.cashier.vo.StockVo;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.poi.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
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 org.springframework.web.multipart.MultipartFile;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;
import javax.servlet.http.HttpServletResponse;
import javax.transaction.Transactional;
import java.io.IOException;
import java.math.BigDecimal;
import java.util.*;
@Slf4j
@@ -29,16 +46,34 @@ public class StockServiceImpl implements StockService {
private final TbProductService productService;
private final RedisUtils redisUtils;
private final TbProductStockOperateService stockOperateService;
private final TbProductSkuRepository skuRepository;
@PersistenceContext
private EntityManager em;
@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(),criteria.getNum(), pageable);
return tbProductSkuRepository.searchProStock(criteria.getShopId(), criteria.getName(), criteria.getIsStock(), criteria.getNum(), pageable);
}
@Override
public Page queryAllV2(StockQueryDto criteria, Integer page, Integer size) {
Pageable pageable = PageRequest.of(page, size);
return tbProductSkuRepository.searchProStockV2(criteria.getShopId(), criteria.getName(), criteria.getIsStock(), pageable);
}
@Override
public List<StockV2Vo> queryProductSku(String productId) {
return tbProductSkuRepository.searchProductSkuByProductId(productId);
}
@Override
public void download(StockQueryDto criteria, HttpServletResponse response) throws IOException {
List<Map<String, Object>> list = new ArrayList<>();
List<StockVo> stockVos = tbProductSkuRepository.searchProStock(criteria.getShopId(), criteria.getName(), criteria.getIsStock(),criteria.getNum());
List<StockVo> stockVos = tbProductSkuRepository.searchProStock(criteria.getShopId(), criteria.getName(), criteria.getIsStock(), criteria.getNum());
for (StockVo all : stockVos) {
Map<String, Object> 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<StockVo> list) {
Map<Integer, Double> 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<Map<String, Object>> list = new ArrayList<>();
List<StockV2Vo> stockVos = tbProductSkuRepository.searchProStockV2(summaryDto.getShopId(), summaryDto.getName(), summaryDto.getIsStock());
for (StockV2Vo all : stockVos) {
Map<String, Object> 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<StockV2Vo> skuList = queryProductSku(all.getProId().toString());
for (StockV2Vo sku : skuList) {
Map<String, Object> 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<StockVo> list = new ArrayList<>();
for (int i = 1; i < sheet.getPhysicalNumberOfRows(); i++) {
row = sheet.getRow(i);
if (row != null) {
if (row.getCell(0) != null) {
Optional<TbProductSku> 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<StockV2Vo> 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<TbProductSku> 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<StockVo> list) {
Map<Integer, Double> 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<StockV2Vo> list) {
Map<Integer, Double> 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();
}
}

View File

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

View File

@@ -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<StockV2Vo> 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<StockVo> list);
void updateIsStock(Integer proId, String shopId,Integer isStock);
void updateProductStatus(StockUpdateValueVO updateValueVO);
}

View File

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