Browse Source

Merge remote-tracking branch 'origin/prod-5.1.3' into prod-5.1.3

zhongwei
haungxing 3 months ago
parent
commit
b2e2b5bff5
  1. 10
      hzims-service-api/big-model-api/src/main/java/com/hnac/hzims/bigmodel/api/dto/BigModelAnalysisRequestDTO.java
  2. 56
      hzims-service-api/big-model-api/src/main/java/com/hnac/hzims/bigmodel/api/dto/BigModelAnalysisResponseDTO.java
  3. 5
      hzims-service-api/big-model-api/src/main/java/com/hnac/hzims/bigmodel/api/feign/IBigModelAnalysisClient.java
  4. 18
      hzims-service-api/hzims-operational-api/src/main/java/com/hnac/hzims/operational/homePage/Hydroelectric/constant/HydroelectricConstant.java
  5. 48
      hzims-service-api/hzims-operational-api/src/main/java/com/hnac/hzims/operational/homePage/Hydroelectric/vo/HydroelectricAreaStationVo.java
  6. 70
      hzims-service-api/hzims-operational-api/src/main/java/com/hnac/hzims/operational/homePage/Hydroelectric/vo/HydroelectricAreaVo.java
  7. 2
      hzims-service-api/hzims-operational-api/src/main/java/com/hnac/hzims/operational/homePage/Hydroelectric/vo/HydroelectricDeviceGenerateVo.java
  8. 2
      hzims-service-api/hzims-operational-api/src/main/java/com/hnac/hzims/operational/homePage/Hydroelectric/vo/HydroelectricDevicePowerVo.java
  9. 6
      hzims-service-api/hzims-operational-api/src/main/java/com/hnac/hzims/operational/homePage/Hydroelectric/vo/HydroelectricGenerateMonVo.java
  10. 21
      hzims-service-api/hzims-operational-api/src/main/java/com/hnac/hzims/operational/homePage/Hydroelectric/vo/HydroelectricGenerateYearVo.java
  11. 45
      hzims-service-api/hzims-operational-api/src/main/java/com/hnac/hzims/operational/homePage/Hydroelectric/vo/HydroelectricGroupAreaVo.java
  12. 70
      hzims-service-api/hzims-operational-api/src/main/java/com/hnac/hzims/operational/homePage/Hydroelectric/vo/HydroelectricGroupVo.java
  13. 2
      hzims-service-api/hzims-operational-api/src/main/java/com/hnac/hzims/operational/homePage/Hydroelectric/vo/HydroelectricStationVo.java
  14. 72
      hzims-service-api/hzims-operational-api/src/main/java/com/hnac/hzims/operational/homePage/hydroelectric/vo/HydroelectricDeviceVo.java
  15. 22
      hzims-service-api/hzims-operational-api/src/main/java/com/hnac/hzims/operational/homePage/hydroelectric/vo/HydroelectricPowerRainVo.java
  16. 2
      hzims-service-api/hzims-operational-api/src/main/java/com/hnac/hzims/operational/main/vo/HydropowerStationVo.java
  17. 1
      hzims-service/equipment/src/main/java/com/hnac/hzims/emParam/controller/ParamController.java
  18. 9
      hzims-service/hzims-big-model/src/main/java/com/hnac/hzims/bigmodel/api/feign/BigModelAnalysisClient.java
  19. 4
      hzims-service/hzims-big-model/src/main/java/com/hnac/hzims/bigmodel/zhipuai/controller/ZhipuAnalysisInfoController.java
  20. 5
      hzims-service/hzims-big-model/src/main/java/com/hnac/hzims/bigmodel/zhipuai/entity/ZhipuAnalysisInfoEntity.java
  21. 6
      hzims-service/hzims-big-model/src/main/java/com/hnac/hzims/bigmodel/zhipuai/handler/AbstractZhipuAnalysisHandler.java
  22. 4
      hzims-service/hzims-big-model/src/main/java/com/hnac/hzims/bigmodel/zhipuai/handler/ResultStrategy.java
  23. 32
      hzims-service/hzims-big-model/src/main/java/com/hnac/hzims/bigmodel/zhipuai/handler/ZhipuAnalyser.java
  24. 12
      hzims-service/hzims-big-model/src/main/java/com/hnac/hzims/bigmodel/zhipuai/handler/ZhipuAnalysisHandlerGlm4v.java
  25. 4
      hzims-service/hzims-big-model/src/main/java/com/hnac/hzims/bigmodel/zhipuai/service/ZhipuAnalysisService.java
  26. 119
      hzims-service/hzims-big-model/src/main/java/com/hnac/hzims/bigmodel/zhipuai/service/impl/ZhipuAnalysisServiceImpl.java
  27. 11
      hzims-service/hzims-big-model/src/main/java/com/hnac/hzims/bigmodel/zhipuai/vo/ZhipuAnalysisFileRequest.java
  28. 2
      hzims-service/hzims-big-model/src/main/java/com/hnac/hzims/bigmodel/zhipuai/vo/ZhipuAnalysisResult.java
  29. 4
      hzims-service/inspect/pom.xml
  30. 30
      hzims-service/inspect/src/main/java/com/hnac/hzinfo/inspect/task/schedule/VideoTaskSchedule.java
  31. 19
      hzims-service/operational/src/main/java/com/hnac/hzims/operational/homePage/controller/HydroelectricController.java
  32. 8
      hzims-service/operational/src/main/java/com/hnac/hzims/operational/homePage/service/HydroelectricService.java
  33. 527
      hzims-service/operational/src/main/java/com/hnac/hzims/operational/homePage/service/impl/HydroelectricServiceImpl.java
  34. 2
      hzims-service/operational/src/main/java/com/hnac/hzims/operational/main/service/impl/HydropowerServiceImpl.java

10
hzims-service-api/big-model-api/src/main/java/com/hnac/hzims/bigmodel/api/dto/BigModelAnalysisDTO.java → hzims-service-api/big-model-api/src/main/java/com/hnac/hzims/bigmodel/api/dto/BigModelAnalysisRequestDTO.java

@ -4,16 +4,22 @@ import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty; import io.swagger.annotations.ApiModelProperty;
import lombok.Data; import lombok.Data;
import javax.validation.constraints.NotNull;
import java.util.List;
/** /**
* @Author: ypj * @Author: ypj
* @Date: 2024/8/12 16:02 * @Date: 2024/8/12 16:02
*/ */
@Data @Data
@ApiModel(value = "大模型分析",description = "大模型分析参数") @ApiModel(value = "大模型分析",description = "大模型分析参数")
public class BigModelAnalysisDTO { public class BigModelAnalysisRequestDTO {
@ApiModelProperty("策略编码") @ApiModelProperty("策略编码")
private String code; private List<String> codeList;
@ApiModelProperty(value = "检测类型子类")
private List<String> checkTypeSonList;
@ApiModelProperty("文件地址或文件的base64文件内容") @ApiModelProperty("文件地址或文件的base64文件内容")
private String url; private String url;

56
hzims-service-api/big-model-api/src/main/java/com/hnac/hzims/bigmodel/api/dto/BigModelAnalysisResponseDTO.java

@ -0,0 +1,56 @@
package com.hnac.hzims.bigmodel.api.dto;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
import java.util.List;
import java.util.Optional;
/**
* @Author: ypj
* @Date: 2024/8/19 10:38
*/
@Data
@ApiModel(description = "分析返回信息")
public class BigModelAnalysisResponseDTO implements Serializable {
private static final long serialVersionUID = 1L;
@ApiModelProperty(value = "是否成功", required = true)
private Boolean success = null;
@ApiModelProperty(value = "分析结果数据列表")
private List<BigModelAnalysisResult> data;
@ApiModelProperty(value = "状态码", required = true)
private int code;
@ApiModelProperty(value = "返回消息")
private String msg;
@Data
@ApiModel(description = "分析结果")
public static class BigModelAnalysisResult implements Serializable {
private static final long serialVersionUID = 1L;
@ApiModelProperty(value = "承载数据")
private Object result;
@ApiModelProperty(value = "结果字符串")
private String resultStr;
@ApiModelProperty(value = "结果描述")
private String description;
@ApiModelProperty(value = "结果描述")
private String checkTypeSon;
}
public Boolean getSuccess() {
return Optional.ofNullable(success).orElse(Boolean.FALSE);
}
}

5
hzims-service-api/big-model-api/src/main/java/com/hnac/hzims/bigmodel/api/feign/IBigModelAnalysisClient.java

@ -1,7 +1,8 @@
package com.hnac.hzims.bigmodel.api.feign; package com.hnac.hzims.bigmodel.api.feign;
import com.hnac.hzims.bigmodel.BigModelConstants; import com.hnac.hzims.bigmodel.BigModelConstants;
import com.hnac.hzims.bigmodel.api.dto.BigModelAnalysisDTO; import com.hnac.hzims.bigmodel.api.dto.BigModelAnalysisRequestDTO;
import com.hnac.hzims.bigmodel.api.dto.BigModelAnalysisResponseDTO;
import org.springblade.core.tool.api.R; import org.springblade.core.tool.api.R;
import org.springframework.cloud.openfeign.FeignClient; import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.PostMapping;
@ -16,5 +17,5 @@ public interface IBigModelAnalysisClient {
String PREFIX_API = "feign/bigModel"; String PREFIX_API = "feign/bigModel";
@PostMapping(PREFIX_API + "/analysis") @PostMapping(PREFIX_API + "/analysis")
R analysis(@RequestBody BigModelAnalysisDTO analysisInfo); BigModelAnalysisResponseDTO analysis(@RequestBody BigModelAnalysisRequestDTO analysisInfo);
} }

18
hzims-service-api/hzims-operational-api/src/main/java/com/hnac/hzims/operational/homePage/Hydroelectric/constant/HydroelectricConstant.java

@ -0,0 +1,18 @@
package com.hnac.hzims.operational.homePage.hydroelectric.constant;
/**
* 水电站首页-常量
* @author ysj
*/
public interface HydroelectricConstant {
/**
* 水电站
*/
Integer HYDROPOWER = 0;
/**
* 代运维
*/
Integer PROXY_OPEARIONAL = 2;
}

48
hzims-service-api/hzims-operational-api/src/main/java/com/hnac/hzims/operational/homePage/Hydroelectric/vo/HydroelectricAreaStationVo.java

@ -0,0 +1,48 @@
package com.hnac.hzims.operational.homePage.hydroelectric.vo;
import com.hnac.hzims.hzimsweather.response.weather.Daily;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.List;
/**
* 集团/区域占比
* @author ysj
*/
@Data
public class HydroelectricAreaStationVo {
@ApiModelProperty(value = "站点机构")
private Long deptId;
@ApiModelProperty(value = "机构ID")
private String stationCode;
@ApiModelProperty(value = "机构名称")
private String stationName;
@ApiModelProperty(value = "站点实时温度")
private String temp;
@ApiModelProperty(value = "七日内天气")
private List<Daily> weather;
@ApiModelProperty(value = "年发电量")
private Double generateYear;
@ApiModelProperty(value = "发电完成率")
private Double generateRate;
@ApiModelProperty(value = "电站利用率")
private Double deviceUse;
@ApiModelProperty(value = "容量利用率")
private Double capacityUse;
@ApiModelProperty(value = "区域/集团发电占比")
private Double areaMakeUp;
@ApiModelProperty(value = "排序")
private Integer sort;
}

70
hzims-service-api/hzims-operational-api/src/main/java/com/hnac/hzims/operational/homePage/Hydroelectric/vo/HydroelectricAreaVo.java

@ -0,0 +1,70 @@
package com.hnac.hzims.operational.homePage.hydroelectric.vo;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.ser.std.NullSerializer;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.List;
/**
* @author ysj
*/
@Data
@ApiModel(value = "水电站首页-区域")
public class HydroelectricAreaVo {
@ApiModelProperty(value = "机构Id")
@JsonSerialize(nullsUsing = NullSerializer.class)
private Long deptId;
@ApiModelProperty(value = "机构名称")
private String deptName;
@ApiModelProperty(value = "站点数量")
@JsonSerialize(nullsUsing = NullSerializer.class)
private Integer count;
@ApiModelProperty(value = "总装机容量")
@JsonSerialize(nullsUsing = NullSerializer.class)
private Double capacity;
@ApiModelProperty(value = "电站总负荷")
@JsonSerialize(nullsUsing = NullSerializer.class)
private Double load;
@ApiModelProperty(value = "容量利用率")
@JsonSerialize(nullsUsing = NullSerializer.class)
private Double capacityRate;
@ApiModelProperty(value = "年发电量")
@JsonSerialize(nullsUsing = NullSerializer.class)
private Double generateYear;
@ApiModelProperty(value = "月发电量")
@JsonSerialize(nullsUsing = NullSerializer.class)
private Double generateMon;
@ApiModelProperty(value = "日发电量")
@JsonSerialize(nullsUsing = NullSerializer.class)
private Double generateDay;
@ApiModelProperty(value = "今年计划发电量")
@JsonSerialize(nullsUsing = NullSerializer.class)
private Double generatePlanYear;
@ApiModelProperty(value = "电量完成吕")
@JsonSerialize(nullsUsing = NullSerializer.class)
private Double generateRate;
@ApiModelProperty(value = "近3年发电对比")
private List<HydroelectricGenerateYearVo> recentYears;
@ApiModelProperty(value = "计划完成完成趋势")
private List<HydroelectricGenerateMonVo> completes;
@ApiModelProperty(value = "电站 :利用情况 && 天气 && 排名")
private List<HydroelectricAreaStationVo> stations;
}

2
hzims-service-api/hzims-operational-api/src/main/java/com/hnac/hzims/operational/homePage/Hydroelectric/vo/HydroelectricDeviceGenerateVo.java

@ -1,4 +1,4 @@
package com.hnac.hzims.operational.homePage.Hydroelectric.vo; package com.hnac.hzims.operational.homePage.hydroelectric.vo;
import com.fasterxml.jackson.databind.annotation.JsonSerialize; import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.ser.std.NullSerializer; import com.fasterxml.jackson.databind.ser.std.NullSerializer;

2
hzims-service-api/hzims-operational-api/src/main/java/com/hnac/hzims/operational/homePage/Hydroelectric/vo/HydroelectricDevicePowerVo.java

@ -1,4 +1,4 @@
package com.hnac.hzims.operational.homePage.Hydroelectric.vo; package com.hnac.hzims.operational.homePage.hydroelectric.vo;
import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty; import io.swagger.annotations.ApiModelProperty;

6
hzims-service-api/hzims-operational-api/src/main/java/com/hnac/hzims/operational/homePage/Hydroelectric/vo/HydroelectricGenerateMonVo.java

@ -1,4 +1,4 @@
package com.hnac.hzims.operational.homePage.Hydroelectric.vo; package com.hnac.hzims.operational.homePage.hydroelectric.vo;
import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty; import io.swagger.annotations.ApiModelProperty;
@ -21,8 +21,8 @@ public class HydroelectricGenerateMonVo {
private String strMonth; private String strMonth;
@ApiModelProperty(value = "月发电量") @ApiModelProperty(value = "月发电量")
private Double power; private Double generate;
@ApiModelProperty(value = "计划发电量") @ApiModelProperty(value = "计划发电量")
private Double planPower; private Double planGenerate;
} }

