Browse Source

整炉补录逻辑优化

qiangxuan 2 months ago
parent
commit
40ad073fe8

+ 9 - 385
zgztBus/jeecg-module-sbm/src/main/java/org/jeecg/modules/actualControl/billetActual/billetActual/service/impl/BilletBasicInfoServiceImpl.java

@@ -9,6 +9,7 @@ import com.baomidou.mybatisplus.core.toolkit.IdWorker;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import lombok.extern.slf4j.Slf4j;
 import org.jeecg.common.api.vo.Result;
+import org.jeecg.common.util.DateUtils;
 import org.jeecg.common.util.oConvertUtils;
 import org.jeecg.modules.actualControl.billetActual.billetActual.entity.BilletBasicInfo;
 import org.jeecg.modules.actualControl.billetActual.billetActual.entity.BilletBasicInfoAdd;
@@ -24,6 +25,7 @@ import org.jeecg.modules.actualControl.heatsActuals.entity.HeatsActuals;
 import org.jeecg.modules.actualControl.heatsActuals.mapper.HeatsActualsMapper;
 import org.jeecg.modules.actualControl.heatsActuals.service.IHeatsActualsService;
 import org.jeecg.modules.billet.billetHotsend.entity.BilletHotsend;
+import org.jeecg.modules.billet.billetHotsend.entity.RollClubCommon;
 import org.jeecg.modules.billet.billetHotsend.entity.RulerDefaultConfig;
 import org.jeecg.modules.billet.billetHotsend.mapper.BilletHotsendBaseMapper;
 import org.jeecg.modules.billet.billetHotsend.service.IBilletHotsendBaseService;
@@ -31,7 +33,12 @@ import org.jeecg.modules.billet.billetHotsendChangeShift.entity.BilletHotsendCha
 import org.jeecg.modules.billet.billetHotsendChangeShift.mapper.BilletHotsendChangeShiftMapper;
 import org.jeecg.modules.billet.billetHotsendConfig.entity.BilletHotsendTypeConfig;
 import org.jeecg.modules.billet.billetHotsendConfig.service.IBilletHotsendTypeConfigService;
+import org.jeecg.modules.billet.rollClubOne.entity.RollClubOne;
+import org.jeecg.modules.billet.rollClubOne.entity.RollClubOneDetails;
+import org.jeecg.modules.billet.rollClubOne.mapper.RollClubOneDetailsMapper;
+import org.jeecg.modules.billet.rollClubOne.mapper.RollClubOneMapper;
 import org.jeecg.modules.billet.rollClubOne.service.IRollClubOneDetailsService;
+import org.jeecg.modules.billet.rollClubOne.service.IRollClubOneService;
 import org.jeecg.modules.connConfig.mapper.ConfigMqttMapper;
 import org.simpleframework.xml.core.Complete;
 import org.springframework.beans.BeanUtils;
@@ -39,6 +46,7 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.data.redis.core.RedisTemplate;
 import org.springframework.stereotype.Service;
 
+import javax.annotation.Resource;
 import java.math.BigDecimal;
 import java.util.*;
 import java.util.stream.Collectors;
@@ -235,11 +243,7 @@ public class BilletBasicInfoServiceImpl extends ServiceImpl<BilletBasicInfoMappe
                 .eq(BilletHotsend::getShiftGroup, billetBasicInfoAdd.getShiftGroup())
                 .orderByDesc(BilletHotsend::getCreateTime).last("limit 1");
         BilletHotsend billetHotsend = billetHotsendBaseMapper.selectOne(queryWrapper);
-        if (billetHotsend == null && billetBasicInfoAdd.getAddType() == 1){
-            // 处理整炉补录钢坯逻辑
-            completeHeatsHandle(billetBasicInfoAdd, brandNumStr);
-            return "整炉补录成功!";
-        }else if(billetHotsend == null && billetBasicInfoAdd.getAddType() == 2){
+        if (billetHotsend == null && billetBasicInfoAdd.getAddType() == 2){
             return "炉次传递单为空,补录失败!";
         }
 
@@ -443,386 +447,6 @@ public class BilletBasicInfoServiceImpl extends ServiceImpl<BilletBasicInfoMappe
         return "补录成功!";
     }
 
