1.新增商品出入库成本价计算
2.新增后台商品列表接口,支持共享库存sku展示
This commit is contained in:
@@ -1,5 +1,6 @@
|
|||||||
package cn.ysk.cashier.controller.product;
|
package cn.ysk.cashier.controller.product;
|
||||||
|
|
||||||
|
import cn.ysk.cashier.annotation.AnonymousAccess;
|
||||||
import cn.ysk.cashier.annotation.Log;
|
import cn.ysk.cashier.annotation.Log;
|
||||||
import cn.ysk.cashier.dto.product.TbProductSortCriteria;
|
import cn.ysk.cashier.dto.product.TbProductSortCriteria;
|
||||||
import cn.ysk.cashier.vo.TbProductVo;
|
import cn.ysk.cashier.vo.TbProductVo;
|
||||||
@@ -29,7 +30,13 @@ public class TbProductController {
|
|||||||
@GetMapping
|
@GetMapping
|
||||||
@ApiOperation("查询/product")
|
@ApiOperation("查询/product")
|
||||||
public ResponseEntity<Object> queryTbProduct(TbProductQueryCriteria criteria){
|
public ResponseEntity<Object> queryTbProduct(TbProductQueryCriteria criteria){
|
||||||
return new ResponseEntity<>(tbProductService.queryAll(criteria),HttpStatus.OK);
|
return new ResponseEntity<>(tbProductService.queryAll(criteria, false),HttpStatus.OK);
|
||||||
|
}
|
||||||
|
|
||||||
|
@GetMapping("/list")
|
||||||
|
@ApiOperation("查询/productForAdmin")
|
||||||
|
public ResponseEntity<Object> queryTbProductForAdmin(TbProductQueryCriteria criteria){
|
||||||
|
return new ResponseEntity<>(tbProductService.queryAll(criteria, true),HttpStatus.OK);
|
||||||
}
|
}
|
||||||
|
|
||||||
@GetMapping("/isHot")
|
@GetMapping("/isHot")
|
||||||
@@ -78,4 +85,4 @@ public class TbProductController {
|
|||||||
tbProductService.deleteAll(ids);
|
tbProductService.deleteAll(ids);
|
||||||
return new ResponseEntity<>(HttpStatus.OK);
|
return new ResponseEntity<>(HttpStatus.OK);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -92,7 +92,7 @@ public class TbProductGroupController {
|
|||||||
*/
|
*/
|
||||||
@GetMapping("/addProduct")
|
@GetMapping("/addProduct")
|
||||||
public ResponseEntity<Object> ProductList(TbProductQueryCriteria criteria, Pageable pageable){
|
public ResponseEntity<Object> ProductList(TbProductQueryCriteria criteria, Pageable pageable){
|
||||||
return new ResponseEntity<>(tbProductService.queryAll(criteria),HttpStatus.OK);
|
return new ResponseEntity<>(tbProductService.queryAll(criteria, false),HttpStatus.OK);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -107,4 +107,4 @@ public class TbProductGroupController {
|
|||||||
return new ResponseEntity<>(tbProductGroupService.updateProductIds(addProduct,userName),HttpStatus.OK);
|
return new ResponseEntity<>(tbProductGroupService.updateProductIds(addProduct,userName),HttpStatus.OK);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
package cn.ysk.cashier.controller.product;
|
package cn.ysk.cashier.controller.product;
|
||||||
|
|
||||||
|
import cn.ysk.cashier.annotation.AnonymousAccess;
|
||||||
import cn.ysk.cashier.annotation.Log;
|
import cn.ysk.cashier.annotation.Log;
|
||||||
import cn.ysk.cashier.pojo.product.TbProductStockOperate;
|
import cn.ysk.cashier.pojo.product.TbProductStockOperate;
|
||||||
import cn.ysk.cashier.service.TbProductStockOperateService;
|
import cn.ysk.cashier.service.TbProductStockOperateService;
|
||||||
@@ -81,4 +82,4 @@ public class TbProductStockOperateController {
|
|||||||
tbProductStockOperateService.deleteAll(ids);
|
tbProductStockOperateService.deleteAll(ids);
|
||||||
return new ResponseEntity<>(HttpStatus.OK);
|
return new ResponseEntity<>(HttpStatus.OK);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -78,4 +78,4 @@ public class TbShopPurveyorController {
|
|||||||
tbShopPurveyorService.deleteAll(ids);
|
tbShopPurveyorService.deleteAll(ids);
|
||||||
return new ResponseEntity<>(HttpStatus.OK);
|
return new ResponseEntity<>(HttpStatus.OK);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -46,7 +46,6 @@ public class OutAndOnDto {
|
|||||||
* 应收金额
|
* 应收金额
|
||||||
*/
|
*/
|
||||||
private BigDecimal totalAmount;
|
private BigDecimal totalAmount;
|
||||||
|
|
||||||
@NonNull
|
@NonNull
|
||||||
private String type;
|
private String type;
|
||||||
@NonNull
|
@NonNull
|
||||||
@@ -54,7 +53,6 @@ public class OutAndOnDto {
|
|||||||
|
|
||||||
private String isImport="";
|
private String isImport="";
|
||||||
|
|
||||||
|
|
||||||
public String getBatchNumber() {
|
public String getBatchNumber() {
|
||||||
return batchNumber;
|
return batchNumber;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -320,6 +320,10 @@ public class TbProduct implements Serializable {
|
|||||||
@ApiModelProperty("库存数量")
|
@ApiModelProperty("库存数量")
|
||||||
private Integer stockNumber;
|
private Integer stockNumber;
|
||||||
|
|
||||||
|
@Column(name = "`total_cost_price`")
|
||||||
|
@ApiModelProperty(value = "总成本价")
|
||||||
|
private BigDecimal totalCostPrice = BigDecimal.ZERO;
|
||||||
|
|
||||||
|
|
||||||
public void copy(TbProduct source){
|
public void copy(TbProduct source){
|
||||||
BeanUtil.copyProperties(source,this, CopyOptions.create().setIgnoreNullValue(true));
|
BeanUtil.copyProperties(source,this, CopyOptions.create().setIgnoreNullValue(true));
|
||||||
|
|||||||
@@ -139,4 +139,8 @@ public class TbProductSku implements Serializable {
|
|||||||
@Column(name = "`is_pause_sale`")
|
@Column(name = "`is_pause_sale`")
|
||||||
@ApiModelProperty(value = "是否暂停销售")
|
@ApiModelProperty(value = "是否暂停销售")
|
||||||
private Integer isPauseSale = 0;
|
private Integer isPauseSale = 0;
|
||||||
|
|
||||||
|
@Column(name = "`total_cost_price`")
|
||||||
|
@ApiModelProperty(value = "总成本价")
|
||||||
|
private BigDecimal totalCostPrice = BigDecimal.ZERO;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -146,4 +146,8 @@ public interface TbProductSkuRepository extends JpaRepository<TbProductSku, Inte
|
|||||||
@Modifying
|
@Modifying
|
||||||
@Query("update FROM TbProductSku sku set sku.stockNumber=:stockNumber WHERE sku.shopId=:shopId and sku.id =:id")
|
@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);
|
Integer updateStockNumber2(@Param("id") Integer id,@Param("shopId")String shopId, @Param("stockNumber") Double stockNumber);
|
||||||
|
|
||||||
|
@Modifying
|
||||||
|
@Query("update FROM TbProductSku sku set sku.costPrice=:cost WHERE sku.productId=:productId")
|
||||||
|
Integer updateCostByProductId(String productId, BigDecimal cost);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -71,8 +71,25 @@ public class TbProductServiceImpl implements TbProductService {
|
|||||||
private final RedisUtils redisUtils;
|
private final RedisUtils redisUtils;
|
||||||
|
|
||||||
|
|
||||||
|
public static String setType(String type) {
|
||||||
|
switch (type) {
|
||||||
|
case "normal":
|
||||||
|
return "单规格";
|
||||||
|
case "sku":
|
||||||
|
return "多规格";
|
||||||
|
case "weight":
|
||||||
|
return "称重商品";
|
||||||
|
case "currentPrice":
|
||||||
|
return "套餐商品/团购卷";
|
||||||
|
case "group":
|
||||||
|
return "时价商品";
|
||||||
|
default:
|
||||||
|
return type;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Map<String, Object> queryAll(TbProductQueryCriteria criteria) {
|
public Map<String, Object> queryAll(TbProductQueryCriteria criteria, boolean isAdmin) {
|
||||||
Sort sort = Sort.by(Sort.Direction.ASC, "sort");
|
Sort sort = Sort.by(Sort.Direction.ASC, "sort");
|
||||||
Pageable pageable = PageRequest.of(criteria.getPage(), criteria.getSize(), sort);
|
Pageable pageable = PageRequest.of(criteria.getPage(), criteria.getSize(), sort);
|
||||||
//查询商品数据
|
//查询商品数据
|
||||||
@@ -127,14 +144,23 @@ public class TbProductServiceImpl implements TbProductService {
|
|||||||
TbProductVo tbProductVo = new TbProductVo();
|
TbProductVo tbProductVo = new TbProductVo();
|
||||||
//sku,并且计算销量以及库存
|
//sku,并且计算销量以及库存
|
||||||
double stockNumber = 0.00;
|
double stockNumber = 0.00;
|
||||||
|
|
||||||
if (product.getIsDistribute() == 1) {
|
if (product.getIsDistribute() == 1) {
|
||||||
stockNumber = Double.valueOf(product.getStockNumber());
|
stockNumber = Double.valueOf(product.getStockNumber());
|
||||||
|
TbProductSku tbProductSku = null;
|
||||||
|
if (isAdmin) {
|
||||||
|
if (!tbProductSkus.isEmpty()) {
|
||||||
|
tbProductSku = BeanUtil.copyProperties(tbProductSkus.get(0), TbProductSku.class);
|
||||||
|
tbProductSku.setStockNumber(stockNumber);
|
||||||
|
}
|
||||||
|
skuList.add(tbProductSku);
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
for (TbProductSku sku : tbProductSkus) {
|
for (TbProductSku sku : tbProductSkus) {
|
||||||
//sku
|
//sku
|
||||||
if (sku.getProductId().equals(product.getId().toString())) {
|
if (sku.getProductId().equals(product.getId().toString())) {
|
||||||
skuList.add(sku);
|
skuList.add(sku);
|
||||||
stockNumber = stockNumber + sku.getStockNumber();
|
stockNumber = isAdmin ? sku.getStockNumber() : stockNumber + sku.getStockNumber();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -184,11 +210,13 @@ public class TbProductServiceImpl implements TbProductService {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
BeanUtils.copyProperties(product, tbProductVo);
|
BeanUtils.copyProperties(product, tbProductVo);
|
||||||
|
tbProductVo.setTypeEnum(setType(tbProductVo.getTypeEnum()));
|
||||||
tbProductVoList.add(tbProductVo);
|
tbProductVoList.add(tbProductVo);
|
||||||
}
|
}
|
||||||
return PageUtil.toPage(tbProductVoList, page.getTotalElements());
|
return PageUtil.toPage(tbProductVoList, page.getTotalElements());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public TbProductVo findByProductId(Integer id) throws Exception {
|
public TbProductVo findByProductId(Integer id) throws Exception {
|
||||||
TbProduct tbProduct = tbProductRepository.findById(id).orElseGet(TbProduct::new);
|
TbProduct tbProduct = tbProductRepository.findById(id).orElseGet(TbProduct::new);
|
||||||
|
|||||||
@@ -36,6 +36,7 @@ import org.springframework.data.domain.Page;
|
|||||||
import org.springframework.data.domain.Pageable;
|
import org.springframework.data.domain.Pageable;
|
||||||
import org.springframework.util.CollectionUtils;
|
import org.springframework.util.CollectionUtils;
|
||||||
|
|
||||||
|
import java.math.BigDecimal;
|
||||||
import java.time.Instant;
|
import java.time.Instant;
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
@@ -83,7 +84,7 @@ public class TbProductStockOperateServiceImpl implements TbProductStockOperateSe
|
|||||||
}
|
}
|
||||||
HashMap<String, Object> map = new HashMap<>();
|
HashMap<String, Object> map = new HashMap<>();
|
||||||
map.put("content",stockOperateVOList);
|
map.put("content",stockOperateVOList);
|
||||||
map.put("totalElements",page.getTotalElements());
|
map.put("totalElements", page.getTotalElements());
|
||||||
return map;
|
return map;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -216,6 +217,7 @@ public class TbProductStockOperateServiceImpl implements TbProductStockOperateSe
|
|||||||
|
|
||||||
boolean isDistribute = product.getIsDistribute() == 1;
|
boolean isDistribute = product.getIsDistribute() == 1;
|
||||||
|
|
||||||
|
// 保存库存详情
|
||||||
TbProductStockDetail productStockDetail = new TbProductStockDetail();
|
TbProductStockDetail productStockDetail = new TbProductStockDetail();
|
||||||
productStockDetail.setBatchNumber(resources.getBatchNumber());
|
productStockDetail.setBatchNumber(resources.getBatchNumber());
|
||||||
productStockDetail.setCreatedAt(times);
|
productStockDetail.setCreatedAt(times);
|
||||||
@@ -223,30 +225,46 @@ public class TbProductStockOperateServiceImpl implements TbProductStockOperateSe
|
|||||||
productStockDetail.setIsStock(1);
|
productStockDetail.setIsStock(1);
|
||||||
Integer round = (int) Math.floor(isDistribute ? product.getStockNumber() : tbProductSku.getStockNumber());
|
Integer round = (int) Math.floor(isDistribute ? product.getStockNumber() : tbProductSku.getStockNumber());
|
||||||
productStockDetail.setLeftNumber(round);
|
productStockDetail.setLeftNumber(round);
|
||||||
productStockDetail.setProductId(productListDto.getProductId());
|
productStockDetail.setProductId(tbProductSku.getProductId());
|
||||||
productStockDetail.setProductName(productListDto.getName());
|
productStockDetail.setProductName(product.getName());
|
||||||
productStockDetail.setRecordId(saveStockOperate.getId().toString());
|
productStockDetail.setRecordId(saveStockOperate.getId().toString());
|
||||||
productStockDetail.setShopId(resources.getShopId());
|
productStockDetail.setShopId(resources.getShopId());
|
||||||
productStockDetail.setSkuId(productListDto.getId().toString());
|
productStockDetail.setSkuId(productListDto.getId().toString());
|
||||||
productStockDetail.setSourcePath("NORMAL");
|
productStockDetail.setSourcePath("NORMAL");
|
||||||
productStockDetail.setStockSnap(productListDto.getSpecSnap());
|
productStockDetail.setStockSnap(productListDto.getSpecSnap());
|
||||||
productListDto.setNumber(productListDto.getNumber() != null ? productListDto.getNumber() : 0);
|
productListDto.setNumber(productListDto.getNumber() != null ? productListDto.getNumber() : 0);
|
||||||
|
tbProductSku.setCostPrice(productListDto.getCostPrice());
|
||||||
|
// 总成本价
|
||||||
|
BigDecimal totalCostPrice;
|
||||||
|
productStockDetail.setType(resources.getType());
|
||||||
switch (resources.getType()) {
|
switch (resources.getType()) {
|
||||||
case "sale":
|
case "sale":
|
||||||
productStockDetail.setStockNumber((double) -productListDto.getNumber());
|
productStockDetail.setStockNumber((double) -productListDto.getNumber());
|
||||||
productStockDetail.setSubType(-1);
|
productStockDetail.setSubType(-1);
|
||||||
break;
|
break;
|
||||||
|
//后台出库
|
||||||
case "refund":
|
case "refund":
|
||||||
productStockDetail.setStockNumber((double) productListDto.getNumber());
|
productStockDetail.setStockNumber(isDistribute ? product.getStockNumber() : tbProductSku.getStockNumber());
|
||||||
productStockDetail.setSubType(1);
|
productStockDetail.setSubType(1);
|
||||||
|
totalCostPrice = productListDto.getCostPrice().multiply(BigDecimal.valueOf(productListDto.getNumber()));
|
||||||
|
productStockDetail.setCostAmount(totalCostPrice);
|
||||||
|
setProOrSkuCost(product, tbProductSku,totalCostPrice, false);
|
||||||
|
productStockDetail.setType("供应商出库");
|
||||||
|
|
||||||
break;
|
break;
|
||||||
case "reject":
|
case "reject":
|
||||||
productStockDetail.setStockNumber((double) -productListDto.getNumber());
|
productStockDetail.setStockNumber((double) -productListDto.getNumber());
|
||||||
productStockDetail.setSubType(-1);
|
productStockDetail.setSubType(-1);
|
||||||
break;
|
break;
|
||||||
|
//后台入库
|
||||||
case "purveyor":
|
case "purveyor":
|
||||||
productStockDetail.setStockNumber((double) productListDto.getNumber());
|
productStockDetail.setStockNumber(isDistribute ? product.getStockNumber() : tbProductSku.getStockNumber());
|
||||||
productStockDetail.setSubType(1);
|
productStockDetail.setSubType(1);
|
||||||
|
totalCostPrice = productListDto.getCostPrice().multiply(BigDecimal.valueOf(productListDto.getNumber()));
|
||||||
|
productStockDetail.setCostAmount(totalCostPrice);
|
||||||
|
setProOrSkuCost(product, tbProductSku,totalCostPrice, true);
|
||||||
|
productStockDetail.setType("供应商入库");
|
||||||
|
|
||||||
break;
|
break;
|
||||||
case "purchase":
|
case "purchase":
|
||||||
productStockDetail.setStockNumber((double) productListDto.getNumber());
|
productStockDetail.setStockNumber((double) productListDto.getNumber());
|
||||||
@@ -259,15 +277,17 @@ public class TbProductStockOperateServiceImpl implements TbProductStockOperateSe
|
|||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
productStockDetail.setType(resources.getType());
|
|
||||||
productStockDetail.setUnitName(productListDto.getUnitName());
|
productStockDetail.setUnitName(productListDto.getUnitName());
|
||||||
entityManager.persist(productStockDetail);
|
entityManager.persist(productStockDetail);
|
||||||
if (isDistribute) {
|
if (isDistribute) {
|
||||||
product.setStockNumber(product.getStockNumber() + productStockDetail.getStockNumber().intValue());
|
product.setStockNumber(product.getStockNumber() + productStockDetail.getStockNumber().intValue());
|
||||||
|
//修改成本价
|
||||||
|
tbProductSkuRepository.updateCostByProductId(product.getId().toString(), productListDto.getCostPrice());
|
||||||
tbProductRepository.save(product);
|
tbProductRepository.save(product);
|
||||||
} else {
|
} else {
|
||||||
//sku数量
|
//sku数量
|
||||||
tbProductSku.setStockNumber(tbProductSku.getStockNumber() + productStockDetail.getStockNumber());
|
tbProductSku.setStockNumber(tbProductSku.getStockNumber() + productStockDetail.getStockNumber());
|
||||||
|
tbProductSku.setCostPrice(productListDto.getCostPrice());
|
||||||
productSkuService.update(tbProductSku);
|
productSkuService.update(tbProductSku);
|
||||||
}
|
}
|
||||||
idStockMap.put(productListDto.getId(), productStockDetail.getStockNumber());
|
idStockMap.put(productListDto.getId(), productStockDetail.getStockNumber());
|
||||||
@@ -279,6 +299,29 @@ public class TbProductStockOperateServiceImpl implements TbProductStockOperateSe
|
|||||||
return resources;
|
return resources;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 根据是否共享库存调整成本价
|
||||||
|
* @param product 商品
|
||||||
|
* @param tbProductSku sku商品
|
||||||
|
* @param cost 成本价
|
||||||
|
* @param isAdd true 增加 false 减少
|
||||||
|
*/
|
||||||
|
private void setProOrSkuCost(TbProduct product, TbProductSku tbProductSku, BigDecimal cost, boolean isAdd) {
|
||||||
|
if (product.getTotalCostPrice() == null) {
|
||||||
|
product.setTotalCostPrice(BigDecimal.ZERO);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (tbProductSku.getTotalCostPrice() == null) {
|
||||||
|
tbProductSku.setTotalCostPrice(BigDecimal.ZERO);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (product.getIsDistribute() == 1) {
|
||||||
|
product.setTotalCostPrice(isAdd ? product.getTotalCostPrice().add(cost) : product.getTotalCostPrice().subtract(cost));
|
||||||
|
}else {
|
||||||
|
tbProductSku.setTotalCostPrice(isAdd ? tbProductSku.getTotalCostPrice().add(cost) : tbProductSku.getTotalCostPrice().subtract(cost));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@Transactional(rollbackFor = Exception.class)
|
@Transactional(rollbackFor = Exception.class)
|
||||||
|
|||||||
@@ -21,9 +21,11 @@ public interface TbProductService {
|
|||||||
/**
|
/**
|
||||||
* 查询数据分页
|
* 查询数据分页
|
||||||
* @param criteria 条件
|
* @param criteria 条件
|
||||||
|
* @param isAdmin 是否为后台查询
|
||||||
* @return Map<String,Object>
|
* @return Map<String,Object>
|
||||||
*/
|
*/
|
||||||
Map<String,Object> queryAll(TbProductQueryCriteria criteria);
|
Map<String,Object> queryAll(TbProductQueryCriteria criteria, boolean isAdmin);
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 查询所有数据不分页
|
* 查询所有数据不分页
|
||||||
|
|||||||
@@ -80,4 +80,4 @@ public interface TbShopPurveyorService {
|
|||||||
* @throws IOException /
|
* @throws IOException /
|
||||||
*/
|
*/
|
||||||
void download(List<TbShopPurveyorDto> all, HttpServletResponse response) throws IOException;
|
void download(List<TbShopPurveyorDto> all, HttpServletResponse response) throws IOException;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user