21
hzims-service-api/hzims-operational-api/src/main/java/com/hnac/hzims/operational/homePage/Hydroelectric/vo/HydroelectricGenerateYearVo.java

@ -0,0 +1,21 @@
package com.hnac.hzims.operational.homePage.hydroelectric.vo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.List;
/**
* @author ysj
*/
@Data
@ApiModel(value = "年发电对象")
public class HydroelectricGenerateYearVo {
@ApiModelProperty(value = "年份")
private Integer year;
@ApiModelProperty(value = "月发电量集合:由1-12月组合")
private List<HydroelectricGenerateMonVo> generateMons;
}

45
hzims-service-api/hzims-operational-api/src/main/java/com/hnac/hzims/operational/homePage/Hydroelectric/vo/HydroelectricGroupAreaVo.java

@ -0,0 +1,45 @@
package com.hnac.hzims.operational.homePage.hydroelectric.vo;
import com.hnac.hzims.hzimsweather.response.weather.Daily;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.List;
/**
* 集团/区域占比
* @author ysj
*/
@Data
public class HydroelectricGroupAreaVo {
@ApiModelProperty(value = "站点机构")
private Long deptId;
@ApiModelProperty(value = "机构名称")
private String deptName;
@ApiModelProperty(value = "站点实时温度")
private String temp;
@ApiModelProperty(value = "七日内天气")
private List<Daily> weather;
@ApiModelProperty(value = "年发电量")
private Double generateYear;
@ApiModelProperty(value = "发电完成率")
private Double generateRate;
@ApiModelProperty(value = "电站利用率")
private Double deviceUse;
@ApiModelProperty(value = "容量利用率")
private Double capacityUse;
@ApiModelProperty(value = "区域/集团发电占比")
private Double areaMakeUp;
@ApiModelProperty(value = "排序")
private Integer sort;
}

70
hzims-service-api/hzims-operational-api/src/main/java/com/hnac/hzims/operational/homePage/Hydroelectric/vo/HydroelectricGroupVo.java

@ -0,0 +1,70 @@
package com.hnac.hzims.operational.homePage.hydroelectric.vo;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.ser.std.NullSerializer;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.List;
/**
* @author ysj
*/
@Data
@ApiModel(value = "水电站首页-站点")
public class HydroelectricGroupVo {
@ApiModelProperty(value = "机构Id")
@JsonSerialize(nullsUsing = NullSerializer.class)
private Long deptId;
@ApiModelProperty(value = "机构名称")
private String deptName;
@ApiModelProperty(value = "站点数量")
@JsonSerialize(nullsUsing = NullSerializer.class)
private Integer count;
@ApiModelProperty(value = "总装机容量")
@JsonSerialize(nullsUsing = NullSerializer.class)
private Double capacity;
@ApiModelProperty(value = "电站总负荷")
@JsonSerialize(nullsUsing = NullSerializer.class)
private Double load;
@ApiModelProperty(value = "容量利用率")
@JsonSerialize(nullsUsing = NullSerializer.class)
private Double capacityRate;
@ApiModelProperty(value = "年发电量")
@JsonSerialize(nullsUsing = NullSerializer.class)
private Double generateYear;
@ApiModelProperty(value = "月发电量")
@JsonSerialize(nullsUsing = NullSerializer.class)
private Double generateMon;
@ApiModelProperty(value = "日发电量")
@JsonSerialize(nullsUsing = NullSerializer.class)
private Double generateDay;
@ApiModelProperty(value = "今年计划发电量")
@JsonSerialize(nullsUsing = NullSerializer.class)
private Double generatePlanYear;
@ApiModelProperty(value = "电量完成吕")
@JsonSerialize(nullsUsing = NullSerializer.class)
private Double generateRate;
@ApiModelProperty(value = "近3年发电对比")
private List<HydroelectricGenerateYearVo> recentYears;
@ApiModelProperty(value = "计划完成完成趋势")
private List<HydroelectricGenerateMonVo> completes;
@ApiModelProperty(value = "电站 :利用情况 && 天气 && 排名")
private List<HydroelectricGroupAreaVo> areas;
}

2
hzims-service-api/hzims-operational-api/src/main/java/com/hnac/hzims/operational/homePage/Hydroelectric/vo/HydroelectricStationVo.java

@ -1,4 +1,4 @@
package com.hnac.hzims.operational.homePage.Hydroelectric.vo; package com.hnac.hzims.operational.homePage.hydroelectric.vo;
import com.hnac.hzims.hzimsweather.response.weather.Daily; import com.hnac.hzims.hzimsweather.response.weather.Daily;
import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModel;

72
hzims-service-api/hzims-operational-api/src/main/java/com/hnac/hzims/operational/homePage/hydroelectric/vo/HydroelectricDeviceVo.java

@ -0,0 +1,72 @@
package com.hnac.hzims.operational.homePage.hydroelectric.vo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.List;
/**
* @author ysj
*/
@Data
@ApiModel(value = "站点首页-设备信息")
public class HydroelectricDeviceVo {
@ApiModelProperty(value = "设备编号")
private String deivceCode;
@ApiModelProperty(value = "设备名称")
private String deivceName;
@ApiModelProperty(value = "开关机状态 : 0 - 关机 1 - 开机")
private Boolean state;
@ApiModelProperty(value = "总装机容量")
private Double installedCapacity;
@ApiModelProperty(value = "有功功率")
private Double activePower;
@ApiModelProperty(value = "容量利用率")
private Double capacityRate;
@ApiModelProperty(value = "无功功率")
private Double reactivePower;
@ApiModelProperty(value = "导叶开度")
private Double guideOpen;
@ApiModelProperty(value = "今日发电量")
private Float powerDay;
@ApiModelProperty(value = "昨日发电量")
private Float powerYesterDay;
@ApiModelProperty(value = "当年发电量")
private Float powerYear;
@ApiModelProperty(value = "去年发电量")
private Float powerYesterYear;
@ApiModelProperty(value = "当月发电量")
private Float powerMon;
@ApiModelProperty(value = "本次开机时间")
private String startDownTime;
@ApiModelProperty(value = "本次开机时长")
private Double startupDownDuration;
@ApiModelProperty(value = "年停机时长")
private Double shutDownDurationYear;
@ApiModelProperty(value = "年开机时长")
private Double startupDurationYear;
@ApiModelProperty(value = "设备近24小时有功功率")
private List<HydroelectricDevicePowerVo> powers;
@ApiModelProperty(value = "设备近30日发电量")
private List<HydroelectricDeviceGenerateVo> generates;
}

22
hzims-service-api/hzims-operational-api/src/main/java/com/hnac/hzims/operational/homePage/hydroelectric/vo/HydroelectricPowerRainVo.java

@ -0,0 +1,22 @@
package com.hnac.hzims.operational.homePage.hydroelectric.vo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
* @author ysj
*/
@Data
@ApiModel(value = "站点首页 - 最近30日发电量/降雨量")
public class HydroelectricPowerRainVo {
@ApiModelProperty(value = "日期")
private String date;
@ApiModelProperty(value = "发电量")
private Double generate;
@ApiModelProperty(value = "降雨")
private Double rain;
}

2
hzims-service-api/hzims-operational-api/src/main/java/com/hnac/hzims/operational/main/vo/HydropowerStationVo.java

@ -1,7 +1,7 @@
package com.hnac.hzims.operational.main.vo; package com.hnac.hzims.operational.main.vo;
import com.hnac.hzims.hzimsweather.response.weather.Daily; import com.hnac.hzims.hzimsweather.response.weather.Daily;
import com.hnac.hzims.operational.homePage.Hydroelectric.vo.HydroelectricPowerRainVo; import com.hnac.hzims.operational.homePage.hydroelectric.vo.HydroelectricPowerRainVo;
import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty; import io.swagger.annotations.ApiModelProperty;
import lombok.Data; import lombok.Data;

1
hzims-service/equipment/src/main/java/com/hnac/hzims/emParam/controller/ParamController.java

