| | |
| | | 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.basic.entity.CoalInfo; |
| | | import com.ruoyi.basic.mapper.CoalInfoMapper; |
| | | 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.OfficialInventoryMapper; |
| | | import com.ruoyi.business.mapper.ProductionInventoryMapper; |
| | | import com.ruoyi.business.mapper.ProductionMapper; |
| | | import com.ruoyi.business.mapper.ProductionMasterMapper; |
| | | import com.ruoyi.business.entity.*; |
| | | import com.ruoyi.business.mapper.*; |
| | | 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.*; |
| | | import java.util.function.Function; |
| | | import java.util.stream.Collectors; |
| | | |
| | | /** |
| | |
| | | |
| | | private final OfficialInventoryMapper officialInventoryMapper; |
| | | |
| | | private final SysUserMapper sysUserMapper; |
| | | private final CoalInfoMapper coalInfoMapper; |
| | | |
| | | private final PendingInventoryMapper pendingInventoryMapper; |
| | | |
| | | @Override |
| | | public IPage<ProductionMasterDto> selectPMList(Page page, ProductionMasterDto productionMasterDto) { |
| | |
| | | BigDecimal totalEnergyConsumptionCost = BigDecimal.ZERO; |
| | | BigDecimal totalTotalCost = BigDecimal.ZERO; |
| | | BigDecimal totalEquipmentDepreciation = BigDecimal.ZERO; |
| | | int totalProductionQuantity = 0; |
| | | StringBuilder coalBuilder = new StringBuilder(); |
| | | BigDecimal totalProductionQuantity = BigDecimal.ZERO; |
| | | |
| | | for (Production production : productionMasterDto.getProductionList()) { |
| | | totalPurchasePrice = totalPurchasePrice.add(production.getPurchasePrice()); |
| | |
| | | totalEnergyConsumptionCost = totalEnergyConsumptionCost.add(production.getEnergyConsumptionCost()); |
| | | totalTotalCost = totalTotalCost.add(production.getTotalCost()); |
| | | totalEquipmentDepreciation = totalEquipmentDepreciation.add(production.getEquipmentDepreciation()); |
| | | totalProductionQuantity += production.getProductionQuantity(); |
| | | if (coalBuilder.length() > 0) { |
| | | coalBuilder.append(","); // 在元素之间添加逗号 |
| | | } |
| | | coalBuilder.append(production.getCoal()); |
| | | totalProductionQuantity = production.getProductionQuantity().add(totalProductionQuantity); |
| | | } |
| | | String coalStr = coalBuilder.toString(); // 直接获取拼接结果 |
| | | //煤种字段 |
| | | List<Long> coalIds = productionMasterDto.getProductionList().stream() |
| | | .map(Production::getCoalId) |
| | | .collect(Collectors.toList()); |
| | | |
| | | List<CoalInfo> coalInfos = coalInfoMapper.selectList(new LambdaQueryWrapper<CoalInfo>().in(CoalInfo::getId, coalIds)); |
| | | |
| | | // 2. 创建主表对象 |
| | | ProductionMaster productionMaster = new ProductionMaster(); |
| | |
| | | productionMaster.setEquipmentDepreciation(totalEquipmentDepreciation); |
| | | productionMaster.setEnergyConsumptionCost(totalEnergyConsumptionCost); |
| | | productionMaster.setLaborCost(totalLaborCost); |
| | | productionMaster.setCoal(coalStr); |
| | | productionMaster.setCoal(coalInfos.stream().map(CoalInfo::getCoal).collect(Collectors.joining(","))); |
| | | productionMaster.setCoalId(coalIds.stream().map(String::valueOf).collect(Collectors.joining(","))); |
| | | |
| | | Long masterId = productionMasterDto.getId(); |
| | | 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 |
| | |
| | | batchInsertProductions(masterId, productionMasterDto.getProductionList()); |
| | | batchInsertInventories(masterId, productionMasterDto.getProductionInventoryList()); |
| | | |
| | | //5. 插入到待入库 |
| | | for (Production production : productionMasterDto.getProductionList()) { |
| | | PendingInventory pendingInventory = new PendingInventory(); |
| | | pendingInventory.setCoalId(production.getCoalId()); |
| | | pendingInventory.setInventoryQuantity(production.getProductionQuantity()); |
| | | pendingInventory.setSupplierName("生产加工入库"); |
| | | pendingInventory.setTotalPriceIncludingTax(production.getTotalCost()); |
| | | pendingInventory.setPriceIncludingTax(production.getPurchasePrice()); |
| | | } |
| | | return 1; |
| | | } |
| | | |
| | | // 批量插入生产数据 |
| | | private void batchInsertProductions(Long masterId, List<Production> productions) { |
| | | List<Production> insertList = productions.stream() |
| | | .peek(p -> { |
| | | p.setId(null); |
| | | p.setProductionMasterId(masterId); |
| | | }) |
| | | if (productions.isEmpty()) { |
| | | return; |
| | | } |
| | | // 1. 收集所有需要查询的coalId |
| | | List<Long> coalIds = productions.stream() |
| | | .map(Production::getCoalId) |
| | | .filter(Objects::nonNull) |
| | | .distinct() |
| | | .collect(Collectors.toList()); |
| | | |
| | | if (!insertList.isEmpty()) { |
| | | for (Production production : productions) { |
| | | // 2. 批量查询coalInfo数据 |
| | | Map<Long, CoalInfo> coalInfoMap = coalIds.isEmpty() ? |
| | | Collections.emptyMap() : |
| | | coalInfoMapper.selectList(new LambdaQueryWrapper<CoalInfo>().in(CoalInfo::getId, coalIds)) |
| | | .stream() |
| | | .collect(Collectors.toMap(CoalInfo::getId, Function.identity())); |
| | | if (coalInfoMap.isEmpty()){ |
| | | throw new BaseException("煤种信息不存在"); |
| | | } |
| | | |
| | | // 3. 准备批量插入数据 |
| | | List<Production> batchInsertList = productions.stream() |
| | | .map(production -> { |
| | | Production p = new Production(); // 创建新对象避免副作用 |
| | | BeanUtils.copyProperties(production, p); |
| | | // 复制必要字段 |
| | | p.setProductionMasterId(masterId); |
| | | p.setCoalId(production.getCoalId()); |
| | | return p; |
| | | }) |
| | | .collect(Collectors.toList()); |
| | | if (!batchInsertList.isEmpty()) { |
| | | for (Production production : batchInsertList) { |
| | | production.setId(null); |
| | | production.setProductionMasterId(masterId); |
| | | productionMapper.insert(production); |
| | | } |
| | | } |