-    /**
-     * 整炉添加逻辑处理
-     * @param billetBasicInfoAdd
-     */
-    private String completeHeatsHandle(BilletBasicInfoAdd billetBasicInfoAdd, String brandNumStr) {
-
-        LambdaQueryWrapper<HeatsActuals> queryWrapper1 = new LambdaQueryWrapper<HeatsActuals>()
-                .eq(HeatsActuals::getHeatsCode, billetBasicInfoAdd.getHeatNo())
-                .orderByDesc(HeatsActuals::getCreateTime).last("limit 1");
-        HeatsActuals actualsCheck = heatsActualsMapper.selectOne(queryWrapper1);
-        if (actualsCheck != null){
-            return "炉号重复,补录失败!";
-        }
-
-        // 查询基础信息
-        LambdaQueryWrapper<HeatsActuals> queryWrapper = new LambdaQueryWrapper<HeatsActuals>()
-                .eq(HeatsActuals::getCasterCode, billetBasicInfoAdd.getCcmNo())
-                .orderByDesc(HeatsActuals::getCreateTime).last("limit 1");
-        HeatsActuals actuals = heatsActualsMapper.selectOne(queryWrapper);
-
-        HeatsActuals heatsActuals = new HeatsActuals();
-        BeanUtils.copyProperties(actuals, heatsActuals);
-
-        try {
-            heatsActuals.setId(String.valueOf(IdWorker.getId()));
-            heatsActuals.setHeatsCode(billetBasicInfoAdd.getHeatNo());
-            heatsActuals.setShift(billetBasicInfoAdd.getShift());
-            heatsActuals.setShiftGroup(billetBasicInfoAdd.getShiftGroup());
-            //根据最新一炉的炉次信息计算 空包重量核算
-            if(heatsActuals.getMoltenSteelWeight() > 0 && heatsActuals.getFullLadleWeight() > 0){ // 如果钢水重量存在核算
-                heatsActuals.setEmptyLadleWeight(heatsActuals.getFullLadleWeight() - heatsActuals.getMoltenSteelWeight());
-            }
-            // 整理添加总支数
-            heatsActuals.setBilletSum(0);
-            heatsActuals.setBlankOutput(0.0d);
-            heatsActuals.setCreateTime(new Date());
-            heatsActuals.setUpdateTime(new Date());
-            heatsActualsMapper.insert(heatsActuals);
-        } catch (Exception e) {
-            log.error("整炉补坯保存炉次实绩数据出现异常", e);
-            throw new RuntimeException("整炉补坯保存炉次实绩数据出现失败!", e);
-        }
-
-        //新增炉次传递单
-        BilletHotsend billetHotsend = new BilletHotsend();
-        billetHotsend.setId(String.valueOf(IdWorker.getId()));
-        billetHotsend.setCcmNo(billetBasicInfoAdd.getCcmNo()); // 铸机号
-        billetHotsend.setHeatNo(billetBasicInfoAdd.getHeatNo()); // 炉号
-        billetHotsend.setShiftGroup(billetBasicInfoAdd.getShiftGroup()); // 班组
-        billetHotsend.setShift(billetBasicInfoAdd.getShift()); // 班别
-        billetHotsend.setSteel(heatsActuals.getGrade()); // 钢种
-        billetHotsend.setSpec(heatsActuals.getSpec()); // 规格
-
-        billetHotsend.setBrandNum(brandNumStr);
-        billetHotsend.setAmountTotal(heatsActuals.getBilletSum()); // 支数
-        billetHotsend.setBlankOutput(0.0d); // 出批量
-        billetHotsend.setDecideWeight(0.0d); // 定重
-        billetHotsend.setWasteBlankOutput(0.0);
-        billetHotsend.setCreateTime(new Date());
-        billetHotsend.setUpdateTime(new Date());
-        billetHotsendBaseMapper.insert(billetHotsend);
-
-        LambdaQueryWrapper<BilletBasicInfo> queryWrapperB = new LambdaQueryWrapper<BilletBasicInfo>()
-                .eq(BilletBasicInfo::getCcmNo, billetBasicInfoAdd.getCcmNo())
-                .orderByDesc(BilletBasicInfo::getCreateTime).last("limit 1");
-        BilletBasicInfo billetInfo = baseMapper.selectOne(queryWrapperB);
-
-        BilletBasicInfo billetBasicInfo = new BilletBasicInfo();
-        BeanUtils.copyProperties(billetInfo, billetBasicInfo);
-        // 去棒一数据补录
-        if (oConvertUtils.listIsEmpty(billetBasicInfoAdd.getRollClubOneList())){
-            // 整炉全部去组批
-            // 1流补录钢坯
-            if (oConvertUtils.isNotEmpty(billetBasicInfoAdd.getOneStrandNo()) && billetBasicInfoAdd.getOneStrandNoSum() > 0){
-                int addSum = billetBasicInfoAdd.getOneStrandNoSum();
-                int strandNo = billetBasicInfoAdd.getOneStrandNo();
-                int length = billetBasicInfoAdd.getOneLength();
-                saveBilletBasicInfoList(billetBasicInfo, billetBasicInfoAdd, addSum, strandNo, length);
-            }
-            // 2流补录钢坯
-            if (oConvertUtils.isNotEmpty(billetBasicInfoAdd.getTwoStrandNo()) && billetBasicInfoAdd.getTwoStrandNoSum() > 0){
-                int addSum = billetBasicInfoAdd.getTwoStrandNoSum();
-                int strandNo = billetBasicInfoAdd.getTwoStrandNo();
-                int length = billetBasicInfoAdd.getTwoLength();
-                saveBilletBasicInfoList(billetBasicInfo, billetBasicInfoAdd, addSum, strandNo, length);
-            }
-            // 3流补录钢坯
-            if (oConvertUtils.isNotEmpty(billetBasicInfoAdd.getThreeStrandNo()) && billetBasicInfoAdd.getThreeStrandNoSum() > 0){
-                int addSum = billetBasicInfoAdd.getOneStrandNoSum();
-                int strandNo = billetBasicInfoAdd.getOneStrandNo();
-                int length = billetBasicInfoAdd.getOneLength();
-                saveBilletBasicInfoList(billetBasicInfo, billetBasicInfoAdd, addSum, strandNo, length);
-            }
-
-            // 4流补录钢坯
-            if (oConvertUtils.isNotEmpty(billetBasicInfoAdd.getFourStrandNo()) && billetBasicInfoAdd.getFourStrandNoSum() > 0){
-                int addSum = billetBasicInfoAdd.getFourStrandNoSum();
-                int strandNo = billetBasicInfoAdd.getFourStrandNo();
-                int length = billetBasicInfoAdd.getFourLength();
-                saveBilletBasicInfoList(billetBasicInfo, billetBasicInfoAdd, addSum, strandNo, length);
-            }
-
-            // 5流补录钢坯
-            if (oConvertUtils.isNotEmpty(billetBasicInfoAdd.getFiveStrandNo()) && billetBasicInfoAdd.getFiveStrandNoSum() > 0){
-                int addSum = billetBasicInfoAdd.getFiveStrandNoSum();
-                int strandNo = billetBasicInfoAdd.getFiveStrandNo();
-                int length = billetBasicInfoAdd.getFiveLength();
-                saveBilletBasicInfoList(billetBasicInfo, billetBasicInfoAdd, addSum, strandNo, length);
-            }
-
-            // 6流补录钢坯
-            if (oConvertUtils.isNotEmpty(billetBasicInfoAdd.getSixStrandNo()) && billetBasicInfoAdd.getSixStrandNoSum() > 0){
-                int addSum = billetBasicInfoAdd.getSixStrandNoSum();
-                int strandNo = billetBasicInfoAdd.getSixStrandNo();
-                int length = billetBasicInfoAdd.getSixLength();
-                saveBilletBasicInfoList(billetBasicInfo, billetBasicInfoAdd, addSum, strandNo, length);
-            }
-
-            // 7流补录钢坯
-            if (oConvertUtils.isNotEmpty(billetBasicInfoAdd.getSevenStrandNo()) && billetBasicInfoAdd.getSevenStrandNoSum() > 0){
-                int addSum = billetBasicInfoAdd.getSevenStrandNoSum();
-                int strandNo = billetBasicInfoAdd.getSevenStrandNo();
-                int length = billetBasicInfoAdd.getSevenLength();
-                saveBilletBasicInfoList(billetBasicInfo, billetBasicInfoAdd, addSum, strandNo, length);
-            }
-
-            // 8流补录钢坯
-            if (oConvertUtils.isNotEmpty(billetBasicInfoAdd.getEightStrandNo()) && billetBasicInfoAdd.getEightStrandNoSum() > 0){
-                int addSum = billetBasicInfoAdd.getEightStrandNoSum();
-                int strandNo = billetBasicInfoAdd.getEightStrandNo();
-                int length = billetBasicInfoAdd.getEightLength();
-                saveBilletBasicInfoList(billetBasicInfo, billetBasicInfoAdd, addSum, strandNo, length);
-            }
-            // 查询整个炉钢坯基础信息
-            List<BilletBasicInfo> resultList = baseMapper.selectList(new LambdaQueryWrapper<BilletBasicInfo>()
-                    .eq(BilletBasicInfo::getCcmNo, billetBasicInfoAdd.getCcmNo())
-                    .eq(BilletBasicInfo::getHeatNo, billetBasicInfoAdd.getHeatNo())
-                    .eq(BilletBasicInfo::getShift, billetBasicInfoAdd.getShift())
-                    .eq(BilletBasicInfo::getShiftGroup, billetBasicInfoAdd.getShiftGroup()));
-            if (oConvertUtils.listIsNotEmpty(resultList)){
-                // 处理流内顺序号、和炉内顺序号
-                updateBilletBasicInfoAndSave(resultList);
-            }
-            if (oConvertUtils.listIsNotEmpty(resultList) && resultList.size() >= 4) {
-                int size = resultList.size();
-                int maxProcessed = (size / 4) * 4; // 计算可处理的最大4的倍数
-                for (int i = 0; i < maxProcessed; i += 4) {
-                    int start = i;
-                    int end = Math.min(i + 4, maxProcessed);
-                    //组批成功的,对钢坯实绩进行组批号更新
-                    updateBilletBasicInfoAsendAssemblyHandle(resultList.subList(start, end), billetBasicInfoAdd);
-                }
-            }
-
-            // 更新炉次传递单中的总数和坯重
-            double totalBilletWeight = resultList.stream()
-                    .mapToDouble(BilletBasicInfo::getBilletWeight)
-                    .sum();
-            billetHotsend.setAmountTotal(resultList.size());
-            billetHotsend.setBlankOutput(totalBilletWeight);
-            billetHotsendBaseMapper.updateById(billetHotsend);
-
-            // 更新炉次实绩中的总数和坯重
-            heatsActuals.setBlankOutput(totalBilletWeight);
-            heatsActuals.setBilletSum(resultList.size());
-            heatsActualsMapper.updateById(heatsActuals);
-        }else {
-            int oneStrandRemainSum = 0;
-            int twoStrandRemainSum = 0;
-            int threeStrandRemainSum = 0;
-            int fourStrandRemainSum = 0;
-            int fiveStrandRemainSum = 0;
-            int sixStrandRemainSum = 0;
-
-            // 有去组批的,有去棒一的(混合情况) 1、先处理去棒一的数据 2、在减掉棒一的数量,剩余的进行组批
-            List<BilletBasicInfo> resultList = new ArrayList<>();
-            // 添加棒一明细
-            List<RollClubOneInfo> rollClubOneList = billetBasicInfoAdd.getRollClubOneList();
-            // 遍历 RollClubOneInfo 列表
-            for (RollClubOneInfo item : rollClubOneList) {
-                Integer strandNo = item.getStrandNo();
-                Integer length = item.getLength();
-                Integer addSum = item.getAddSum();
-                if (strandNo == 1){
-                    oneStrandRemainSum = billetBasicInfoAdd.getOneStrandNoSum() - addSum;
-                }else if (strandNo == 2){
-                    twoStrandRemainSum = billetBasicInfoAdd.getTwoStrandNoSum() - addSum;
-                }else if (strandNo == 3){
-                    threeStrandRemainSum = billetBasicInfoAdd.getThreeStrandNoSum() - addSum;
-                }else if (strandNo == 4){
-                    fourStrandRemainSum = billetBasicInfoAdd.getFourStrandNoSum() - addSum;
-                }else if (strandNo == 5){
-                    fiveStrandRemainSum = billetBasicInfoAdd.getFiveStrandNoSum() - addSum;
-                }else if (strandNo == 6){
-                    sixStrandRemainSum = billetBasicInfoAdd.getSixStrandNoSum() - addSum;
-                }
-                // 根据 addSum 生成对应数量的 BilletBasicInfo 对象
-                for (int i = 0; i < addSum; i++) {
-                    BilletBasicInfo billet = new BilletBasicInfo();
-                    BeanUtils.copyProperties(billetBasicInfo, billet);
-                    billet.setStrandNo(strandNo);
-                    billet.setLength(length);
-                    // 设置其他必要属性
-                    billet.setId(String.valueOf(IdWorker.getId()));
-                    billet.setHeatNo(billetBasicInfoAdd.getHeatNo());
-                    String billetNo = generateUniqueBilletNo(Integer.valueOf(billetBasicInfoAdd.getCcmNo()), billetBasicInfoAdd.getHeatNo());
-                    billet.setBilletNo(billetNo);
-                    billet.setCreateTime(new Date());
-                    billet.setUpdateTime(new Date());
-                    billet.setAssemblyNumber(null);
-                    billet.setBelongTable("roll_club_one");
-                    billet.setBhtcId("1");
-                    // 查询定尺规则
-                    LambdaQueryWrapper<BilletRulerConfig> queryWrapperbilletRulerConfig = new LambdaQueryWrapper<BilletRulerConfig>().eq(BilletRulerConfig::getLength, billetBasicInfo.getLength());
-                    BilletRulerConfig billetRulerConfig = billetRulerConfigMapper.selectOne(queryWrapperbilletRulerConfig);
-                    Double weight = 0.0;
-                    if (oConvertUtils.isEmpty(billetRulerConfig)) {
-                        weight = billetBasicInfo.getWeight();
-                    } else {
-                        weight = billetRulerConfig.getWeight();
-                    }
-                    billet.setWeight(weight);
-                    billet.setBilletWeight(weight);
-                    resultList.add(billet);
-                }
-            }
-            if (oConvertUtils.listIsNotEmpty(resultList)){
-                // 对 resultList 中的元素按 Strandno 分组后重新赋值 StrandnoIndex
-                Map<Integer, List<BilletBasicInfo>> strandNoGroups = resultList.stream()
-                        .collect(Collectors.groupingBy(BilletBasicInfo::getStrandNo));
-
-                // 对每个分组内的元素按顺序赋值 StrandnoIndex
-                strandNoGroups.forEach((strandNo, groupList) -> {
-                    for (int i = 0; i < groupList.size(); i++) {
-                        groupList.get(i).setStrandnoIndex(i + 1); // 每组内从1开始
-                    }
-                });
-
-                // 对 resultList 中的元素按整体顺序赋值 HeatnoIndex(保持原有逻辑)
-                for (int i = 0; i < resultList.size(); i++) {
-                    resultList.get(i).setHeatnoIndex(i + 1); // 整体从1开始
-                }
-
-                log.info("整炉去棒一的钢坯总数:{}", resultList.size());
-                baseMapper.insertBatch(resultList);
-
-                
-
-            }
-
-
-            if (oneStrandRemainSum > 0){
-                saveBilletBasicInfoList(billetBasicInfo, billetBasicInfoAdd, oneStrandRemainSum, 1, billetBasicInfoAdd.getOneLength());
-            }
-            if (twoStrandRemainSum > 0){
-                saveBilletBasicInfoList(billetBasicInfo, billetBasicInfoAdd, twoStrandRemainSum, 2, billetBasicInfoAdd.getTwoLength());
-            }
-            if (threeStrandRemainSum > 0){
-                saveBilletBasicInfoList(billetBasicInfo, billetBasicInfoAdd, threeStrandRemainSum, 3, billetBasicInfoAdd.getThreeLength());
-            }
-            if (fourStrandRemainSum > 0){
-                saveBilletBasicInfoList(billetBasicInfo, billetBasicInfoAdd, fourStrandRemainSum, 4, billetBasicInfoAdd.getFourLength());
-            }
-            if (fiveStrandRemainSum > 0){
-               saveBilletBasicInfoList(billetBasicInfo, billetBasicInfoAdd, fourStrandRemainSum, 5, billetBasicInfoAdd.getFiveLength());
-            }
-            if (sixStrandRemainSum > 0){
-                saveBilletBasicInfoList(billetBasicInfo, billetBasicInfoAdd, sixStrandRemainSum, 6, billetBasicInfoAdd.getSixLength());
-            }
-
-            // 查询去除棒一,整炉钢坯基础信息
-            List<BilletBasicInfo> result = baseMapper.selectList(new LambdaQueryWrapper<BilletBasicInfo>()
-                    .eq(BilletBasicInfo::getCcmNo, billetBasicInfoAdd.getCcmNo())
-                    .eq(BilletBasicInfo::getHeatNo, billetBasicInfoAdd.getHeatNo())
-                    .eq(BilletBasicInfo::getShift, billetBasicInfoAdd.getShift())
-                    .eq(BilletBasicInfo::getShiftGroup, billetBasicInfoAdd.getShiftGroup())
-                    .isNull(BilletBasicInfo::getBelongTable));
-            log.info("整炉去除棒一需要组批的钢坯总数:{}", result.size());
-            if (oConvertUtils.listIsNotEmpty(result)){
-                // 处理流内顺序号、和炉内顺序号
-                updateBilletBasicInfoAndSave(result);
-            }
-
-            if (oConvertUtils.listIsNotEmpty(result) && result.size() >= 4) {
-                int size = result.size();
-                int maxProcessed = (size / 4) * 4; // 计算可处理的最大4的倍数
-                for (int i = 0; i < maxProcessed; i += 4) {
-                    int start = i;
-                    int end = Math.min(i + 4, maxProcessed);
-                    //组批成功的,对钢坯实绩进行组批号更新
-                    updateBilletBasicInfoAsendAssemblyHandle(result.subList(start, end), billetBasicInfoAdd);
-                }
-            }
-
-            result.addAll(resultList);
-
-            // 更新炉次传递单中的总数和坯重
-            double totalBilletWeight = result.stream()
-                    .mapToDouble(BilletBasicInfo::getBilletWeight)
-                    .sum();
-            billetHotsend.setAmountTotal(result.size());
-            billetHotsend.setBlankOutput(totalBilletWeight);
-            billetHotsendBaseMapper.updateById(billetHotsend);
-
-            // 更新炉次实绩中的总数和坯重
-            heatsActuals.setBlankOutput(totalBilletWeight);
-            heatsActuals.setBilletSum(result.size());
-            heatsActualsMapper.updateById(heatsActuals);
-        }
-        return "整炉补录成功!";
-    }
-
-
-    /**
-     * 处理流内顺序号、和炉内顺序号
-     * @param resultList
-     */
-    public void updateBilletBasicInfoAndSave(List<BilletBasicInfo> resultList) {
-        if (oConvertUtils.listIsEmpty(resultList)) {
-            return;
-        }
-        Map<Integer, List<BilletBasicInfo>> strandNoGroupMap = resultList.stream()
-                .collect(Collectors.groupingBy(BilletBasicInfo::getStrandNo));
-        strandNoGroupMap.forEach((strandNo, groupList) -> {
-            for (int i = 0; i < groupList.size(); i++) {
-                BilletBasicInfo item = groupList.get(i);
-                item.setStrandnoIndex(i + 1); // 组内序号从1开始
-            }
-        });
-        for (int i = 0; i < resultList.size(); i++) {
-            resultList.get(i).setHeatnoIndex(i + 1); // 全局序号从1开始
-        }
-        resultList.forEach(item -> {
-            baseMapper.updateById(item);
-        });
-
-    }
-
-    /**
-     * 整炉处理
-     * @param billetBasicInfo
-     * @param billetBasicInfoAdd
-     * @param addSum
-     * @param strandNo
-     * @param length
-     */
-    private void saveBilletBasicInfoList(BilletBasicInfo billetBasicInfo, BilletBasicInfoAdd billetBasicInfoAdd, int addSum, int strandNo, int length) {
-        List<BilletBasicInfo> resultList = new ArrayList<>();
-        // 根据 addSum 生成对应数量的 BilletBasicInfo 对象
-        for (int i = 0; i < addSum; i++) {
-            BilletBasicInfo billet = new BilletBasicInfo();
-            BeanUtils.copyProperties(billetBasicInfo, billet);
-            billet.setStrandNo(strandNo);
-            billet.setLength(length);
-            // 设置其他必要属性
-            billet.setId(String.valueOf(IdWorker.getId()));
-            billet.setHeatNo(billetBasicInfoAdd.getHeatNo());
-            String billetNo = generateUniqueBilletNo(Integer.valueOf(billetBasicInfoAdd.getCcmNo()), billetBasicInfoAdd.getHeatNo());
-            billet.setBilletNo(billetNo);
-            billet.setCreateTime(new Date());
-            billet.setUpdateTime(new Date());
-            billet.setAssemblyNumber(null);
-            billet.setBelongTable(null);
-            billet.setBhtcId(null);
-            // 查询定尺规则
-            LambdaQueryWrapper<BilletRulerConfig> queryWrapperbilletRulerConfig = new LambdaQueryWrapper<BilletRulerConfig>().eq(BilletRulerConfig::getLength, billetBasicInfo.getLength());
-            BilletRulerConfig billetRulerConfig = billetRulerConfigMapper.selectOne(queryWrapperbilletRulerConfig);
-            Double weight = 0.0;
-            if (oConvertUtils.isEmpty(billetRulerConfig)) {
-                weight = billetBasicInfo.getWeight();
-            } else {
-                weight = billetRulerConfig.getWeight();
-            }
-            billet.setWeight(weight);
-            billet.setBilletWeight(weight);
-            resultList.add(billet);
-        }
-        baseMapper.insertBatch(resultList);
-    }
-
 
     /**
      * 批量生成

+ 23 - 0
zgztBus/jeecg-module-sbm/src/main/java/org/jeecg/modules/billet/billetHotsend/controller/BilletHotsendBaseController.java

@@ -20,6 +20,7 @@ import org.jeecg.common.system.base.controller.JeecgController;
 import org.jeecg.common.system.query.QueryGenerator;
 import org.jeecg.common.util.oConvertUtils;
 import org.jeecg.modules.actualControl.billetActual.billetActual.entity.BilletBasicInfo;
+import org.jeecg.modules.actualControl.billetActual.billetActual.entity.BilletBasicInfoAdd;
 import org.jeecg.modules.actualControl.billetActual.billetActual.service.IBilletBasicInfoService;
 import org.jeecg.modules.billet.billetHotsend.dto.BilletHotsendExportDTO;
 import org.jeecg.modules.billet.billetHotsend.dto.StrandNoSizeDTO;
@@ -522,4 +523,26 @@ public class BilletHotsendBaseController extends JeecgController<BilletHotsend,
         return Result.OK("流号定尺推送消息成功!");
     }
 
+
+    @AutoLog(value = "钢坯浇筑页面-补录钢坯")
+    @ApiOperation(value="钢坯浇筑页面-补录钢坯", notes="钢坯浇筑页面-补录钢坯")
+    @PostMapping(value = "/addBilletBasic")
+    public Result<?> addBilletBasic(@RequestBody BilletBasicInfoAdd billetBasicInfoAdd){
+        // 记录开始时间
+        long startMillis = System.currentTimeMillis();
+        log.info("开始执行时间:{}", new Date(startMillis));
+        try {
+            String result = billetHotsendBaseService.addBilletBasicHandle(billetBasicInfoAdd);
+            // 记录结束时间并计算耗时
+            long endMillis = System.currentTimeMillis();
+            long durationMillis = endMillis - startMillis;
+            log.info("结束执行时间:{},总耗时:{} 毫秒", new Date(endMillis), durationMillis);
+            return Result.OK(result);
+        } catch (Exception e) {
+            // 记录异常时的执行时间
+            long errorMillis = System.currentTimeMillis();
+            log.error("执行过程中发生异常,异常时间:{},耗时:{} 毫秒", new Date(errorMillis), errorMillis - startMillis);
+            throw new RuntimeException(e);
+        }
+    }
 }

+ 3 - 0
zgztBus/jeecg-module-sbm/src/main/java/org/jeecg/modules/billet/billetHotsend/service/IBilletHotsendBaseService.java

@@ -2,6 +2,7 @@ package org.jeecg.modules.billet.billetHotsend.service;
 
 import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.extension.service.IService;
+import org.jeecg.modules.actualControl.billetActual.billetActual.entity.BilletBasicInfoAdd;
 import org.jeecg.modules.billet.billetHotsend.dto.StrandNoSizeDTO;
 import org.jeecg.modules.billet.billetHotsend.entity.BilletBasicInfoDetails;
 import org.jeecg.modules.billet.billetHotsend.entity.BilletHotsend;
@@ -40,4 +41,6 @@ public interface IBilletHotsendBaseService extends IService<BilletHotsend> {
     void furnaceChange(FurnaceChangeData data);
 
     void pushStrandNoSize(StrandNoSizeDTO dto);
+
+    String addBilletBasicHandle(BilletBasicInfoAdd billetBasicInfoAdd);
 }

+ 537 - 0
zgztBus/jeecg-module-sbm/src/main/java/org/jeecg/modules/billet/billetHotsend/service/impl/BilletHotsendBaseServiceImpl.java

@@ -8,13 +8,20 @@ import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.baomidou.mybatisplus.core.toolkit.IdWorker;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.collections.CollectionUtils;
 import org.jeecg.common.exception.JeecgBootException;
 import org.jeecg.common.util.DateUtils;
 import org.jeecg.common.util.oConvertUtils;
 import org.jeecg.modules.actualControl.billetActual.billetActual.entity.BilletBasicInfo;
+import org.jeecg.modules.actualControl.billetActual.billetActual.entity.BilletBasicInfoAdd;
+import org.jeecg.modules.actualControl.billetActual.billetActual.entity.BilletRulerConfig;
+import org.jeecg.modules.actualControl.billetActual.billetActual.entity.RollClubOneInfo;
 import org.jeecg.modules.actualControl.billetActual.billetActual.service.IBilletBasicInfoService;
+import org.jeecg.modules.actualControl.billetActual.billetActual.service.IBilletRulerConfigService;
 import org.jeecg.modules.actualControl.billetActual.billetActual.utils.MqttClientUtil;
 import org.jeecg.modules.actualControl.billetActual.billetActual.utils.TopicType;
+import org.jeecg.modules.actualControl.billetActual.billetAssemblyNumber.entity.BilletAssemblyNumber;
+import org.jeecg.modules.actualControl.billetActual.billetAssemblyNumber.mapper.BilletAssemblyNumberMapper;
 import org.jeecg.modules.actualControl.heatsActuals.entity.HeatsActuals;
 import org.jeecg.modules.actualControl.heatsActuals.service.IHeatsActualsService;
 import org.jeecg.modules.billet.billetHotsend.dto.StrandNoSizeDTO;
@@ -66,12 +73,15 @@ import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.transaction.interceptor.TransactionAspectSupport;
 
+import javax.annotation.Resource;
 import java.math.BigDecimal;
 import java.time.ZoneId;
 import java.time.format.DateTimeFormatter;
 import java.util.*;
 import java.util.concurrent.atomic.AtomicLong;
+import java.util.function.Function;
 import java.util.stream.Collectors;
+import java.util.stream.IntStream;
 
 /**
  * @Description: 钢坯热送基础信息
@@ -132,6 +142,12 @@ public class BilletHotsendBaseServiceImpl extends ServiceImpl<BilletHotsendBaseM
 	@Autowired
 	private ConfigMqttMapper configMqttMapper;
 
+	@Resource
+	private BilletAssemblyNumberMapper billetAssemblyNumberMapper;
+
+	@Autowired
+	private IBilletRulerConfigService billetRulerConfigService;
+
 	@Override
 	@Transactional
 	public JSONObject saveBilletHotsendDetails(BilletHotsendDetailsVo billetHotsendDetailsVo) {
@@ -1350,4 +1366,525 @@ public class BilletHotsendBaseServiceImpl extends ServiceImpl<BilletHotsendBaseM
 	public List<BilletHotsend> queryByCastMachineAndFurnaceNum(String castMachine, String furnaceNum) {
 		return billetHotsendBaseMapper.selectList(new LambdaQueryWrapper<BilletHotsend>().eq(BilletHotsend::getCcmNo, castMachine).eq(BilletHotsend::getHeatNo, furnaceNum));
 	}
+
+
+	@Override
+	public String addBilletBasicHandle(BilletBasicInfoAdd billetBasicInfoAdd) {
+
+		String brandNum = String.format("billet:basic:info:brand:num:%s", billetBasicInfoAdd.getCcmNo()); // 牌号
+		String brandNumStr = !oConvertUtils.getString(redisTemplate.opsForValue().get(brandNum)).isEmpty() ? oConvertUtils.getString(redisTemplate.opsForValue().get(brandNum)) : "";
+
+		if (billetBasicInfoAdd.getAddType() == 1){
+			// 处理整炉补录钢坯逻辑
+			completeHeatsHandle(billetBasicInfoAdd, brandNumStr);
+		}
+		return "整炉补录成功!";
+	}
+
+	/**
+	 * 整炉添加逻辑处理
+	 * @param billetBasicInfoAdd
+	 */
+	private String completeHeatsHandle(BilletBasicInfoAdd billetBasicInfoAdd, String brandNumStr) {
+
+		LambdaQueryWrapper<HeatsActuals> queryWrapper1 = new LambdaQueryWrapper<HeatsActuals>()
+				.eq(HeatsActuals::getHeatsCode, billetBasicInfoAdd.getHeatNo())
+				.orderByDesc(HeatsActuals::getCreateTime).last("limit 1");
+		HeatsActuals actualsCheck = heatsActualsService.getOne(queryWrapper1);
+		if (actualsCheck != null){
+			return "炉号重复,补录失败!";
+		}
+
+		// 查询基础信息
+		LambdaQueryWrapper<HeatsActuals> queryWrapper = new LambdaQueryWrapper<HeatsActuals>()
+				.eq(HeatsActuals::getCasterCode, billetBasicInfoAdd.getCcmNo())
+				.orderByDesc(HeatsActuals::getCreateTime).last("limit 1");
+		HeatsActuals actuals = heatsActualsService.getOne(queryWrapper);
+
+		HeatsActuals heatsActuals = new HeatsActuals();
+		BeanUtils.copyProperties(actuals, heatsActuals);
+
+		try {
+			heatsActuals.setId(String.valueOf(IdWorker.getId()));
+			heatsActuals.setHeatsCode(billetBasicInfoAdd.getHeatNo());
+			heatsActuals.setShift(billetBasicInfoAdd.getShift());
+			heatsActuals.setShiftGroup(billetBasicInfoAdd.getShiftGroup());
+			//根据最新一炉的炉次信息计算 空包重量核算
+			if(heatsActuals.getMoltenSteelWeight() > 0 && heatsActuals.getFullLadleWeight() > 0){ // 如果钢水重量存在核算
+				heatsActuals.setEmptyLadleWeight(heatsActuals.getFullLadleWeight() - heatsActuals.getMoltenSteelWeight());
+			}
+			// 整理添加总支数
+			heatsActuals.setBilletSum(0);
+			heatsActuals.setBlankOutput(0.0d);
+			heatsActuals.setCreateTime(new Date());
+			heatsActuals.setUpdateTime(new Date());
+			heatsActualsService.save(heatsActuals);
+		} catch (Exception e) {
+			log.error("整炉补坯保存炉次实绩数据出现异常", e);
+			throw new RuntimeException("整炉补坯保存炉次实绩数据出现失败!", e);
+		}
+		log.info("1炉次实绩插入:"+ DateUtils.date2Str(new Date(), DateUtils.datetimeFormat.get()));
+		//新增炉次传递单
+		BilletHotsend billetHotsend = new BilletHotsend();
+		billetHotsend.setId(String.valueOf(IdWorker.getId()));
+		billetHotsend.setCcmNo(billetBasicInfoAdd.getCcmNo()); // 铸机号
+		billetHotsend.setHeatNo(billetBasicInfoAdd.getHeatNo()); // 炉号
+		billetHotsend.setShiftGroup(billetBasicInfoAdd.getShiftGroup()); // 班组
+		billetHotsend.setShift(billetBasicInfoAdd.getShift()); // 班别
+		billetHotsend.setSteel(heatsActuals.getGrade()); // 钢种
+		billetHotsend.setSpec(heatsActuals.getSpec()); // 规格
+
+		billetHotsend.setBrandNum(brandNumStr);
+		billetHotsend.setAmountTotal(heatsActuals.getBilletSum()); // 支数
+		billetHotsend.setBlankOutput(0.0d); // 出批量
+		billetHotsend.setDecideWeight(0.0d); // 定重
+		billetHotsend.setWasteBlankOutput(0.0);
+		billetHotsend.setCreateTime(new Date());
+		billetHotsend.setUpdateTime(new Date());
+		billetHotsendBaseMapper.insert(billetHotsend);
+		log.info("2炉次传递单插入:"+ DateUtils.date2Str(new Date(), DateUtils.datetimeFormat.get()));
+		LambdaQueryWrapper<BilletBasicInfo> queryWrapperB = new LambdaQueryWrapper<BilletBasicInfo>()
+				.eq(BilletBasicInfo::getCcmNo, billetBasicInfoAdd.getCcmNo())
+				.orderByDesc(BilletBasicInfo::getCreateTime).last("limit 1");
+		BilletBasicInfo billetInfo = billetBasicInfoService.getOne(queryWrapperB);
+
+		BilletBasicInfo billetBasicInfo = new BilletBasicInfo();
+		BeanUtils.copyProperties(billetInfo, billetBasicInfo);
+		// 去棒一数据补录
+		if (oConvertUtils.listIsEmpty(billetBasicInfoAdd.getRollClubOneList())){
+			// 整炉全部去组批
+			// 1流补录钢坯
+			if (oConvertUtils.isNotEmpty(billetBasicInfoAdd.getOneStrandNo()) && billetBasicInfoAdd.getOneStrandNoSum() > 0){
+				log.info("1流保存钢坯实绩开始:"+ DateUtils.date2Str(new Date(), DateUtils.datetimeFormat.get()));
+				int addSum = billetBasicInfoAdd.getOneStrandNoSum();
+				int strandNo = billetBasicInfoAdd.getOneStrandNo();
+				int length = billetBasicInfoAdd.getOneLength();
+				saveBilletBasicInfoList(billetBasicInfo, billetBasicInfoAdd, addSum, strandNo, length);
+				log.info("1流保存钢坯实绩结束:"+ DateUtils.date2Str(new Date(), DateUtils.datetimeFormat.get()));
+			}
+			// 2流补录钢坯
+			if (oConvertUtils.isNotEmpty(billetBasicInfoAdd.getTwoStrandNo()) && billetBasicInfoAdd.getTwoStrandNoSum() > 0){
+				log.info("2流保存钢坯实绩开始:"+ DateUtils.date2Str(new Date(), DateUtils.datetimeFormat.get()));
+				int addSum = billetBasicInfoAdd.getTwoStrandNoSum();
+				int strandNo = billetBasicInfoAdd.getTwoStrandNo();
+				int length = billetBasicInfoAdd.getTwoLength();
+				saveBilletBasicInfoList(billetBasicInfo, billetBasicInfoAdd, addSum, strandNo, length);
+				log.info("2流保存钢坯实绩结束:"+ DateUtils.date2Str(new Date(), DateUtils.datetimeFormat.get()));
+			}
+			// 3流补录钢坯
+			if (oConvertUtils.isNotEmpty(billetBasicInfoAdd.getThreeStrandNo()) && billetBasicInfoAdd.getThreeStrandNoSum() > 0){
+				log.info("3流保存钢坯实绩开始:"+ DateUtils.date2Str(new Date(), DateUtils.datetimeFormat.get()));
+				int addSum = billetBasicInfoAdd.getThreeStrandNoSum();
+				int strandNo = billetBasicInfoAdd.getThreeStrandNo();
+				int length = billetBasicInfoAdd.getThreeLength();
+				saveBilletBasicInfoList(billetBasicInfo, billetBasicInfoAdd, addSum, strandNo, length);
+				log.info("3流保存钢坯实绩结束:"+ DateUtils.date2Str(new Date(), DateUtils.datetimeFormat.get()));
+			}
+
+			// 4流补录钢坯
+			if (oConvertUtils.isNotEmpty(billetBasicInfoAdd.getFourStrandNo()) && billetBasicInfoAdd.getFourStrandNoSum() > 0){
+				int addSum = billetBasicInfoAdd.getFourStrandNoSum();
+				int strandNo = billetBasicInfoAdd.getFourStrandNo();
+				int length = billetBasicInfoAdd.getFourLength();
+				saveBilletBasicInfoList(billetBasicInfo, billetBasicInfoAdd, addSum, strandNo, length);
+			}
+
+			// 5流补录钢坯
+			if (oConvertUtils.isNotEmpty(billetBasicInfoAdd.getFiveStrandNo()) && billetBasicInfoAdd.getFiveStrandNoSum() > 0){
+				int addSum = billetBasicInfoAdd.getFiveStrandNoSum();
+				int strandNo = billetBasicInfoAdd.getFiveStrandNo();
+				int length = billetBasicInfoAdd.getFiveLength();
+				saveBilletBasicInfoList(billetBasicInfo, billetBasicInfoAdd, addSum, strandNo, length);
+			}
+
+			// 6流补录钢坯
+			if (oConvertUtils.isNotEmpty(billetBasicInfoAdd.getSixStrandNo()) && billetBasicInfoAdd.getSixStrandNoSum() > 0){
+				int addSum = billetBasicInfoAdd.getSixStrandNoSum();
+				int strandNo = billetBasicInfoAdd.getSixStrandNo();
+				int length = billetBasicInfoAdd.getSixLength();
+				saveBilletBasicInfoList(billetBasicInfo, billetBasicInfoAdd, addSum, strandNo, length);
+			}
+
+			// 7流补录钢坯
+			if (oConvertUtils.isNotEmpty(billetBasicInfoAdd.getSevenStrandNo()) && billetBasicInfoAdd.getSevenStrandNoSum() > 0){
+				int addSum = billetBasicInfoAdd.getSevenStrandNoSum();
+				int strandNo = billetBasicInfoAdd.getSevenStrandNo();
+				int length = billetBasicInfoAdd.getSevenLength();
+				saveBilletBasicInfoList(billetBasicInfo, billetBasicInfoAdd, addSum, strandNo, length);
+			}
+
+			// 8流补录钢坯
+			if (oConvertUtils.isNotEmpty(billetBasicInfoAdd.getEightStrandNo()) && billetBasicInfoAdd.getEightStrandNoSum() > 0){
+				int addSum = billetBasicInfoAdd.getEightStrandNoSum();
+				int strandNo = billetBasicInfoAdd.getEightStrandNo();
+				int length = billetBasicInfoAdd.getEightLength();
+				saveBilletBasicInfoList(billetBasicInfo, billetBasicInfoAdd, addSum, strandNo, length);
+			}
+			// 查询整个炉钢坯基础信息
+			List<BilletBasicInfo> resultList = billetBasicInfoService.list(new LambdaQueryWrapper<BilletBasicInfo>()
+					.eq(BilletBasicInfo::getCcmNo, billetBasicInfoAdd.getCcmNo())
+					.eq(BilletBasicInfo::getHeatNo, billetBasicInfoAdd.getHeatNo())
+					.eq(BilletBasicInfo::getShift, billetBasicInfoAdd.getShift())
+					.eq(BilletBasicInfo::getShiftGroup, billetBasicInfoAdd.getShiftGroup()));
+			log.info("开始组批号更新处理:"+ DateUtils.date2Str(new Date(), DateUtils.datetimeFormat.get()));
+			if (oConvertUtils.listIsNotEmpty(resultList) && resultList.size() >= 4) {
+				int size = resultList.size();
+				int maxProcessed = (size / 4) * 4; // 计算可处理的最大4的倍数
+				for (int i = 0; i < maxProcessed; i += 4) {
+					int start = i;
+					int end = Math.min(i + 4, maxProcessed);
+					//组批成功的,对钢坯实绩进行组批号更新
+					updateBilletBasicInfoAsendAssemblyHandle(resultList.subList(start, end), billetBasicInfoAdd);
+				}
+			}
+			log.info("结束组批号更新处理:"+ DateUtils.date2Str(new Date(), DateUtils.datetimeFormat.get()));
+
+			// 更新炉次传递单中的总数和坯重
+			double totalBilletWeight = resultList.stream()
+					.mapToDouble(BilletBasicInfo::getBilletWeight)
+					.sum();
+			billetHotsend.setAmountTotal(resultList.size());
+			billetHotsend.setBlankOutput(totalBilletWeight);
+			billetHotsendBaseMapper.updateById(billetHotsend);
+
+			log.info("炉次传递单更新处理结束:"+ DateUtils.date2Str(new Date(), DateUtils.datetimeFormat.get()));
+
+			// 更新炉次实绩中的总数和坯重
+			heatsActuals.setBlankOutput(totalBilletWeight);
+			heatsActuals.setBilletSum(resultList.size());
+			heatsActualsService.updateById(heatsActuals);
+
+			log.info("炉次实绩更新处理结束:"+ DateUtils.date2Str(new Date(), DateUtils.datetimeFormat.get()));
+		}else {
+			int oneStrandRemainSum = 0;
+			int twoStrandRemainSum = 0;
+			int threeStrandRemainSum = 0;
+			int fourStrandRemainSum = 0;
+			int fiveStrandRemainSum = 0;
+			int sixStrandRemainSum = 0;
+
+			// 有去组批的,有去棒一的(混合情况) 1、先处理去棒一的数据 2、在减掉棒一的数量,剩余的进行组批
+			List<BilletBasicInfo> rollClubOneResultList = new ArrayList<>();
+			// 添加棒一明细
+			List<RollClubOneInfo> rollClubOneList = billetBasicInfoAdd.getRollClubOneList();
+
+			// 提取所有需要查询的长度
+			Set<Integer> lengthSet = new HashSet<>();
+			for (RollClubOneInfo item : rollClubOneList) {
+				if (item != null && item.getLength() != null) {
+					lengthSet.add(item.getLength());
+				}
+			}
+
+			// 预查询所有长度对应的定尺规则,避免循环中重复查询
+			Map<Integer, BilletRulerConfig> rulerConfigMap = new HashMap<>();
+			if (!lengthSet.isEmpty()) {
+				LambdaQueryWrapper<BilletRulerConfig> queryWrapperRC = new LambdaQueryWrapper<>();
+				queryWrapperRC.in(BilletRulerConfig::getLength, lengthSet);
+				List<BilletRulerConfig> configList = billetRulerConfigService.list(queryWrapperRC);
+				for (BilletRulerConfig config : configList) {
+					rulerConfigMap.put(config.getLength(), config);
+				}
+			}
+
+			// 遍历 RollClubOneInfo 列表
+			for (RollClubOneInfo item : rollClubOneList) {
+				Integer strandNo = item.getStrandNo();
+				Integer length = item.getLength();
+				Integer addSum = item.getAddSum();
+				if (strandNo == 1){
+					oneStrandRemainSum = billetBasicInfoAdd.getOneStrandNoSum() - addSum;
+				}else if (strandNo == 2){
+					twoStrandRemainSum = billetBasicInfoAdd.getTwoStrandNoSum() - addSum;
+				}else if (strandNo == 3){
+					threeStrandRemainSum = billetBasicInfoAdd.getThreeStrandNoSum() - addSum;
+				}else if (strandNo == 4){
+					fourStrandRemainSum = billetBasicInfoAdd.getFourStrandNoSum() - addSum;
+				}else if (strandNo == 5){
+					fiveStrandRemainSum = billetBasicInfoAdd.getFiveStrandNoSum() - addSum;
+				}else if (strandNo == 6){
+					sixStrandRemainSum = billetBasicInfoAdd.getSixStrandNoSum() - addSum;
+				}
+				// 根据 addSum 生成对应数量的 BilletBasicInfo 对象
+				for (int i = 0; i < addSum; i++) {
+					BilletBasicInfo billet = new BilletBasicInfo();
+					BeanUtils.copyProperties(billetBasicInfo, billet);
+					billet.setStrandNo(strandNo);
+					billet.setLength(length);
+					// 设置其他必要属性
+					billet.setId(String.valueOf(IdWorker.getId()));
+					billet.setHeatNo(billetBasicInfoAdd.getHeatNo());
+					String billetNo = generateUniqueBilletNo(Integer.valueOf(billetBasicInfoAdd.getCcmNo()), billetBasicInfoAdd.getHeatNo());
+					billet.setBilletNo(billetNo);
+					billet.setCreateTime(new Date());
+					billet.setUpdateTime(new Date());
+					billet.setAssemblyNumber(null);
+					billet.setBelongTable("roll_club_one");
+					billet.setBhtcId("1");
+					// 优化:从预查询的映射表中获取定尺规则,避免重复查询数据库
+					BilletRulerConfig billetRulerConfig = rulerConfigMap.get(length);
+					Double weight = billetRulerConfig != null ? billetRulerConfig.getWeight() : billetBasicInfo.getWeight();
+					billet.setWeight(weight);
+					billet.setBilletWeight(weight);
+					rollClubOneResultList.add(billet);
+				}
+			}
+			if (oConvertUtils.listIsNotEmpty(rollClubOneResultList)){
+				// 去棒一明细处理
+				saveRollClubOneInfo(rollClubOneResultList, billetBasicInfoAdd);
+			}
+
+			if (oneStrandRemainSum > 0){
+				saveBilletBasicInfoList(billetBasicInfo, billetBasicInfoAdd, oneStrandRemainSum, 1, billetBasicInfoAdd.getOneLength());
+			}
+			if (twoStrandRemainSum > 0){
+				saveBilletBasicInfoList(billetBasicInfo, billetBasicInfoAdd, twoStrandRemainSum, 2, billetBasicInfoAdd.getTwoLength());
+			}
+			if (threeStrandRemainSum > 0){
+				saveBilletBasicInfoList(billetBasicInfo, billetBasicInfoAdd, threeStrandRemainSum, 3, billetBasicInfoAdd.getThreeLength());
+			}
+			if (fourStrandRemainSum > 0){
+				saveBilletBasicInfoList(billetBasicInfo, billetBasicInfoAdd, fourStrandRemainSum, 4, billetBasicInfoAdd.getFourLength());
+			}
+			if (fiveStrandRemainSum > 0){
+				saveBilletBasicInfoList(billetBasicInfo, billetBasicInfoAdd, fiveStrandRemainSum, 5, billetBasicInfoAdd.getFiveLength());
+			}
+			if (sixStrandRemainSum > 0){
+				saveBilletBasicInfoList(billetBasicInfo, billetBasicInfoAdd, sixStrandRemainSum, 6, billetBasicInfoAdd.getSixLength());
+			}
+			// 7不存在去棒一
+			if (oConvertUtils.isNotEmpty(billetBasicInfoAdd.getSevenStrandNoSum()) && billetBasicInfoAdd.getSevenStrandNoSum() > 0){
+				saveBilletBasicInfoList(billetBasicInfo, billetBasicInfoAdd, billetBasicInfoAdd.getSevenStrandNoSum(), 7, billetBasicInfoAdd.getSevenLength());
+			}
+			// 8流不存在去棒一
+			if (oConvertUtils.isNotEmpty(billetBasicInfoAdd.getEightStrandNoSum()) && billetBasicInfoAdd.getEightStrandNoSum() > 0){
+				saveBilletBasicInfoList(billetBasicInfo, billetBasicInfoAdd, billetBasicInfoAdd.getSevenStrandNoSum(), 8, billetBasicInfoAdd.getSevenLength());
+			}
+
+			// 查询去除棒一,整炉 剩余钢坯基础信息
+			List<BilletBasicInfo> result = billetBasicInfoService.list(new LambdaQueryWrapper<BilletBasicInfo>()
+					.eq(BilletBasicInfo::getCcmNo, billetBasicInfoAdd.getCcmNo())
+					.eq(BilletBasicInfo::getHeatNo, billetBasicInfoAdd.getHeatNo())
+					.eq(BilletBasicInfo::getShift, billetBasicInfoAdd.getShift())
+					.eq(BilletBasicInfo::getShiftGroup, billetBasicInfoAdd.getShiftGroup())
+					.isNull(BilletBasicInfo::getBelongTable));
+			log.info("整炉去除棒一需要组批的钢坯总数:{}", result.size());
+			if (oConvertUtils.listIsNotEmpty(result) && result.size() >= 4) {
+				int size = result.size();
+				int maxProcessed = (size / 4) * 4; // 计算可处理的最大4的倍数
+				for (int i = 0; i < maxProcessed; i += 4) {
+					int start = i;
+					int end = Math.min(i + 4, maxProcessed);
+					//组批成功的,对钢坯实绩进行组批号更新
+					updateBilletBasicInfoAsendAssemblyHandle(result.subList(start, end), billetBasicInfoAdd);
+				}
+			}
+
+			// 去棒一的和组批的合计钢坯实绩信息
+			result.addAll(rollClubOneResultList);
+
+			// 更新炉次传递单中的总数和坯重
+			double totalBilletWeight = result.stream()
+					.mapToDouble(BilletBasicInfo::getBilletWeight)
+					.sum();
+			billetHotsend.setAmountTotal(result.size());
+			billetHotsend.setBlankOutput(totalBilletWeight);
+
+			if (oConvertUtils.listIsNotEmpty(rollClubOneResultList) && rollClubOneResultList.size() > 0){
+				billetHotsend.setRollcluboneNum(rollClubOneResultList.size());
+			}
+
+			billetHotsendBaseMapper.updateById(billetHotsend);
+
+			// 更新炉次实绩中的总数和坯重
+			heatsActuals.setBlankOutput(totalBilletWeight);
+			heatsActuals.setBilletSum(result.size());
+			heatsActualsService.updateById(heatsActuals);
+		}
+
+		// 根据炉号、铸机号、炉号查询钢坯实绩信息
+		List<BilletBasicInfo> allBilletBasicInfoList = billetBasicInfoService.list(new LambdaQueryWrapper<BilletBasicInfo>()
+				.eq(BilletBasicInfo::getCcmNo, billetBasicInfoAdd.getCcmNo())
+				.eq(BilletBasicInfo::getHeatNo, billetBasicInfoAdd.getHeatNo())
+				.eq(BilletBasicInfo::getShift, billetBasicInfoAdd.getShift())
+				.eq(BilletBasicInfo::getShiftGroup, billetBasicInfoAdd.getShiftGroup()));
+		// 处理钢坯实绩,流内顺序号、和炉内顺序号
+		if (oConvertUtils.listIsNotEmpty(allBilletBasicInfoList)){
+			updateBilletBasicInfoAndSave(allBilletBasicInfoList);
+		}
+		log.info("钢坯实绩流内顺序号处理结束:"+ DateUtils.date2Str(new Date(), DateUtils.datetimeFormat.get()));
+
+		return "整炉补录成功!";
+	}
+
+	/**
+	 * 整理补录,去棒一钢坯,炉内顺序号、流号处理,轧钢棒一、棒一明细保存
+	 * @param billetBasicInfoList
+	 * @param billetBasicInfoAdd
+	 */
+	private void saveRollClubOneInfo(List<BilletBasicInfo> billetBasicInfoList, BilletBasicInfoAdd  billetBasicInfoAdd) {
+		// 对 resultList 中的元素按 Strandno 分组后重新赋值 StrandnoIndex
+		log.info("整炉去棒一的钢坯总数:{}", billetBasicInfoList.size());
+		billetBasicInfoService.saveOrUpdateBatch(billetBasicInfoList);
+
+		// 更新炉次传递单中的总数和坯重
+		double rollClubOneWeight = billetBasicInfoList.stream()
+				.mapToDouble(BilletBasicInfo::getBilletWeight)
+				.sum();
+
+		RollClubOne rollClubOne = new RollClubOne();
+		rollClubOne.setId(String.valueOf(IdWorker.getId()));
+		rollClubOne.setCcmNo(billetBasicInfoAdd.getCcmNo());
+		rollClubOne.setHeatNo(billetBasicInfoAdd.getHeatNo());
+		rollClubOne.setShiftGroup(billetBasicInfoAdd.getShiftGroup());
+		rollClubOne.setShift(billetBasicInfoAdd.getShift());
+		rollClubOne.setBlankOutput(rollClubOneWeight);
+		rollClubOne.setSize(String.valueOf(billetBasicInfoList.stream().findFirst().orElse(null).getLength())); //定尺
+		rollClubOne.setSteel(String.valueOf(billetBasicInfoList.stream().findFirst().orElse(null).getGrade())); //钢种
+		rollClubOne.setSpec(String.valueOf(billetBasicInfoList.stream().findFirst().orElse(null).getSpec())); //规格
+		rollClubOne.setBlankOutput(billetBasicInfoList.stream().mapToDouble(BilletBasicInfo::getBilletWeight).sum());//出坯量总和
+		rollClubOne.setCreateDate(new Date());
+		rollClubOne.setCreateTime(new Date());
+		rollClubOneService.save(rollClubOne);
+
+		// 保存棒一明细信息
+		List<RollClubOneDetails> rollClubOneDetailsList = new ArrayList<>();
+		billetBasicInfoList.forEach(x ->{
+			RollClubOneDetails rollClubOneDetails = new RollClubOneDetails();
+			BeanUtils.copyProperties(x, rollClubOneDetails);
+			rollClubOneDetails.setId(String.valueOf(IdWorker.getId()));
+			rollClubOneDetails.setCcmNo(billetBasicInfoAdd.getCcmNo());
+			rollClubOneDetails.setShift(billetBasicInfoAdd.getShift());
+			rollClubOneDetails.setStartNum(0);
+			rollClubOneDetails.setEndNum(1);
+			rollClubOneDetails.setShiftGroup(billetBasicInfoAdd.getShiftGroup());
+			rollClubOneDetails.setLicensePlate("辊道");
+			rollClubOneDetails.setSize(String.valueOf(x.getLength()));
+			rollClubOneDetails.setSteel(x.getGrade());
+			rollClubOneDetails.setCreateTime(new Date());
+			rollClubOneDetails.setBlankOutput(x.getBilletWeight());//出坯量
+			rollClubOneDetailsList.add(rollClubOneDetails);
+		});
+		rollClubOneDetailsService.saveBatch(rollClubOneDetailsList);
+	}
+
+	/**
+	 * 处理流内顺序号、和炉内顺序号
+	 * @param resultList
+	 */
+	public void updateBilletBasicInfoAndSave(List<BilletBasicInfo> resultList) {
+		if (oConvertUtils.listIsEmpty(resultList)) {
+			return;
+		}
+		Map<Integer, List<BilletBasicInfo>> strandNoGroupMap = resultList.stream()
+				.collect(Collectors.groupingBy(BilletBasicInfo::getStrandNo));
+		// 并行处理每个分组(可选优化,适用于多核CPU和大量分组)
+		strandNoGroupMap.values().parallelStream().forEach(groupList -> {
+			for (int i = 0; i < groupList.size(); i++) {
+				groupList.get(i).setStrandnoIndex(i + 1); // 流内顺序号从1开始
+			}
+		});
+		// 设置炉内顺序号(全局顺序)
+		IntStream.range(0, resultList.size()).forEach(i -> resultList.get(i).setHeatnoIndex(i + 1));
+		billetBasicInfoService.updateBatchById(resultList);
+
+	}
+
+	/**
+	 * 整炉处理
+	 * @param billetBasicInfo
+	 * @param billetBasicInfoAdd
+	 * @param addSum
+	 * @param strandNo
+	 * @param length
+	 */
+	private void saveBilletBasicInfoList(BilletBasicInfo billetBasicInfo, BilletBasicInfoAdd billetBasicInfoAdd, int addSum, int strandNo, int length) {
+		List<BilletBasicInfo> resultList = new ArrayList<>();
+
+		// 批量查询定尺规则
+		LambdaQueryWrapper<BilletRulerConfig> queryWrapper = new LambdaQueryWrapper<BilletRulerConfig>().eq(BilletRulerConfig::getLength, billetBasicInfo.getLength());
+		List<BilletRulerConfig> billetRulerConfigs = billetRulerConfigService.list(queryWrapper);
+		Map<Integer, BilletRulerConfig> rulerConfigMap = billetRulerConfigs.stream()
+				.collect(Collectors.toMap(BilletRulerConfig::getLength, Function.identity()));
+
+		// 根据 addSum 生成对应数量的 BilletBasicInfo 对象
+		for (int i = 0; i < addSum; i++) {
+			BilletBasicInfo billet = new BilletBasicInfo();
+			BeanUtils.copyProperties(billetBasicInfo, billet);
+			billet.setStrandNo(strandNo);
+			billet.setLength(length);
+			// 设置其他必要属性
+			billet.setId(String.valueOf(IdWorker.getId()));
+			billet.setHeatNo(billetBasicInfoAdd.getHeatNo());
+			String billetNo = generateUniqueBilletNo(Integer.valueOf(billetBasicInfoAdd.getCcmNo()), billetBasicInfoAdd.getHeatNo());
+			billet.setBilletNo(billetNo);
+			billet.setCreateTime(new Date());
+			billet.setUpdateTime(new Date());
+			billet.setAssemblyNumber(null);
+			billet.setBelongTable(null);
+			billet.setBhtcId(null);
+
+			// 获取定尺规则
+			BilletRulerConfig billetRulerConfig = rulerConfigMap.get(billetBasicInfo.getLength());
+			Double weight = Optional.ofNullable(billetRulerConfig)
+					.map(BilletRulerConfig::getWeight)
+					.orElse(billetBasicInfo.getWeight());
+
+			billet.setWeight(weight);
+			billet.setBilletWeight(weight);
+			resultList.add(billet);
+		}
+		billetBasicInfoService.saveOrUpdateBatch(resultList);
+	}
+
+	/**
+	 * 组批处理
+	 * @param billetBasicInfoList
+	 * @param billetBasicInfoAdd
+	 */
+	private void updateBilletBasicInfoAsendAssemblyHandle(List<BilletBasicInfo> billetBasicInfoList, BilletBasicInfoAdd billetBasicInfoAdd){
+		if (CollectionUtils.isEmpty(billetBasicInfoList)) {
+			return;
+		}
+		String assemblyNumber = generateUniqueAssemblyNumber(billetBasicInfoAdd.getHeatNo());
+
+		// 为所有记录设置相同的组批号
+		billetBasicInfoList.forEach(item -> item.setAssemblyNumber(assemblyNumber));
+
+		// 使用 MyBatis-Plus 的批量更新方法(默认 batchSize=1000)
+		billetBasicInfoService.updateBatchById(billetBasicInfoList);
+	}
+	/**
+	 * 生成唯一的坯号
+	 *
+	 * @return 坯号
+	 */
+	private String generateUniqueBilletNo(Integer ccmNo, String heatNo) {
+		// 生成雪花算法ID
+		long snowflakeId = IdWorker.getId();
+
+		// 获取ID的最后3位数字(100-999范围内)
+		int randomPart = (int) (snowflakeId % 900 + 100);
+
+		// 拼接钢坯号:heatNo + ccmNo + 三位随机数
+		return heatNo + ccmNo + String.format("%03d", randomPart);
+	}
+
+	/**
+	 * 生成唯一的组坯号
+	 *
+	 * @return 坯号
+	 */
+	private String generateUniqueAssemblyNumber(String heatNo) {
+		// 生成雪花算法ID
+		long snowflakeId = IdWorker.getId();
+
+		// 获取ID的最后3位数字(100-999范围内)
+		int randomPart = (int) (snowflakeId % 900 + 100);
+
+		// 拼接钢坯号:heatNo + ccmNo + 三位随机数
+		return heatNo + String.format("%03d", randomPart);
+	}
+
 }
+

+ 1 - 1
zgztBus/jeecg-module-sbm/src/main/java/org/jeecg/modules/billet/storageBill/service/impl/StorageBillServiceImpl.java

@@ -1397,7 +1397,7 @@ public class StorageBillServiceImpl extends ServiceImpl<StorageBillMapper, Stora
         if (value != null && !value.isEmpty()) {
             onDutyInfo.setStandNoSize(String.valueOf(JSON.parseArray(value)));
         } else {
-            log.info("Redis中未找到对应的值或值为空");
+//            log.info("Redis中未找到对应的值或值为空");
         }
 
         String brandNum = String.format("billet:basic:info:brand:num:%s", ccmNo);