This commit is contained in:
zjf committed 2025-03-03 00:32:11 +08:00
1 parent 54618d49c8
commit 033d234744
2 files changed
+129 -25

No files matched your search

@@ -22,6 +22,7 @@ import com.bsd.pjcloud.supermarket.entity.SmErpUnitEntity;
import com.bsd.pjcloud.supermarket.service.*;
import com.bsd.pjcloud.supermarket.task.TaskStoreService;
import com.bsd.pjcloud.supermarket.vo.erpspu.SmErpSpuSimpleVo;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
@@ -238,6 +239,9 @@ public class SmErpSpuController {
System.out.println(collect);
// List<SmErpSpuImportDto> collect1 = dtos.stream().filter(smErpSpuImportDto -> StringUtils.isBlank(smErpSpuImportDto.getClassification())).collect(Collectors.toList());
// System.out.println(collect);
if (CollectionUtils.isEmpty(collect)) {
return R.failed("导入数据不能为空");
}
return smErpSpuService.importErpSpu(collect, bindingResult);
}
@@ -17,10 +17,7 @@ import com.bsd.pjcloud.supermarket.dto.erpspu.SmErpSpuImportDto;
import com.bsd.pjcloud.supermarket.dto.inventoryrecords.UpdateStockDTO;
import com.bsd.pjcloud.supermarket.dto.supplier.SmErpSupplierImportDto;
import com.bsd.pjcloud.supermarket.entity.*;
import com.bsd.pjcloud.supermarket.mapper.SmErpCategoryMapper;
import com.bsd.pjcloud.supermarket.mapper.SmErpSpuMapper;
import com.bsd.pjcloud.supermarket.mapper.SmErpStockMapper;
import com.bsd.pjcloud.supermarket.mapper.SmSpuMapper;
import com.bsd.pjcloud.supermarket.mapper.*;
import com.bsd.pjcloud.supermarket.service.*;
import com.bsd.pjcloud.supermarket.task.TaskStoreService;
import com.bsd.pjcloud.supermarket.validarot.ErpSpuValidator;
@@ -48,6 +45,7 @@ import java.time.LocalDateTime;
import java.util.*;
import java.util.concurrent.Executor;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.function.Function;
import java.util.stream.Collectors;
/**
@@ -74,6 +72,8 @@ public class SmErpSpuServiceImpl extends ServiceImpl<SmErpSpuMapper, SmErpSpuEnt
private final SmErpCategoryService smCategoryService;
private final SmErpSupplierMapper smErpSupplierMapper;
@Autowired
private Sequence sequence;
@@ -129,7 +129,7 @@ public class SmErpSpuServiceImpl extends ServiceImpl<SmErpSpuMapper, SmErpSpuEnt
//如果更新商品的期初库存,就需要计算后期商品出入库单据进行了多少数据
LambdaQueryWrapper<SmErpStockEntity> selectWStockWrapper = new LambdaQueryWrapper<>();
selectWStockWrapper.eq(SmErpStockEntity::getErpSpuId, supermarketSpu.getId());
SmErpStockEntity queryStock = smErpStockMapper.selectOne(selectWStockWrapper);
SmErpStockEntity queryStock = smErpStockMapper.selectOne(selectWStockWrapper);
//得到单据进出的库存数量
Double inventoryStockNum = queryStock.getCurrentStock() - queryStock.getBaseStock();
@@ -138,10 +138,10 @@ public class SmErpSpuServiceImpl extends ServiceImpl<SmErpSpuMapper, SmErpSpuEnt
SmErpStockEntity smErpStockEntity = new SmErpStockEntity();
smErpStockEntity.setBaseStock(stock);
//单据进出的+期初
smErpStockEntity.setCurrentStock(stock+inventoryStockNum);
smErpStockEntity.setCurrentStock(stock + inventoryStockNum);
smErpStockEntity.setInventoryLowerLimit(supermarketSpu.getInventoryLowerLimit());
smErpStockEntity.setInventoryUpperLimit(supermarketSpu.getInventoryUpperLimit());
smErpStockMapper.update(smErpStockEntity,smErpStockEntityLambdaQueryWrapper);
smErpStockMapper.update(smErpStockEntity, smErpStockEntityLambdaQueryWrapper);
//新增包装类型
List<SmErpUnitEntity> smErpUnitEntityList = supermarketSpu.getSmErpUnitEntityList();
@@ -192,14 +192,14 @@ public class SmErpSpuServiceImpl extends ServiceImpl<SmErpSpuMapper, SmErpSpuEnt
@Override
@Transactional
public R updateSpuStock(SupermarketSpuUpdateStockReqDTO updateStockReqDTO) {
List<UpdateStockDTO> updateStockDTOS=new ArrayList<UpdateStockDTO>();
List<UpdateStockDTO> updateStockDTOS = new ArrayList<UpdateStockDTO>();
for (SupermarketSpuUpdateStockReqDTO.Item v : updateStockReqDTO.getItems()) {
// 查询当前库存
SmErpSpuEntity spu = baseMapper.selectById(v.getId());
if (spu == null) {
return R.failed(spu.getProductName() + "商品不存在");
}
if (v.getIncrCount() == 0){
if (v.getIncrCount() == 0) {
return R.failed("扣减不能为0");
}
LambdaUpdateWrapper<SmErpStockEntity> lambdaUpdateWrapper = new LambdaUpdateWrapper<>();
@@ -234,7 +234,7 @@ public class SmErpSpuServiceImpl extends ServiceImpl<SmErpSpuMapper, SmErpSpuEnt
Page pageData = baseMapper.selectPageByScope(page, wrapper, DataScope.of());
//计算库存回显
List<SmErpSpuEntity> records = pageData.getRecords();
if (CollectionUtils.isNotEmpty(records)){
if (CollectionUtils.isNotEmpty(records)) {
Set<Long> erpSpuIds = records.stream().map(smErpSpuEntity -> smErpSpuEntity.getId()).collect(Collectors.toSet());
// 批量查询库存信息
@@ -244,7 +244,7 @@ public class SmErpSpuServiceImpl extends ServiceImpl<SmErpSpuMapper, SmErpSpuEnt
// 建立SPU ID与库存的映射关系
Map<Long, SmErpStockEntity> stockMap = stocks.stream()
.collect(Collectors.toMap(SmErpStockEntity::getErpSpuId,smErpStockEntity -> smErpStockEntity));
.collect(Collectors.toMap(SmErpStockEntity::getErpSpuId, smErpStockEntity -> smErpStockEntity));
records.forEach(spu ->
{
@@ -325,9 +325,9 @@ public class SmErpSpuServiceImpl extends ServiceImpl<SmErpSpuMapper, SmErpSpuEnt
@Override
public Page<ErpSpuWithUnitPageVo> getErpSpuPage(Page page, ErpCgPlanDTO erpCgPlanDTO) {
LambdaQueryWrapper<SmErpSpuEntity> smErpUnitEntityLambdaQueryWrapper = new LambdaQueryWrapper<>();
smErpUnitEntityLambdaQueryWrapper.eq(SmErpSpuEntity::getStatus,"0");
smErpUnitEntityLambdaQueryWrapper.eq(StringUtils.isNotBlank(erpCgPlanDTO.getProductCode()),SmErpSpuEntity::getProductCode, erpCgPlanDTO.getProductCode());
smErpUnitEntityLambdaQueryWrapper.like(StringUtils.isNotBlank(erpCgPlanDTO.getProductName()),SmErpSpuEntity::getProductName, erpCgPlanDTO.getProductName());
smErpUnitEntityLambdaQueryWrapper.eq(SmErpSpuEntity::getStatus, "0");
smErpUnitEntityLambdaQueryWrapper.eq(StringUtils.isNotBlank(erpCgPlanDTO.getProductCode()), SmErpSpuEntity::getProductCode, erpCgPlanDTO.getProductCode());
smErpUnitEntityLambdaQueryWrapper.like(StringUtils.isNotBlank(erpCgPlanDTO.getProductName()), SmErpSpuEntity::getProductName, erpCgPlanDTO.getProductName());
Page<SmErpSpuEntity> spuPage = baseMapper.selectPageByScope(page, smErpUnitEntityLambdaQueryWrapper, DataScope.of());
// 将 SmErpSpuEntity 转换为 SmErpPageScopeVo
@@ -338,7 +338,7 @@ public class SmErpSpuServiceImpl extends ServiceImpl<SmErpSpuMapper, SmErpSpuEnt
//复制unit
List<Long> spuIds = voList.stream().map(vo -> vo.getId()).collect(Collectors.toList());
List<SmErpUnitEntity> unitList = smErpUnitService.list(new LambdaQueryWrapper<SmErpUnitEntity>().in(SmErpUnitEntity::getSpuId, spuIds));
List<SmErpUnitEntity> unitList = smErpUnitService.list(new LambdaQueryWrapper<SmErpUnitEntity>().in(SmErpUnitEntity::getSpuId, spuIds));
voList.stream().forEach(vo -> {
List<SmErpUnitEntity> unitEntities = unitList.stream().filter(unit -> unit.getSpuId().equals(vo.getId())).collect(Collectors.toList());
@@ -875,14 +875,27 @@ public class SmErpSpuServiceImpl extends ServiceImpl<SmErpSpuMapper, SmErpSpuEnt
@Override
@Transactional(rollbackFor = Exception.class)
public R importErpSpu(List<SmErpSpuImportDto> smErpSpuImportDtos, BindingResult bindingResult) {
if (CollectionUtils.isEmpty(smErpSpuImportDtos)) {
return R.failed("导入数据不能为空");
}
//错误集合
List<Map<String, Object>> errorList = new ArrayList<>();
List<SmErpSpuEntity> spuBatch = new ArrayList<>();
// List<SmErpSpuEntity> spuBatch = new ArrayList<>();
//货号-商品映射
Map<String, SmErpSpuEntity> productCodeToSpuMap = new HashMap<>();
// 第一阶段:处理商品主数据(新增/更新分离)
List<SmErpSpuEntity> insertBatch = new ArrayList<>(); // 需要插入的列表
List<SmErpSpuEntity> updateBatch = new ArrayList<>(); // 需要更新的列表
// 预处理:批量查询所有 productCode 是否存在
Set<String> existingProductCodes = smErpSpuImportDtos.stream()
.map(SmErpSpuImportDto::getProductCode)
.collect(Collectors.toSet());
Map<String, SmErpSpuEntity> existingSpuMap = baseMapper.selectListByScope(
new LambdaQueryWrapper<SmErpSpuEntity>()
.in(SmErpSpuEntity::getProductCode, existingProductCodes),DataScope.of()
).stream().collect(Collectors.toMap(
SmErpSpuEntity::getProductCode,
Function.identity()
));
// 第一阶段:处理商品主数据
for (int i = 0; i < smErpSpuImportDtos.size(); i++) {
int rowNumber = i + 1;
@@ -893,11 +906,13 @@ public class SmErpSpuServiceImpl extends ServiceImpl<SmErpSpuMapper, SmErpSpuEnt
try {
// 数据校验
List<String> validationErrors = ErpSpuValidator.validate(dto, rowNumber);
//添加验证错误记录
if (!validationErrors.isEmpty()) {
errorList.add(createErrorInfo(rowNumber, productCode, validationErrors));
continue;
}
// 处理分类(带完整错误处理)
Long categoryId = resolveCategory(
dto.getClassification(),
@@ -909,15 +924,35 @@ public class SmErpSpuServiceImpl extends ServiceImpl<SmErpSpuMapper, SmErpSpuEnt
errorList.add(createErrorInfo(rowNumber, productCode, errorReasons));
continue;
}
//todo 处理货商
//处理货商
Long supplierId = resolveSupplierId(
dto.getSupplier(),
errorReasons,
rowNumber,
productCode
);
if (supplierId == null) {
errorList.add(createErrorInfo(rowNumber, productCode, errorReasons));
continue;
}
// 构建商品实体
SmErpSpuEntity spu = new SmErpSpuEntity();
org.springframework.beans.BeanUtils.copyProperties(dto, spu);
spu.setProductNature("电子称称重商品".equals(dto.getCommodityNature()) ? "2" : "1");
spu.setCategoryId(categoryId);
spu.setSupplierId(supplierId);
spuBatch.add(spu);
SmErpSpuEntity existingSpu = existingSpuMap.get(productCode);
if (existingSpu != null) {
// 更新模式:设置原有主键
spu.setId(existingSpu.getId());
updateBatch.add(spu);
} else {
// 新增模式
insertBatch.add(spu);
}
// spuBatch.add(spu);
productCodeToSpuMap.put(productCode, spu);
} catch (Exception e) {
errorReasons.add("系统异常: " + e.getMessage());
@@ -927,8 +962,12 @@ public class SmErpSpuServiceImpl extends ServiceImpl<SmErpSpuMapper, SmErpSpuEnt
// 批量保存商品(生成ID)
try {
if (!spuBatch.isEmpty()) {
this.saveBatch(spuBatch); // MyBatis-Plus批量插入
if (!insertBatch.isEmpty()) {
this.saveBatch(insertBatch);
}
if (!updateBatch.isEmpty()) {
this.updateBatchById(updateBatch);
}
} catch (Exception e) {
throw new RuntimeException("商品批量保存失败", e);
@@ -949,7 +988,7 @@ public class SmErpSpuServiceImpl extends ServiceImpl<SmErpSpuMapper, SmErpSpuEnt
// 跳过已记录错误的数据
if (errorList.stream().anyMatch(e ->
e.get("productCode").equals(productCode) &&
(int)e.get("row") == rowNumber)) {
(int) e.get("row") == rowNumber)) {
continue;
}
@@ -1029,6 +1068,67 @@ public class SmErpSpuServiceImpl extends ServiceImpl<SmErpSpuMapper, SmErpSpuEnt
return buildImportResult(smErpSpuImportDtos.size(), productCodeToSpuMap.size(), errorList);
}
/**
* 解析供应商ID(存在则返回,不存在则创建)
*
* @param supplierName 供应商名称
* @param errorReasons 错误原因收集列表
* @param rowNumber 数据行号(用于错误提示)
* @param productCode 商品编码(用于错误提示)
* @return 供应商ID 或 null(解析失败时)
*/
private Long resolveSupplierId(String supplierName,
List<String> errorReasons,
int rowNumber,
String productCode) {
if (StringUtils.isBlank(supplierName)) {
errorReasons.add("供应商名称不能为空");
return null;
}
try {
LambdaQueryWrapper<SmErpSupplierEntity> smErpSupplierEntityLambdaQueryWrapper = new LambdaQueryWrapper<>();
smErpSupplierEntityLambdaQueryWrapper.eq(SmErpSupplierEntity::getSupplierName, supplierName);
// 1. 查询现有供应商(名称唯一)
SmErpSupplierEntity existSupplier = smErpSupplierMapper.selectListByScope(smErpSupplierEntityLambdaQueryWrapper
,DataScope.of()
).get(0);
if (existSupplier != null) {
return existSupplier.getSupplierId();
} else {
errorReasons.add("供应商不存在,请先导入'" + supplierName + "'该供应商");
return null;
}
// 2. 创建新供应商
// SmErpSupplierEntity newSupplier = new SmErpSupplierEntity();
// newSupplier.setSupplierName(supplierName);
// newSupplier.setStatus("0"); // 假设0为启用状态
// newSupplier.setContactPerson("待补充"); // 默认值(按需调整)
// newSupplier.setContactPhone("待补充");
//
// int insertResult = smErpSupplierMapper.insert(newSupplier);
// if (insertResult > 0) {
// return newSupplier.getId();
// }
//
// errorReasons.add("供应商创建失败");
// return null;
} catch (DuplicateKeyException e) {
// 处理并发创建冲突:重新查询
SmErpSupplierEntity conflictSupplier = smErpSupplierMapper.selectListByScope(
new LambdaQueryWrapper<SmErpSupplierEntity>()
.eq(SmErpSupplierEntity::getSupplierName, supplierName),DataScope.of()
).get(0);
return conflictSupplier != null ? conflictSupplier.getSupplierId() : null;
} catch (Exception e) {
errorReasons.add("供应商处理异常: " + e.getMessage());
return null;
}
}
// 分类处理(完整实现)
private Long resolveCategory(String categoryName,
List<String> errorReasons,