| | |
| | | import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; |
| | | import com.ruoyi.common.exception.ServiceException; |
| | | import com.ruoyi.common.utils.StringUtils; |
| | | import com.ruoyi.common.utils.poi.ExcelUtil; |
| | | import com.ruoyi.production.dto.ProductMaterialSkuDto; |
| | | import com.ruoyi.production.mapper.ProductMaterialMapper; |
| | | import com.ruoyi.production.mapper.ProductMaterialSkuMapper; |
| | | import com.ruoyi.production.pojo.ProductMaterial; |
| | | import com.ruoyi.production.pojo.ProductMaterialSku; |
| | | import com.ruoyi.production.pojo.ProductMaterialSkuImportDto; |
| | | import com.ruoyi.production.service.ProductMaterialSkuService; |
| | | import lombok.extern.slf4j.Slf4j; |
| | | import org.springframework.beans.factory.annotation.Autowired; |
| | | import org.springframework.stereotype.Service; |
| | | import org.springframework.transaction.annotation.Transactional; |
| | | import org.springframework.web.multipart.MultipartFile; |
| | | |
| | | import java.time.LocalDateTime; |
| | | import java.util.ArrayList; |
| | | import java.util.Collections; |
| | | import java.util.LinkedHashMap; |
| | | import java.util.List; |
| | | import java.util.Map; |
| | | import java.util.Set; |
| | | import java.util.stream.Collectors; |
| | | |
| | | /** |
| | | * <br> |
| | |
| | | |
| | | return this.count(queryWrapper) > 0; |
| | | } |
| | | |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public void importProdData(MultipartFile file, Long materialId) { |
| | | if (materialId == null) { |
| | | throw new ServiceException("物料ID不能为空"); |
| | | } |
| | | if (file == null || file.isEmpty()) { |
| | | throw new ServiceException("导入文件不能为空"); |
| | | } |
| | | |
| | | ProductMaterial material = productMaterialMapper.selectById(materialId); |
| | | if (material == null) { |
| | | throw new ServiceException("物料不存在"); |
| | | } |
| | | |
| | | ExcelUtil<ProductMaterialSkuImportDto> excelUtil = new ExcelUtil<>(ProductMaterialSkuImportDto.class); |
| | | List<ProductMaterialSkuImportDto> importList; |
| | | try { |
| | | importList = excelUtil.importExcel(file.getInputStream()); |
| | | } catch (Exception e) { |
| | | log.error("导入物料规格Excel解析失败", e); |
| | | throw new ServiceException("Excel解析失败"); |
| | | } |
| | | |
| | | if (importList == null || importList.isEmpty()) { |
| | | throw new ServiceException("Excel没有数据"); |
| | | } |
| | | |
| | | Map<String, ProductMaterialSkuImportDto> specMap = new LinkedHashMap<>(); |
| | | for (ProductMaterialSkuImportDto dto : importList) { |
| | | if (dto == null || StringUtils.isEmpty(dto.getSpecification())) { |
| | | continue; |
| | | } |
| | | String specification = dto.getSpecification().trim(); |
| | | if (specification.isEmpty()) { |
| | | continue; |
| | | } |
| | | specMap.putIfAbsent(specification, dto); |
| | | } |
| | | |
| | | if (specMap.isEmpty()) { |
| | | throw new ServiceException("Excel没有有效的规格数据"); |
| | | } |
| | | |
| | | Set<String> specifications = specMap.keySet(); |
| | | |
| | | List<ProductMaterialSku> existList = this.list(new LambdaQueryWrapper<ProductMaterialSku>() |
| | | .eq(ProductMaterialSku::getMaterialId, materialId) |
| | | .in(ProductMaterialSku::getSpecification, specifications)); |
| | | Map<String, ProductMaterialSku> existMap = existList.stream() |
| | | .collect(Collectors.toMap(ProductMaterialSku::getSpecification, sku -> sku, (a, b) -> a)); |
| | | |
| | | LocalDateTime now = LocalDateTime.now(); |
| | | List<ProductMaterialSku> saveList = new ArrayList<>(); |
| | | List<ProductMaterialSku> updateList = new ArrayList<>(); |
| | | |
| | | for (Map.Entry<String, ProductMaterialSkuImportDto> entry : specMap.entrySet()) { |
| | | String specification = entry.getKey(); |
| | | ProductMaterialSkuImportDto dto = entry.getValue(); |
| | | String supplyType = StringUtils.isNotEmpty(dto.getSupplyType()) ? dto.getSupplyType().trim() : null; |
| | | |
| | | ProductMaterialSku exist = existMap.get(specification); |
| | | if (exist == null) { |
| | | ProductMaterialSku sku = new ProductMaterialSku(); |
| | | sku.setMaterialId(materialId); |
| | | sku.setSpecification(specification); |
| | | sku.setSupplyType(supplyType); |
| | | sku.setCreateTime(now); |
| | | sku.setUpdateTime(now); |
| | | saveList.add(sku); |
| | | } else { |
| | | boolean needUpdate = false; |
| | | if (supplyType != null && !supplyType.equals(exist.getSupplyType())) { |
| | | exist.setSupplyType(supplyType); |
| | | needUpdate = true; |
| | | } |
| | | if (needUpdate) { |
| | | exist.setUpdateTime(now); |
| | | updateList.add(exist); |
| | | } |
| | | } |
| | | } |
| | | |
| | | if (saveList.isEmpty() && updateList.isEmpty()) { |
| | | throw new ServiceException("Excel与现有数据一致,无需导入"); |
| | | } |
| | | |
| | | if (!saveList.isEmpty()) { |
| | | this.saveBatch(saveList); |
| | | } |
| | | if (!updateList.isEmpty()) { |
| | | this.updateBatchById(updateList); |
| | | } |
| | | |
| | | log.info("物料规格导入完成 materialId={}, 新增{}条,更新{}条", materialId, saveList.size(), updateList.size()); |
| | | } |
| | | } |