package com.aps.core.service.mainPlan.impl; import com.aps.common.core.utils.DateUtils; import com.aps.common.core.utils.uuid.IdUtils; import com.aps.common.core.web.page.TableDataInfo; import com.aps.common.security.utils.SecurityUtils; import com.aps.core.controller.basicData.ApsGasPipelineCapacityPlanController; import com.aps.core.domain.ApsGasPipelineCapacityPlan; import com.aps.core.domain.mainPlan.ApsWeldSeamStatisticsV2; import com.aps.core.mapper.mainPlan.ApsWeldSeamStatisticsV2Mapper; import com.aps.core.service.IApsGasPipelineCapacityPlanService; import com.aps.core.service.mainPlan.IApsWeldSeamStatisticsV2Service; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.math.BigDecimal; import java.util.Date; import java.util.List; /** * 焊缝统计表V2Service业务层处理 * * @date 2023-08-01 */ @Service public class ApsWeldSeamStatisticsV2ServiceImpl implements IApsWeldSeamStatisticsV2Service { @Autowired private ApsWeldSeamStatisticsV2Mapper apsWeldSeamStatisticsV2Mapper; @Autowired private ApsGasPipelineCapacityPlanController apsGasPipelineCapacityPlanController; /** * 查询焊缝统计表V2列表 * * @param apsWeldSeamStatisticsV2 焊缝统计表V2 * @return 焊缝统计表V2 */ @Override public List selectApsWeldSeamStatisticsV2List(ApsWeldSeamStatisticsV2 apsWeldSeamStatisticsV2) { return apsWeldSeamStatisticsV2Mapper.selectApsWeldSeamStatisticsV2List(apsWeldSeamStatisticsV2); } /** * 修改焊缝统计表V2 * * @param apsWeldSeamStatisticsV2 焊缝统计表V2 * @return 更新后的记录 */ @Override @Transactional(rollbackFor = Exception.class) public ApsWeldSeamStatisticsV2 updateApsWeldSeamStatisticsV2(ApsWeldSeamStatisticsV2 apsWeldSeamStatisticsV2) { // 设置更新时间 apsWeldSeamStatisticsV2.setUpdateTime(DateUtils.getNowDate()); apsWeldSeamStatisticsV2.setUpdateBy(SecurityUtils.getUsername()); // 1. 从数据库获取原始记录,以保留其他字段不变 ApsWeldSeamStatisticsV2 originalData = apsWeldSeamStatisticsV2Mapper.selectApsWeldSeamStatisticsV2ById(apsWeldSeamStatisticsV2.getId()); if (originalData == null) { throw new RuntimeException("记录不存在,ID: " + apsWeldSeamStatisticsV2.getId()); } // 2. 只更新reserveEmergencyOrderOutput和days两个字段 originalData.setReserveEmergencyOrderOutput(apsWeldSeamStatisticsV2.getReserveEmergencyOrderOutput()); originalData.setDays(apsWeldSeamStatisticsV2.getDays()); originalData.setUpdateTime(apsWeldSeamStatisticsV2.getUpdateTime()); originalData.setUpdateBy(apsWeldSeamStatisticsV2.getUpdateBy()); // 3. 确保所有用于计算的BigDecimal字段不为null java.math.BigDecimal pipingOrderReq = (originalData.getPipingOrderRequirement() != null) ? originalData.getPipingOrderRequirement() : java.math.BigDecimal.ZERO; java.math.BigDecimal pipingPredictionReq = (originalData.getPipingPredictionRequirement() != null) ? originalData.getPipingPredictionRequirement() : java.math.BigDecimal.ZERO; java.math.BigDecimal gasOrderReq = (originalData.getGasOrderRequirement() != null) ? originalData.getGasOrderRequirement() : java.math.BigDecimal.ZERO; java.math.BigDecimal gasPredictionReq = (originalData.getGasPredictionRequirement() != null) ? originalData.getGasPredictionRequirement() : java.math.BigDecimal.ZERO; java.math.BigDecimal reserveEmergencyOutput = (originalData.getReserveEmergencyOrderOutput() != null) ? originalData.getReserveEmergencyOrderOutput() : java.math.BigDecimal.ZERO; // 4. 属性1:重新计算total(合计) java.math.BigDecimal total = pipingOrderReq .add(pipingPredictionReq) .add(gasOrderReq) .add(gasPredictionReq) .add(reserveEmergencyOutput); originalData.setTotal(total); // 5. 如果days不为空且大于0,重新计算requirementDayWeldSeam和isSatisfy if(originalData.getDays() != null && originalData.getDays().doubleValue() > 0) { // 属性2:计算需求日焊缝 = 合计/天数,四舍五入 double result = total.doubleValue() / originalData.getDays().doubleValue(); java.math.BigDecimal requirementDayWeldSeam = new java.math.BigDecimal(result).setScale(0, java.math.RoundingMode.HALF_UP); originalData.setRequirementDayWeldSeam(requirementDayWeldSeam); // 属性3:判断是否满足 if(originalData.getProductionDayWeldSeam() != null) { if(originalData.getProductionDayWeldSeam().compareTo(requirementDayWeldSeam) >= 0) { originalData.setIsSatisfy("1"); // 满足 } else { originalData.setIsSatisfy("0"); // 不满足 } } else { originalData.setIsSatisfy("0"); // 默认不满足 } } else { // 如果天数为空或为0,设置为不满足 originalData.setIsSatisfy("0"); } // 6. 更新数据库 apsWeldSeamStatisticsV2Mapper.updateApsWeldSeamStatisticsV2(originalData); // 7. 返回更新后的完整记录 return originalData; } /** * 刷新焊缝统计表数据 * * @param username 操作用户 * @return 受影响的记录数 */ @Override @Transactional(rollbackFor = Exception.class) public int refreshWeldSeamStatistics(String username) { // 1. 清空统计表 apsWeldSeamStatisticsV2Mapper.truncateTable(); // 2. 获取最新的统计数据 List statisticsList = apsWeldSeamStatisticsV2Mapper.queryWeldSeamStatistics(); // 3. 设置创建信息和ID,并获取生产日焊缝数据 Date now = new Date(); for (ApsWeldSeamStatisticsV2 statistics : statisticsList) { // 使用UUID作为ID statistics.setId(IdUtils.fastUUID()); statistics.setCreateBy(username); statistics.setCreateTime(now); // 先计算需求日焊缝(requirementDayWeldSeam) if(statistics.getDays() != null && statistics.getDays().doubleValue() > 0 && statistics.getTotal() != null) { // 计算需求日焊缝 = 合计/天数,四舍五入 double result = statistics.getTotal().doubleValue() / statistics.getDays().doubleValue(); BigDecimal requirementDayWeldSeam = new BigDecimal(result).setScale(0, java.math.RoundingMode.HALF_UP); statistics.setRequirementDayWeldSeam(requirementDayWeldSeam); } else if (statistics.getRequirementDayWeldSeam() == null) { // 如果无法计算且之前没有值,设置默认值 statistics.setRequirementDayWeldSeam(BigDecimal.ZERO); } // 设置生产日焊缝(productionDayWeldSeam) // 根据year、month、productionBase查询对应的生产日焊缝数据 if (statistics.getYear() != null && statistics.getMonth() != null && statistics.getProductionBase() != null) { // 创建查询条件 ApsGasPipelineCapacityPlan queryParam = new ApsGasPipelineCapacityPlan(); queryParam.setYear(statistics.getYear().toString()); queryParam.setMonth(statistics.getMonth().toString()); queryParam.setOrgCode(statistics.getProductionBase()); // 直接调用Controller的list方法获取数据 TableDataInfo tableDataInfo = apsGasPipelineCapacityPlanController.list(queryParam); List capacityPlans = (List) tableDataInfo.getRows(); // 遍历找到processName为"气体管路轨道焊接组"的记录 for (ApsGasPipelineCapacityPlan plan : capacityPlans) { if ("气体管路轨道焊接组".equals(plan.getProcessName()) && plan.getDayProduceAllNum() != null) { // 设置生产日焊缝值 statistics.setProductionDayWeldSeam(plan.getDayProduceAllNum()); break; // 找到匹配记录后退出循环 } } } // 如果没有找到匹配的产能规划数据,设置默认状态 if (statistics.getProductionDayWeldSeam() == null) { statistics.setProductionDayWeldSeam(BigDecimal.ZERO); } // 最后统一计算isSatisfy(是否满足) // 当生产日焊缝 >= 需求日焊缝时为满足,否则为不满足 if (statistics.getRequirementDayWeldSeam() != null && statistics.getProductionDayWeldSeam() != null && statistics.getProductionDayWeldSeam().compareTo(statistics.getRequirementDayWeldSeam()) >= 0) { statistics.setIsSatisfy("1"); // 满足 } else { statistics.setIsSatisfy("0"); // 不满足 } } // 4. 批量插入数据 int count = 0; if (!statisticsList.isEmpty()) { count = apsWeldSeamStatisticsV2Mapper.batchInsert(statisticsList); } return count; } }