瀏覽代碼

新增总用电量跟峰平谷用电控制日报统计接口

lingpeng.li 5 月之前
父節點
當前提交
a3c5b86344

+ 25 - 16
zgztBus/jeecg-module-lesm/src/main/java/org/jeecg/modules/deviceLesm/service/impl/DeviceRegionServiceImpl.java

@@ -50,7 +50,7 @@ public class DeviceRegionServiceImpl extends ServiceImpl<DeviceRegionMapper, Dev
 
         List<Map<String, Object>> arrayList = new ArrayList<>();
 
-        // 获取前一天的开始和结束时间
+        // 获取天的开始和结束时间
         LocalDate today = LocalDate.now();
         String startOfDayString = today.format(DateTimeFormatter.ofPattern("yyyy-MM-dd")) + " 00:00:00";
         String endOfDayString = today.format(DateTimeFormatter.ofPattern("yyyy-MM-dd")) + " 23:59:59";
@@ -95,37 +95,46 @@ public class DeviceRegionServiceImpl extends ServiceImpl<DeviceRegionMapper, Dev
             List<FpgGatherData> resultList = fpgGatherDataMapper.selectList(fpgGatherDataQueryWrapper);
 
             // 累加 RunCurrent 并设置值到 powerMap
-            BigDecimal realTimeRunCurrent = BigDecimal.ZERO;
-            BigDecimal totalRunCurrent = BigDecimal.ZERO;
+            BigDecimal realTimeActivePower = BigDecimal.ZERO;
+            BigDecimal totalActivePower = BigDecimal.ZERO;
 
             if (resultList != null && !resultList.isEmpty()) {
+                // 按 deviceInformationId 分组并取每组最新数据(按 createTime 降序)
+                Map<String, FpgGatherData> latestDataByDevice = resultList.stream()
+                        .collect(Collectors.groupingBy(
+                                FpgGatherData::getDeviceInformationId,
+                                Collectors.collectingAndThen(
+                                        Collectors.maxBy(Comparator.comparing(FpgGatherData::getCreateTime)),
+                                        Optional::get
+                                )
+                        ));
                 // 累加 RunCurrent,判空处理
-                totalRunCurrent = resultList.stream()
-                        .map(FpgGatherData::getRunCurrent)
+                totalActivePower = resultList.stream()
+                        .map(FpgGatherData::getActivePower)
                         .filter(Objects::nonNull)  // 过滤掉 null 值
                         .reduce(BigDecimal.ZERO, BigDecimal::add);
 
-                // 获取第一个数据的 RunCurrent(最新值,按降序排列后第一个),判空处理
-                realTimeRunCurrent = resultList.get(0).getRunCurrent();
-                if (realTimeRunCurrent == null) {
-                    realTimeRunCurrent = BigDecimal.ZERO;  // 如果为 null,设置为零
-                }
+                // 累加每组最新数据的 RunCurrent
+                realTimeActivePower = latestDataByDevice.values().stream()
+                        .map(FpgGatherData::getActivePower)
+                        .filter(Objects::nonNull)  // 过滤掉 null 值
+                        .reduce(BigDecimal.ZERO, BigDecimal::add);
             }
 
             // 更新区域实时和累计功率到 powerMap
-            powerMap.put(deviceRegion.getRegionTitle() + "实时总功率", realTimeRunCurrent);
-            powerMap.put(deviceRegion.getRegionTitle() + "累计总功率", totalRunCurrent);
+            powerMap.put(deviceRegion.getRegionTitle() + "实时总功率", realTimeActivePower);
+            powerMap.put(deviceRegion.getRegionTitle() + "累计总功率", totalActivePower);
 
             // 累加到公司实时和累计功率
-            companyRealTimeTotalPower = companyRealTimeTotalPower.add(realTimeRunCurrent);
-            companyAccumulatedTotalPower = companyAccumulatedTotalPower.add(totalRunCurrent);
+            companyRealTimeTotalPower = companyRealTimeTotalPower.add(realTimeActivePower);
+            companyAccumulatedTotalPower = companyAccumulatedTotalPower.add(totalActivePower);
 
 
             Date todayDate = new Date();
