zhanghl
2025-05-23 52aa02cfdb3a70811140e775b947f2200ca8a3eb
aps-modules/aps-core/src/main/java/com/aps/core/service/impl/ApsPlate/ApsPlateProcessShopStatServiceImpl.java
@@ -5,6 +5,8 @@
import java.util.concurrent.atomic.AtomicInteger;
import java.util.stream.Collectors;
import cn.hutool.core.collection.ListUtil;
import cn.hutool.core.util.IdUtil;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson2.JSON;
import com.alibaba.nacos.common.utils.JacksonUtils;
@@ -136,23 +138,16 @@
    /**
     * 保存钣金车间统计
     */
    @Transactional
    @Transactional( rollbackFor =Exception.class)
    @Override
    public void saveShopStat() {
        try {
            apsPlateProcessStatService.savePlateProcessStat();
            // 开始之前先删除所有历史数据
            apsPlateProcessShopStatMapper.deleteAll();
            // 定义该功能使用数据源为南通的工厂
            final String plant = "FORTUNA";
            final String major="钣金";
        final String major="BJ";
            // 查询相关数据
            ApsPlatePlan platePlan = new ApsPlatePlan();
            platePlan.setPlant(plant);
            List<ApsPlatePlan> planList = apsPlatePlanMapper.selectApsPlatePlanList(platePlan);
            List<ApsPlateProcessStat> statList = apsPlateProcessStatMapper.selectApsPlateProcessStatList(new ApsPlateProcessStat());
            ApsShop apsShop = new ApsShop();
            apsShop.setPlantCode(plant);
@@ -161,13 +156,16 @@
            ApsStandardProcess process = new ApsStandardProcess();
            process.setPlant(plant);
            process.setMajor(major);
            List<ApsStandardProcess> shopProcesses = standardProcessMapper.selectApsStandardProcessList(process);
            if (planList.isEmpty() || shopList.isEmpty() || shopProcesses.isEmpty()) {
                log.warn("计划列表、车间列表或工序列表为空,无法生成统计信息");
                return;
            }
        if (!planList.isEmpty() &&  !shopList.isEmpty() &&  !shopProcesses.isEmpty()) {
            // 开始之前先删除所有历史数据
            apsPlateProcessStatMapper.deleteAll();
            apsPlateProcessShopStatMapper.deleteAll();
            List<ApsPlateProcessStat> statList =apsPlateProcessStatService.computePlateProcessStat();
            // 构建车间名称到工序名称的映射
            Map<String, List<String>> shopToProcessNames = shopProcesses.stream()
            Map<String, List<String>> shopToProcessNames = shopProcesses.stream().filter(x -> null!=x.getWorkShop())
                    .collect(Collectors.groupingBy(ApsStandardProcess::getWorkShop,
                            Collectors.mapping(ApsStandardProcess::getProcessName, Collectors.toList())
                    ));
@@ -179,18 +177,22 @@
                    statsToInsert.add(stat);
                }
            }
            // 批量插入以提高性能
            if (!statsToInsert.isEmpty()) {
                int batchSize = 1000;
                for (int i = 0; i < statsToInsert.size(); i += batchSize) {
                    int end = Math.min(i + batchSize, statsToInsert.size());
                    List<ApsPlateProcessShopStat> batch = statsToInsert.subList(i, end);
                    apsPlateProcessShopStatMapper.batchInsert(batch);
            List<List<ApsPlateProcessStat>> processStatBatchList = ListUtil.split(statList, 1000);
            processStatBatchList.forEach(batch -> apsPlateProcessStatMapper.batchInsertPlateStat(batch));
            List<List<ApsPlateProcessShopStat>> shopStatBatchList = ListUtil.split(statsToInsert, 1000);
            shopStatBatchList.forEach(batch -> apsPlateProcessShopStatMapper.batchInsert(batch));
        }else {
            if(shopProcesses.isEmpty()){
                throw  new RuntimeException("未找到标准工序数据!");
                }
            if(shopList.isEmpty()){
                throw  new RuntimeException("未找到车间数据!");
            }
        } catch (Exception e) {
            log.error("保存钣金车间统计时发生异常", e);
            throw new RuntimeException("保存钣金车间统计失败", e);
            if(planList.isEmpty()){
                throw  new RuntimeException("未找到工单数据!");
            }
        }
    }
@@ -210,7 +212,6 @@
        stat.setWorkCenter(plan.getWorkCenter());
        stat.setProcessNumber(plan.getProcessNumber());
        try {
            List<String> processNames = shopToProcessNames.getOrDefault(shopName, Collections.emptyList());
            if (!processNames.isEmpty()) {
@@ -253,6 +254,7 @@
            }
        } catch (Exception e) {
            log.error("computer error:"+ JSONObject.toJSONString(stat));
            throw new RuntimeException("计算车间统计数据异常!");
        }
        return stat;
    }