Bladeren bron

pms 瑞恒看板 生产动态列表导出时 设置 汇总字段换行。

zhangcl 2 dagen geleden
bovenliggende
commit
d00464ce21

+ 73 - 1
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/stat/IotStaticController.java

@@ -6,6 +6,7 @@ import cn.hutool.core.date.LocalDateTimeUtil;
 import cn.hutool.core.util.NumberUtil;
 import cn.hutool.core.util.ObjUtil;
 import cn.hutool.core.util.StrUtil;
+import cn.iocoder.yudao.framework.apilog.core.annotation.ApiAccessLog;
 import cn.iocoder.yudao.framework.common.exception.ErrorCode;
 import cn.iocoder.yudao.framework.common.exception.ServiceException;
 import cn.iocoder.yudao.framework.common.pojo.CommonResult;
@@ -14,6 +15,7 @@ import cn.iocoder.yudao.framework.common.pojo.PageResult;
 import cn.iocoder.yudao.framework.common.pojo.Pms;
 import cn.iocoder.yudao.framework.common.util.date.LocalDateTimeUtils;
 import cn.iocoder.yudao.framework.common.util.number.NumberUtils;
+import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
 import cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils;
 import cn.iocoder.yudao.module.pms.ThingsModelDTO;
 import cn.iocoder.yudao.module.pms.controller.admin.TableDataInfo;
@@ -102,13 +104,16 @@ import lombok.Data;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
+import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.client.RestTemplate;
 
 import javax.annotation.Resource;
 import javax.annotation.security.PermitAll;
+import javax.servlet.http.HttpServletResponse;
 import javax.validation.Valid;
+import java.io.IOException;
 import java.io.Serializable;
 import java.math.BigDecimal;
 import java.math.RoundingMode;
@@ -123,6 +128,7 @@ import java.util.concurrent.atomic.AtomicInteger;
 import java.util.concurrent.atomic.AtomicReference;
 import java.util.stream.Collectors;
 
+import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.EXPORT;
 import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
 import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
 import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertList;
@@ -2335,6 +2341,72 @@ public class IotStaticController {
     @GetMapping("/rh/device/utilizationRate")
     @PermitAll
     public CommonResult<List<ProjectUtilizationRateVo>> utilizationRate(IotRhDailyReportPageReqVO reqVO) {
+        List<ProjectUtilizationRateVo> productionStatuses = rhProductionStatusList(reqVO);
+        return success(productionStatuses);
+    }
+
+
+    @GetMapping("/exportRhDashboard")
+    @Operation(summary = "导出瑞恒看板生产动态列表")
+    @PreAuthorize("@ss.hasPermission('pms:iot-rh-daily-report:export')")
+    @ApiAccessLog(operateType = EXPORT)
+    public void exportRhDashboard(@Valid IotRhDailyReportPageReqVO reqVO, HttpServletResponse response) throws IOException {
+        List<ProjectUtilizationRateVo> productionStatuses = rhProductionStatusList(reqVO);
+        // 汇总 注入量(日注气 累注气 日注水 累注水) 运行时效(当日运行时效 平均运行时效)
+        if (CollUtil.isNotEmpty(productionStatuses)) {
+            // 百分比格式化:保留2位小数,自动乘100加%
+            DecimalFormat percentFormat = new DecimalFormat("#0.00%");
+            percentFormat.setRoundingMode(RoundingMode.HALF_UP);
+
+            productionStatuses.forEach(status -> {
+                List<String> injectLines = new ArrayList<>();
+                List<String> rateLines = new ArrayList<>();
+                // 将 日注气 累注气 日注水 累注水 汇总到 注入量injectionVolume
+                // 将 当日运行时效 平均运行时效 汇总到 运行时效runningAvailability
+                BigDecimal gasInjection = status.getGasInjection();
+                BigDecimal yearGasInjection = status.getYearGasInjection();
+                BigDecimal waterInjection = status.getWaterInjection();
+                BigDecimal yearWaterInjection = status.getYearWaterInjection();
+                BigDecimal hourRate = status.getHourUtilizationRate();
+                BigDecimal yearRate = status.getYearHourUtilizationRate();
+                if (ObjUtil.isNotEmpty(gasInjection) && gasInjection.compareTo(BigDecimal.ZERO) > 0) {
+                    injectLines.add("日注气:" + gasInjection);
+                }
+                if (ObjUtil.isNotEmpty(yearGasInjection) && yearGasInjection.compareTo(BigDecimal.ZERO) > 0) {
+                    injectLines.add("累注气:" + yearGasInjection);
+                }
+                if (ObjUtil.isNotEmpty(waterInjection) && waterInjection.compareTo(BigDecimal.ZERO) > 0) {
+                    injectLines.add("日注水:" + waterInjection);
+                }
+                if (ObjUtil.isNotEmpty(yearWaterInjection) && yearWaterInjection.compareTo(BigDecimal.ZERO) > 0) {
+                    injectLines.add("累注水:" + yearWaterInjection);
+                }
+                String injectStr = injectLines.stream().collect(Collectors.joining("\n"));
+                status.setInjectionVolume(injectStr);
+
+                if (ObjUtil.isNotEmpty(hourRate) && hourRate.compareTo(BigDecimal.ZERO) > 0) {
+                    // 原始4位小数,转百分比保留两位
+                    String hourPercent = percentFormat.format(hourRate);
+                    rateLines.add("当日运行时效:" + hourPercent);
+                }
+                if (ObjUtil.isNotEmpty(yearRate) && yearRate.compareTo(BigDecimal.ZERO) > 0) {
+                    String yearPercent = percentFormat.format(yearRate);
+                    rateLines.add("平均运行时效:" + yearPercent);
+                }
+                // 拼接外层星号
+                String rateStr = rateLines.stream().collect(Collectors.joining("\n"));
+                status.setRunningAvailability(rateStr);
+            });
+        }
+        // 导出 Excel
+        ExcelUtils.write(response, "瑞恒生产动态列表.xls", "瑞恒生产动态列表", ProjectUtilizationRateVo.class,
+                productionStatuses);
+    }
+
+    /**
+     * 查询 瑞恒看板 生产动态列表
+     */
+    private List<ProjectUtilizationRateVo> rhProductionStatusList(IotRhDailyReportPageReqVO reqVO) {
         if (ObjUtil.isEmpty(reqVO.getCreateTime())) {
             throw exception(IOT_DAILY_REPORT_TIME_NOT_EXISTS);
         }
@@ -2980,7 +3052,7 @@ public class IotStaticController {
             // 若不在集合中,用集合长度作为索引(排在所有指定项目部之后)
             return index != -1 ? index : sortedProjectIds.size();
         }));
