Merge branch 'dev-tw'

This commit is contained in:
tangwei 2026-06-24 10:41:08 +08:00
commit b03837f201
62 changed files with 6748 additions and 283 deletions

View File

@ -64,12 +64,14 @@ public class SecurityConfig {
// .requestMatchers("/eng/**").permitAll() // .requestMatchers("/eng/**").permitAll()
// .requestMatchers("/eq/**").permitAll() // .requestMatchers("/eq/**").permitAll()
// .requestMatchers("/env/**").permitAll() // .requestMatchers("/env/**").permitAll()
// .requestMatchers("/warn/**").permitAll()
// .requestMatchers("/wt/**").permitAll() // .requestMatchers("/wt/**").permitAll()
// .requestMatchers("/fb/**").permitAll() // .requestMatchers("/fb/**").permitAll()
// .requestMatchers("/zq/**").permitAll() // .requestMatchers("/zq/**").permitAll()
// .requestMatchers("/wq/**").permitAll() // .requestMatchers("/wq/**").permitAll()
// .requestMatchers("/vd/**").permitAll() // .requestMatchers("/vd/**").permitAll()
// .requestMatchers("/fp/**").permitAll() // .requestMatchers("/fp/**").permitAll()
// .requestMatchers("/fpr/**").permitAll()
// .requestMatchers("/fh/**").permitAll() // .requestMatchers("/fh/**").permitAll()
// .requestMatchers("/data/**").permitAll() // .requestMatchers("/data/**").permitAll()
.requestMatchers("/sms/**").permitAll() .requestMatchers("/sms/**").permitAll()

View File

@ -64,14 +64,14 @@ public class SwaggerConfig {
@Bean @Bean
public GroupedOpenApi groupEnvWTApi() { public GroupedOpenApi groupEnvWTApi() {
return GroupedOpenApi.builder() return GroupedOpenApi.builder()
.group("3.1 全过程-生态环保数据服务-水温监测") .group("3.1 全过程-生态环保数据服务-水温监测(wt)")
.packagesToScan("com.yfd.platform.qgc_env.wt.controller") .packagesToScan("com.yfd.platform.qgc_env.wt.controller")
.build(); .build();
} }
@Bean @Bean
public GroupedOpenApi groupEnvWQApi() { public GroupedOpenApi groupEnvWQApi() {
return GroupedOpenApi.builder() return GroupedOpenApi.builder()
.group("3.2 全过程-生态环保数据服务-水质监测") .group("3.2 全过程-生态环保数据服务-水质监测(wq)")
.packagesToScan("com.yfd.platform.qgc_env.wq.controller") .packagesToScan("com.yfd.platform.qgc_env.wq.controller")
.build(); .build();
} }
@ -79,7 +79,7 @@ public class SwaggerConfig {
@Bean @Bean
public GroupedOpenApi groupEnvFPApi() { public GroupedOpenApi groupEnvFPApi() {
return GroupedOpenApi.builder() return GroupedOpenApi.builder()
.group("3.3 全过程-生态环保数据服务-过鱼设施") .group("3.3 全过程-生态环保数据服务-过鱼设施(fp)")
.packagesToScan("com.yfd.platform.qgc_env.fp.controller") .packagesToScan("com.yfd.platform.qgc_env.fp.controller")
.build(); .build();
} }
@ -87,7 +87,7 @@ public class SwaggerConfig {
@Bean @Bean
public GroupedOpenApi groupEnvVDApi() { public GroupedOpenApi groupEnvVDApi() {
return GroupedOpenApi.builder() return GroupedOpenApi.builder()
.group("3.3.1 全过程-生态环保数据服务-过鱼设施-过鱼监测(VD视频模块)") .group("3.3.1 全过程-生态环保数据服务-过鱼设施-过鱼监测(vd视频模块)")
.packagesToScan("com.yfd.platform.qgc_env.vd.controller") .packagesToScan("com.yfd.platform.qgc_env.vd.controller")
.build(); .build();
} }
@ -97,7 +97,7 @@ public class SwaggerConfig {
@Bean @Bean
public GroupedOpenApi groupEnvFHApi() { public GroupedOpenApi groupEnvFHApi() {
return GroupedOpenApi.builder() return GroupedOpenApi.builder()
.group("3.4 全过程-生态环保数据服务-栖息地") .group("3.4 全过程-生态环保数据服务-栖息地(fh)")
.packagesToScan("com.yfd.platform.qgc_env.fh.controller") .packagesToScan("com.yfd.platform.qgc_env.fh.controller")
.build(); .build();
} }
@ -105,7 +105,7 @@ public class SwaggerConfig {
@Bean @Bean
public GroupedOpenApi groupEnvZQApi() { public GroupedOpenApi groupEnvZQApi() {
return GroupedOpenApi.builder() return GroupedOpenApi.builder()
.group("3.4.1 全过程-生态环保数据服务-栖息地-水文模块") .group("3.4.1 全过程-生态环保数据服务-栖息地-水文模块(zq)")
.packagesToScan("com.yfd.platform.qgc_env.zq.controller") .packagesToScan("com.yfd.platform.qgc_env.zq.controller")
.build(); .build();
} }
@ -114,7 +114,7 @@ public class SwaggerConfig {
@Bean @Bean
public GroupedOpenApi groupEnvVapApi() { public GroupedOpenApi groupEnvVapApi() {
return GroupedOpenApi.builder() return GroupedOpenApi.builder()
.group("3.5 全过程-生态环保数据服务-珍稀动植物") .group("3.5 全过程-生态环保数据服务-珍稀动植物(vap)")
.packagesToScan("com.yfd.platform.qgc_env.vap.controller") .packagesToScan("com.yfd.platform.qgc_env.vap.controller")
.build(); .build();
} }
@ -122,7 +122,7 @@ public class SwaggerConfig {
@Bean @Bean
public GroupedOpenApi groupEnvFprApi() { public GroupedOpenApi groupEnvFprApi() {
return GroupedOpenApi.builder() return GroupedOpenApi.builder()
.group("3.6 全过程-生态环保数据服务-鱼类调查") .group("3.6 全过程-生态环保数据服务-鱼类调查(fpr)")
.packagesToScan("com.yfd.platform.qgc_env.fpr.controller") .packagesToScan("com.yfd.platform.qgc_env.fpr.controller")
.build(); .build();
} }
@ -130,11 +130,21 @@ public class SwaggerConfig {
@Bean @Bean
public GroupedOpenApi groupEnvFbApi() { public GroupedOpenApi groupEnvFbApi() {
return GroupedOpenApi.builder() return GroupedOpenApi.builder()
.group("3.7 全过程-生态环保数据服务-增殖放流") .group("3.7 全过程-生态环保数据服务-增殖放流(fb)")
.packagesToScan("com.yfd.platform.qgc_env.fb.controller") .packagesToScan("com.yfd.platform.qgc_env.fb.controller")
.build(); .build();
} }
@Bean
public GroupedOpenApi groupEnvWarnApi() {
return GroupedOpenApi.builder()
.group("3.8 全过程-生态环保数据服务-智能告警(warn)")
.packagesToScan("com.yfd.platform.qgc_env.warn.controller")
.build();
}
@ -150,7 +160,7 @@ public class SwaggerConfig {
@Bean @Bean
public GroupedOpenApi groupEngEqApi() { public GroupedOpenApi groupEngEqApi() {
return GroupedOpenApi.builder() return GroupedOpenApi.builder()
.group("4.1. 全过程-常规水电数据服务-生态流量") .group("4.1. 全过程-常规水电数据服务-生态流量(eq)")
.packagesToScan("com.yfd.platform.qgc_eng.eq.controller") .packagesToScan("com.yfd.platform.qgc_eng.eq.controller")
.build(); .build();
} }

View File

@ -5,6 +5,7 @@ import com.yfd.platform.annotation.Log;
import com.yfd.platform.common.DataSourceRequest; import com.yfd.platform.common.DataSourceRequest;
import com.yfd.platform.config.ResponseResult; import com.yfd.platform.config.ResponseResult;
import com.yfd.platform.qgc_base.domain.SdEngInfoBH; import com.yfd.platform.qgc_base.domain.SdEngInfoBH;
import com.yfd.platform.qgc_base.domain.SdEngInfoBHOperateRequest;
import com.yfd.platform.qgc_base.domain.SdEngInfoBHRequest; import com.yfd.platform.qgc_base.domain.SdEngInfoBHRequest;
import com.yfd.platform.qgc_base.service.ISdEngInfoBHService; import com.yfd.platform.qgc_base.service.ISdEngInfoBHService;
import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Operation;
@ -91,16 +92,16 @@ public class SdEngInfoBHController {
@Log(module = "电站管理", value = "新增电站") @Log(module = "电站管理", value = "新增电站")
@PostMapping("/add") @PostMapping("/add")
@Operation(summary = "新增电站") @Operation(summary = "新增电站")
public ResponseResult add(@RequestBody SdEngInfoBH engInfo) { public ResponseResult add(@RequestBody SdEngInfoBHOperateRequest request) {
boolean result = engInfoBHService.addEngInfo(engInfo); boolean result = engInfoBHService.addEngInfo(request.getEngInfo(), request.getSource());
return result ? ResponseResult.success("新增成功") : ResponseResult.error("新增失败"); return result ? ResponseResult.success("新增成功") : ResponseResult.error("新增失败");
} }
@Log(module = "电站管理", value = "修改电站") @Log(module = "电站管理", value = "修改电站")
@PostMapping("/update") @PostMapping("/update")
@Operation(summary = "修改电站") @Operation(summary = "修改电站")
public ResponseResult update(@RequestBody SdEngInfoBH engInfo) { public ResponseResult update(@RequestBody SdEngInfoBHOperateRequest request) {
boolean result = engInfoBHService.updateEngInfo(engInfo); boolean result = engInfoBHService.updateEngInfo(request.getEngInfo(), request.getSource());
return result ? ResponseResult.success("修改成功") : ResponseResult.error("修改失败"); return result ? ResponseResult.success("修改成功") : ResponseResult.error("修改失败");
} }
@ -111,4 +112,5 @@ public class SdEngInfoBHController {
boolean result = engInfoBHService.deleteEngInfo(stcd); boolean result = engInfoBHService.deleteEngInfo(stcd);
return result ? ResponseResult.success("删除成功") : ResponseResult.error("删除失败"); return result ? ResponseResult.success("删除成功") : ResponseResult.error("删除失败");
} }
} }

View File

@ -27,6 +27,12 @@ public class SdEngMonitorController {
return ResponseResult.successData(engInfoBHService.getStInfoByStcd(stcd)); return ResponseResult.successData(engInfoBHService.getStInfoByStcd(stcd));
} }
@GetMapping("/msstbprpt/getStcdInfo")
@Operation(summary = "根据站码查询电站详情兼容结构")
public ResponseResult getStcdInfo(@RequestParam String stcd) {
return ResponseResult.successData(engInfoBHService.getStcdInfo(stcd));
}
@PostMapping("/eiaapproval/GetKendoList") @PostMapping("/eiaapproval/GetKendoList")
@Operation(summary = "查询生态环保批复文件列表") @Operation(summary = "查询生态环保批复文件列表")
public ResponseResult getEiaapprovalKendoList(@RequestBody DataSourceRequest dataSourceRequest) { public ResponseResult getEiaapprovalKendoList(@RequestBody DataSourceRequest dataSourceRequest) {

View File

@ -111,6 +111,15 @@ public class SdRvcdDicController {
return ResponseResult.successData(rvcdDicService.selectForDropdown(rvnm, rvcd)); return ResponseResult.successData(rvcdDicService.selectForDropdown(rvnm, rvcd));
} }
@GetMapping("/selectRvcdDropdown")
@Operation(summary = "流域下拉框列表查询")
public ResponseResult selectRvcdDropdown(
@RequestParam(required = false) String rvnm,
@RequestParam(required = false) String baseId
) {
return ResponseResult.successData(rvcdDicService.selectRvcdDropdown(rvnm,baseId));
}
@GetMapping("/regDropdown") @GetMapping("/regDropdown")
@Operation(summary = "下拉框列表查询(注册)") @Operation(summary = "下拉框列表查询(注册)")
public ResponseResult regDropdown( public ResponseResult regDropdown(

View File

@ -0,0 +1,32 @@
package com.yfd.platform.qgc_base.domain;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import java.io.Serializable;
import java.util.Date;
@Data
@TableName("MS_OPERATION_LOG")
public class MsOperationLog implements Serializable {
private static final long serialVersionUID = 1L;
@TableId(type = IdType.ASSIGN_UUID)
private String id;
@TableField("OPERATOR")
private String operator;
@TableField("OPERATE_TIME")
private Date operateTime;
@TableField("SOURCE")
private String source;
@TableField("REMARK")
private String remark;
}

View File

@ -0,0 +1,49 @@
package com.yfd.platform.qgc_base.domain;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import java.io.Serializable;
@Data
@TableName("MS_OPERATION_LOG_DETAIL")
public class MsOperationLogDetail implements Serializable {
private static final long serialVersionUID = 1L;
@TableId(type = IdType.ASSIGN_UUID)
private String id;
@TableField("MAIN_ID")
private String mainId;
@TableField("FIELD_CODE")
private String fieldCode;
@TableField("TABLE_NAME")
private String tableName;
@TableField("FIELD_MEANING")
private String fieldMeaning;
@TableField("STATION_CODE")
private String stationCode;
@TableField("OLD_VALUE_CODE")
private String oldValueCode;
@TableField("OLD_VALUE_NAME")
private String oldValueName;
@TableField("NEW_VALUE_CODE")
private String newValueCode;
@TableField("NEW_VALUE_NAME")
private String newValueName;
@TableField("REMARK")
private String remark;
}

View File

@ -0,0 +1,11 @@
package com.yfd.platform.qgc_base.domain;
import lombok.Data;
@Data
public class SdEngInfoBHOperateRequest {
private SdEngInfoBH engInfo;
private String source;
}

View File

@ -13,8 +13,10 @@ public class SdEngInfoBHRequest {
private String baseId; private String baseId;
private String hbrvcd; private String hbrvcd;
private String rvcd; private String rvcd;
private String reachcd;
private List<String> basIds; private List<String> basIds;
private List<String> hbrvcds; private List<String> hbrvcds;
private List<String> rvcds; private List<String> rvcds;
// private List<String> rvcds;
private String ennm; private String ennm;
} }

View File

@ -0,0 +1,51 @@
package com.yfd.platform.qgc_base.domain.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
@Data
@Schema(description = "电站单站基础信息")
public class EngStBaseInfoVo {
@Schema(description = "站点编码")
private String stcd;
@Schema(description = "站点名称")
private String stnm;
@Schema(description = "站类编码")
private String sttpCode;
@Schema(description = "站类名称")
private String sttpName;
@Schema(description = "站类全路径")
private String sttpFullPath;
@Schema(description = "站类层级")
private Integer sttpTreeLevel;
@Schema(description = "关联站点编码")
private String stCode;
@Schema(description = "关联站点名称")
private String stName;
@Schema(description = "所属基地编码")
private String baseId;
@Schema(description = "所属基地名称")
private String baseName;
@Schema(description = "所属基地流域编码")
private String hbrvcd;
@Schema(description = "所属基地流域名称")
private String hbrvcdName;
@Schema(description = "所属流域编码")
private String rvcd;
@Schema(description = "所属流域名称")
private String rvcdName;
}

View File

@ -0,0 +1,26 @@
package com.yfd.platform.qgc_base.domain.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
@Data
@Schema(description = "电站详情返回")
public class EngStInfoResultVo {
@Schema(description = "主信息兼容对象")
private Map<String, Object> msStbprpT = new LinkedHashMap<>();
@Schema(description = "测值列表")
private List<Object> stcdValVoList = new ArrayList<>();
@Schema(description = "关联列表")
private List<Object> relList = new ArrayList<>();
@Schema(description = "站点基础信息")
private EngStBaseInfoVo stBaseInfo;
}

View File

@ -20,6 +20,7 @@ public class EngVmsstbprptVo implements Serializable {
private String ennm; private String ennm;
private String baseId; private String baseId;
private String baseName; private String baseName;
private String reachcdName;
private String hbrvcd; private String hbrvcd;
private String hbrvcdName; private String hbrvcdName;
private String rvcd; private String rvcd;
@ -33,6 +34,7 @@ public class EngVmsstbprptVo implements Serializable {
private Date aiodt; private Date aiodt;
private String bldstt; private String bldstt;
private Integer bldsttCcode; private Integer bldsttCcode;
private String bldsttCcodeName;
private Double nrupar; private Double nrupar;
private Double dstcrvr; private Double dstcrvr;
private Double avyrp; private Double avyrp;
@ -79,6 +81,7 @@ public class EngVmsstbprptVo implements Serializable {
private Double ddcp; private Double ddcp;
private Double cpsc; private Double cpsc;
private String rgcp; private String rgcp;
private String rgcpName;
private Double dsflzmxq; private Double dsflzmxq;
private Double dsflzxyz; private Double dsflzxyz;
private Double ckflzmxq; private Double ckflzmxq;
@ -102,7 +105,9 @@ public class EngVmsstbprptVo implements Serializable {
private Double unyge; private Double unyge;
private Double gap; private Double gap;
private String dvtp; private String dvtp;
private String dvtpName;
private Integer dtin; private Integer dtin;
private String dtinName;
private Integer baseStepSort; private Integer baseStepSort;
private Integer rvcdStepSort; private Integer rvcdStepSort;
private Integer rstcdStepSort; private Integer rstcdStepSort;

View File

@ -0,0 +1,7 @@
package com.yfd.platform.qgc_base.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.yfd.platform.qgc_base.domain.MsOperationLogDetail;
public interface MsOperationLogDetailMapper extends BaseMapper<MsOperationLogDetail> {
}

View File

@ -0,0 +1,7 @@
package com.yfd.platform.qgc_base.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.yfd.platform.qgc_base.domain.MsOperationLog;
public interface MsOperationLogMapper extends BaseMapper<MsOperationLog> {
}

View File

@ -32,4 +32,6 @@ public interface SdRvcdDicMapper extends BaseMapper<SdRvcdDic> {
* 注册场景下拉框查询仅返回能被电站表 RVCD 命中的流域 * 注册场景下拉框查询仅返回能被电站表 RVCD 命中的流域
*/ */
List<SdRvcdDic> selectRegDropdownWithEng(@Param("rvnm") String rvnm, @Param("rvcd") String rvcd); List<SdRvcdDic> selectRegDropdownWithEng(@Param("rvnm") String rvnm, @Param("rvcd") String rvcd);
List<SdRvcdDic> selectRvcdDropdown(@Param("rvnm") String rvnm,@Param("baseId") String baseId);
} }

View File

@ -0,0 +1,10 @@
package com.yfd.platform.qgc_base.service;
import com.yfd.platform.qgc_base.domain.SdEngInfoBH;
public interface IMsOperationLogService {
void recordEngAddLog(SdEngInfoBH engInfo, String source);
void recordEngUpdateLog(SdEngInfoBH before, SdEngInfoBH changeSet, String source);
}

View File

@ -8,6 +8,7 @@ import com.yfd.platform.qgc_base.domain.SdEngInfoBH;
import com.yfd.platform.qgc_base.domain.SdEngInfoBHRequest; import com.yfd.platform.qgc_base.domain.SdEngInfoBHRequest;
import com.yfd.platform.qgc_base.domain.vo.EngBaseInfoVo; import com.yfd.platform.qgc_base.domain.vo.EngBaseInfoVo;
import com.yfd.platform.qgc_base.domain.vo.EngEiaapprovalVo; import com.yfd.platform.qgc_base.domain.vo.EngEiaapprovalVo;
import com.yfd.platform.qgc_base.domain.vo.EngStInfoResultVo;
import com.yfd.platform.qgc_base.domain.vo.EngVmsstbprptVo; import com.yfd.platform.qgc_base.domain.vo.EngVmsstbprptVo;
import java.util.List; import java.util.List;
@ -52,11 +53,15 @@ public interface ISdEngInfoBHService extends IService<SdEngInfoBH> {
*/ */
boolean addEngInfo(SdEngInfoBH engInfo); boolean addEngInfo(SdEngInfoBH engInfo);
boolean addEngInfo(SdEngInfoBH engInfo, String source);
/** /**
* 修改电站 * 修改电站
*/ */
boolean updateEngInfo(SdEngInfoBH engInfo); boolean updateEngInfo(SdEngInfoBH engInfo);
boolean updateEngInfo(SdEngInfoBH engInfo, String source);
/** /**
* 删除电站 * 删除电站
*/ */
@ -66,6 +71,8 @@ public interface ISdEngInfoBHService extends IService<SdEngInfoBH> {
EngBaseInfoVo getStInfoByStcd(String stcd); EngBaseInfoVo getStInfoByStcd(String stcd);
EngStInfoResultVo getStcdInfo(String stcd);
DataSourceResult<EngEiaapprovalVo> getEiaapprovalKendoList(DataSourceRequest dataSourceRequest); DataSourceResult<EngEiaapprovalVo> getEiaapprovalKendoList(DataSourceRequest dataSourceRequest);
DataSourceResult<EngVmsstbprptVo> getVmsstbprptKendoList(DataSourceRequest dataSourceRequest); DataSourceResult<EngVmsstbprptVo> getVmsstbprptKendoList(DataSourceRequest dataSourceRequest);

View File

@ -55,5 +55,7 @@ public interface ISdRvcdDicService extends IService<SdRvcdDic> {
List<SdRvcdDic> selectForDropdown(String rvnm, String rvcd); List<SdRvcdDic> selectForDropdown(String rvnm, String rvcd);
List<SdRvcdDic> selectRvcdDropdown(String rvnm,String baseId);
List<SdRvcdDic> regDropdown(String rvnm, String rvcd); List<SdRvcdDic> regDropdown(String rvnm, String rvcd);
} }

View File

@ -0,0 +1,213 @@
package com.yfd.platform.qgc_base.service.impl;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.bean.copier.CopyOptions;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.yfd.platform.qgc_base.domain.MsOperationLog;
import com.yfd.platform.qgc_base.domain.MsOperationLogDetail;
import com.yfd.platform.qgc_base.domain.SdEngInfoBH;
import com.yfd.platform.qgc_base.mapper.MsOperationLogDetailMapper;
import com.yfd.platform.qgc_base.mapper.MsOperationLogMapper;
import com.yfd.platform.qgc_base.service.IMsOperationLogService;
import com.yfd.platform.utils.SecurityUtils;
import jakarta.annotation.Resource;
import org.springframework.stereotype.Service;
import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
import java.util.ArrayList;
import java.util.Date;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
@Service
public class MsOperationLogServiceImpl implements IMsOperationLogService {
private static final String ENG_TABLE_NAME = "SD_ENGINFO_B_H";
private static final Map<String, String> ENG_FIELD_MEANING_MAP = new LinkedHashMap<>();
static {
ENG_FIELD_MEANING_MAP.put("STCD", "电站编码");
ENG_FIELD_MEANING_MAP.put("ENNM", "电站名称");
ENG_FIELD_MEANING_MAP.put("BASE_ID", "所属基地编码");
ENG_FIELD_MEANING_MAP.put("HBRVCD", "所属基地流域编码");
ENG_FIELD_MEANING_MAP.put("RVCD", "所属流域编码");
ENG_FIELD_MEANING_MAP.put("ADDVCD", "所属行政区编码");
ENG_FIELD_MEANING_MAP.put("HYCD", "所属公司编码");
ENG_FIELD_MEANING_MAP.put("BLPRD", "所属建设阶段");
ENG_FIELD_MEANING_MAP.put("BLDSTT", "建设状态");
ENG_FIELD_MEANING_MAP.put("BLDSTT_CODE", "建设状态分类");
ENG_FIELD_MEANING_MAP.put("DVTP", "开发方式");
ENG_FIELD_MEANING_MAP.put("DTIN", "数据是否接入");
ENG_FIELD_MEANING_MAP.put("RGCP", "调节性能");
ENG_FIELD_MEANING_MAP.put("LGTD", "经度");
ENG_FIELD_MEANING_MAP.put("LTTD", "纬度");
ENG_FIELD_MEANING_MAP.put("STLC", "站址");
ENG_FIELD_MEANING_MAP.put("ORDER_INDEX", "排序");
}
@Resource
private MsOperationLogMapper msOperationLogMapper;
@Resource
private MsOperationLogDetailMapper msOperationLogDetailMapper;
@Override
public void recordEngAddLog(SdEngInfoBH engInfo, String source) {
if (engInfo == null) {
return;
}
MsOperationLog mainLog = buildMainLog("新增电站", source);
msOperationLogMapper.insert(mainLog);
List<MsOperationLogDetail> details = new ArrayList<>();
for (Field field : SdEngInfoBH.class.getDeclaredFields()) {
if (shouldSkipField(field)) {
continue;
}
field.setAccessible(true);
Object newValue = getFieldValue(field, engInfo);
if (newValue == null) {
continue;
}
details.add(buildDetail(mainLog.getId(), engInfo.getStcd(), resolveColumnName(field),
null, newValue, "新增字段值"));
}
batchInsertDetails(details);
}
@Override
public void recordEngUpdateLog(SdEngInfoBH before, SdEngInfoBH changeSet, String source) {
if (before == null || changeSet == null) {
return;
}
SdEngInfoBH after = BeanUtil.copyProperties(before, SdEngInfoBH.class);
BeanUtil.copyProperties(changeSet, after, CopyOptions.create().ignoreNullValue());
MsOperationLog mainLog = buildMainLog("修改电站", source);
msOperationLogMapper.insert(mainLog);
List<MsOperationLogDetail> details = new ArrayList<>();
for (Field field : SdEngInfoBH.class.getDeclaredFields()) {
if (shouldSkipField(field)) {
continue;
}
field.setAccessible(true);
Object oldValue = getFieldValue(field, before);
Object newValue = getFieldValue(field, after);
if (equalsValue(oldValue, newValue)) {
continue;
}
details.add(buildDetail(mainLog.getId(), after.getStcd(), resolveColumnName(field),
oldValue, newValue, "修改字段值"));
}
batchInsertDetails(details);
}
private MsOperationLog buildMainLog(String remark, String source) {
MsOperationLog log = new MsOperationLog();
log.setOperator(resolveOperator());
log.setOperateTime(new Date());
log.setSource(StrUtil.trimToNull(source));
log.setRemark(remark);
return log;
}
private MsOperationLogDetail buildDetail(String mainId,
String stationCode,
String fieldCode,
Object oldValue,
Object newValue,
String remark) {
MsOperationLogDetail detail = new MsOperationLogDetail();
detail.setMainId(mainId);
detail.setTableName(ENG_TABLE_NAME);
detail.setStationCode(stationCode);
detail.setFieldCode(fieldCode);
detail.setFieldMeaning(ENG_FIELD_MEANING_MAP.getOrDefault(fieldCode, fieldCode));
detail.setOldValueCode(formatValue(oldValue));
detail.setOldValueName(formatValue(oldValue));
detail.setNewValueCode(formatValue(newValue));
detail.setNewValueName(formatValue(newValue));
detail.setRemark(remark);
return detail;
}
private void batchInsertDetails(List<MsOperationLogDetail> details) {
msOperationLogDetailMapper.insert(details);
}
private boolean shouldSkipField(Field field) {
if (Modifier.isStatic(field.getModifiers())) {
return true;
}
TableField tableField = field.getAnnotation(TableField.class);
if (tableField != null && !tableField.exist()) {
return true;
}
return false;
}
private String resolveColumnName(Field field) {
TableId tableId = field.getAnnotation(TableId.class);
if (tableId != null) {
return camelToUpperUnderline(field.getName());
}
TableField tableField = field.getAnnotation(TableField.class);
if (tableField != null && StrUtil.isNotBlank(tableField.value())) {
return tableField.value();
}
return camelToUpperUnderline(field.getName());
}
private Object getFieldValue(Field field, Object target) {
try {
return field.get(target);
} catch (IllegalAccessException e) {
return null;
}
}
private boolean equalsValue(Object oldValue, Object newValue) {
return StrUtil.equals(formatValue(oldValue), formatValue(newValue));
}
private String formatValue(Object value) {
if (value == null) {
return null;
}
if (value instanceof Date date) {
return DateUtil.formatDateTime(date);
}
return String.valueOf(value);
}
private String resolveOperator() {
try {
return SecurityUtils.getCurrentUsername();
} catch (Exception ignored) {
try {
return SecurityUtils.getUserId();
} catch (Exception ex) {
return null;
}
}
}
private String camelToUpperUnderline(String text) {
StringBuilder builder = new StringBuilder();
for (int i = 0; i < text.length(); i++) {
char ch = text.charAt(i);
if (Character.isUpperCase(ch) && i > 0) {
builder.append('_');
}
builder.append(Character.toUpperCase(ch));
}
return builder.toString();
}
}

View File

@ -5,6 +5,7 @@ import cn.hutool.core.bean.copier.CopyOptions;
import cn.hutool.core.collection.CollUtil; import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.StrUtil; import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.yfd.platform.common.DataSourceLoadOptionsBase; import com.yfd.platform.common.DataSourceLoadOptionsBase;
@ -19,13 +20,17 @@ import com.yfd.platform.qgc_base.domain.SdEngInfoBH;
import com.yfd.platform.qgc_base.domain.SdEngInfoBHRequest; import com.yfd.platform.qgc_base.domain.SdEngInfoBHRequest;
import com.yfd.platform.qgc_base.domain.vo.EngBaseInfoVo; import com.yfd.platform.qgc_base.domain.vo.EngBaseInfoVo;
import com.yfd.platform.qgc_base.domain.vo.EngEiaapprovalVo; import com.yfd.platform.qgc_base.domain.vo.EngEiaapprovalVo;
import com.yfd.platform.qgc_base.domain.vo.EngStBaseInfoVo;
import com.yfd.platform.qgc_base.domain.vo.EngStInfoResultVo;
import com.yfd.platform.qgc_base.domain.vo.EngVmsstbprptVo; import com.yfd.platform.qgc_base.domain.vo.EngVmsstbprptVo;
import com.yfd.platform.qgc_base.mapper.SdEngInfoBHMapper; import com.yfd.platform.qgc_base.mapper.SdEngInfoBHMapper;
import com.yfd.platform.qgc_base.service.IMsOperationLogService;
import com.yfd.platform.qgc_base.service.ISdEngInfoBHService; import com.yfd.platform.qgc_base.service.ISdEngInfoBHService;
import com.yfd.platform.utils.QgcQueryWrapperUtil; import com.yfd.platform.utils.QgcQueryWrapperUtil;
import com.yfd.platform.utils.SecurityUtils; import com.yfd.platform.utils.SecurityUtils;
import jakarta.annotation.Resource; import jakarta.annotation.Resource;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.StringUtils; import org.springframework.util.StringUtils;
import java.util.ArrayList; import java.util.ArrayList;
@ -55,6 +60,9 @@ public class SdEngInfoBHServiceImpl extends ServiceImpl<SdEngInfoBHMapper, SdEng
@Resource @Resource
private SysUserDataScopeMapper sysUserDataScopeMapper; private SysUserDataScopeMapper sysUserDataScopeMapper;
@Resource
private IMsOperationLogService msOperationLogService;
@Override @Override
public Page<SdEngInfoBH> queryPageList(Page<SdEngInfoBH> page, String ennm, String rvcd, String baseId, String hycd) { public Page<SdEngInfoBH> queryPageList(Page<SdEngInfoBH> page, String ennm, String rvcd, String baseId, String hycd) {
LambdaQueryWrapper<SdEngInfoBH> wrapper = new LambdaQueryWrapper<>(); LambdaQueryWrapper<SdEngInfoBH> wrapper = new LambdaQueryWrapper<>();
@ -94,17 +102,20 @@ public class SdEngInfoBHServiceImpl extends ServiceImpl<SdEngInfoBHMapper, SdEng
String hbrvcd = sdEngInfoBHRequest.getHbrvcd(); String hbrvcd = sdEngInfoBHRequest.getHbrvcd();
String ennm = sdEngInfoBHRequest.getEnnm(); String ennm = sdEngInfoBHRequest.getEnnm();
String rvcd = sdEngInfoBHRequest.getRvcd(); String rvcd = sdEngInfoBHRequest.getRvcd();
String reachcd = sdEngInfoBHRequest.getReachcd();
List<String> rvcds = sdEngInfoBHRequest.getRvcds(); List<String> rvcds = sdEngInfoBHRequest.getRvcds();
List<String> hbrvcds = sdEngInfoBHRequest.getHbrvcds(); List<String> hbrvcds = sdEngInfoBHRequest.getHbrvcds();
LambdaQueryWrapper<SdEngInfoBH> wrapper = new LambdaQueryWrapper<>(); LambdaQueryWrapper<SdEngInfoBH> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(StringUtils.hasText(baseId), SdEngInfoBH::getBaseId, baseId) wrapper.eq(StringUtils.hasText(baseId), SdEngInfoBH::getBaseId, baseId)
.eq(StringUtils.hasText(hbrvcd), SdEngInfoBH::getHbrvcd, hbrvcd) .eq(StringUtils.hasText(hbrvcd), SdEngInfoBH::getHbrvcd, hbrvcd)
.eq(StrUtil.isNotBlank(reachcd), SdEngInfoBH::getRvcd, reachcd)
.eq(StrUtil.isNotBlank(rvcd), SdEngInfoBH::getReachcd, rvcd)
.eq(StrUtil.isNotBlank(rvcd), SdEngInfoBH::getReachcd, rvcd) .eq(StrUtil.isNotBlank(rvcd), SdEngInfoBH::getReachcd, rvcd)
.in(rvcds != null && !rvcds.isEmpty(), SdEngInfoBH::getReachcd, rvcds) .in(rvcds != null && !rvcds.isEmpty(), SdEngInfoBH::getReachcd, rvcds)
.in(hbrvcds != null && !hbrvcds.isEmpty(), SdEngInfoBH::getHbrvcd, hbrvcds) .in(hbrvcds != null && !hbrvcds.isEmpty(), SdEngInfoBH::getHbrvcd, hbrvcds)
.like(StringUtils.hasText(ennm), SdEngInfoBH::getEnnm, ennm) .like(StringUtils.hasText(ennm), SdEngInfoBH::getEnnm, ennm)
.select(SdEngInfoBH::getStcd, SdEngInfoBH::getEnnm, SdEngInfoBH::getBaseId) .select(SdEngInfoBH::getStcd, SdEngInfoBH::getEnnm, SdEngInfoBH::getReachcdName, SdEngInfoBH::getYrgeb, SdEngInfoBH::getBaseId)
.orderByAsc(SdEngInfoBH::getOrderIndex); .orderByAsc(SdEngInfoBH::getBaseId,SdEngInfoBH::getOrderIndex);
if("admin".equals(SecurityUtils.getCurrentUsername())){ if("admin".equals(SecurityUtils.getCurrentUsername())){
return this.list(wrapper); return this.list(wrapper);
@ -186,17 +197,39 @@ public class SdEngInfoBHServiceImpl extends ServiceImpl<SdEngInfoBHMapper, SdEng
@Override @Override
public boolean addEngInfo(SdEngInfoBH engInfo) { public boolean addEngInfo(SdEngInfoBH engInfo) {
return this.save(engInfo); return addEngInfo(engInfo, null);
}
@Override
@Transactional(rollbackFor = Exception.class)
public boolean addEngInfo(SdEngInfoBH engInfo, String source) {
boolean result = this.save(engInfo);
if (result) {
msOperationLogService.recordEngAddLog(engInfo, source);
}
return result;
} }
@Override @Override
public boolean updateEngInfo(SdEngInfoBH engInfo) { public boolean updateEngInfo(SdEngInfoBH engInfo) {
return this.updateById(engInfo); return updateEngInfo(engInfo, null);
}
@Override
@Transactional(rollbackFor = Exception.class)
public boolean updateEngInfo(SdEngInfoBH engInfo, String source) {
SdEngInfoBH before = engInfo == null ? null : this.getById(engInfo.getStcd());
boolean result = this.updateById(engInfo);
if (result && before != null) {
msOperationLogService.recordEngUpdateLog(before, engInfo, source);
}
return result;
} }
@Override @Override
public boolean deleteEngInfo(String stcd) { public boolean deleteEngInfo(String stcd) {
return this.removeById(stcd); return this.update( new LambdaUpdateWrapper<SdEngInfoBH>().eq(SdEngInfoBH::getStcd, stcd).set(SdEngInfoBH::getIsDeleted, 1));
// return this.removeById(stcd);
} }
@Override @Override
@ -369,12 +402,13 @@ public class SdEngInfoBHServiceImpl extends ServiceImpl<SdEngInfoBHMapper, SdEng
// } // }
// } // }
Page<?> page = null; // Page<?> page = null;
if (dataSourceRequest.getTake() > 0) { // if (dataSourceRequest.getTake() > 0) {
page = new Page<>(dataSourceRequest.getSkip() / dataSourceRequest.getTake() + 1, // page = new Page<>(dataSourceRequest.getSkip() / dataSourceRequest.getTake() + 1,
dataSourceRequest.getTake()); // dataSourceRequest.getTake());
} // }
DataSourceLoadOptionsBase loadOptions = dataSourceRequest.toDevRequest();
Page<?> page = loadOptions == null ? null : QgcQueryWrapperUtil.buildPage(loadOptions, loadOptions.getSkip(), loadOptions.getTake());
Map<String, Object> paramMap = new HashMap<>(); Map<String, Object> paramMap = new HashMap<>();
StringBuilder sql = new StringBuilder(buildEiaapprovalBaseSql()); StringBuilder sql = new StringBuilder(buildEiaapprovalBaseSql());
@ -462,6 +496,34 @@ public class SdEngInfoBHServiceImpl extends ServiceImpl<SdEngInfoBHMapper, SdEng
return vo; return vo;
} }
@Override
public EngStInfoResultVo getStcdInfo(String stcd) {
EngBaseInfoVo baseInfo = getStInfoByStcd(stcd);
if (baseInfo == null) {
return null;
}
EngStBaseInfoVo stBaseInfo = new EngStBaseInfoVo();
stBaseInfo.setStcd(baseInfo.getStcd());
stBaseInfo.setStnm(baseInfo.getStnm());
stBaseInfo.setSttpCode(baseInfo.getSttpCode());
stBaseInfo.setSttpName(baseInfo.getSttpName());
stBaseInfo.setSttpFullPath(baseInfo.getSttpFullPath());
stBaseInfo.setSttpTreeLevel(baseInfo.getSttpTreeLevel());
stBaseInfo.setStCode(null);
stBaseInfo.setStName(null);
stBaseInfo.setBaseId(baseInfo.getBaseId());
stBaseInfo.setBaseName(baseInfo.getBaseName());
stBaseInfo.setHbrvcd(baseInfo.getHbrvcd());
stBaseInfo.setHbrvcdName(baseInfo.getHbrvcdName());
stBaseInfo.setRvcd(baseInfo.getRvcd());
stBaseInfo.setRvcdName(baseInfo.getRvcdName());
EngStInfoResultVo result = new EngStInfoResultVo();
result.setStBaseInfo(stBaseInfo);
return result;
}
private String buildVmsstbprptViewSql() { private String buildVmsstbprptViewSql() {
return "SELECT " + return "SELECT " +
"eng.STCD AS id, " + "eng.STCD AS id, " +
@ -469,6 +531,7 @@ public class SdEngInfoBHServiceImpl extends ServiceImpl<SdEngInfoBHMapper, SdEng
"'电站' AS sttpName, " + "'电站' AS sttpName, " +
"eng.STCD AS stcd, " + "eng.STCD AS stcd, " +
"eng.ENNM AS stnm, " + "eng.ENNM AS stnm, " +
"eng.REACHCD_NAME AS reachcdName, " +
"eng.ENNM AS ennm, " + "eng.ENNM AS ennm, " +
"eng.BASE_ID AS baseId, " + "eng.BASE_ID AS baseId, " +
"hb.BASENAME AS baseName, " + "hb.BASENAME AS baseName, " +
@ -485,6 +548,11 @@ public class SdEngInfoBHServiceImpl extends ServiceImpl<SdEngInfoBHMapper, SdEng
"eng.AIODT AS aiodt, " + "eng.AIODT AS aiodt, " +
"eng.BLDSTT AS bldstt, " + "eng.BLDSTT AS bldstt, " +
"eng.BLDSTT_CODE AS bldsttCcode, " + "eng.BLDSTT_CODE AS bldsttCcode, " +
"CASE " +
" WHEN eng.BLDSTT_CODE = 0 OR eng.BLDSTT_CODE IS NULL THEN '未建/规划' " +
" WHEN eng.BLDSTT_CODE = 1 THEN '在建' " +
" WHEN eng.BLDSTT_CODE = 2 THEN '已建' " +
" ELSE NULL END AS bldsttCcodeName, " +
"eng.NRUPAR AS nrupar, " + "eng.NRUPAR AS nrupar, " +
"eng.DSTCRVR AS dstcrvr, " + "eng.DSTCRVR AS dstcrvr, " +
"eng.AVYRP AS avyrp, " + "eng.AVYRP AS avyrp, " +
@ -531,6 +599,17 @@ public class SdEngInfoBHServiceImpl extends ServiceImpl<SdEngInfoBHMapper, SdEng
"CAST(NULL AS NUMBER) AS ddcp, " + "CAST(NULL AS NUMBER) AS ddcp, " +
"eng.CPSC AS cpsc, " + "eng.CPSC AS cpsc, " +
"eng.RGCP AS rgcp, " + "eng.RGCP AS rgcp, " +
"CASE eng.RGCP " +
" WHEN '1' THEN '多年调节' " +
" WHEN '2' THEN '年调节' " +
" WHEN '3' THEN '不完全年调节' " +
" WHEN '4' THEN '径流式(无调节)' " +
" WHEN '5' THEN '季调节' " +
" WHEN '6' THEN '月调节' " +
" WHEN '7' THEN '周调节' " +
" WHEN '8' THEN '日调节' " +
" WHEN '9' THEN '其他' " +
" ELSE NULL END AS rgcpName, " +
"eng.DSMXQ AS dsflzmxq, " + "eng.DSMXQ AS dsflzmxq, " +
"CAST(NULL AS NUMBER) AS dsflzxyz, " + "CAST(NULL AS NUMBER) AS dsflzxyz, " +
"eng.CHMXQ AS ckflzmxq, " + "eng.CHMXQ AS ckflzmxq, " +
@ -554,7 +633,16 @@ public class SdEngInfoBHServiceImpl extends ServiceImpl<SdEngInfoBHMapper, SdEng
"CAST(NULL AS NUMBER) AS unyge, " + "CAST(NULL AS NUMBER) AS unyge, " +
"eng.GAP AS gap, " + "eng.GAP AS gap, " +
"eng.DVTP AS dvtp, " + "eng.DVTP AS dvtp, " +
"CASE eng.DVTP " +
" WHEN '1' THEN '堤坝式' " +
" WHEN '2' THEN '引水式' " +
" WHEN '3' THEN '混合式' " +
" ELSE NULL END AS dvtpName, " +
"eng.DTIN AS dtin, " + "eng.DTIN AS dtin, " +
"CASE NVL(eng.DTIN, 0) " +
" WHEN 0 THEN '否' " +
" WHEN 1 THEN '是' " +
" ELSE NULL END AS dtinName, " +
"NVL(hb.ORDER_INDEX, 999999) AS baseStepSort, " + "NVL(hb.ORDER_INDEX, 999999) AS baseStepSort, " +
"NVL(along.ORDER_INDEX, 999999) AS rvcdStepSort, " + "NVL(along.ORDER_INDEX, 999999) AS rvcdStepSort, " +
"NVL(rstSort.SORT, 999999) AS rstcdStepSort, " + "NVL(rstSort.SORT, 999999) AS rstcdStepSort, " +
@ -611,6 +699,7 @@ public class SdEngInfoBHServiceImpl extends ServiceImpl<SdEngInfoBHMapper, SdEng
columns.put("stnm", "t.stnm AS stnm"); columns.put("stnm", "t.stnm AS stnm");
columns.put("ennm", "t.ennm AS ennm"); columns.put("ennm", "t.ennm AS ennm");
columns.put("baseId", "t.baseId AS baseId"); columns.put("baseId", "t.baseId AS baseId");
columns.put("reachcdName", "t.reachcdName AS reachcdName");
columns.put("baseName", "t.baseName AS baseName"); columns.put("baseName", "t.baseName AS baseName");
columns.put("hbrvcd", "t.hbrvcd AS hbrvcd"); columns.put("hbrvcd", "t.hbrvcd AS hbrvcd");
columns.put("hbrvcdName", "t.hbrvcdName AS hbrvcdName"); columns.put("hbrvcdName", "t.hbrvcdName AS hbrvcdName");
@ -625,6 +714,7 @@ public class SdEngInfoBHServiceImpl extends ServiceImpl<SdEngInfoBHMapper, SdEng
columns.put("aiodt", "t.aiodt AS aiodt"); columns.put("aiodt", "t.aiodt AS aiodt");
columns.put("bldstt", "t.bldstt AS bldstt"); columns.put("bldstt", "t.bldstt AS bldstt");
columns.put("bldsttCcode", "t.bldsttCcode AS bldsttCcode"); columns.put("bldsttCcode", "t.bldsttCcode AS bldsttCcode");
columns.put("bldsttCcodeName", "t.bldsttCcodeName AS bldsttCcodeName");
columns.put("nrupar", "t.nrupar AS nrupar"); columns.put("nrupar", "t.nrupar AS nrupar");
columns.put("dstcrvr", "t.dstcrvr AS dstcrvr"); columns.put("dstcrvr", "t.dstcrvr AS dstcrvr");
columns.put("avyrp", "t.avyrp AS avyrp"); columns.put("avyrp", "t.avyrp AS avyrp");
@ -671,6 +761,7 @@ public class SdEngInfoBHServiceImpl extends ServiceImpl<SdEngInfoBHMapper, SdEng
columns.put("ddcp", "t.ddcp AS ddcp"); columns.put("ddcp", "t.ddcp AS ddcp");
columns.put("cpsc", "t.cpsc AS cpsc"); columns.put("cpsc", "t.cpsc AS cpsc");
columns.put("rgcp", "t.rgcp AS rgcp"); columns.put("rgcp", "t.rgcp AS rgcp");
columns.put("rgcpName", "t.rgcpName AS rgcpName");
columns.put("dsflzmxq", "t.dsflzmxq AS dsflzmxq"); columns.put("dsflzmxq", "t.dsflzmxq AS dsflzmxq");
columns.put("dsflzxyz", "t.dsflzxyz AS dsflzxyz"); columns.put("dsflzxyz", "t.dsflzxyz AS dsflzxyz");
columns.put("ckflzmxq", "t.ckflzmxq AS ckflzmxq"); columns.put("ckflzmxq", "t.ckflzmxq AS ckflzmxq");
@ -694,7 +785,9 @@ public class SdEngInfoBHServiceImpl extends ServiceImpl<SdEngInfoBHMapper, SdEng
columns.put("unyge", "t.unyge AS unyge"); columns.put("unyge", "t.unyge AS unyge");
columns.put("gap", "t.gap AS gap"); columns.put("gap", "t.gap AS gap");
columns.put("dvtp", "t.dvtp AS dvtp"); columns.put("dvtp", "t.dvtp AS dvtp");
columns.put("dvtpName", "t.dvtpName AS dvtpName");
columns.put("dtin", "t.dtin AS dtin"); columns.put("dtin", "t.dtin AS dtin");
columns.put("dtinName", "t.dtinName AS dtinName");
columns.put("baseStepSort", "t.baseStepSort AS baseStepSort"); columns.put("baseStepSort", "t.baseStepSort AS baseStepSort");
columns.put("rvcdStepSort", "t.rvcdStepSort AS rvcdStepSort"); columns.put("rvcdStepSort", "t.rvcdStepSort AS rvcdStepSort");
columns.put("rstcdStepSort", "t.rstcdStepSort AS rstcdStepSort"); columns.put("rstcdStepSort", "t.rstcdStepSort AS rstcdStepSort");

View File

@ -149,6 +149,12 @@ public class SdRvcdDicServiceImpl extends ServiceImpl<SdRvcdDicMapper, SdRvcdDic
} }
} }
@Override
public List<SdRvcdDic> selectRvcdDropdown(String rvnm,String baseId) {
List<SdRvcdDic> dropdownList = this.baseMapper.selectRvcdDropdown(rvnm,baseId);
return dropdownList;
}
@Override @Override
public Set<String> getUserAuthorizedStationCodes() { public Set<String> getUserAuthorizedStationCodes() {

View File

@ -4,8 +4,12 @@ import com.yfd.platform.common.DataSourceLoadOptionsBase;
import com.yfd.platform.common.DataSourceRequest; import com.yfd.platform.common.DataSourceRequest;
import com.yfd.platform.common.DataSourceResult; import com.yfd.platform.common.DataSourceResult;
import com.yfd.platform.config.ResponseResult; import com.yfd.platform.config.ResponseResult;
import com.yfd.platform.qgc_eng.eq.entity.vo.EngEqBaseMsstbprptVo;
import com.yfd.platform.qgc_eng.eq.entity.vo.EngEqBaseVmsstbprptVo;
import com.yfd.platform.qgc_eng.eq.entity.vo.EngEqDrtpDataVo; import com.yfd.platform.qgc_eng.eq.entity.vo.EngEqDrtpDataVo;
import com.yfd.platform.qgc_eng.eq.entity.vo.EngEqIntervalVo; import com.yfd.platform.qgc_eng.eq.entity.vo.EngEqIntervalVo;
import com.yfd.platform.qgc_eng.eq.entity.vo.EngEqLimitQueryVo;
import com.yfd.platform.qgc_eng.eq.entity.vo.EngEqLimitVo;
import com.yfd.platform.qgc_eng.eq.entity.vo.EngEqMsstbprptVo; import com.yfd.platform.qgc_eng.eq.entity.vo.EngEqMsstbprptVo;
import com.yfd.platform.qgc_eng.eq.entity.vo.EngEqRuleVo; import com.yfd.platform.qgc_eng.eq.entity.vo.EngEqRuleVo;
import com.yfd.platform.qgc_eng.eq.entity.vo.EngEqVmsstbprptVo; import com.yfd.platform.qgc_eng.eq.entity.vo.EngEqVmsstbprptVo;
@ -22,6 +26,8 @@ import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RestController;
import java.util.List;
@RestController @RestController
@RequestMapping("/eq") @RequestMapping("/eq")
@Tag(name = "电站实时数据查询") @Tag(name = "电站实时数据查询")
@ -69,6 +75,20 @@ public class EngEqDataController {
return ResponseResult.successData(result); return ResponseResult.successData(result);
} }
@PostMapping("/base/msstbprpt/GetKendoList")
@Operation(summary = "生态流量泄放设施基础信息查询")
public ResponseResult getBaseMsstbprptList(@RequestBody DataSourceRequest dataSourceRequest) {
DataSourceResult<EngEqBaseMsstbprptVo> result = engEqDataService.getBaseMsstbprptList(dataSourceRequest);
return ResponseResult.successData(result);
}
@PostMapping("/base/vmsstbprpt/GetKendoList")
@Operation(summary = "生态流量泄放设施统计查询")
public ResponseResult getBaseVmsstbprptList(@RequestBody DataSourceRequest dataSourceRequest) {
DataSourceResult<EngEqBaseVmsstbprptVo> result = engEqDataService.getBaseVmsstbprptList(dataSourceRequest);
return ResponseResult.successData(result);
}
@PostMapping("/interval/qgc/hour/GetKendoListCust") @PostMapping("/interval/qgc/hour/GetKendoListCust")
@Operation(summary = "生态流量达标率小时统计(二级页面)") @Operation(summary = "生态流量达标率小时统计(二级页面)")
public ResponseResult getQgcHourKendoListCust(@RequestBody DataSourceRequest dataSourceRequest) { public ResponseResult getQgcHourKendoListCust(@RequestBody DataSourceRequest dataSourceRequest) {
@ -87,6 +107,13 @@ public class EngEqDataController {
return ResponseResult.successData(engEqDataService.getQgcHourVAlongKendoListCust(dataSourceRequest)); return ResponseResult.successData(engEqDataService.getQgcHourVAlongKendoListCust(dataSourceRequest));
} }
@PostMapping("/engalong/statistics/qgc/getEngLimit")
@Operation(summary = "沿程生态流量限值变化曲线")
public ResponseResult getQgcEngLimit(@RequestBody EngEqLimitQueryVo queryVo) {
List<EngEqLimitVo> result = engEqDataService.getQgcEngLimit(queryVo);
return ResponseResult.successData(result);
}
@PostMapping("/fid/GetKendoListCust") @PostMapping("/fid/GetKendoListCust")
@Operation(summary = "查询电站相关鱼类附件编码") @Operation(summary = "查询电站相关鱼类附件编码")
public ResponseResult getFidKendoListCust(@RequestBody DataSourceRequest dataSourceRequest) { public ResponseResult getFidKendoListCust(@RequestBody DataSourceRequest dataSourceRequest) {

View File

@ -0,0 +1,77 @@
package com.yfd.platform.qgc_eng.eq.entity.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.io.Serializable;
import java.util.Date;
@Data
@Schema(description = "生态流量泄放设施基础信息查询")
public class EngEqBaseMsstbprptVo implements Serializable {
private static final long serialVersionUID = 1L;
@Schema(description = "设施编码")
private String stcd;
@Schema(description = "设施名称")
private String stnm;
@Schema(description = "设施类型编码")
private String sttpCode;
@Schema(description = "设施类型名称")
private String sttpName;
@Schema(description = "所属电站编码")
private String rstcd;
@Schema(description = "所属电站名称")
private String rstcdName;
@Schema(description = "基地编码")
private String baseId;
@Schema(description = "基地名称")
private String baseName;
@Schema(description = "基地流域编码")
private String hbrvcd;
@Schema(description = "基地流域名称")
private String hbrvcdName;
@Schema(description = "设施位置")
private String stlc;
@Schema(description = "经度")
private Double lgtd;
@Schema(description = "纬度")
private Double lttd;
@Schema(description = "高程")
private Double elev;
@Schema(description = "建设状态分类编码")
private Integer bldsttCode;
@Schema(description = "建设状态分类名称")
private String bldsttCodeName;
@Schema(description = "数据接入状态")
private Integer dtin;
@Schema(description = "数据接入状态中文")
private String dtinName;
@Schema(description = "数据接入时间")
private Date dtinTm;
@Schema(description = "数据时间")
private Date tm;
@Schema(description = "排序")
private Integer orderIndex;
}

View File

@ -0,0 +1,64 @@
package com.yfd.platform.qgc_eng.eq.entity.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.EqualsAndHashCode;
@Data
@EqualsAndHashCode(callSuper = true)
@Schema(description = "生态流量泄放设施统计查询")
public class EngEqBaseVmsstbprptVo extends EngEqMsstbprptVo {
private static final long serialVersionUID = 1L;
@Schema(description = "所属电站编码")
private String rstcd;
@Schema(description = "所属电站名称")
private String rstcdName;
@Schema(description = "基地排序")
private Integer baseStepSort;
@Schema(description = "流域排序")
private Integer rvcdStepSort;
@Schema(description = "所属电站排序")
private Integer rstcdStepSort;
@Schema(description = "设施排序")
private Integer siteStepSort;
@Schema(description = "死水位时保证流量")
private Double ddzgq;
@Schema(description = "最大泄放流量")
private String flkq;
@Schema(description = "孔口尺寸")
private String flksz;
@Schema(description = "结构形式")
private String frntwlltyp;
@Schema(description = "进水口底版高程")
private Double jskgc;
@Schema(description = "出水口底版高程")
private Double outflrelev;
@Schema(description = "基荷发电工况")
private Double jhfdgk;
@Schema(description = "发电流量")
private Double fdll;
@Schema(description = "生态机组额定流量")
private Double stjzysq;
@Schema(description = "装机容量")
private Double ttpwr;
@Schema(description = "所属建设阶段名称")
private String blprdName;
}

View File

@ -0,0 +1,20 @@
package com.yfd.platform.qgc_eng.eq.entity.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.experimental.Accessors;
@Data
@Accessors(chain = true)
@Schema(description = "沿程生态流量限值查询参数")
public class EngEqLimitQueryVo {
@Schema(description = "查询日期,支持 yyyy-MM-dd、yyyy-MM-dd HH:mm、yyyy-MM-dd HH:mm:ss")
private String date;
@Schema(description = "基地编码")
private String baseId;
@Schema(description = "流域编码")
private String rvcd;
}

View File

@ -0,0 +1,28 @@
package com.yfd.platform.qgc_eng.eq.entity.vo;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.experimental.Accessors;
import java.math.BigDecimal;
import java.util.Date;
@Data
@Accessors(chain = true)
@Schema(description = "沿程生态流量限值")
public class EngEqLimitVo {
@Schema(description = "电站编码")
private String stcd;
@Schema(description = "电站名称")
private String stnm;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@Schema(description = "查询日期")
private Date date;
@Schema(description = "生态流量限值")
private BigDecimal qecLimit;
}

View File

@ -2,11 +2,15 @@ package com.yfd.platform.qgc_eng.eq.service;
import com.yfd.platform.common.DataSourceRequest; import com.yfd.platform.common.DataSourceRequest;
import com.yfd.platform.common.DataSourceResult; import com.yfd.platform.common.DataSourceResult;
import com.yfd.platform.qgc_eng.eq.entity.vo.EngEqBaseMsstbprptVo;
import com.yfd.platform.qgc_eng.eq.entity.vo.EngEqBaseVmsstbprptVo;
import com.yfd.platform.qgc_eng.eq.entity.vo.EngEqDayDataVo; import com.yfd.platform.qgc_eng.eq.entity.vo.EngEqDayDataVo;
import com.yfd.platform.qgc_eng.eq.entity.vo.EngEqDrtpDataVo; import com.yfd.platform.qgc_eng.eq.entity.vo.EngEqDrtpDataVo;
import com.yfd.platform.qgc_eng.eq.entity.vo.EngEqDayIntervalVo; import com.yfd.platform.qgc_eng.eq.entity.vo.EngEqDayIntervalVo;
import com.yfd.platform.qgc_eng.eq.entity.vo.EngEqHourIntervalVo; import com.yfd.platform.qgc_eng.eq.entity.vo.EngEqHourIntervalVo;
import com.yfd.platform.qgc_eng.eq.entity.vo.EngEqIntervalVo; import com.yfd.platform.qgc_eng.eq.entity.vo.EngEqIntervalVo;
import com.yfd.platform.qgc_eng.eq.entity.vo.EngEqLimitQueryVo;
import com.yfd.platform.qgc_eng.eq.entity.vo.EngEqLimitVo;
import com.yfd.platform.qgc_eng.eq.entity.vo.EngEqMsstbprptVo; import com.yfd.platform.qgc_eng.eq.entity.vo.EngEqMsstbprptVo;
import com.yfd.platform.qgc_eng.eq.entity.vo.EngEqRuleVo; import com.yfd.platform.qgc_eng.eq.entity.vo.EngEqRuleVo;
import com.yfd.platform.qgc_eng.eq.entity.vo.EngQecAlongVo; import com.yfd.platform.qgc_eng.eq.entity.vo.EngQecAlongVo;
@ -16,6 +20,8 @@ import com.yfd.platform.qgc_eng.eq.entity.vo.QgcQecStaticVo;
import com.yfd.platform.qgc_eng.eq.entity.vo.SdEqMonitorCountVo; import com.yfd.platform.qgc_eng.eq.entity.vo.SdEqMonitorCountVo;
import com.yfd.platform.qgc_eng.eq.entity.vo.WbsbVo; import com.yfd.platform.qgc_eng.eq.entity.vo.WbsbVo;
import java.util.List;
public interface EngEqDataService { public interface EngEqDataService {
DataSourceResult getKendoListCust(DataSourceRequest dataSourceRequest); DataSourceResult getKendoListCust(DataSourceRequest dataSourceRequest);
@ -28,12 +34,18 @@ public interface EngEqDataService {
DataSourceResult<EngEqMsstbprptVo> getMsstbprptList(DataSourceRequest dataSourceRequest); DataSourceResult<EngEqMsstbprptVo> getMsstbprptList(DataSourceRequest dataSourceRequest);
DataSourceResult<EngEqBaseMsstbprptVo> getBaseMsstbprptList(DataSourceRequest dataSourceRequest);
DataSourceResult<EngEqBaseVmsstbprptVo> getBaseVmsstbprptList(DataSourceRequest dataSourceRequest);
DataSourceResult<EngEqHourIntervalVo> getQgcHourKendoListCust(DataSourceRequest dataSourceRequest); DataSourceResult<EngEqHourIntervalVo> getQgcHourKendoListCust(DataSourceRequest dataSourceRequest);
DataSourceResult<EngEqDayIntervalVo> getQgcDayKendoListCust(DataSourceRequest dataSourceRequest); DataSourceResult<EngEqDayIntervalVo> getQgcDayKendoListCust(DataSourceRequest dataSourceRequest);
DataSourceResult<EngQecAlongVo> getQgcHourVAlongKendoListCust(DataSourceRequest dataSourceRequest); DataSourceResult<EngQecAlongVo> getQgcHourVAlongKendoListCust(DataSourceRequest dataSourceRequest);
List<EngEqLimitVo> getQgcEngLimit(EngEqLimitQueryVo queryVo);
DataSourceResult<String> getFidKendoListCust(DataSourceRequest dataSourceRequest); DataSourceResult<String> getFidKendoListCust(DataSourceRequest dataSourceRequest);
EngEqRuleVo getEngLimit(DataSourceRequest dataSourceRequest); EngEqRuleVo getEngLimit(DataSourceRequest dataSourceRequest);

View File

@ -1,35 +0,0 @@
package com.yfd.platform.qgc_env.fb.controller;
import com.yfd.platform.common.DataSourceRequest;
import com.yfd.platform.config.ResponseResult;
import com.yfd.platform.qgc_env.fb.service.FbStationService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.annotation.Resource;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/fb/bsmfr")
@Tag(name = "亲鱼选配与培育-亲鱼信息")
@Validated
public class FbBsmfrController {
@Resource
private FbStationService fbStationService;
@PostMapping("/qgc/GetKendoListCust")
@Operation(summary = "(全过程)增殖站二级页面: 亲鱼选配与培育->亲鱼信息")
public ResponseResult getQgcKendoListCust(@RequestBody DataSourceRequest dataSourceRequest) {
return ResponseResult.successData(fbStationService.getQgcBsmfRKendoListCust(dataSourceRequest));
}
@PostMapping("/fish/GetKendoListCust")
@Operation(summary = "(全过程)增殖站二级页面: 过程图-亲鱼")
public ResponseResult getFishKendoListCust(@RequestBody DataSourceRequest dataSourceRequest) {
return ResponseResult.successData(fbStationService.getBsmfRFishKendoListCust(dataSourceRequest));
}
}

View File

@ -1,30 +0,0 @@
package com.yfd.platform.qgc_env.fb.controller;
import com.yfd.platform.config.ResponseResult;
import com.yfd.platform.qgc_env.fb.service.FbStationService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.annotation.Resource;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/fb/fbrdmr")
@Tag(name = "鱼类增殖站年度鱼类标记数据")
@Validated
public class FbFbrdmrController {
@Resource
private FbStationService fbStationService;
@GetMapping("/getFbRelatedYrByStcd")
@Operation(summary = "根据增殖站编码查询相关业务年份")
public ResponseResult getFbRelatedYrByStcd(@Parameter(description = "增殖站编码")
@RequestParam("stcd") String stcd) {
return ResponseResult.successData(fbStationService.getFbRelatedYrByStcd(stcd));
}
}

View File

@ -1,35 +0,0 @@
package com.yfd.platform.qgc_env.fb.controller;
import com.yfd.platform.common.DataSourceRequest;
import com.yfd.platform.config.ResponseResult;
import com.yfd.platform.qgc_env.fb.service.FbStationService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.annotation.Resource;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/fb/msfbrdm")
@Tag(name = "鱼类增殖站增殖情况")
@Validated
public class FbMsfbrdmController {
@Resource
private FbStationService fbStationService;
@PostMapping("/fbFlData/GetKendoListCust")
@Operation(summary = "增殖站增殖情况(app)")
public ResponseResult getFbFlData(@RequestBody DataSourceRequest dataSourceRequest) {
return ResponseResult.successData(fbStationService.getFbFlDataKendoListCust(dataSourceRequest));
}
@PostMapping("/qgc/GetKendoListCust")
@Operation(summary = "(全过程)增殖站二级页面: 增殖放流情况")
public ResponseResult getQgcKendoListCust(@RequestBody DataSourceRequest dataSourceRequest) {
return ResponseResult.successData(fbStationService.getQgcMsfbrdmKendoListCust(dataSourceRequest));
}
}

View File

@ -1,29 +0,0 @@
package com.yfd.platform.qgc_env.fb.controller;
import com.yfd.platform.common.DataSourceRequest;
import com.yfd.platform.config.ResponseResult;
import com.yfd.platform.qgc_env.fb.service.FbStationService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.annotation.Resource;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/fb/base/researchb")
@Tag(name = "鱼类增殖站科研情况")
@Validated
public class FbResearchbController {
@Resource
private FbStationService fbStationService;
@PostMapping("/GetKendoList")
@Operation(summary = "鱼类增殖站科研情况列表")
public ResponseResult getKendoList(@RequestBody DataSourceRequest dataSourceRequest) {
return ResponseResult.successData(fbStationService.getResearchKendoList(dataSourceRequest));
}
}

View File

@ -16,47 +16,120 @@ import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RestController;
@RestController @RestController
@RequestMapping("/fb/station") @RequestMapping("/fb")
@Tag(name = "鱼类增殖站概况") @Tag(name = "鱼类增殖站模块")
@Validated @Validated
public class FbStationController { public class FbStationController {
@Resource @Resource
private FbStationService fbStationService; private FbStationService fbStationService;
@PostMapping("/qgcoverview/getOverviewSecond") @PostMapping("/station/qgcoverview/getOverviewSecond")
@Operation(summary = "全流域增殖站概况二级页面") @Operation(summary = "全流域增殖站概况二级页面")
public ResponseResult getQgcOverviewSecond(@RequestBody DataSourceRequest dataSourceRequest) { public ResponseResult getQgcOverviewSecond(@RequestBody DataSourceRequest dataSourceRequest) {
return ResponseResult.successData(fbStationService.getQgcOverviewSecond(dataSourceRequest)); return ResponseResult.successData(fbStationService.getQgcOverviewSecond(dataSourceRequest));
} }
@PostMapping("/overview/getOverviewSecond") @PostMapping("/station/overview/getOverviewSecond")
@Operation(summary = "增殖站概况二级页面") @Operation(summary = "增殖站概况二级页面")
public ResponseResult getOverviewSecond(@RequestBody DataSourceRequest dataSourceRequest) { public ResponseResult getOverviewSecond(@RequestBody DataSourceRequest dataSourceRequest) {
return ResponseResult.successData(fbStationService.getOverviewSecond(dataSourceRequest)); return ResponseResult.successData(fbStationService.getOverviewSecond(dataSourceRequest));
} }
@PostMapping("/overview/GetKendoListCust") @PostMapping("/station/overview/GetKendoListCust")
@Operation(summary = "全流域增殖站概况") @Operation(summary = "全流域增殖站概况")
public ResponseResult getOverviewKendoListCust(@RequestBody DataSourceRequest dataSourceRequest) { public ResponseResult getOverviewKendoListCust(@RequestBody DataSourceRequest dataSourceRequest) {
return ResponseResult.successData(fbStationService.getOverviewKendoListCust(dataSourceRequest)); return ResponseResult.successData(fbStationService.getOverviewKendoListCust(dataSourceRequest));
} }
@PostMapping("/qgc/getFbStaticsData") @PostMapping("/station/qgc/getFbStaticsData")
@Operation(summary = "增殖站放流数据统计") @Operation(summary = "增殖站放流数据统计")
public ResponseResult getQgcFbStaticsData(@RequestBody DataSourceRequest dataSourceRequest) { public ResponseResult getQgcFbStaticsData(@RequestBody DataSourceRequest dataSourceRequest) {
return ResponseResult.successData(fbStationService.getQgcFbStaticsData(dataSourceRequest)); return ResponseResult.successData(fbStationService.getQgcFbStaticsData(dataSourceRequest));
} }
@GetMapping("/msstbprpt/getStInfoByStcd") @GetMapping("/station/msstbprpt/getStInfoByStcd")
@Operation(summary = "增殖站单站基础信息") @Operation(summary = "增殖站单站基础信息")
public ResponseResult getStInfoByStcd(@Parameter(description = "站点编码") @RequestParam("stcd") String stcd) { public ResponseResult getStInfoByStcd(@Parameter(description = "站点编码") @RequestParam("stcd") String stcd) {
return ResponseResult.successData(fbStationService.getStInfoByStcd(stcd)); return ResponseResult.successData(fbStationService.getStInfoByStcd(stcd));
} }
@GetMapping("/rpimnr/qgc/year/GetYearRpStatistics") @GetMapping("/station/rpimnr/qgc/year/GetYearRpStatistics")
@Operation(summary = "全过程放流统计总数,根据基地流域分组") @Operation(summary = "全过程放流统计总数,根据基地流域分组")
public ResponseResult getYearRpStatistics(@Parameter(description = "年份") @RequestParam("year") String year) { public ResponseResult getYearRpStatistics(@Parameter(description = "年份") @RequestParam("year") String year) {
return ResponseResult.successData(fbStationService.getYearRpStatistics(year)); return ResponseResult.successData(fbStationService.getYearRpStatistics(year));
} }
@PostMapping("/bsmfr/qgc/GetKendoListCust")
@Operation(summary = "(全过程)增殖站二级页面: 亲鱼选配与培育->亲鱼信息")
public ResponseResult getBsmfrQgcKendoListCust(@RequestBody DataSourceRequest dataSourceRequest) {
return ResponseResult.successData(fbStationService.getQgcBsmfRKendoListCust(dataSourceRequest));
}
@PostMapping("/bsmfr/fish/GetKendoListCust")
@Operation(summary = "(全过程)增殖站二级页面: 过程图-亲鱼")
public ResponseResult getBsmfrFishKendoListCust(@RequestBody DataSourceRequest dataSourceRequest) {
return ResponseResult.successData(fbStationService.getBsmfRFishKendoListCust(dataSourceRequest));
}
@GetMapping("/fbrdmr/getFbRelatedYrByStcd")
@Operation(summary = "根据增殖站编码查询相关业务年份")
public ResponseResult getFbRelatedYrByStcd(@Parameter(description = "增殖站编码")
@RequestParam("stcd") String stcd) {
return ResponseResult.successData(fbStationService.getFbRelatedYrByStcd(stcd));
}
@PostMapping("/msfbrdm/fbFlData/GetKendoListCust")
@Operation(summary = "增殖站增殖情况(app)")
public ResponseResult getFbFlData(@RequestBody DataSourceRequest dataSourceRequest) {
return ResponseResult.successData(fbStationService.getFbFlDataKendoListCust(dataSourceRequest));
}
@PostMapping("/fishCount/GetKendoListCust")
@Operation(summary = "增殖站鱼数量完成情况统计")
public ResponseResult getFishCountKendoListCust(@RequestBody DataSourceRequest dataSourceRequest) {
return ResponseResult.successData(fbStationService.getFishCountKendoListCust(dataSourceRequest));
}
@PostMapping("/fishrun/qgc/GetKendoListCust")
@Operation(summary = "全过程鱼类放鱼数据")
public ResponseResult getFishRunQgcKendoListCust(@RequestBody DataSourceRequest dataSourceRequest) {
return ResponseResult.successData(fbStationService.getFishRunQgcKendoListCust(dataSourceRequest));
}
@PostMapping("/fishType/GetKendoListCust")
@Operation(summary = "增殖站鱼种完成情况统计")
public ResponseResult getFishTypeKendoListCust(@RequestBody DataSourceRequest dataSourceRequest) {
return ResponseResult.successData(fbStationService.getFishTypeKendoListCust(dataSourceRequest));
}
@PostMapping("/fishType/getStcdList")
@Operation(summary = "增殖放流完成情况获取有数据的测站下拉")
public ResponseResult getFishTypeStcdList(@RequestBody DataSourceRequest dataSourceRequest) {
return ResponseResult.successData(fbStationService.getFishTypeStcdList(dataSourceRequest));
}
@PostMapping("/msfbrdm/GetKendoListCust")
@Operation(summary = "鱼类增殖站运行情况统计列表")
public ResponseResult getMsfbrdmKendoListCust(@RequestBody DataSourceRequest dataSourceRequest) {
return ResponseResult.successData(fbStationService.getMsfbrdmKendoListCust(dataSourceRequest));
}
@PostMapping("/msfbrdm/qgc/GetKendoListCust")
@Operation(summary = "(全过程)增殖站二级页面: 增殖放流情况")
public ResponseResult getMsfbrdmQgcKendoListCust(@RequestBody DataSourceRequest dataSourceRequest) {
return ResponseResult.successData(fbStationService.getQgcMsfbrdmKendoListCust(dataSourceRequest));
}
@PostMapping("/msstbprpt/GetKendoList")
@Operation(summary = "鱼类增殖站基础信息列表")
public ResponseResult getMsstbprptKendoList(@RequestBody DataSourceRequest dataSourceRequest) {
return ResponseResult.successData(fbStationService.getMsstbprptList(dataSourceRequest));
}
@PostMapping("/base/researchb/GetKendoList")
@Operation(summary = "鱼类增殖站科研情况列表")
public ResponseResult getResearchKendoList(@RequestBody DataSourceRequest dataSourceRequest) {
return ResponseResult.successData(fbStationService.getResearchKendoList(dataSourceRequest));
}
} }

View File

@ -0,0 +1,15 @@
package com.yfd.platform.qgc_env.fb.entity.vo;
import lombok.Data;
import java.math.BigDecimal;
@Data
public class FbFishCountFinishVo {
private String stcd;
private BigDecimal finished;
private BigDecimal unfinished;
}

View File

@ -0,0 +1,37 @@
package com.yfd.platform.qgc_env.fb.entity.vo;
import lombok.Data;
@Data
public class FbFishRunQgcVo {
private String stcd;
private String stnm;
private String ftp;
private String ftpName;
private String baseId;
private String baseName;
private String flyr;
private Long fcnt;
private Long totalFcnt;
private String fid;
private String release;
private Integer baseStepSort;
private Integer siteStepSort;
private Integer rvcdStepSort;
private Integer rstcdStepSort;
}

View File

@ -0,0 +1,13 @@
package com.yfd.platform.qgc_env.fb.entity.vo;
import lombok.Data;
@Data
public class FbFishTypeFinishVo {
private String stcd;
private Integer finished;
private Integer unfinished;
}

View File

@ -0,0 +1,19 @@
package com.yfd.platform.qgc_env.fb.entity.vo;
import lombok.Data;
import java.math.BigDecimal;
@Data
public class FbFishTypeStcdVo {
private String stcd;
private String stnm;
private BigDecimal lgtd;
private BigDecimal lttd;
private String baseId;
}

View File

@ -5,6 +5,10 @@ import com.yfd.platform.common.DataSourceResult;
import com.yfd.platform.qgc_env.fb.entity.vo.FbBsmfRQgcVo; import com.yfd.platform.qgc_env.fb.entity.vo.FbBsmfRQgcVo;
import com.yfd.platform.qgc_env.fb.entity.vo.FbBsmfRFishTableVo; import com.yfd.platform.qgc_env.fb.entity.vo.FbBsmfRFishTableVo;
import com.yfd.platform.qgc_env.fb.entity.vo.FbFlDataVo; import com.yfd.platform.qgc_env.fb.entity.vo.FbFlDataVo;
import com.yfd.platform.qgc_env.fb.entity.vo.FbFishCountFinishVo;
import com.yfd.platform.qgc_env.fb.entity.vo.FbFishRunQgcVo;
import com.yfd.platform.qgc_env.fb.entity.vo.FbFishTypeStcdVo;
import com.yfd.platform.qgc_env.fb.entity.vo.FbFishTypeFinishVo;
import com.yfd.platform.qgc_env.fb.entity.vo.FbRelatedYrVo; import com.yfd.platform.qgc_env.fb.entity.vo.FbRelatedYrVo;
import com.yfd.platform.qgc_env.fb.entity.vo.FbMsfbrdmQgcVo; import com.yfd.platform.qgc_env.fb.entity.vo.FbMsfbrdmQgcVo;
import com.yfd.platform.qgc_env.fb.entity.vo.FbResearchVo; import com.yfd.platform.qgc_env.fb.entity.vo.FbResearchVo;
@ -14,6 +18,7 @@ import com.yfd.platform.qgc_env.fb.entity.vo.YearRpStatisticsVo;
import com.yfd.platform.qgc_env.fb.entity.vo.FbStationOverviewSecondVo; import com.yfd.platform.qgc_env.fb.entity.vo.FbStationOverviewSecondVo;
import java.util.List; import java.util.List;
import java.util.Map;
public interface FbStationService { public interface FbStationService {
@ -21,8 +26,20 @@ public interface FbStationService {
DataSourceResult<FbStationOverviewSecondVo> getOverviewKendoListCust(DataSourceRequest dataSourceRequest); DataSourceResult<FbStationOverviewSecondVo> getOverviewKendoListCust(DataSourceRequest dataSourceRequest);
DataSourceResult<Map<String, Object>> getMsstbprptList(DataSourceRequest dataSourceRequest);
DataSourceResult<FbFlDataVo> getFbFlDataKendoListCust(DataSourceRequest dataSourceRequest); DataSourceResult<FbFlDataVo> getFbFlDataKendoListCust(DataSourceRequest dataSourceRequest);
DataSourceResult<FbFishCountFinishVo> getFishCountKendoListCust(DataSourceRequest dataSourceRequest);
DataSourceResult<FbFishRunQgcVo> getFishRunQgcKendoListCust(DataSourceRequest dataSourceRequest);
DataSourceResult<FbFishTypeFinishVo> getFishTypeKendoListCust(DataSourceRequest dataSourceRequest);
DataSourceResult<FbFishTypeStcdVo> getFishTypeStcdList(DataSourceRequest dataSourceRequest);
DataSourceResult<FbMsfbrdmQgcVo> getMsfbrdmKendoListCust(DataSourceRequest dataSourceRequest);
DataSourceResult<FbMsfbrdmQgcVo> getQgcMsfbrdmKendoListCust(DataSourceRequest dataSourceRequest); DataSourceResult<FbMsfbrdmQgcVo> getQgcMsfbrdmKendoListCust(DataSourceRequest dataSourceRequest);
DataSourceResult<FbBsmfRQgcVo> getQgcBsmfRKendoListCust(DataSourceRequest dataSourceRequest); DataSourceResult<FbBsmfRQgcVo> getQgcBsmfRKendoListCust(DataSourceRequest dataSourceRequest);

View File

@ -96,10 +96,14 @@ public class FhHabitatServiceImpl implements FhHabitatService {
} }
sql.append(buildOrderBySql(dataSourceRequest.getSort())); sql.append(buildOrderBySql(dataSourceRequest.getSort()));
Page<?> page = null; // Page<?> page = null;
if (QgcQueryWrapperUtil.getPageInfo(loadOptions).getHasPageInfo()) { // if (QgcQueryWrapperUtil.getPageInfo(loadOptions).getHasPageInfo()) {
page = QgcQueryWrapperUtil.getPageInfo(loadOptions).getPage(); // page = QgcQueryWrapperUtil.getPageInfo(loadOptions).getPage();
} // }
// DataSourceLoadOptionsBase loadOptions = dataSourceRequest.toDevRequest();
Page<?> page = loadOptions == null ? null : QgcQueryWrapperUtil.buildPage(loadOptions, loadOptions.getSkip(), loadOptions.getTake());
List<HabitatVo> list = microservicDynamicSQLMapper.pageAllListWithResultType(page, sql.toString(), paramMap, HabitatVo.class); List<HabitatVo> list = microservicDynamicSQLMapper.pageAllListWithResultType(page, sql.toString(), paramMap, HabitatVo.class);
DataSourceResult<HabitatVo> result = new DataSourceResult<>(); DataSourceResult<HabitatVo> result = new DataSourceResult<>();

View File

@ -45,4 +45,5 @@ public class FprZyFishDicVo {
private String spawnMonth; private String spawnMonth;
private String orders; private String orders;
private String vlsr; private String vlsr;
private java.util.Date vlsrTm;
} }

View File

@ -250,87 +250,33 @@ public class FprMonitorServiceImpl implements FprMonitorService {
new int[]{0} new int[]{0}
); );
String baseSql = StrUtil.isBlank(rvcd) ? buildZyFishDicSummarySql() : buildZyFishDicBaseSql();
StringBuilder sql = new StringBuilder("SELECT * FROM (") StringBuilder sql = new StringBuilder("SELECT * FROM (")
.append(buildZyFishDicBaseSql()) .append(baseSql)
.append(") t WHERE 1 = 1 "); .append(") t WHERE 1 = 1 ");
if (StrUtil.isNotBlank(filterSql)) { if (StrUtil.isNotBlank(filterSql)) {
sql.append(" AND ").append(filterSql).append(" "); sql.append(" AND ").append(filterSql).append(" ");
} }
// 增加排序 sql.append(buildZyFishDicOrderBySql(dataSourceRequest == null ? null : dataSourceRequest.getSort()));
if(dataSourceRequest.getSort() !=null && !dataSourceRequest.getSort().isEmpty()){ Page<?> page = loadOptions == null ? null : QgcQueryWrapperUtil.buildPage(loadOptions, loadOptions.getSkip(), loadOptions.getTake());
List<DataSourceRequest.SortDescriptor> sortDescriptors = dataSourceRequest.getSort(); List<FprZyFishDicVo> resultList = microservicDynamicSQLMapper.pageAllListWithResultType(
StringBuilder orderSql = new StringBuilder(); page,
orderSql.append(" order by ");
for (DataSourceRequest.SortDescriptor sort:sortDescriptors){
orderSql.append(sort.getField()).append(" ").append(sort.getDir()).append(",");
}
sql.append(orderSql, 0, orderSql.length()-1);
// String[] beans = SpringContextHolder.getApplicationContext().getBeanDefinitionNames();
sql.append(" nulls last ");
}else{
sql.append(" order by rvcd nulls last ");
}
List<FprZyFishDicVo> list = microservicDynamicSQLMapper.getAllListWithResultType(
sql.toString(), sql.toString(),
paramMap, paramMap,
FprZyFishDicVo.class FprZyFishDicVo.class
); );
List<Map<String, Object>> rvcdRows = microservicDynamicSQLMapper.getAllList(
"SELECT RVCD AS rvcd, RVNM AS rvcdName FROM SD_RVCD_DIC",
null
);
Map<String, String> rvcdNameMap = new HashMap<>();
for (Map<String, Object> row : rvcdRows) {
Object rvcdKey = row.get("RVCD");
Object rvcdName = row.get("RVCDNAME");
if (rvcdKey != null && rvcdName != null) {
rvcdNameMap.put(String.valueOf(rvcdKey), String.valueOf(rvcdName));
}
}
List<FprZyFishDicVo> resultList;
Map<String, List<String>> rvcdMap = new HashMap<>();
if (StrUtil.isBlank(rvcd)) {
rvcdMap = list.stream()
.collect(Collectors.groupingBy(
item -> StrUtil.blankToDefault(item.getZyFishId(), item.getId()),
LinkedHashMap::new,
Collectors.mapping(FprZyFishDicVo::getRvcd, Collectors.toList())
));
LinkedHashMap<String, FprZyFishDicVo> distinctMap = new LinkedHashMap<>();
for (FprZyFishDicVo item : list) {
distinctMap.putIfAbsent(StrUtil.blankToDefault(item.getZyFishId(), item.getId()), item);
}
resultList = new ArrayList<>(distinctMap.values());
} else {
resultList = new ArrayList<>(list);
}
int startIndex = loadOptions == null || loadOptions.getSkip() == null ? 0 : Math.max(loadOptions.getSkip(), 0);
fillZyFishRvcdNames(resultList, rvcd);
for (int i = 0; i < resultList.size(); i++) { for (int i = 0; i < resultList.size(); i++) {
FprZyFishDicVo item = resultList.get(i); FprZyFishDicVo item = resultList.get(i);
item.setIndex(i + 1); item.setIndex(startIndex + i + 1);
item.setSpawnMonth(formatSpawnMonth(item.getSpawnMonth())); item.setSpawnMonth(formatSpawnMonth(item.getSpawnMonth()));
if (StrUtil.isBlank(rvcd)) {
List<String> rvcdList = rvcdMap.getOrDefault(
StrUtil.blankToDefault(item.getZyFishId(), item.getId()),
new ArrayList<>()
).stream().filter(StrUtil::isNotBlank).distinct().toList();
List<String> rvcdNames = new ArrayList<>();
for (String rvcdItem : rvcdList) {
String rvcdName = rvcdNameMap.get(rvcdItem);
if (StrUtil.isNotBlank(rvcdName)) {
rvcdNames.add(rvcdName);
}
}
item.setRvcdName(String.join(",", rvcdNames));
} else {
item.setRvcdName(rvcdNameMap.get(item.getRvcd()));
}
} }
DataSourceResult<FprZyFishDicVo> result = new DataSourceResult<>(); DataSourceResult<FprZyFishDicVo> result = new DataSourceResult<>();
result.setTotal((long) resultList.size()); result.setTotal(page != null ? page.getTotal() : resultList.size());
result.setData(paginateZyFishDicList(resultList, loadOptions)); result.setData(resultList);
result.setAggregates(new HashMap<>()); result.setAggregates(new HashMap<>());
return result; return result;
} }
@ -390,7 +336,7 @@ public class FprMonitorServiceImpl implements FprMonitorService {
"NVL(alongBase.ORDER_INDEX, 999999) AS rvcdStepSort, " + "NVL(alongBase.ORDER_INDEX, 999999) AS rvcdStepSort, " +
"NVL(engSort.SORT, 999999) AS rstcdStepSort, " + "NVL(engSort.SORT, 999999) AS rstcdStepSort, " +
"NVL(siteSort.SORT, NVL(src.ORDER_INDEX, 999999)) AS siteStepSort " + "NVL(siteSort.SORT, NVL(src.ORDER_INDEX, 999999)) AS siteStepSort " +
"FROM SD_FPRD_B_H src " + "FROM SD_AIMONITOR_B_H src " +
"LEFT JOIN SD_ENGINFO_B_H eng ON eng.STCD = src.RSTCD AND NVL(eng.IS_DELETED, 0) = 0 " + "LEFT JOIN SD_ENGINFO_B_H eng ON eng.STCD = src.RSTCD AND NVL(eng.IS_DELETED, 0) = 0 " +
"LEFT JOIN SD_HYDROBASE hb ON hb.BASEID = src.BASE_ID AND NVL(hb.IS_DELETED, 0) = 0 " + "LEFT JOIN SD_HYDROBASE hb ON hb.BASEID = src.BASE_ID AND NVL(hb.IS_DELETED, 0) = 0 " +
"LEFT JOIN SD_HBRV_DIC hbrv ON hbrv.HBRVCD = src.HBRVCD " + "LEFT JOIN SD_HBRV_DIC hbrv ON hbrv.HBRVCD = src.HBRVCD " +
@ -426,13 +372,13 @@ public class FprMonitorServiceImpl implements FprMonitorService {
private String buildFprdRunDataInfoSql(FprdRunDataAo ao) { private String buildFprdRunDataInfoSql(FprdRunDataAo ao) {
StringBuilder sql = new StringBuilder("SELECT ") StringBuilder sql = new StringBuilder("SELECT ")
.append("NVL((SELECT COUNT(1) ") .append("NVL((SELECT COUNT(1) ")
.append(" FROM SD_FPRD_B_H baseCnt ") .append(" FROM SD_AIMONITOR_B_H baseCnt ")
.append(" WHERE NVL(baseCnt.IS_DELETED, 0) = 0 ") .append(" WHERE NVL(baseCnt.IS_DELETED, 0) = 0 ")
.append(" AND baseCnt.STTP = 'FPRD' ") .append(" AND baseCnt.STTP = 'FPRD' ")
.append(" AND baseCnt.BASE_ID = #{map.baseId}), 0) AS fprdCount, ") .append(" AND baseCnt.BASE_ID = #{map.baseId}), 0) AS fprdCount, ")
.append("NVL((SELECT COUNT(DISTINCT fish.NAME) ") .append("NVL((SELECT COUNT(DISTINCT fish.NAME) ")
.append(" FROM SD_FPRD_R run ") .append(" FROM SD_FPRD_R run ")
.append(" INNER JOIN SD_FPRD_B_H base ON base.STCD = run.STCD ") .append(" INNER JOIN SD_AIMONITOR_B_H base ON base.STCD = run.STCD ")
.append(" AND NVL(base.IS_DELETED, 0) = 0 ") .append(" AND NVL(base.IS_DELETED, 0) = 0 ")
.append(" AND base.STTP = 'FPRD' ") .append(" AND base.STTP = 'FPRD' ")
.append(" INNER JOIN SD_FPRDFISH_R fish ON fish.FPRDR_ID = run.ID ") .append(" INNER JOIN SD_FPRDFISH_R fish ON fish.FPRDR_ID = run.ID ")
@ -446,7 +392,7 @@ public class FprMonitorServiceImpl implements FprMonitorService {
sql.append("), 0) AS ftpCount, ") sql.append("), 0) AS ftpCount, ")
.append("NVL((SELECT COUNT(1) ") .append("NVL((SELECT COUNT(1) ")
.append(" FROM SD_FPRD_R run ") .append(" FROM SD_FPRD_R run ")
.append(" INNER JOIN SD_FPRD_B_H base ON base.STCD = run.STCD ") .append(" INNER JOIN SD_AIMONITOR_B_H base ON base.STCD = run.STCD ")
.append(" AND NVL(base.IS_DELETED, 0) = 0 ") .append(" AND NVL(base.IS_DELETED, 0) = 0 ")
.append(" AND base.STTP = 'FPRD' ") .append(" AND base.STTP = 'FPRD' ")
.append(" INNER JOIN SD_FPRDFISH_R fish ON fish.FPRDR_ID = run.ID ") .append(" INNER JOIN SD_FPRDFISH_R fish ON fish.FPRDR_ID = run.ID ")
@ -469,7 +415,7 @@ public class FprMonitorServiceImpl implements FprMonitorService {
.append("TO_NUMBER(TO_CHAR(run.TM, 'MM')) AS month, ") .append("TO_NUMBER(TO_CHAR(run.TM, 'MM')) AS month, ")
.append("TO_NUMBER(TO_CHAR(run.TM, 'YYYY')) AS year ") .append("TO_NUMBER(TO_CHAR(run.TM, 'YYYY')) AS year ")
.append("FROM SD_FPRD_R run ") .append("FROM SD_FPRD_R run ")
.append("INNER JOIN SD_FPRD_B_H base ON base.STCD = run.STCD ") .append("INNER JOIN SD_AIMONITOR_B_H base ON base.STCD = run.STCD ")
.append(" AND NVL(base.IS_DELETED, 0) = 0 ") .append(" AND NVL(base.IS_DELETED, 0) = 0 ")
.append(" AND base.STTP = 'FPRD' ") .append(" AND base.STTP = 'FPRD' ")
.append("INNER JOIN SD_FPRDFISH_R fish ON fish.FPRDR_ID = run.ID ") .append("INNER JOIN SD_FPRDFISH_R fish ON fish.FPRDR_ID = run.ID ")
@ -496,7 +442,7 @@ public class FprMonitorServiceImpl implements FprMonitorService {
"fish.FSZ AS fsz, " + "fish.FSZ AS fsz, " +
"fish.WEIGHT AS weight " + "fish.WEIGHT AS weight " +
"FROM SD_FPRD_R run " + "FROM SD_FPRD_R run " +
"INNER JOIN SD_FPRD_B_H base ON run.STCD = base.STCD " + "INNER JOIN SD_AIMONITOR_B_H base ON run.STCD = base.STCD " +
" AND base.STTP = 'FPRD' " + " AND base.STTP = 'FPRD' " +
" AND NVL(base.IS_DELETED, 0) = 0 " + " AND NVL(base.IS_DELETED, 0) = 0 " +
"INNER JOIN SD_FPRDFISH_R fish ON run.ID = fish.FPRDR_ID " + "INNER JOIN SD_FPRDFISH_R fish ON run.ID = fish.FPRDR_ID " +
@ -739,6 +685,7 @@ public class FprMonitorServiceImpl implements FprMonitorService {
"NVL(src.IS_DELETED, 0) AS isDeleted, " + "NVL(src.IS_DELETED, 0) AS isDeleted, " +
"CASE WHEN rel.ZY_FISH_ID IS NULL THEN src.ID ELSE rel.ZY_FISH_ID END AS zyFishId, " + "CASE WHEN rel.ZY_FISH_ID IS NULL THEN src.ID ELSE rel.ZY_FISH_ID END AS zyFishId, " +
"CASE WHEN rel.RVCD IS NULL THEN 'null' ELSE rel.RVCD END AS rvcd, " + "CASE WHEN rel.RVCD IS NULL THEN 'null' ELSE rel.RVCD END AS rvcd, " +
"rv.RVNM AS rvcdName, " +
"src.NAME AS name, " + "src.NAME AS name, " +
"src.TYPE AS type, " + "src.TYPE AS type, " +
"src.FAMILY AS family, " + "src.FAMILY AS family, " +
@ -769,15 +716,108 @@ public class FprMonitorServiceImpl implements FprMonitorService {
"src.LOGO AS logo, " + "src.LOGO AS logo, " +
"src.INFFILE AS inffile, " + "src.INFFILE AS inffile, " +
"src.ORDERS, \n" + "src.ORDERS, \n" +
"src.VLSR, \n"+ "src.VLSR AS vlsr, \n" +
"src.VLSR_TM AS vlsrTm, \n" +
"src.SPAWN_MONTH AS spawnMonth " + "src.SPAWN_MONTH AS spawnMonth " +
"FROM SD_FISHDICTORY_B src " + "FROM SD_FISHDICTORY_B src " +
"LEFT JOIN SD_FISHDICTORY_RLTN_B rel ON src.ID = rel.ZY_FISH_ID " + "LEFT JOIN SD_FISHDICTORY_RLTN_B rel ON src.ID = rel.ZY_FISH_ID " +
" AND rel.RVCD <> 'ZY' " + " AND rel.RVCD <> 'ZY' " +
" AND NVL(rel.IS_DELETED, 0) = 0 " + " AND NVL(rel.IS_DELETED, 0) = 0 " +
"LEFT JOIN SD_RVCD_DIC rv ON rv.RVCD = rel.RVCD " +
"WHERE NVL(src.IS_DELETED, 0) = 0 "; "WHERE NVL(src.IS_DELETED, 0) = 0 ";
} }
private String buildZyFishDicSummarySql() {
return "SELECT " +
"src.ID AS id, " +
"NVL(src.IS_DELETED, 0) AS isDeleted, " +
"src.ID AS zyFishId, " +
"NVL(relAgg.rvcd, 'null') AS rvcd, " +
"NVL(relAgg.rvcdName, '') AS rvcdName, " +
"src.NAME AS name, " +
"src.TYPE AS type, " +
"src.FAMILY AS family, " +
"src.GENUS AS genus, " +
"src.SPECIES AS species, " +
"src.NAME_EN AS nameEn, " +
"src.ALIAS AS alias, " +
"src.FSZ AS fsz, " +
"src.SHAPEDESC AS shapedesc, " +
"src.HABITATION AS habitation, " +
"src.HABIT_MIGRAT AS habitMigrat, " +
"src.FEEDING_HABIT AS feedingHabit, " +
"src.FOOD AS food, " +
"src.TIME_FEED AS timeFeed, " +
"src.ORIGN_DATE AS orignDate, " +
"CAST(NULL AS VARCHAR2(255)) AS filterContent, " +
"src.PRETEMP AS pretemp, " +
"src.FLOW_RATE AS flowRate, " +
"src.DEPTH AS depth, " +
"src.WQTQ AS wqtq, " +
"src.SPAWN_CHARACT AS spawnCharact, " +
"src.BOTM_MATER AS botmMater, " +
"src.PTYPE AS ptype, " +
"CASE src.PTYPE WHEN 1 THEN '濒危' WHEN 2 THEN '极危' WHEN 3 THEN '近危' WHEN 4 THEN '易危' WHEN 5 THEN '重点保护' WHEN 6 THEN '无危' WHEN 7 THEN '国家二级' WHEN 8 THEN '市二级保护' ELSE '未知' END AS ptypeName, " +
"src.SPEC_ORIGIN AS specOrigin, " +
"CASE WHEN src.SPEC_ORIGIN = 1 THEN '本土物种' WHEN src.SPEC_ORIGIN = 2 THEN '外来物种' ELSE NULL END AS specOriginName, " +
"src.DESCRIPTION AS description, " +
"src.LOGO AS logo, " +
"src.INFFILE AS inffile, " +
"src.ORDERS, " +
"src.VLSR AS vlsr, " +
"src.VLSR_TM AS vlsrTm, " +
"src.SPAWN_MONTH AS spawnMonth " +
"FROM SD_FISHDICTORY_B src " +
"LEFT JOIN ( " +
" SELECT relBase.ZY_FISH_ID AS zyFishId, " +
" MIN(relBase.RVCD) AS rvcd, " +
" LISTAGG(relBase.RVNM, ',') WITHIN GROUP (ORDER BY relBase.RVNM) AS rvcdName " +
" FROM ( " +
" SELECT DISTINCT rel.ZY_FISH_ID, rel.RVCD, rv.RVNM " +
" FROM SD_FISHDICTORY_RLTN_B rel " +
" LEFT JOIN SD_RVCD_DIC rv ON rv.RVCD = rel.RVCD " +
" WHERE rel.RVCD <> 'ZY' " +
" AND NVL(rel.IS_DELETED, 0) = 0 " +
" AND rv.RVNM IS NOT NULL " +
" ) relBase " +
" GROUP BY relBase.ZY_FISH_ID " +
") relAgg ON relAgg.zyFishId = src.ID " +
"WHERE NVL(src.IS_DELETED, 0) = 0 ";
}
private void fillZyFishRvcdNames(List<FprZyFishDicVo> list, String rvcdFilter) {
if (CollUtil.isEmpty(list)) {
return;
}
if (StrUtil.isNotBlank(rvcdFilter)) {
for (FprZyFishDicVo item : list) {
if (item != null && StrUtil.isBlank(item.getRvcdName()) && StrUtil.isNotBlank(item.getRvcd()) && !"null".equalsIgnoreCase(item.getRvcd())) {
item.setRvcdName(querySingleRvcdName(item.getRvcd()));
}
}
return;
}
for (FprZyFishDicVo item : list) {
if (item != null && item.getRvcdName() == null) {
item.setRvcdName("");
}
}
}
private String querySingleRvcdName(String rvcd) {
Map<String, Object> paramMap = new HashMap<>();
paramMap.put("rvcd", rvcd);
List<Map<String, Object>> rows = microservicDynamicSQLMapper.getAllList(
"SELECT RVNM AS rvcdName FROM SD_RVCD_DIC WHERE RVCD = #{map.rvcd} AND ROWNUM = 1",
paramMap
);
if (CollUtil.isEmpty(rows)) {
return null;
}
Object value = rows.get(0).get("RVCDNAME");
return value == null ? null : String.valueOf(value);
}
private String buildMsstbprptDetailSelectSql(List<String> selectFields) { private String buildMsstbprptDetailSelectSql(List<String> selectFields) {
LinkedHashMap<String, String> columnMap = buildMsstbprptSelectColumnMap(); LinkedHashMap<String, String> columnMap = buildMsstbprptSelectColumnMap();
if (CollUtil.isEmpty(selectFields)) { if (CollUtil.isEmpty(selectFields)) {
@ -1384,6 +1424,7 @@ public class FprMonitorServiceImpl implements FprMonitorService {
case "isDeleted" -> "t.isDeleted"; case "isDeleted" -> "t.isDeleted";
case "zyFishId" -> "t.zyFishId"; case "zyFishId" -> "t.zyFishId";
case "rvcd" -> "t.rvcd"; case "rvcd" -> "t.rvcd";
case "rvcdName" -> "t.rvcdName";
case "name" -> "t.name"; case "name" -> "t.name";
case "type" -> "t.type"; case "type" -> "t.type";
case "family" -> "t.family"; case "family" -> "t.family";
@ -1412,26 +1453,33 @@ public class FprMonitorServiceImpl implements FprMonitorService {
case "logo" -> "t.logo"; case "logo" -> "t.logo";
case "inffile" -> "t.inffile"; case "inffile" -> "t.inffile";
case "spawnMonth" -> "t.spawnMonth"; case "spawnMonth" -> "t.spawnMonth";
case "orders" -> "t.orders";
case "vlsr" -> "t.vlsr";
case "vlsrTm" -> "t.vlsrTm";
default -> null; default -> null;
}; };
} }
private List<FprZyFishDicVo> paginateZyFishDicList(List<FprZyFishDicVo> resultList, DataSourceLoadOptionsBase loadOptions) { private String buildZyFishDicOrderBySql(List<DataSourceRequest.SortDescriptor> sorts) {
if (CollUtil.isEmpty(resultList) || loadOptions == null || loadOptions.getTake() == null || loadOptions.getTake() <= 0) { List<String> orderItems = new ArrayList<>();
return resultList; if (CollUtil.isNotEmpty(sorts)) {
for (DataSourceRequest.SortDescriptor sort : sorts) {
if (sort == null || StrUtil.isBlank(sort.getField())) {
continue;
}
String column = mapZyFishDicColumn(sort.getField());
if (StrUtil.isBlank(column)) {
continue;
}
String direction = "desc".equalsIgnoreCase(sort.getDir()) || "des".equalsIgnoreCase(sort.getDir())
? "DESC" : "ASC";
orderItems.add(column + " " + direction + " NULLS LAST");
}
} }
int page = loadOptions.getSkip() == null ? 1 : loadOptions.getSkip(); // 页码从1开始缺省为1 if (orderItems.isEmpty()) {
// 如果页码 0强制设为1避免负值 return " ORDER BY t.rvcd ASC NULLS LAST, t.name ASC";
if (page < 1) {
page = 1;
} }
int size = loadOptions.getTake(); return " ORDER BY " + String.join(", ", orderItems);
int start = (page - 1) * size;
int end = Math.min(start + size, resultList.size());
if (start >= resultList.size()) {
return new ArrayList<>();
}
return new ArrayList<>(resultList.subList(start, end));
} }
private String formatSpawnMonth(String input) { private String formatSpawnMonth(String input) {

View File

@ -47,6 +47,24 @@ public class VdMonitorController {
return ResponseResult.successData(vdMonitorService.getKendoListCust(dataSourceRequest)); return ResponseResult.successData(vdMonitorService.getKendoListCust(dataSourceRequest));
} }
@PostMapping("/tree/GetKendoListCust")
@Operation(summary = "视频站树级结构查询")
public ResponseResult getVdTreeKendoListCust(@RequestBody DataSourceRequest dataSourceRequest) {
return ResponseResult.successData(vdMonitorService.getVdTreeKendoListCust(dataSourceRequest));
}
@PostMapping("/tree/GetKendoListCustSt")
@Operation(summary = "视频站树级结构查询-站点维度")
public ResponseResult getVdTreeKendoListCustSt(@RequestBody DataSourceRequest dataSourceRequest) {
return ResponseResult.successData(vdMonitorService.getVdTreeKendoListCustSt(dataSourceRequest));
}
@PostMapping("/vdpoint/GetKendoListCust")
@Operation(summary = "视频站锚点接口")
public ResponseResult getVdPointKendoListCust(@RequestBody DataSourceRequest dataSourceRequest) {
return ResponseResult.successData(vdMonitorService.getVdPointKendoListCust(dataSourceRequest));
}
@PostMapping("/runData/GetKendoListCust") @PostMapping("/runData/GetKendoListCust")
@Operation(summary = "查询视频监控运行数据") @Operation(summary = "查询视频监控运行数据")
public ResponseResult getRunDataKendoListCust(@RequestBody DataSourceRequest dataSourceRequest) { public ResponseResult getRunDataKendoListCust(@RequestBody DataSourceRequest dataSourceRequest) {

View File

@ -0,0 +1,86 @@
package com.yfd.platform.qgc_env.vd.entity.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.io.Serializable;
import java.math.BigDecimal;
@Data
@Schema(description = "视频站锚点信息")
public class VdPointVo implements Serializable {
private static final long serialVersionUID = 1L;
@Schema(description = "视频站子站类")
private String sttp;
@Schema(description = "视频站编码")
private String stcd;
@Schema(description = "经度")
private BigDecimal lgtd;
@Schema(description = "纬度")
private BigDecimal lttd;
@Schema(description = "高程")
private BigDecimal dtmel;
@Schema(description = "锚点状态")
private String anchoPointState;
@Schema(description = "站类地图标识")
private String sttpMap;
@Schema(description = "标题")
private String titleName;
@Schema(description = "默认距离")
private Integer distance;
@Schema(description = "流域编码")
private String rvcd;
@Schema(description = "行政区编码")
private String addvcd;
@Schema(description = "基地编码")
private String baseId;
@Schema(description = "所属电站编码")
private String rstcds;
@Schema(description = "站类编码")
private String sttpCode;
@Schema(description = "视频站名称")
private String stnm;
@Schema(description = "流域名称")
private String rvnm;
@Schema(description = "电站名称")
private String ennm;
@Schema(description = "栖息地编码")
private String fhstcd;
@Schema(description = "栖息地名称")
private String fhstnm;
@Schema(description = "站类名称")
private String sttpName;
@Schema(description = "站址")
private String stlc;
@Schema(description = "播放方式")
private String playWay;
@Schema(description = "站点排序")
private Integer siteStepSort;
@Schema(description = "基地流域编码")
private String hbrvcd;
}

View File

@ -0,0 +1,71 @@
package com.yfd.platform.qgc_env.vd.entity.vo;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.io.Serializable;
import java.util.Date;
import java.util.List;
@Data
@Schema(description = "视频站树节点")
public class VdTreeNodeVo implements Serializable {
private static final long serialVersionUID = 1L;
@Schema(description = "节点ID")
private String id;
@Schema(description = "节点名称")
private String name;
@Schema(description = "节点类型")
private String type;
@Schema(description = "节点类型名称")
private String typeName;
@Schema(description = "排序值")
private Integer sort;
@Schema(description = "父节点ID")
private String parentId;
@Schema(description = "父节点名称")
private String parentName;
@Schema(description = "是否有子节点")
private Integer hasChildren;
@Schema(description = "播放地址")
private String url;
@Schema(description = "播放方式")
private String playWay;
@Schema(description = "设备序列号")
private String deviceSerial;
@Schema(description = "接入方式")
private String accessWay;
@Schema(description = "流协议")
private String protocol;
@Schema(description = "清晰度")
private String quality;
@Schema(description = "控制方式")
private String controlMode;
@Schema(description = "设备状态")
private Integer status;
@Schema(description = "状态时间")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date statusTm;
@Schema(description = "子节点")
private List<VdTreeNodeVo> children;
}

View File

@ -0,0 +1,39 @@
package com.yfd.platform.qgc_env.vd.entity.vo;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import java.io.Serializable;
import java.util.Date;
@Data
public class VdTreeRowVo implements Serializable {
private static final long serialVersionUID = 1L;
private String stcd;
private String stCode;
private String stName;
private String stnm;
private String sttpCode;
private String sttpName;
private String sttpFullPath;
private String rstcd;
private String ennm;
private String baseId;
private String baseName;
private String url;
private String playWay;
private Integer baseSort;
private Integer rstcdStepSort;
private Integer siteStepSort;
private String deviceSerial;
private String accessWay;
private String protocol;
private String quality;
private String controlMode;
private Integer status;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date statusTm;
}

View File

@ -2,6 +2,7 @@ package com.yfd.platform.qgc_env.vd.service;
import com.yfd.platform.common.DataSourceRequest; import com.yfd.platform.common.DataSourceRequest;
import com.yfd.platform.common.DataSourceResult; import com.yfd.platform.common.DataSourceResult;
import com.yfd.platform.qgc_env.vd.entity.vo.VdTreeNodeVo;
import com.yfd.platform.qgc_env.vd.entity.vo.VdRunDataVo; import com.yfd.platform.qgc_env.vd.entity.vo.VdRunDataVo;
import com.yfd.platform.qgc_env.vd.entity.vo.VdVmsstbprptVo; import com.yfd.platform.qgc_env.vd.entity.vo.VdVmsstbprptVo;
@ -13,5 +14,11 @@ public interface VdMonitorService {
DataSourceResult<VdRunDataVo> getKendoListCust(DataSourceRequest dataSourceRequest); DataSourceResult<VdRunDataVo> getKendoListCust(DataSourceRequest dataSourceRequest);
DataSourceResult<VdTreeNodeVo> getVdTreeKendoListCust(DataSourceRequest dataSourceRequest);
DataSourceResult<VdTreeNodeVo> getVdTreeKendoListCustSt(DataSourceRequest dataSourceRequest);
DataSourceResult<?> getVdPointKendoListCust(DataSourceRequest dataSourceRequest);
DataSourceResult<VdRunDataVo> getRunDataKendoListCust(DataSourceRequest dataSourceRequest); DataSourceResult<VdRunDataVo> getRunDataKendoListCust(DataSourceRequest dataSourceRequest);
} }

View File

@ -9,7 +9,10 @@ import com.yfd.platform.common.DataSourceResult;
import com.yfd.platform.common.GroupHelper; import com.yfd.platform.common.GroupHelper;
import com.yfd.platform.common.GroupingInfo; import com.yfd.platform.common.GroupingInfo;
import com.yfd.platform.common.MicroservicDynamicSQLMapper; import com.yfd.platform.common.MicroservicDynamicSQLMapper;
import com.yfd.platform.qgc_env.vd.entity.vo.VdPointVo;
import com.yfd.platform.qgc_env.vd.entity.vo.VdRunDataVo; import com.yfd.platform.qgc_env.vd.entity.vo.VdRunDataVo;
import com.yfd.platform.qgc_env.vd.entity.vo.VdTreeNodeVo;
import com.yfd.platform.qgc_env.vd.entity.vo.VdTreeRowVo;
import com.yfd.platform.qgc_env.vd.entity.vo.VdVmsstbprptVo; import com.yfd.platform.qgc_env.vd.entity.vo.VdVmsstbprptVo;
import com.yfd.platform.qgc_env.vd.service.VdMonitorService; import com.yfd.platform.qgc_env.vd.service.VdMonitorService;
import com.yfd.platform.utils.QgcQueryWrapperUtil; import com.yfd.platform.utils.QgcQueryWrapperUtil;
@ -18,6 +21,7 @@ import org.springframework.stereotype.Service;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.Comparator;
import java.util.HashMap; import java.util.HashMap;
import java.util.LinkedHashMap; import java.util.LinkedHashMap;
import java.util.List; import java.util.List;
@ -118,6 +122,113 @@ public class VdMonitorServiceImpl implements VdMonitorService {
return queryLatestRunDataGroupList(dataSourceRequest, loadOptions); return queryLatestRunDataGroupList(dataSourceRequest, loadOptions);
} }
@Override
public DataSourceResult<VdTreeNodeVo> getVdTreeKendoListCust(DataSourceRequest dataSourceRequest) {
Map<String, Object> paramMap = new HashMap<>();
String filterSql = buildVdTreeFilterCondition(dataSourceRequest == null ? null : dataSourceRequest.getFilter(), paramMap, new int[]{0});
StringBuilder sql = new StringBuilder();
sql.append("SELECT ")
.append("t.stcd AS stcd, ")
.append("t.stCode AS stCode, ")
.append("t.stName AS stName, ")
.append("t.stnm AS stnm, ")
.append("t.sttpCode AS sttpCode, ")
.append("t.sttpName AS sttpName, ")
.append("t.sttpFullPath AS sttpFullPath, ")
.append("t.rstcd AS rstcd, ")
.append("t.ennm AS ennm, ")
.append("t.baseId AS baseId, ")
.append("t.baseName AS baseName, ")
.append("t.url AS url, ")
.append("t.playWay AS playWay, ")
.append("t.baseSort AS baseSort, ")
.append("t.rstcdStepSort AS rstcdStepSort, ")
.append("t.siteStepSort AS siteStepSort, ")
.append("t.deviceSerial AS deviceSerial, ")
.append("t.accessWay AS accessWay, ")
.append("t.protocol AS protocol, ")
.append("t.quality AS quality, ")
.append("t.controlMode AS controlMode, ")
.append("t.status AS status, ")
.append("t.statusTm AS statusTm ")
.append("FROM (")
.append(buildVdTreeCoreSql())
.append(") t WHERE 1 = 1 AND t.sttpCode != 'VD_FPRD'");
if (StrUtil.isNotBlank(filterSql)) {
sql.append(" AND ").append(filterSql).append(" ");
}
sql.append(" ORDER BY t.baseSort ASC NULLS LAST, t.rstcdStepSort ASC NULLS LAST, t.siteStepSort ASC NULLS LAST, t.stcd ASC");
List<VdTreeRowVo> rows = microservicDynamicSQLMapper.getAllListWithResultType(sql.toString(), paramMap, VdTreeRowVo.class);
boolean baseScoped = containsNonBlankFilterValue(dataSourceRequest == null ? null : dataSourceRequest.getFilter(), "baseId");
DataSourceResult<VdTreeNodeVo> result = new DataSourceResult<>();
List<VdTreeNodeVo> treeData = buildVdTreeNodes(rows, baseScoped);
result.setData(treeData);
result.setTotal((long) treeData.size());
result.setAggregates(new HashMap<>());
return result;
}
@Override
public DataSourceResult<VdTreeNodeVo> getVdTreeKendoListCustSt(DataSourceRequest dataSourceRequest) {
Map<String, Object> paramMap = new HashMap<>();
String filterSql = buildVdTreeFilterCondition(dataSourceRequest == null ? null : dataSourceRequest.getFilter(), paramMap, new int[]{0});
StringBuilder sql = new StringBuilder();
sql.append("SELECT ")
.append("t.stcd AS stcd, ")
.append("t.stCode AS stCode, ")
.append("t.stName AS stName, ")
.append("t.stnm AS stnm, ")
.append("t.sttpCode AS sttpCode, ")
.append("t.sttpName AS sttpName, ")
.append("t.sttpFullPath AS sttpFullPath, ")
.append("t.rstcd AS rstcd, ")
.append("t.ennm AS ennm, ")
.append("t.baseId AS baseId, ")
.append("t.baseName AS baseName, ")
.append("t.url AS url, ")
.append("t.playWay AS playWay, ")
.append("t.baseSort AS baseSort, ")
.append("t.rstcdStepSort AS rstcdStepSort, ")
.append("t.siteStepSort AS siteStepSort, ")
.append("t.deviceSerial AS deviceSerial, ")
.append("t.accessWay AS accessWay, ")
.append("t.protocol AS protocol, ")
.append("t.quality AS quality, ")
.append("t.controlMode AS controlMode, ")
.append("t.status AS status, ")
.append("t.statusTm AS statusTm ")
.append("FROM (")
.append(buildVdTreeCoreSql())
.append(") t WHERE 1 = 1 ");
if (StrUtil.isNotBlank(filterSql)) {
sql.append(" AND ").append(filterSql).append(" ");
}
sql.append(" ORDER BY t.baseSort ASC NULLS LAST, t.rstcdStepSort ASC NULLS LAST, t.siteStepSort ASC NULLS LAST, t.stcd ASC");
List<VdTreeRowVo> rows = microservicDynamicSQLMapper.getAllListWithResultType(sql.toString(), paramMap, VdTreeRowVo.class);
boolean baseScoped = containsNonBlankFilterValue(dataSourceRequest == null ? null : dataSourceRequest.getFilter(), "baseId");
DataSourceResult<VdTreeNodeVo> result = new DataSourceResult<>();
List<VdTreeNodeVo> treeData = buildVdTreeNodesByStation(rows, baseScoped);
result.setData(treeData);
result.setTotal((long) treeData.size());
result.setAggregates(new HashMap<>());
return result;
}
@Override
public DataSourceResult<?> getVdPointKendoListCust(DataSourceRequest dataSourceRequest) {
DataSourceLoadOptionsBase loadOptions = dataSourceRequest == null ? null : dataSourceRequest.toDevRequest();
if (CollUtil.isNotEmpty(dataSourceRequest == null ? null : dataSourceRequest.getGroup())) {
return getKendoListCust(dataSourceRequest);
}
return queryVdPointDetailList(dataSourceRequest, loadOptions);
}
@Override @Override
public DataSourceResult<VdRunDataVo> getRunDataKendoListCust(DataSourceRequest dataSourceRequest) { public DataSourceResult<VdRunDataVo> getRunDataKendoListCust(DataSourceRequest dataSourceRequest) {
DataSourceLoadOptionsBase loadOptions = dataSourceRequest == null ? null : dataSourceRequest.toDevRequest(); DataSourceLoadOptionsBase loadOptions = dataSourceRequest == null ? null : dataSourceRequest.toDevRequest();
@ -131,9 +242,30 @@ public class VdMonitorServiceImpl implements VdMonitorService {
GroupingInfo[] groups, GroupingInfo[] groups,
String filterSql, String filterSql,
Map<String, Object> paramMap) { Map<String, Object> paramMap) {
List<DataSourceRequest.GroupDescriptor> groupDescriptors = dataSourceRequest == null ? null : dataSourceRequest.getGroup();
List<String> selectItems = new ArrayList<>();
if (CollUtil.isNotEmpty(groupDescriptors)) {
for (DataSourceRequest.GroupDescriptor descriptor : groupDescriptors) {
if (descriptor == null || StrUtil.isBlank(descriptor.getField())) {
continue;
}
String column = mapColumn(descriptor.getField());
if (StrUtil.isBlank(column)) {
continue;
}
selectItems.add(column + " AS " + descriptor.getField());
selectItems.add("COUNT(1) AS count_" + descriptor.getField());
}
}
if (selectItems.isEmpty()) {
selectItems.add("t.sttpCode AS sttpCode");
selectItems.add("COUNT(1) AS count_sttpCode");
}
StringBuilder sql = new StringBuilder(); StringBuilder sql = new StringBuilder();
sql.append("SELECT t.sttpCode AS sttpCode, COUNT(1) AS count_sttpCode ") sql.append("SELECT ")
.append("FROM (") .append(String.join(", ", selectItems))
.append(" FROM (")
.append(buildVmsstbprptViewSql()) .append(buildVmsstbprptViewSql())
.append(") t ") .append(") t ")
.append("WHERE 1 = 1 "); .append("WHERE 1 = 1 ");
@ -141,8 +273,24 @@ public class VdMonitorServiceImpl implements VdMonitorService {
sql.append(" AND ").append(filterSql).append(" "); sql.append(" AND ").append(filterSql).append(" ");
} }
sql.append(" GROUP BY t.sttpCode "); List<String> groupByColumns = new ArrayList<>();
sql.append(buildOrderBySql(dataSourceRequest == null ? null : dataSourceRequest.getGroup())); if (CollUtil.isNotEmpty(groupDescriptors)) {
for (DataSourceRequest.GroupDescriptor descriptor : groupDescriptors) {
if (descriptor == null || StrUtil.isBlank(descriptor.getField())) {
continue;
}
String column = mapColumn(descriptor.getField());
if (StrUtil.isNotBlank(column)) {
groupByColumns.add(column);
}
}
}
if (!groupByColumns.isEmpty()) {
sql.append(" GROUP BY ").append(String.join(", ", groupByColumns));
} else {
sql.append(" GROUP BY t.sttpCode ");
}
sql.append(buildOrderBySql(groupDescriptors));
List<Map<String, Object>> rows = microservicDynamicSQLMapper.pageAllList(null, sql.toString(), paramMap); List<Map<String, Object>> rows = microservicDynamicSQLMapper.pageAllList(null, sql.toString(), paramMap);
DataSourceResult<VdVmsstbprptVo> result = new DataSourceResult<>(); DataSourceResult<VdVmsstbprptVo> result = new DataSourceResult<>();
@ -294,6 +442,32 @@ public class VdMonitorServiceImpl implements VdMonitorService {
return queryRunDataGroupList(dataSourceRequest, loadOptions, buildLatestRunDataCoreSql()); return queryRunDataGroupList(dataSourceRequest, loadOptions, buildLatestRunDataCoreSql());
} }
private DataSourceResult<VdPointVo> queryVdPointDetailList(DataSourceRequest dataSourceRequest,
DataSourceLoadOptionsBase loadOptions) {
Page<?> page = loadOptions == null ? null : QgcQueryWrapperUtil.buildPage(loadOptions, loadOptions.getSkip(), loadOptions.getTake());
StringBuilder sql = new StringBuilder();
sql.append("SELECT ")
.append(buildVdPointSelectSql())
.append("FROM (")
.append(buildVdPointCoreSql())
.append(") t WHERE 1 = 1 ");
Map<String, Object> paramMap = new HashMap<>();
String filterSql = buildFilterCondition(dataSourceRequest == null ? null : dataSourceRequest.getFilter(), paramMap, new int[]{0});
if (StrUtil.isNotBlank(filterSql)) {
sql.append(" AND ").append(filterSql).append(" ");
}
sql.append(buildVdPointOrderBySql(dataSourceRequest == null ? null : dataSourceRequest.getSort()));
List<VdPointVo> list = microservicDynamicSQLMapper.pageAllListWithResultType(
page, sql.toString(), paramMap, VdPointVo.class);
DataSourceResult<VdPointVo> result = new DataSourceResult<>();
result.setData(list);
result.setTotal(page != null ? page.getTotal() : list.size());
result.setAggregates(new HashMap<>());
return result;
}
private DataSourceResult<VdRunDataVo> queryRunDataGroupList(DataSourceRequest dataSourceRequest, private DataSourceResult<VdRunDataVo> queryRunDataGroupList(DataSourceRequest dataSourceRequest,
DataSourceLoadOptionsBase loadOptions, DataSourceLoadOptionsBase loadOptions,
String coreSql) { String coreSql) {
@ -418,12 +592,57 @@ public class VdMonitorServiceImpl implements VdMonitorService {
" AND NVL(sttp.IS_DELETED, 0) = 0 AND NVL(sttp.ENABLE, 1) = 1 "; " AND NVL(sttp.IS_DELETED, 0) = 0 AND NVL(sttp.ENABLE, 1) = 1 ";
} }
private String buildVdTreeCoreSql() {
return "SELECT " +
"base.STCD AS stcd, " +
"base.STNM AS stnm, " +
"base.CSTCD AS stCode, " +
"cst.STNM AS stName, " +
"base.STTP AS sttpCode, " +
"sttp.STTP_NAME AS sttpName, " +
"sttp.FULL_PATH AS sttpFullPath, " +
"base.RSTCD AS rstcd, " +
"eng.ENNM AS ennm, " +
"NVL(eng.BASE_ID, base.BASE_ID) AS baseId, " +
"hb.BASENAME AS baseName, " +
"base.URL AS url, " +
"CASE WHEN base.URL IS NULL THEN NULL WHEN INSTR(base.URL, 'm3u8') > 0 THEN '1' ELSE '0' END AS playWay, " +
"NVL(hb.ORDER_INDEX, 999999) AS baseSort, " +
"NVL(eng.ORDER_INDEX, 999999) AS rstcdStepSort, " +
"NVL(base.ORDER_INDEX, 999999) AS siteStepSort, " +
"base.DEVICE_SERIAL AS deviceSerial, " +
"base.ACCESS_WAY AS accessWay, " +
"base.PROTOCOL AS protocol, " +
"base.QUALITY AS quality, " +
"base.CONTROL_MODE AS controlMode, " +
"status.STATUS AS status, " +
"status.TM AS statusTm " +
"FROM (" + buildVdDeviceBaseSql() + ") base " +
"LEFT JOIN SD_ENGINFO_B_H eng ON eng.STCD = base.RSTCD AND NVL(eng.IS_DELETED, 0) = 0 " +
"LEFT JOIN SD_HYDROBASE hb ON hb.BASEID = NVL(eng.BASE_ID, base.BASE_ID) " +
" AND NVL(hb.IS_DELETED, 0) = 0 AND NVL(hb.ENABLED, 1) = 1 " +
"LEFT JOIN (" + buildStationBaseSql() + ") cst ON cst.STCD = base.CSTCD " +
"LEFT JOIN SD_STTP_B sttp ON sttp.STTP_CODE = base.STTP " +
" AND NVL(sttp.IS_DELETED, 0) = 0 AND NVL(sttp.ENABLE, 1) = 1 " +
"LEFT JOIN ( " +
"SELECT detail.STCD, detail.TM, detail.STATUS " +
"FROM MS_SBGZSTAT_B detail " +
"INNER JOIN ( " +
"SELECT STCD, MAX(TM) AS MAX_TM FROM MS_SBGZSTAT_B " +
"WHERE NVL(IS_DELETED, 0) = 0 GROUP BY STCD " +
") latest ON detail.STCD = latest.STCD AND detail.TM = latest.MAX_TM " +
"WHERE NVL(detail.IS_DELETED, 0) = 0 " +
") status ON status.STCD = base.STCD " +
"WHERE base.STTP LIKE 'VD_%' ";
}
private String buildVdDeviceBaseSql() { private String buildVdDeviceBaseSql() {
return "SELECT vd.STCD, vd.STNM, vd.MNTP, vd.STTP, vd.LGTD, vd.LTTD, vd.ELEV, vd.STLC, " + return "SELECT vd.STCD, vd.STNM, vd.MNTP, vd.STTP, vd.LGTD, vd.LTTD, vd.ELEV, vd.STLC, " +
" vd.JCDT, vd.WDDT, vd.BLDSTT_CODE, vd.USFL, vd.DTIN, vd.STINDX, vd.RSTCD, vd.BASE_ID, " + " vd.JCDT, vd.WDDT, vd.BLDSTT_CODE, vd.USFL, vd.DTIN, vd.STINDX, vd.RSTCD, vd.BASE_ID, " +
" vd.HBRVCD, vd.RVCD, vd.ADDVCD, vd.CSTCD, vd.FHSTCD, CAST(NULL AS VARCHAR2(3000)) AS INTRODUCE, " + " vd.HBRVCD, vd.RVCD, vd.ADDVCD, vd.CSTCD, vd.FHSTCD, CAST(NULL AS VARCHAR2(3000)) AS INTRODUCE, " +
" CAST(NULL AS VARCHAR2(255)) AS LOGO, CAST(NULL AS VARCHAR2(1000)) AS INFFILE, " + " CAST(NULL AS VARCHAR2(255)) AS LOGO, CAST(NULL AS VARCHAR2(1000)) AS INFFILE, " +
" vd.DTFRQCY, vd.REMARK, vd.VLSR, vd.VLSR_TM, vd.URL AS URL, CAST(NULL AS NUMBER(8,0)) AS ORDER_INDEX, " + " vd.DTFRQCY, vd.REMARK, vd.VLSR, vd.VLSR_TM, vd.URL AS URL, vd.DEVICE_SERIAL, vd.ACCESS_WAY, " +
" vd.PROTOCOL, vd.QUALITY, vd.CONTROL_MODE, CAST(NULL AS NUMBER(8,0)) AS ORDER_INDEX, " +
" 'SD_VDINFO_B' AS SOURCE_TABLE " + " 'SD_VDINFO_B' AS SOURCE_TABLE " +
"FROM SD_VDINFO_B vd WHERE 1=1 " + "FROM SD_VDINFO_B vd WHERE 1=1 " +
// " AND vd.STTP = 'VD_FP' "+ // " AND vd.STTP = 'VD_FP' "+
@ -431,11 +650,59 @@ public class VdMonitorServiceImpl implements VdMonitorService {
"SELECT sonar.STCD, sonar.STNM, sonar.MNTP, sonar.STTP, sonar.LGTD, sonar.LTTD, sonar.ELEV, sonar.STLC, " + "SELECT sonar.STCD, sonar.STNM, sonar.MNTP, sonar.STTP, sonar.LGTD, sonar.LTTD, sonar.ELEV, sonar.STLC, " +
" sonar.JCDT, sonar.WDDT, sonar.BLDSTT_CODE, sonar.USFL, sonar.DTIN, sonar.STINDX, sonar.RSTCD, sonar.BASE_ID, " + " sonar.JCDT, sonar.WDDT, sonar.BLDSTT_CODE, sonar.USFL, sonar.DTIN, sonar.STINDX, sonar.RSTCD, sonar.BASE_ID, " +
" sonar.HBRVCD, sonar.RVCD, sonar.ADDVCD, CAST(NULL AS VARCHAR2(36)) AS CSTCD, CAST(NULL AS VARCHAR2(36)) AS FHSTCD, " + " sonar.HBRVCD, sonar.RVCD, sonar.ADDVCD, CAST(NULL AS VARCHAR2(36)) AS CSTCD, CAST(NULL AS VARCHAR2(36)) AS FHSTCD, " +
" sonar.INTRODUCE, sonar.LOGO, sonar.INFFILE, sonar.DTFRQCY, sonar.REMARK, sonar.VLSR, sonar.VLSR_TM, CAST(NULL AS VARCHAR2(512)) AS URL, sonar.ORDER_INDEX, " + " sonar.INTRODUCE, sonar.LOGO, sonar.INFFILE, sonar.DTFRQCY, sonar.REMARK, sonar.VLSR, sonar.VLSR_TM, CAST(NULL AS VARCHAR2(512)) AS URL, " +
" CAST(NULL AS VARCHAR2(255)) AS DEVICE_SERIAL, CAST(NULL AS VARCHAR2(10)) AS ACCESS_WAY, " +
" CAST(NULL AS VARCHAR2(50)) AS PROTOCOL, CAST(NULL AS VARCHAR2(50)) AS QUALITY, CAST(NULL AS VARCHAR2(2048)) AS CONTROL_MODE, sonar.ORDER_INDEX, " +
" 'SD_SONAR_B_H' AS SOURCE_TABLE " + " 'SD_SONAR_B_H' AS SOURCE_TABLE " +
"FROM SD_SONAR_B_H sonar WHERE NVL(sonar.IS_DELETED, 0) = 0 AND sonar.STTP IN ('VD_WVD', 'VD_SN') "; "FROM SD_SONAR_B_H sonar WHERE NVL(sonar.IS_DELETED, 0) = 0 AND sonar.STTP IN ('VD_WVD', 'VD_SN') ";
} }
private String buildVdPointCoreSql() {
return "SELECT " +
"src.STTP AS sttp, " +
"src.STCD AS stcd, " +
"src.LGTD AS lgtd, " +
"src.LTTD AS lttd, " +
"CAST(NULL AS NUMBER(10, 6)) AS dtmel, " +
"CASE " +
" WHEN NVL(eng.HBRVCD, src.HBRVCD) = 'SJLY126' THEN CASE src.STTP " +
" WHEN 'VD_FBFM' THEN 'fbfm_spjk' " +
" WHEN 'VD_EQS' THEN 'eqs_spjk' " +
" WHEN 'VD_FB' THEN 'fb_spjk' " +
" WHEN 'VD_FP' THEN 'fp_spjk' " +
" WHEN 'VD_FH' THEN 'fh_spjk' " +
" WHEN 'VD_VA' THEN 'va_spjk' " +
" WHEN 'VD_VP' THEN 'vp_spjk' " +
" WHEN 'VD_DW' THEN 'dw_spjk' " +
" WHEN 'VD_WQ' THEN 'wq_spjk' " +
" ELSE 'spjk' END " +
" ELSE 'spjk' END AS anchoPointState, " +
"'VD' AS sttpMap, " +
"src.STNM AS titleName, " +
"400000 AS distance, " +
"NVL(eng.RVCD, src.RVCD) AS rvcd, " +
"NVL(eng.ADDVCD, src.ADDVCD) AS addvcd, " +
"NVL(eng.BASE_ID, src.BASE_ID) AS baseId, " +
"src.RSTCD AS rstcds, " +
"'VD' AS sttpCode, " +
"src.STNM AS stnm, " +
"rv.RVNM AS rvnm, " +
"eng.ENNM AS ennm, " +
"src.FHSTCD AS fhstcd, " +
"fh.STNM AS fhstnm, " +
"sttp.STTP_NAME AS sttpName, " +
"src.STLC AS stlc, " +
"CASE WHEN src.URL IS NULL THEN NULL WHEN INSTR(src.URL, 'm3u8') > 0 THEN '1' ELSE '0' END AS playWay, " +
"src.ORDER_INDEX AS siteStepSort, " +
"NVL(eng.HBRVCD, src.HBRVCD) AS hbrvcd " +
"FROM (" + buildVdDeviceBaseSql() + ") src " +
"LEFT JOIN SD_ENGINFO_B_H eng ON eng.STCD = src.RSTCD AND NVL(eng.IS_DELETED, 0) = 0 " +
"LEFT JOIN SD_FHBT_B_H fh ON fh.STCD = src.FHSTCD AND NVL(fh.IS_DELETED, 0) = 0 " +
"LEFT JOIN SD_RVCD_DIC rv ON rv.RVCD = NVL(eng.RVCD, src.RVCD) " +
"LEFT JOIN SD_STTP_B sttp ON sttp.STTP_CODE = src.STTP " +
" AND NVL(sttp.IS_DELETED, 0) = 0 AND NVL(sttp.ENABLE, 1) = 1 ";
}
private String buildRunDataCoreSql() { private String buildRunDataCoreSql() {
return "SELECT " + return "SELECT " +
"run.ID AS id, " + "run.ID AS id, " +
@ -591,6 +858,33 @@ public class VdMonitorServiceImpl implements VdMonitorService {
return String.join(", ", actualColumns); return String.join(", ", actualColumns);
} }
private String buildVdPointSelectSql() {
return "t.sttp AS sttp, " +
"t.stcd AS stcd, " +
"t.lgtd AS lgtd, " +
"t.lttd AS lttd, " +
"t.dtmel AS dtmel, " +
"t.anchoPointState AS anchoPointState, " +
"t.sttpMap AS sttpMap, " +
"t.titleName AS titleName, " +
"t.distance AS distance, " +
"t.rvcd AS rvcd, " +
"t.addvcd AS addvcd, " +
"t.baseId AS baseId, " +
"t.rstcds AS rstcds, " +
"t.sttpCode AS sttpCode, " +
"t.stnm AS stnm, " +
"t.rvnm AS rvnm, " +
"t.ennm AS ennm, " +
"t.fhstcd AS fhstcd, " +
"t.fhstnm AS fhstnm, " +
"t.sttpName AS sttpName, " +
"t.stlc AS stlc, " +
"t.playWay AS playWay, " +
"t.siteStepSort AS siteStepSort, " +
"t.hbrvcd AS hbrvcd ";
}
private String buildRunDataOrderBySql(List<DataSourceRequest.SortDescriptor> sortList) { private String buildRunDataOrderBySql(List<DataSourceRequest.SortDescriptor> sortList) {
if (CollUtil.isEmpty(sortList)) { if (CollUtil.isEmpty(sortList)) {
return " ORDER BY t.baseStepSort ASC, t.rvcdStepSort ASC, t.rstcdStepSort ASC, t.siteStepSort ASC, t.stcd ASC, t.tm DESC"; return " ORDER BY t.baseStepSort ASC, t.rvcdStepSort ASC, t.rstcdStepSort ASC, t.siteStepSort ASC, t.stcd ASC, t.tm DESC";
@ -613,6 +907,28 @@ public class VdMonitorServiceImpl implements VdMonitorService {
return " ORDER BY " + String.join(", ", orderItems); return " ORDER BY " + String.join(", ", orderItems);
} }
private String buildVdPointOrderBySql(List<DataSourceRequest.SortDescriptor> sortList) {
if (CollUtil.isEmpty(sortList)) {
return " ORDER BY t.siteStepSort ASC NULLS LAST, t.stcd ASC";
}
List<String> orderItems = new ArrayList<>();
for (DataSourceRequest.SortDescriptor sort : sortList) {
if (sort == null || StrUtil.isBlank(sort.getField())) {
continue;
}
String column = mapColumn(sort.getField());
if (StrUtil.isBlank(column)) {
continue;
}
String direction = "desc".equalsIgnoreCase(sort.getDir()) || "des".equalsIgnoreCase(sort.getDir()) ? "DESC" : "ASC";
orderItems.add(column + " " + direction + " NULLS LAST");
}
if (orderItems.isEmpty()) {
return " ORDER BY t.siteStepSort ASC NULLS LAST, t.stcd ASC";
}
return " ORDER BY " + String.join(", ", orderItems);
}
private String buildRunDataGroupOrderBySql(List<DataSourceRequest.GroupDescriptor> groups) { private String buildRunDataGroupOrderBySql(List<DataSourceRequest.GroupDescriptor> groups) {
if (CollUtil.isEmpty(groups)) { if (CollUtil.isEmpty(groups)) {
return ""; return "";
@ -641,6 +957,42 @@ public class VdMonitorServiceImpl implements VdMonitorService {
}; };
} }
private String buildVdTreeFilterCondition(DataSourceRequest.FilterDescriptor filter,
Map<String, Object> paramMap,
int[] indexHolder) {
if (filter == null) {
return "";
}
if (StrUtil.isNotBlank(filter.getField())) {
return buildVdTreeLeafCondition(filter, paramMap, indexHolder);
}
if (CollUtil.isEmpty(filter.getFilters())) {
return "";
}
List<String> conditions = new ArrayList<>();
for (DataSourceRequest.FilterDescriptor child : filter.getFilters()) {
String childSql = buildVdTreeFilterCondition(child, paramMap, indexHolder);
if (StrUtil.isNotBlank(childSql)) {
conditions.add("(" + childSql + ")");
}
}
if (conditions.isEmpty()) {
return "";
}
String logic = "or".equalsIgnoreCase(filter.getLogic()) ? " OR " : " AND ";
return String.join(logic, conditions);
}
private String buildVdTreeLeafCondition(DataSourceRequest.FilterDescriptor filter,
Map<String, Object> paramMap,
int[] indexHolder) {
String column = mapVdTreeColumn(filter.getField());
if (StrUtil.isBlank(column)) {
return "";
}
return buildSimpleCondition(column, "vdTreeParam", filter, paramMap, indexHolder, isVdTreeDateField(filter));
}
private String buildFilterCondition(DataSourceRequest.FilterDescriptor filter, private String buildFilterCondition(DataSourceRequest.FilterDescriptor filter,
Map<String, Object> paramMap, Map<String, Object> paramMap,
int[] indexHolder) { int[] indexHolder) {
@ -804,6 +1156,16 @@ public class VdMonitorServiceImpl implements VdMonitorService {
return "date".equalsIgnoreCase(filter.getDataType()); return "date".equalsIgnoreCase(filter.getDataType());
} }
private boolean isVdTreeDateField(DataSourceRequest.FilterDescriptor filter) {
if (filter == null || StrUtil.isBlank(filter.getField())) {
return false;
}
if ("statusTm".equalsIgnoreCase(filter.getField())) {
return true;
}
return "date".equalsIgnoreCase(filter.getDataType());
}
private String buildValueExpr(String paramKey, boolean dateField, Object value) { private String buildValueExpr(String paramKey, boolean dateField, Object value) {
if (!dateField || value == null) { if (!dateField || value == null) {
return "#{map." + paramKey + "}"; return "#{map." + paramKey + "}";
@ -839,11 +1201,41 @@ public class VdMonitorServiceImpl implements VdMonitorService {
return values; return values;
} }
private String mapVdTreeColumn(String field) {
if (StrUtil.isBlank(field)) {
return null;
}
return switch (field) {
case "stcd" -> "t.stcd";
case "stCode" -> "t.stCode";
case "stName" -> "t.stName";
case "stnm" -> "t.stnm";
case "sttpCode" -> "t.sttpCode";
case "sttpName" -> "t.sttpName";
case "sttpFullPath" -> "t.sttpFullPath";
case "rstcd" -> "t.rstcd";
case "ennm" -> "t.ennm";
case "baseId" -> "t.baseId";
case "baseName" -> "t.baseName";
case "url" -> "t.url";
case "playWay" -> "t.playWay";
case "deviceSerial" -> "t.deviceSerial";
case "accessWay" -> "t.accessWay";
case "protocol" -> "t.protocol";
case "quality" -> "t.quality";
case "controlMode" -> "t.controlMode";
case "status" -> "NVL(t.status, 0)";
case "statusTm" -> "t.statusTm";
default -> null;
};
}
private String mapColumn(String field) { private String mapColumn(String field) {
if (StrUtil.isBlank(field)) { if (StrUtil.isBlank(field)) {
return null; return null;
} }
return switch (field) { return switch (field) {
case "sttp" -> "t.sttp";
case "sttpCode" -> "t.sttpCode"; case "sttpCode" -> "t.sttpCode";
case "sttpName" -> "t.sttpName"; case "sttpName" -> "t.sttpName";
case "sttpFullPath" -> "t.sttpFullPath"; case "sttpFullPath" -> "t.sttpFullPath";
@ -878,11 +1270,15 @@ public class VdMonitorServiceImpl implements VdMonitorService {
case "vlsr" -> "t.vlsr"; case "vlsr" -> "t.vlsr";
case "vlsrTm" -> "t.vlsrTm"; case "vlsrTm" -> "t.vlsrTm";
case "rvcd" -> "t.rvcd"; case "rvcd" -> "t.rvcd";
case "rvnm" -> "t.rvnm";
case "addvcd" -> "t.addvcd"; case "addvcd" -> "t.addvcd";
case "dtin" -> "t.dtin"; case "dtin" -> "t.dtin";
case "usfl" -> "t.usfl"; case "usfl" -> "t.usfl";
case "url" -> "t.url"; case "url" -> "t.url";
case "playWay" -> "t.playWay"; case "playWay" -> "t.playWay";
case "titleName" -> "t.titleName";
case "rstcds" -> "t.rstcds";
case "anchoPointState" -> "t.anchoPointState";
case "sourceTable" -> "t.sourceTable"; case "sourceTable" -> "t.sourceTable";
case "baseStepSort" -> "t.baseStepSort"; case "baseStepSort" -> "t.baseStepSort";
case "rstcdStepSort" -> "t.rstcdStepSort"; case "rstcdStepSort" -> "t.rstcdStepSort";
@ -971,4 +1367,265 @@ public class VdMonitorServiceImpl implements VdMonitorService {
} }
return " ORDER BY " + String.join(", ", orderItems); return " ORDER BY " + String.join(", ", orderItems);
} }
private boolean containsNonBlankFilterValue(DataSourceRequest.FilterDescriptor filter, String fieldName) {
if (filter == null || StrUtil.isBlank(fieldName)) {
return false;
}
if (fieldName.equalsIgnoreCase(filter.getField())) {
if (filter.getValue() instanceof List<?> list) {
return CollUtil.isNotEmpty(list);
}
return StrUtil.isNotBlank(filter.getValue() == null ? null : String.valueOf(filter.getValue()));
}
if (CollUtil.isEmpty(filter.getFilters())) {
return false;
}
for (DataSourceRequest.FilterDescriptor child : filter.getFilters()) {
if (containsNonBlankFilterValue(child, fieldName)) {
return true;
}
}
return false;
}
private List<VdTreeNodeVo> buildVdTreeNodes(List<VdTreeRowVo> rows, boolean baseScoped) {
List<VdTreeNodeVo> stationNodes = buildStationTreeNodes(rows, baseScoped);
if (baseScoped) {
return sortTreeNodes(stationNodes);
}
LinkedHashMap<String, VdTreeNodeVo> baseNodeMap = new LinkedHashMap<>();
List<VdTreeNodeVo> topLevelWithoutBase = new ArrayList<>();
for (VdTreeRowVo row : rows) {
if (row == null) {
continue;
}
if (StrUtil.isBlank(row.getBaseId())) {
continue;
}
baseNodeMap.computeIfAbsent(row.getBaseId(), key -> {
VdTreeNodeVo node = new VdTreeNodeVo();
node.setId(key);
node.setName(StrUtil.blankToDefault(row.getBaseName(), key));
node.setType("PSB");
node.setTypeName("基地");
node.setSort(defaultSort(row.getBaseSort()));
node.setHasChildren(1);
node.setParentId(null);
node.setParentName(null);
return node;
});
}
Map<String, List<VdTreeNodeVo>> stationByBase = new LinkedHashMap<>();
for (VdTreeNodeVo stationNode : stationNodes) {
if (StrUtil.isBlank(stationNode.getParentId())) {
topLevelWithoutBase.add(stationNode);
continue;
}
stationByBase.computeIfAbsent(stationNode.getParentId(), key -> new ArrayList<>()).add(stationNode);
}
List<VdTreeNodeVo> result = new ArrayList<>();
for (Map.Entry<String, VdTreeNodeVo> entry : baseNodeMap.entrySet()) {
VdTreeNodeVo baseNode = entry.getValue();
baseNode.setChildren(sortTreeNodes(stationByBase.get(entry.getKey())));
result.add(baseNode);
}
result.addAll(topLevelWithoutBase);
return sortTreeNodes(result);
}
private List<VdTreeNodeVo> buildVdTreeNodesByStation(List<VdTreeRowVo> rows, boolean baseScoped) {
List<VdTreeNodeVo> stationNodes = buildStationCodeTreeNodes(rows, baseScoped);
if (baseScoped) {
return sortTreeNodes(stationNodes);
}
LinkedHashMap<String, VdTreeNodeVo> baseNodeMap = new LinkedHashMap<>();
List<VdTreeNodeVo> topLevelWithoutBase = new ArrayList<>();
for (VdTreeRowVo row : rows) {
if (row == null || StrUtil.isBlank(row.getBaseId())) {
continue;
}
baseNodeMap.computeIfAbsent(row.getBaseId(), key -> {
VdTreeNodeVo node = new VdTreeNodeVo();
node.setId(key);
node.setName(StrUtil.blankToDefault(row.getBaseName(), key));
node.setType("PSB");
node.setTypeName("基地");
node.setSort(defaultSort(row.getBaseSort()));
node.setHasChildren(1);
node.setParentId(null);
node.setParentName(null);
return node;
});
}
Map<String, List<VdTreeNodeVo>> stationByBase = new LinkedHashMap<>();
for (VdTreeNodeVo stationNode : stationNodes) {
if (StrUtil.isBlank(stationNode.getParentId())) {
topLevelWithoutBase.add(stationNode);
continue;
}
stationByBase.computeIfAbsent(stationNode.getParentId(), key -> new ArrayList<>()).add(stationNode);
}
List<VdTreeNodeVo> result = new ArrayList<>();
for (Map.Entry<String, VdTreeNodeVo> entry : baseNodeMap.entrySet()) {
VdTreeNodeVo baseNode = entry.getValue();
baseNode.setChildren(sortTreeNodes(stationByBase.get(entry.getKey())));
result.add(baseNode);
}
result.addAll(topLevelWithoutBase);
return sortTreeNodes(result);
}
private List<VdTreeNodeVo> buildStationTreeNodes(List<VdTreeRowVo> rows, boolean baseScoped) {
LinkedHashMap<String, List<VdTreeRowVo>> stationRowMap = new LinkedHashMap<>();
for (VdTreeRowVo row : rows) {
if (row == null || StrUtil.isBlank(row.getRstcd())) {
continue;
}
stationRowMap.computeIfAbsent(row.getRstcd(), key -> new ArrayList<>()).add(row);
}
List<VdTreeNodeVo> stationNodes = new ArrayList<>();
for (Map.Entry<String, List<VdTreeRowVo>> entry : stationRowMap.entrySet()) {
List<VdTreeRowVo> stationRows = entry.getValue();
if (CollUtil.isEmpty(stationRows)) {
continue;
}
VdTreeRowVo sample = stationRows.get(0);
VdTreeNodeVo stationNode = new VdTreeNodeVo();
stationNode.setId(entry.getKey());
stationNode.setName(StrUtil.blankToDefault(sample.getEnnm(), entry.getKey()));
stationNode.setType("ENG");
stationNode.setTypeName("电站");
stationNode.setSort(defaultSort(sample.getRstcdStepSort()));
stationNode.setHasChildren(1);
if (baseScoped) {
stationNode.setParentId(null);
stationNode.setParentName(null);
} else {
stationNode.setParentId(sample.getBaseId());
stationNode.setParentName(sample.getBaseName());
}
stationNode.setChildren(buildSiteTreeNodes(stationRows));
stationNodes.add(stationNode);
}
return sortTreeNodes(stationNodes);
}
private List<VdTreeNodeVo> buildSiteTreeNodes(List<VdTreeRowVo> rows) {
LinkedHashMap<String, VdTreeNodeVo> siteNodeMap = new LinkedHashMap<>();
for (VdTreeRowVo row : rows) {
if (row == null || StrUtil.isBlank(row.getStcd()) || siteNodeMap.containsKey(row.getStcd())) {
continue;
}
VdTreeNodeVo node = new VdTreeNodeVo();
node.setId(row.getStcd());
node.setName(StrUtil.blankToDefault(row.getStnm(), row.getStcd()));
node.setType(row.getSttpCode());
node.setTypeName(row.getSttpName());
node.setSort(defaultSort(row.getSiteStepSort()));
node.setHasChildren(0);
node.setParentId(row.getRstcd());
node.setParentName(row.getEnnm());
node.setUrl(row.getUrl());
node.setPlayWay(row.getPlayWay());
node.setDeviceSerial(row.getDeviceSerial());
node.setAccessWay(row.getAccessWay());
node.setProtocol(row.getProtocol());
node.setQuality(row.getQuality());
node.setControlMode(row.getControlMode());
node.setStatus(row.getStatus());
node.setStatusTm(row.getStatusTm());
siteNodeMap.put(row.getStcd(), node);
}
return sortTreeNodes(new ArrayList<>(siteNodeMap.values()));
}
private List<VdTreeNodeVo> buildStationCodeTreeNodes(List<VdTreeRowVo> rows, boolean baseScoped) {
LinkedHashMap<String, List<VdTreeRowVo>> stationRowMap = new LinkedHashMap<>();
for (VdTreeRowVo row : rows) {
if (row == null || StrUtil.isBlank(row.getStCode())) {
continue;
}
stationRowMap.computeIfAbsent(row.getStCode(), key -> new ArrayList<>()).add(row);
}
List<VdTreeNodeVo> stationNodes = new ArrayList<>();
for (Map.Entry<String, List<VdTreeRowVo>> entry : stationRowMap.entrySet()) {
List<VdTreeRowVo> stationRows = entry.getValue();
if (CollUtil.isEmpty(stationRows)) {
continue;
}
VdTreeRowVo sample = stationRows.get(0);
VdTreeNodeVo stationNode = new VdTreeNodeVo();
stationNode.setId(entry.getKey());
stationNode.setName(StrUtil.blankToDefault(sample.getStName(), entry.getKey()));
stationNode.setType("VD_FB");
stationNode.setTypeName("鱼类增殖站");
stationNode.setSort(defaultSort(sample.getRstcdStepSort()));
stationNode.setHasChildren(1);
if (baseScoped) {
stationNode.setParentId(null);
stationNode.setParentName(null);
} else {
stationNode.setParentId(sample.getBaseId());
stationNode.setParentName(sample.getBaseName());
}
stationNode.setChildren(buildSiteTreeNodesByStation(stationRows));
stationNodes.add(stationNode);
}
return sortTreeNodes(stationNodes);
}
private List<VdTreeNodeVo> buildSiteTreeNodesByStation(List<VdTreeRowVo> rows) {
LinkedHashMap<String, VdTreeNodeVo> siteNodeMap = new LinkedHashMap<>();
for (VdTreeRowVo row : rows) {
if (row == null || StrUtil.isBlank(row.getStcd()) || siteNodeMap.containsKey(row.getStcd())) {
continue;
}
VdTreeNodeVo node = new VdTreeNodeVo();
node.setId(row.getStcd());
node.setName(StrUtil.blankToDefault(row.getStnm(), row.getStcd()));
node.setType(row.getSttpCode());
node.setTypeName(row.getSttpName());
node.setSort(defaultSort(row.getSiteStepSort()));
node.setHasChildren(0);
node.setParentId(row.getStCode());
node.setParentName(row.getStName());
node.setUrl(row.getUrl());
node.setPlayWay(row.getPlayWay());
node.setDeviceSerial(row.getDeviceSerial());
node.setAccessWay(row.getAccessWay());
node.setProtocol(row.getProtocol());
node.setQuality(row.getQuality());
node.setControlMode(row.getControlMode());
node.setStatus(row.getStatus());
node.setStatusTm(row.getStatusTm());
siteNodeMap.put(row.getStcd(), node);
}
return sortTreeNodes(new ArrayList<>(siteNodeMap.values()));
}
private List<VdTreeNodeVo> sortTreeNodes(List<VdTreeNodeVo> nodes) {
if (CollUtil.isEmpty(nodes)) {
return new ArrayList<>();
}
nodes.sort(Comparator.comparing(VdMonitorServiceImpl::sortValue)
.thenComparing(node -> StrUtil.blankToDefault(node.getId(), "")));
return nodes;
}
private static Integer sortValue(VdTreeNodeVo node) {
return node == null ? 999999 : defaultSort(node.getSort());
}
private static Integer defaultSort(Integer sort) {
return sort == null ? 999999 : sort;
}
} }

View File

@ -0,0 +1,77 @@
package com.yfd.platform.qgc_env.warn.controller;
import com.yfd.platform.common.DataSourceRequest;
import com.yfd.platform.config.ResponseResult;
import com.yfd.platform.qgc_env.warn.service.WarnDataService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.annotation.Resource;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/warn")
@Tag(name = "告警状态模块")
@Validated
public class WarnDataController {
@Resource
private WarnDataService warnDataService;
@PostMapping("/stcd/eng/GetKendoListCust")
@Operation(summary = "电站水位、生态流量告警状态统计")
public ResponseResult getEngWarnCount(@RequestBody DataSourceRequest dataSourceRequest) {
return ResponseResult.successData(warnDataService.getEngWarnCount(dataSourceRequest));
}
@PostMapping("/ai/com/qgcDmRun/GetKendoListCust")
@Operation(summary = "全过程AI识别大坝运行")
public ResponseResult getAiDmRunCount(@RequestBody DataSourceRequest dataSourceRequest) {
return ResponseResult.successData(warnDataService.getAiDmRunCount(dataSourceRequest));
}
@PostMapping("/ai/com/qgcProtect/GetKendoListCust")
@Operation(summary = "全过程AI识别动植物保护")
public ResponseResult getAiProtectCount(@RequestBody DataSourceRequest dataSourceRequest) {
return ResponseResult.successData(warnDataService.getAiProtectCount(dataSourceRequest));
}
@PostMapping("/ai/com/GetKendoListCust")
@Operation(summary = "AI常规业务列表")
public ResponseResult getAiComKendoListCust(@RequestBody DataSourceRequest dataSourceRequest) {
return ResponseResult.successData(warnDataService.getAiComKendoListCust(dataSourceRequest));
}
@PostMapping("/ai/com/qgc/aiRstcd/GetKendoListCust")
@Operation(summary = "全过程AI识别有数据的电站下拉")
public ResponseResult getAiRstcdListKendoListCust(@RequestBody DataSourceRequest dataSourceRequest) {
return ResponseResult.successData(warnDataService.getAiRstcdListKendoListCust(dataSourceRequest));
}
@PostMapping("/ai/com/qgc/aiPfwRecord/GetKendoListCust")
@Operation(summary = "全过程AI识别监测日历表(漂浮物+清漂合并)")
public ResponseResult getAiPfwRecordKendoListCust(@RequestBody DataSourceRequest dataSourceRequest) {
return ResponseResult.successData(warnDataService.getAiPfwRecordKendoListCust(dataSourceRequest));
}
@PostMapping("/ai/com/qgc/aiRecord/GetKendoListCust")
@Operation(summary = "全过程AI识别监测日历表")
public ResponseResult getAiRecordKendoListCust(@RequestBody DataSourceRequest dataSourceRequest) {
return ResponseResult.successData(warnDataService.getAiRecordKendoListCust(dataSourceRequest));
}
@PostMapping("/alarmPoint/GetKendoListCust")
@Operation(summary = "电站告警描点列表")
public ResponseResult getAlarmPointKendoListCust(@RequestBody DataSourceRequest dataSourceRequest) {
return ResponseResult.successData(warnDataService.getAlarmPointKendoListCust(dataSourceRequest));
}
@PostMapping("/stcd/GetKendoListCust")
@Operation(summary = "监测设备告警情况列表")
public ResponseResult getWarnStcdKendoListCust(@RequestBody DataSourceRequest dataSourceRequest) {
return ResponseResult.successData(warnDataService.getWarnStcdKendoListCust(dataSourceRequest));
}
}

View File

@ -0,0 +1,71 @@
package com.yfd.platform.qgc_env.warn.entity.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.util.Date;
@Data
@Schema(description = "AI常规业务列表")
public class AiComListVo {
@Schema(description = "主键")
private String id;
@Schema(description = "类型编码")
private String type;
@Schema(description = "类型名称")
private String typeName;
@Schema(description = "AI测站编码")
private String stcd;
@Schema(description = "AI测站名称")
private String stnm;
@Schema(description = "所属电站编码")
private String rstcd;
@Schema(description = "所属电站名称")
private String ennm;
@Schema(description = "所属基地编码")
private String baseId;
@Schema(description = "所属基地流域编码")
private String hbrvcd;
@Schema(description = "所属流域编码")
private String rvcd;
@Schema(description = "数据时间")
private Date tm;
@Schema(description = "结束时间")
private Date endTm;
@Schema(description = "AI识别值")
private String aiVal;
@Schema(description = "附件ID")
private String fid;
@Schema(description = "是否填报")
private Integer isFsf;
@Schema(description = "是否大面积漂浮物")
private Integer isBigDebrisArea;
@Schema(description = "是否已清漂")
private Integer isClearDrift;
@Schema(description = "备注")
private String remark;
@Schema(description = "创建时间")
private Date recordTime;
@Schema(description = "更新时间")
private Date modifyTime;
}

View File

@ -0,0 +1,18 @@
package com.yfd.platform.qgc_env.warn.entity.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
@Data
@Schema(description = "全过程AI识别大坝运行")
public class AiDmRunVo {
@Schema(description = "漂浮物监测次数")
private Integer pfwCnt;
@Schema(description = "漂浮物清理次数")
private Integer pfwqlCnt;
@Schema(description = "叠梁门运行次数")
private Integer dlmCnt;
}

View File

@ -0,0 +1,30 @@
package com.yfd.platform.qgc_env.warn.entity.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
@Data
@Schema(description = "全过程AI识别动植物保护")
public class AiProtectVo {
@Schema(description = "运鱼船进出港次数")
private Integer fpYycCnt;
@Schema(description = "赶鱼栅运行次数")
private Integer fpGysCnt;
@Schema(description = "升鱼机运行次数")
private Integer fpSyjCnt;
@Schema(description = "AGV小车次数")
private Integer fpAgvCnt;
@Schema(description = "运鱼车运行次数")
private Integer fpYychCnt;
@Schema(description = "鱼道放流次数")
private Integer fpYdhCnt;
@Schema(description = "植物园养护次数")
private Integer vpYhCnt;
}

View File

@ -0,0 +1,44 @@
package com.yfd.platform.qgc_env.warn.entity.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.experimental.Accessors;
@Data
@Accessors(chain = true)
@Schema(description = "全过程AI识别监测日历记录")
public class AiRecordVo {
@Schema(description = "AI类型")
private String type;
@Schema(description = "日期")
private String dt;
@Schema(description = "是否大面积漂浮物")
private Integer isBigDebrisArea;
@Schema(description = "AI数据数")
private Integer aiCnt;
@Schema(description = "统计数")
private Integer cnt;
@Schema(description = "是否已清漂")
private Integer isClearDrift;
@Schema(description = "漂浮物状态")
private Integer status;
@Schema(description = "漂浮物状态名称")
private String statusName;
@Schema(description = "清漂状态")
private Integer qpStatus;
@Schema(description = "清漂状态名称")
private String qpStatusName;
@Schema(description = "附件ID")
private String fid;
}

View File

@ -0,0 +1,15 @@
package com.yfd.platform.qgc_env.warn.entity.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
@Data
@Schema(description = "全过程AI识别电站下拉")
public class AiRstcdVo {
@Schema(description = "电站编码")
private String stcd;
@Schema(description = "电站名称")
private String stnm;
}

View File

@ -0,0 +1,103 @@
package com.yfd.platform.qgc_env.warn.entity.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.experimental.Accessors;
import java.math.BigDecimal;
@Data
@Accessors(chain = true)
@Schema(description = "电站告警描点")
public class AlarmPointVo {
@Schema(description = "站点类型")
private String sttp;
@Schema(description = "站点编码")
private String stcd;
@Schema(description = "经度")
private BigDecimal lgtd;
@Schema(description = "纬度")
private BigDecimal lttd;
@Schema(description = "高程")
private BigDecimal dtmel;
@Schema(description = "描点状态")
private String anchoPointState;
@Schema(description = "锚点类型")
private String sttpMap;
@Schema(description = "弹框站点名称")
private String titleName;
@Schema(description = "地图避让")
private Integer distance;
@Schema(description = "流域编码")
private String rvcd;
@Schema(description = "行政编码")
private String addvcd;
@Schema(description = "基地编码")
private String baseId;
@Schema(description = "关联电站编码")
private String rstcds;
@Schema(description = "设施类型")
private String sttpCode;
@Schema(description = "电站名称")
private String ennm;
@Schema(description = "流域名称")
private String rvnm;
@Schema(description = "电站装机类型")
private Integer endInstalledType;
@Schema(description = "生态流量告警数")
private Integer stqCount;
@Schema(description = "水质告警数")
private Integer wqCount;
@Schema(description = "水位告警数")
private Integer zCount;
@Schema(description = "水温告警数")
private Integer wtCount;
@Schema(description = "年份")
private String yyyy;
@Schema(description = "告警区间范围")
private String range;
@Schema(description = "装机容量")
private BigDecimal ttpwr;
@Schema(description = "基地名称")
private String baseName;
@Schema(description = "电站编码")
private String rstcd;
@Schema(description = "流域沿程")
private Integer rvcdStepSort;
@Schema(description = "电站沿程")
private Integer rstcdStepSort;
@Schema(description = "站点沿程")
private Integer siteStepSort;
@Schema(description = "电站图片")
private String logo;
}

View File

@ -0,0 +1,28 @@
package com.yfd.platform.qgc_env.warn.entity.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.io.Serializable;
@Data
@Schema(description = "电站告警状态统计")
public class EngWarnCountVo implements Serializable {
private static final long serialVersionUID = 1L;
@Schema(description = "告警状态")
private Integer warnState;
@Schema(description = "告警状态名称")
private String warnStateName;
@Schema(description = "数量")
private Integer num;
@Schema(description = "告警类型")
private String warnType;
@Schema(description = "告警类型名称")
private String warnTypeName;
}

View File

@ -0,0 +1,59 @@
package com.yfd.platform.qgc_env.warn.entity.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.util.Date;
@Data
@Schema(description = "监测设备告警情况")
public class StcdWarnStateVo {
@Schema(description = "测站编码")
private String stcd;
@Schema(description = "测站名称")
private String stnm;
@Schema(description = "电站编码")
private String rstcd;
@Schema(description = "电站名称")
private String ennm;
@Schema(description = "监测方式")
private Integer mway;
@Schema(description = "测站类型编码")
private String sttpCode;
@Schema(description = "测站类型名称")
private String sttpName;
@Schema(description = "基地编码")
private String baseId;
@Schema(description = "基地名称")
private String baseName;
@Schema(description = "流域编码")
private String rvcd;
@Schema(description = "告警状态")
private Integer warnState;
@Schema(description = "告警状态名称")
private String warnstateName;
@Schema(description = "告警时间")
private Date warnTm;
@Schema(description = "基础排序")
private Integer baseStepSort;
@Schema(description = "电站排序")
private Integer rstcdStepSort;
@Schema(description = "数据接入类型")
private Integer dtinType;
}

View File

@ -0,0 +1,35 @@
package com.yfd.platform.qgc_env.warn.service;
import com.yfd.platform.common.DataSourceRequest;
import com.yfd.platform.common.DataSourceResult;
import com.yfd.platform.qgc_env.warn.entity.vo.AlarmPointVo;
import com.yfd.platform.qgc_env.warn.entity.vo.AiRecordVo;
import com.yfd.platform.qgc_env.warn.entity.vo.AiProtectVo;
import com.yfd.platform.qgc_env.warn.entity.vo.AiDmRunVo;
import com.yfd.platform.qgc_env.warn.entity.vo.AiComListVo;
import com.yfd.platform.qgc_env.warn.entity.vo.AiRstcdVo;
import com.yfd.platform.qgc_env.warn.entity.vo.EngWarnCountVo;
import com.yfd.platform.qgc_env.warn.entity.vo.StcdWarnStateVo;
import java.util.List;
public interface WarnDataService {
DataSourceResult<EngWarnCountVo> getEngWarnCount(DataSourceRequest dataSourceRequest);
AiDmRunVo getAiDmRunCount(DataSourceRequest dataSourceRequest);
AiProtectVo getAiProtectCount(DataSourceRequest dataSourceRequest);
DataSourceResult<AiComListVo> getAiComKendoListCust(DataSourceRequest dataSourceRequest);
DataSourceResult<AiRstcdVo> getAiRstcdListKendoListCust(DataSourceRequest dataSourceRequest);
List<AiRecordVo> getAiPfwRecordKendoListCust(DataSourceRequest dataSourceRequest);
List<AiRecordVo> getAiRecordKendoListCust(DataSourceRequest dataSourceRequest);
DataSourceResult<AlarmPointVo> getAlarmPointKendoListCust(DataSourceRequest dataSourceRequest);
DataSourceResult<StcdWarnStateVo> getWarnStcdKendoListCust(DataSourceRequest dataSourceRequest);
}

View File

@ -3,15 +3,7 @@ package com.yfd.platform.qgc_env.wq.service.impl;
import cn.hutool.core.collection.CollUtil; import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.StrUtil; import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.yfd.platform.common.CommonConstant; import com.yfd.platform.common.*;
import com.yfd.platform.common.DataSourceLoadOptionsBase;
import com.yfd.platform.common.DataSourceRequest;
import com.yfd.platform.common.DataSourceResult;
import com.yfd.platform.common.Group;
import com.yfd.platform.common.GroupHelper;
import com.yfd.platform.common.GroupingInfo;
import com.yfd.platform.common.MicroservicDynamicSQLMapper;
import com.yfd.platform.common.PageInfo;
import com.yfd.platform.common.exception.BizException; import com.yfd.platform.common.exception.BizException;
import com.yfd.platform.qgc_base.entity.vo.BatchDeleteAo; import com.yfd.platform.qgc_base.entity.vo.BatchDeleteAo;
import com.yfd.platform.qgc_base.entity.vo.DataParam; import com.yfd.platform.qgc_base.entity.vo.DataParam;
@ -694,6 +686,7 @@ public class EnvWqDataServiceImpl implements EnvWqDataService {
baseSql.append("SELECT ") baseSql.append("SELECT ")
.append("NVL(t.IS_DELETED, 0) AS isDeleted, ") .append("NVL(t.IS_DELETED, 0) AS isDeleted, ")
.append("t.STTP AS sttpCode, ") .append("t.STTP AS sttpCode, ")
.append("t.WARN_STATE AS warnState, ")
.append("t.MWAY AS mway, ") .append("t.MWAY AS mway, ")
.append("t.DTIN_TYPE AS dtinType, ") .append("t.DTIN_TYPE AS dtinType, ")
.append("t.STCD AS stcd, ") .append("t.STCD AS stcd, ")
@ -731,6 +724,8 @@ public class EnvWqDataServiceImpl implements EnvWqDataService {
DataSourceResult result = new DataSourceResult(); DataSourceResult result = new DataSourceResult();
if (Boolean.TRUE.equals(dataSourceRequest.getGroupResultFlat())) { if (Boolean.TRUE.equals(dataSourceRequest.getGroupResultFlat())) {
result.setData(new GroupHelper().faltGroup(rows, Arrays.asList(groupInfos))); result.setData(new GroupHelper().faltGroup(rows, Arrays.asList(groupInfos)));
} else if (groupInfos != null && groupInfos.length == 1 && groupInfos[0] != null && StrUtil.isNotBlank(groupInfos[0].getSelector())) {
result.setData(toMsstbprptLegacyGroups(rows, groupInfos[0].getSelector()));
} else { } else {
result.setData(toLegacyGroupResult(new GroupHelper().group(rows, Arrays.asList(groupInfos)), 0)); result.setData(toLegacyGroupResult(new GroupHelper().group(rows, Arrays.asList(groupInfos)), 0));
} }
@ -3181,14 +3176,17 @@ public class EnvWqDataServiceImpl implements EnvWqDataService {
return result; return result;
} }
String upperField = groupField == null ? "DTINTYPE" : groupField.toUpperCase(); String upperField = groupField == null ? "DTINTYPE" : groupField.toUpperCase();
String countField = "COUNT_" + upperField;
String aggregateKey = "count_" + groupField;
for (Map<String, Object> row : rows) { for (Map<String, Object> row : rows) {
Object key = row.get(upperField); Object key = row.get(upperField);
if (key == null) { if (key == null) {
key = row.get(groupField); key = row.get(groupField);
} }
String countField = row.containsKey("COUNT_STCD") ? "COUNT_STCD" : "COUNT_" + upperField;
String aggregateKey = "COUNT_STCD".equals(countField) ? "count_stcd" : "count_" + groupField;
Object countValue = row.get(countField); Object countValue = row.get(countField);
if (countValue == null) {
countValue = row.get("count_stcd");
}
if (countValue == null) { if (countValue == null) {
countValue = row.get("count_" + upperField); countValue = row.get("count_" + upperField);
} }
@ -3208,7 +3206,7 @@ public class EnvWqDataServiceImpl implements EnvWqDataService {
detail.put(upperField, key); detail.put(upperField, key);
detail.put(countField, count); detail.put(countField, count);
item.put("items", List.of(detail)); item.put("items", List.of(detail));
item.put("count", count); item.put("count", 0);
item.put("summary", new Object[0]); item.put("summary", new Object[0]);
Map<String, Object> aggregates = new LinkedHashMap<>(); Map<String, Object> aggregates = new LinkedHashMap<>();
@ -3224,27 +3222,52 @@ public class EnvWqDataServiceImpl implements EnvWqDataService {
return baseSql; return baseSql;
} }
List<String> groupFields = new ArrayList<>(); List<String> groupFields = new ArrayList<>();
List<String> selectItems = new ArrayList<>();
List<String> orderByItems = new ArrayList<>(); List<String> orderByItems = new ArrayList<>();
for (GroupingInfo item : groupInfos) { for (GroupingInfo item : groupInfos) {
if (item == null || StrUtil.isBlank(item.getSelector())) { if (item == null || StrUtil.isBlank(item.getSelector())) {
continue; continue;
} }
groupFields.add(item.getSelector()); String selector = item.getSelector();
groupFields.add(selector);
selectItems.add(selector + " AS " + selector.toUpperCase());
String dir = Boolean.TRUE.equals(item.getDesc()) ? "DESC" : "ASC"; String dir = Boolean.TRUE.equals(item.getDesc()) ? "DESC" : "ASC";
orderByItems.add(item.getSelector() + " " + dir); orderByItems.add(selector + " " + dir);
boolean hasCountStcd = false;
if (CollUtil.isNotEmpty(item.getSummaryInfos())) {
for (SummaryInfo summaryInfo : item.getSummaryInfos()) {
if (summaryInfo == null || StrUtil.isBlank(summaryInfo.getSelector()) || StrUtil.isBlank(summaryInfo.getSummaryType())) {
continue;
}
String summaryType = summaryInfo.getSummaryType().toUpperCase();
String summarySelector = summaryInfo.getSelector().toUpperCase();
if ("count".equalsIgnoreCase(summaryInfo.getSummaryType()) && "stcd".equalsIgnoreCase(summaryInfo.getSelector())) {
hasCountStcd = true;
}
switch (summaryInfo.getSummaryType().toLowerCase()) {
case "count" -> selectItems.add("COUNT(" + summaryInfo.getSelector() + ") AS " + summaryType + "_" + summarySelector);
case "sum" -> selectItems.add("SUM(" + summaryInfo.getSelector() + ") AS " + summaryType + "_" + summarySelector);
case "avg", "average" -> selectItems.add("AVG(" + summaryInfo.getSelector() + ") AS AVG_" + summarySelector);
case "min" -> selectItems.add("MIN(" + summaryInfo.getSelector() + ") AS " + summaryType + "_" + summarySelector);
case "max" -> selectItems.add("MAX(" + summaryInfo.getSelector() + ") AS " + summaryType + "_" + summarySelector);
default -> {
}
}
}
}
if (!hasCountStcd) {
selectItems.add("COUNT(*) AS COUNT_STCD");
}
} }
if (groupFields.isEmpty()) { if (groupFields.isEmpty()) {
return baseSql; return baseSql;
} }
StringBuilder sql = new StringBuilder("SELECT "); StringBuilder sql = new StringBuilder("SELECT ");
sql.append(String.join(", ", groupFields)); sql.append(String.join(", ", selectItems));
for (String groupField : groupFields) { sql.append(" FROM (").append(baseSql).append(") T ")
sql.append(", COUNT(*) AS count_").append(groupField).append(" "); .append(" GROUP BY ").append(String.join(", ", groupFields)).append(" ");
}
sql.append("FROM (").append(baseSql).append(") T ")
.append("GROUP BY ").append(String.join(", ", groupFields)).append(" ");
if (!orderByItems.isEmpty()) { if (!orderByItems.isEmpty()) {
sql.append("ORDER BY ").append(String.join(", ", orderByItems)); sql.append(" ORDER BY ").append(String.join(", ", orderByItems));
} }
return sql.toString(); return sql.toString();
} }

View File

@ -66,11 +66,11 @@ public class ZqMonitorServiceImpl implements ZqMonitorService {
.append("LEFT JOIN SD_HYDROBASE hb ON hb.BASEID = eng.BASE_ID AND NVL(hb.IS_DELETED, 0) = 0 ") .append("LEFT JOIN SD_HYDROBASE hb ON hb.BASEID = eng.BASE_ID AND NVL(hb.IS_DELETED, 0) = 0 ")
.append("LEFT JOIN SD_HBRV_DIC hbrv ON hbrv.HBRVCD = eng.HBRVCD ") .append("LEFT JOIN SD_HBRV_DIC hbrv ON hbrv.HBRVCD = eng.HBRVCD ")
.append(" AND hbrv.BASEID = eng.BASE_ID ") .append(" AND hbrv.BASEID = eng.BASE_ID ")
.append(" AND NVL(hbrv.IS_DELETED, 0) = 0 ") .append(" AND hbrv.IS_DELETED = 0 ")
.append(" AND NVL(hbrv.ENABLED, 1) = 1 ") .append(" AND hbrv.ENABLED = 1 ")
.append("LEFT JOIN SD_RVCD_DIC rv ON rv.RVCD = eng.RVCD ") .append("LEFT JOIN SD_RVCD_DIC rv ON rv.RVCD = eng.RVCD ")
.append("LEFT JOIN SD_ADDVCD_DIC addv ON addv.ADDVCD = eng.ADDVCD ") .append("LEFT JOIN SD_ADDVCD_DIC addv ON addv.ADDVCD = eng.ADDVCD ")
.append("WHERE NVL(t.IS_DELETED, 0) = 0 "); .append("WHERE t.IS_DELETED = 0 ");
if (onlyZq) { if (onlyZq) {
sql.append("AND t.STTP = 'ZQ' "); sql.append("AND t.STTP = 'ZQ' ");
} }
@ -1844,7 +1844,7 @@ public class ZqMonitorServiceImpl implements ZqMonitorService {
} }
return switch (field) { return switch (field) {
case "isDeleted" -> "NVL(t.IS_DELETED, 0)"; case "isDeleted" -> "NVL(t.IS_DELETED, 0)";
case "sttpFullPath" -> null; case "sttpFullPath" -> "t.STTP";
case "sttpCode" -> "t.STTP"; case "sttpCode" -> "t.STTP";
case "mway" -> "t.MWAY"; case "mway" -> "t.MWAY";
case "dtinType" -> "t.DTIN_TYPE"; case "dtinType" -> "t.DTIN_TYPE";

View File

@ -212,5 +212,30 @@
</if> </if>
ORDER BY t.ORDER_PATH ASC, t.RVCD ASC ORDER BY t.ORDER_PATH ASC, t.RVCD ASC
</select> </select>
<select id="selectRvcdDropdown" resultType="com.yfd.platform.qgc_base.domain.SdRvcdDic">
SELECT
RVCD,
RVNM,
PRVCD,
GRD,
PATH,
ORDER_INDEX,
SHORTNAME,
SHEPRANGE,
BASEID
FROM SD_RVCD_DIC
WHERE NVL(ENABLED, 1) = 1
AND NVL(IS_DELETED, 0) = 0
AND (PRVCD IS NULL OR PRVCD = '' OR PRVCD = '0')
<if test="baseId != null and baseId != ''">
AND BASEID = #{baseId}
</if>
<if test="rvnm != null and rvnm != ''">
AND RVNM LIKE '%' || #{rvnm} || '%'
</if>
ORDER BY ORDER_INDEX ASC, RVCD ASC
</select>
</mapper> </mapper>