|
@@ -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);
|
|
|
+ }
|
|
|
+
|
|
|
}
|
|
|
+
|