-            // 使用 Calendar 获取前一天日期
+            // 使用 Calendar 获取天日期
             Calendar calendar = Calendar.getInstance();
             calendar.setTime(todayDate);
-            calendar.add(Calendar.DAY_OF_YEAR, -0);  // 减去一天
+            calendar.add(Calendar.DAY_OF_YEAR, -0);
 
             // 获取前一天的日期
             Date yesterdayDate = calendar.getTime();

+ 19 - 0
zgztBus/jeecg-module-lesm/src/main/java/org/jeecg/modules/fpgLeanModel/controller/FpgLeanModelController.java

@@ -253,4 +253,23 @@ public class FpgLeanModelController extends JeecgController<FpgLeanModel, IFpgLe
 
 		return result;
 	}
+
+
+	@ApiOperation(value="总用电量报表", notes="总用电量报表")
+	@GetMapping(value = "/totalElectricityConsumptionReport")
+	public JSONObject totalElectricityConsumptionReport() {
+
+		JSONObject result = fpgLeanModelService.totalElectricityConsumptionReport();
+
+		return result;
+	}
+
+	@ApiOperation(value="峰平谷用电控制日报", notes="峰平谷用电控制日报")
+	@GetMapping(value = "/electricityControl")
+	public JSONObject electricityControl() {
+
+		JSONObject result = fpgLeanModelService.electricityControl();
+
+		return result;
+	}
 }

+ 11 - 0
zgztBus/jeecg-module-lesm/src/main/java/org/jeecg/modules/fpgLeanModel/entity/DeviceStatiscsModelMongodb.java

@@ -131,4 +131,15 @@ public class DeviceStatiscsModelMongodb {
     /**创建时间*/
     @ApiModelProperty(value = "创建时间")
     private Date createTime;
+    /**设备名称*/
+    @ApiModelProperty(value = "设备名称")
+    private String deviceTitle;
+    /**区域名称*/
+    @ApiModelProperty(value = "区域名称")
+    private String regionTitle;
+    /**设备类型名称*/
+    @ApiModelProperty(value = "设备类型名称")
+    private String deviceTypeName;
+
+
 }

+ 33 - 0
zgztBus/jeecg-module-lesm/src/main/java/org/jeecg/modules/fpgLeanModel/entity/ElectricityControlReport.java

@@ -0,0 +1,33 @@
+package org.jeecg.modules.fpgLeanModel.entity;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+@Data
+public class ElectricityControlReport {
+
+    @ApiModelProperty(value = "设备名称")
+    private String deviceTitle;
+    @ApiModelProperty(value = "区域名称")
+    private String regionTitle;
+    @ApiModelProperty(value = "区域名称")
+    private String deviceTypeName;
+    /**区域ID*/
+    @ApiModelProperty(value = "区域ID")
+    private String deviceRegionId;
+    /**设备id*/
+    @ApiModelProperty(value = "设备id")
+    private String deviceInformationId;
+    @ApiModelProperty(value = "峰平谷名称")
+    private String key;
+    @ApiModelProperty(value = "值")
+    private BigDecimal value;
+    /**创建时间*/
+    @ApiModelProperty(value = "创建时间")
+    private String createTime;
+
+    @ApiModelProperty(value = "峰平谷名称百分比")
+    private String key1;
+}

+ 92 - 26
zgztBus/jeecg-module-lesm/src/main/java/org/jeecg/modules/fpgLeanModel/entity/ModelReportFormResult.java

