库存列表 导入导出
库存记录 更新供应商 最后一次进货时间
This commit is contained in:
@@ -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<Object> 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<StockVo> 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<Object> 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<Object> updateIsHot(
|
||||
@RequestParam String shopId,
|
||||
@RequestParam Integer proId,
|
||||
@RequestParam Integer isStock){
|
||||
stockService.updateIsStock(proId,shopId,isStock);
|
||||
return new ResponseEntity<>(HttpStatus.OK);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -20,7 +20,7 @@ import java.util.List;
|
||||
**/
|
||||
@RestController
|
||||
@RequiredArgsConstructor
|
||||
@Api(tags = "/product管理")
|
||||
@Api(tags = "商品管理")
|
||||
@RequestMapping("/api/tbProduct")
|
||||
public class TbProductController {
|
||||
|
||||
|
||||
@@ -38,7 +38,7 @@ import javax.servlet.http.HttpServletResponse;
|
||||
**/
|
||||
@RestController
|
||||
@RequiredArgsConstructor
|
||||
@Api(tags = "product/spec管理")
|
||||
@Api(tags = "商品规格管理")
|
||||
@RequestMapping("/api/tbProductSpec")
|
||||
public class TbProductSpecController {
|
||||
|
||||
|
||||
@@ -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<Object> 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<Object> createTbShopPurveyorTransact(@Validated @RequestBody TbShopPurveyorTransact resources){
|
||||
return new ResponseEntity<>(tbShopPurveyorTransactService.create(resources),HttpStatus.CREATED);
|
||||
}
|
||||
|
||||
@PutMapping
|
||||
@ApiOperation("修改/shop/purveyorTransact")
|
||||
@ApiOperation("修改帐目往来")
|
||||
public ResponseEntity<Object> updateTbShopPurveyorTransact(@Validated @RequestBody TbShopPurveyorTransact resources){
|
||||
tbShopPurveyorTransactService.update(resources);
|
||||
return new ResponseEntity<>(HttpStatus.NO_CONTENT);
|
||||
}
|
||||
|
||||
@DeleteMapping
|
||||
@ApiOperation("删除/shop/purveyorTransact")
|
||||
@ApiOperation("删除帐目往来")
|
||||
public ResponseEntity<Object> deleteTbShopPurveyorTransact(@RequestBody Integer[] ids) {
|
||||
tbShopPurveyorTransactService.deleteAll(ids);
|
||||
return new ResponseEntity<>(HttpStatus.OK);
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -55,4 +55,10 @@ public class TbShopPurveyorTransactQueryCriteria{
|
||||
private Integer size;
|
||||
|
||||
private String sort;
|
||||
|
||||
public void setStatus(Integer status) {
|
||||
if (status != null) {
|
||||
this.status = status;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -25,7 +25,7 @@ import java.io.Serializable;
|
||||
|
||||
/**
|
||||
* @website https://eladmin.vip
|
||||
* @description /
|
||||
* @description 操作记录
|
||||
* @author lyf
|
||||
* @date 2024-01-25
|
||||
**/
|
||||
|
||||
@@ -33,7 +33,7 @@ public interface TbOrderDetailRepository extends JpaRepository<TbOrderDetail, In
|
||||
|
||||
|
||||
@Query("SELECT new cn.ysk.cashier.vo.TbOrderSalesCountByDayVo(" +
|
||||
"info.productName, info.productSkuName, cate.name, " +
|
||||
"info.productName, info.productSkuName, cate.name, unit.name," +
|
||||
"SUM(CASE WHEN orders.orderType!='return' THEN info.num ELSE 0 END) as salesNum, " +
|
||||
"SUM(CASE WHEN orders.orderType='return' THEN info.num ELSE 0 END), " +
|
||||
"SUM(info.num), " +
|
||||
@@ -42,6 +42,7 @@ public interface TbOrderDetailRepository extends JpaRepository<TbOrderDetail, In
|
||||
"FROM TbOrderInfo orders " +
|
||||
"LEFT JOIN TbOrderDetail info on orders.id=info.orderId " +
|
||||
"LEFT JOIN TbProduct pro ON info.productId = pro.id " +
|
||||
"LEFT JOIN TbShopUnit unit ON unit.id = pro.unitId " +
|
||||
"LEFT JOIN TbShopCategory cate ON cate.id = pro.categoryId " +
|
||||
"WHERE info.shopId = :shopId " +
|
||||
"AND (:cateId IS NULL OR pro.categoryId = :cateId) " +
|
||||
@@ -55,7 +56,7 @@ public interface TbOrderDetailRepository extends JpaRepository<TbOrderDetail, In
|
||||
|
||||
|
||||
@Query("SELECT new cn.ysk.cashier.vo.TbOrderSalesCountByDayVo(" +
|
||||
"info.productName, info.productSkuName, cate.name, " +
|
||||
"info.productName, info.productSkuName, cate.name, unit.name," +
|
||||
"SUM(CASE WHEN orders.orderType!='return' THEN info.num ELSE 0 END) as salesNum, " +
|
||||
"SUM(CASE WHEN orders.orderType='return' THEN info.num ELSE 0 END), " +
|
||||
"SUM(info.num), " +
|
||||
@@ -64,6 +65,7 @@ public interface TbOrderDetailRepository extends JpaRepository<TbOrderDetail, In
|
||||
"FROM TbOrderInfo orders " +
|
||||
"LEFT JOIN TbOrderDetail info on orders.id=info.orderId " +
|
||||
"LEFT JOIN TbProduct pro ON info.productId = pro.id " +
|
||||
"LEFT JOIN TbShopUnit unit ON unit.id = pro.unitId " +
|
||||
"LEFT JOIN TbShopCategory cate ON cate.id = pro.categoryId " +
|
||||
"WHERE info.shopId = :shopId " +
|
||||
"AND (:cateId IS NULL OR pro.categoryId = :cateId) " +
|
||||
|
||||
@@ -27,6 +27,11 @@ public interface TbProductRepository extends JpaRepository<TbProduct, Integer>,
|
||||
@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);
|
||||
|
||||
@@ -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<TbProductSku, Inte
|
||||
@Query("SELECT sku FROM TbProductSku sku WHERE sku.barCode = :barCode")
|
||||
TbProductSku searchBarCode(@Param("barCode")String barCode);
|
||||
|
||||
@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")
|
||||
Page<StockVo> 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<StockVo> 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<TbProductSku, Inte
|
||||
@Modifying
|
||||
@Query("update FROM TbProductSku sku set sku.stockNumber=sku.stockNumber+:stockNumber WHERE sku.id =:id")
|
||||
Integer updateStockNumber(@Param("id") Integer id, @Param("stockNumber") Double stockNumber);
|
||||
|
||||
@Modifying
|
||||
@Query("update FROM TbProductSku sku set sku.stockNumber=:stockNumber WHERE sku.shopId=:shopId and sku.id =:id")
|
||||
Integer updateStockNumber2(@Param("id") Integer id,@Param("shopId")String shopId, @Param("stockNumber") Double stockNumber);
|
||||
}
|
||||
@@ -19,6 +19,7 @@ import cn.ysk.cashier.pojo.shop.TbShopPurveyor;
|
||||
import org.apache.ibatis.annotations.Param;
|
||||
import org.springframework.data.jpa.repository.JpaRepository;
|
||||
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
|
||||
import org.springframework.data.jpa.repository.Modifying;
|
||||
import org.springframework.data.jpa.repository.Query;
|
||||
|
||||
import java.util.List;
|
||||
@@ -35,4 +36,8 @@ public interface TbShopPurveyorRepository extends JpaRepository<TbShopPurveyor,
|
||||
|
||||
@Query("select count(1) from TbShopPurveyor purveyor where purveyor.shopId = :shopId")
|
||||
Integer findByCount(@Param("shop") String shopId);
|
||||
|
||||
@Modifying
|
||||
@Query(value = "update tb_shop_purveyor set last_transact_at=UNIX_TIMESTAMP()*1000 where id=:id", nativeQuery = true)
|
||||
void upLastTransactAt(String id);
|
||||
}
|
||||
@@ -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());
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -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) {
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
69
eladmin-system/src/main/java/cn/ysk/cashier/vo/StockVo.java
Normal file
69
eladmin-system/src/main/java/cn/ysk/cashier/vo/StockVo.java
Normal file
@@ -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 + "\"" +
|
||||
"}";
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user