Compare commits

..

No commits in common. "main" and "wxk-main" have entirely different histories.

50 changed files with 274 additions and 4193 deletions

View File

@ -92,10 +92,7 @@ public class GroupHelper {
for(Map<String, Object> item : data) {
Object groupKey = this.getKey(item, groupInfo);
if (groupKey == null) {
continue;
}
Object groupIndexKey = groupKey;
Object groupIndexKey = groupKey != null ? groupKey : null;
Object tempCount = item.get("count_" + groupInfo.getSelector());
if (tempCount == null) {
tempCount = item.get("COUNT_" + groupInfo.getSelector().toUpperCase());

View File

@ -31,8 +31,7 @@ public class MyMetaObjectHandler implements MetaObjectHandler {
this.strictInsertFill(metaObject, "updatedAt", Date.class, now);
// 更新时间
this.strictInsertFill(metaObject, "modifyTime", Date.class, now);
// 更新时间
this.strictInsertFill(metaObject, "recordTime", Date.class, now);
try {
String userId = SecurityUtils.getUserId();
// 创建人

View File

@ -28,9 +28,7 @@ public class MybitsPlusConfig {
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
// 添加分页拦截器指定数据库类型为 Oracle
// interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.ORACLE));
// 添加分页拦截器指定数据库类型为 Oracle
interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.DM));
interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.ORACLE));
return interceptor;
}

View File

@ -65,7 +65,6 @@ public class SecurityConfig {
.requestMatchers("/eq/**").permitAll()
.requestMatchers("/env/**").permitAll()
.requestMatchers("/warn/**").permitAll()
.requestMatchers("/threedroamb/**").permitAll()
.requestMatchers("/overview/**").permitAll()
.requestMatchers("/wt/**").permitAll()
.requestMatchers("/fb/**").permitAll()

View File

@ -249,15 +249,6 @@ public class SwaggerConfig {
.build();
}
@Bean
public GroupedOpenApi groupThreedRoamApi() {
return GroupedOpenApi.builder()
.group("5.3 三维漫游")
.packagesToScan("com.yfd.platform.qgc_sys.threedRoam.controller")
.build();
}
@Bean
public GroupedOpenApi groupLygkApi() {
return GroupedOpenApi.builder()

View File

@ -13,8 +13,6 @@ public class EngRsvrcscdBVo {
private String rvcdName;
private String bldsttCcode;
private String stcd;
private String ennm;

View File

@ -170,7 +170,7 @@ public class SdEngInfoBHServiceImpl extends ServiceImpl<SdEngInfoBHMapper, SdEng
wrapper.eq(StringUtils.hasText(baseId), SdEngInfoBH::getBaseId, baseId)
.eq(StringUtils.hasText(hbrvcd), SdEngInfoBH::getHbrvcd, hbrvcd)
.eq(StrUtil.isNotBlank(reachcd), SdEngInfoBH::getReachcd, reachcd)
.eq(StrUtil.isNotBlank(rvcd), SdEngInfoBH::getReachcd, rvcd)
.eq(StrUtil.isNotBlank(rvcd), SdEngInfoBH::getRvcd, rvcd)
.in(rvcds != null && !rvcds.isEmpty(), SdEngInfoBH::getReachcd, rvcds)
.in(hbrvcds != null && !hbrvcds.isEmpty(), SdEngInfoBH::getHbrvcd, hbrvcds)
.like(StringUtils.hasText(ennm), SdEngInfoBH::getEnnm, ennm)
@ -1237,9 +1237,9 @@ public class SdEngInfoBHServiceImpl extends ServiceImpl<SdEngInfoBHMapper, SdEng
"eng.AVQ10 AS avq10, " +
"eng.AVQ11 AS avq11, " +
"eng.AVQ12 AS avq12, " +
"rbh.OBMXQ AS obmxq, " +
"rbh.OBMNQ AS obmnq, " +
"rbh.HMXQ AS hmxq, " +
"CAST(NULL AS NUMBER) AS obmxq, " +
"CAST(NULL AS NUMBER) AS obmnq, " +
"CAST(NULL AS NUMBER) AS hmxq, " +
"eng.DSNFQFRQ AS dsnfqfrq, " +
"eng.DSRCIN AS dsrcin, " +
"eng.CKFQFQR AS ckfqfqr, " +
@ -1249,21 +1249,21 @@ public class SdEngInfoBHServiceImpl extends ServiceImpl<SdEngInfoBHMapper, SdEng
"eng.CKW3 AS ckw3, " +
"eng.AVSD AS avsd, " +
"eng.AVS AS avs, " +
"rbh.OBMXS AS obmxs, " +
"rbh.CKFLZ AS ckflz, " +
"rbh.DSFLZ AS dsflz, " +
"rbh.NORMZ AS normz, " +
"rbh.UZFC AS uzfc, " +
"CAST(NULL AS NUMBER) AS obmxs, " +
"CAST(NULL AS NUMBER) AS ckflz, " +
"CAST(NULL AS NUMBER) AS dsflz, " +
"CAST(NULL AS NUMBER) AS normz, " +
"CAST(NULL AS NUMBER) AS uzfc, " +
"eng.FSLTDZ AS fsltdz, " +
"eng.YDOWNZ AS ydownz, " +
"rbh.DDZ AS ddz, " +
"CAST(NULL AS NUMBER) AS ddz, " +
"eng.NRZAR AS nrzar, " +
"eng.BCKLEN AS bcklen, " +
"rbh.TTCP AS ttcp, " +
"rbh.NMZCP AS nmzcp, " +
"b.VAL AS fldcpStr, " +
"rbh.ACTCP AS actcp, " +
"rbh.DDCP AS ddcp, " +
"CAST(NULL AS NUMBER) AS nmzcp, " +
"CAST(NULL AS VARCHAR2(255)) AS fldcpStr, " +
"CAST(NULL AS NUMBER) AS actcp, " +
"CAST(NULL AS NUMBER) AS ddcp, " +
"eng.CPSC AS cpsc, " +
"eng.PRSC AS prsc, " +
"eng.RGCP AS rgcp, " +
@ -1279,26 +1279,26 @@ public class SdEngInfoBHServiceImpl extends ServiceImpl<SdEngInfoBHMapper, SdEng
" WHEN '9' THEN '其他' " +
" ELSE NULL END AS rgcpName, " +
"eng.DSMXQ AS dsflzmxq, " +
"rbh.DSFLZXYZ AS dsflzxyz, " +
"CAST(NULL AS NUMBER) AS dsflzxyz, " +
"eng.CHMXQ AS ckflzmxq, " +
"rbh.CKFLZXYZ AS ckflzxyz, " +
"rbh.KSQADJQ AS ksqadjq, " +
"rbh.KSQXYZ AS ksqxyz, " +
"CAST(NULL AS NUMBER) AS ckflzxyz, " +
"CAST(NULL AS NUMBER) AS ksqadjq, " +
"CAST(NULL AS NUMBER) AS ksqxyz, " +
"eng.GEMAXRQ AS gemaxrq, " +
"rbh.MXGEQXYZ AS mxgeqxyz, " +
"CAST(NULL AS NUMBER) AS mxgeqxyz, " +
"eng.YRGEB AS ttpwr, " +
"pwr.GNCNT AS gncnt, " +
"CAST(NULL AS NUMBER) AS gncnt, " +
"eng.GNTP AS gntp, " +
"pwr.GRNTPWR AS grntpwr, " +
"CAST(NULL AS NUMBER) AS grntpwr, " +
"pwr.YRGE AS yrge, " +
"pwr.USHR AS ushr, " +
"pwr.K AS k, " +
"CAST(NULL AS NUMBER) AS ushr, " +
"CAST(NULL AS NUMBER) AS k, " +
"eng.DMTP AS dmtp, " +
"eng.DMCREL AS dmcrel, " +
"eng.MXDMHG AS mxdmhg, " +
"eng.DMLEN AS dmlen, " +
"pwr.SGYGE AS sgyge, " +
"UNYGE AS unyge, " +
"CAST(NULL AS NUMBER) AS sgyge, " +
"CAST(NULL AS NUMBER) AS unyge, " +
"eng.GAP AS gap, " +
"eng.DVTP AS dvtp, " +
"CASE eng.DVTP " +
@ -1327,33 +1327,6 @@ public class SdEngInfoBHServiceImpl extends ServiceImpl<SdEngInfoBHMapper, SdEng
"LEFT JOIN SD_HYCD_DIC topHy ON topHy.HYCD = eng.TOP_HYCD AND NVL(topHy.IS_DELETED, 0) = 0 AND NVL(topHy.ENABLED, 1) = 1 " +
"LEFT JOIN SD_PWR_B_H pwr ON pwr.STCD = eng.STCD AND NVL(pwr.IS_DELETED, 0) = 0 " +
"LEFT JOIN SD_RSVRFCCH_B_H rbh ON rbh.STCD = eng.STCD " +
"LEFT JOIN ( SELECT STCD\n" +
" , MAX(CASE WHEN RN = 1 THEN TM END) AS TM\n" +
" , MAX(CASE WHEN RN = 1 THEN VAL END) AS VAL\n" +
" , MAX(VLSR) AS VLSR\n" +
" , MAX(VLSR_TM) AS VLSR_TM\n" +
" , LISTAGG('起始时间' || TO_CHAR(TM, 'YYYY-MM-DD') || '' || VAL || '' ||\n" +
" CASE WHEN VLSR IS NOT NULL THEN '来源' || VLSR ELSE '' END ||\n" +
" CASE WHEN VLSR_TM IS NOT NULL THEN ',来源时间' || TO_CHAR(VLSR_TM, 'YYYY-MM-DD') ELSE '' END,\n" +
" CHR(10)) WITHIN GROUP (ORDER BY TM DESC) AS ALL_VAL\n" +
" FROM ( SELECT STCD\n" +
" , TM\n" +
" , MAX(VLSR) AS VLSR\n" +
" , MAX(VLSR_TM) AS VLSR_TM\n" +
" , LISTAGG(\n" +
" SUBSTR(BGMD, 0, 2) || '月' || SUBSTR(BGMD, 3, 2) || '日' || '~' || SUBSTR(EDMD, 0, 2) || '月' ||\n" +
" SUBSTR(EDMD, 3, 2) || '日' || '限值为' ||\n" +
" (CASE WHEN FLDCPMN IS NOT NULL THEN (DECODE(SUBSTR(FLDCPMN, 1, 1), '.', '0' || FLDCPMN, FLDCPMN) ||\n" +
" '~' || DECODE(SUBSTR(FLDCP, 1, 1), '.', '0' || FLDCP, FLDCP))\n" +
" ELSE TO_CHAR(FLDCP) END), '') WITHIN GROUP (ORDER BY BGMD) AS VAL\n" +
" , ROW_NUMBER() OVER (PARTITION BY STCD ORDER BY TM DESC) RN\n" +
" FROM SD_RSVRFSR_B\n" +
" WHERE BGMD IS NOT NULL\n" +
" AND EDMD IS NOT NULL\n" +
" AND FLDCPMN IS NOT NULL\n" +
" AND FLDCPMN > 0\n" +
" GROUP BY STCD, TM ) temp\n" +
" GROUP BY STCD) b ON b.STCD = eng.STCD " +
"LEFT JOIN MS_ALONG_B along ON along.BASEID = eng.BASE_ID AND along.CODE = 'common' AND NVL(along.IS_DELETED, 0) = 0 " +
"LEFT JOIN ( " +
" SELECT det.SORT,cfg.BASEID, cfg.RVCD, det.STCD " +
@ -3519,11 +3492,10 @@ public class SdEngInfoBHServiceImpl extends ServiceImpl<SdEngInfoBHMapper, SdEng
sql.append("SELECT ")
.append("r.ID AS id, ")
.append("eng.BASE_ID AS rvcd, ")
.append("eng.BASE_NAME AS rvcdName, ")
.append("r.RVCD AS rvcd, ")
.append("rv.RVNM AS rvcdName, ")
.append("r.STCD AS stcd, ")
.append("eng.BLDSTT_CODE AS bldsttCcode, ")
.append("eng.ENNM AS ennm, ")
.append("r.ENNM AS ennm, ")
.append("r.SRCDIS AS srcdis, ")
.append("r.DMHG AS dmhg, ")
.append("r.NORMZ AS normz, ")
@ -3562,13 +3534,13 @@ public class SdEngInfoBHServiceImpl extends ServiceImpl<SdEngInfoBHMapper, SdEng
Map<String, Object> paramMap = new HashMap<>();
StringBuilder sql = new StringBuilder();
sql.append("SELECT DISTINCT ")
.append("dic.BASEID AS wbsCode, ")
.append("dic.BASENAME AS wbsName, ")
.append("dic.HBRVCD AS wbsCode, ")
.append("dic.HBRVNM AS wbsName, ")
.append("dic.BASEID AS objId, ")
.append("NVL(dic.BASEID, 'ZZZZZZZZ') AS baseOrder, ")
.append("NVL(dic.ORDER_INDEX, 999999) AS orderIndex ")
.append("FROM SD_HYDROBASE dic ")
.append("INNER JOIN SD_RSVRCSCD_B r ON r.BASE_ID = dic.BASEID AND NVL(r.IS_DELETED, 0) = 0 ")
.append("FROM SD_HBRV_DIC dic ")
.append("INNER JOIN SD_RSVRCSCD_B r ON r.RVCD = dic.HBRVCD AND NVL(r.IS_DELETED, 0) = 0 ")
.append("WHERE NVL(dic.IS_DELETED, 0) = 0 ")
.append("AND NVL(dic.ENABLED, 1) = 1 ");
@ -3713,8 +3685,7 @@ public class SdEngInfoBHServiceImpl extends ServiceImpl<SdEngInfoBHMapper, SdEng
}
return switch (field) {
case "id" -> "r.ID";
case "rvcd" -> "eng.BASE_ID";
case "baseId" -> "eng.BASE_ID";
case "rvcd" -> "r.RVCD";
case "rvcdName" -> "rv.RVNM";
case "stcd" -> "r.STCD";
case "ennm" -> "r.ENNM";

View File

@ -89,17 +89,10 @@ public class FishDraftDataController {
return t;
});
// @PostMapping("/page")
// @Operation(summary = "分页查询过鱼数据(关联电站和设施)")
// public ResponseResult queryPageList(@RequestBody DataSourceRequest dataSourceRequest) {
// Page<FishDraftDataVO> result = fishDraftDataService.queryPageList(dataSourceRequest);
// return ResponseResult.successData(result);
// }
@PostMapping("/page")
@Operation(summary = "分页查询过鱼数据(关联电站和设施APPROVED状态时根据当前用户电站权限过滤")
public ResponseResult queryPageListWithScope(@RequestBody DataSourceRequest dataSourceRequest) {
Page<FishDraftDataVO> result = fishDraftDataService.queryPageListWithScope(dataSourceRequest);
@Operation(summary = "分页查询过鱼数据(关联电站和设施)")
public ResponseResult queryPageList(@RequestBody DataSourceRequest dataSourceRequest) {
Page<FishDraftDataVO> result = fishDraftDataService.queryPageList(dataSourceRequest);
return ResponseResult.successData(result);
}

View File

@ -8,7 +8,6 @@ import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import java.util.List;
import java.util.Set;
/**
* <p>
@ -34,24 +33,6 @@ public interface FishDraftDataMapper extends BaseMapper<FishDraftData> {
@Param("hbrvcd") String hbrvcd,
@Param("approvalId") String approvalId);
/**
* 关联查询过鱼数据分页含电站权限过滤
*/
Page<FishDraftDataVO> selectJoinPageWithStationScope(Page<FishDraftDataVO> page,
@Param("stcd") String stcd,
@Param("rstcd") String rstcd,
@Param("baseId") String baseId,
@Param("rvcd") String rvcd,
@Param("direction") String direction,
@Param("status") String status,
@Param("ftp") String ftp,
@Param("startTime") String startTime,
@Param("endTime") String endTime,
@Param("userId") String userId,
@Param("hbrvcd") String hbrvcd,
@Param("approvalId") String approvalId,
@Param("stationCodes") Set<String> stationCodes);
/**
* 关联查询过鱼数据不分页
*/

View File

@ -20,12 +20,6 @@ public interface IFishDraftDataService extends IService<FishDraftData> {
*/
Page<FishDraftDataVO> queryPageList(DataSourceRequest dataSourceRequest);
/**
* 分页查询草稿数据关联电站和设施表含电站权限过滤
* status = APPROVED 根据当前用户有权限的电站编码过滤数据
*/
Page<FishDraftDataVO> queryPageListWithScope(DataSourceRequest dataSourceRequest);
/**
* 查询草稿数据列表关联电站和设施表不分页
*/

View File

@ -8,7 +8,6 @@ import com.yfd.platform.common.DataSourceLoadOptionsBase;
import com.yfd.platform.common.DataSourceRequest;
import com.yfd.platform.qgc_base.domain.SdRvcdDic;
import com.yfd.platform.qgc_base.mapper.SdRvcdDicMapper;
import com.yfd.platform.qgc_base.service.ICurrentUserDataScopeService;
import com.yfd.platform.qgc_data.domain.ApprovalMain;
import com.yfd.platform.qgc_data.domain.FishDraftData;
import com.yfd.platform.qgc_data.domain.SysUserDataScope;
@ -90,9 +89,6 @@ public class FishDraftDataServiceImpl extends ServiceImpl<FishDraftDataMapper, F
@Resource
private ISdFpssRService sdFpssRService;
@Resource
private ICurrentUserDataScopeService currentUserDataScopeService;
@Resource
private PlatformTransactionManager transactionManager;
@ -112,68 +108,19 @@ public class FishDraftDataServiceImpl extends ServiceImpl<FishDraftDataMapper, F
String direction = QgcQueryWrapperUtil.getFilterFieldValue(loadOptions, "direction");
String status = QgcQueryWrapperUtil.getFilterFieldValue(loadOptions, "status");
String STRDT = QgcQueryWrapperUtil.getFilterFieldValue(loadOptions, "strdt");
String startTime = null;
String endTime = null;
String startTime=null;
String endTime=null;
// String userId = (SecurityUtils.hasPermission("sjtb:edit-review") || "admin".equals(SecurityUtils.getCurrentUsername())) ?null:SecurityUtils.getUserId();
String userId = SecurityUtils.getUserId();
if (StrUtil.isNotBlank(approvalId)) {
userId = null;
if(StrUtil.isNotBlank(approvalId)){
userId=null;
}
// 如果 startTime endTime 为空尝试从 TM 字段解析
if (StrUtil.isNotBlank(STRDT) && STRDT.split(",").length == 2) {
startTime = STRDT.split(",")[0];
endTime = STRDT.split(",")[1];
if (StrUtil.isNotBlank(STRDT)&& STRDT.split( ",").length==2) {
startTime=STRDT.split(",")[0];
endTime=STRDT.split(",")[1];
}
Page<FishDraftDataVO> resultPage = fishDraftDataMapper.selectJoinPage(page, stcd, rstcd, baseId, rvcd, direction, status, ftp, startTime, endTime, userId, hbrvcd, approvalId);
fillUserNames(resultPage.getRecords());
return resultPage;
}
@Override
public Page<FishDraftDataVO> queryPageListWithScope(DataSourceRequest dataSourceRequest) {
Page<FishDraftDataVO> page = KendoUtil.getPage(dataSourceRequest);
page.setSize(dataSourceRequest.getTake());
page.setCurrent(dataSourceRequest.getSkip());
DataSourceLoadOptionsBase loadOptions = dataSourceRequest.toDevRequest();
String stcd = QgcQueryWrapperUtil.getFilterFieldValue(loadOptions, "stcd");
String approvalId = QgcQueryWrapperUtil.getFilterFieldValue(loadOptions, "approvalId");
String rstcd = QgcQueryWrapperUtil.getFilterFieldValue(loadOptions, "rstcd");
String hbrvcd = QgcQueryWrapperUtil.getFilterFieldValue(loadOptions, "hbrvcd");
String rvcd = QgcQueryWrapperUtil.getFilterFieldValue(loadOptions, "rvcd");
String baseId = QgcQueryWrapperUtil.getFilterFieldValue(loadOptions, "baseId");
String ftp = QgcQueryWrapperUtil.getFilterFieldValue(loadOptions, "ftp");
String direction = QgcQueryWrapperUtil.getFilterFieldValue(loadOptions, "direction");
String status = QgcQueryWrapperUtil.getFilterFieldValue(loadOptions, "status");
String STRDT = QgcQueryWrapperUtil.getFilterFieldValue(loadOptions, "strdt");
String startTime = null;
String endTime = null;
String userId = SecurityUtils.getUserId();
if (StrUtil.isNotBlank(approvalId)) {
userId = null;
}
if (StrUtil.isNotBlank(STRDT) && STRDT.split(",").length == 2) {
startTime = STRDT.split(",")[0];
endTime = STRDT.split(",")[1];
}
// status = APPROVED 加上当前用户的电站权限过滤
Set<String> stationCodes = null;
if ("APPROVED".equals(status)) {
userId=null;
if (!currentUserDataScopeService.getCurrentUserDataScope().isManagedAdmin()) {
stationCodes = currentUserDataScopeService.getCurrentUserDataScope().getStationCodes();
// 如果用户没有电站权限且不是管理员返回空结果
if (stationCodes == null || stationCodes.isEmpty()) {
page.setRecords(Collections.emptyList());
page.setTotal(0);
return page;
}
}
}
Page<FishDraftDataVO> resultPage = fishDraftDataMapper.selectJoinPageWithStationScope(
page, stcd, rstcd, baseId, rvcd, direction, status, ftp,
startTime, endTime, userId, hbrvcd, approvalId, stationCodes);
Page<FishDraftDataVO> resultPage = fishDraftDataMapper.selectJoinPage(page, stcd, rstcd, baseId, rvcd, direction, status, ftp, startTime, endTime,userId,hbrvcd,approvalId);
fillUserNames(resultPage.getRecords());
return resultPage;
}
@ -315,7 +262,7 @@ public class FishDraftDataServiceImpl extends ServiceImpl<FishDraftDataMapper, F
@Override
public boolean batchRemoveDraft(List<String> ids) {
long count = countByIdsAndLockFlag(ids, 1);
if (count > 0) {
if(count > 0){
return false;
}
String userId = SecurityUtils.getUserId();
@ -445,7 +392,7 @@ public class FishDraftDataServiceImpl extends ServiceImpl<FishDraftDataMapper, F
// hbrvnmSet.add(hbrv.getRvnm());
// }
List<SdEngInfoBH> stationList = engInfoBHMapper.selectByRvcd(null, orgId);
List<SdEngInfoBH> stationList = engInfoBHMapper.selectByRvcd(null,orgId);
if (stationList != null) {
for (SdEngInfoBH station : stationList) {
if (station.getStcd() != null) {
@ -454,7 +401,7 @@ public class FishDraftDataServiceImpl extends ServiceImpl<FishDraftDataMapper, F
if (station.getEnnm() != null) {
ennmSet.add(station.getEnnm());
}
if (station.getReachcdName() != null) {
if(station.getReachcdName() != null){
hbrvnmSet.add(station.getReachcdName());
}
}
@ -472,7 +419,7 @@ public class FishDraftDataServiceImpl extends ServiceImpl<FishDraftDataMapper, F
if (station.getEnnm() != null) {
ennmSet.add(station.getEnnm());
}
if (station.getReachcdName() != null) {
if(station.getReachcdName() != null){
hbrvnmSet.add(station.getReachcdName());
}

View File

@ -15,7 +15,6 @@ public class FprZyFishDicVo {
private String rvcdName;
private String name;
private Integer type;
private String typeName;
private String family;
private String genus;
private String species;

View File

@ -800,7 +800,6 @@ public class FprMonitorServiceImpl implements FprMonitorService {
"rv.RVNM AS rvcdName, " +
"src.NAME AS name, " +
"src.TYPE AS type, " +
"CASE WHEN src.TYPE = 1 THEN '淡水' WHEN src.TYPE = 2 THEN '海水' ELSE '未知' END AS typeName,"+
"src.FAMILY AS family, " +
"src.GENUS AS genus, " +
"src.SPECIES AS species, " +
@ -849,7 +848,6 @@ public class FprMonitorServiceImpl implements FprMonitorService {
"NVL(relAgg.rvcdName, '') AS rvcdName, " +
"src.NAME AS name, " +
"src.TYPE AS type, " +
"CASE WHEN src.TYPE = 1 THEN '淡水' WHEN src.TYPE = 2 THEN '海水' ELSE '未知' END AS typeName,"+
"src.FAMILY AS family, " +
"src.GENUS AS genus, " +
"src.SPECIES AS species, " +

View File

@ -44,11 +44,6 @@ public class OverviewVmsstbprptVo implements Serializable {
private String introduce;
private String logo;
private String inffile;
private String boundary;
private String location;
private BigDecimal height;
private String url;
private String accuracy;
private BigDecimal inv;
private Integer invinmn;
private Date stdsdt;

View File

@ -1459,11 +1459,6 @@ public class OverviewServiceImpl implements OverviewService {
columnMap.put("introduce", "t.INTRODUCE AS \"introduce\"");
columnMap.put("logo", "t.LOGO AS \"logo\"");
columnMap.put("inffile", "t.INFFILE AS \"inffile\"");
columnMap.put("url", "t.URL AS \"url\"");
columnMap.put("boundary", "t.BOUNDARY AS \"boundary\"");
columnMap.put("height", "t.HEIGHT AS \"height\"");
columnMap.put("location", "t.LOCATION AS \"location\"");
columnMap.put("accuracy", "t.ACCURACY AS \"accuracy\"");
columnMap.put("inv", "t.INV AS \"inv\"");
columnMap.put("invinmn", "t.INVINMN AS \"invinmn\"");
columnMap.put("stdsdt", "t.STDSDT AS \"stdsdt\"");

View File

@ -1825,12 +1825,12 @@ public class EnvWqDataServiceImpl implements EnvWqDataService {
"LEFT JOIN SD_RVCD_DIC rv ON rv.RVCD = eng.RVCD " +
"LEFT JOIN SD_ADDVCD_DIC addv ON addv.ADDVCD = eng.ADDVCD " +
"LEFT JOIN MS_ALONG_B rvAlong ON rvAlong.BASEID = wq.BASE_ID AND rvAlong.CODE = 'common' AND NVL(rvAlong.IS_DELETED, 0) = 0 " +
"LEFT JOIN (SELECT det.SORT,along.BASEID, along.RVCD, det.STCD " +
"LEFT JOIN (SELECT det.SORT,cfg.BASEID, along.RVCD, det.STCD " +
" FROM MS_ALONGDET_B det " +
" INNER JOIN MS_ALONG_B along ON det.ALONG_ID = along.ID " +
" WHERE NVL(det.IS_DELETED, 0) = 0 AND NVL(along.IS_DELETED, 0) = 0 AND along.CODE = 'common') rstAlong " +
" ON rstAlong.BASEID = wq.BASE_ID AND rstAlong.STCD = wq.RSTCD " +
"LEFT JOIN (SELECT det.SORT,along.BASEID, along.RVCD, det.STCD " +
"LEFT JOIN (SELECT det.SORT,cfg.BASEID, along.RVCD, det.STCD " +
" FROM MS_ALONGDET_B det " +
" INNER JOIN MS_ALONG_B along ON det.ALONG_ID = along.ID " +
" WHERE NVL(det.IS_DELETED, 0) = 0 AND NVL(along.IS_DELETED, 0) = 0 AND along.CODE = 'common') siteAlong " +

View File

@ -2959,7 +2959,7 @@ public class SdWtMonitorServiceImpl implements SdWtMonitorService {
}
@Override
@Cacheable(cacheNames = "wtCache#3600", keyGenerator = "cacheKeyByUserGenerator")
// @Cacheable(cacheNames = "wtCache#3600", keyGenerator = "cacheKeyByUserGenerator")
public DataSourceResult<WaterTempMapVO> getEngTempPointListKendoListCust(DataSourceRequest dataSourceRequest) {
DataSourceResult<WaterTempMapVO> dataSourceResult = new DataSourceResult<>();
dataSourceResult.setAggregates(new HashMap<>());

View File

@ -437,7 +437,7 @@ public class WeFishServiceImpl implements WeFishService {
"SUM(CASE WHEN we.DCPC = #{map.dcpc2} THEN NVL(fish.FCNT, 0) ELSE 0 END) AS fcnt2 " +
"FROM SD_WE_R we " +
"INNER JOIN SD_WEFISH_R fish ON we.ID = fish.WER_ID AND NVL(fish.IS_DELETED, 0) = 0 " +
"INNER JOIN SD_WE_B_H sec ON sec.STCD = we.STCD AND NVL(sec.USFL, 0) = 1 " +
"INNER JOIN SD_WE_B_H section ON section.STCD = we.STCD AND NVL(section.USFL, 0) = 1 " +
"INNER JOIN SD_FISHDICTORY_B dict ON dict.ID = fish.FTP AND NVL(dict.IS_DELETED, 0) = 0 " +
"WHERE NVL(we.IS_DELETED, 0) = 0 " +
"AND NVL(we.STATUS, 1) = 1 " +
@ -514,49 +514,49 @@ public class WeFishServiceImpl implements WeFishService {
.append("CASE WHEN fishAgg.yr = #{map.endYear} THEN fishAgg.fcnt END AS endFtpCnt, ")
.append("CASE WHEN fishAgg.yr = #{map.endYear} THEN totalAgg.fcnt END AS endCnt ")
.append("FROM (")
.append("SELECT fish.FTP AS ftp, sec.HBRVCD AS hbrvcd, SUM(NVL(fish.FCNT, 0)) AS fcnt, TO_CHAR(we.TM, 'YYYY') AS yr ")
.append("SELECT fish.FTP AS ftp, section.HBRVCD AS hbrvcd, SUM(NVL(fish.FCNT, 0)) AS fcnt, TO_CHAR(we.TM, 'YYYY') AS yr ")
.append("FROM SD_WE_R we ")
.append("INNER JOIN SD_WEFISH_R fish ON we.ID = fish.WER_ID ")
.append(" AND NVL(fish.IS_DELETED, 0) = 0 ")
.append("INNER JOIN SD_WE_B_H sec ON sec.STCD = we.STCD ")
.append("INNER JOIN SD_WE_B_H section ON section.STCD = we.STCD ")
.append("INNER JOIN V_SD_FISHDICTORY_B dictFilter ON dictFilter.FISH_ID = fish.FTP ")
.append(" AND (sec.HBRVCD = dictFilter.RVCD OR dictFilter.RVCD = 'ZY') ")
.append(" AND (section.HBRVCD = dictFilter.RVCD OR dictFilter.RVCD = 'ZY') ")
.append("WHERE NVL(we.STATUS, 1) = 1 ")
.append("AND NVL(we.IS_DELETED, 0) = 0 ")
.append("AND TO_CHAR(we.TM, 'YYYY') IN (#{map.startYear}, #{map.endYear}) ");
if (StrUtil.isNotBlank(baseId)) {
paramMap.put("fishPageBaseId", baseId);
sql.append("AND sec.BASE_ID = #{map.fishPageBaseId} ");
sql.append("AND section.BASE_ID = #{map.fishPageBaseId} ");
}
if (StrUtil.isNotBlank(hbrvcd)) {
paramMap.put("fishPageHbrvcd", hbrvcd);
sql.append("AND sec.HBRVCD = #{map.fishPageHbrvcd} ");
sql.append("AND section.HBRVCD = #{map.fishPageHbrvcd} ");
}
if (StrUtil.isNotBlank(rstcd)) {
paramMap.put("fishPageRstcd", rstcd);
sql.append("AND sec.RSTCD = #{map.fishPageRstcd} ");
sql.append("AND section.RSTCD = #{map.fishPageRstcd} ");
}
sql.append("GROUP BY fish.FTP, sec.HBRVCD, TO_CHAR(we.TM, 'YYYY') ")
sql.append("GROUP BY fish.FTP, section.HBRVCD, TO_CHAR(we.TM, 'YYYY') ")
.append(") fishAgg ")
.append("LEFT JOIN (")
.append("SELECT SUM(NVL(fish.FCNT, 0)) AS fcnt, TO_CHAR(we.TM, 'YYYY') AS yr ")
.append("FROM SD_WE_R we ")
.append("INNER JOIN SD_WEFISH_R fish ON we.ID = fish.WER_ID ")
.append(" AND NVL(fish.IS_DELETED, 0) = 0 ")
.append("INNER JOIN SD_WE_B_H sec ON sec.STCD = we.STCD ")
.append("INNER JOIN SD_WE_B_H section ON section.STCD = we.STCD ")
.append("INNER JOIN V_SD_FISHDICTORY_B dictFilter ON dictFilter.FISH_ID = fish.FTP ")
.append(" AND (sec.HBRVCD = dictFilter.RVCD OR dictFilter.RVCD = 'ZY') ")
.append(" AND (section.HBRVCD = dictFilter.RVCD OR dictFilter.RVCD = 'ZY') ")
.append("WHERE NVL(we.STATUS, 1) = 1 ")
.append("AND NVL(we.IS_DELETED, 0) = 0 ")
.append("AND TO_CHAR(we.TM, 'YYYY') IN (#{map.startYear}, #{map.endYear}) ");
if (StrUtil.isNotBlank(baseId)) {
sql.append("AND sec.BASE_ID = #{map.fishPageBaseId} ");
sql.append("AND section.BASE_ID = #{map.fishPageBaseId} ");
}
if (StrUtil.isNotBlank(hbrvcd)) {
sql.append("AND sec.HBRVCD = #{map.fishPageHbrvcd} ");
sql.append("AND section.HBRVCD = #{map.fishPageHbrvcd} ");
}
if (StrUtil.isNotBlank(rstcd)) {
sql.append("AND sec.RSTCD = #{map.fishPageRstcd} ");
sql.append("AND section.RSTCD = #{map.fishPageRstcd} ");
}
sql.append("GROUP BY TO_CHAR(we.TM, 'YYYY') ")
.append(") totalAgg ON totalAgg.yr = fishAgg.yr ")
@ -1087,33 +1087,33 @@ public class WeFishServiceImpl implements WeFishService {
Map<String, Object> paramMap = new HashMap<>();
StringBuilder sql = new StringBuilder();
sql.append("SELECT ")
.append("sec.STCD AS stcd, ")
.append("sec.STNM AS stnm, ")
.append("sec.LGTD AS lgtd, ")
.append("sec.LTTD AS lttd, ")
.append("sec.ELEV AS dtmel, ")
.append("sec.RSTCD AS rstcds, ")
.append("section.STCD AS stcd, ")
.append("section.STNM AS stnm, ")
.append("section.LGTD AS lgtd, ")
.append("section.LTTD AS lttd, ")
.append("section.ELEV AS dtmel, ")
.append("section.RSTCD AS rstcds, ")
.append("eng.ENNM AS ennm, ")
.append("TO_CHAR(latest.TM, 'yyyy-mm-dd hh24:mi:ss') AS tm, ")
.append("'WE' AS anchoPointState, ")
.append("'WE' AS sttpMap, ")
.append("'WE' AS sttp, ")
.append("'WE' AS sttpCode, ")
.append("sec.STNM AS titleName, ")
.append("sec.RVCD AS rvcd, ")
.append("sec.ADDVCD AS addvcd, ")
.append("sec.BASE_ID AS baseId, ")
.append("sec.RSTCD AS rstcd, ")
.append("section.STNM AS titleName, ")
.append("section.RVCD AS rvcd, ")
.append("section.ADDVCD AS addvcd, ")
.append("section.BASE_ID AS baseId, ")
.append("section.RSTCD AS rstcd, ")
.append("siteSort.SORT AS siteStepSort ")
.append("FROM SD_WE_B_H sec ")
.append("LEFT JOIN SD_ENGINFO_B_H eng ON eng.STCD = sec.RSTCD AND NVL(eng.IS_DELETED, 0) = 0 ")
.append("FROM SD_WE_B_H section ")
.append("LEFT JOIN SD_ENGINFO_B_H eng ON eng.STCD = section.RSTCD AND NVL(eng.IS_DELETED, 0) = 0 ")
.append("LEFT JOIN ( ")
.append(" SELECT STCD, MAX(TM) AS TM ")
.append(" FROM SD_WE_R ")
.append(" WHERE NVL(IS_DELETED, 0) = 0 AND STATUS = 1 ")
.append(" GROUP BY STCD ")
.append(") latest ON latest.STCD = sec.STCD ")
.append("LEFT JOIN MS_ALONG_B along ON along.BASEID = sec.BASE_ID ")
.append(") latest ON latest.STCD = section.STCD ")
.append("LEFT JOIN MS_ALONG_B along ON along.BASEID = section.BASE_ID ")
.append(" AND along.CODE = 'common' AND NVL(along.IS_DELETED, 0) = 0 ")
.append("LEFT JOIN ( ")
.append(" SELECT det.SORT,cfg.BASEID, cfg.RVCD, det.STCD ")
@ -1122,8 +1122,8 @@ public class WeFishServiceImpl implements WeFishService {
.append(" WHERE NVL(det.IS_DELETED, 0) = 0 ")
.append(" AND NVL(cfg.IS_DELETED, 0) = 0 ")
.append(" AND cfg.CODE = 'common' ")
.append(") siteSort ON siteSort.BASEID = sec.BASE_ID AND siteSort.STCD = sec.STCD ")
.append("WHERE NVL(sec.USFL, 1) = 1 ");
.append(") siteSort ON siteSort.BASEID = section.BASE_ID AND siteSort.STCD = section.STCD ")
.append("WHERE NVL(section.USFL, 1) = 1 ");
String filterSql = buildWePointFilterCondition(dataSourceRequest.getFilter(), paramMap, new int[]{0});
if (StrUtil.isNotBlank(filterSql)) {
@ -1186,8 +1186,8 @@ public class WeFishServiceImpl implements WeFishService {
.append("FROM SD_WE_R we ")
.append("INNER JOIN SD_WEFISH_R fish ON fish.WER_ID = we.ID ")
.append(" AND NVL(fish.IS_DELETED, 0) = 0 ")
.append("INNER JOIN SD_WE_B_H sec ON sec.STCD = we.STCD ")
.append(" AND NVL(sec.USFL, 1) = 1 ")
.append("INNER JOIN SD_WE_B_H section ON section.STCD = we.STCD ")
.append(" AND NVL(section.USFL, 1) = 1 ")
.append("INNER JOIN ( ")
.append(" SELECT STCD, MAX(TM) AS TM ")
.append(" FROM SD_WE_R ")
@ -1201,7 +1201,7 @@ public class WeFishServiceImpl implements WeFishService {
.append(" WHERE NVL(rel.IS_DELETED, 0) = 0 ")
.append(" AND NVL(dic.IS_DELETED, 0) = 0 ")
.append(" AND (rel.FISH_ID <> rel.ZY_FISH_ID OR rel.RVCD = 'ZY') ")
.append(") dict ON fish.FTP = dict.FISH_ID AND (sec.HBRVCD = dict.RVCD OR dict.RVCD = 'ZY') ")
.append(") dict ON fish.FTP = dict.FISH_ID AND (section.HBRVCD = dict.RVCD OR dict.RVCD = 'ZY') ")
.append("WHERE fish.FCNT IS NOT NULL ")
.append("AND NVL(we.IS_DELETED, 0) = 0 ")
.append("AND NVL(we.STATUS, 1) = 1 ");
@ -1925,16 +1925,16 @@ public class WeFishServiceImpl implements WeFishService {
StringBuilder sql = new StringBuilder();
sql.append("SELECT t.BASE_ID AS hbrvcd, t.YR AS yr ")
.append("FROM (")
.append("SELECT sec.HBRVCD, sec.RSTCD, sec.BASE_ID, TO_CHAR(we.TM, 'yyyy') AS yr ")
.append("FROM SD_WE_B_H sec ")
.append("INNER JOIN SD_WE_R we ON sec.STCD = we.STCD ")
.append("SELECT section.HBRVCD, section.RSTCD, section.BASE_ID, TO_CHAR(we.TM, 'yyyy') AS yr ")
.append("FROM SD_WE_B_H section ")
.append("INNER JOIN SD_WE_R we ON section.STCD = we.STCD ")
.append(" AND NVL(we.IS_DELETED, 0) = 0 ")
.append(" AND NVL(we.STATUS, 1) = 1 ")
.append("INNER JOIN SD_WEFISH_R fish ON we.ID = fish.WER_ID ")
.append(" AND NVL(fish.IS_DELETED, 0) = 0 ")
.append("LEFT JOIN V_SD_FISHDICTORY_B dict ON fish.FTP = dict.FISH_ID ")
.append(" AND (sec.HBRVCD = dict.RVCD OR dict.RVCD = 'ZY') ")
.append("WHERE NVL(sec.USFL, 0) = 1 ")
.append(" AND (section.HBRVCD = dict.RVCD OR dict.RVCD = 'ZY') ")
.append("WHERE NVL(section.USFL, 0) = 1 ")
.append("AND CASE ")
.append("WHEN dict.SPEC_ORIGIN = 2 THEN 1 ")
.append("WHEN dict.SPEC_ORIGIN = 1 AND NVL(dict.PTYPE, -1) <> 6 THEN 2 ")
@ -1943,11 +1943,11 @@ public class WeFishServiceImpl implements WeFishService {
if (StrUtil.isNotBlank(baseId)) {
paramMap.put("weYearBaseId", baseId);
sql.append("AND sec.BASE_ID = #{map.weYearBaseId} ");
sql.append("AND section.BASE_ID = #{map.weYearBaseId} ");
}
if (StrUtil.isNotBlank(hbrvcd)) {
paramMap.put("weYearHbrvcd", hbrvcd);
sql.append("AND sec.HBRVCD = #{map.weYearHbrvcd} ");
sql.append("AND section.HBRVCD = #{map.weYearHbrvcd} ");
}
if (StrUtil.isNotBlank(yr)) {
paramMap.put("weYearYr", yr);
@ -1965,11 +1965,11 @@ public class WeFishServiceImpl implements WeFishService {
placeholders.add("#{map." + key + "}");
}
if (CollUtil.isNotEmpty(placeholders)) {
sql.append("AND sec.RSTCD IN (").append(String.join(", ", placeholders)).append(") ");
sql.append("AND section.RSTCD IN (").append(String.join(", ", placeholders)).append(") ");
}
}
sql.append("GROUP BY sec.BASE_ID, sec.HBRVCD, sec.RSTCD, TO_CHAR(we.TM, 'yyyy')")
sql.append("GROUP BY section.BASE_ID, section.HBRVCD, section.RSTCD, TO_CHAR(we.TM, 'yyyy')")
.append(") t ")
.append("INNER JOIN (")
.append("SELECT det.STCD, det.SORT, cfg.RVCD ")
@ -1993,7 +1993,7 @@ public class WeFishServiceImpl implements WeFishService {
StringBuilder sql = new StringBuilder();
sql.append("SELECT t.STCD AS stcd, t.STNM AS stnm, t.NUM AS num, t.TY AS ty, t2.SORT AS sort ")
.append("FROM (")
.append("SELECT sec.RSTCD AS STCD, ")
.append("SELECT section.RSTCD AS STCD, ")
.append("eng.ENNM AS STNM, ")
.append("COUNT(DISTINCT fish.FTP) AS NUM, ")
.append("CASE ")
@ -2001,26 +2001,26 @@ public class WeFishServiceImpl implements WeFishService {
.append("WHEN dict.SPEC_ORIGIN = 1 AND NVL(dict.PTYPE, -1) <> 6 THEN '2' ")
.append("WHEN dict.SPEC_ORIGIN = 1 AND dict.PTYPE = 6 THEN '3' ")
.append("END AS TY ")
.append("FROM SD_WE_B_H sec ")
.append("INNER JOIN SD_WE_R we ON sec.STCD = we.STCD ")
.append("FROM SD_WE_B_H section ")
.append("INNER JOIN SD_WE_R we ON section.STCD = we.STCD ")
.append(" AND NVL(we.IS_DELETED, 0) = 0 ")
// .append(" AND NVL(we.STATUS, 1) = 1 ")
.append("INNER JOIN SD_WEFISH_R fish ON we.ID = fish.WER_ID ")
.append(" AND NVL(fish.IS_DELETED, 0) = 0 ")
.append("LEFT JOIN SD_ENGINFO_B_H eng ON eng.STCD = sec.RSTCD ")
.append("LEFT JOIN SD_ENGINFO_B_H eng ON eng.STCD = section.RSTCD ")
.append(" AND NVL(eng.IS_DELETED, 0) = 0 ")
.append("LEFT JOIN V_SD_FISHDICTORY_B dict ON fish.FTP = dict.FISH_ID ")
.append(" AND (sec.HBRVCD = dict.RVCD OR dict.RVCD = 'ZY') ")
.append(" AND (section.HBRVCD = dict.RVCD OR dict.RVCD = 'ZY') ")
.append("WHERE 1 = 1 ");
// .append("WHERE NVL(sec.USFL, 0) = 1 ");
// .append("WHERE NVL(section.USFL, 0) = 1 ");
if (StrUtil.isNotBlank(baseId)) {
paramMap.put("weFishStatBaseId", baseId);
sql.append("AND sec.BASE_ID = #{map.weFishStatBaseId} ");
sql.append("AND section.BASE_ID = #{map.weFishStatBaseId} ");
}
if (StrUtil.isNotBlank(hbrvcd)) {
paramMap.put("weFishStatHbrvcd", hbrvcd);
sql.append("AND sec.HBRVCD = #{map.weFishStatHbrvcd} ");
sql.append("AND section.HBRVCD = #{map.weFishStatHbrvcd} ");
}
if (StrUtil.isNotBlank(yr)) {
paramMap.put("weFishStatYr", yr);
@ -2038,7 +2038,7 @@ public class WeFishServiceImpl implements WeFishService {
placeholders.add("#{map." + key + "}");
}
if (CollUtil.isNotEmpty(placeholders)) {
sql.append("AND sec.RSTCD IN (").append(String.join(", ", placeholders)).append(") ");
sql.append("AND section.RSTCD IN (").append(String.join(", ", placeholders)).append(") ");
}
}
@ -2047,7 +2047,7 @@ public class WeFishServiceImpl implements WeFishService {
.append("WHEN dict.SPEC_ORIGIN = 1 AND NVL(dict.PTYPE, -1) <> 6 THEN 2 ")
.append("WHEN dict.SPEC_ORIGIN = 1 AND dict.PTYPE = 6 THEN 3 ")
.append("END IS NOT NULL ")
.append("GROUP BY sec.RSTCD, eng.ENNM, CASE ")
.append("GROUP BY section.RSTCD, eng.ENNM, CASE ")
.append("WHEN dict.SPEC_ORIGIN = 2 THEN '1' ")
.append("WHEN dict.SPEC_ORIGIN = 1 AND NVL(dict.PTYPE, -1) <> 6 THEN '2' ")
.append("WHEN dict.SPEC_ORIGIN = 1 AND dict.PTYPE = 6 THEN '3' ")
@ -2074,7 +2074,7 @@ public class WeFishServiceImpl implements WeFishService {
StringBuilder sql = new StringBuilder();
sql.append("SELECT t.STCD AS stcd, t.STNM AS stnm, t.NUM AS num, t.TY AS ty, t2.SORT AS sort ")
.append("FROM (")
.append("SELECT sec.RSTCD AS STCD, ")
.append("SELECT section.RSTCD AS STCD, ")
.append("eng.ENNM AS STNM, ")
.append("COUNT(DISTINCT fish.FTP) AS NUM, ")
.append("CASE ")
@ -2083,29 +2083,29 @@ public class WeFishServiceImpl implements WeFishService {
.append("WHEN dict.SPEC_ORIGIN = 1 AND dict.PTYPE = 6 THEN '3' ")
.append("END AS TY, ")
.append("TO_CHAR(we.TM, 'yyyy') AS YR ")
.append("FROM SD_WE_B_H sec ")
.append("INNER JOIN SD_WE_R we ON sec.STCD = we.STCD ")
.append("FROM SD_WE_B_H section ")
.append("INNER JOIN SD_WE_R we ON section.STCD = we.STCD ")
.append(" AND NVL(we.IS_DELETED, 0) = 0 ")
.append(" AND NVL(we.STATUS, 1) = 1 ")
.append("INNER JOIN SD_WEFISH_R fish ON we.ID = fish.WER_ID ")
.append(" AND NVL(fish.IS_DELETED, 0) = 0 ")
.append("LEFT JOIN SD_ENGINFO_B_H eng ON eng.STCD = sec.RSTCD ")
.append("LEFT JOIN SD_ENGINFO_B_H eng ON eng.STCD = section.RSTCD ")
.append(" AND NVL(eng.IS_DELETED, 0) = 0 ")
.append("LEFT JOIN SD_FISHDICTORY_B dict ON fish.FTP = dict.ID ")
.append(" AND NVL(dict.IS_DELETED, 0) = 0 ")
.append("WHERE NVL(sec.USFL, 0) = 1 ");
.append("WHERE NVL(section.USFL, 0) = 1 ");
if (StrUtil.isNotBlank(baseId)) {
paramMap.put("weFishStatBaseId", baseId);
sql.append("AND sec.BASE_ID = #{map.weFishStatBaseId} ");
sql.append("AND section.BASE_ID = #{map.weFishStatBaseId} ");
}
if (StrUtil.isNotBlank(hbrvcd)) {
paramMap.put("weFishStatHbrvcd", hbrvcd);
sql.append("AND sec.HBRVCD = #{map.weFishStatHbrvcd} ");
sql.append("AND section.HBRVCD = #{map.weFishStatHbrvcd} ");
}
sql.append("AND sec.RSTCD IS NOT NULL ")
sql.append("AND section.RSTCD IS NOT NULL ")
.append("AND dict.SPEC_ORIGIN IS NOT NULL ")
.append("GROUP BY sec.RSTCD, eng.ENNM, ")
.append("GROUP BY section.RSTCD, eng.ENNM, ")
.append("CASE ")
.append("WHEN dict.SPEC_ORIGIN = 2 THEN '1' ")
.append("WHEN dict.SPEC_ORIGIN = 1 AND NVL(dict.PTYPE, -1) <> 6 THEN '2' ")
@ -2189,36 +2189,36 @@ public class WeFishServiceImpl implements WeFishService {
Map<String, Object> paramMap) {
StringBuilder sql = new StringBuilder();
sql.append("SELECT ")
.append("sec.RSTCD AS rstcd, ")
.append("section.RSTCD AS rstcd, ")
.append("eng.ENNM AS rstcdName, ")
.append("TO_CHAR(WM_CONCAT(DISTINCT sec.STCD)) AS stcd, ")
.append("TO_CHAR(WM_CONCAT(DISTINCT sec.STNM)) AS stnm, ")
.append("TO_CHAR(WM_CONCAT(DISTINCT section.STCD)) AS stcd, ")
.append("TO_CHAR(WM_CONCAT(DISTINCT section.STNM)) AS stnm, ")
.append("TO_CHAR(WM_CONCAT(DISTINCT dict.ZY_FISH_ID)) AS id ")
.append("FROM SD_WE_B_H sec ")
.append("INNER JOIN SD_WE_R we ON sec.STCD = we.STCD ")
.append("FROM SD_WE_B_H section ")
.append("INNER JOIN SD_WE_R we ON section.STCD = we.STCD ")
.append(" AND NVL(we.IS_DELETED, 0) = 0 ")
.append(" AND NVL(we.STATUS, 1) = 1 ")
.append("INNER JOIN SD_WEFISH_R fish ON we.ID = fish.WER_ID ")
.append(" AND NVL(fish.IS_DELETED, 0) = 0 ")
.append("LEFT JOIN SD_ENGINFO_B_H eng ON sec.RSTCD = eng.STCD ")
.append("LEFT JOIN SD_ENGINFO_B_H eng ON section.RSTCD = eng.STCD ")
.append(" AND NVL(eng.IS_DELETED, 0) = 0 ")
.append("LEFT JOIN V_SD_FISHDICTORY_B dict ON fish.FTP = dict.FISH_ID ")
.append(" AND (sec.HBRVCD = dict.RVCD OR dict.RVCD = 'ZY') ")
.append("WHERE NVL(sec.USFL, 0) = 1 ")
.append("AND sec.RSTCD IS NOT NULL ")
.append(" AND (section.HBRVCD = dict.RVCD OR dict.RVCD = 'ZY') ")
.append("WHERE NVL(section.USFL, 0) = 1 ")
.append("AND section.RSTCD IS NOT NULL ")
.append("AND dict.ZY_FISH_ID IS NOT NULL ");
if (StrUtil.isNotBlank(baseId)) {
paramMap.put("qgcWeFishDetailBaseId", baseId);
sql.append("AND sec.BASE_ID = #{map.qgcWeFishDetailBaseId} ");
sql.append("AND section.BASE_ID = #{map.qgcWeFishDetailBaseId} ");
}
if (StrUtil.isNotBlank(rstcd)) {
paramMap.put("qgcWeFishDetailRstcd", rstcd);
sql.append("AND sec.RSTCD = #{map.qgcWeFishDetailRstcd} ");
sql.append("AND section.RSTCD = #{map.qgcWeFishDetailRstcd} ");
}
if (StrUtil.isNotBlank(rvcd)) {
paramMap.put("qgcWeFishDetailRvcd", rvcd);
sql.append("AND sec.HBRVCD = #{map.qgcWeFishDetailRvcd} ");
sql.append("AND section.HBRVCD = #{map.qgcWeFishDetailRvcd} ");
}
if (StrUtil.isNotBlank(yr)) {
paramMap.put("qgcWeFishDetailYr", yr);
@ -2233,7 +2233,7 @@ public class WeFishServiceImpl implements WeFishService {
.append("END = #{map.qgcWeFishDetailTy} ");
}
sql.append("GROUP BY sec.RSTCD, eng.ENNM ")
sql.append("GROUP BY section.RSTCD, eng.ENNM ")
.append("ORDER BY eng.ENNM ASC NULLS LAST");
return sql.toString();
}
@ -2246,36 +2246,36 @@ public class WeFishServiceImpl implements WeFishService {
Map<String, Object> paramMap) {
StringBuilder sql = new StringBuilder();
sql.append("SELECT ")
.append("sec.RSTCD AS rstcd, ")
.append("section.RSTCD AS rstcd, ")
.append("eng.ENNM AS rstcdName, ")
.append("TO_CHAR(WM_CONCAT(DISTINCT sec.STCD)) AS stcd, ")
.append("TO_CHAR(WM_CONCAT(DISTINCT sec.STNM)) AS stnm, ")
.append("TO_CHAR(WM_CONCAT(DISTINCT section.STCD)) AS stcd, ")
.append("TO_CHAR(WM_CONCAT(DISTINCT section.STNM)) AS stnm, ")
.append("TO_CHAR(WM_CONCAT(DISTINCT dict.NAME)) AS name ")
.append("FROM SD_WE_B_H sec ")
.append("INNER JOIN SD_WE_R we ON sec.STCD = we.STCD ")
.append("FROM SD_WE_B_H section ")
.append("INNER JOIN SD_WE_R we ON section.STCD = we.STCD ")
.append(" AND NVL(we.IS_DELETED, 0) = 0 ")
.append(" AND NVL(we.STATUS, 1) = 1 ")
.append("INNER JOIN SD_WEFISH_R fish ON we.ID = fish.WER_ID ")
.append(" AND NVL(fish.IS_DELETED, 0) = 0 ")
.append("LEFT JOIN SD_ENGINFO_B_H eng ON sec.RSTCD = eng.STCD ")
.append("LEFT JOIN SD_ENGINFO_B_H eng ON section.RSTCD = eng.STCD ")
.append(" AND NVL(eng.IS_DELETED, 0) = 0 ")
.append("LEFT JOIN SD_FISHDICTORY_B dict ON fish.FTP = dict.ID ")
.append(" AND NVL(dict.IS_DELETED, 0) = 0 ")
.append("WHERE NVL(sec.USFL, 0) = 1 ")
.append("AND sec.RSTCD IS NOT NULL ")
.append("WHERE NVL(section.USFL, 0) = 1 ")
.append("AND section.RSTCD IS NOT NULL ")
.append("AND dict.NAME IS NOT NULL ");
if (StrUtil.isNotBlank(baseId)) {
paramMap.put("weFishDetailBaseId", baseId);
sql.append("AND sec.BASE_ID = #{map.weFishDetailBaseId} ");
sql.append("AND section.BASE_ID = #{map.weFishDetailBaseId} ");
}
if (StrUtil.isNotBlank(rstcd)) {
paramMap.put("weFishDetailRstcd", rstcd);
sql.append("AND sec.RSTCD = #{map.weFishDetailRstcd} ");
sql.append("AND section.RSTCD = #{map.weFishDetailRstcd} ");
}
if (StrUtil.isNotBlank(rvcd)) {
paramMap.put("weFishDetailRvcd", rvcd);
sql.append("AND sec.HBRVCD = #{map.weFishDetailRvcd} ");
sql.append("AND section.HBRVCD = #{map.weFishDetailRvcd} ");
}
if (StrUtil.isNotBlank(yr)) {
paramMap.put("weFishDetailYr", yr);
@ -2290,7 +2290,7 @@ public class WeFishServiceImpl implements WeFishService {
.append("END = #{map.weFishDetailTy} ");
}
sql.append("GROUP BY sec.RSTCD, eng.ENNM ")
sql.append("GROUP BY section.RSTCD, eng.ENNM ")
.append("ORDER BY eng.ENNM ASC NULLS LAST");
return sql.toString();
}
@ -2303,36 +2303,36 @@ public class WeFishServiceImpl implements WeFishService {
Map<String, Object> paramMap) {
StringBuilder sql = new StringBuilder();
sql.append("SELECT ")
.append("sec.RSTCD AS rstcd, ")
.append("section.RSTCD AS rstcd, ")
.append("eng.ENNM AS rstcdName, ")
.append("sec.STCD AS stcd, ")
.append("sec.STNM AS stnm, ")
.append("section.STCD AS stcd, ")
.append("section.STNM AS stnm, ")
.append("dict.ZY_FISH_ID AS id ")
.append("FROM SD_WE_B_H sec ")
.append("INNER JOIN SD_WE_R we ON sec.STCD = we.STCD ")
.append("FROM SD_WE_B_H section ")
.append("INNER JOIN SD_WE_R we ON section.STCD = we.STCD ")
.append(" AND NVL(we.IS_DELETED, 0) = 0 ")
.append(" AND NVL(we.STATUS, 1) = 1 ")
.append("INNER JOIN SD_WEFISH_R fish ON we.ID = fish.WER_ID ")
.append(" AND NVL(fish.IS_DELETED, 0) = 0 ")
.append("LEFT JOIN SD_ENGINFO_B_H eng ON sec.RSTCD = eng.STCD ")
.append("LEFT JOIN SD_ENGINFO_B_H eng ON section.RSTCD = eng.STCD ")
.append(" AND NVL(eng.IS_DELETED, 0) = 0 ")
.append("LEFT JOIN V_SD_FISHDICTORY_B dict ON fish.FTP = dict.FISH_ID ")
.append(" AND (sec.HBRVCD = dict.RVCD OR dict.RVCD = 'ZY') ")
.append("WHERE NVL(sec.USFL, 0) = 1 ")
.append("AND sec.RSTCD IS NOT NULL ")
.append(" AND (section.HBRVCD = dict.RVCD OR dict.RVCD = 'ZY') ")
.append("WHERE NVL(section.USFL, 0) = 1 ")
.append("AND section.RSTCD IS NOT NULL ")
.append("AND dict.ZY_FISH_ID IS NOT NULL ");
if (StrUtil.isNotBlank(baseId)) {
paramMap.put("hbbQgcWeFishDetailBaseId", baseId);
sql.append("AND sec.BASE_ID = #{map.hbbQgcWeFishDetailBaseId} ");
sql.append("AND section.BASE_ID = #{map.hbbQgcWeFishDetailBaseId} ");
}
if (StrUtil.isNotBlank(rstcd)) {
paramMap.put("hbbQgcWeFishDetailRstcd", rstcd);
sql.append("AND sec.RSTCD = #{map.hbbQgcWeFishDetailRstcd} ");
sql.append("AND section.RSTCD = #{map.hbbQgcWeFishDetailRstcd} ");
}
if (StrUtil.isNotBlank(rvcd)) {
paramMap.put("hbbQgcWeFishDetailRvcd", rvcd);
sql.append("AND sec.HBRVCD = #{map.hbbQgcWeFishDetailRvcd} ");
sql.append("AND section.HBRVCD = #{map.hbbQgcWeFishDetailRvcd} ");
}
if (StrUtil.isNotBlank(yr)) {
paramMap.put("hbbQgcWeFishDetailYr", yr);
@ -2347,8 +2347,8 @@ public class WeFishServiceImpl implements WeFishService {
.append("END = #{map.hbbQgcWeFishDetailTy} ");
}
sql.append("GROUP BY sec.RSTCD, eng.ENNM, sec.STCD, sec.STNM,dict.ZY_FISH_ID ")
.append("ORDER BY eng.ENNM ASC NULLS LAST, sec.STNM ASC NULLS LAST");
sql.append("GROUP BY section.RSTCD, eng.ENNM, section.STCD, section.STNM,dict.ZY_FISH_ID ")
.append("ORDER BY eng.ENNM ASC NULLS LAST, section.STNM ASC NULLS LAST");
return sql.toString();
}
@ -2364,27 +2364,27 @@ public class WeFishServiceImpl implements WeFishService {
.append("WHEN dict.SPEC_ORIGIN = 1 AND NVL(dict.PTYPE, -1) <> 6 THEN '2' ")
.append("WHEN dict.SPEC_ORIGIN = 1 AND dict.PTYPE = 6 THEN '3' ")
.append("END AS ty ")
.append("FROM SD_WE_B_H sec ")
.append("INNER JOIN SD_WE_R we ON sec.STCD = we.STCD ")
.append("FROM SD_WE_B_H section ")
.append("INNER JOIN SD_WE_R we ON section.STCD = we.STCD ")
.append(" AND NVL(we.IS_DELETED, 0) = 0 ")
.append(" AND NVL(we.STATUS, 1) = 1 ")
.append("INNER JOIN SD_WEFISH_R fish ON we.ID = fish.WER_ID ")
.append(" AND NVL(fish.IS_DELETED, 0) = 0 ")
.append("LEFT JOIN SD_FISHDICTORY_B dict ON fish.FTP = dict.ID ")
.append(" AND NVL(dict.IS_DELETED, 0) = 0 ")
.append("WHERE NVL(sec.USFL, 0) = 1 ");
.append("WHERE NVL(section.USFL, 0) = 1 ");
if (StrUtil.isNotBlank(baseId)) {
paramMap.put("weFishStatTabBaseId", baseId);
sql.append("AND sec.BASE_ID = #{map.weFishStatTabBaseId} ");
sql.append("AND section.BASE_ID = #{map.weFishStatTabBaseId} ");
}
if (StrUtil.isNotBlank(rvcd)) {
paramMap.put("weFishStatTabRvcd", rvcd);
sql.append("AND sec.HBRVCD = #{map.weFishStatTabRvcd} ");
sql.append("AND section.HBRVCD = #{map.weFishStatTabRvcd} ");
}
if (StrUtil.isNotBlank(rstcd)) {
paramMap.put("weFishStatTabRstcd", rstcd);
sql.append("AND sec.RSTCD = #{map.weFishStatTabRstcd} ");
sql.append("AND section.RSTCD = #{map.weFishStatTabRstcd} ");
}
if (StrUtil.isNotBlank(yr)) {
paramMap.put("weFishStatTabYr", yr);
@ -2547,7 +2547,7 @@ public class WeFishServiceImpl implements WeFishService {
"eng.RVCD_NAME AS rvcdName, " +
"eng.HBRVCD AS hbrvcd, " +
"eng.HBRVCD_NAME AS hbrvcdName, " +
"sec.RSTCD AS rstcd, " +
"section.RSTCD AS rstcd, " +
"eng.ENNM AS ennm, " +
"eng.BASE_ID AS baseId, " +
"eng.BASE_NAME AS baseName, " +
@ -2557,9 +2557,9 @@ public class WeFishServiceImpl implements WeFishService {
"FROM SD_WE_R we " +
"INNER JOIN SD_WEFISH_R fish ON we.ID = fish.WER_ID " +
" AND NVL(fish.IS_DELETED, 0) = 0 " +
"INNER JOIN SD_WE_B_H sec ON we.STCD = sec.STCD " +
" AND NVL(sec.USFL, 0) = 1 " +
"INNER JOIN SD_ENGINFO_B_H eng ON eng.STCD = sec.RSTCD " +
"INNER JOIN SD_WE_B_H section ON we.STCD = section.STCD " +
" AND NVL(section.USFL, 0) = 1 " +
"INNER JOIN SD_ENGINFO_B_H eng ON eng.STCD = section.RSTCD " +
" AND NVL(eng.IS_DELETED, 0) = 0 " +
"INNER JOIN V_SD_FISHDICTORY_B dict ON dict.FISH_ID = fish.FTP " +
" AND (eng.HBRVCD = dict.RVCD OR dict.RVCD = 'ZY') " +
@ -2580,11 +2580,11 @@ public class WeFishServiceImpl implements WeFishService {
end = parseDateTimeSafely(endTime);
}
StringBuilder sql = new StringBuilder();
sql.append("SELECT agg.ftp AS ftp, sec.STCD AS stcd, sec.RSTCD AS rstcds, ")
.append("sec.STNM AS stnm, eng.ENNM AS ennm, ")
.append("sec.LGTD AS lgtd, sec.LTTD AS lttd, ")
sql.append("SELECT agg.ftp AS ftp, section.STCD AS stcd, section.RSTCD AS rstcds, ")
.append("section.STNM AS stnm, eng.ENNM AS ennm, ")
.append("section.LGTD AS lgtd, section.LTTD AS lttd, ")
.append("'ylfb' AS sttp, 'ylfb' AS sttpMap, ")
.append("sec.RVCD AS rvcd, sec.ADDVCD AS addvcd, sec.BASE_ID AS baseId, ")
.append("section.RVCD AS rvcd, section.ADDVCD AS addvcd, section.BASE_ID AS baseId, ")
.append("'WE' AS sttpCode, 'ylfb' AS anchoPointState, '鱼类分布' AS titleName, ")
.append("eng.ELEV AS dtmel ")
.append("FROM (")
@ -2592,12 +2592,12 @@ public class WeFishServiceImpl implements WeFishService {
.append("FROM (")
.append("SELECT dict.ZY_FISH_ID AS ID, we.STCD AS stcd ")
.append("FROM SD_WE_R we ")
.append("INNER JOIN SD_WE_B_H sec ON we.STCD = sec.STCD ")
.append(" AND NVL(sec.USFL, 0) = 1 ")
.append("INNER JOIN SD_WE_B_H section ON we.STCD = section.STCD ")
.append(" AND NVL(section.USFL, 0) = 1 ")
.append("INNER JOIN SD_WEFISH_R fish ON we.ID = fish.WER_ID ")
.append(" AND NVL(fish.IS_DELETED, 0) = 0 ")
.append("INNER JOIN V_SD_FISHDICTORY_B dict ON dict.FISH_ID = fish.FTP ")
.append(" AND (sec.HBRVCD = dict.RVCD OR dict.RVCD = 'ZY') ")
.append(" AND (section.HBRVCD = dict.RVCD OR dict.RVCD = 'ZY') ")
.append("WHERE NVL(we.IS_DELETED, 0) = 0 ")
.append("AND NVL(we.STATUS, 1) = 1 ");
@ -2625,12 +2625,12 @@ public class WeFishServiceImpl implements WeFishService {
sql.append("AND we.STCD IN (")
.append("SELECT a.STCD ")
.append("FROM SD_WE_R a ")
.append("INNER JOIN SD_WE_B_H sec2 ON a.STCD = sec2.STCD ")
.append(" AND NVL(sec2.USFL, 0) = 1 ")
.append("INNER JOIN SD_WE_B_H section2 ON a.STCD = section2.STCD ")
.append(" AND NVL(section2.USFL, 0) = 1 ")
.append("INNER JOIN SD_WEFISH_R b ON a.ID = b.WER_ID ")
.append(" AND NVL(b.IS_DELETED, 0) = 0 ")
.append("INNER JOIN V_SD_FISHDICTORY_B c ON c.FISH_ID = b.FTP ")
.append(" AND (sec2.HBRVCD = c.RVCD OR c.RVCD = 'ZY') ")
.append(" AND (section2.HBRVCD = c.RVCD OR c.RVCD = 'ZY') ")
.append("WHERE NVL(a.IS_DELETED, 0) = 0 ")
.append("AND NVL(a.STATUS, 1) = 1 ");
if (start != null && end != null) {
@ -2644,16 +2644,16 @@ public class WeFishServiceImpl implements WeFishService {
sql.append("GROUP BY we.STCD, dict.ZY_FISH_ID")
.append(") t GROUP BY t.stcd")
.append(") agg ")
.append("INNER JOIN SD_WE_B_H sec ON agg.stcd = sec.STCD ")
.append(" AND NVL(sec.USFL, 0) = 1 ")
.append("LEFT JOIN SD_ENGINFO_B_H eng ON eng.STCD = sec.RSTCD ")
.append("INNER JOIN SD_WE_B_H section ON agg.stcd = section.STCD ")
.append(" AND NVL(section.USFL, 0) = 1 ")
.append("LEFT JOIN SD_ENGINFO_B_H eng ON eng.STCD = section.RSTCD ")
.append(" AND NVL(eng.IS_DELETED, 0) = 0 ")
.append("WHERE 1 = 1 ");
if (StrUtil.isNotBlank(baseId)) {
paramMap.put("weFishPointBaseId", baseId);
sql.append("AND sec.BASE_ID = #{map.weFishPointBaseId} ");
sql.append("AND section.BASE_ID = #{map.weFishPointBaseId} ");
}
sql.append("ORDER BY sec.STCD ASC");
sql.append("ORDER BY section.STCD ASC");
return sql.toString();
}
@ -2669,14 +2669,14 @@ public class WeFishServiceImpl implements WeFishService {
}
return switch (field) {
case "stcd" -> "sec.STCD";
case "lgtd" -> "sec.LGTD";
case "stnm", "titleName" -> "sec.STNM";
case "stcd" -> "section.STCD";
case "lgtd" -> "section.LGTD";
case "stnm", "titleName" -> "section.STNM";
case "ennm" -> "eng.ENNM";
case "rvcd" -> "sec.RVCD";
case "addvcd" -> "sec.ADDVCD";
case "baseId" -> "sec.BASE_ID";
case "rstcd", "rstcds" -> "sec.RSTCD";
case "rvcd" -> "section.RVCD";
case "addvcd" -> "section.ADDVCD";
case "baseId" -> "section.BASE_ID";
case "rstcd", "rstcds" -> "section.RSTCD";
case "tm" -> "latest.TM";
default -> null;
};
@ -2709,13 +2709,13 @@ public class WeFishServiceImpl implements WeFishService {
return null;
}
return switch (field) {
case "stcd" -> "sec.STCD";
case "stnm", "titleName" -> "sec.STNM";
case "stcd" -> "section.STCD";
case "stnm", "titleName" -> "section.STNM";
case "ennm" -> "eng.ENNM";
case "tm" -> "latest.TM";
case "rvcd" -> "sec.RVCD";
case "addvcd" -> "sec.ADDVCD";
case "baseId" -> "sec.BASE_ID";
case "rvcd" -> "section.RVCD";
case "addvcd" -> "section.ADDVCD";
case "baseId" -> "section.BASE_ID";
case "siteStepSort" -> "siteSort.SORT";
default -> null;
};
@ -3949,21 +3949,21 @@ public class WeFishServiceImpl implements WeFishService {
.append("COUNT(DISTINCT we.STCD) AS stcdCount, ")
.append("COUNT(DISTINCT fish.FTP) AS ftpCount, ")
.append("NVL(SUM(NVL(fish.FCNT, 0)), 0) AS fcntSum ")
.append("FROM SD_WE_B_H sec ")
.append("INNER JOIN SD_WE_R we ON sec.STCD = we.STCD ")
.append("FROM SD_WE_B_H section ")
.append("INNER JOIN SD_WE_R we ON section.STCD = we.STCD ")
.append(" AND NVL(we.IS_DELETED, 0) = 0 ")
.append(" AND NVL(we.STATUS, 1) = 1 ")
.append("LEFT JOIN SD_WEFISH_R fish ON fish.WER_ID = we.ID ")
.append(" AND NVL(fish.IS_DELETED, 0) = 0 ")
.append("WHERE NVL(sec.USFL, 0) = 1 ");
.append("WHERE NVL(section.USFL, 0) = 1 ");
if (StrUtil.isNotBlank(baseId)) {
paramMap.put("weStaticsBaseId", baseId);
sql.append("AND sec.BASE_ID = #{map.weStaticsBaseId} ");
sql.append("AND section.BASE_ID = #{map.weStaticsBaseId} ");
}
if (StrUtil.isNotBlank(hbrvcd)) {
paramMap.put("weStaticsHbrvcd", hbrvcd);
sql.append("AND sec.HBRVCD = #{map.weStaticsHbrvcd} ");
sql.append("AND section.HBRVCD = #{map.weStaticsHbrvcd} ");
}
if (StrUtil.isNotBlank(yr)) {
paramMap.put("weStaticsYr", yr);
@ -3981,7 +3981,7 @@ public class WeFishServiceImpl implements WeFishService {
placeholders.add("#{map." + key + "}");
}
if (CollUtil.isNotEmpty(placeholders)) {
sql.append("AND sec.RSTCD IN (").append(String.join(", ", placeholders)).append(") ");
sql.append("AND section.RSTCD IN (").append(String.join(", ", placeholders)).append(") ");
}
}
return sql.toString();
@ -4001,8 +4001,8 @@ public class WeFishServiceImpl implements WeFishService {
private String buildWeFishTDetailSql() {
return "SELECT " +
"sec.STCD AS stcd, " +
"sec.STNM AS stnm, " +
"section.STCD AS stcd, " +
"section.STNM AS stnm, " +
"eng.BASE_ID AS baseId, " +
"eng.BASE_NAME AS baseName, " +
"eng.RVCD AS rvcd, " +
@ -4044,9 +4044,9 @@ public class WeFishServiceImpl implements WeFishService {
"FROM SD_WE_R we " +
"INNER JOIN SD_WEFISH_R fish ON fish.WER_ID = we.ID " +
" AND NVL(fish.IS_DELETED, 0) = 0 " +
"INNER JOIN SD_WE_B_H sec ON sec.STCD = we.STCD " +
" AND NVL(sec.USFL, 0) = 1 " +
"LEFT JOIN SD_ENGINFO_B_H eng ON eng.STCD = sec.RSTCD " +
"INNER JOIN SD_WE_B_H section ON section.STCD = we.STCD " +
" AND NVL(section.USFL, 0) = 1 " +
"LEFT JOIN SD_ENGINFO_B_H eng ON eng.STCD = section.RSTCD " +
" AND NVL(eng.IS_DELETED, 0) = 0 " +
"LEFT JOIN SD_FISHDICTORY_B dict ON dict.ID = fish.FTP " +
" AND NVL(dict.IS_DELETED, 0) = 0 " +
@ -4056,8 +4056,8 @@ public class WeFishServiceImpl implements WeFishService {
private String buildWeFishQgcDetailSql() {
return "SELECT " +
"sec.STCD AS stcd, " +
"sec.STNM AS stnm, " +
"section.STCD AS stcd, " +
"section.STNM AS stnm, " +
"eng.BASE_ID AS baseId, " +
"eng.BASE_NAME AS baseName, " +
"eng.RVCD AS rvcd, " +
@ -4099,9 +4099,9 @@ public class WeFishServiceImpl implements WeFishService {
"FROM SD_WE_R we " +
"INNER JOIN SD_WEFISH_R fish ON fish.WER_ID = we.ID " +
" AND NVL(fish.IS_DELETED, 0) = 0 " +
"INNER JOIN SD_WE_B_H sec ON sec.STCD = we.STCD " +
// " AND NVL(sec.USFL, 0) = 1 " +
"LEFT JOIN SD_ENGINFO_B_H eng ON eng.STCD = sec.RSTCD " +
"INNER JOIN SD_WE_B_H section ON section.STCD = we.STCD " +
// " AND NVL(section.USFL, 0) = 1 " +
"LEFT JOIN SD_ENGINFO_B_H eng ON eng.STCD = section.RSTCD " +
" AND NVL(eng.IS_DELETED, 0) = 0 " +
"LEFT JOIN SD_FISHDICTORY_B dict ON dict.ID = fish.FTP " +
// " AND (dict.RVCD = 'ZY' OR dict.RVCD = eng.HBRVCD) " +

View File

@ -6,13 +6,11 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.yfd.platform.common.DataSourceRequest;
import com.yfd.platform.common.DataSourceResult;
import com.yfd.platform.common.exception.BizException;
import com.yfd.platform.common.utils.UserNameFillHelper;
import com.yfd.platform.config.ResponseResult;
import com.yfd.platform.qgc_base.service.ISdHbrvDicService;
import com.yfd.platform.qgc_env.wt.service.SdWtMonitorService;
import com.yfd.platform.qgc_lygk.along.domain.MsAlongB;
import com.yfd.platform.qgc_lygk.along.domain.PowerDto;
import com.yfd.platform.qgc_lygk.along.domain.SttpDto;
import com.yfd.platform.qgc_lygk.along.service.IMsAlongBService;
import com.yfd.platform.qgc_sys.mapcfg.service.IMapmoduleBService;
import com.yfd.platform.utils.DataSourceRequestUtil;
@ -43,9 +41,6 @@ public class MsAlongBController {
@Resource
private ISdHbrvDicService hbrvDicService;
@Resource
private UserNameFillHelper userNameFillHelper;
/**
* 条件过滤数据列表
*/
@ -53,7 +48,6 @@ public class MsAlongBController {
@PostMapping("/GetKendoList")
public ResponseResult getKendoList(@RequestBody DataSourceRequest dataSourceRequest) {
DataSourceResult<MsAlongB> result = msAlongBService.getKendoList(dataSourceRequest);
userNameFillHelper.fillUserNames(result.getData());
return ResponseResult.successData(result);
}
@ -105,11 +99,4 @@ public class MsAlongBController {
DataSourceResult<PowerDto> result = msAlongBService.getKendoPage(dataSourceRequest);
return ResponseResult.successData(result);
}
@PostMapping("/sttp/GetKendoList")
@Operation(summary = "查询站类信息列表支持模糊搜索和STTP_CODE过滤")
public ResponseResult getSttpList(@RequestBody DataSourceRequest dataSourceRequest) {
DataSourceResult<SttpDto> result = msAlongBService.getSttpList(dataSourceRequest);
return ResponseResult.successData(result);
}
}

View File

@ -4,8 +4,6 @@ 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 com.yfd.platform.annotation.UserIdField;
import com.yfd.platform.annotation.UserNameField;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
@ -49,12 +47,10 @@ public class MsAlongB implements Serializable {
/** 创建人 */
@TableField("RECORD_USER")
@UserIdField
private String recordUser;
/** 创建人名称(非数据库字段) */
@TableField(exist = false)
@UserNameField
private String recordUserName;
/** 创建时间 */

View File

@ -41,11 +41,7 @@ public class MsAlongDetB implements Serializable {
/** 排序序号 */
@TableField("SORT")
private Integer sort;
// /** 排序序号 */
// @TableField("SORT")
// private String sort;
private String sort;
/** 沿程配置表ID */
@TableField("ALONG_ID")

View File

@ -1,32 +0,0 @@
package com.yfd.platform.qgc_lygk.along.domain;
import lombok.Data;
import java.util.Date;
/**
* 站类信息查询结果 DTO
*/
@Data
public class SttpDto {
private String id;
private String sttpCode;
private String sttpName;
private String sttpSname;
private String description;
private Integer enabled;
private String parentId;
private String fullPath;
private Integer treeLevel;
private Integer hasChildren;
private String introduce;
private String logo;
private String inffile;
private Integer internal;
private Integer orderIndex;
private String recordUser;
private Date recordTime;
private String modifyUser;
private Date modifyTime;
}

View File

@ -5,7 +5,6 @@ import com.yfd.platform.common.DataSourceRequest;
import com.yfd.platform.common.DataSourceResult;
import com.yfd.platform.qgc_lygk.along.domain.MsAlongB;
import com.yfd.platform.qgc_lygk.along.domain.PowerDto;
import com.yfd.platform.qgc_lygk.along.domain.SttpDto;
import java.util.List;
@ -29,14 +28,6 @@ public interface IMsAlongBService extends IService<MsAlongB> {
DataSourceResult<PowerDto> getKendoPage(DataSourceRequest dataSourceRequest);
/**
* 查询站类信息列表支持模糊搜索和STTP_CODE过滤
*
* @param dataSourceRequest 数据源请求
* @return 数据源结果
*/
DataSourceResult<SttpDto> getSttpList(DataSourceRequest dataSourceRequest);
// /**
// * 保存或更新沿程配置
// *

View File

@ -13,7 +13,6 @@ import com.yfd.platform.qgc_base.domain.SdRvcdDic;
import com.yfd.platform.qgc_base.mapper.SdRvcdDicMapper;
import com.yfd.platform.qgc_lygk.along.domain.MsAlongB;
import com.yfd.platform.qgc_lygk.along.domain.PowerDto;
import com.yfd.platform.qgc_lygk.along.domain.SttpDto;
import com.yfd.platform.qgc_lygk.along.mapper.MsAlongBMapper;
import com.yfd.platform.qgc_lygk.along.service.IMsAlongBService;
import com.yfd.platform.utils.CodeToNameMetadataBo;
@ -155,127 +154,6 @@ public class MsAlongBServiceImpl extends ServiceImpl<MsAlongBMapper, MsAlongB> i
return result;
}
@Override
public DataSourceResult<SttpDto> getSttpList(DataSourceRequest dataSourceRequest) {
DataSourceLoadOptionsBase loadOptions = dataSourceRequest == null ? null : dataSourceRequest.toDevRequest();
StringBuilder sql = new StringBuilder("SELECT * FROM SD_STTP_B WHERE NVL(IS_DELETED, 0) = 0");
Map<String, Object> paramMap = new HashMap<>();
// 解析过滤条件
if (dataSourceRequest != null && dataSourceRequest.getFilter() != null) {
String filterSql = parseSttpFilter(dataSourceRequest.getFilter(), paramMap, new int[]{0});
if (StrUtil.isNotBlank(filterSql)) {
sql.append(" AND ").append(filterSql);
}
}
// 解析排序
if (dataSourceRequest != null && CollUtil.isNotEmpty(dataSourceRequest.getSort())) {
List<String> orderList = new ArrayList<>();
for (SortDescriptor sort : dataSourceRequest.getSort()) {
String field = sort.getField();
if (StrUtil.isBlank(field) || !isSafeSttpField(field)) continue;
String direction = "asc".equalsIgnoreCase(sort.getDir()) ? "ASC" : "DESC";
orderList.add(field + " " + direction);
}
if (!orderList.isEmpty()) {
sql.append(" ORDER BY ").append(String.join(", ", orderList));
}
} else {
sql.append(" ORDER BY ORDER_INDEX ASC, STTP_CODE ASC");
}
// 执行分页查询
Page<?> page = loadOptions == null ? null :
QgcQueryWrapperUtil.buildPage(loadOptions, loadOptions.getSkip(), loadOptions.getTake());
List<SttpDto> list = microservicDynamicSQLMapper.pageAllListWithResultType(
page, sql.toString(), paramMap, SttpDto.class
);
DataSourceResult<SttpDto> result = new DataSourceResult<>();
result.setData(list);
result.setTotal(page != null ? page.getTotal() : list.size());
result.setAggregates(new HashMap<>());
return result;
}
/**
* 递归解析站类过滤条件
*/
private String parseSttpFilter(FilterDescriptor filter, Map<String, Object> paramMap, int[] paramIndex) {
if (filter == null) return "";
List<FilterDescriptor> childFilters = filter.getFilters();
if (CollUtil.isNotEmpty(childFilters)) {
List<String> childConditions = new ArrayList<>();
for (FilterDescriptor child : childFilters) {
String childSql = parseSttpFilter(child, paramMap, paramIndex);
if (StrUtil.isNotBlank(childSql)) {
childConditions.add(childSql);
}
}
if (childConditions.isEmpty()) return "";
String logic = StrUtil.isNotBlank(filter.getLogic()) ? filter.getLogic() : "and";
String connector = "and".equalsIgnoreCase(logic) ? " AND " : " OR ";
return "(" + String.join(connector, childConditions) + ")";
}
String field = filter.getField();
Object value = filter.getValue();
String operator = filter.getOperator();
if (StrUtil.isBlank(field)) return "";
if (!isSafeSttpField(field)) return "";
String paramKey = "stp" + paramIndex[0]++;
paramMap.put(paramKey, value);
if ("contains".equalsIgnoreCase(operator)) {
return field + " LIKE '%' || #{map." + paramKey + "} || '%'";
} else if ("startswith".equalsIgnoreCase(operator)) {
return field + " LIKE #{map." + paramKey + "} || '%'";
} else if ("endswith".equalsIgnoreCase(operator)) {
return field + " LIKE '%' || #{map." + paramKey + "}";
} else if ("neq".equalsIgnoreCase(operator)) {
return field + " != #{map." + paramKey + "}";
} else if ("gt".equalsIgnoreCase(operator)) {
return field + " > #{map." + paramKey + "}";
} else if ("gte".equalsIgnoreCase(operator)) {
return field + " >= #{map." + paramKey + "}";
} else if ("lt".equalsIgnoreCase(operator)) {
return field + " < #{map." + paramKey + "}";
} else if ("lte".equalsIgnoreCase(operator)) {
return field + " <= #{map." + paramKey + "}";
} else if ("isnull".equalsIgnoreCase(operator)) {
paramMap.remove(paramKey);
return field + " IS NULL";
} else if ("isnotnull".equalsIgnoreCase(operator)) {
paramMap.remove(paramKey);
return field + " IS NOT NULL";
} else if (value == null) {
paramMap.remove(paramKey);
return "";
} else {
// 默认 eq
return field + " = #{map." + paramKey + "}";
}
}
/**
* 站类表安全字段白名单
*/
private boolean isSafeSttpField(String field) {
if (StrUtil.isBlank(field)) return false;
Set<String> validFields = new HashSet<>(Arrays.asList(
"ID", "STTP_CODE", "STTP_NAME", "STTP_SNAME", "DESCRIPTION",
"ENABLED", "PARENT_ID", "FULL_PATH", "TREE_LEVEL", "HAS_CHILDREN",
"INTRODUCE", "LOGO", "INFFILE", "INTERNAL", "ORDER_INDEX",
"IS_DELETED"
));
return validFields.contains(field.toUpperCase());
}
/**
* 递归解析 FilterDescriptor完美适配你的内部类结构
*/

View File

@ -81,7 +81,7 @@ public class MsAlongDetBServiceImpl extends ServiceImpl<MsAlongDetBMapper, MsAlo
List<PowerDto> powerDtos = msAlongDetBMapper.getWbsbList(stcd);
if (CollUtil.isNotEmpty(powerDtos)) {
// 取第一个结果通常一个 STCD 只对应一条记录
String stnm = powerDtos.getFirst().getStnm();
String stnm = powerDtos.get(0).getStnm();
record.setStnm(stnm);
}
}
@ -154,7 +154,7 @@ public class MsAlongDetBServiceImpl extends ServiceImpl<MsAlongDetBMapper, MsAlo
entity.setRecordUser(SecurityUtils.getUserId()); // 创建人
//entity.setRecordUser(SecurityUtils.getCurrentUsername()); // 创建人
if (node.getSort() != null){
entity.setSort(node.getSort()); // 若传了排序
entity.setSort(String.valueOf(node.getSort())); // 若传了排序
}
if (StrUtil.isBlank(entity.getId())) {
entity.setId(null);

View File

@ -1,119 +0,0 @@
package com.yfd.platform.qgc_sys.threedRoam.controller;
import cn.hutool.core.util.StrUtil;
import com.yfd.platform.common.DataSourceRequest;
import com.yfd.platform.common.DataSourceResult;
import com.yfd.platform.common.exception.BizException;
import com.yfd.platform.config.ResponseResult;
import com.yfd.platform.qgc_sys.threedRoam.domain.MsThreedRoamMEntity;
import com.yfd.platform.qgc_sys.threedRoam.dto.MsThreedRoamBVO;
import com.yfd.platform.qgc_sys.threedRoam.dto.MsThreedRoamMVO;
import com.yfd.platform.qgc_sys.threedRoam.service.IMsThreedRoamMService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.annotation.Resource;
import jakarta.servlet.http.HttpServletResponse;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import java.io.OutputStream;
import java.net.URLEncoder;
/**
* 三维漫游数据主表控制器
*
* @author migration
*/
@RestController
@RequestMapping("/threedroamb")
@Tag(name = "三维漫游数据主表控制器")
public class MsThreedRoamMController {
@Resource
private IMsThreedRoamMService msThreedRoamMService;
@PostMapping("/GetKendoListCust")
@Operation(summary = "条件过滤数据列表")
public ResponseResult getKendoListCust(@RequestBody DataSourceRequest dataSourceRequest) {
DataSourceResult<MsThreedRoamMEntity> result = msThreedRoamMService.getKendoListCustReturn(dataSourceRequest);
return ResponseResult.successData(result);
}
@PostMapping("/save")
@Operation(summary = "保存三维漫游数据")
public ResponseResult save(@RequestBody MsThreedRoamMVO vo) {
if (msThreedRoamMService.save(vo)) {
return ResponseResult.success();
} else {
return ResponseResult.error("三维漫游数据保存失败");
}
}
@GetMapping("/getThreedRoamDetails")
@Operation(summary = "获取三维漫游数据详情")
public ResponseResult getThreedRoamDetails(@RequestParam("id") String id) {
return ResponseResult.successData(msThreedRoamMService.getThreedRoamDetails(id));
}
@GetMapping("/delete")
@Operation(summary = "删除三维漫游数据")
public ResponseResult delete(@RequestParam("id") String id) {
if (msThreedRoamMService.delete(id)) {
return ResponseResult.success();
} else {
return ResponseResult.error("三维漫游数据删除失败");
}
}
@PostMapping("/getThreedRoamData")
@Operation(summary = "三维漫游数据")
public MsThreedRoamBVO getThreedRoamData(@RequestBody DataSourceRequest dataSourceRequest) {
return msThreedRoamMService.getThreedRoamData(dataSourceRequest);
}
@PostMapping("/export")
@Operation(summary = "导出三维漫游数据模板")
public void export(HttpServletResponse response) {
try {
String fileName = "三维漫游数据模板";
XSSFWorkbook workBook = new XSSFWorkbook();
XSSFSheet sheet = workBook.createSheet();
workBook.setSheetName(0, "三维漫游数据模板");
XSSFRow row = sheet.createRow(0);
row.createCell(0).setCellValue("飞行路径Code");
row.createCell(1).setCellValue("飞行路径名称");
row.createCell(2).setCellValue("经度\u00B0(0-180\u00B0)");
row.createCell(3).setCellValue("纬度\u00B0(0-90\u00B0)");
row.createCell(4).setCellValue("高程(m)(小于10000m)");
row.createCell(5).setCellValue("时间(s)(小于100s)");
row.createCell(6).setCellValue("序号");
row.createCell(7).setCellValue("里程碑节点编码(电站编码)");
row.createCell(8).setCellValue("里程碑节点名称(电站名称)");
response.setContentType("application/vnd.ms-excel;charset=utf-8");
response.setHeader("Content-Disposition", "attachment;filename="
+ URLEncoder.encode(fileName, "utf-8") + ".xlsx");
OutputStream outputStream = response.getOutputStream();
workBook.write(outputStream);
outputStream.flush();
outputStream.close();
} catch (Exception e) {
// ignore
}
}
@PostMapping("/import")
@Operation(summary = "导入三维漫游数据")
public ResponseResult importExcel(MultipartFile file) {
if (msThreedRoamMService.importData(file)) {
return ResponseResult.success();
} else {
return ResponseResult.error("导入三维漫游数据失败");
}
}
}

View File

@ -1,78 +0,0 @@
package com.yfd.platform.qgc_sys.threedRoam.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.math.BigDecimal;
import java.util.Date;
/**
* 三维漫游数据表实体子表
*
* @author migration
*/
@Data
@TableName("MS_THREEDROAM_B")
public class MsThreedRoamEntity implements Serializable {
private static final long serialVersionUID = 1L;
@TableId(type = IdType.ASSIGN_UUID)
@TableField("ID")
private String id;
@TableField("ROAM_ID")
private String roamId;
@TableField("CODE")
private String code;
@TableField("NAME")
private String name;
@TableField("LGTD")
private BigDecimal lgtd;
@TableField("LTTD")
private BigDecimal lttd;
@TableField("DTMEL")
private BigDecimal dtmel;
@TableField("TIME")
private BigDecimal time;
@TableField("ORDER_INDEX")
private Integer orderIndex;
@TableField("STCD")
private String stcd;
@TableField("STNM")
private String stnm;
@TableField("RECORD_USER")
private String recordUser;
@TableField("RECORD_TIME")
private Date recordTime;
@TableField("MODIFY_USER")
private String modifyUser;
@TableField("MODIFY_TIME")
private Date modifyTime;
@TableField("IS_DELETED")
private Integer isDeleted;
@TableField("DELETE_USER")
private String deleteUser;
@TableField("DELETE_TIME")
private Date deleteTime;
}

View File

@ -1,71 +0,0 @@
package com.yfd.platform.qgc_sys.threedRoam.domain;
import com.baomidou.mybatisplus.annotation.*;
import lombok.Data;
import java.io.Serializable;
import java.util.Date;
/**
* 三维漫游数据主表实体
*
* @author migration
*/
@Data
@TableName("MS_THREEDROAMM_B")
public class MsThreedRoamMEntity implements Serializable {
private static final long serialVersionUID = 1L;
@TableId(type = IdType.ASSIGN_UUID)
@TableField("ID")
private String id;
@TableField("CODE")
private String code;
@TableField("NAME")
private String name;
@TableField("RVCD")
private String rvcd;
@TableField("REMARK")
private String remark;
@TableField(value = "RECORD_USER",fill = FieldFill.INSERT)
private String recordUser;
@TableField(value = "RECORD_TIME",fill = FieldFill.INSERT)
private Date recordTime;
@TableField(value = "MODIFY_USER",fill = FieldFill.INSERT_UPDATE)
private String modifyUser;
@TableField(value = "MODIFY_TIME",fill = FieldFill.INSERT_UPDATE)
private Date modifyTime;
@TableField("IS_DELETED")
private Integer isDeleted;
@TableField("DELETE_USER")
private String deleteUser;
@TableField("DELETE_TIME")
private Date deleteTime;
@TableField("BASE_ID")
private String baseId;
/** 河段名称(非表字段,查询时填充) */
@TableField(exist = false)
private String rvcdName;
/** 基地编码(非表字段,查询时填充) */
@TableField(exist = false)
private String bscd;
/** 基地名称(非表字段,查询时填充) */
@TableField(exist = false)
private String bsnm;
}

View File

@ -1,27 +0,0 @@
package com.yfd.platform.qgc_sys.threedRoam.dto;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.math.BigDecimal;
import java.util.List;
/**
* 三维漫游飞行路径数据查询结果 VO
*/
@Data
@Schema(description = "三维漫游飞行路径数据")
public class MsThreedRoamBVO {
@Schema(description = "数据集合 (坐标序列: totalTime, lgtd, lttd, dtmel, ...)")
private List<Object> list;
@Schema(description = "里程碑集合")
private List<String[]> milestoneList;
@Schema(description = "流域/编码")
private String code;
@Schema(description = "总时间")
private BigDecimal totalTime;
}

View File

@ -1,36 +0,0 @@
package com.yfd.platform.qgc_sys.threedRoam.dto;
import com.yfd.platform.qgc_sys.threedRoam.domain.MsThreedRoamEntity;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.util.List;
/**
* 三维漫游数据保存/查询 VO
*/
@Data
@Schema(description = "三维漫游数据")
public class MsThreedRoamMVO {
@Schema(description = "主键")
private String id;
@Schema(description = "编码")
private String code;
@Schema(description = "名称")
private String name;
@Schema(description = "河段")
private String rvcd;
@Schema(description = "河段")
private String baseId;
@Schema(description = "备注")
private String remark;
@Schema(description = "漫游数据集合")
private List<MsThreedRoamEntity> list;
}

View File

@ -1,50 +0,0 @@
package com.yfd.platform.qgc_sys.threedRoam.dto;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.util.Date;
/**
* 三维漫游列表 VO
*/
@Data
@Schema(description = "三维漫游列表")
public class MsThreedRoamVO {
@Schema(description = "主键")
private String id;
@Schema(description = "编码")
private String code;
@Schema(description = "名称")
private String name;
@Schema(description = "备注")
private String remark;
@Schema(description = "创建人")
private String recordUser;
@Schema(description = "更新人")
private String modifyUser;
@Schema(description = "创建时间")
private Date recordTime;
@Schema(description = "更新时间")
private Date modifyTime;
@Schema(description = "河段编码")
private String rvcd;
@Schema(description = "河段名称")
private String rvcdName;
@Schema(description = "基地编码")
private String bscd;
@Schema(description = "基地名称")
private String bsnm;
}

View File

@ -1,12 +0,0 @@
package com.yfd.platform.qgc_sys.threedRoam.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.yfd.platform.qgc_sys.threedRoam.domain.MsThreedRoamMEntity;
import org.apache.ibatis.annotations.Mapper;
/**
* 三维漫游数据主表 Mapper
*/
@Mapper
public interface MsThreedRoamMMapper extends BaseMapper<MsThreedRoamMEntity> {
}

View File

@ -1,30 +0,0 @@
package com.yfd.platform.qgc_sys.threedRoam.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.yfd.platform.qgc_sys.threedRoam.domain.MsThreedRoamEntity;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import java.util.List;
/**
* 三维漫游数据子表 Mapper
*/
@Mapper
public interface MsThreedRoamMapper extends BaseMapper<MsThreedRoamEntity> {
/**
* 批量插入漫游详细数据
*/
int batchInsertList(@Param("list") List<MsThreedRoamEntity> list);
/**
* 根据漫游ID删除详细数据
*/
void deleteTheedRoam(@Param("roamId") String roamId);
/**
* 查询电站编码和名称校验里程碑节点是否存在
*/
MsThreedRoamEntity selectStcd(@Param("stcd") String stcd);
}

View File

@ -1,44 +0,0 @@
package com.yfd.platform.qgc_sys.threedRoam.service;
import com.yfd.platform.common.DataSourceRequest;
import com.yfd.platform.common.DataSourceResult;
import com.yfd.platform.qgc_sys.threedRoam.domain.MsThreedRoamMEntity;
import com.yfd.platform.qgc_sys.threedRoam.dto.MsThreedRoamBVO;
import com.yfd.platform.qgc_sys.threedRoam.dto.MsThreedRoamMVO;
import org.springframework.web.multipart.MultipartFile;
/**
* 三维漫游数据主表 Service 接口
*/
public interface IMsThreedRoamMService {
/**
* 条件过滤数据列表GetKendoListCust
*/
DataSourceResult<MsThreedRoamMEntity> getKendoListCustReturn(DataSourceRequest dataSourceRequest);
/**
* 保存三维漫游数据
*/
Boolean save(MsThreedRoamMVO vo);
/**
* 获取三维漫游数据详情
*/
MsThreedRoamMVO getThreedRoamDetails(String id);
/**
* 删除三维漫游数据
*/
Boolean delete(String id);
/**
* 获取三维漫游飞行路径数据
*/
MsThreedRoamBVO getThreedRoamData(DataSourceRequest dataSourceRequest);
/**
* 导入三维漫游数据
*/
Boolean importData(MultipartFile file);
}

View File

@ -1,418 +0,0 @@
package com.yfd.platform.qgc_sys.threedRoam.service.impl;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.yfd.platform.common.DataSourceLoadOptionsBase;
import com.yfd.platform.common.DataSourceRequest;
import com.yfd.platform.common.DataSourceResult;
import com.yfd.platform.common.MicroservicDynamicSQLMapper;
import com.yfd.platform.common.exception.BizException;
import com.yfd.platform.qgc_sys.threedRoam.domain.MsThreedRoamEntity;
import com.yfd.platform.qgc_sys.threedRoam.domain.MsThreedRoamMEntity;
import com.yfd.platform.qgc_sys.threedRoam.dto.MsThreedRoamBVO;
import com.yfd.platform.qgc_sys.threedRoam.dto.MsThreedRoamMVO;
import com.yfd.platform.qgc_sys.threedRoam.mapper.MsThreedRoamMMapper;
import com.yfd.platform.qgc_sys.threedRoam.mapper.MsThreedRoamMapper;
import com.yfd.platform.qgc_sys.threedRoam.service.IMsThreedRoamMService;
import com.yfd.platform.utils.QgcQueryWrapperUtil;
import jakarta.annotation.Resource;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.multipart.MultipartFile;
import java.io.IOException;
import java.math.BigDecimal;
import java.util.*;
import java.util.stream.Collectors;
/**
* 三维漫游数据主表 Service 实现类
*/
@Service
public class MsThreedRoamMServiceImpl extends ServiceImpl<MsThreedRoamMMapper, MsThreedRoamMEntity> implements IMsThreedRoamMService {
@Resource
private MicroservicDynamicSQLMapper microservicDynamicSQLMapper;
@Resource
private MsThreedRoamMapper msThreedRoamMapper;
@Resource
private MsThreedRoamMMapper msThreedRoamMMapper;
@Override
public DataSourceResult<MsThreedRoamMEntity> getKendoListCustReturn(DataSourceRequest dataSourceRequest) {
DataSourceLoadOptionsBase loadOptions = dataSourceRequest == null ? null : dataSourceRequest.toDevRequest();
StringBuilder sql = new StringBuilder();
sql.append("SELECT a.ID, a.CODE, a.NAME, a.RVCD, b.HBRVNM AS rvcdName, a.REMARK, ")
.append("a.RECORD_USER, a.RECORD_TIME, a.MODIFY_USER, a.MODIFY_TIME, ")
.append("c.BASEID AS bscd, c.BASENAME AS bsnm ")
.append("FROM MS_THREEDROAMM_B a ")
.append("LEFT JOIN SD_HBRV_DIC b ON a.RVCD = b.HBRVCD AND b.IS_DELETED = 0 ")
.append("LEFT JOIN SD_HYDROBASE c ON b.BASEID = c.BASEID AND c.IS_DELETED = 0 ")
.append("WHERE a.IS_DELETED = 0");
Map<String, Object> paramMap = new HashMap<>();
String filterSql = buildFilterSql(dataSourceRequest == null ? null : dataSourceRequest.getFilter(), paramMap, new int[]{0});
if (StrUtil.isNotBlank(filterSql)) {
sql.append(" AND ").append(filterSql);
}
// 排序
sql.append(" ORDER BY a.CODE ASC");
Page<?> page = loadOptions == null ? null
: QgcQueryWrapperUtil.buildPage(loadOptions, loadOptions.getSkip(), loadOptions.getTake());
List<MsThreedRoamMEntity> list = microservicDynamicSQLMapper.pageAllListWithResultType(
page, sql.toString(), paramMap, MsThreedRoamMEntity.class
);
DataSourceResult<MsThreedRoamMEntity> result = new DataSourceResult<>();
result.setData(list);
result.setTotal(page == null ? list.size() : page.getTotal());
result.setAggregates(new HashMap<>());
return result;
}
/**
* 递归构建过滤 SQL
*/
private String buildFilterSql(com.yfd.platform.common.DataSourceRequest.FilterDescriptor filter,
Map<String, Object> paramMap, int[] indexHolder) {
if (filter == null) return "";
List<com.yfd.platform.common.DataSourceRequest.FilterDescriptor> childFilters = filter.getFilters();
if (CollUtil.isNotEmpty(childFilters)) {
List<String> childConditions = new ArrayList<>();
for (com.yfd.platform.common.DataSourceRequest.FilterDescriptor child : childFilters) {
String childSql = buildFilterSql(child, paramMap, indexHolder);
if (StrUtil.isNotBlank(childSql)) {
childConditions.add(childSql);
}
}
if (childConditions.isEmpty()) return "";
String logic = StrUtil.isNotBlank(filter.getLogic()) ? filter.getLogic() : "and";
String connector = "and".equalsIgnoreCase(logic) ? " AND " : " OR ";
return "(" + String.join(connector, childConditions) + ")";
}
String field = filter.getField();
Object value = filter.getValue();
String operator = filter.getOperator();
if (StrUtil.isBlank(field)) return "";
String column = mapToListColumn(field);
if (StrUtil.isBlank(column)) return "";
if ("isnull".equalsIgnoreCase(operator)) return column + " IS NULL";
if ("isnotnull".equalsIgnoreCase(operator)) return column + " IS NOT NULL";
if (value == null) return "";
String paramKey = "t" + indexHolder[0]++;
paramMap.put(paramKey, value);
if ("eq".equalsIgnoreCase(operator)) {
return column + " = #{map." + paramKey + "}";
} else if ("neq".equalsIgnoreCase(operator)) {
return column + " != #{map." + paramKey + "}";
} else if ("contains".equalsIgnoreCase(operator)) {
return column + " LIKE '%' || #{map." + paramKey + "} || '%'";
} else if ("startswith".equalsIgnoreCase(operator)) {
return column + " LIKE #{map." + paramKey + "} || '%'";
} else if ("endswith".equalsIgnoreCase(operator)) {
return column + " LIKE '%' || #{map." + paramKey + "}";
}
return "";
}
private String mapToListColumn(String field) {
if (StrUtil.isBlank(field)) return null;
return switch (field) {
case "code" -> "a.CODE";
case "name" -> "a.NAME";
case "rvcd" -> "a.RVCD";
case "remark" -> "a.REMARK";
default -> null;
};
}
@Override
@Transactional(rollbackFor = Exception.class)
public Boolean save(MsThreedRoamMVO vo) {
MsThreedRoamMEntity entity = new MsThreedRoamMEntity();
BeanUtils.copyProperties(vo, entity);
// 校验编码是否存在
if (!checkCodeExist(entity)) {
throw new BizException("该编码已存在");
}
boolean result;
if (StrUtil.isNotBlank(entity.getId())) {
result = this.updateById(entity);
} else {
result = this.save(entity);
}
if (result && CollUtil.isNotEmpty(vo.getList())) {
// 删除旧数据
msThreedRoamMapper.deleteTheedRoam(entity.getId());
// 批量插入新数据
List<MsThreedRoamEntity> batchList = new ArrayList<>();
List<MsThreedRoamEntity> detailList = vo.getList();
for (int i = 0; i < detailList.size(); i++) {
MsThreedRoamEntity detail = detailList.get(i);
if (StrUtil.isBlank(detail.getStcd())) {
detail.setStcd("");
}
if (StrUtil.isBlank(detail.getStnm())) {
detail.setStnm("");
}
detail.setRoamId(entity.getId());
detail.setCode(vo.getCode());
detail.setName(vo.getName());
batchList.add(detail);
if (batchList.size() == 2000 || i == detailList.size() - 1) {
int fruit = msThreedRoamMapper.batchInsertList(batchList);
if (fruit < 1) {
throw new BizException("保存三维漫游数据失败");
}
batchList = new ArrayList<>();
}
}
}
return result;
}
/**
* 校验编码是否存在修改时排除自身
*/
private boolean checkCodeExist(MsThreedRoamMEntity entity) {
QueryWrapper<MsThreedRoamMEntity> wrapper = new QueryWrapper<>();
wrapper.eq("CODE", entity.getCode());
MsThreedRoamMEntity exist = msThreedRoamMMapper.selectOne(wrapper);
if (exist != null && !exist.getId().equals(entity.getId())) {
return false;
}
return true;
}
@Override
public MsThreedRoamMVO getThreedRoamDetails(String id) {
MsThreedRoamMVO vo = new MsThreedRoamMVO();
MsThreedRoamMEntity entity = msThreedRoamMMapper.selectById(id);
if (entity != null) {
BeanUtils.copyProperties(entity, vo);
QueryWrapper<MsThreedRoamEntity> wrapper = new QueryWrapper<>();
wrapper.eq("ROAM_ID", id);
wrapper.orderByAsc("ORDER_INDEX");
List<MsThreedRoamEntity> list = msThreedRoamMapper.selectList(wrapper);
vo.setList(list);
}
return vo;
}
@Override
@Transactional(rollbackFor = Exception.class)
public Boolean delete(String id) {
// 删除子表数据
QueryWrapper<MsThreedRoamEntity> wrapper = new QueryWrapper<>();
wrapper.eq("ROAM_ID", id);
List<MsThreedRoamEntity> list = msThreedRoamMapper.selectList(wrapper);
if (CollUtil.isNotEmpty(list)) {
msThreedRoamMapper.delete(wrapper);
}
// 删除主表数据
int result = msThreedRoamMMapper.deleteById(id);
return result > 0;
}
@Override
public MsThreedRoamBVO getThreedRoamData(DataSourceRequest dataSourceRequest) {
DataSourceLoadOptionsBase loadOptions = dataSourceRequest.toDevRequest();
String code = QgcQueryWrapperUtil.getFilterFieldValue(loadOptions, "code");
MsThreedRoamMEntity entity = msThreedRoamMMapper.selectOne(
new QueryWrapper<MsThreedRoamMEntity>().eq("CODE", code));
if (entity == null) {
throw new BizException("该流域没有三维漫游数据");
}
QueryWrapper<MsThreedRoamEntity> wrapper = new QueryWrapper<>();
wrapper.eq("ROAM_ID", entity.getId());
wrapper.orderByAsc("ORDER_INDEX");
List<MsThreedRoamEntity> threedRoamList = msThreedRoamMapper.selectList(wrapper);
BigDecimal totalTime = BigDecimal.ZERO;
List<Object> lists = new ArrayList<>();
String baseCode = "";
List<String[]> milestoneList = new ArrayList<>();
List<String> stcdList = new ArrayList<>();
for (MsThreedRoamEntity detail : threedRoamList) {
totalTime = totalTime.add(detail.getTime().multiply(new BigDecimal("0.2")));
lists.add(totalTime);
lists.add(detail.getLgtd());
lists.add(detail.getLttd());
lists.add(detail.getDtmel());
baseCode = detail.getCode();
if (StrUtil.isNotBlank(detail.getStcd()) && !stcdList.contains(detail.getStnm())) {
stcdList.add(detail.getStnm());
milestoneList.add(new String[]{detail.getStnm(), totalTime.toString()});
}
}
MsThreedRoamBVO vo = new MsThreedRoamBVO();
vo.setList(lists);
vo.setTotalTime(totalTime);
vo.setCode(baseCode);
vo.setMilestoneList(milestoneList);
return vo;
}
@Override
public Boolean importData(MultipartFile file) {
if (file == null) {
throw new BizException("请上传文件");
}
List<MsThreedRoamEntity> list = new ArrayList<>();
try {
XSSFWorkbook workbook = new XSSFWorkbook(file.getInputStream());
int sheets = workbook.getNumberOfSheets();
for (int i = 0; i < sheets; i++) {
XSSFSheet sheet = workbook.getSheetAt(i);
int rows = sheet.getPhysicalNumberOfRows();
for (int j = 1; j < rows; j++) {
MsThreedRoamEntity detail = new MsThreedRoamEntity();
XSSFRow row = sheet.getRow(j);
detail.setCode(row.getCell(0).toString());
detail.setName(row.getCell(1).toString());
double lgtd = Double.parseDouble(row.getCell(2).toString());
if (lgtd > 180 || lgtd < 0) {
throw new BizException("经度必须在0-180\u00B0之间");
}
detail.setLgtd(new BigDecimal(row.getCell(2).toString()));
double lttd = Double.parseDouble(row.getCell(3).toString());
if (lttd > 90 || lttd < 0) {
throw new BizException("纬度必须在0-90\u00B0之间");
}
detail.setLttd(new BigDecimal(row.getCell(3).toString()));
double dtmel = Double.parseDouble(row.getCell(4).toString());
if (dtmel >= 10000 || dtmel < 0) {
throw new BizException("高程小于10000米");
}
detail.setDtmel(new BigDecimal(row.getCell(4).toString()).setScale(3, BigDecimal.ROUND_HALF_UP));
double time = Double.parseDouble(row.getCell(5).toString());
if (time >= 100 || time < 0) {
throw new BizException("时间小于100秒");
}
detail.setTime(new BigDecimal(row.getCell(5).toString()).setScale(1, BigDecimal.ROUND_HALF_UP));
int px = (int) Double.parseDouble(row.getCell(6).toString());
detail.setOrderIndex(px);
if (row.getCell(7) != null && StrUtil.isNotBlank(row.getCell(7).toString())) {
detail.setStcd(row.getCell(7).toString());
} else {
detail.setStcd("");
}
if (row.getCell(8) != null && StrUtil.isNotBlank(row.getCell(8).toString())) {
detail.setStnm(row.getCell(8).toString());
} else {
detail.setStnm("");
}
list.add(detail);
}
}
} catch (IOException e) {
throw new BizException("导入文档解析错误");
}
return saveImportData(list);
}
/**
* 保存导入数据
*/
@Transactional(rollbackFor = Exception.class)
public Boolean saveImportData(List<MsThreedRoamEntity> list) {
Map<String, List<MsThreedRoamEntity>> collect = list.stream()
.collect(Collectors.groupingBy(MsThreedRoamEntity::getCode));
collect.forEach((code, roamList) -> {
MsThreedRoamMEntity entity = msThreedRoamMMapper.selectOne(
new QueryWrapper<MsThreedRoamMEntity>().eq("CODE", code));
if (entity == null) {
entity = new MsThreedRoamMEntity();
entity.setCode(code);
}
entity.setName(roamList.get(0).getName());
boolean result;
if (StrUtil.isNotBlank(entity.getId())) {
result = this.updateById(entity);
} else {
result = this.save(entity);
}
if (result) {
msThreedRoamMapper.deleteTheedRoam(entity.getId());
List<MsThreedRoamEntity> batchList = new ArrayList<>();
List<String> stcdExistList = new ArrayList<>();
List<String> newStcdList = new ArrayList<>();
for (int i = 0; i < roamList.size(); i++) {
MsThreedRoamEntity detail = roamList.get(i);
detail.setRoamId(entity.getId());
if (StrUtil.isNotBlank(detail.getStcd())) {
if (!stcdExistList.contains(detail.getStcd()) && !newStcdList.contains(detail.getStcd())) {
MsThreedRoamEntity stcdEntity = msThreedRoamMapper.selectStcd(detail.getStcd());
if (stcdEntity != null) {
stcdExistList.add(detail.getStcd());
} else {
newStcdList.add(detail.getStcd());
detail.setStcd("");
detail.setStnm("");
}
} else if (newStcdList.contains(detail.getStcd())) {
detail.setStcd("");
detail.setStnm("");
}
}
batchList.add(detail);
if (batchList.size() == 2000 || i == roamList.size() - 1) {
int fruit = msThreedRoamMapper.batchInsertList(batchList);
if (fruit < 1) {
throw new BizException("导入三维漫游数据失败");
}
batchList = new ArrayList<>();
}
}
}
});
return true;
}
}

View File

@ -1,30 +0,0 @@
package com.yfd.platform.utils;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.CompletableFuture;
public class AsyncWithCompletableFuture {
public static void main(String[] args) throws Exception {
// 异步执行任务返回 CompletableFuture
CompletableFuture<List<String>> future = CompletableFuture.supplyAsync(() -> {
List<String> list = new ArrayList<>();
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
return list;
});
// 注册回调非阻塞
future.thenAccept(result -> System.out.println("回调收到结果: " + result));
// 主线程继续执行
System.out.println("主线程继续...");
// 防止主线程提前退出如果不想阻塞可以省略
future.join(); // future.get()
}
}

View File

@ -11,10 +11,8 @@ spring:
type: com.alibaba.druid.pool.DruidDataSource
druid:
master:
# driverClassName: oracle.jdbc.OracleDriver
# url: "${DB_MASTER_URL:jdbc:oracle:thin:@172.16.31.190:1521/SDLYZ}"
driverClassName: dm.jdbc.driver.DmDriver
url: "${DB_MASTER_URL:jdbc:dm://172.16.21.143:5236/QGC_REFA}"
driverClassName: oracle.jdbc.OracleDriver
url: "${DB_MASTER_URL:jdbc:oracle:thin:@172.16.31.190:1521/SDLYZ}"
username: "${DB_MASTER_USERNAME:QGC_REFA}"
password: "${DB_MASTER_PASSWORD:Y4M4K1oCkL8U}"
initial-size: 5
@ -37,17 +35,14 @@ spring:
remove-abandoned-timeout: 1800
log-abandoned: true
break-after-acquire-failure: true
time-between-connect-error-millis: 30000
time-between-connect-error-millis: 300000
pool-prepared-statements: true
max-open-prepared-statements: 100
max-pool-prepared-statement-per-connection-size: 100
connection-properties: connectTimeout=10000;oracle.jdbc.ReadTimeout=60000;oracle.net.READ_TIMEOUT=60000
# connection-properties: oracle.net.CONNECT_TIMEOUT=10000;oracle.jdbc.ReadTimeout=60000;oracle.net.READ_TIMEOUT=60000
connection-properties: oracle.net.CONNECT_TIMEOUT=10000;oracle.jdbc.ReadTimeout=60000;oracle.net.READ_TIMEOUT=60000
slave:
driverClassName: dm.jdbc.driver.DmDriver
url: "${DB_MASTER_URL:jdbc:dm://172.16.21.143:5236/QGC_REFA}"
# driverClassName: oracle.jdbc.OracleDriver
# url: "${DB_SLAVE_URL:jdbc:oracle:thin:@172.16.31.190:1521/SDLYZ}"
driverClassName: oracle.jdbc.OracleDriver
url: "${DB_SLAVE_URL:jdbc:oracle:thin:@172.16.31.190:1521/SDLYZ}"
username: "${DB_SLAVE_USERNAME:QGC_REFA}"
password: "${DB_SLAVE_PASSWORD:Y4M4K1oCkL8U}"
initial-size: 5
@ -70,12 +65,11 @@ spring:
remove-abandoned-timeout: 1800
log-abandoned: true
break-after-acquire-failure: true
time-between-connect-error-millis: 30000
time-between-connect-error-millis: 300000
pool-prepared-statements: true
max-open-prepared-statements: 100
max-pool-prepared-statement-per-connection-size: 100
connection-properties: connectTimeout=10000;oracle.jdbc.ReadTimeout=60000;oracle.net.READ_TIMEOUT=60000
# connection-properties: oracle.net.CONNECT_TIMEOUT=10000;oracle.jdbc.ReadTimeout=60000;oracle.net.READ_TIMEOUT=60000
connection-properties: oracle.net.CONNECT_TIMEOUT=10000;oracle.jdbc.ReadTimeout=60000;oracle.net.READ_TIMEOUT=60000
filter:
stat:
enabled: true

View File

@ -191,66 +191,6 @@
ORDER BY D.TM DESC, D.ROW_INDEX ASC
</select>
<select id="selectJoinPageWithStationScope" resultMap="JoinResultMap">
SELECT
<include refid="joinColumns"/>
FROM FISH_DRAFT_DATA D
LEFT JOIN SD_FPSS_B_H F ON D.STCD = F.STCD
LEFT JOIN SD_FISHDICTORY_B FB ON FB.ID = D.FTP
LEFT JOIN SD_ENGINFO_B_H E ON F.RSTCD = E.STCD
LEFT JOIN SD_HYDROBASE H ON E.BASE_ID = H.BASEID
<include refid="rvcdDisplayJoin"/>
WHERE D.DELETED_FLAG = 0
<if test="stcd != null and stcd != ''">
AND D.STCD = #{stcd}
</if>
<if test="userId != null and userId != ''">
AND D.CREATED_BY = #{userId}
</if>
<if test="ftp != null and ftp != ''">
AND D.FTP = #{ftp}
</if>
<if test="rstcd != null and rstcd != ''">
AND F.RSTCD = #{rstcd}
</if>
<if test="baseId != null and baseId != ''">
AND E.BASE_ID = #{baseId}
</if>
<if test="rvcd != null and rvcd != ''">
AND E.REACHCD = #{rvcd}
</if>
<if test="hbrvcd != null and hbrvcd != ''">
AND E.HBRVCD = #{hbrvcd}
</if>
<if test="direction != null and direction != ''">
AND D.DIRECTION = #{direction}
</if>
<if test="status != null and status != ''">
AND D.STATUS = #{status}
</if>
<if test="approvalId != null and approvalId != ''">
AND D.APPROVAL_ID = #{approvalId}
</if>
<if test="startTime != null and startTime != ''">
AND D.STRDT &gt;= TO_DATE(#{startTime}, 'yyyy-mm-dd hh24:mi:ss')
</if>
<if test="endTime != null and endTime != ''">
AND D.STRDT &lt;= TO_DATE(#{endTime}, 'yyyy-mm-dd hh24:mi:ss')
</if>
<if test="stationCodes != null and stationCodes.size() > 0">
AND D.STCD IN (
SELECT F2.STCD
FROM SD_FPSS_B_H F2
INNER JOIN SD_ENGINFO_B_H E2 ON F2.RSTCD = E2.STCD
WHERE E2.STCD IN
<foreach collection="stationCodes" item="code" open="(" separator="," close=")">
#{code}
</foreach>
)
</if>
ORDER BY H.ORDER_INDEX ASC,E.ORDER_INDEX ASC, D.TM DESC, D.ROW_INDEX ASC
</select>
<select id="selectJoinList" resultMap="JoinResultMap">
SELECT
<include refid="joinColumns"/>

View File

@ -1,43 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.yfd.platform.qgc_sys.threedRoam.mapper.MsThreedRoamMapper">
<insert id="batchInsertList" parameterType="List">
INSERT INTO MS_THREEDROAM_B(ROAM_ID, CODE, NAME, LGTD, LTTD, DTMEL, TIME, ORDER_INDEX, STCD, STNM)
SELECT *
FROM (
<foreach collection="list" item="item" separator="union all">
SELECT
#{item.roamId} AS roamId,
#{item.code} AS code,
#{item.name} AS name,
#{item.lgtd} AS lgtd,
#{item.lttd} AS lttd,
#{item.dtmel} AS dtmel,
#{item.time} AS time,
#{item.orderIndex} AS orderIndex,
#{item.stcd} AS stcd,
#{item.stnm} AS stnm
FROM DUAL
</foreach>
)
</insert>
<delete id="deleteTheedRoam" parameterType="java.lang.String">
DELETE FROM MS_THREEDROAM_B
<where>
<if test="roamId != null and roamId != ''">
AND ROAM_ID = #{roamId}
</if>
</where>
</delete>
<select id="selectStcd" resultType="com.yfd.platform.qgc_sys.threedRoam.domain.MsThreedRoamEntity">
SELECT STCD, STNM FROM V_MS_STBPRP_T
WHERE STTP_CODE = 'ENG'
<if test="stcd != null and stcd != ''">
AND STCD = #{stcd}
</if>
</select>
</mapper>

View File

@ -12,7 +12,6 @@
"dependencies": {
"@ant-design/icons-vue": "^7.0.1",
"@element-plus/icons-vue": "^2.0.10",
"@turf/turf": "^7.3.5",
"@types/js-cookie": "^3.0.2",
"@univerjs-pro/exchange-client": "0.15.0",
"@univerjs/core": "0.14.0",

File diff suppressed because it is too large Load Diff

View File

@ -9,18 +9,9 @@ import {
} from '@/utils/popupHtmlGenerator';
import { useModelStore } from '@/store/modules/model';
import { getNearbyPointDensityDisplayRules } from '@/modules/map/domain/nearby-point-rules';
import {
LoadOSGB,
removeQxsy,
osgbChangeClick,
osgbLocation,
type OSGBItem
} from './osgbUtils';
export class MapCesium implements MapInterface {
private viewer: Cesium.Viewer | null = null;
private _ready = false;
private _pendingOSGBItems: OSGBItem[] = [];
private clickEventHandler: Cesium.ScreenSpaceEventHandler | null = null;
private popupElement: HTMLElement | null = null;
private hoveredEntityId: string | null = null;
@ -109,7 +100,6 @@ export class MapCesium implements MapInterface {
this.containerId = container.id;
this.containerElement = container;
this.showLoadingOverlay(container);
const token = 'bearer fa8aa37c-1e52-4631-a699-625b4147ace8';
this.viewer = new Cesium.Viewer(container, {
animation: false,
@ -124,33 +114,35 @@ export class MapCesium implements MapInterface {
infoBox: false,
selectionIndicator: false,
shouldAnimate: true,
requestRenderMode: false,
requestRenderMode: true,
targetFrameRate: 30,
terrainProvider: new Cesium.EllipsoidTerrainProvider() // 默认不使用地形
terrainProvider: new Cesium.EllipsoidTerrainProvider()
});
this.viewer.cesiumWidget.creditContainer.style.display = 'none';
const layers = this.viewer.imageryLayers;
layers.removeAll();
const arcgisUrl =
'https://server.arcgisonline.com/ArcGIS/rest/services/World_Imagery/MapServer/';
// const provider = await Cesium.ArcGisMapServerImageryProvider.fromUrl(
// arcgisUrl,
// {
// enablePickFeatures: false,
// maximumLevel: 19
// }
// );
const provider = new Cesium.UrlTemplateImageryProvider({
url: 'https://server.arcgisonline.com/ArcGIS/rest/services/World_Imagery/MapServer/tile/{z}/{y}/{x}',
maximumLevel: 19,
credit:
'Esri, DigitalGlobe, GeoEye, i-cubed, USDA FSA, USGS, AEX, Getmapping, Aerogrid, IGN, IGP, swisstopo, and the GIS User Community'
});
const customTerrain = await Cesium.CesiumTerrainProvider.fromUrl(
import.meta.env.VITE_APP_MAP_URL + '/Terrain?token=' + token, // 指向包含 layer.json 的目录
{
requestVertexNormals: true
}
);
// 应用地形到Viewer
this.viewer.terrainProvider = customTerrain;
this.imageryBaseLayer = layers.addImageryProvider(provider);
this.imageryBaseLayer.show = true;
this.viewer.scene.globe.depthTestAgainstTerrain = true;
this.viewer.scene.globe.depthTestAgainstTerrain = false;
this.viewer.scene.globe.show = true;
this.viewer.scene.fog.enabled = false;
this.viewer.scene.fxaa = false;
@ -161,14 +153,7 @@ export class MapCesium implements MapInterface {
this.setupClickHandler();
this.setupCameraPopupReset();
this._ready = true;
console.log('[Cesium] init complete, viewer ready');
// 初始化完成后等 5 秒再加载倾斜摄影,确保渲染管线稳定
setTimeout(() => {
this.flushPendingOSGB();
}, 5000);
return this.viewer;
} catch (error) {
this.hideLoadingOverlay();
@ -540,40 +525,10 @@ export class MapCesium implements MapInterface {
this.popupElement.innerHTML = '';
}
/** 判断 3D 位置是否被地形遮挡(基于射线与 terrain 求交) */
private isPositionBehindTerrain(position: Cesium.Cartesian3): boolean {
if (!this.viewer) return true;
const scene = this.viewer.scene;
const windowCoord = Cesium.SceneTransforms.worldToWindowCoordinates(
scene,
position
);
if (!windowCoord) return true; // 在地球背面
const ray = scene.camera.getPickRay(windowCoord);
if (!ray) return false;
const terrainPos = scene.globe.pick(ray, scene);
if (!terrainPos) return false; // 该方向无地形
const cameraPos = scene.camera.positionWC;
const terrainDist = Cesium.Cartesian3.distance(cameraPos, terrainPos);
const entityDist = Cesium.Cartesian3.distance(cameraPos, position);
// 地形交点明显更近 → 实体被遮挡
return terrainDist + 10 < entityDist;
}
/** 根据实体世界坐标把 popup 定位到屏幕坐标 */
private updatePopupPosition(position: Cesium.Cartesian3): void {
if (!this.viewer || !this.popupElement) return;
// 被地形遮挡时隐藏 popup
if (this.isPositionBehindTerrain(position)) {
this.hidePopup();
return;
}
const canvasPosition = Cesium.SceneTransforms.worldToWindowCoordinates(
this.viewer.scene,
position
@ -685,9 +640,6 @@ export class MapCesium implements MapInterface {
)
return;
// 被地形遮挡的不展示 popup
if (this.isPositionBehindTerrain(position)) return;
const rawData: Record<string, any> = {
...((entity as any)._rawData || {})
};
@ -1106,8 +1058,6 @@ export class MapCesium implements MapInterface {
// 取消飞行超时和加载动画
this.clearFlightFallbackTimer();
this.hideLoadingOverlay();
this._ready = false;
this._pendingOSGBItems = [];
// 批量 popup 和 hover popup
this.isBatchPopupMode = false;
@ -1615,7 +1565,7 @@ export class MapCesium implements MapInterface {
verticalOrigin: Cesium.VerticalOrigin.CENTER,
horizontalOrigin: Cesium.HorizontalOrigin.CENTER,
scaleByDistance: new Cesium.NearFarScalar(1.0e3, 1.5, 2.0e7, 0.8),
heightReference: Cesium.HeightReference.CLAMP_TO_GROUND
disableDepthTestDistance: Number.POSITIVE_INFINITY
} as any,
label: {
text: labelText || undefined,
@ -1628,7 +1578,7 @@ export class MapCesium implements MapInterface {
pixelOffset: dynamicLabelOffset as any,
horizontalOrigin: Cesium.HorizontalOrigin.CENTER,
scaleByDistance: new Cesium.NearFarScalar(1.0e3, 1.2, 2.0e7, 0.8),
heightReference: Cesium.HeightReference.CLAMP_TO_GROUND
disableDepthTestDistance: Number.POSITIVE_INFINITY
} as any,
properties: {
...item,
@ -2753,57 +2703,4 @@ export class MapCesium implements MapInterface {
left.top - padding > right.bottom
);
}
// ==================== 倾斜摄影(OSGB) ====================
/**
* 3D Tileset
* viewer 5
*/
addQxsyLayer(item: OSGBItem): void {
if (!this.viewer || !this._ready) {
// 未就绪:放入等待队列
if (!this._pendingOSGBItems.includes(item)) {
this._pendingOSGBItems.push(item);
}
return;
}
LoadOSGB(this.viewer, item);
}
/**
*
*/
private flushPendingOSGB(): void {
if (!this.viewer || this.viewer.isDestroyed()) return;
const items = this._pendingOSGBItems.splice(0);
console.log(`[Cesium] 开始加载 ${items.length} 个待加载的倾斜摄影模型`);
items.forEach(item => LoadOSGB(this.viewer!, item));
}
/**
*
*/
removeQxsyLayer(item: OSGBItem): void {
if (!this.viewer) return;
// 从待加载队列中移除,防止已被移除的模型在 flushPendingOSGB 时又被加载
this._pendingOSGBItems = this._pendingOSGBItems.filter(i => i !== item);
removeQxsy(this.viewer, item);
}
/**
*
*/
qxsyChangeClick(item: OSGBItem, checked: boolean): void {
if (!this.viewer) return;
osgbChangeClick(this.viewer, item, checked);
}
/**
*
*/
qxsyToPosition(item: OSGBItem): void {
if (!this.viewer) return;
osgbLocation(this.viewer, item);
}
}

View File

@ -276,22 +276,4 @@ export class MapClass implements MapClassInterface {
getCurrentZoom(): number | undefined {
return this.service.getCurrentZoom();
}
// ==================== 倾斜摄影 ====================
addQxsyLayer(item: any): void {
this.service.addQxsyLayer?.(item);
}
removeQxsyLayer(item: any): void {
this.service.removeQxsyLayer?.(item);
}
qxsyChangeClick(item: any, checked: boolean): void {
this.service.qxsyChangeClick?.(item, checked);
}
qxsyToPosition(item: any): void {
this.service.qxsyToPosition?.(item);
}
}

View File

@ -130,26 +130,35 @@ export interface MapInterface {
* 2D zoom3D
*/
getCurrentZoom(): number | undefined;
// /**
// * 加载倾斜摄影数据
// * @param HH3DUrlArray
// */
// addQxsyLayer(HH3DUrlArray: siteItem): void
/**
*
*/
addQxsyLayer(item: any): void;
// /**
// * 移除倾斜摄影数据
// * @param HH3DUrlArray
// */
// removeQxsyLayer(HH3DUrlArray: siteItem): void
/**
*
*/
removeQxsyLayer(item: any): void;
// /**
// * 倾斜摄影定位
// * @param HH3DUrlArray
// */
// qxsyToPosition(HH3DUrlArray: siteItem): void
/**
*
*/
qxsyChangeClick(item: any, checked: boolean): void;
// /**
// * 倾斜摄影裁剪
// * @param HH3DUrlArray
// */
// qxsyClipBoundary(HH3DUrlArray: siteItem): void
/**
*
*/
qxsyToPosition(item: any): void;
// /**
// * 移除倾斜摄影裁剪
// * @param HH3DUrlArray
// */
// removeQxsyClipBoundary(HH3DUrlArray: siteItem): void
/**
*

View File

@ -2607,10 +2607,4 @@ export class MapOl implements MapInterface {
this.geoJsonData = null;
this.geoJsonData1 = null;
}
// 倾斜摄影方法仅3D支持2D为空实现
addQxsyLayer(_item: any): void {}
removeQxsyLayer(_item: any): void {}
qxsyChangeClick(_item: any, _checked: boolean): void {}
qxsyToPosition(_item: any): void {}
}

View File

@ -1,747 +0,0 @@
/**
* (OSGB)
* osgbTool.ts
*
* 使用字段: url, boundary, location, height, accuracy
*/
import * as turf from '@turf/turf';
import * as Cesium from 'cesium';
import { getToken } from '@/utils/auth';
// ==================== 类型定义 ====================
export interface OSGBLocation {
destination: number[]; // [x, y, z] 或 [lng, lat, height]
orientation: {
heading: number;
pitch: number;
roll: number;
};
center: number[];
}
export interface OSGBItem {
/** 3D Tileset 服务地址 */
url: string;
/** GeoJSON Polygon 边界(用于裁切) */
boundary?: any;
/** 定位信息 */
location?: OSGBLocation | string;
/** 模型高度偏移 */
height?: number;
/** 屏幕空间误差 (默认 16) */
accuracy?: number;
/** 内部状态 - 不要手动设置 */
osgbtitles?: any;
cartesian3?: any;
clippingPlanes?: any;
eventListener?: any;
_loading?: boolean;
_loadId?: number;
/** 用户手动关闭开关标志:为 true 时不自动加载/显示,只做显隐切换 */
_switchOff?: boolean;
}
// ==================== 内部状态(每个 OSGB 实例独立) ====================
interface OSGBInstanceState {
destination: Cesium.Cartesian3 | null;
orientation: any;
timelookat: any;
time: number;
num: number;
witetime: number;
timeout: any;
}
const instanceStates = new WeakMap<OSGBItem, OSGBInstanceState>();
function getState(obj: OSGBItem): OSGBInstanceState {
let state = instanceStates.get(obj);
if (!state) {
state = {
destination: null,
orientation: null,
timelookat: null,
time: 0,
num: 0,
witetime: 0,
timeout: undefined
};
instanceStates.set(obj, state);
}
return state;
}
function clearState(obj: OSGBItem) {
const state = instanceStates.get(obj);
if (state) {
clearTimeout(state.timeout);
clearInterval(state.timelookat);
}
instanceStates.delete(obj);
}
// ==================== 3D Tileset 场景管理 ====================
/**
* tileset
*/
const addOSGB = (viewer: Cesium.Viewer, tileset: Cesium.Cesium3DTileset) => {
if (!viewer || viewer.isDestroyed()) return;
viewer.scene.primitives.add(tileset);
};
/**
* tilesetPrimitiveCollection.remove destroy=true tileset
*/
const removeOSGB = (viewer: Cesium.Viewer, tileset: Cesium.Cesium3DTileset) => {
if (!viewer || viewer.isDestroyed()) return;
viewer.scene.primitives.remove(tileset);
};
// ==================== 裁切相关 ====================
/**
* GeoJSON Geometry
* Feature / FeatureCollection / Geometry
*/
const normalizeGeometry = (geo: any): any => {
if (!geo) return null;
// 已经是 Geometry 类型(有 type 且 coordinates
if (geo.type && geo.coordinates) return geo;
// Feature → 提取 geometry
if (geo.type === 'Feature' && geo.geometry) return geo.geometry;
// FeatureCollection → 取第一个 feature 的 geometry
if (geo.type === 'FeatureCollection' && geo.features?.length) {
return normalizeGeometry(geo.features[0]);
}
return null;
};
const get_verts_core = (poly: any): Cesium.Cartesian3[] => {
const verts_carte3: Cesium.Cartesian3[] = [];
if (!poly) return verts_carte3;
try {
// 规范化输入:兼容 Feature / FeatureCollection / Geometry
const geom = normalizeGeometry(poly);
if (!geom) return verts_carte3;
let verts = turf.coordAll(geom);
const clockwiseRing = turf.booleanClockwise(turf.lineString(verts));
if (clockwiseRing) {
verts = verts.reverse();
}
for (let i = 0; i < verts.length - 1; i++) {
const vert = verts[i];
verts_carte3.push(Cesium.Cartesian3.fromDegrees(vert[0], vert[1]));
}
} catch (e) {
console.warn('get_verts_core 解析 boundary 失败:', e);
}
return verts_carte3;
};
const get_clipping_planes = (
points: Cesium.Cartesian3[]
): Cesium.ClippingPlane[] => {
const pointsLength = points.length;
const clippingPlanes: Cesium.ClippingPlane[] = [];
for (let i = 0; i < pointsLength; ++i) {
const nextIndex = (i + 1) % pointsLength;
let midpoint = Cesium.Cartesian3.add(
points[i],
points[nextIndex],
new Cesium.Cartesian3()
);
midpoint = Cesium.Cartesian3.multiplyByScalar(midpoint, 0.5, midpoint);
const up = Cesium.Cartesian3.normalize(midpoint, new Cesium.Cartesian3());
let right = Cesium.Cartesian3.subtract(
points[nextIndex],
midpoint,
new Cesium.Cartesian3()
);
right = Cesium.Cartesian3.normalize(right, right);
let normal = Cesium.Cartesian3.cross(right, up, new Cesium.Cartesian3());
normal = Cesium.Cartesian3.normalize(normal, normal);
const originCenteredPlane = new Cesium.Plane(normal, 0.0);
const distance = Cesium.Plane.getPointDistance(
originCenteredPlane,
midpoint
);
clippingPlanes.push(new Cesium.ClippingPlane(normal, distance));
}
return clippingPlanes;
};
const clipping_terrain = (
viewer: Cesium.Viewer,
clippingPlanes: Cesium.ClippingPlane[]
) => {
const globe = viewer.scene.globe;
globe.clippingPlanes = new Cesium.ClippingPlaneCollection({
planes: clippingPlanes,
edgeWidth: 0,
edgeColor: Cesium.Color.GREEN,
enabled: true
});
globe.backFaceCulling = true;
globe.showSkirts = true;
};
const clipping_3dtiles = (
clippingPlanes: Cesium.ClippingPlane[],
tileset: Cesium.Cesium3DTileset
) => {
// Cesium 1.141: root.transform 是内部属性,安全访问
const rootTransform = (tileset as any)?.root?.transform;
if (!rootTransform) return;
const invtrans = Cesium.Matrix4.inverse(rootTransform, new Cesium.Matrix4());
for (let i = 0; i < clippingPlanes.length; i++) {
clippingPlanes[i] = Cesium.Plane.transform(clippingPlanes[i], invtrans);
}
tileset.clippingPlanes = new Cesium.ClippingPlaneCollection({
planes: clippingPlanes,
unionClippingRegions: true,
edgeWidth: 0,
edgeColor: Cesium.Color.RED,
enabled: false
});
};
const Clip3DTile = (boundary: any, tileset: Cesium.Cesium3DTileset) => {
try {
const geom = normalizeGeometry(boundary);
if (!geom) return;
const buffered = turf.buffer(geom, 10, { units: 'meters' });
const verts_core = get_verts_core(buffered).reverse();
if (!verts_core.length) return;
const planes = get_clipping_planes(verts_core);
clipping_3dtiles(planes, tileset);
} catch (e) {
console.warn('Clip3DTile 裁切失败:', e);
}
};
const ClipTerrain = (viewer: Cesium.Viewer, osgbObj: OSGBItem) => {
// Cesium 1.141: 安全访问 clippingPlanes 内部属性 _planes
const existingPlanes = (viewer.scene.globe.clippingPlanes as any)?._planes;
if (
!osgbObj.clippingPlanes ||
(existingPlanes &&
!compareClippingPlanes(osgbObj.clippingPlanes, existingPlanes))
) {
const verts_core = get_verts_core(osgbObj.boundary);
if (!verts_core.length) return;
const planes = get_clipping_planes(verts_core);
clipping_terrain(viewer, planes);
osgbObj.clippingPlanes = planes;
}
};
const removeClip = (viewer: Cesium.Viewer, osgbObj: OSGBItem) => {
if (osgbObj.clippingPlanes) {
removeClippingPlanes(viewer);
osgbObj.clippingPlanes = undefined;
}
};
const removeClippingPlanes = (viewer: Cesium.Viewer) => {
if (!Cesium.defined(viewer) || viewer.isDestroyed()) {
return;
}
if (Cesium.defined(viewer.scene.globe.clippingPlanes)) {
viewer.scene.globe.clippingPlanes.removeAll();
}
};
const compareClippingPlanes = (planes1: any, planes2: any): boolean => {
let result = true;
if (planes1.length === planes2?.length) {
for (let index = 0; index < planes1.length; index++) {
if (planes1[index]._distance !== planes2[index]._distance) {
result = false;
break;
}
}
} else {
result = false;
}
return result;
};
const getMinDistanceOfOSGB = (viewer: Cesium.Viewer): number => {
let result = Infinity;
const length = viewer.scene.primitives.length;
for (let i = 0; i < length; i++) {
const p = viewer.scene.primitives.get(i);
// Cesium 1.141: _url 和 _distanceToCamera 是内部属性,安全访问
// eslint-disable-next-line @typescript-eslint/no-explicit-any
if ((p as any)?._url) {
// eslint-disable-next-line @typescript-eslint/no-explicit-any
const d = (p as any)?.root?._distanceToCamera;
if (d != null && d < result) result = d;
}
}
return result;
};
// ==================== 动态显隐 ====================
const dynamicSetVisible = (viewer: Cesium.Viewer, osgbObj: OSGBItem) => {
if (!Cesium.defined(viewer) || viewer.isDestroyed()) return;
if (!Cesium.defined(osgbObj?.cartesian3)) return;
let cameraPosition: Cesium.Cartesian3 | undefined;
if (viewer.trackedEntity) {
cameraPosition = viewer.trackedEntity.position?.getValue(
viewer.clock.currentTime
);
}
if (!cameraPosition) {
cameraPosition = viewer.camera.position.clone();
}
const distance = Cesium.Cartesian3.distance(
osgbObj.cartesian3,
cameraPosition
);
if (distance < 12000) {
// 用户手动关闭了开关 → 不自动加载
if (osgbObj._switchOff) return;
// 匹配旧代码逻辑osgbObj.osgbtitles 同步设置为 nonClassificationTileset 防重入
// 新代码用 _loading + _loadId 实现同样的效果(因为 fromUrl 是异步的)
if (!osgbObj.osgbtitles && !osgbObj._loading) {
osgbObj._loading = true;
osgbObj._loadId = (osgbObj._loadId || 0) + 1;
const loadId = osgbObj._loadId;
const url = osgbObj.url.includes('?')
? osgbObj.url + `&token=${getToken()}`
: osgbObj.url + `?token=${getToken()}`;
Cesium.Cesium3DTileset.fromUrl(url, {
maximumScreenSpaceError: Number(osgbObj?.accuracy) || 16,
show: true,
maximumMemoryUsage: 128
})
.then((tileset: Cesium.Cesium3DTileset) => {
// 竞态保护版本号变了removeQxsy 被调用或新一轮加载开始)→ 销毁退出
if (
osgbObj._loadId !== loadId ||
!Cesium.defined(viewer) ||
viewer.isDestroyed()
) {
tileset.destroy();
return;
}
osgbObj._loading = false;
if (!Cesium.defined(tileset)) return;
tileset.maximumScreenSpaceError = 32;
// height 向上偏移模型几何自带高程height 只是微调(如 44m
if (osgbObj.height != 0) {
const bs = Cesium.Cartographic.fromCartesian(
tileset.boundingSphere.center
);
const surface = Cesium.Cartesian3.fromRadians(
bs.longitude,
bs.latitude,
0.0
);
const offset = Cesium.Cartesian3.fromRadians(
bs.longitude,
bs.latitude,
osgbObj.height
);
const translation = Cesium.Cartesian3.subtract(
offset,
surface,
new Cesium.Cartesian3()
);
tileset.modelMatrix = Cesium.Matrix4.fromTranslation(translation);
}
addOSGB(viewer, tileset);
osgbObj.osgbtitles = tileset;
})
.catch((e: Error) => {
osgbObj._loading = false;
console.log('dynamicSetVisible 加载倾斜摄影报错', e);
});
}
} else if (distance > 13000) {
// 匹配旧代码逻辑:镜头拉远 → 销毁 tileset 释放内存
if (osgbObj.osgbtitles) {
removeOSGB(viewer, osgbObj.osgbtitles);
osgbObj.osgbtitles = undefined;
}
// 不重置 _switchOff开关状态由用户手动控制不受距离影响
}
};
// ==================== 地形动态裁切 ====================
const dynamicClipTerrain = (viewer: Cesium.Viewer, osgbObj: OSGBItem) => {
if (!osgbObj?.osgbtitles) {
removeClip(viewer, osgbObj);
return;
}
// Cesium 1.141: root 和 _distanceToCamera 是内部属性,安全访问
const root = (osgbObj.osgbtitles as any)?.root;
if (!Cesium.defined(root)) {
removeClip(viewer, osgbObj);
if (osgbObj.osgbtitles?.clippingPlanes?.enabled) {
osgbObj.osgbtitles.clippingPlanes.enabled = false;
}
return;
}
if (!osgbObj?.osgbtitles?.show) {
removeClip(viewer, osgbObj);
if (osgbObj.osgbtitles?.clippingPlanes?.enabled) {
osgbObj.osgbtitles.clippingPlanes.enabled = false;
}
return;
}
const distance = root._distanceToCamera;
const tilesLoaded = osgbObj.osgbtitles.tilesLoaded;
if (osgbObj.boundary && tilesLoaded) {
if (distance != null && getMinDistanceOfOSGB(viewer) === distance) {
ClipTerrain(viewer, osgbObj);
if (
osgbObj.osgbtitles?.clippingPlanes &&
!osgbObj.osgbtitles.clippingPlanes.enabled
) {
osgbObj.osgbtitles.clippingPlanes.enabled = true;
}
} else {
removeClip(viewer, osgbObj);
if (osgbObj.osgbtitles?.clippingPlanes?.enabled) {
osgbObj.osgbtitles.clippingPlanes.enabled = false;
}
}
}
};
// ==================== 公开 API ====================
/**
* 3D Tileset
*
* Cesium 1.141 使 Cesium3DTileset.fromUrl()
* new Cesium3DTileset({url})
*/
export const LoadOSGB = (viewer: Cesium.Viewer, osgbObj: OSGBItem) => {
if (!osgbObj.url) return;
// 已加载则跳过
if (osgbObj.osgbtitles && !osgbObj.osgbtitles.isDestroyed?.()) return;
// 正在加载中也跳过(防止重复调用 fromUrl
if (osgbObj._loading) return;
osgbObj._loading = true;
// 自增版本号:每次 LoadOSGB 都 +1.then() 里靠版本号判断是否已失效
osgbObj._loadId = (osgbObj._loadId || 0) + 1;
const loadId = osgbObj._loadId;
const url = osgbObj.url.includes('?')
? osgbObj.url + `&token=${getToken()}`
: osgbObj.url + `?token=${getToken()}`;
Cesium.Cesium3DTileset.fromUrl(url, {
maximumScreenSpaceError: Number(osgbObj?.accuracy) || 16,
show: true,
maximumMemoryUsage: 128
})
.then((tileset: Cesium.Cesium3DTileset) => {
// 竞态保护:版本号变了 → 销毁退出
if (
osgbObj._loadId !== loadId ||
!Cesium.defined(viewer) ||
viewer.isDestroyed()
) {
tileset.destroy();
return;
}
if (!Cesium.defined(tileset)) return;
osgbObj._loading = false;
tileset.maximumScreenSpaceError = 32;
// height 向上偏移模型几何自带高程height 只是微调(如 44m
if (osgbObj.height != 0) {
const bs = Cesium.Cartographic.fromCartesian(
tileset.boundingSphere.center
);
const surface = Cesium.Cartesian3.fromRadians(
bs.longitude,
bs.latitude,
0.0
);
const offset = Cesium.Cartesian3.fromRadians(
bs.longitude,
bs.latitude,
osgbObj.height
);
const translation = Cesium.Cartesian3.subtract(
offset,
surface,
new Cesium.Cartesian3()
);
tileset.modelMatrix = Cesium.Matrix4.fromTranslation(translation);
}
// 加入场景(匹配旧代码 readyPromise 中 addOSGB
addOSGB(viewer, tileset);
osgbObj.osgbtitles = tileset;
// 始终设置 cartesian3保证 dynamicSetVisible 能计算距离
osgbObj.cartesian3 = tileset.boundingSphere.center.clone();
// boundary 裁切(匹配旧代码 readyPromise 中处理)
if (osgbObj.boundary) {
if (typeof osgbObj.boundary === 'string') {
osgbObj.boundary = JSON.parse(osgbObj.boundary);
}
Clip3DTile(osgbObj.boundary, tileset);
}
// 注册 postRender 动态显隐300ms 节流,匹配旧代码 throttle
let lastTime = 0;
osgbObj.eventListener = viewer.scene.postRender.addEventListener(() => {
if (!Cesium.defined(viewer) || viewer.isDestroyed()) return;
const now = performance.now();
if (now - lastTime < 300) return;
lastTime = now;
if (!getState(osgbObj).timelookat) {
dynamicSetVisible(viewer, osgbObj);
}
dynamicClipTerrain(viewer, osgbObj);
});
})
.catch((e: Error) => {
osgbObj._loading = false;
console.log('加载倾斜摄影报错', e);
});
};
/**
*
* 2D osgbChangeClick
* removeqxsy(osgbTool.ts:233-244) cartesian3
*/
export const removeQxsy = (viewer: Cesium.Viewer, osgbObj: OSGBItem) => {
// 递增版本号:使所有进行中的 fromUrl().then() 失效
osgbObj._loadId = (osgbObj._loadId || 0) + 1;
removeClippingPlanes(viewer);
osgbObj.clippingPlanes = undefined;
osgbObj._loading = false;
osgbObj._switchOff = undefined;
if (typeof osgbObj.eventListener === 'function') {
osgbObj.eventListener();
osgbObj.eventListener = undefined;
}
if (osgbObj.osgbtitles) {
removeOSGB(viewer, osgbObj.osgbtitles);
osgbObj.osgbtitles = undefined;
}
// 注意:不清理 cartesian3匹配旧代码行为
};
/**
*
* -
* - 12km /
* - 12km tileset tileset
* - 2D removeQxsy
*/
export const osgbChangeClick = (
viewer: Cesium.Viewer,
osgbObj: OSGBItem,
checked: boolean
) => {
// 先记录开关状态(无论距离远近)
osgbObj._switchOff = !checked;
// 12km 以外:只记状态不操作 tileset此时 tileset 可能不存在或已销毁)
if (osgbObj.cartesian3) {
const cameraPosition = viewer.camera.position.clone();
const distance = Cesium.Cartesian3.distance(
osgbObj.cartesian3,
cameraPosition
);
if (distance >= 12000) return;
}
if (checked) {
// 开关 ON已有未销毁的 tileset → 直接显示;否则加载
if (osgbObj.osgbtitles && !osgbObj.osgbtitles.isDestroyed?.()) {
osgbObj.osgbtitles.show = true;
} else {
LoadOSGB(viewer, osgbObj);
}
} else {
// 开关 OFF隐藏 tileset移除 terrain 裁切
if (osgbObj.osgbtitles && !osgbObj.osgbtitles.isDestroyed?.()) {
osgbObj.osgbtitles.show = false;
}
removeClip(viewer, osgbObj);
}
};
/**
* location
*/
const parseLocation = (location: any): OSGBLocation | null => {
if (!location) return null;
// 如果已经是对象,直接用
if (typeof location === 'object' && location.destination) {
return location as OSGBLocation;
}
// 如果是字符串,尝试解析
if (typeof location === 'string') {
try {
const jsonString = location.replace(/\n/g, '');
const startIndex = jsonString.indexOf('{');
const endIndex = jsonString.lastIndexOf('}');
if (startIndex === -1 || endIndex === -1) return null;
const extractedData = jsonString.substring(startIndex, endIndex + 1);
const parsed = eval('(' + extractedData + ')');
return {
destination: parsed.destination,
orientation: parsed.orientation,
center: parsed.center
};
} catch {
return null;
}
}
return null;
};
/**
*
* flyTo +
*/
export const osgbLocation = (viewer: Cesium.Viewer, osgbObj: OSGBItem) => {
const state = getState(osgbObj);
clearTimeout(state.timeout);
state.num = 0;
state.time = 0;
state.witetime = 0;
viewer.camera.lookAtTransform(Cesium.Matrix4.IDENTITY);
let center = Cesium.Cartesian3.fromDegrees(
100.271729604817,
35.3107902811941,
2800
);
let heading = Cesium.Math.toRadians(0.0);
const pitch = Cesium.Math.toRadians(-30.0);
const range = 2000.0;
const locationInfor = parseLocation(osgbObj.location);
if (!locationInfor) {
console.warn('该模型定位坐标未配置!');
return;
}
// 判断是经纬度还是笛卡尔坐标
const destCoords = locationInfor.destination;
if (destCoords[0] <= 180 && destCoords[0] >= -180) {
state.destination = Cesium.Cartesian3.fromDegrees(
destCoords[0],
destCoords[1],
destCoords[2]
);
} else {
state.destination = new Cesium.Cartesian3(
destCoords[0],
destCoords[1],
destCoords[2]
);
}
state.orientation = locationInfor.orientation;
center = Cesium.Cartesian3.fromDegrees(
locationInfor.center[0],
locationInfor.center[1],
locationInfor.center[2]
);
if (!state.destination || !state.orientation) return;
viewer.camera.cancelFlight();
viewer.camera.flyTo({
destination: state.destination,
orientation: state.orientation,
complete: () => {
state.timeout = setTimeout(() => {
rotate();
}, 2000);
}
});
const rotate = () => {
clearInterval(state.timelookat);
state.timelookat = setInterval(() => {
if (!Cesium.defined(viewer) || viewer.isDestroyed()) {
return;
}
state.witetime += 0.7;
if (state.witetime > 180 && state.witetime < 360) {
state.time += 0.7;
heading = Cesium.Math.toRadians(state.time);
viewer.camera.lookAt(
center,
new Cesium.HeadingPitchRange(heading, pitch, range)
);
} else if (state.witetime > 360) {
viewer.camera.lookAtTransform(Cesium.Matrix4.IDENTITY);
clearInterval(state.timelookat);
state.timelookat = null;
viewer.camera.flyTo({
destination: state.destination!,
orientation: state.orientation,
duration: 2
});
return;
}
}, 10);
};
// 点击 body 两次退出旋转
const body = document.getElementsByTagName('body')[0];
body.onclick = function () {
if (viewer && !viewer.isDestroyed() && viewer.camera) {
state.num = state.num + 1;
if (state.num > 1) {
viewer.camera.lookAtTransform(Cesium.Matrix4.IDENTITY);
clearInterval(state.timelookat);
clearTimeout(state.timeout);
state.timelookat = null;
}
}
};
};

View File

@ -32,16 +32,13 @@
class="leaf-item"
>
<div class="leaf-content">
<span class="leaf-name" @click="handleLeafClick(item)">{{
item.stnm
}}</span>
<span @click.stop>
<span class="leaf-name">{{ item.stnm }}</span>
<a-switch
:checked="item.checked !== false"
size="small"
@click.stop
@change="(checked: boolean) => handleSwitchChange(item, checked)"
/>
</span>
</div>
</a-menu-item>
</a-sub-menu>
@ -82,9 +79,6 @@ const props = defineProps<{
const emit = defineEmits<{
(e: 'update:visible', v: boolean): void;
(e: 'loadModel', item: any): void;
(e: 'unloadModel', item: any): void;
(e: 'flyToSite', item: any): void;
}>();
const tooltipVisible = ref(false);
@ -131,16 +125,6 @@ const onOpenChange = (visible: boolean) => {
// a-switch
const handleSwitchChange = (item: any, checked: boolean) => {
item.checked = checked;
if (checked) {
emit('loadModel', item);
} else {
emit('unloadModel', item);
}
};
//
const handleLeafClick = (item: any) => {
emit('flyToSite', item);
};
// tooltip

View File

@ -18,9 +18,6 @@
:countdown="countdown"
:inTransition="is3DTransition && child.key === 'OSBGController'"
@update:visible="(v: boolean) => handleComponentVisibleToggle(child.key, v)"
@loadModel="handleLoadModel"
@unloadModel="handleUnloadModel"
@flyToSite="handleFlyToSite"
/>
<!-- 非组件项包裹 tooltip 显示名称 -->
<a-tooltip
@ -109,10 +106,7 @@ const buildTiltPhotoTree = (list: any[]) => {
const id = String(item.baseId ?? '');
const group = baseMap.get(id);
if (group) {
// push addQxsyLayer item
// OSGB osgbtitles, cartesian3, eventListener
item.checked = true;
group.children.push(item);
group.children.push({ ...item, checked: true });
}
}
return Array.from(baseMap.entries())
@ -152,33 +146,11 @@ const fetchTiltPhotoTree = async () => {
});
const list = res.data.data;
tiltPhotoTree.value = buildTiltPhotoTree(list);
// dynamicSetVisible 12km
list.forEach((item: any) => {
map.value.addQxsyLayer?.(item);
});
} catch (err) {
console.error('获取倾斜摄影数据失败:', err);
}
};
//
const handleLoadModel = (item: any) => {
// /
map.value.qxsyChangeClick?.(item, true);
};
const handleUnloadModel = (item: any) => {
// /
map.value.qxsyChangeClick?.(item, false);
};
const handleFlyToSite = (item: any) => {
//
map.value.addQxsyLayer?.(item);
map.value.qxsyToPosition?.(item);
};
// 3D
// layerController / OSBGController / threedRoam
const activeKey = ref<string | null>(null);
@ -403,18 +375,11 @@ const handleControllerClick = (item: any) => {
fetchTiltPhotoTree();
start3DTransition();
} else {
// 3D2D
// 3D2D
uiStore.drawerOpen = true;
uiStore.isRoaming = false;
cleanup3DTransition();
activeKey.value = null;
//
tiltPhotoTree.value.forEach((group: any) => {
group.children?.forEach((item: any) => {
map.value.removeQxsyLayer?.(item);
});
});
tiltPhotoTree.value = [];
}
props.onClick('dim', uiStore.mapType);
}

View File

@ -647,7 +647,7 @@ const focusSelectedAnchorPoint = () => {
mapOrchestrator.focusPoint(
selectedValue,
uiStore.mapType === '3D' ? 9 : 14,
14,
isFishSurveyMode.value ? anchorPointOptions.value : undefined
);
};

View File

@ -58,7 +58,7 @@ service.interceptors.response.use(
message.error(response.data.msg || '请求失败');
setTimeout(() => {
localStorage.clear();
window.location.href = '/login';
window.location.href = '/';
}, 1000);
return;
} else if (response.data.code == 1) {