@@ -9,83 +9,147 @@ import java.math.BigDecimal;
 public class ModelReportFormResult {
     @ApiModelProperty(value = "设备名称")
     private String deviceTitle;
-    /**采集点ID*/
+    /**
+     * 采集点ID
+     */
     @ApiModelProperty(value = "采集点ID")
     private String devicePointId;
-    /**区域ID*/
+    /**
+     * 区域ID
+     */
     @ApiModelProperty(value = "区域ID")
     private String deviceRegionId;
-    /**设备id*/
+    /**
+     * 设备id
+     */
     @ApiModelProperty(value = "设备id")
     private String deviceInformationId;
-    /**运行时长*/
+    /**
+     * 运行时长
+     */
     @ApiModelProperty(value = "运行时长")
     private BigDecimal ingTime;
-    /**运行总电流*/
+    /**
+     * 运行总电流
+     */
     @ApiModelProperty(value = "运行总电流")
     private BigDecimal selectricCurrent;
-    /**运行总功率*/
+    /**
+     * 运行总功率
+     */
     @ApiModelProperty(value = "运行总功率")
     private BigDecimal power;
-    /**尖总功率*/
+    /**
+     * 尖总功率
+     */
     @ApiModelProperty(value = "尖总功率")
     private BigDecimal topsPower;
-    /**峰总功率*/
+    /**
+     * 峰总功率
+     */
     @ApiModelProperty(value = "峰总功率")
     private BigDecimal peaksPower;
-    /**平总功率*/
+    /**
+     * 平总功率
+     */
     @ApiModelProperty(value = "平总功率")
     private BigDecimal flatPower;
-    /**谷总功率*/
+    /**
+     * 谷总功率
+     */
     @ApiModelProperty(value = "谷总功率")
     private BigDecimal valleysPower;
-    /**尖运行时长*/
+    /**
+     * 尖运行时长
+     */
     @ApiModelProperty(value = "尖运行时长")
     private BigDecimal topsIngTime;
-    /**峰运行时长*/
+    /**
+     * 峰运行时长
+     */
     @ApiModelProperty(value = "峰运行时长")
     private BigDecimal peaksIngTime;
-    /**平运行时长*/
+    /**
+     * 平运行时长
+     */
     @ApiModelProperty(value = "平运行时长")
     private BigDecimal flatIngTime;
-    /**谷运行时长*/
+    /**
+     * 谷运行时长
+     */
     @ApiModelProperty(value = "谷运行时长")
     private BigDecimal valleysIngTime;
-    /**尖电流*/
+    /**
+     * 尖电流
+     */
     @ApiModelProperty(value = "尖电流")
     private BigDecimal topsSelectricCurrent;
-    /**峰电流*/
+    /**
+     * 峰电流
+     */
     @ApiModelProperty(value = "峰电流")
     private BigDecimal peaksSelectricCurrent;
-    /**平电流*/
+    /**
+     * 平电流
+     */
     @ApiModelProperty(value = "平电流")
     private BigDecimal flatSelectricCurrent;
-    /**谷电流*/
+    /**
+     * 谷电流
+     */
     @ApiModelProperty(value = "谷电流")
     private BigDecimal valleysSelectricCurrent;
-    /**尖占比%*/
+    /**
+     * 尖占比%
+     */
     @ApiModelProperty(value = "尖占比%")
     private BigDecimal topsProportion;
-    /**峰占比%*/
+    /**
+     * 峰占比%
+     */
     @ApiModelProperty(value = "峰占比%")
     private BigDecimal peaksProportion;
-    /**平占比%*/
+    /**
+     * 平占比%
+     */
     @ApiModelProperty(value = "平占比%")
     private BigDecimal flatProportion;
-    /**谷占比%*/
+    /**
+     * 谷占比%
+     */
     @ApiModelProperty(value = "谷占比%")
     private BigDecimal valleysProportion;
-    /**占比处理%*/
+    /**
+     * 占比处理%
+     */
     @ApiModelProperty(value = "占比处理")
     private Integer proportion;
-    /**日期*/
+    /**
+     * 日期
+     */
     @ApiModelProperty(value = "日期")
     private String dates;
-    /**创建时间*/
+    /**
+     * 创建时间
+     */
     @ApiModelProperty(value = "创建时间")
     private String createTime;
 
-    public ModelReportFormResult(String deviceTitle, String devicePointId, String deviceRegionId, String deviceInformationId, BigDecimal ingTime, BigDecimal selectricCurrent, BigDecimal power, BigDecimal topsPower, BigDecimal peaksPower, BigDecimal flatPower, BigDecimal valleysPower, BigDecimal topsIngTime, BigDecimal peaksIngTime, BigDecimal flatIngTime, BigDecimal valleysIngTime, BigDecimal topsSelectricCurrent, BigDecimal peaksSelectricCurrent, BigDecimal flatSelectricCurrent, BigDecimal valleysSelectricCurrent, BigDecimal topsProportion, BigDecimal peaksProportion, BigDecimal flatProportion, BigDecimal valleysProportion, Integer proportion, String dates, String createTime) {
+    /**
+     * 区域名称
+     */
+    @ApiModelProperty(value = "区域名称")
+    private String regionName;
+
+
+    /**
+     * 设备类型名称
+     */
+    @ApiModelProperty(value = "设备类型名称")
+    private String deviceTypeName;
+
+
+    public ModelReportFormResult(String deviceTitle, String devicePointId, String deviceRegionId, String deviceInformationId, BigDecimal ingTime, BigDecimal selectricCurrent, BigDecimal power, BigDecimal topsPower, BigDecimal peaksPower, BigDecimal flatPower, BigDecimal valleysPower, BigDecimal topsIngTime, BigDecimal peaksIngTime, BigDecimal flatIngTime, BigDecimal valleysIngTime, BigDecimal topsSelectricCurrent, BigDecimal peaksSelectricCurrent, BigDecimal flatSelectricCurrent, BigDecimal valleysSelectricCurrent, BigDecimal topsProportion, BigDecimal peaksProportion, BigDecimal flatProportion, BigDecimal valleysProportion, Integer proportion, String dates, String createTime, String regionName, String deviceTypeName) {
         this.deviceTitle = deviceTitle;
         this.devicePointId = devicePointId;
         this.deviceRegionId = deviceRegionId;
@@ -112,5 +176,7 @@ public class ModelReportFormResult {
         this.proportion = proportion;
         this.dates = dates;
         this.createTime = createTime;
+        this.regionName = regionName;
+        this.deviceTypeName = deviceTypeName;
     }
 }

+ 4 - 0
zgztBus/jeecg-module-lesm/src/main/java/org/jeecg/modules/fpgLeanModel/service/IFpgLeanModelService.java

@@ -25,4 +25,8 @@ public interface IFpgLeanModelService extends IService<FpgLeanModel> {
     List<DeviceStatiscsModelMongodb> queryRealTimeDataById(String deviceInformationId);
 
     JSONObject queryFpgPowerDataByLeanModelCode(String leanModelCode);
+
+    JSONObject totalElectricityConsumptionReport();
+
+    JSONObject electricityControl();
 }

+ 277 - 2
zgztBus/jeecg-module-lesm/src/main/java/org/jeecg/modules/fpgLeanModel/service/impl/FpgLeanModelServiceImpl.java

@@ -12,7 +12,9 @@ import lombok.extern.slf4j.Slf4j;
 import org.jeecg.common.util.DateUtils;
 import org.jeecg.common.util.oConvertUtils;
 import org.jeecg.modules.deviceLesm.entity.DeviceInformation;
+import org.jeecg.modules.deviceLesm.entity.DeviceRegion;
 import org.jeecg.modules.deviceLesm.mapper.DeviceInformationMapper;
+import org.jeecg.modules.deviceLesm.mapper.DeviceRegionMapper;
 import org.jeecg.modules.fpgLeanModel.entity.*;
 import org.jeecg.modules.fpgLeanModel.mapper.FpgLeanModelMapper;
 import org.jeecg.modules.fpgLeanModel.service.IFpgLeanModelService;
@@ -49,6 +51,9 @@ public class FpgLeanModelServiceImpl extends ServiceImpl<FpgLeanModelMapper, Fpg
     @Autowired
     private DeviceInformationMapper deviceInformationMapper;
 
+    @Autowired
+    private DeviceRegionMapper deviceRegionMapper;
+
     @Autowired
     private MongoTemplate mongoTemplate;
 
@@ -146,7 +151,7 @@ public class FpgLeanModelServiceImpl extends ServiceImpl<FpgLeanModelMapper, Fpg
 
         // 执行查询
         List<DeviceStatiscsModelMongodb> deviceStatiscsModelMongodbList = mongoTemplate.find(query, DeviceStatiscsModelMongodb.class, "leanmodel_run_realtime");
-        if (oConvertUtils.listIsEmpty(deviceStatiscsModelMongodbList)){
+        if (oConvertUtils.listIsEmpty(deviceStatiscsModelMongodbList)) {
             log.info("{}{}", "leanmodel_run_realtime折线图峰平谷大屏通过设备id查询实时功率和电流为空", deviceInformationId);
             return new ArrayList<>();
         }
@@ -208,7 +213,7 @@ public class FpgLeanModelServiceImpl extends ServiceImpl<FpgLeanModelMapper, Fpg
                                 b.getIngTime(), b.getSelectricCurrent(), b.getPower(), b.getTopsPower(), b.getPeaksPower(), b.getFlatPower(), b.getValleysPower(),
                                 b.getTopsIngTime(), b.getPeaksIngTime(), b.getFlatIngTime(), b.getValleysIngTime(),
                                 b.getTopsSelectricCurrent(), b.getPeaksSelectricCurrent(), b.getFlatSelectricCurrent(), b.getValleysSelectricCurrent(),
-                                b.getTopsProportion(), b.getPeaksProportion(), b.getFlatProportion(), b.getValleysProportion(), b.getProportion(), b.getDates(), dateString);
+                                b.getTopsProportion(), b.getPeaksProportion(), b.getFlatProportion(), b.getValleysProportion(), b.getProportion(), b.getDates(), dateString, null, null);
                     }
                     return null;
                 }).filter(x -> x != null).collect(Collectors.toList());
