修改
This commit is contained in:
1 parent
54618d49c8
commit
033d234744
2 files changed
+129
-25
No files matched your search
+4
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
+125
-25
@@ -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,
|
||||
|
||||
Reference in new issue
Block a user