-        return success(rates);
+        return rates;
     }
 
     /**

+ 26 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/stat/vo/ProjectUtilizationRateVo.java

@@ -1,5 +1,9 @@
 package cn.iocoder.yudao.module.pms.controller.admin.stat.vo;
 
+import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.alibaba.excel.annotation.write.style.ContentStyle;
+import com.alibaba.excel.enums.BooleanEnum;
 import lombok.Data;
 import lombok.ToString;
 
@@ -10,6 +14,7 @@ import java.math.BigDecimal;
  */
 @Data
 @ToString(callSuper = true)
+@ExcelIgnoreUnannotated
 public class ProjectUtilizationRateVo {
     /**
      * 项目部id
@@ -18,22 +23,27 @@ public class ProjectUtilizationRateVo {
     /**
      * 项目部名称
      */
+    @ExcelProperty("项目部")
     private String projectDeptName;
     /**
      * 队伍总数
      */
+    @ExcelProperty("队伍总数")
     private Integer teamCount;
     /**
      * 施工队伍数量
      */
+    @ExcelProperty("施工队伍")
     private Integer sgTeamCount;
     /**
      * 准备队伍数量
      */
+    @ExcelProperty("施工准备")
     private Integer zbTeamCount;
     /**
      * 待命队伍数量
      */
+    @ExcelProperty("待命")
     private Integer dmTeamCount;
     /**
      * 累计天数
@@ -81,6 +91,20 @@ public class ProjectUtilizationRateVo {
      */
     private BigDecimal yearGasInjection;
 
+    /**
+     * 汇总 注气 注水 的注入量
+     */
+    @ContentStyle(wrapped = BooleanEnum.TRUE)
+    @ExcelProperty("注入量(万方)")
+    private String injectionVolume;
+
+    /**
+     * 汇总 当日运行时效 平均运行时效 的运行时效
+     */
+    @ContentStyle(wrapped = BooleanEnum.TRUE)
+    @ExcelProperty("运行时效")
+    private String runningAvailability;
+
     /**
      * 排序规则
      */
@@ -89,5 +113,7 @@ public class ProjectUtilizationRateVo {
     /**
      * 生产动态概述
      */
+    @ContentStyle(wrapped = BooleanEnum.TRUE)
+    @ExcelProperty("生产动态描述")
     private String productionSummary;
 }