|
@@ -6,6 +6,7 @@ import cn.hutool.core.date.LocalDateTimeUtil;
|
|
|
import cn.hutool.core.util.NumberUtil;
|
|
import cn.hutool.core.util.NumberUtil;
|
|
|
import cn.hutool.core.util.ObjUtil;
|
|
import cn.hutool.core.util.ObjUtil;
|
|
|
import cn.hutool.core.util.StrUtil;
|
|
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.ErrorCode;
|
|
|
import cn.iocoder.yudao.framework.common.exception.ServiceException;
|
|
import cn.iocoder.yudao.framework.common.exception.ServiceException;
|
|
|
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
|
|
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.pojo.Pms;
|
|
|
import cn.iocoder.yudao.framework.common.util.date.LocalDateTimeUtils;
|
|
import cn.iocoder.yudao.framework.common.util.date.LocalDateTimeUtils;
|
|
|
import cn.iocoder.yudao.framework.common.util.number.NumberUtils;
|
|
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.framework.security.core.util.SecurityFrameworkUtils;
|
|
|
import cn.iocoder.yudao.module.pms.ThingsModelDTO;
|
|
import cn.iocoder.yudao.module.pms.ThingsModelDTO;
|
|
|
import cn.iocoder.yudao.module.pms.controller.admin.TableDataInfo;
|
|
import cn.iocoder.yudao.module.pms.controller.admin.TableDataInfo;
|
|
@@ -102,13 +104,16 @@ import lombok.Data;
|
|
|
import org.apache.commons.lang3.StringUtils;
|
|
import org.apache.commons.lang3.StringUtils;
|
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
|
import org.springframework.beans.factory.annotation.Value;
|
|
import org.springframework.beans.factory.annotation.Value;
|
|
|
|
|
+import org.springframework.security.access.prepost.PreAuthorize;
|
|
|
import org.springframework.validation.annotation.Validated;
|
|
import org.springframework.validation.annotation.Validated;
|
|
|
import org.springframework.web.bind.annotation.*;
|
|
import org.springframework.web.bind.annotation.*;
|
|
|
import org.springframework.web.client.RestTemplate;
|
|
import org.springframework.web.client.RestTemplate;
|
|
|
|
|
|
|
|
import javax.annotation.Resource;
|
|
import javax.annotation.Resource;
|
|
|
import javax.annotation.security.PermitAll;
|
|
import javax.annotation.security.PermitAll;
|
|
|
|
|
+import javax.servlet.http.HttpServletResponse;
|
|
|
import javax.validation.Valid;
|
|
import javax.validation.Valid;
|
|
|
|
|
+import java.io.IOException;
|
|
|
import java.io.Serializable;
|
|
import java.io.Serializable;
|
|
|
import java.math.BigDecimal;
|
|
import java.math.BigDecimal;
|
|
|
import java.math.RoundingMode;
|
|
import java.math.RoundingMode;
|
|
@@ -123,6 +128,7 @@ import java.util.concurrent.atomic.AtomicInteger;
|
|
|
import java.util.concurrent.atomic.AtomicReference;
|
|
import java.util.concurrent.atomic.AtomicReference;
|
|
|
import java.util.stream.Collectors;
|
|
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.exception.util.ServiceExceptionUtil.exception;
|
|
|
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
|
|
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
|
|
|
import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertList;
|
|
import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertList;
|
|
@@ -2335,6 +2341,72 @@ public class IotStaticController {
|
|
|
@GetMapping("/rh/device/utilizationRate")
|
|
@GetMapping("/rh/device/utilizationRate")
|
|
|
@PermitAll
|
|
@PermitAll
|
|
|
public CommonResult<List<ProjectUtilizationRateVo>> utilizationRate(IotRhDailyReportPageReqVO reqVO) {
|
|
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())) {
|
|
if (ObjUtil.isEmpty(reqVO.getCreateTime())) {
|
|
|
throw exception(IOT_DAILY_REPORT_TIME_NOT_EXISTS);
|
|
throw exception(IOT_DAILY_REPORT_TIME_NOT_EXISTS);
|
|
|
}
|
|
}
|
|
@@ -2980,7 +3052,7 @@ public class IotStaticController {
|
|
|
// 若不在集合中,用集合长度作为索引(排在所有指定项目部之后)
|
|
// 若不在集合中,用集合长度作为索引(排在所有指定项目部之后)
|
|
|
return index != -1 ? index : sortedProjectIds.size();
|
|
return index != -1 ? index : sortedProjectIds.size();
|
|
|
}));
|
|
}));
|
|
|
- return success(rates);
|
|
|
|
|
|
|
+ return rates;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
/**
|