库存列表 导入导出

库存记录
更新供应商 最后一次进货时间
This commit is contained in:
2024-06-20 09:48:02 +08:00
parent e9e72b6c48
commit f345ba9b7f
24 changed files with 515 additions and 304 deletions

View File

@@ -401,6 +401,7 @@ public class SummaryServiceImpl implements SummaryService {
Map<String, Object> 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());

View File

@@ -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<Map<String, Object>> list = new ArrayList<>();
List<StockVo> stockVos = tbProductSkuRepository.searchProStock(criteria.getShopId(), criteria.getName(), criteria.getIsStock());
for (StockVo all : stockVos) {
Map<String, Object> 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<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
@Override
public void updateIsStock(Integer proId, String shopId,Integer isStock) {
productService.updateIsStock(proId,shopId,isStock);
}
}

View File

@@ -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) {

View File

@@ -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<String, Object> 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<Integer, Double> 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<Integer, Double> 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;
}

View File

@@ -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<String,Object>
*/
Page queryAll(StockQueryDto criteria, Integer page, Integer size);
void download(StockQueryDto summaryDto, HttpServletResponse response) throws IOException;
void inHouse(String shopId,List<StockVo> list);
void updateIsStock(Integer proId, String shopId,Integer isStock);
}

View File

@@ -74,4 +74,5 @@ public interface TbProductService {
void download(List<TbProductDto> all, HttpServletResponse response) throws IOException;
void updateIsHot(Integer id, String shopId);
void updateIsStock(Integer proId, String shopId,Integer isStock);
}