| | |
| | | |
| | | import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; |
| | | import com.baomidou.mybatisplus.core.metadata.IPage; |
| | | import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; |
| | | import com.baomidou.mybatisplus.extension.plugins.pagination.Page; |
| | | import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; |
| | | import com.ruoyi.business.dto.ProductionMasterDto; |
| | | import com.ruoyi.business.entity.OfficialInventory; |
| | | import com.ruoyi.business.entity.Production; |
| | | import com.ruoyi.business.entity.ProductionInventory; |
| | | import com.ruoyi.business.entity.ProductionMaster; |
| | |
| | | import com.ruoyi.business.mapper.ProductionMapper; |
| | | import com.ruoyi.business.mapper.ProductionMasterMapper; |
| | | import com.ruoyi.business.service.ProductionMasterService; |
| | | import com.ruoyi.common.core.domain.entity.SysUser; |
| | | import com.ruoyi.common.exception.base.BaseException; |
| | | import com.ruoyi.common.utils.bean.BeanUtils; |
| | | import com.ruoyi.system.mapper.SysUserMapper; |
| | | import lombok.RequiredArgsConstructor; |
| | | import org.springframework.stereotype.Service; |
| | | import org.springframework.transaction.annotation.Transactional; |
| | | |
| | | import java.math.BigDecimal; |
| | | import java.util.Collections; |
| | | import java.util.List; |
| | | import java.util.Map; |
| | | import java.util.*; |
| | | import java.util.stream.Collectors; |
| | | |
| | | /** |
| | |
| | | private final ProductionMapper productionMapper; |
| | | |
| | | private final OfficialInventoryMapper officialInventoryMapper; |
| | | |
| | | private final SysUserMapper sysUserMapper; |
| | | |
| | | @Override |
| | | public IPage<ProductionMasterDto> selectPMList(Page page, ProductionMasterDto productionMasterDto) { |
| | |
| | | BigDecimal totalTotalCost = BigDecimal.ZERO; |
| | | BigDecimal totalEquipmentDepreciation = BigDecimal.ZERO; |
| | | int totalProductionQuantity = 0; |
| | | StringBuilder coalBuilder = new StringBuilder("["); // 优化字符串拼接 |
| | | StringBuilder coalBuilder = new StringBuilder(); |
| | | |
| | | for (Production production : productionMasterDto.getProductionList()) { |
| | | totalPurchasePrice = totalPurchasePrice.add(production.getPurchasePrice()); |
| | |
| | | totalTotalCost = totalTotalCost.add(production.getTotalCost()); |
| | | totalEquipmentDepreciation = totalEquipmentDepreciation.add(production.getEquipmentDepreciation()); |
| | | totalProductionQuantity += production.getProductionQuantity(); |
| | | coalBuilder.append(production.getCoal()).append(","); |
| | | if (coalBuilder.length() > 0) { |
| | | coalBuilder.append(","); // 在元素之间添加逗号 |
| | | } |
| | | coalBuilder.append(production.getCoal()); |
| | | } |
| | | |
| | | // 处理coal字符串拼接 |
| | | String coalStr = coalBuilder.length() > 1 ? |
| | | coalBuilder.deleteCharAt(coalBuilder.length()-1).append("]").toString() : "[]"; |
| | | String coalStr = coalBuilder.toString(); // 直接获取拼接结果 |
| | | |
| | | // 2. 创建主表对象 |
| | | ProductionMaster productionMaster = new ProductionMaster(); |
| | |
| | | productionMaster.setId(masterId); |
| | | |
| | | // 3. 统一子表处理逻辑 |
| | | Long producerId = productionMasterDto.getProducerId(); |
| | | if (producerId == null) { |
| | | throw new BaseException("请选择生产者"); |
| | | } |
| | | SysUser sysUser = sysUserMapper.selectUserById(producerId); |
| | | productionMaster.setProducer(sysUser.getUserName()); |
| | | if (masterId == null) { |
| | | productionMasterMapper.insert(productionMaster); |
| | | masterId = productionMaster.getId(); // 获取新生成的ID |
| | | } else { |
| | | // 删除关联子表数据(使用更高效的in删除) |
| | | // 删除关联子表数据 |
| | | productionMapper.delete(new LambdaQueryWrapper<Production>() |
| | | .eq(Production::getProductionMasterId, masterId)); |
| | | |
| | |
| | | |
| | | productionMasterMapper.updateById(productionMaster); |
| | | } |
| | | |
| | | //库存更新 |
| | | for (ProductionInventory productionInventory : productionMasterDto.getProductionInventoryList()) { |
| | | OfficialInventory officialInventory = officialInventoryMapper.selectById(productionInventory.getOfficialId()); |
| | | BigDecimal subtract = officialInventory.getInventoryQuantity().subtract(new BigDecimal(productionInventory.getUsedQuantity())); |
| | | if (subtract.compareTo(BigDecimal.ZERO) < 0) { |
| | | throw new BaseException("库存不足"); |
| | | } |
| | | officialInventory.setInventoryQuantity(subtract); |
| | | officialInventoryMapper.updateById(officialInventory); |
| | | } |
| | | |
| | | // 4. 批量插入子表数据 |
| | | batchInsertProductions(masterId, productionMasterDto.getProductionList()); |
| | | batchInsertInventories(masterId, productionMasterDto.getProductionInventoryList()); |
| | |
| | | } |
| | | |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public int delByIds(Long[] ids) { |
| | | return 0; |
| | | if (ids == null || ids.length == 0) { |
| | | return 0; |
| | | } |
| | | |
| | | List<Long> idList = Arrays.asList(ids); |
| | | |
| | | // 1. 预加载所有关联数据 |
| | | List<ProductionInventory> allInventoryList = productionInventoryMapper.selectList( |
| | | new LambdaQueryWrapper<ProductionInventory>() |
| | | .in(ProductionInventory::getProductionMasterId, idList) |
| | | ); |
| | | |
| | | // 2. 按官方库存ID分组并计算库存调整量 |
| | | Map<Long, BigDecimal> inventoryAdjustMap = allInventoryList.stream() |
| | | .collect(Collectors.groupingBy( |
| | | ProductionInventory::getOfficialId, |
| | | Collectors.reducing( |
| | | BigDecimal.ZERO, |
| | | inv -> new BigDecimal(inv.getUsedQuantity()), |
| | | BigDecimal::add |
| | | ) |
| | | )); |
| | | |
| | | // 3. 批量更新官方库存 (使用SQL直接更新) |
| | | if (!inventoryAdjustMap.isEmpty()) { |
| | | inventoryAdjustMap.forEach((officialId, adjustAmount) -> |
| | | officialInventoryMapper.addInventoryQuantity(officialId, adjustAmount) |
| | | ); |
| | | } |
| | | |
| | | // 4. 批量删除关联数据 |
| | | if (!allInventoryList.isEmpty()) { |
| | | List<Long> inventoryIds = allInventoryList.stream() |
| | | .map(ProductionInventory::getId) |
| | | .collect(Collectors.toList()); |
| | | productionInventoryMapper.deleteBatchIds(inventoryIds); |
| | | } |
| | | |
| | | // 删除生产明细 |
| | | productionMapper.delete( |
| | | new LambdaQueryWrapper<Production>() |
| | | .in(Production::getProductionMasterId, idList) |
| | | ); |
| | | |
| | | // 5. 删除主记录 |
| | | return productionMasterMapper.deleteBatchIds(idList); |
| | | } |
| | | |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public int deleteProductionInventory(ProductionMasterDto productionMasterDto) { |
| | | List<ProductionInventory> inventories = productionMasterDto.getProductionInventoryList(); |
| | | if (CollectionUtils.isEmpty(inventories)) { |
| | | return 0; |
| | | } |
| | | |
| | | // 预收集数据用于批量操作 |
| | | Map<Long, BigDecimal> inventoryAdjustMap = new HashMap<>(); |
| | | List<Long> productionIdsToDelete = new ArrayList<>(inventories.size()); |
| | | |
| | | for (ProductionInventory inventory : inventories) { |
| | | // 收集需要删除的生产库存ID |
| | | productionIdsToDelete.add(inventory.getId()); |
| | | |
| | | // 累计库存调整量(相同officialId的用量累加) |
| | | BigDecimal adjustment = new BigDecimal(inventory.getUsedQuantity()); |
| | | inventoryAdjustMap.merge( |
| | | inventory.getOfficialId(), |
| | | adjustment, |
| | | BigDecimal::add |
| | | ); |
| | | } |
| | | |
| | | // 批量更新官方库存 |
| | | for (Map.Entry<Long, BigDecimal> entry : inventoryAdjustMap.entrySet()) { |
| | | OfficialInventory official = officialInventoryMapper.selectById(entry.getKey()); |
| | | if (official == null) { |
| | | throw new BaseException("官方库存不存在,ID: " + entry.getKey()); |
| | | } |
| | | |
| | | // 使用线程安全的BigDecimal操作 |
| | | official.setInventoryQuantity( |
| | | Optional.ofNullable(official.getInventoryQuantity()) |
| | | .orElse(BigDecimal.ZERO) |
| | | .add(entry.getValue()) |
| | | ); |
| | | officialInventoryMapper.updateById(official); |
| | | } |
| | | |
| | | // 批量删除生产库存 |
| | | if (!productionIdsToDelete.isEmpty()) { |
| | | productionInventoryMapper.deleteBatchIds(productionIdsToDelete); |
| | | } |
| | | |
| | | return productionIdsToDelete.size(); |
| | | } |
| | | } |