diff --git a/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/java/com/bsd/pjcloud/supermarket/service/impl/SmErpSpuServiceImpl.java b/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/java/com/bsd/pjcloud/supermarket/service/impl/SmErpSpuServiceImpl.java index c4eeb8047..38f2239c2 100644 --- a/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/java/com/bsd/pjcloud/supermarket/service/impl/SmErpSpuServiceImpl.java +++ b/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/java/com/bsd/pjcloud/supermarket/service/impl/SmErpSpuServiceImpl.java @@ -195,6 +195,29 @@ public class SmErpSpuServiceImpl extends ServiceImpl existingUnitIds = smErpUnitService.list( + new LambdaQueryWrapper() + .eq(SmErpUnitEntity::getSpuId, supermarketSpu.getId()) + ).stream().map(SmErpUnitEntity::getId).collect(Collectors.toList()); + + // 收集本次提交的ID(排除新增的) + List submittedIds = smErpUnitEntityList.stream() + .map(SmErpUnitEntity::getId) + .filter(Objects::nonNull) + .collect(Collectors.toList()); + + // 计算需要删除的ID + List toDeleteIds = existingUnitIds.stream() + .filter(id -> !submittedIds.contains(id)) + .collect(Collectors.toList()); + + // 批量删除失效单位 + if (!toDeleteIds.isEmpty()) { + smErpUnitService.removeByIds(toDeleteIds); + } + } else { return R.failed("包装类型不能为空"); } @@ -206,9 +229,32 @@ public class SmErpSpuServiceImpl extends ServiceImpl supermarketAuxiliaryCodeEntity.setSpuId(supermarketSpu.getId())); smErpAuxiliaryCodeService.saveBatch(insertCollect); smErpAuxiliaryCodeService.updateBatchById(updateCollect); + + // 获取现有所有条码ID + List existingCodeIds = smErpAuxiliaryCodeService.list( + new LambdaQueryWrapper() + .eq(SmErpAuxiliaryCodeEntity::getSpuId, supermarketSpu.getId()) + ).stream().map(SmErpAuxiliaryCodeEntity::getId).collect(Collectors.toList()); + + // 收集本次提交的ID(排除新增的) + List submittedCodeIds = smErpAuxiliaryCodeEntityList.stream() + .map(SmErpAuxiliaryCodeEntity::getId) + .filter(Objects::nonNull) + .collect(Collectors.toList()); + + // 计算需要删除的ID + List toDeleteCodeIds = existingCodeIds.stream() + .filter(id -> !submittedCodeIds.contains(id)) + .collect(Collectors.toList()); + + // 批量删除失效条码 + if (!toDeleteCodeIds.isEmpty()) { + smErpAuxiliaryCodeService.removeByIds(toDeleteCodeIds); + } } else { return R.failed("辅助条码不能为空"); } + return R.ok(); } @@ -441,518 +487,6 @@ public class SmErpSpuServiceImpl extends ServiceImpl smErpSpuImportDtos, BindingResult bindingResult) { - if (CollectionUtils.isEmpty(smErpSpuImportDtos)) { - return R.failed("导入数据不能为空"); - } - List> errorList = new ArrayList<>(); - List successList = new ArrayList<>(); - for (int i = 0; i < smErpSpuImportDtos.size(); i++) { - int rowNumber = i + 1; - SmErpSpuImportDto dto = smErpSpuImportDtos.get(i); - List errorReasons = new ArrayList<>(); - // 数据校验阶段 - List validationErrors = ErpSpuValidator.validate(dto, rowNumber); - String productCode = dto.getProductCode(); - if (!validationErrors.isEmpty()) { - errorList.add(createErrorInfo(rowNumber, productCode, validationErrors)); - continue; - } - //新增商品 - //1.先查询当前货号是否存在,存在即更新,不存在即新增 - List smErpSpuEntities = baseMapper.selectListByScope(new LambdaQueryWrapper(). - eq(SmErpSpuEntity::getProductCode, productCode), DataScope.of()); - if (CollectionUtils.isEmpty(smErpSpuEntities)) { - //新增 - SmErpSpuEntity smErpSpuEntity = BeanUtils.toBean(dto, SmErpSpuEntity.class); - if (dto.getCommodityNature().equals("电子称称重商品")){ - smErpSpuEntity.setProductNature("2"); - }else { - smErpSpuEntity.setProductNature("1"); - } - //先查询分类是否有,没有自动新增 - SmErpCategoryEntity smErpCategoryEntity = smErpCategoryMapper.selectOne - (new LambdaQueryWrapper().eq(SmErpCategoryEntity::getName, dto.getClassification())); - if (smErpCategoryEntity == null) { - //新增分类 - SmErpCategoryEntity smErpCategoryEntity1 = new SmErpCategoryEntity(); - smErpCategoryEntity1.setName(dto.getClassification()); - smErpCategoryEntity1.setStatus("0"); - smErpCategoryMapper.insert(smErpCategoryEntity1); - smErpSpuEntity.setCategoryId(smErpCategoryEntity1.getId()); - }else { - smErpSpuEntity.setCategoryId(smErpCategoryEntity.getId()); - } - baseMapper.insert(smErpSpuEntity); - //新增包装单位 - SmErpUnitEntity smErpUnitEntity = BeanUtils.toBean(dto, SmErpUnitEntity.class); - smErpUnitEntity.setIsBase(true); - smErpUnitEntity.setSpuId(smErpSpuEntity.getId()); - smErpUnitService.save(smErpUnitEntity); - //新增库存 - SmErpStockEntity smErpStockEntity = new SmErpStockEntity(); - smErpStockEntity.setCurrentStock(dto.getStock()); - smErpStockEntity.setBaseStock(dto.getStock()); - smErpStockEntity.setInventoryLowerLimit(dto.getInventoryLowerLimit()); - smErpStockEntity.setInventoryUpperLimit(dto.getInventoryUpperLimit()); - smErpStockEntity.setErpSpuId(smErpSpuEntity.getId()); - smErpStockMapper.insert(smErpStockEntity); - //新增辅助条码 - SmErpAuxiliaryCodeEntity smErpAuxiliaryCodeEntity = new SmErpAuxiliaryCodeEntity(); - smErpAuxiliaryCodeEntity.setBarCode(dto.getBarCode()); - smErpAuxiliaryCodeEntity.setSpuId(smErpSpuEntity.getId()); - smErpAuxiliaryCodeEntity.setUnitId(smErpUnitEntity.getId()); - smErpAuxiliaryCodeService.save(smErpAuxiliaryCodeEntity); - }else { - //查到相同的货号,更新 - - } - - - } - return null; - }*/ -/* - @Override - @Transactional - public R importErpSpu(List smErpSpuImportDtos, BindingResult bindingResult) { - if (CollectionUtils.isEmpty(smErpSpuImportDtos)) { - return R.failed("导入数据不能为空"); - } - - List> errorList = new ArrayList<>(); - List successList = new ArrayList<>(); - - for (int i = 0; i < smErpSpuImportDtos.size(); i++) { - int rowNumber = i + 1; - SmErpSpuImportDto dto = smErpSpuImportDtos.get(i); - List errorReasons = new ArrayList<>(); - String productCode = dto.getProductCode(); - - try { - // 数据校验 - List validationErrors = ErpSpuValidator.validate(dto, rowNumber); - if (!validationErrors.isEmpty()) { - errorList.add(createErrorInfo(rowNumber, productCode, validationErrors)); - continue; - } - - // 解析商品分类 - Long categoryId = resolveCategory(dto.getClassification(), errorReasons); - if (categoryId == null) { - errorList.add(createErrorInfo(rowNumber, productCode, errorReasons)); - continue; - } - - // 查询现有商品 - SmErpSpuEntity existingSpu = baseMapper.selectOne(new LambdaQueryWrapper() - .eq(SmErpSpuEntity::getProductCode, productCode)); - - if (existingSpu == null) { - // 新增逻辑 - handleNewSpu(dto, categoryId, errorReasons, rowNumber, productCode, errorList); - } else { - // 更新逻辑 - handleExistingSpu(existingSpu, dto, categoryId, errorReasons, rowNumber, productCode, errorList); - } - - // 记录成功数据 - if (errorReasons.isEmpty()) { - successList.add(baseMapper.selectById(existingSpu != null ? existingSpu.getId() : null)); - } - } catch (Exception e) { - errorReasons.add("系统异常: " + e.getMessage()); - errorList.add(createErrorInfo(rowNumber, productCode, errorReasons)); - } - } - - return buildImportResult(smErpSpuImportDtos.size(), successList.size(), errorList); - } - - - - // 处理分类(公共方法) - private Long resolveCategory(String categoryName, List errorReasons) { - try { - SmErpCategoryEntity category = smErpCategoryMapper.selectOne( - new LambdaQueryWrapper() - .eq(SmErpCategoryEntity::getName, categoryName) - ); - - if (category != null) return category.getId(); - - // 新建分类 - SmErpCategoryEntity newCategory = new SmErpCategoryEntity(); - newCategory.setName(categoryName); - newCategory.setStatus("0"); // 假设0为启用状态 - if (smErpCategoryMapper.insert(newCategory) > 0) { - return newCategory.getId(); - } - errorReasons.add("分类创建失败"); - } catch (DuplicateKeyException e) { - // 处理并发创建场景 - return smErpCategoryMapper.selectOne( - new LambdaQueryWrapper() - .eq(SmErpCategoryEntity::getName, categoryName) - ).getId(); - } - return null; - } - - // 处理新增商品 - private void handleNewSpu(SmErpSpuImportDto dto, Long categoryId, List errorReasons, - int rowNumber, String productCode, List> errorList) { - try { - SmErpSpuEntity newSpu = BeanUtils.toBean(dto, SmErpSpuEntity.class); - newSpu.setProductNature(dto.getCommodityNature().equals("电子称称重商品") ? "2" : "1"); - newSpu.setCategoryId(categoryId); - - if (baseMapper.insert(newSpu) <= 0) { - errorReasons.add("商品创建失败"); - errorList.add(createErrorInfo(rowNumber, productCode, errorReasons)); - return; - } - - // 处理关联数据 - handleRelatedData(newSpu, dto, errorReasons, rowNumber, productCode, errorList); - } catch (DuplicateKeyException e) { - errorReasons.add("货号已存在"); - errorList.add(createErrorInfo(rowNumber, productCode, errorReasons)); - } - } - - // 处理更新商品 - private void handleExistingSpu(SmErpSpuEntity existingSpu, SmErpSpuImportDto dto, Long categoryId, - List errorReasons, int rowNumber, String productCode, - List> errorList) { - try { - // 更新主数据 - org.springframework.beans.BeanUtils.copyProperties(dto, existingSpu); - existingSpu.setProductNature(dto.getCommodityNature().equals("电子称称重商品") ? "2" : "1"); - existingSpu.setCategoryId(categoryId); - - if (baseMapper.updateById(existingSpu) <= 0) { - errorReasons.add("商品更新失败"); - errorList.add(createErrorInfo(rowNumber, productCode, errorReasons)); - return; - } - - // 处理关联数据 - handleRelatedData(existingSpu, dto, errorReasons, rowNumber, productCode, errorList); - } catch (Exception e) { - errorReasons.add("更新异常: " + e.getMessage()); - errorList.add(createErrorInfo(rowNumber, productCode, errorReasons)); - } - } - - // 处理关联数据(单位、库存、条码) - private void handleRelatedData(SmErpSpuEntity spu, SmErpSpuImportDto dto, List errorReasons, - int rowNumber, String productCode, List> errorList) { - // 处理包装单位 - SmErpUnitEntity unit = smErpUnitService.getOne( - new LambdaQueryWrapper() - .eq(SmErpUnitEntity::getSpuId, spu.getId()) - ); - - try { - if (unit != null) { - // 更新单位 - org.springframework.beans.BeanUtils.copyProperties(dto, unit); - smErpUnitService.updateById(unit); - } else { - // 新增单位 - unit = BeanUtils.toBean(dto, SmErpUnitEntity.class); - unit.setSpuId(spu.getId()); - unit.setIsBase(true); - smErpUnitService.save(unit); - } - } catch (Exception e) { - errorReasons.add("包装单位处理失败: " + e.getMessage()); - } - - // 处理库存 - SmErpStockEntity stock = smErpStockMapper.selectOne( - new LambdaQueryWrapper() - .eq(SmErpStockEntity::getErpSpuId, spu.getId()) - ); - - try { - if (stock != null) { - // 更新库存 - stock.setCurrentStock(dto.getStock()); - stock.setBaseStock(dto.getStock()); - stock.setInventoryLowerLimit(dto.getInventoryLowerLimit()); - stock.setInventoryUpperLimit(dto.getInventoryUpperLimit()); - smErpStockMapper.updateById(stock); - } else { - // 新增库存 - stock = BeanUtils.toBean(dto, SmErpStockEntity.class); - stock.setErpSpuId(spu.getId()); - smErpStockMapper.insert(stock); - } - } catch (Exception e) { - errorReasons.add("库存处理失败: " + e.getMessage()); - } - - // 处理辅助条码 - SmErpAuxiliaryCodeEntity code = smErpAuxiliaryCodeService.getOne( - new LambdaQueryWrapper() - .eq(SmErpAuxiliaryCodeEntity::getSpuId, spu.getId()) - ); - - try { - if (code != null) { - // 更新条码 - code.setBarCode(dto.getBarCode()); - code.setUnitId(unit.getId()); - smErpAuxiliaryCodeService.updateById(code); - } else { - // 新增条码 - code = new SmErpAuxiliaryCodeEntity(); - code.setBarCode(dto.getBarCode()); - code.setSpuId(spu.getId()); - code.setUnitId(unit.getId()); - smErpAuxiliaryCodeService.save(code); - } - } catch (Exception e) { - errorReasons.add("条码处理失败: " + e.getMessage()); - } - - // 记录错误 - if (!errorReasons.isEmpty()) { - errorList.add(createErrorInfo(rowNumber, productCode, errorReasons)); - } - } - - - // 构建返回结果(与供应商导入保持一致) - private R buildImportResult(int total, int successCount, List> errorList) { - Map result = new LinkedHashMap<>(); - result.put("total", total); - result.put("successCount", successCount); - result.put("errorCount", errorList.size()); - - if (!errorList.isEmpty()) { - result.put("errors", errorList); - return R.failed(result,"部分数据导入失败"); - } - return R.ok( result,"成功导入所有" + successCount + "条数据"); - } - - // 错误信息构建方法 - private Map createErrorInfo(int row, String name, List reasons) { - return new HashMap() {{ - put("row", row); - put("supplierName", name); - put("reasons", reasons); - }}; - } -*/ - -// private R buildImportResult(int total, int successCount, List> errorList) { -// Map result = new LinkedHashMap<>(); -// result.put("total", total); -// result.put("successCount", successCount); -// result.put("errorCount", errorList.size()); -// -// if (!errorList.isEmpty()) { -// result.put("errors", errorList); -// return R.failed(result,"部分数据导入失败"); -// } -// return R.ok( result,"成功导入所有" + successCount + "条数据"); -// } -// // 错误信息构建方法 -// private Map createErrorInfo(int row, String name, List reasons) { -// return new HashMap() {{ -// put("row", row); -// put("supplierName", name); -// put("reasons", reasons); -// }}; -// } - /* @Override - @Transactional(rollbackFor = Exception.class) - public R importErpSpu(List smErpSpuImportDtos, BindingResult bindingResult) { - if (CollectionUtils.isEmpty(smErpSpuImportDtos)) { - return R.failed("导入数据不能为空"); - } - - List> errorList = new ArrayList<>(); - List successList = new ArrayList<>(); - - // 批量处理分类 - Map categoryMap = resolveCategories(smErpSpuImportDtos, errorList); - - // 批量处理商品 - List spuBatch = new ArrayList<>(); - List unitBatch = new ArrayList<>(); - List stockBatch = new ArrayList<>(); - List codeBatch = new ArrayList<>(); - - for (int i = 0; i < smErpSpuImportDtos.size(); i++) { - int rowNumber = i + 1; - SmErpSpuImportDto dto = smErpSpuImportDtos.get(i); - List errorReasons = new ArrayList<>(); - String productCode = dto.getProductCode(); - - try { - // 数据校验 - List validationErrors = ErpSpuValidator.validate(dto, rowNumber); - if (!validationErrors.isEmpty()) { - errorList.add(createErrorInfo(rowNumber, productCode, validationErrors)); - continue; - } - - // 获取分类ID - Long categoryId = categoryMap.get(dto.getClassification()); - if (categoryId == null) { - errorReasons.add("分类不存在且创建失败"); - errorList.add(createErrorInfo(rowNumber, productCode, errorReasons)); - continue; - } - - // 构造商品实体 - SmErpSpuEntity spu = BeanUtils.toBean(dto, SmErpSpuEntity.class); - spu.setProductNature("电子称称重商品".equals(dto.getCommodityNature()) ? "2" : "1"); - spu.setCategoryId(categoryId); - spuBatch.add(spu); - - // 构造关联数据 - buildRelatedData(dto, spu, unitBatch, stockBatch, codeBatch); - - successList.add(spu); - } catch (Exception e) { - errorReasons.add("系统异常: " + e.getMessage()); - errorList.add(createErrorInfo(rowNumber, productCode, errorReasons)); - } - } - - // 批量数据库操作 - try { - // 批量插入/更新商品 - if (!spuBatch.isEmpty()) { - saveOrUpdateBatchSpu(spuBatch); - } - - // 批量处理关联数据 - if (!unitBatch.isEmpty()) { - smErpUnitService.saveOrUpdateBatch(unitBatch); - } - if (!stockBatch.isEmpty()) { - smErpStockService.saveOrUpdateBatch(stockBatch); - } - if (!codeBatch.isEmpty()) { - smErpAuxiliaryCodeService.saveOrUpdateBatch(codeBatch); - } - } catch (Exception e) { - throw new RuntimeException("批量操作失败", e); - } - - return buildImportResult(smErpSpuImportDtos.size(), successList.size(), errorList); - } - - // 批量处理分类 - private Map resolveCategories(List dtos, List> errorList) { - // 获取所有分类名称 - Set categoryNames = dtos.stream() - .map(SmErpSpuImportDto::getClassification) - .collect(Collectors.toSet()); - - // 批量查询已有分类 - List existCategories = smErpCategoryMapper.selectList( - new LambdaQueryWrapper() - .in(SmErpCategoryEntity::getName, categoryNames)); - - Map categoryMap = existCategories.stream() - .collect(Collectors.toMap(SmErpCategoryEntity::getName, SmErpCategoryEntity::getId)); - - // 找出需要新增的分类 - List newCategories = categoryNames.stream() - .filter(name -> !categoryMap.containsKey(name)) - .map(name -> { - SmErpCategoryEntity category = new SmErpCategoryEntity(); - category.setName(name); - category.setStatus("0"); - return category; - }) - .collect(Collectors.toList()); - - // 批量插入新分类 - if (!newCategories.isEmpty()) { - smCategoryService.saveBatch(newCategories); - newCategories.forEach(cat -> categoryMap.put(cat.getName(), cat.getId())); - } - - return categoryMap; - } - - // 批量保存或更新商品 - private void saveOrUpdateBatchSpu(List spuList) { - // 按货号分组 - Map> spuMap = spuList.stream() - .collect(Collectors.groupingBy(SmErpSpuEntity::getProductCode)); - - // 批量查询已存在的商品 - List existSpus = baseMapper.selectList( - new LambdaQueryWrapper() - .in(SmErpSpuEntity::getProductCode, spuMap.keySet())); - - // 分离新增和更新数据 - List toInsert = new ArrayList<>(); - List toUpdate = new ArrayList<>(); - - spuList.forEach(spu -> { - Optional exist = existSpus.stream() - .filter(e -> e.getProductCode().equals(spu.getProductCode())) - .findFirst(); - - if (exist.isPresent()) { - SmErpSpuEntity entity = exist.get(); - org.springframework.beans.BeanUtils.copyProperties(spu, entity); - toUpdate.add(entity); - } else { - toInsert.add(spu); - } - }); - - // 批量操作 - if (!toInsert.isEmpty()) { - this.saveBatch((toInsert)); - } - if (!toUpdate.isEmpty()) { - this.updateBatchById(toUpdate); - } - } - - // 构建关联数据 - private void buildRelatedData(SmErpSpuImportDto dto, SmErpSpuEntity spu, - List unitBatch, - List stockBatch, - List codeBatch) { - // 包装单位 - SmErpUnitEntity unit = BeanUtils.toBean(dto, SmErpUnitEntity.class); - unit.setSpuId(spu.getId()); - unit.setIsBase(true); - unitBatch.add(unit); - - // 库存 - SmErpStockEntity stock = BeanUtils.toBean(dto, SmErpStockEntity.class); - stock.setErpSpuId(spu.getId()); - stock.setCurrentStock(dto.getStock()); - stock.setBaseStock(dto.getStock()); - stockBatch.add(stock); - - // 辅助条码 - SmErpAuxiliaryCodeEntity code = new SmErpAuxiliaryCodeEntity(); - code.setBarCode(dto.getBarCode()); - code.setSpuId(spu.getId()); - code.setUnitId(unit.getId()); - codeBatch.add(code); - } - - -*/ @Override