@@ -300,6 +305,263 @@ public class FpgLeanModelServiceImpl extends ServiceImpl<FpgLeanModelMapper, Fpg
         return result;
     }
 
+    @Override
+    public JSONObject totalElectricityConsumptionReport() {
+
+        JSONObject result = new JSONObject();
+        Query query = new Query();
+        query.with(Sort.by(Sort.Direction.ASC, "createTime"));
+        List<DeviceStatiscsModelMongodb> fpgStatiscsModelDataList = mongoTemplate.find(query, DeviceStatiscsModelMongodb.class, "total_day_powerproportioncurrent");
+
+        if (oConvertUtils.listIsEmpty(fpgStatiscsModelDataList)) {
+            log.info("{}{}", "mongo数据查询为空,峰平谷报表导出失败!", "total_day_powerproportioncurrent");
+            result.put("data", new JSONArray());
+            return result;
+        }
+
+        List<String> deviceInformationIds = fpgStatiscsModelDataList.stream()
+                .map(DeviceStatiscsModelMongodb::getDeviceInformationId)
+                .collect(Collectors.toList());
+
+        LambdaQueryWrapper<DeviceInformation> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.in(DeviceInformation::getId, deviceInformationIds);
+        List<DeviceInformation> deviceInformationList = deviceInformationMapper.selectList(queryWrapper);
+//
+//        Map<String, String> deviceInfoMap = deviceInformationList.stream()
+//                .collect(Collectors.toMap(
+//                        DeviceInformation::getId,          // Key: Device ID
+//                        DeviceInformation::getDeviceTitle // Value: Device Title
+//                ));
+
+//        // 遍历 fpgStatiscsModelDataList,匹配 deviceTitle
+//        fpgStatiscsModelDataList.forEach(data -> {
+//            String deviceTitle = deviceInfoMap.get(data.getDeviceInformationId());
+//            data.setDeviceTitle(deviceTitle); // 赋值 deviceTitle
+//        });
+
+
+        // 将listA转换为以(设备Id, 区域Id)为键的Map
+        Map<String, DeviceInformation> mapA = deviceInformationList.stream()
+                .collect(Collectors.toMap(a -> a.getId() + "_" + a.getDeviceRegionId(), a -> a));
+
+        // 遍历listB,根据相同的(设备Id, 区域Id)与mapA中的对象合并成新的ModelResult并添加到新列表
+        List<ModelReportFormResult> combinedList = fpgStatiscsModelDataList.stream()
+                .map(b -> {
+                    String key = b.getDeviceInformationId() + "_" + b.getDeviceRegionId();
+                    DeviceInformation a = mapA.get(key);
+                    if (a != null) {
+                        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
+                        String dateString = sdf.format(b.getCreateTime());
+                        return new ModelReportFormResult(a.getDeviceTitle(), b.getDevicePointId(), b.getDeviceRegionId(), b.getDeviceInformationId(),
+                                b.getIngTime(), b.getSelectricCurrent(), b.getPower(), b.getTopsPower(), b.getPeaksPower(), b.getFlatPower(), b.getValleysPower(),
+                                b.getTopsIngTime(), b.getPeaksIngTime(), b.getFlatIngTime(), b.getValleysIngTime(),
+                                b.getTopsSelectricCurrent(), b.getPeaksSelectricCurrent(), b.getFlatSelectricCurrent(), b.getValleysSelectricCurrent(),
+                                b.getTopsProportion(), b.getPeaksProportion(), b.getFlatProportion(), b.getValleysProportion(), b.getProportion(), b.getDates(), dateString, null, null);
+                    }
+                    return null;
+                }).filter(x -> x != null).collect(Collectors.toList());
+        JSONArray jsonResult = new JSONArray();
+
+        // 龙钢变各工序报表
+        List<ModelDataResult> modelDataResults = new ArrayList<>();
+        for (ModelReportFormResult modelReportFormResult : combinedList) {
+
+            BigDecimal sum = modelReportFormResult.getTopsPower().add(modelReportFormResult.getPeaksPower()).add(modelReportFormResult.getFlatPower()).add(modelReportFormResult.getValleysPower());
+
+            // 先获取公共属性值,避免在循环内多次重复获取
+            String deviceTitle = modelReportFormResult.getDeviceTitle();
+            String deviceRegionId = modelReportFormResult.getDeviceRegionId();
+            String deviceInformationId = modelReportFormResult.getDeviceInformationId();
+            String createTime = modelReportFormResult.getDates();
+            for (int i = 0; i < 5; i++) {
+                ModelDataResult modelDataResult = new ModelDataResult();
+
+                if (i == 0) {
+                    modelDataResult.setKey("反有总");
+                    modelDataResult.setKey1("反有总");
+                    modelDataResult.setValue(modelReportFormResult.getTopsPower().add(modelReportFormResult.getPeaksPower()).add(modelReportFormResult.getFlatPower()).add(modelReportFormResult.getValleysPower()));
+                }
+                if (i == 1) {
+                    modelDataResult.setKey("尖");
+                    modelDataResult.setKey1("尖");
+                    modelDataResult.setValue(modelReportFormResult.getTopsPower());
+                }
+                if (i == 2) {
+                    modelDataResult.setKey("峰");
+                    modelDataResult.setKey1("峰");
+                    modelDataResult.setValue(modelReportFormResult.getPeaksPower());
+                }
+                if (i == 3) {
+                    modelDataResult.setKey("平");
+                    modelDataResult.setKey1("平");
+                    modelDataResult.setValue(modelReportFormResult.getFlatPower());
+                }
+                if (i == 4) {
+                    modelDataResult.setKey("谷");
+                    modelDataResult.setKey1("谷");
+                    modelDataResult.setValue(modelReportFormResult.getValleysPower());
+                }
+
+                modelDataResult.setDeviceTitle(deviceTitle);
+                modelDataResult.setDeviceRegionId(deviceRegionId);
+                modelDataResult.setDeviceInformationId(deviceInformationId);
+                modelDataResult.setCreateTime(createTime);
+                modelDataResults.add(modelDataResult);
+            }
+        }
+        jsonResult = JSON.parseArray(JSON.toJSONString(modelDataResults));
+
+        log.info("{}{}", "积木报表导出总数:", jsonResult.size());
+        result.put("data", jsonResult);
+        return result;
+
+    }
+
+    @Override
+    public JSONObject electricityControl() {
+
+        JSONObject result = new JSONObject();
+        Query query = new Query();
+        query.with(Sort.by(Sort.Direction.ASC, "createTime"));
+        List<DeviceStatiscsModelMongodb> fpgStatiscsModelDataList = mongoTemplate.find(query, DeviceStatiscsModelMongodb.class, "total_day_powerproportioncurrent");
+
+        if (oConvertUtils.listIsEmpty(fpgStatiscsModelDataList)) {
+            log.info("{}{}", "mongo数据查询为空,峰平谷报表导出失败!", "total_day_powerproportioncurrent");
+            result.put("data", new JSONArray());
+            return result;
+        }
+
+        List<String> deviceInformationIds = fpgStatiscsModelDataList.stream()
+                .map(DeviceStatiscsModelMongodb::getDeviceInformationId)
+                .collect(Collectors.toList());
+
+        LambdaQueryWrapper<DeviceInformation> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.in(DeviceInformation::getId, deviceInformationIds);
+        List<DeviceInformation> deviceInformationList = deviceInformationMapper.selectList(queryWrapper);
+
+
+        List<String> regionIds = fpgStatiscsModelDataList.stream()
+                .map(DeviceStatiscsModelMongodb::getDeviceRegionId)
+                .collect(Collectors.toList());
+
+        LambdaQueryWrapper<DeviceRegion> regionLambdaQueryWrapper = new LambdaQueryWrapper<>();
+        regionLambdaQueryWrapper.in(DeviceRegion::getId, regionIds);
+        List<DeviceRegion> deviceRegionList = deviceRegionMapper.selectList(regionLambdaQueryWrapper);
+
+        Map<String, String> regionMap = deviceRegionList.stream()
+                .collect(Collectors.toMap(
+                        DeviceRegion::getId,          // Key: Device ID
+                        DeviceRegion::getRegionTitle // Value: Device Title
+                ));
+
+        // 遍历 fpgStatiscsModelDataList,匹配 deviceTitle
+        fpgStatiscsModelDataList.forEach(data -> {
+            String regionTitle = regionMap.get(data.getDeviceRegionId());
+            data.setRegionTitle(regionTitle); // 赋值 regionTitle
+        });
+
+
+        // 将listA转换为以(设备Id, 区域Id)为键的Map
+        Map<String, DeviceInformation> mapA = deviceInformationList.stream()
+                .collect(Collectors.toMap(a -> a.getId() + "_" + a.getDeviceRegionId(), a -> a));
+
+        // 遍历listB,根据相同的(设备Id, 区域Id)与mapA中的对象合并成新的ModelResult并添加到新列表
+        List<ModelReportFormResult> combinedList = fpgStatiscsModelDataList.stream()
+                .map(b -> {
+                    String key = b.getDeviceInformationId() + "_" + b.getDeviceRegionId();
+                    DeviceInformation a = mapA.get(key);
+                    if (a != null) {
+                        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
+                        String dateString = sdf.format(b.getCreateTime());
+                        return new ModelReportFormResult(a.getDeviceTitle(), b.getDevicePointId(), b.getDeviceRegionId(), b.getDeviceInformationId(),
+                                b.getIngTime(), b.getSelectricCurrent(), b.getPower(), b.getTopsPower(), b.getPeaksPower(), b.getFlatPower(), b.getValleysPower(),
+                                b.getTopsIngTime(), b.getPeaksIngTime(), b.getFlatIngTime(), b.getValleysIngTime(),
+                                b.getTopsSelectricCurrent(), b.getPeaksSelectricCurrent(), b.getFlatSelectricCurrent(), b.getValleysSelectricCurrent(),
+                                b.getTopsProportion(), b.getPeaksProportion(), b.getFlatProportion(), b.getValleysProportion(), b.getProportion(), b.getDates(), dateString, b.getRegionTitle(), mapDeviceType(a.getDeviceType()));
+                    }
+                    return null;
+                }).filter(x -> x != null).collect(Collectors.toList());
+        JSONArray jsonResult = new JSONArray();
+
+        // 龙钢变各工序报表
+        List<ElectricityControlReport> modelDataResults = new ArrayList<>();
+        for (ModelReportFormResult modelReportFormResult : combinedList) {
+
+            BigDecimal sum = modelReportFormResult.getTopsPower().add(modelReportFormResult.getPeaksPower()).add(modelReportFormResult.getFlatPower()).add(modelReportFormResult.getValleysPower());
+
+            // 先获取公共属性值,避免在循环内多次重复获取
+            String deviceTitle = modelReportFormResult.getDeviceTitle();
+            String deviceRegionId = modelReportFormResult.getDeviceRegionId();
+            String deviceInformationId = modelReportFormResult.getDeviceInformationId();
+            String createTime = modelReportFormResult.getDates();
+            String regionTitle = modelReportFormResult.getRegionName();
+            String deviceTypeName = modelReportFormResult.getDeviceTypeName();
+            for (int i = 0; i < 9; i++) {
+
+                ElectricityControlReport modelDataResult = new ElectricityControlReport();
+                if (i == 0) {
+                    modelDataResult.setKey("总");
+                    modelDataResult.setKey1("总");
+                    modelDataResult.setValue(modelReportFormResult.getTopsPower().add(modelReportFormResult.getPeaksPower()).add(modelReportFormResult.getFlatPower()).add(modelReportFormResult.getValleysPower()));
+                }
+                if (i == 1) {
+                    modelDataResult.setKey("尖");
+                    modelDataResult.setKey1("尖");
+                    modelDataResult.setValue(modelReportFormResult.getTopsPower());
+                }
+                if (i == 2) {
+                    modelDataResult.setKey("尖");
+                    modelDataResult.setKey1("尖(%)");
+                    modelDataResult.setValue(modelReportFormResult.getTopsPower().divide(sum, 4, RoundingMode.HALF_UP).multiply(new BigDecimal("100")).setScale(2, RoundingMode.HALF_UP));
+                }
+                if (i == 3) {
+                    modelDataResult.setKey("峰");
+                    modelDataResult.setKey1("峰");
+                    modelDataResult.setValue(modelReportFormResult.getPeaksPower());
+                }
+                if (i == 4) {
+                    modelDataResult.setKey("峰");
+                    modelDataResult.setKey1("峰(%)");
+                    modelDataResult.setValue(modelReportFormResult.getPeaksPower().divide(sum, 4, RoundingMode.HALF_UP).multiply(new BigDecimal("100")).setScale(2, RoundingMode.HALF_UP));
+                }
+                if (i == 5) {
+                    modelDataResult.setKey("平");
+                    modelDataResult.setKey1("平");
+                    modelDataResult.setValue(modelReportFormResult.getFlatPower());
+                }
+                if (i == 6) {
+                    modelDataResult.setKey("平");
+                    modelDataResult.setKey1("平(%)");
+                    modelDataResult.setValue(modelReportFormResult.getFlatPower().divide(sum, 4, RoundingMode.HALF_UP).multiply(new BigDecimal("100")).setScale(2, RoundingMode.HALF_UP));
+                }
+                if (i == 7) {
+                    modelDataResult.setKey("谷");
+                    modelDataResult.setKey1("谷");
+                    modelDataResult.setValue(modelReportFormResult.getValleysPower());
+                }
+                if (i == 8) {
+                    modelDataResult.setKey("谷");
+                    modelDataResult.setKey1("谷(%)");
+                    modelDataResult.setValue(modelReportFormResult.getValleysPower().divide(sum, 4, RoundingMode.HALF_UP).multiply(new BigDecimal("100")).setScale(2, RoundingMode.HALF_UP));
+                }
+
+
+                modelDataResult.setDeviceTitle(deviceTitle);
+                modelDataResult.setDeviceRegionId(deviceRegionId);
+                modelDataResult.setDeviceInformationId(deviceInformationId);
+                modelDataResult.setCreateTime(createTime);
+                modelDataResult.setRegionTitle(regionTitle);
+                modelDataResult.setDeviceTypeName(deviceTypeName);
+                modelDataResults.add(modelDataResult);
+            }
+        }
+        jsonResult = JSON.parseArray(JSON.toJSONString(modelDataResults));
+
+        log.info("{}{}", "积木报表导出总数:", jsonResult.size());
+        result.put("data", jsonResult);
+        return result;
+    }
+
     /**
      * 基于模型编码、采集点ID、设备ID、区域ID、峰平谷配置时间范围 动态查询mongoDB
      *
@@ -409,4 +671,17 @@ public class FpgLeanModelServiceImpl extends ServiceImpl<FpgLeanModelMapper, Fpg
         modelDataResult.setCreateTime(modelReportFormResult.getCreateTime());
     }
 
+    public String mapDeviceType(String deviceType) {
+        // 定义映射关系
+        Map<String, String> deviceTypeMap = new HashMap<>();
+        deviceTypeMap.put("1", "棒一");
+        deviceTypeMap.put("2", "棒二");
+        deviceTypeMap.put("3", "棒三");
+        deviceTypeMap.put("4", "高线");
+        deviceTypeMap.put("5", "板带");
+
+        // 返回映射值,如果找不到对应的 key,则返回默认值
+        return deviceTypeMap.getOrDefault(deviceType, "");
+    }
+
 }