Merge remote-tracking branch 'origin/dev' into dev

This commit is contained in:
韩鹏辉
2024-06-28 09:47:20 +08:00
12 changed files with 185 additions and 52 deletions

View File

@@ -1,21 +1,33 @@
package cn.ysk.cashier.controller.product;
import cn.hutool.core.util.StrUtil;
import cn.ysk.cashier.annotation.Log;
import cn.ysk.cashier.annotation.rest.AnonymousPostMapping;
import cn.ysk.cashier.dto.product.StockQueryDto;
import cn.ysk.cashier.exception.BadRequestException;
import cn.ysk.cashier.service.product.StockService;
import cn.ysk.cashier.utils.BeanUtil;
import cn.ysk.cashier.utils.SecurityUtils;
import cn.ysk.cashier.vo.StockPageImpl;
import cn.ysk.cashier.vo.StockUpdateValueVO;
import cn.ysk.cashier.vo.StockUpdateWarnLineVO;
import cn.ysk.cashier.vo.StockV2Vo;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageImpl;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletResponse;
import javax.validation.Valid;
import java.io.IOException;
import java.util.Map;
@RestController
@RequiredArgsConstructor
@@ -60,6 +72,7 @@ public class StockController {
@Log("库存导入")
@PostMapping("/doImport/v2")
@ApiOperation("文件导入库存")
@AnonymousPostMapping
public ResponseEntity<Object> importExcelV2(@RequestParam String shopId,@RequestParam("file") MultipartFile file) {
String fileName = file.getOriginalFilename();
if (file.isEmpty()) {
@@ -89,7 +102,14 @@ public class StockController {
public ResponseEntity<Object> queryTbProductV2(StockQueryDto criteria,
@RequestParam(required = false, defaultValue = "0") Integer page,
@RequestParam(required = false, defaultValue = "10") Integer size){
return new ResponseEntity<>(stockService.queryAllV2(criteria,page,size), HttpStatus.OK);
Page<StockV2Vo> stockV2Vos = stockService.queryAllV2(criteria, page, size);
Map<String, Object> dataMap = BeanUtil.transBean2Map(stockV2Vos);
if (stockV2Vos.getContent().isEmpty()) {
dataMap.put("warnLine", 0);
}else {
dataMap.put("warnLine", stockV2Vos.getContent().get(0).getWarnLine());
}
return new ResponseEntity<>(dataMap, HttpStatus.OK);
}
@GetMapping("/sku")
@@ -113,4 +133,14 @@ public class StockController {
return new ResponseEntity<>("修改成功", HttpStatus.OK);
}
@PutMapping("warnLine")
@ApiOperation("修改商品警告线")
public ResponseEntity<Object> updateProductWarnLine(@RequestBody StockUpdateWarnLineVO stockUpdateWarnLineVO) {
if (StrUtil.isBlank(stockUpdateWarnLineVO.getShopId()) || stockUpdateWarnLineVO.getWarnLine() == null || stockUpdateWarnLineVO.getWarnLine() <= 0) {
throw new BadRequestException("参数有误");
}
stockService.updateProductWarnLine(stockUpdateWarnLineVO);
return new ResponseEntity<>("修改成功", HttpStatus.OK);
}
}

View File

@@ -86,6 +86,10 @@ public class TbShopPurveyorTransact implements Serializable {
@ApiModelProperty(value = "paidAt")
private Long paidAt;
@Column(name = "`pay_type`")
@ApiModelProperty(value = "payType")
private String payType;
@Column(name = "`type`")
@ApiModelProperty(value = "type")
private String type;

View File

@@ -59,7 +59,7 @@ public interface TbProductSkuRepository extends JpaRepository<TbProductSku, Inte
" WHEN pro.isDistribute = 1 THEN IFNULL(pro.stockNumber, 0) " +
" ELSE SUM(sku.stockNumber) " +
" END " +
", pro.isDistribute, pro.isPauseSale, true) " +
", pro.isDistribute, pro.isPauseSale, true, sku.warnLine) " +
"from " +
"TbProduct pro " +
"LEFT JOIN TbProductSku sku on pro.id = sku.productId " +
@@ -150,4 +150,9 @@ public interface TbProductSkuRepository extends JpaRepository<TbProductSku, Inte
@Modifying
@Query("update FROM TbProductSku sku set sku.costPrice=:cost WHERE sku.productId=:productId")
Integer updateCostByProductId(String productId, BigDecimal cost);
@Transactional
@Modifying
@Query("UPDATE TbProductSku p SET p.warnLine = :warnLine WHERE p.shopId = :shopId")
Integer updateWarnLineByShopId(@Param("warnLine")Integer warnLine, @Param("shopId")String shopId);
}

View File

@@ -37,8 +37,8 @@ public interface TbShopPurveyorTransactRepository extends JpaRepository<TbShopPu
"b.address," +
"b.remark," +
"b.lastTransactAt," +
"sum(a.waitAmount) ," +
"count(a.id)) " +
"COALESCE(SUM(CASE WHEN a.status=0 THEN a.waitAmount ELSE 0 END), 0)," +
"COUNT(CASE WHEN a.status = 0 THEN a.id ELSE NULL END)) " +
"from " +
"TbShopPurveyor b " +
"LEFT JOIN TbShopPurveyorTransact a ON a.purveyorId = b.id " +

View File

@@ -4,8 +4,11 @@ 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.mapper.shop.TbShopInfoMapper;
import cn.ysk.cashier.pojo.product.TbProductSku;
import cn.ysk.cashier.pojo.shop.TbShopInfo;
import cn.ysk.cashier.repository.product.TbProductSkuRepository;
import cn.ysk.cashier.repository.shop.TbShopInfoRepository;
import cn.ysk.cashier.service.TbProductStockOperateService;
import cn.ysk.cashier.service.product.StockService;
import cn.ysk.cashier.service.product.TbProductService;
@@ -13,6 +16,7 @@ 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.StockUpdateWarnLineVO;
import cn.ysk.cashier.vo.StockV2Vo;
import cn.ysk.cashier.vo.StockVo;
import lombok.RequiredArgsConstructor;
@@ -24,6 +28,7 @@ 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.data.jpa.domain.Specification;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
@@ -31,6 +36,10 @@ import org.springframework.web.multipart.MultipartFile;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;
import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Predicate;
import javax.persistence.criteria.Root;
import javax.servlet.http.HttpServletResponse;
import javax.transaction.Transactional;
import java.io.IOException;
@@ -49,6 +58,7 @@ public class StockServiceImpl implements StockService {
private final TbProductStockOperateService stockOperateService;
private final TbProductSkuRepository skuRepository;
private final TbShopInfoRepository tbShopInfoRepository;
@PersistenceContext
private EntityManager em;
@@ -93,37 +103,35 @@ public class StockServiceImpl implements StockService {
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.getSkuId());
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(如需导入,该值不可变)", "");
skuMap.put("商品名称", all.getName());
skuMap.put("商品skuId(如需导入,该值不可变)", sku.getSkuId());
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);
Map<String, Object> map = new LinkedHashMap<>();
map.put("id(如需导入,该值不可变)", all.getProId());
map.put("商品名称", all.getName());
map.put("商品skuId(如需导入,该值不可变)", all.getSkuId());
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);
} else {
List<StockV2Vo> skuList = queryProductSku(all.getProId().toString());
for (StockV2Vo sku : skuList) {
Map<String, Object> skuMap = new LinkedHashMap<>();
skuMap.put("id(如需导入,该值不可变)", "sku");
skuMap.put("商品名称", all.getName());
skuMap.put("商品skuId(如需导入,该值不可变)", sku.getSkuId());
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);
}
}
}
FileUtil.downloadExcel(list, response);
@@ -183,27 +191,33 @@ public class StockServiceImpl implements StockService {
if (row != null) {
XSSFCell cell0 = row.getCell(0);
String productIdStr = cell0.toString();
if (StringUtils.isBlank(productIdStr)) {
if ("sku".equals(productIdStr)) {
Optional<TbProductSku> byId = skuRepository.findById(Double.valueOf(row.getCell(2).toString()).intValue());
if (byId.isPresent()) {
TbProductSku sku = byId.get();
String numStr = row.getCell(6).toString();
Double aDouble = Double.valueOf(numStr);
if (aDouble.equals(sku.getStockNumber())) {
continue;
}
list.add(new StockV2Vo(
0,
sku.getId(),
row.getCell(1).toString(),
row.getCell(5).toString(),
row.getCell(4).toString(),
row.getCell(6).toString(),
sku.getStockNumber(),
aDouble.intValue(),
sku.getStockNumber().intValue(),
0
));
}
} else {
TbProductDto product = productService.findById(Double.valueOf(productIdStr).intValue());
if (product != null) {
Object number = "0";
if (product.getIsDistribute().equals(1)) {
number = row.getCell(6).toString();
String numStr = row.getCell(6).toString();
Integer aIntValue = Double.valueOf(numStr).intValue();
if (aIntValue.equals(product.getStockNumber())) {
continue;
}
list.add(new StockV2Vo(
product.getId(),
@@ -211,7 +225,7 @@ public class StockServiceImpl implements StockService {
product.getName(),
row.getCell(5).toString(),
row.getCell(4).toString(),
number,
aIntValue,
product.getStockNumber(),
product.getIsDistribute()
));
@@ -313,4 +327,13 @@ public class StockServiceImpl implements StockService {
Query nativeQuery = em.createNativeQuery(String.valueOf(sqlQuery));
nativeQuery.executeUpdate();
}
@Override
public void updateProductWarnLine(StockUpdateWarnLineVO stockUpdateWarnLineVO) {
TbShopInfo shopInfo = tbShopInfoRepository.findById(Integer.valueOf(stockUpdateWarnLineVO.getShopId())).orElse(null);
if (shopInfo == null) {
throw new BadRequestException("店铺不存在");
}
tbProductSkuRepository.updateWarnLineByShopId(stockUpdateWarnLineVO.getWarnLine(), stockUpdateWarnLineVO.getShopId());
}
}

View File

@@ -88,7 +88,7 @@ public class TbProductGroupServiceImpl implements TbProductGroupService {
resources.setCreatedAt(Instant.now().toEpochMilli());
resources.setUpdatedAt(Instant.now().toEpochMilli());
TbProductGroup save = tbProductGroupRepository.save(resources);
save.setSort(save.getId());
resources.setSort(save.getId());
return tbProductGroupMapper.toDto(tbProductGroupRepository.save(resources));
}

View File

@@ -169,18 +169,18 @@ public class TbProductStockOperateServiceImpl implements TbProductStockOperateSe
stockOperate.setUpdatedAt(times);
stockOperate.setStatus("normal");
stockOperate.setPurveyorId(resources.getPurveyorId());
if (StringUtils.isNotBlank(resources.getPurveyorId())) {
Optional<TbShopPurveyor> byId1 = purveyorRepository.findById(Integer.valueOf(resources.getPurveyorId()));
if (byId1.isPresent()) {
TbShopPurveyor tbShopPurveyor = byId1.get();
resources.setPurveyorName(tbShopPurveyor.getPurveyorName());
}
}
stockOperate.setPurveyorName(resources.getPurveyorName());
if (!resources.getIsImport().equals("true")) {
//供应商退货 reject
//供应商入库 purveyor
if ("reject".equals(resources.getType()) || "purveyor".equals(resources.getType())) {
if (StringUtils.isNotBlank(resources.getPurveyorId())) {
Optional<TbShopPurveyor> byId1 = purveyorRepository.findById(Integer.valueOf(resources.getPurveyorId()));
if (byId1.isPresent()) {
TbShopPurveyor tbShopPurveyor = byId1.get();
resources.setPurveyorName(tbShopPurveyor.getPurveyorName());
}
}
TbShopPurveyorTransact purveyorTransact = new TbShopPurveyorTransact();
purveyorTransact.setShopId(resources.getShopId());
purveyorTransact.setPurveyorName(resources.getPurveyorName());

View File

@@ -110,6 +110,7 @@ public class TbShopPurveyorTransactServiceImpl implements TbShopPurveyorTransact
}else {
tbShopPurveyorTransact.setStatus(0);
}
tbShopPurveyorTransact.setPayType(resources.getPayType());
tbShopPurveyorTransactRepository.save(tbShopPurveyorTransact);
}
@@ -142,4 +143,4 @@ public class TbShopPurveyorTransactServiceImpl implements TbShopPurveyorTransact
}
FileUtil.downloadExcel(list, response);
}
}
}

View File

@@ -2,6 +2,7 @@ package cn.ysk.cashier.service.product;
import cn.ysk.cashier.dto.product.StockQueryDto;
import cn.ysk.cashier.vo.StockUpdateValueVO;
import cn.ysk.cashier.vo.StockUpdateWarnLineVO;
import cn.ysk.cashier.vo.StockV2Vo;
import cn.ysk.cashier.vo.StockVo;
import org.springframework.data.domain.Page;
@@ -20,7 +21,7 @@ public interface StockService {
*/
Page queryAll(StockQueryDto criteria, Integer page, Integer size);
Page queryAllV2(StockQueryDto criteria, Integer page, Integer size);
Page<StockV2Vo> queryAllV2(StockQueryDto criteria, Integer page, Integer size);
List<StockV2Vo> queryProductSku(String productId);
@@ -37,4 +38,10 @@ public interface StockService {
void updateIsStock(Integer proId, String shopId,Integer isStock);
void updateProductStatus(StockUpdateValueVO updateValueVO);
/**
* 商品库存警戒线设置
* @param stockUpdateWarnLineVO 警戒线
*/
void updateProductWarnLine(StockUpdateWarnLineVO stockUpdateWarnLineVO);
}

View File

@@ -0,0 +1,26 @@
package cn.ysk.cashier.vo;
import org.springframework.data.domain.PageImpl;
import org.springframework.data.domain.Pageable;
import java.util.List;
public class StockPageImpl<T> extends PageImpl<T> {
private Integer warnLine;
public StockPageImpl(List<T> content, Pageable pageable, long total) {
super(content, pageable, total);
}
public StockPageImpl(List<T> content) {
super(content);
}
public Integer getWarnLine() {
return warnLine;
}
public void setWarnLine(Integer warnLine) {
this.warnLine = warnLine;
}
}

View File

@@ -0,0 +1,13 @@
package cn.ysk.cashier.vo;
import lombok.Data;
import javax.validation.constraints.Min;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
@Data
public class StockUpdateWarnLineVO {
private String shopId;
private Integer warnLine;
}

View File

@@ -22,6 +22,7 @@ public class StockV2Vo {
private Integer isDistribute;
private Integer isPauseSale;
private Object number;
private Integer warnLine;
public StockV2Vo(Integer proId, Integer skuId, String name, String unitName,String specSnap, Object number,Object stockNumber, Integer isDistribute) {
this.proId = proId;
@@ -55,6 +56,28 @@ public class StockV2Vo {
this.isPauseSale = isPauseSale;
}
public StockV2Vo(Integer id, Integer proId,String img,String name,String unitName, String type, String specSnap,
Object isStock, Object number, Integer isDistribute, Integer isPauseSale, boolean isPro, Integer warnLine) {
this.id = id.toString() + "-" + proId.toString();
if (isPro) {
this.id += proId;
} else {
this.id += id;
}
this.skuId = id;
this.proId = proId;
this.img = img;
this.name = name;
this.unitName = unitName;
setType(type);
this.specSnap = specSnap;
this.isStock = isStock;
this.stockNumber = number;
this.isDistribute = isDistribute;
this.isPauseSale = isPauseSale;
this.warnLine = warnLine;
}
public void setType(String type) {
switch (type) {
case "normal":
@@ -84,7 +107,8 @@ public class StockV2Vo {
"\"name\":\"" + name + "\","+
"\"unitName\":\"" + unitName +"\","+
"\"specSnap\":\"" + specSnap + "\"," +
"\"stockNumber\":\"" + stockNumber + "\"," +
"\"number\":\"" + number + "\"," +
"\"stockNumber\":\"" + stockNumber + "\"" +
"}";
}
}