@ -30,6 +30,7 @@ public class ParamController extends BladeController {
} }
@PostMapping("/distribute") @PostMapping("/distribute")
@ApiOperation("下发参数") @ApiOperation("下发参数")
@ApiOperationSupport(order = 2) @ApiOperationSupport(order = 2)
public Result<Object> distribute(@RequestBody ParamDistributeDTO req) { public Result<Object> distribute(@RequestBody ParamDistributeDTO req) {

9
hzims-service/hzims-big-model/src/main/java/com/hnac/hzims/bigmodel/api/feign/BigModelAnalysisClient.java

@ -1,10 +1,9 @@
package com.hnac.hzims.bigmodel.api.feign; package com.hnac.hzims.bigmodel.api.feign;
import com.hnac.hzims.bigmodel.api.dto.BigModelAnalysisDTO; import com.hnac.hzims.bigmodel.api.dto.BigModelAnalysisRequestDTO;
import com.hnac.hzims.bigmodel.api.dto.BigModelAnalysisResponseDTO;
import com.hnac.hzims.bigmodel.zhipuai.service.ZhipuAnalysisService; import com.hnac.hzims.bigmodel.zhipuai.service.ZhipuAnalysisService;
import com.hnac.hzims.bigmodel.zhipuai.vo.ZhipuAnalysisFileRequest;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import org.springblade.core.tool.api.R;
import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RestController;
@ -20,7 +19,7 @@ public class BigModelAnalysisClient implements IBigModelAnalysisClient {
@Override @Override
@PostMapping(PREFIX_API + "/analysis") @PostMapping(PREFIX_API + "/analysis")
public R analysis(BigModelAnalysisDTO analysisInfo) { public BigModelAnalysisResponseDTO analysis(BigModelAnalysisRequestDTO analysisInfo) {
return R.data(analysisService.analysis(ZhipuAnalysisFileRequest.of(analysisInfo))); return analysisService.multiAnalysis(analysisInfo);
} }
} }

4
hzims-service/hzims-big-model/src/main/java/com/hnac/hzims/bigmodel/zhipuai/controller/ZhipuAnalysisInfoController.java

@ -32,7 +32,7 @@ public class ZhipuAnalysisInfoController {
@PostMapping("/save") @PostMapping("/save")
@ApiOperation("保存智谱分析信息") @ApiOperation("保存智谱分析信息")
@ApiOperationSupport(order = 1) @ApiOperationSupport(order = 1)
public R<Boolean> save(@RequestBody @Validated ZhipuAnalysisInfoVO request) { public R<Boolean> save(@RequestBody ZhipuAnalysisInfoVO request) {
return R.status(analysisInfoService.save(request.toEntity())); return R.status(analysisInfoService.save(request.toEntity()));
} }
@ -53,7 +53,7 @@ public class ZhipuAnalysisInfoController {
@PutMapping("/update") @PutMapping("/update")
@ApiOperation("更新智谱分析配置信息") @ApiOperation("更新智谱分析配置信息")
@ApiOperationSupport(order = 4) @ApiOperationSupport(order = 4)
public R<Boolean> update(@RequestBody @Validated ZhipuAnalysisInfoEntity requestData) { public R<Boolean> update(@RequestBody ZhipuAnalysisInfoEntity requestData) {
return R.status(analysisInfoService.updateById(requestData)); return R.status(analysisInfoService.updateById(requestData));
} }

5
hzims-service/hzims-big-model/src/main/java/com/hnac/hzims/bigmodel/zhipuai/entity/ZhipuAnalysisInfoEntity.java

@ -7,7 +7,6 @@ import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty; import io.swagger.annotations.ApiModelProperty;
import lombok.Data; import lombok.Data;
import lombok.EqualsAndHashCode; import lombok.EqualsAndHashCode;
import org.springblade.core.mp.base.BaseEntity;
import org.springblade.core.mp.support.QueryField; import org.springblade.core.mp.support.QueryField;
import org.springblade.core.tenant.mp.TenantEntity; import org.springblade.core.tenant.mp.TenantEntity;
@ -25,6 +24,10 @@ public class ZhipuAnalysisInfoEntity extends TenantEntity {
@TableField("CODE") @TableField("CODE")
private String code; private String code;
@ApiModelProperty(value = "对应字典表“AI识别类型”的key值")
@TableField("CHECK_TYPE_SON")
private String checkTypeSon;
@ApiModelProperty(value = "策略名称") @ApiModelProperty(value = "策略名称")
@TableField("NAME") @TableField("NAME")
@QueryField(condition = SqlCondition.LIKE) @QueryField(condition = SqlCondition.LIKE)

6
hzims-service/hzims-big-model/src/main/java/com/hnac/hzims/bigmodel/zhipuai/handler/AbstractZhipuAnalysisHandler.java

@ -1,6 +1,7 @@
package com.hnac.hzims.bigmodel.zhipuai.handler; package com.hnac.hzims.bigmodel.zhipuai.handler;
import com.zhipu.oapi.ClientV4; import com.zhipu.oapi.ClientV4;
import lombok.Data;
import javax.annotation.Resource; import javax.annotation.Resource;
@ -8,10 +9,15 @@ import javax.annotation.Resource;
* @Author: ypj * @Author: ypj
* @Date: 2024/8/12 8:44 * @Date: 2024/8/12 8:44
*/ */
@Data
public abstract class AbstractZhipuAnalysisHandler implements ZhipuAnalyser { public abstract class AbstractZhipuAnalysisHandler implements ZhipuAnalyser {
protected final String requestIdTemplate = "big_model-%d"; protected final String requestIdTemplate = "big_model-%d";
@Resource @Resource
protected ClientV4 client; protected ClientV4 client;
private String text;
private String url;
} }

4
hzims-service/hzims-big-model/src/main/java/com/hnac/hzims/bigmodel/zhipuai/handler/ResultStrategy.java

@ -36,8 +36,8 @@ public interface ResultStrategy<T> {
return originalData; return originalData;
} }
default T getResult(ZhipuAnalysisInfoEntity info, String originalData) { default T getResult(ZhipuAnalysisInfoEntity info, String originalValue) {
return getResult(info, convertOriginalData(originalData, info.getResultType())); return getResult(info, convertOriginalData(originalValue, info.getResultType()));
} }
T getResult(ZhipuAnalysisInfoEntity info, Object resultData); T getResult(ZhipuAnalysisInfoEntity info, Object resultData);

32
hzims-service/hzims-big-model/src/main/java/com/hnac/hzims/bigmodel/zhipuai/handler/ZhipuAnalyser.java

@ -1,32 +1,50 @@
package com.hnac.hzims.bigmodel.zhipuai.handler; package com.hnac.hzims.bigmodel.zhipuai.handler;
import com.hnac.hzims.bigmodel.zhipuai.entity.ZhipuAnalysisInfoEntity;
import org.springblade.core.tool.jackson.JsonUtil; import org.springblade.core.tool.jackson.JsonUtil;
import java.util.Map; import java.util.Map;
import java.util.Optional;
/** /**
* @Author: ypj * @Author: ypj
* @Date: 2024/8/8 14:45 * @Date: 2024/8/8 14:45
*/ */
public interface ZhipuAnalyser<Req, Resp> { public interface ZhipuAnalyser<Req, Resp> {
String QUESTION_PROFILE = "## Profile\n";
String QUESTION_CONSTRAINS = "## Constrains\n";
String QUESTION_OUTPUT_FORMAT = "## OutputFormat\n";
String getAnalysisStrategy(); String getAnalysisStrategy();
String getAnalysisModel(); String getAnalysisModel();
String getUrl();
void setUrl(String url);
String getText();
void setText(String text);
default boolean isSupport(String strategyCode) { default boolean isSupport(String strategyCode) {
return getAnalysisStrategy().equals(strategyCode); return getAnalysisStrategy().equals(strategyCode);
} }
Resp sendRequest(ZhipuAnalysisInfoEntity info, String url); Resp sendRequest(String text, String url);
Req getRequest(ZhipuAnalysisInfoEntity info, String url); Req getRequest(String text, String url);
String getResult(ZhipuAnalysisInfoEntity info, String url); String getResult(String text, String url);
default Map<String, Object> getResultMap(String text, String url) {
String result = getResult(text, url);
return Optional.ofNullable(result).map(str -> JsonUtil.toMap(result)).orElse(null);
}
default Object getResultValue(ZhipuAnalysisInfoEntity info, String url) { default Object getResultValue(String text, String key, String url) {
Map<String, Object> resultMap = JsonUtil.toMap(getResult(info, url)); Map<String, Object> resultMap = getResultMap(text, url);
return resultMap.get(info.getResultKey()); return Optional.ofNullable(resultMap).map(data -> data.get(key)).orElse(null);
} }
} }

12
hzims-service/hzims-big-model/src/main/java/com/hnac/hzims/bigmodel/zhipuai/handler/ZhipuAnalysisHandlerGlm4v.java

@ -33,19 +33,19 @@ public class ZhipuAnalysisHandlerGlm4v extends AbstractZhipuAnalysisHandler {
} }
@Override @Override
public ModelApiResponse sendRequest(ZhipuAnalysisInfoEntity info, String url) { public ModelApiResponse sendRequest(String text, String url) {
ChatCompletionRequest request = getRequest(info, url); ChatCompletionRequest request = getRequest(text, url);
log.info("send zhipu ai request :{}", Optional.ofNullable(request).map(req -> JsonUtil.toJson(req)).orElse("null")); log.info("send zhipu ai request :{}", Optional.ofNullable(request).map(req -> JsonUtil.toJson(req)).orElse("null"));
return client.invokeModelApi(request); return client.invokeModelApi(request);
} }
@Override @Override
public ChatCompletionRequest getRequest(ZhipuAnalysisInfoEntity info, String url) { public ChatCompletionRequest getRequest(String text, String url) {
List<ChatMessage> messages = new ArrayList<>(); List<ChatMessage> messages = new ArrayList<>();
List<Map<String, Object>> contentList = new ArrayList<>(); List<Map<String, Object>> contentList = new ArrayList<>();
Map<String, Object> textMap = new HashMap<>(); Map<String, Object> textMap = new HashMap<>();
textMap.put("type", "text"); textMap.put("type", "text");
textMap.put("text", info.getRequestContent()); textMap.put("text", text);
Map<String, Object> typeMap = new HashMap<>(); Map<String, Object> typeMap = new HashMap<>();
typeMap.put("type", "image_url"); typeMap.put("type", "image_url");
Map<String, Object> urlMap = new HashMap<>(); Map<String, Object> urlMap = new HashMap<>();
@ -68,8 +68,8 @@ public class ZhipuAnalysisHandlerGlm4v extends AbstractZhipuAnalysisHandler {
} }
@Override @Override
public String getResult(ZhipuAnalysisInfoEntity info, String url) { public String getResult(String text, String url) {
ModelApiResponse response = sendRequest(info, url); ModelApiResponse response = sendRequest(text, url);
log.info("get zhi pu ai response : {}", Optional.ofNullable(response).map(resp -> JsonUtil.toJson(resp)).orElse("null")); log.info("get zhi pu ai response : {}", Optional.ofNullable(response).map(resp -> JsonUtil.toJson(resp)).orElse("null"));
if (response.isSuccess()) { if (response.isSuccess()) {
try { try {

4
hzims-service/hzims-big-model/src/main/java/com/hnac/hzims/bigmodel/zhipuai/service/ZhipuAnalysisService.java

@ -1,5 +1,7 @@
package com.hnac.hzims.bigmodel.zhipuai.service; package com.hnac.hzims.bigmodel.zhipuai.service;
import com.hnac.hzims.bigmodel.api.dto.BigModelAnalysisRequestDTO;
import com.hnac.hzims.bigmodel.api.dto.BigModelAnalysisResponseDTO;
import com.hnac.hzims.bigmodel.zhipuai.entity.ZhipuAnalysisInfoEntity; import com.hnac.hzims.bigmodel.zhipuai.entity.ZhipuAnalysisInfoEntity;
import com.hnac.hzims.bigmodel.zhipuai.vo.ZhipuAnalysisFileRequest; import com.hnac.hzims.bigmodel.zhipuai.vo.ZhipuAnalysisFileRequest;
import com.hnac.hzims.bigmodel.zhipuai.vo.ZhipuAnalysisFileResponse; import com.hnac.hzims.bigmodel.zhipuai.vo.ZhipuAnalysisFileResponse;
@ -13,4 +15,6 @@ public interface ZhipuAnalysisService {
ZhipuAnalysisFileResponse analysis(ZhipuAnalysisFileRequest request); ZhipuAnalysisFileResponse analysis(ZhipuAnalysisFileRequest request);
ZhipuAnalysisInfoEntity getAnalysisInfo(ZhipuAnalysisFileRequest request); ZhipuAnalysisInfoEntity getAnalysisInfo(ZhipuAnalysisFileRequest request);
BigModelAnalysisResponseDTO multiAnalysis(BigModelAnalysisRequestDTO analysisInfo);
} }

119
hzims-service/hzims-big-model/src/main/java/com/hnac/hzims/bigmodel/zhipuai/service/impl/ZhipuAnalysisServiceImpl.java

@ -1,6 +1,8 @@
package com.hnac.hzims.bigmodel.zhipuai.service.impl; package com.hnac.hzims.bigmodel.zhipuai.service.impl;
import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.hnac.hzims.bigmodel.api.dto.BigModelAnalysisRequestDTO;
import com.hnac.hzims.bigmodel.api.dto.BigModelAnalysisResponseDTO;
import com.hnac.hzims.bigmodel.zhipuai.constants.BaseEnum; import com.hnac.hzims.bigmodel.zhipuai.constants.BaseEnum;
import com.hnac.hzims.bigmodel.zhipuai.constants.ResultStrategyType; import com.hnac.hzims.bigmodel.zhipuai.constants.ResultStrategyType;
import com.hnac.hzims.bigmodel.zhipuai.entity.ZhipuAnalysisInfoEntity; import com.hnac.hzims.bigmodel.zhipuai.entity.ZhipuAnalysisInfoEntity;
@ -15,13 +17,15 @@ import com.hnac.hzims.common.utils.FileUtil;
import com.hnac.hzinfo.exception.HzServiceException; import com.hnac.hzinfo.exception.HzServiceException;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springblade.core.tool.api.ResultCode;
import org.springblade.core.tool.jackson.JsonUtil; import org.springblade.core.tool.jackson.JsonUtil;
import org.springblade.core.tool.utils.CollectionUtil;
import org.springblade.core.tool.utils.ObjectUtil;
import org.springblade.core.tool.utils.StringUtil; import org.springblade.core.tool.utils.StringUtil;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.util.Assert; import org.springframework.util.Assert;
import java.util.Objects; import java.util.*;
import java.util.Optional;
/** /**
* @Author: ypj * @Author: ypj
@ -36,6 +40,14 @@ public class ZhipuAnalysisServiceImpl implements ZhipuAnalysisService {
private final ZhipuAnalysisInfoService infoService; private final ZhipuAnalysisInfoService infoService;
private final String multiQuestionBrief = "从给出的图片回答以下{}个问题\n";
private final String multiQuestionPrefix = "第{}个问题,";
private final String multiQuestionConstrains = "- 不要在输出中添加任何注释和思考过程和其他多余的内容,以JSON格式输出简单结果,{}结果只包含'是'或者'否'\n";
private final String multiQuestionConstrainsList = "'问题{}'代表第{}个问题,";
@Override @Override
public ZhipuAnalysisFileResponse analysis(ZhipuAnalysisFileRequest request) { public ZhipuAnalysisFileResponse analysis(ZhipuAnalysisFileRequest request) {
Assert.isTrue(StringUtil.isNotBlank(request.getFilePath()) || StringUtil.isNotBlank(request.getUrl()), () -> { Assert.isTrue(StringUtil.isNotBlank(request.getFilePath()) || StringUtil.isNotBlank(request.getUrl()), () -> {
@ -49,7 +61,21 @@ public class ZhipuAnalysisServiceImpl implements ZhipuAnalysisService {
}); });
ZhipuAnalyser analyser = analysisFactory.getAnalysisStrategy(info.getModel()); ZhipuAnalyser analyser = analysisFactory.getAnalysisStrategy(info.getModel());
Object resultObject = analyser.getResultValue(info, getSendUrl(request)); Assert.isTrue(StringUtil.isNotBlank(info.getRequestContent()), () -> {
throw new HzServiceException("智谱平台交互内容为空");
});
//拼接文字内容
StringBuilder textBuilder = new StringBuilder();
textBuilder.append(ZhipuAnalyser.QUESTION_PROFILE).append(info.getRequestContent());
if (StringUtil.isNotBlank(info.getRequestConstrains())) {
textBuilder.append(ZhipuAnalyser.QUESTION_CONSTRAINS).append(info.getRequestConstrains());
}
if (StringUtil.isNotBlank(info.getRequestOutputFormat())) {
textBuilder.append(ZhipuAnalyser.QUESTION_OUTPUT_FORMAT).append("{").append(info.getRequestOutputFormat()).append("}");
}
analyser.setText(textBuilder.toString());
Object resultObject = analyser.getResultValue(analyser.getText(), info.getResultKey(), getSendUrl(request));
Assert.isTrue(Objects.nonNull(resultObject), () -> { Assert.isTrue(Objects.nonNull(resultObject), () -> {
throw new HzServiceException("智谱平台分析失败"); throw new HzServiceException("智谱平台分析失败");
}); });
@ -82,11 +108,12 @@ public class ZhipuAnalysisServiceImpl implements ZhipuAnalysisService {
@Override @Override
public ZhipuAnalysisInfoEntity getAnalysisInfo(ZhipuAnalysisFileRequest request) { public ZhipuAnalysisInfoEntity getAnalysisInfo(ZhipuAnalysisFileRequest request) {
ZhipuAnalysisInfoEntity result = null; ZhipuAnalysisInfoEntity result = null;
if (StringUtil.isBlank(request.getCode())) { if (StringUtil.isBlank(request.getCode()) && StringUtil.isBlank(request.getCheckTypeSon())) {
result = request.toAnalysisInfo(); result = request.toAnalysisInfo();
} else { } else {
result = infoService.getOne(Wrappers.<ZhipuAnalysisInfoEntity>lambdaQuery() result = infoService.getOne(Wrappers.<ZhipuAnalysisInfoEntity>lambdaQuery()
.eq(ZhipuAnalysisInfoEntity::getCode, request.getCode()) .eq(StringUtil.isNotBlank(request.getCode()), ZhipuAnalysisInfoEntity::getCode, request.getCode())
.eq(StringUtil.isNotBlank(request.getCheckTypeSon()), ZhipuAnalysisInfoEntity::getCheckTypeSon, request.getCheckTypeSon())
.last("limit 1;")); .last("limit 1;"));
} }
log.info("the analysis information is {}", Optional.ofNullable(result).map(r -> JsonUtil.toJson(r)).orElse("null")); log.info("the analysis information is {}", Optional.ofNullable(result).map(r -> JsonUtil.toJson(r)).orElse("null"));
@ -94,4 +121,86 @@ public class ZhipuAnalysisServiceImpl implements ZhipuAnalysisService {
} }
@Override
public BigModelAnalysisResponseDTO multiAnalysis(BigModelAnalysisRequestDTO request) {
BigModelAnalysisResponseDTO response = new BigModelAnalysisResponseDTO();
try {
Assert.isTrue(StringUtil.isNotBlank(request.getUrl()), () -> {
throw new HzServiceException("文件为空");
});
Assert.isTrue(CollectionUtil.isNotEmpty(request.getCodeList()) || CollectionUtil.isNotEmpty(request.getCheckTypeSonList()), () -> {
throw new HzServiceException("识别类型为空");
});
List<ZhipuAnalysisInfoEntity> infoList = infoService.list(Wrappers.<ZhipuAnalysisInfoEntity>lambdaQuery().in(CollectionUtil.isNotEmpty(request.getCodeList()), ZhipuAnalysisInfoEntity::getCode, request.getCodeList())
.in(CollectionUtil.isNotEmpty(request.getCheckTypeSonList()), ZhipuAnalysisInfoEntity::getCheckTypeSon, request.getCheckTypeSonList()));
Assert.isTrue(CollectionUtil.isNotEmpty(infoList), () -> {
throw new HzServiceException("未知的识别类型");
});
ZhipuAnalyser analyser = analysisFactory.getAnalysisStrategy(infoList.get(0).getModel());
String text = getMultiAnalyserText(infoList);
Map<String, Object> resultMap = analyser.getResultMap(text, request.getUrl());
if (null == resultMap) {
response.setCode(ResultCode.FAILURE.getCode());
response.setMsg("智谱大模型分析失败");
return response;
}
List<BigModelAnalysisResponseDTO.BigModelAnalysisResult> results = new ArrayList<>(infoList.size());
for (int index = 1; index <= infoList.size(); index++) {
ZhipuAnalysisInfoEntity infoEntity = infoList.get(index - 1);
BigModelAnalysisResponseDTO.BigModelAnalysisResult result = new BigModelAnalysisResponseDTO.BigModelAnalysisResult();
results.add(result);
result.setCheckTypeSon(infoEntity.getCheckTypeSon());
Object resultObj = resultMap.get(infoEntity.getResultKey());
if (ObjectUtil.isEmpty(resultObj)) {
continue;
}
String resultStr = resultObj.toString();
result.setResultStr(resultStr);
result.setDescription(infoEntity.getName() + StringUtil.format(",结果为{}", resultStr));
ResultStrategyType strategyType = BaseEnum.getInstance(infoEntity.getResultStrategy(), ResultStrategyType.class);
if (ObjectUtil.isEmpty(strategyType)) {
continue;
}
result.setResult(strategyType.getStrategy().getResult(infoEntity, resultObj));
}
response.setData(results);
response.setCode(ResultCode.SUCCESS.getCode());
response.setMsg(ResultCode.SUCCESS.getMessage());
} catch (Exception e) {
if (e instanceof HzServiceException) {
response.setCode(ResultCode.FAILURE.getCode());
response.setMsg(e.getMessage());
} else {
response.setCode(ResultCode.FAILURE.getCode());
response.setMsg("智谱大模型分析失败");
}
log.error("智谱大模型分析失败", e);
}
return response;
}
String getMultiAnalyserText(List<ZhipuAnalysisInfoEntity> infoList) {
StringBuilder stringBuilder = new StringBuilder();
StringBuilder titleBuilder = new StringBuilder();
StringBuilder formatBuilder = new StringBuilder();
stringBuilder.append(ZhipuAnalyser.QUESTION_PROFILE)
.append(StringUtil.format(multiQuestionBrief, infoList.size()));
formatBuilder.append("{");
for (int index = 1; index <= infoList.size(); index++) {
ZhipuAnalysisInfoEntity infoEntity = infoList.get(index - 1);
stringBuilder.append(StringUtil.format(multiQuestionPrefix, index));
titleBuilder.append(StringUtil.format(multiQuestionConstrainsList, infoEntity.getResultKey(), index));
formatBuilder.append(infoEntity.getRequestOutputFormat()).append(",");
}
formatBuilder.deleteCharAt(formatBuilder.length() - 1);
formatBuilder.append("}");
stringBuilder.append(ZhipuAnalyser.QUESTION_CONSTRAINS)
.append(StringUtil.format(multiQuestionConstrains, titleBuilder.toString()))
.append(ZhipuAnalyser.QUESTION_OUTPUT_FORMAT).append(formatBuilder);
return stringBuilder.toString();
}
} }

11
hzims-service/hzims-big-model/src/main/java/com/hnac/hzims/bigmodel/zhipuai/vo/ZhipuAnalysisFileRequest.java

@ -1,6 +1,6 @@
package com.hnac.hzims.bigmodel.zhipuai.vo; package com.hnac.hzims.bigmodel.zhipuai.vo;
import com.hnac.hzims.bigmodel.api.dto.BigModelAnalysisDTO; import com.hnac.hzims.bigmodel.api.dto.BigModelAnalysisRequestDTO;
import com.hnac.hzims.bigmodel.zhipuai.entity.ZhipuAnalysisInfoEntity; import com.hnac.hzims.bigmodel.zhipuai.entity.ZhipuAnalysisInfoEntity;
import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty; import io.swagger.annotations.ApiModelProperty;
@ -16,6 +16,9 @@ public class ZhipuAnalysisFileRequest {
@ApiModelProperty("策略编码") @ApiModelProperty("策略编码")
private String code; private String code;
@ApiModelProperty(value = "检测类型子类")
private String checkTypeSon;
@ApiModelProperty("模型名称") @ApiModelProperty("模型名称")
private String model; private String model;
@ -39,10 +42,4 @@ public class ZhipuAnalysisFileRequest {
return info; return info;
} }
public static ZhipuAnalysisFileRequest of(BigModelAnalysisDTO analysisDTO) {
ZhipuAnalysisFileRequest request = new ZhipuAnalysisFileRequest();
request.setCode(analysisDTO.getCode());
request.setUrl(analysisDTO.getUrl());
return request;
}
} }

2
hzims-service/hzims-big-model/src/main/java/com/hnac/hzims/bigmodel/zhipuai/vo/ZhipuAnalysisResult.java

@ -21,7 +21,7 @@ public class ZhipuAnalysisResult<T> implements Serializable {
private Boolean success = null; private Boolean success = null;
@ApiModelProperty(value = "承载数据") @ApiModelProperty(value = "承载数据")
private T result; private Object result;
@ApiModelProperty(value = "结果描述") @ApiModelProperty(value = "结果描述")
private String resultStr; private String resultStr;

4
hzims-service/inspect/pom.xml

@ -155,6 +155,10 @@
<artifactId>okhttp</artifactId> <artifactId>okhttp</artifactId>
<version>4.9.3</version> <version>4.9.3</version>
</dependency> </dependency>
<dependency>
<groupId>com.hnac.hzims</groupId>
<artifactId>big-model-api</artifactId>
</dependency>
</dependencies> </dependencies>
<build> <build>

30
hzims-service/inspect/src/main/java/com/hnac/hzinfo/inspect/task/schedule/VideoTaskSchedule.java

@ -5,6 +5,7 @@ import com.alibaba.fastjson.JSONArray;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.google.common.collect.Lists; import com.google.common.collect.Lists;
import com.hnac.hzims.bigmodel.api.feign.IBigModelAnalysisClient;
import com.hnac.hzinfo.datasearch.soe.ISoeClient; import com.hnac.hzinfo.datasearch.soe.ISoeClient;
import com.hnac.hzinfo.datasearch.soe.vo.DeviceSoeVO; import com.hnac.hzinfo.datasearch.soe.vo.DeviceSoeVO;
import com.hnac.hzinfo.inspect.ai.entity.CameraInfoEntity; import com.hnac.hzinfo.inspect.ai.entity.CameraInfoEntity;
@ -13,6 +14,8 @@ import com.hnac.hzinfo.inspect.ai.service.ICameraInfoService;
import com.hnac.hzinfo.inspect.ai.service.IRobotTaskService; import com.hnac.hzinfo.inspect.ai.service.IRobotTaskService;
import com.hnac.hzinfo.inspect.areamonthly.vo.TaskObjectVO; import com.hnac.hzinfo.inspect.areamonthly.vo.TaskObjectVO;
import com.hnac.hzinfo.inspect.hikVideo.service.IHikApiService; import com.hnac.hzinfo.inspect.hikVideo.service.IHikApiService;
import com.hnac.hzinfo.inspect.obj.entity.ContentEntity;
import com.hnac.hzinfo.inspect.obj.services.ContentService;
import com.hnac.hzinfo.inspect.plan.PlanContants; import com.hnac.hzinfo.inspect.plan.PlanContants;
import com.hnac.hzinfo.inspect.task.TaskContants; import com.hnac.hzinfo.inspect.task.TaskContants;
import com.hnac.hzinfo.inspect.task.entity.EventEntity; import com.hnac.hzinfo.inspect.task.entity.EventEntity;
@ -34,12 +37,14 @@ import org.springblade.core.tool.utils.CollectionUtil;
import org.springblade.core.tool.utils.DateUtil; import org.springblade.core.tool.utils.DateUtil;
import org.springblade.core.tool.utils.Func; import org.springblade.core.tool.utils.Func;
import org.springblade.core.tool.utils.StringUtil; import org.springblade.core.tool.utils.StringUtil;
import org.springblade.resource.feign.IOssClient;
import org.springframework.jdbc.datasource.DataSourceTransactionManager; import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import org.springframework.transaction.TransactionDefinition; import org.springframework.transaction.TransactionDefinition;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.util.Arrays;
import java.util.List; import java.util.List;
import java.util.stream.Collectors; import java.util.stream.Collectors;
@ -63,9 +68,13 @@ public class VideoTaskSchedule {
private final ISoeClient soeClient; private final ISoeClient soeClient;
private final DataSourceTransactionManager dataSourceTransactionManager; private final DataSourceTransactionManager dataSourceTransactionManager;
private final TransactionDefinition transactionDefinition; private final TransactionDefinition transactionDefinition;
private final IOssClient ossClient;
private final ContentService contentService;
private final IBigModelAnalysisClient bigModelClient;
/** /**
* 视频巡检任务执行 * 视频巡检任务执行
*
* @param params 任务ID * @param params 任务ID
* @return * @return
*/ */
@ -81,8 +90,7 @@ public class VideoTaskSchedule {
.ge(TaskEntity::getPlanEndTime, LocalDateTime.now()) .ge(TaskEntity::getPlanEndTime, LocalDateTime.now())
.eq(TaskEntity::getAutoVideo, PlanContants.InspectTypeEnum.VIDEO.getVal()); .eq(TaskEntity::getAutoVideo, PlanContants.InspectTypeEnum.VIDEO.getVal());
taskList.addAll(taskService.list(queryWrapper)); taskList.addAll(taskService.list(queryWrapper));
} } else {
else {
LambdaQueryWrapper<TaskEntity> queryWrapper = Wrappers.<TaskEntity>lambdaQuery() LambdaQueryWrapper<TaskEntity> queryWrapper = Wrappers.<TaskEntity>lambdaQuery()
.in(TaskEntity::getId, Func.toLongList(",", params)) .in(TaskEntity::getId, Func.toLongList(",", params))
.eq(TaskEntity::getStatus, TaskContants.TaskStatusEnum.UNDERWAY_STATUS.getStatus()) .eq(TaskEntity::getStatus, TaskContants.TaskStatusEnum.UNDERWAY_STATUS.getStatus())
@ -95,6 +103,7 @@ public class VideoTaskSchedule {
/** /**
* 执行视频巡检任务 * 执行视频巡检任务
*
* @param task 视频巡检任务 * @param task 视频巡检任务
*/ */
private void executeVideoTask(TaskEntity task) { private void executeVideoTask(TaskEntity task) {
@ -108,8 +117,7 @@ public class VideoTaskSchedule {
.set(TaskEntity::getStatus, TaskContants.TaskStatusEnum.FINISH_STATUS.getStatus()) .set(TaskEntity::getStatus, TaskContants.TaskStatusEnum.FINISH_STATUS.getStatus())
.set(TaskEntity::getEndTime, LocalDateTime.now()) .set(TaskEntity::getEndTime, LocalDateTime.now())
.eq(TaskEntity::getId, task.getId())); .eq(TaskEntity::getId, task.getId()));
} } catch (Exception e) {
catch(Exception e) {
e.printStackTrace(); e.printStackTrace();
XxlJobLogger.log("【taskId:" + task.getId() + "】视频巡检任务执行失败,报错信息为:" + e.getMessage()); XxlJobLogger.log("【taskId:" + task.getId() + "】视频巡检任务执行失败,报错信息为:" + e.getMessage());
} }
@ -122,6 +130,7 @@ public class VideoTaskSchedule {
/** /**
* 填充视频巡检执行情况 * 填充视频巡检执行情况
*
* @param task 视频巡检任务 * @param task 视频巡检任务
*/ */
private void fillEvent(TaskEntity task) { private void fillEvent(TaskEntity task) {
@ -177,6 +186,7 @@ public class VideoTaskSchedule {
/** /**
* 登记任务 * 登记任务
*
* @param task 视频巡检任务 * @param task 视频巡检任务
*/ */
private void registration(TaskEntity task) { private void registration(TaskEntity task) {
@ -199,6 +209,7 @@ public class VideoTaskSchedule {
/** /**
* 根据项目ID以及内容ID获取摄像头编号 * 根据项目ID以及内容ID获取摄像头编号
*
* @param projectId 项目ID * @param projectId 项目ID
* @param contentId 内容ID * @param contentId 内容ID
* @return 摄像头编号 * @return 摄像头编号
@ -214,4 +225,15 @@ public class VideoTaskSchedule {
return null; return null;
} }
private void pictureHandle(String url, Long contentId) {
ContentEntity content = contentService.getById(contentId);
if (StringUtil.isBlank(content.getMultiCheckTypeSon())) {
return;
}
String[] typeArray = content.getMultiCheckTypeSon().split(",");
List<String> checkTypeSonList = Arrays.asList(typeArray);
}
} }

19
hzims-service/operational/src/main/java/com/hnac/hzims/operational/homePage/controller/HydroelectricController.java

@ -1,11 +1,12 @@
package com.hnac.hzims.operational.homePage.controller; package com.hnac.hzims.operational.homePage.controller;
import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport; import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
import com.hnac.hzims.operational.homePage.Hydroelectric.vo.HydroelectricStationVo; import com.hnac.hzims.operational.homePage.hydroelectric.vo.HydroelectricAreaVo;
import com.hnac.hzims.operational.homePage.hydroelectric.vo.HydroelectricGroupVo;
import com.hnac.hzims.operational.homePage.hydroelectric.vo.HydroelectricStationVo;
import com.hnac.hzims.operational.homePage.service.HydroelectricService; import com.hnac.hzims.operational.homePage.service.HydroelectricService;
import io.swagger.annotations.Api; import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import org.springblade.core.boot.ctrl.BladeController; import org.springblade.core.boot.ctrl.BladeController;
import org.springblade.core.tool.api.R; import org.springblade.core.tool.api.R;
@ -32,4 +33,18 @@ public class HydroelectricController extends BladeController {
public R<HydroelectricStationVo> station(@RequestParam("deptId") Long deptId) { public R<HydroelectricStationVo> station(@RequestParam("deptId") Long deptId) {
return R.data(hydroelectricService.station(deptId)); return R.data(hydroelectricService.station(deptId));
} }
@ApiOperation("水电站区域指标")
@GetMapping("/area")
@ApiOperationSupport(order = 1)
public R<HydroelectricAreaVo> area(@RequestParam(value = "deptId") Long deptId) {
return R.data(hydroelectricService.area(deptId));
}
@ApiOperation("水电站集团指标")
@GetMapping("/group")
@ApiOperationSupport(order = 1)
public R<HydroelectricGroupVo> group() {
return R.data(hydroelectricService.group());
}
} }

8
hzims-service/operational/src/main/java/com/hnac/hzims/operational/homePage/service/HydroelectricService.java

@ -1,6 +1,8 @@
package com.hnac.hzims.operational.homePage.service; package com.hnac.hzims.operational.homePage.service;
import com.hnac.hzims.operational.homePage.Hydroelectric.vo.HydroelectricStationVo; import com.hnac.hzims.operational.homePage.hydroelectric.vo.HydroelectricAreaVo;
import com.hnac.hzims.operational.homePage.hydroelectric.vo.HydroelectricGroupVo;
import com.hnac.hzims.operational.homePage.hydroelectric.vo.HydroelectricStationVo;
/** /**
* 水电站-首页接口 * 水电站-首页接口
@ -9,4 +11,8 @@ import com.hnac.hzims.operational.homePage.Hydroelectric.vo.HydroelectricStation
public interface HydroelectricService { public interface HydroelectricService {
HydroelectricStationVo station(Long deptId); HydroelectricStationVo station(Long deptId);
HydroelectricAreaVo area(Long deptId);
HydroelectricGroupVo group();
} }

527
hzims-service/operational/src/main/java/com/hnac/hzims/operational/homePage/service/impl/HydroelectricServiceImpl.java

@ -1,14 +1,19 @@
package com.hnac.hzims.operational.homePage.service.impl; package com.hnac.hzims.operational.homePage.service.impl;
import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.TypeReference; import com.alibaba.fastjson.TypeReference;
import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.hnac.hzims.equipment.entity.PlanGenerationEntity;
import com.hnac.hzims.equipment.feign.IPlanGenertionClient; import com.hnac.hzims.equipment.feign.IPlanGenertionClient;
import com.hnac.hzims.equipment.vo.EminfoAndEmParamVo; import com.hnac.hzims.equipment.vo.EminfoAndEmParamVo;
import com.hnac.hzims.equipment.vo.PlanPowerYearVo; import com.hnac.hzims.equipment.vo.PlanPowerYearVo;
import com.hnac.hzims.hzimsweather.feign.IRainfallClient; import com.hnac.hzims.hzimsweather.feign.IRainfallClient;
import com.hnac.hzims.hzimsweather.response.weather.Daily;
import com.hnac.hzims.hzimsweather.response.weather.HeWeatherWeatherDailyResponse; import com.hnac.hzims.hzimsweather.response.weather.HeWeatherWeatherDailyResponse;
import com.hnac.hzims.operational.homePage.Hydroelectric.vo.*; import com.hnac.hzims.hzimsweather.response.weather.HeWeatherWeatherNowResponse;
import com.hnac.hzims.operational.homePage.hydroelectric.constant.HydroelectricConstant;
import com.hnac.hzims.operational.homePage.hydroelectric.vo.*;
import com.hnac.hzims.operational.homePage.service.HydroelectricService; import com.hnac.hzims.operational.homePage.service.HydroelectricService;
import com.hnac.hzims.operational.main.service.IWeatherService; import com.hnac.hzims.operational.main.service.IWeatherService;
import com.hnac.hzims.operational.main.vo.HydropowerUnitRealVo; import com.hnac.hzims.operational.main.vo.HydropowerUnitRealVo;
@ -23,11 +28,15 @@ import org.springblade.core.tool.utils.BeanUtil;
import org.springblade.core.tool.utils.CollectionUtil; import org.springblade.core.tool.utils.CollectionUtil;
import org.springblade.core.tool.utils.DateUtil; import org.springblade.core.tool.utils.DateUtil;
import org.springblade.core.tool.utils.ObjectUtil; import org.springblade.core.tool.utils.ObjectUtil;
import org.springblade.system.entity.Dept;
import org.springblade.system.feign.ISysClient;
import org.springframework.data.redis.core.RedisTemplate; import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.math.RoundingMode; import java.math.RoundingMode;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.*; import java.util.*;
import java.util.stream.Collectors; import java.util.stream.Collectors;
@ -40,11 +49,12 @@ import java.util.stream.Collectors;
@Slf4j @Slf4j
public class HydroelectricServiceImpl implements HydroelectricService { public class HydroelectricServiceImpl implements HydroelectricService {
private final IStationService stationService; private final IStationService stationService;
private final IWeatherService weatherService; private final IWeatherService weatherService;
private final ISysClient sysClient;
private final IRainfallClient rainClient; private final IRainfallClient rainClient;
private final IPlanGenertionClient planClient; private final IPlanGenertionClient planClient;
@ -97,8 +107,10 @@ public class HydroelectricServiceImpl implements HydroelectricService {
} }
// 设备 // 设备
if(CollectionUtil.isNotEmpty(devices)){ if(CollectionUtil.isNotEmpty(devices)){
result.setDevices(devices.stream().map(iter->{ result.setDevices(devices.stream().filter(device-> station.getRefDept().equals(device.getCreateDept())).map(iter->{
HydroelectricDeviceVo device = new HydroelectricDeviceVo(); HydroelectricDeviceVo device = new HydroelectricDeviceVo();
device.setDeivceCode(iter.getEmCode());
device.setDeivceName(iter.getName());
Optional<HydropowerUnitRealVo> real = reals.stream().filter(o-> iter.getEmCode().equals(o.getDeviceCode())).findFirst(); Optional<HydropowerUnitRealVo> real = reals.stream().filter(o-> iter.getEmCode().equals(o.getDeviceCode())).findFirst();
// 实时数据 // 实时数据
if(real.isPresent()){ if(real.isPresent()){
@ -145,13 +157,18 @@ public class HydroelectricServiceImpl implements HydroelectricService {
}else{ }else{
result.setCapacityRate(0.0); result.setCapacityRate(0.0);
} }
// 月计划发电量、月已发电量 // 月计划发电量、月已发电量、月完成率
if(CollectionUtil.isNotEmpty(plans)){ if(CollectionUtil.isNotEmpty(plans)){
result.setPowerMonPlan(plans.stream().filter(plan -> plan.getMon().contains(DateUtil.format(new Date(),"yyyy-NM"))).mapToDouble(PlanPowerYearVo::getPlanPower).sum()); result.setPowerMonPlan(plans.stream().filter(plan -> plan.getMon().contains(DateUtil.format(new Date(),"yyyy-MM"))).mapToDouble(PlanPowerYearVo::getPlanPower).sum());
}else{ }else{
result.setPowerMonPlan(0.0); result.setPowerMonPlan(0.0);
} }
result.setPowerMon(result.getDevices().stream().mapToDouble(HydroelectricDeviceVo::getPowerMon).sum()); result.setPowerMon(result.getDevices().stream().mapToDouble(HydroelectricDeviceVo::getPowerMon).sum());
if(result.getPowerMonPlan() <= 0 || result.getPowerMon() <= 0){
result.setPowerRateMon(0.0);
}else{
result.setPowerRateMon(BigDecimal.valueOf(result.getPowerMon() / result.getPowerMonPlan() * 100).setScale(2, RoundingMode.HALF_UP).doubleValue());
}
// 年计划发电量、年已发电量 // 年计划发电量、年已发电量
if(CollectionUtil.isNotEmpty(plans)){ if(CollectionUtil.isNotEmpty(plans)){
@ -160,6 +177,11 @@ public class HydroelectricServiceImpl implements HydroelectricService {
result.setPowerYearPlan(0.0); result.setPowerYearPlan(0.0);
} }
result.setPowerYear(result.getDevices().stream().mapToDouble(HydroelectricDeviceVo::getPowerYear).sum()); result.setPowerYear(result.getDevices().stream().mapToDouble(HydroelectricDeviceVo::getPowerYear).sum());
if(result.getPowerYearPlan() <= 0 || result.getPowerYear() <= 0){
result.setPowerRateYear(0.0);
}else{
result.setPowerRateYear(BigDecimal.valueOf(result.getPowerYear() / result.getPowerYearPlan() * 100).setScale(2, RoundingMode.HALF_UP).doubleValue());
}
// 今日发电量、昨日发电量 // 今日发电量、昨日发电量
result.setPowerDay(result.getDevices().stream().mapToDouble(HydroelectricDeviceVo::getPowerDay).sum()); result.setPowerDay(result.getDevices().stream().mapToDouble(HydroelectricDeviceVo::getPowerDay).sum());
@ -174,6 +196,493 @@ public class HydroelectricServiceImpl implements HydroelectricService {
} }
/** /**
* 水电站区域指标
* @param deptId
* @return
*/
@Override
public HydroelectricAreaVo area(Long deptId) {
HydroelectricAreaVo area = new HydroelectricAreaVo();
// 区域下站点
List<StationEntity> stations = this.stationByArea(deptId);
if(CollectionUtil.isEmpty(stations)){
return area;
}
// 站点计划发电量数据
List<PlanGenerationEntity> plans = planClient.getPlanGenerationByParam(stations.stream().map(StationEntity::getCode).collect(Collectors.toList()),null,DateUtil.format(new Date(),"yyyy"));
// 机构名称
R<Dept> dept = sysClient.getDept(deptId);
if(dept.isSuccess() && ObjectUtil.isNotEmpty(dept.getData())){
area.setDeptId(dept.getData().getId());
area.setDeptName(dept.getData().getDeptName());
}
List<Long> refDepts = stations.stream().map(StationEntity::getRefDept).collect(Collectors.toList());
// 站点数量
area.setCount(stations.size());
// 实时数据
List<HydropowerUnitRealVo> reals = (List<HydropowerUnitRealVo>) redisTemplate.opsForValue().get(LOAD_HYDROPOWER_REAL_KEY);
if (CollectionUtil.isNotEmpty(reals)) {
List<HydropowerUnitRealVo> stationReals = reals.stream().filter(real -> refDepts.contains(real.getDeptId())).collect(Collectors.toList());
if (CollectionUtil.isNotEmpty(stationReals)) {
// 容量
area.setCapacity(stationReals.stream().mapToDouble(HydropowerUnitRealVo::getInstalledCapacity).sum());
// 负荷
area.setLoad(reals.stream().mapToDouble(o->{
if("MW".equalsIgnoreCase(o.getPowerUnit())){
return o.getActivePower() * 1000;
}
return o.getActivePower();
}).sum());
// 容量利用率
if (area.getCapacity() <= 0 || area.getLoad() <= 0) {
area.setCapacityRate(0.0);
}else{
area.setCapacityRate(BigDecimal.valueOf(area.getLoad() / area.getCapacity() * 100).setScale(2, RoundingMode.HALF_UP).doubleValue());
}
}
}
// 指标数据
List<HydropowerUnitTargetVo> targets = (List<HydropowerUnitTargetVo>) redisTemplate.opsForValue().get(LOAD_HYDROPOWER_TARGET_KEY);
if (CollectionUtil.isNotEmpty(targets)) {
List<HydropowerUnitTargetVo> stationTargets = targets.stream().filter(device -> refDepts.contains(device.getDeptId())).collect(Collectors.toList());
if (CollectionUtil.isNotEmpty(targets)) {
// 年发电量
area.setGenerateYear(targets.stream().mapToDouble(HydropowerUnitTargetVo::getPowerYear).sum());
// 月发电量
area.setGenerateMon(targets.stream().mapToDouble(HydropowerUnitTargetVo::getPowerMon).sum());
// 日发电量
area.setGenerateDay(targets.stream().mapToDouble(HydropowerUnitTargetVo::getPowerDay).sum());
// 年计划发电量
area.setGeneratePlanYear(planClient.getPlanPowerYear(stations.stream().map(StationEntity::getCode).collect(Collectors.toList()), DateUtil.format(new Date(),"yyyy")));
if(area.getGeneratePlanYear() <= 0 || area.getGenerateYear() <= 0){
area.setGenerateRate(0.0);
}else{
area.setGenerateRate(BigDecimal.valueOf(area.getGenerateYear() / area.getGeneratePlanYear() * 100).setScale(2, RoundingMode.HALF_UP).doubleValue());
}
}
}
// 站点近年发电数据 key - id value - 月份,发电量
Map<String, Map<String, Float>> maps = (Map<String, Map<String, Float>>) redisTemplate.opsForValue().get(RECENT_YEAR_POWER_DATA);
// 近3年发电量
area.setRecentYears(this.recentYears(stations,maps));
// 发电量完成趋势
area.setCompletes(this.completes(stations,maps,plans));
// 站点综合信息
area.setStations(this.comprehensive(stations,plans,reals,targets));
return area;
}
/**
* 水电站集团指标
* @return
*/
@Override
public HydroelectricGroupVo group() {
HydroelectricGroupVo group = new HydroelectricGroupVo();
// 查询用户当前权限站点
List<StationEntity> stations = stationService.list(Wrappers.<StationEntity>lambdaQuery()
.eq(StationEntity::getServeType,HydroelectricConstant.PROXY_OPEARIONAL)
.eq(StationEntity::getType,HydroelectricConstant.HYDROPOWER)
);
if(CollectionUtil.isEmpty(stations)){
return group;
}
// 查询用户权限机构
R<List<Dept>> currents = sysClient.getDeptByCurrentUser();
if(!currents.isSuccess() || CollectionUtil.isEmpty(currents.getData())){
return group;
}
// 区域机构
List<Dept> areas = currents.getData().stream().filter(o->o.getDeptCategory().equals(3)).collect(Collectors.toList());
if(CollectionUtil.isEmpty(areas)){
return group;
}
List<PlanGenerationEntity> plans = planClient.getPlanGenerationByParam(stations.stream().map(StationEntity::getCode).collect(Collectors.toList()),null,DateUtil.format(new Date(),"yyyy"));
// 机构名称
Optional<Dept> dept = currents.getData().stream().min(Comparator.comparing(Dept::getDeptCategory));
if(dept.isPresent()){
group.setDeptId(dept.get().getId());
group.setDeptName(dept.get().getDeptName());
}
List<Long> refDepts = stations.stream().map(StationEntity::getRefDept).collect(Collectors.toList());
// 站点数量
group.setCount(stations.size());
// 实时数据
List<HydropowerUnitRealVo> reals = (List<HydropowerUnitRealVo>) redisTemplate.opsForValue().get(LOAD_HYDROPOWER_REAL_KEY);
if (CollectionUtil.isNotEmpty(reals)) {
List<HydropowerUnitRealVo> stationReals = reals.stream().filter(real -> refDepts.contains(real.getDeptId())).collect(Collectors.toList());
if (CollectionUtil.isNotEmpty(stationReals)) {
// 容量
group.setCapacity(stationReals.stream().mapToDouble(HydropowerUnitRealVo::getInstalledCapacity).sum());
// 负荷
group.setLoad(reals.stream().mapToDouble(o->{
if("MW".equalsIgnoreCase(o.getPowerUnit())){
return o.getActivePower() * 1000;
}
return o.getActivePower();
}).sum());
// 容量利用率
if (group.getCapacity() <= 0 || group.getLoad() <= 0) {
group.setCapacityRate(0.0);
}else{
group.setCapacityRate(BigDecimal.valueOf(group.getLoad() / group.getCapacity() * 100).setScale(2, RoundingMode.HALF_UP).doubleValue());
}
}
}
// 指标数据
List<HydropowerUnitTargetVo> targets = (List<HydropowerUnitTargetVo>) redisTemplate.opsForValue().get(LOAD_HYDROPOWER_TARGET_KEY);
if (CollectionUtil.isNotEmpty(targets)) {
List<HydropowerUnitTargetVo> stationTargets = targets.stream().filter(device -> refDepts.contains(device.getDeptId())).collect(Collectors.toList());
if (CollectionUtil.isNotEmpty(targets)) {
// 年发电量
group.setGenerateYear(targets.stream().mapToDouble(HydropowerUnitTargetVo::getPowerYear).sum());
// 月发电量
group.setGenerateMon(targets.stream().mapToDouble(HydropowerUnitTargetVo::getPowerMon).sum());
// 日发电量
group.setGenerateDay(targets.stream().mapToDouble(HydropowerUnitTargetVo::getPowerDay).sum());
// 年计划发电量
group.setGeneratePlanYear(planClient.getPlanPowerYear(stations.stream().map(StationEntity::getCode).collect(Collectors.toList()), DateUtil.format(new Date(),"yyyy")));
if(group.getGeneratePlanYear() <= 0 || group.getGenerateYear() <= 0){
group.setGenerateRate(0.0);
}else{
group.setGenerateRate(BigDecimal.valueOf(group.getGenerateYear() / group.getGeneratePlanYear() * 100).setScale(2, RoundingMode.HALF_UP).doubleValue());
}
}
}
// 站点近年发电数据 key - id value - 月份,发电量
Map<String, Map<String, Float>> maps = (Map<String, Map<String, Float>>) redisTemplate.opsForValue().get(RECENT_YEAR_POWER_DATA);
// 近3年发电量
group.setRecentYears(this.recentYears(stations,maps));
// 发电量完成趋势
group.setCompletes(this.completes(stations,maps,plans));
// 区域综合信息
Map<Dept,List<StationEntity>> groupArea = areas.stream().collect(Collectors.toMap(obj -> obj, obj -> {
List<Dept> groups = currents.getData().stream().filter(o->o.getParentId().equals(obj.getId())).collect(Collectors.toList());
return stations.stream().filter(station -> groups.stream().map(Dept::getId).collect(Collectors.toList()).contains(station.getRefDept())).collect(Collectors.toList());
}));
group.setAreas(this.comprehensiveArea(groupArea,plans,reals,targets));
return group;
}
/**
* 区域综合信息
* @param areas
* @param plans
* @param reals
* @param targets
* @return
*/
private List<HydroelectricGroupAreaVo> comprehensiveArea(Map<Dept,List<StationEntity>> areas, List<PlanGenerationEntity> plans, List<HydropowerUnitRealVo> reals, List<HydropowerUnitTargetVo> targets) {
// 站点 : 利用情况 && 天气 && 排名
List<String> codes = areas.values().stream().filter(CollectionUtil::isNotEmpty).map(values -> values.get(0).getCode()).collect(Collectors.toList());
// 获取站点实时天气
Map<String, HeWeatherWeatherNowResponse> nowWeather = this.weatherService.getNowWeather(codes);
// 获取站点7日天气
Map<String, HeWeatherWeatherDailyResponse> weekWeather = this.weatherService.getWeekWeather(codes);
// 计划发电量
List<HydroelectricGroupAreaVo> result = areas.entrySet().stream().filter(entry->CollectionUtil.isNotEmpty(entry.getValue())).map(itr->{
HydroelectricGroupAreaVo groupArea = new HydroelectricGroupAreaVo();
groupArea.setDeptId(itr.getKey().getId());
groupArea.setDeptName(itr.getKey().getDeptName());
// 站点温度、近7日天气
groupArea.setTemp(this.stationTemp(nowWeather,itr.getValue().get(0).getCode()));
groupArea.setWeather(this.stationWeather(weekWeather,itr.getValue().get(0).getCode()));
List<Long> refDepts = itr.getValue().stream().map(StationEntity::getRefDept).collect(Collectors.toList());
List<String> stationCodes = itr.getValue().stream().map(StationEntity::getCode).collect(Collectors.toList());
// 指标数据: 发电量完成率
if(CollectionUtil.isNotEmpty(targets)){
// 当年发电量
groupArea.setGenerateYear(targets.stream().filter(target-> refDepts.contains(target.getDeptId())).mapToDouble(HydropowerUnitTargetVo::getPowerYear).sum());
if(CollectionUtil.isNotEmpty(plans)){
// 当年计划发电量
double generatePlan = plans.stream().filter(plan-> stationCodes.contains(plan.getStationId())).mapToDouble(PlanGenerationEntity::getPlanGeneration).sum();
if(groupArea.getGenerateYear() <= 0 || generatePlan <= 0.0){
groupArea.setGenerateRate(0.0);
}else{
groupArea.setGenerateRate(BigDecimal.valueOf(groupArea.getGenerateYear() / generatePlan * 100).setScale(2, RoundingMode.HALF_UP).doubleValue());
}
}else{
groupArea.setGenerateRate(0.0);
}
}
// 实时数据: 容量利用率、电站利用率
if(CollectionUtil.isNotEmpty(reals)){
// 实时功率
double use = reals.stream().filter(real-> refDepts.contains(real.getDeptId())).mapToDouble(o->{
if("MW".equalsIgnoreCase(o.getPowerUnit())){
return o.getActivePower() * 1000;
}
return o.getActivePower();
}).sum();
if(CollectionUtil.isNotEmpty(plans)){
// 装机容量
double capacity = reals.stream().filter(real-> refDepts.contains(real.getDeptId())).mapToDouble(HydropowerUnitRealVo::getInstalledCapacity).sum();
if(Math.abs(capacity) > 0){
groupArea.setCapacityUse(BigDecimal.valueOf(use / capacity * 100).setScale(1, RoundingMode.HALF_UP).doubleValue());
}else{
groupArea.setCapacityUse(0.0);
}
}else{
groupArea.setCapacityUse(0.0);
}
// 开机数量
long on = reals.stream().filter(real -> refDepts.contains(real.getDeptId()) && real.getState()).count();
long sum = reals.stream().filter(real-> refDepts.contains(real.getDeptId())).count();
if(sum > 0){
groupArea.setDeviceUse(BigDecimal.valueOf(on / (double)sum * 100).setScale(2, RoundingMode.HALF_UP).doubleValue());
}else{
groupArea.setDeviceUse(0.0);
}
}
return groupArea;
}).collect(Collectors.toList());
double generateSum = result.stream().mapToDouble(HydroelectricGroupAreaVo::getGenerateYear).sum();
// 返回结果集
if(generateSum <= 0){
return result.stream().peek(scale-> scale.setAreaMakeUp(0.0)).filter(scale-> Math.abs(scale.getCapacityUse()) > 0 || Math.abs(scale.getAreaMakeUp()) > 0
|| Math.abs(scale.getDeviceUse()) > 0 || Math.abs(scale.getGenerateRate()) > 0)
.sorted(Comparator.comparing(HydroelectricGroupAreaVo::getGenerateYear).reversed()).collect(Collectors.toList());
}
return result.stream().peek(scale-> scale.setAreaMakeUp(BigDecimal.valueOf(scale.getGenerateYear() / generateSum * 100).setScale(1, RoundingMode.HALF_UP).doubleValue())).
filter(scale-> Math.abs(scale.getCapacityUse()) > 0 || Math.abs(scale.getAreaMakeUp()) > 0
|| Math.abs(scale.getDeviceUse()) > 0 || Math.abs(scale.getGenerateRate()) > 0)
.sorted(Comparator.comparing(HydroelectricGroupAreaVo::getGenerateYear).reversed()).collect(Collectors.toList());
}
/**
* 区域近3年发电量
* @param stations
* @return
*/
private List<HydroelectricGenerateYearVo> recentYears(List<StationEntity> stations, Map<String, Map<String, Float>> maps) {
// 过滤站点发电量数据
List<Map<String, Float>> generates = maps.entrySet().stream().filter(entry -> stations.stream().map(StationEntity::getCode).collect(Collectors.toList()).contains(entry.getKey())).map(Map.Entry::getValue).collect(Collectors.toList());
// 根据月份分组
List<HydroelectricGenerateMonVo> generateMons = new ArrayList<>();
if(CollectionUtil.isNotEmpty(generates)){
generates.forEach(item -> item.forEach((key, value) -> {
HydroelectricGenerateMonVo generateMon = new HydroelectricGenerateMonVo();
generateMon.setStrMonth(key);
generateMon.setGenerate(Double.valueOf(value));
generateMons.add(generateMon);
}));
}
// 月份发电量数据整合
List<String> mons = this.mons(2,12,false);
List<HydroelectricGenerateMonVo> integrations = mons.stream().map(mon->{
HydroelectricGenerateMonVo integration = new HydroelectricGenerateMonVo();
integration.setStrMonth(mon);
LocalDate localDate = LocalDate.parse(DateUtil.format(new Date(), mon), DateTimeFormatter.ofPattern(DateUtil.PATTERN_DATE));
integration.setYear(localDate.getYear());
integration.setMonth(localDate.getMonthValue());
integration.setGenerate(generateMons.stream().filter(o->o.getStrMonth().equals(mon)).mapToDouble(HydroelectricGenerateMonVo::getGenerate).sum());
return integration;
}).collect(Collectors.toList());
// 根据年份分组
Map<Integer, List<HydroelectricGenerateMonVo>> year = integrations.stream().collect(Collectors.groupingBy(HydroelectricGenerateMonVo::getYear));
// 返回结果集
return year.entrySet().stream().map(entry -> {
HydroelectricGenerateYearVo generateYear = new HydroelectricGenerateYearVo();
generateYear.setYear(entry.getKey());
List<HydroelectricGenerateMonVo> sortValue = entry.getValue().stream().sorted(Comparator.comparing(HydroelectricGenerateMonVo::getMonth)).collect(Collectors.toList());
generateYear.setGenerateMons(sortValue);
return generateYear;
}).collect(Collectors.toList());
}
/**
* 计划完成完成趋势
* @param stations
* @param maps
* @param plans
* @return
*/
private List<HydroelectricGenerateMonVo> completes(List<StationEntity> stations, Map<String, Map<String, Float>> maps, List<PlanGenerationEntity> plans) {
// 获取月份集合
List<String> monList = this.mons(0,12,false);
return monList.stream().map(o->{
HydroelectricGenerateMonVo generate = new HydroelectricGenerateMonVo();
LocalDate localDate = LocalDate.parse(DateUtil.format(new Date(), o), DateTimeFormatter.ofPattern(DateUtil.PATTERN_DATE));
generate.setStrMonth(o);
generate.setYear(localDate.getYear());
generate.setMonth(localDate.getMonthValue());
// 实际发电量
if(CollectionUtil.isEmpty(maps)){
generate.setGenerate(0.0);
}else{
generate.setGenerate(maps.entrySet().stream().
filter(entry->stations.stream().map(StationEntity::getCode).collect(Collectors.toList()).contains(entry.getKey())).
mapToDouble(valueMap-> valueMap.getValue().entrySet().stream().filter(entry->entry.getKey().equals(o))
.mapToDouble(Map.Entry::getValue).sum()).sum());
}
// 计划发电量
if(CollectionUtil.isEmpty(plans)){
generate.setPlanGenerate(0.0);
}else{
String mon = localDate.format(DateTimeFormatter.ofPattern("yyyy-MM"));
generate.setPlanGenerate(plans.stream().filter(plan->mon.equals(plan.getDateTime())).mapToDouble(PlanGenerationEntity::getPlanGeneration).sum());
}
return generate;
}).collect(Collectors.toList());
}
/**
* 站点综合信息
* @param reals
* @param targets
* @return
*/
private List<HydroelectricAreaStationVo> comprehensive(List<StationEntity> stations, List<PlanGenerationEntity> plans , List<HydropowerUnitRealVo> reals, List<HydropowerUnitTargetVo> targets) {
// 站点 : 利用情况 && 天气 && 排名
List<String> codes = stations.stream().map(StationEntity::getCode).collect(Collectors.toList());
// 获取站点实时天气
Map<String, HeWeatherWeatherNowResponse> nowWeather = this.weatherService.getNowWeather(codes);
// 获取站点7日天气
Map<String, HeWeatherWeatherDailyResponse> weekWeather = this.weatherService.getWeekWeather(codes);
// 计划发电量
List<HydroelectricAreaStationVo> result = stations.stream().map(itr->{
HydroelectricAreaStationVo station = new HydroelectricAreaStationVo();
station.setDeptId(itr.getRefDept());
station.setStationCode(itr.getCode());
station.setStationName(itr.getName());
// 站点温度、近7日天气
station.setTemp(this.stationTemp(nowWeather,itr.getCode()));
station.setWeather(this.stationWeather(weekWeather,itr.getCode()));
// 指标数据: 发电量完成率
if(CollectionUtil.isNotEmpty(targets)){
// 当年发电量
station.setGenerateYear(targets.stream().filter(target-> itr.getRefDept().equals(target.getDeptId())).mapToDouble(HydropowerUnitTargetVo::getPowerYear).sum());
if(CollectionUtil.isNotEmpty(plans)){
// 当年计划发电量
double generatePlan = plans.stream().filter(plan-> itr.getCode().equals(plan.getStationId())).mapToDouble(PlanGenerationEntity::getPlanGeneration).sum();
if(station.getGenerateYear() <= 0 || generatePlan <= 0.0){
station.setGenerateRate(0.0);
}else{
station.setGenerateRate(BigDecimal.valueOf(station.getGenerateYear() / generatePlan * 100).setScale(2, RoundingMode.HALF_UP).doubleValue());
}
}else{
station.setGenerateRate(0.0);
}
}
// 实时数据: 容量利用率、电站利用率
if(CollectionUtil.isNotEmpty(reals)){
// 实时功率
double use = reals.stream().filter(real-> itr.getRefDept().equals(real.getDeptId())).mapToDouble(o->{
if("MW".equalsIgnoreCase(o.getPowerUnit())){
return o.getActivePower() * 1000;
}
return o.getActivePower();
}).sum();
if(CollectionUtil.isNotEmpty(plans)){
// 装机容量
double capacity = reals.stream().filter(real-> itr.getRefDept().equals(real.getDeptId())).mapToDouble(HydropowerUnitRealVo::getInstalledCapacity).sum();
if(Math.abs(capacity) > 0){
station.setCapacityUse(BigDecimal.valueOf(use / capacity * 100).setScale(1, RoundingMode.HALF_UP).doubleValue());
}else{
station.setCapacityUse(0.0);
}
}else{
station.setCapacityUse(0.0);
}
// 开机数量
long on = reals.stream().filter(real -> itr.getRefDept().equals(real.getDeptId()) && real.getState()).count();
long sum = reals.stream().filter(real-> itr.getRefDept().equals(real.getDeptId())).count();
if(sum > 0){
station.setDeviceUse(BigDecimal.valueOf(on / (double)sum * 100).setScale(2, RoundingMode.HALF_UP).doubleValue());
}else{
station.setDeviceUse(0.0);
}
}
return station;
}).collect(Collectors.toList());
double generateSum = result.stream().mapToDouble(HydroelectricAreaStationVo::getGenerateYear).sum();
// 返回结果集
if(generateSum <= 0){
return result.stream().peek(scale-> scale.setAreaMakeUp(0.0)).filter(scale-> Math.abs(scale.getCapacityUse()) > 0 || Math.abs(scale.getAreaMakeUp()) > 0
|| Math.abs(scale.getDeviceUse()) > 0 || Math.abs(scale.getGenerateRate()) > 0)
.sorted(Comparator.comparing(HydroelectricAreaStationVo::getGenerateYear).reversed()).collect(Collectors.toList());
}
return result.stream().peek(scale-> scale.setAreaMakeUp(BigDecimal.valueOf(scale.getGenerateYear() / generateSum * 100).setScale(1, RoundingMode.HALF_UP).doubleValue())).
filter(scale-> Math.abs(scale.getCapacityUse()) > 0 || Math.abs(scale.getAreaMakeUp()) > 0
|| Math.abs(scale.getDeviceUse()) > 0 || Math.abs(scale.getGenerateRate()) > 0)
.sorted(Comparator.comparing(HydroelectricAreaStationVo::getGenerateYear).reversed()).collect(Collectors.toList());
}
/**
* 温度
* @param nowWeather
* @param code
*/
private String stationTemp(Map<String, HeWeatherWeatherNowResponse> nowWeather, String code) {
// 实时天气
if(MapUtils.isNotEmpty(nowWeather) && nowWeather.containsKey(code)){
HeWeatherWeatherNowResponse nowData = nowWeather.get(code);
if(ObjectUtil.isNotEmpty(nowData.getNow())){
return nowData.getNow().getTemp();
}
}
return "21";
}
// 站点七日内天气
private List<Daily> stationWeather(Map<String, HeWeatherWeatherDailyResponse> weekWeather, String code) {
// 实时天气
if(MapUtils.isNotEmpty(weekWeather) && weekWeather.containsKey(code)){
HeWeatherWeatherDailyResponse weekData = weekWeather.get(code);
return weekData.getDaily();
}
return new ArrayList<>();
}
/**
* 区域下站点
* @param deptId
* @return
*/
private List<StationEntity> stationByArea(Long deptId) {
// 用户权限机构
R<List<Dept>> depts = sysClient.getDeptByCurrentUser();
if(!depts.isSuccess() || CollectionUtil.isEmpty(depts.getData())){
return new ArrayList<>();
}
List<Long> deptIds = depts.getData().stream().filter(dept->dept.getParentId().equals(deptId)).map(Dept::getId).collect(Collectors.toList());
if (CollectionUtil.isEmpty(deptIds)) {
return new ArrayList<>();
}
return stationService.list(Wrappers.<StationEntity>lambdaQuery()
.eq(StationEntity::getType, HydroelectricConstant.HYDROPOWER)
.eq(StationEntity::getServeType,HydroelectricConstant.PROXY_OPEARIONAL)
.in(StationEntity::getRefDept,deptIds)
);
}
/**
* 站点近30天降雨数据 * 站点近30天降雨数据
* @param station * @param station
* @return * @return
@ -269,15 +778,15 @@ public class HydroelectricServiceImpl implements HydroelectricService {
generateMon.setMonth(date.getMonth() + 1); generateMon.setMonth(date.getMonth() + 1);
// 计划发电量 // 计划发电量
if(CollectionUtil.isNotEmpty(plans)){ if(CollectionUtil.isNotEmpty(plans)){
generateMon.setPlanPower(plans.stream().filter(plan -> plan.getMon().contains(DateUtil.format(date,"yyyy-MM"))).mapToDouble(PlanPowerYearVo::getPlanPower).sum()); generateMon.setPlanGenerate(plans.stream().filter(plan -> plan.getMon().contains(DateUtil.format(date,"yyyy-MM"))).mapToDouble(PlanPowerYearVo::getPlanPower).sum());
}else{ }else{
generateMon.setPlanPower(0.0); generateMon.setPlanGenerate(0.0);
} }
// 实际发电 // 实际发电
if(MapUtils.isNotEmpty(map)){ if(MapUtils.isNotEmpty(map)){
generateMon.setPower(map.entrySet().stream().filter(entry->entry.getKey().equals(mon)).mapToDouble(Map.Entry::getValue).sum()); generateMon.setGenerate(map.entrySet().stream().filter(entry->entry.getKey().equals(mon)).mapToDouble(Map.Entry::getValue).sum());
}else{ }else{
generateMon.setPlanPower(0.0); generateMon.setGenerate(0.0);
} }
return generateMon; return generateMon;
}).collect(Collectors.toList()); }).collect(Collectors.toList());

2
hzims-service/operational/src/main/java/com/hnac/hzims/operational/main/service/impl/HydropowerServiceImpl.java

@ -18,7 +18,7 @@ import com.hnac.hzims.operational.defect.entity.OperPhenomenonEntity;
import com.hnac.hzims.operational.defect.service.IOperPhenomenonService; import com.hnac.hzims.operational.defect.service.IOperPhenomenonService;
import com.hnac.hzims.operational.duty.service.IImsDutyMainService; import com.hnac.hzims.operational.duty.service.IImsDutyMainService;
import com.hnac.hzims.operational.duty.vo.DutyMainInfoVo; import com.hnac.hzims.operational.duty.vo.DutyMainInfoVo;
import com.hnac.hzims.operational.homePage.Hydroelectric.vo.HydroelectricPowerRainVo; import com.hnac.hzims.operational.homePage.hydroelectric.vo.HydroelectricPowerRainVo;
import com.hnac.hzims.operational.main.constant.HomePageConstant; import com.hnac.hzims.operational.main.constant.HomePageConstant;
import com.hnac.hzims.operational.main.entity.UserDeptEntity; import com.hnac.hzims.operational.main.entity.UserDeptEntity;
import com.hnac.hzims.operational.main.service.*; import com.hnac.hzims.operational.main.service.*;

Loading…
Cancel
Save