This commit is contained in:
扈兆增 2026-07-31 11:19:59 +08:00
commit b535529f9d
122 changed files with 12120 additions and 1258 deletions

View File

@ -56,6 +56,13 @@
<artifactId>mybatis-spring</artifactId>
<version>3.0.3</version>
</dependency>
<!-- 强制统一 error_prone_annotations 版本 -->
<dependency>
<groupId>com.google.errorprone</groupId>
<artifactId>error_prone_annotations</artifactId>
<version>2.43.0</version>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
@ -95,6 +102,12 @@
<artifactId>spring-boot-starter-cache</artifactId>
</dependency>
<!-- 缓存库 Caffeine -->
<dependency>
<groupId>com.github.ben-manes.caffeine</groupId>
<artifactId>caffeine</artifactId>
</dependency>
<!-- 测试 -->
<dependency>
<groupId>org.springframework.boot</groupId>
@ -109,8 +122,6 @@
<version>${guava.version}</version>
</dependency>
<!-- 对于 jar 包spring-boot-starter-web 已包含嵌入式 Tomcat无需显式 provided -->
<!-- spring-quartz任务-->
<dependency>
<groupId>org.springframework.boot</groupId>

View File

@ -0,0 +1,15 @@
package com.yfd.platform.annotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface DynamicDictEvict {
String tableName(); // 表名
String codeColumn() default "id";
String nameColumn() default "name";
String filter() default "";
}

View File

@ -0,0 +1,27 @@
package com.yfd.platform.aspect;
import com.yfd.platform.annotation.DynamicDictEvict;
import com.yfd.platform.utils.DictCacheHelper;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@Aspect
@Component
public class DictCacheEvictAspect {
@Autowired
private DictCacheHelper dictCacheHelper; // 复用上面的Helper
@AfterReturning("@annotation(dictEvict)")
public void evictCache(JoinPoint jp, DynamicDictEvict dictEvict) {
// 获取注解上的参数触发清理
dictCacheHelper.evictDynamic(
dictEvict.tableName(),
dictEvict.codeColumn(),
dictEvict.nameColumn(),
dictEvict.filter()
);
}
}

View File

@ -0,0 +1,161 @@
package com.yfd.platform.config;
import jakarta.annotation.Resource;
import jakarta.servlet.FilterChain;
import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.core.authority.AuthorityUtils;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.stereotype.Component;
import org.springframework.util.AntPathMatcher;
import org.springframework.web.filter.OncePerRequestFilter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
/**
* 通用 Bearer Token 鉴权过滤器
*
* 通过 application.yml 配置需要保护的接口路径支持 Ant 风格匹配
*
* <p>配置示例
* <pre>
* bearer-token:
* paths:
* - /fb/fishhatchrecr/**
* - /fprd/wva/**
* - /some/api/**
* </pre>
*
* <p>外部系统调用流程
* <ol>
* <li>先调用 OAuth2 token 端点获取 access_token</li>
* <li>在业务请求中携带 Authorization: Bearer &lt;access_token&gt;</li>
* </ol>
*/
@Component
public class BearerTokenFilter extends OncePerRequestFilter {
private static final Logger log = LoggerFactory.getLogger(BearerTokenFilter.class);
private final AntPathMatcher pathMatcher = new AntPathMatcher();
/**
* 需要 Bearer Token 鉴权保护的路径模式列表
* 支持 Ant 风格/api/**, /fb/* /GetKendoListCust
*/
private final List<String> protectedPathPatterns = new ArrayList<>();
@Resource
private BearerTokenService bearerTokenService;
@Resource
private BearerTokenProperties bearerTokenProperties;
@Override
protected void doFilterInternal(HttpServletRequest request,
HttpServletResponse response,
FilterChain filterChain) throws ServletException, IOException {
String requestPath = resolveRequestPath(request);
// 检查当前请求路径是否需要 Bearer Token 鉴权
if (!isProtectedPath(requestPath)) {
filterChain.doFilter(request, response);
return;
}
log.debug("请求路径 {} 需要 Bearer Token 鉴权", requestPath);
// 解析 Authorization: Bearer <token>
String token = bearerTokenService.resolveToken(request);
if (token == null) {
log.warn("缺少 Bearer Token, path={}", requestPath);
response.sendError(HttpServletResponse.SC_UNAUTHORIZED, "缺少 Authorization: Bearer <token> 请求头");
return;
}
// 验证 token
if (!bearerTokenService.validateToken(token, request)) {
log.warn("Bearer Token 无效或已过期, path={}", requestPath);
response.sendError(HttpServletResponse.SC_FORBIDDEN, "Bearer Token 无效或已过期");
return;
}
// token 有效可选刷新 token 有效期
// bearerTokenService.refreshToken(token);
// 设置 Spring Security 认证上下文放行后续过滤器
UsernamePasswordAuthenticationToken authenticationToken =
new UsernamePasswordAuthenticationToken(
"bearer-access",
null,
AuthorityUtils.NO_AUTHORITIES
);
SecurityContextHolder.getContext().setAuthentication(authenticationToken);
log.debug("Bearer Token 鉴权通过, path={}", requestPath);
filterChain.doFilter(request, response);
}
/**
* 判断路径是否需要 Bearer Token 鉴权保护
*/
private boolean isProtectedPath(String uri) {
if (uri == null) return false;
List<String> patterns = getProtectedPaths();
if (patterns.isEmpty()) return false;
for (String pattern : patterns) {
if (pathMatcher.match(pattern, uri)) {
return true;
}
}
return false;
}
/**
* 获取受保护的路径模式列表
* 优先从 BearerTokenProperties 获取也可以通过子类覆盖或动态添加
*/
protected List<String> getProtectedPaths() {
List<String> paths = new ArrayList<>();
// 从配置文件加载
if (bearerTokenProperties != null && bearerTokenProperties.getPaths() != null) {
paths.addAll(bearerTokenProperties.getPaths());
}
// 合并代码中动态添加的路径
paths.addAll(protectedPathPatterns);
return paths;
}
/**
* 程序化添加受保护路径Ant 风格匹配
*
* @param pattern Ant 路径模式 /fb/fishhatchrecr/**
*/
public void addProtectedPath(String pattern) {
if (pattern != null && !protectedPathPatterns.contains(pattern)) {
protectedPathPatterns.add(pattern);
log.info("已添加 Bearer Token 保护路径: {}", pattern);
}
}
private String resolveRequestPath(HttpServletRequest request) {
String servletPath = request.getServletPath();
if (servletPath != null && !servletPath.isEmpty()) {
return servletPath;
}
String uri = request.getRequestURI();
String contextPath = request.getContextPath();
if (contextPath != null && !contextPath.isEmpty() && uri.startsWith(contextPath)) {
return uri.substring(contextPath.length());
}
return uri;
}
}

View File

@ -0,0 +1,32 @@
package com.yfd.platform.config;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
/**
* Bearer Token 鉴权配置属性
*
* application.yml 中配置需要保护的接口路径
* <pre>
* bearer-token:
* paths:
* - /fb/fishhatchrecr/**
* - /some/other/api/**
* </pre>
*/
@Data
@Component
@ConfigurationProperties(prefix = "bearer-token")
public class BearerTokenProperties {
/**
* 需要使用 Bearer Token 鉴权的接口路径列表
* 支持 Ant 风格路径匹配 /api/**, /fb/**
*/
private List<String> paths = new ArrayList<>(List.of("/base/fpssrlR/ai/report"));
}

View File

@ -0,0 +1,189 @@
package com.yfd.platform.config;
import cn.hutool.core.util.StrUtil;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import jakarta.annotation.Resource;
import jakarta.servlet.http.HttpServletRequest;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;
import java.util.UUID;
/**
* Bearer Token 鉴权服务
*
* 负责 Bearer Token 的生成缓存和验证
* Token 通过 OAuth2 client_credentials 模式下发后由本服务统一验证
*/
@Service
public class BearerTokenService {
private static final Logger log = LoggerFactory.getLogger(BearerTokenService.class);
/** 默认 token 有效期2 小时 */
public static final long DEFAULT_EXPIRE_MILLIS = 2 * 60 * 60 * 1000L;
private static final String CACHE_PREFIX = "bearer:token:";
@Resource
private WebConfig webConfig;
/**
* 生成 Bearer Token 并存入缓存
* OAuth2 token 端点调用
*
* @param request 当前请求
* @param clientId 客户端标识
* @return token 信息accessToken, expiresIn
*/
public BearerTokenResult createToken(HttpServletRequest request, String clientId) {
String token = UUID.randomUUID().toString();
long expireAt = System.currentTimeMillis() + DEFAULT_EXPIRE_MILLIS;
JSONObject payload = new JSONObject();
payload.put("clientId", clientId);
payload.put("ip", getClientIp(request));
payload.put("expireAt", expireAt);
payload.put("createTime", System.currentTimeMillis());
webConfig.loginuserCache().put(CACHE_PREFIX + token, payload.toJSONString(), DEFAULT_EXPIRE_MILLIS);
log.info("Bearer Token 已创建, clientId={}, expireAt={}", clientId, expireAt);
BearerTokenResult result = new BearerTokenResult();
result.setAccessToken(token);
result.setTokenType("bearer");
result.setExpiresIn(DEFAULT_EXPIRE_MILLIS / 1000);
result.setExpireAt(expireAt);
return result;
}
/**
* 验证 Bearer Token 是否有效
*
* @param token Bearer Token
* @param request 当前请求
* @return true 有效false 无效或过期
*/
public boolean validateToken(String token, HttpServletRequest request) {
if (StrUtil.isBlank(token)) {
log.debug("Bearer Token 验证失败: token 为空");
return false;
}
String cacheValue = webConfig.loginuserCache().get(CACHE_PREFIX + token);
if (StrUtil.isBlank(cacheValue)) {
log.debug("Bearer Token 验证失败: token 不存在或已过期, token={}", maskToken(token));
return false;
}
JSONObject payload;
try {
payload = JSON.parseObject(cacheValue);
} catch (Exception e) {
log.warn("Bearer Token 解析失败: {}", e.getMessage());
return false;
}
// 检查过期时间
Long expireAt = payload.getLong("expireAt");
if (expireAt == null || expireAt < System.currentTimeMillis()) {
log.debug("Bearer Token 已过期, token={}", maskToken(token));
webConfig.loginuserCache().remove(CACHE_PREFIX + token);
return false;
}
// 可选校验 IP 一致性可在子类中覆盖
return true;
}
/**
* 从请求中解析 Bearer Token
* Authorization: Bearer <token> 头中提取
*
* @param request HTTP 请求
* @return token 字符串解析失败返回 null
*/
public String resolveToken(HttpServletRequest request) {
String authHeader = request.getHeader("Authorization");
if (StrUtil.isBlank(authHeader)) {
return null;
}
// 支持 "Bearer xxx" "bearer xxx" 格式
String trimmed = authHeader.trim();
if (trimmed.length() > 7
&& "bearer".equalsIgnoreCase(trimmed.substring(0, 6))
&& trimmed.charAt(6) == ' ') {
return trimmed.substring(7).trim();
}
return null;
}
/**
* 刷新 token 有效期延长使用时间
*
* @param token Bearer Token
*/
public void refreshToken(String token) {
if (StrUtil.isBlank(token)) return;
String cacheValue = webConfig.loginuserCache().get(CACHE_PREFIX + token);
if (StrUtil.isBlank(cacheValue)) return;
JSONObject payload = JSON.parseObject(cacheValue);
long newExpireAt = System.currentTimeMillis() + DEFAULT_EXPIRE_MILLIS;
payload.put("expireAt", newExpireAt);
webConfig.loginuserCache().put(CACHE_PREFIX + token, payload.toJSONString(), DEFAULT_EXPIRE_MILLIS);
}
/**
* 撤销 token
*
* @param token Bearer Token
*/
public void revokeToken(String token) {
if (StrUtil.isNotBlank(token)) {
webConfig.loginuserCache().remove(CACHE_PREFIX + token);
log.info("Bearer Token 已撤销");
}
}
private String getClientIp(HttpServletRequest request) {
String ip = request.getHeader("X-Forwarded-For");
if (StrUtil.isNotBlank(ip)) {
return ip.split(",")[0].trim();
}
return request.getRemoteAddr();
}
private String maskToken(String token) {
if (token == null || token.length() <= 8) return "***";
return token.substring(0, 4) + "***" + token.substring(token.length() - 4);
}
/**
* Bearer Token 创建结果
*/
public static class BearerTokenResult {
/** 访问令牌 */
private String accessToken;
/** 令牌类型 */
private String tokenType;
/** 有效期(秒) */
private long expiresIn;
/** 过期时间戳 */
private long expireAt;
public String getAccessToken() { return accessToken; }
public void setAccessToken(String accessToken) { this.accessToken = accessToken; }
public String getTokenType() { return tokenType; }
public void setTokenType(String tokenType) { this.tokenType = tokenType; }
public long getExpiresIn() { return expiresIn; }
public void setExpiresIn(long expiresIn) { this.expiresIn = expiresIn; }
public long getExpireAt() { return expireAt; }
public void setExpireAt(long expireAt) { this.expireAt = expireAt; }
}
}

View File

@ -0,0 +1,127 @@
package com.yfd.platform.config;
import cn.hutool.core.util.StrUtil;
import com.yfd.platform.config.BearerTokenService.BearerTokenResult;
import jakarta.annotation.Resource;
import jakarta.servlet.http.HttpServletRequest;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.nio.charset.StandardCharsets;
import java.util.Base64;
import java.util.HashMap;
import java.util.Map;
/**
* OAuth2 Token 端点
*
* <p>供外部系统通过 client_credentials 模式获取 Bearer Token
*
* <p>请求格式参考 鉴权与文件上传接口说明.md 3.2
* <pre>
* POST /oauth2/token
* Content-Type: application/x-www-form-urlencoded
* Authorization: Basic <base64(clientId:clientSecret)>
*
* grant_type=client_credentials
* </pre>
*
* <p>返回格式
* <pre>
* {
* "success": true,
* "errorCode": 0,
* "message": "获取token成功",
* "data": {
* "access_token": "xxx",
* "token_type": "bearer",
* "expires_in": 7200
* }
* }
* </pre>
*/
@RestController
@RequestMapping("/api/oauth2")
public class OAuth2TokenController {
private static final Logger log = LoggerFactory.getLogger(OAuth2TokenController.class);
@Resource
private BearerTokenService bearerTokenService;
/**
* 获取 Access Tokenclient_credentials 模式
*/
@PostMapping("/oauth/token")
public Map<String, Object> getToken(HttpServletRequest request) {
Map<String, Object> result = new HashMap<>();
// 解析 Authorization: Basic <base64>
String authHeader = request.getHeader("Authorization");
if (StrUtil.isBlank(authHeader) || !authHeader.trim().toLowerCase().startsWith("basic ")) {
log.warn("获取 Token 失败: 缺少有效的 Basic Authorization 头");
result.put("success", false);
result.put("errorCode", -1);
result.put("message", "缺少有效的 Authorization: Basic 认证信息");
return result;
}
String clientId = resolveClientId(authHeader);
if (StrUtil.isBlank(clientId)|| !"client:secret".equals(clientId)) {
log.warn("获取 Token 失败: 无法解析 client");
result.put("success", false);
result.put("errorCode", -1);
result.put("message", "无法解析客户端标识");
return result;
}
// 验证 grant_type
String grantType = request.getParameter("grant_type");
if (StrUtil.isBlank(grantType) || !"client_credentials".equals(grantType)) {
log.warn("获取 Token 失败: 不支持的 grant_type={}", grantType);
result.put("success", false);
result.put("errorCode", -1);
// 仅支持 client_credentials 授权模式
result.put("message", "授权模式错误");
return result;
}
BearerTokenResult tokenResult = bearerTokenService.createToken(request, clientId);
Map<String, Object> data = new HashMap<>();
data.put("access_token", tokenResult.getAccessToken());
data.put("token_type", tokenResult.getTokenType());
data.put("expires_in", tokenResult.getExpiresIn());
result.put("success", true);
result.put("errorCode", 0);
result.put("message", "获取token成功");
result.put("data", data);
log.info("OAuth2 Token 签发成功, clientId={}", clientId);
return result;
}
/**
* Authorization: Basic <base64> 头中解析 client
*/
private String resolveClientId(String authHeader) {
try {
String base64 = authHeader.substring(6).trim();
byte[] decoded = Base64.getDecoder().decode(base64);
// // 格式: client:secret
// int colonIdx = credentials.indexOf(':');
// if (colonIdx > 0) {
// return credentials.substring(0, colonIdx);
// }
return new String(decoded, StandardCharsets.UTF_8);
} catch (Exception e) {
log.warn("解析 Basic 认证信息失败: {}", e.getMessage());
return null;
}
}
}

View File

@ -42,6 +42,9 @@ public class SecurityConfig {
@Autowired
private RegisterAccessTokenFilter registerAccessTokenFilter;
@Autowired
private BearerTokenFilter bearerTokenFilter;
@Autowired
private AuthenticationException authenticationException;
@ -60,7 +63,8 @@ public class SecurityConfig {
.requestMatchers("/data/fishDraft/previewFile").permitAll()
.requestMatchers("/tempFile/**").permitAll()
.requestMatchers("/system/user/auditUser").permitAll()
.requestMatchers("/register/accessToken").permitAll()
.requestMatchers("/api/oauth2/oauth/token").permitAll()
.requestMatchers("/dict/cache/**").permitAll()
.requestMatchers("/sys/psbmodulelbb/**").permitAll()
.requestMatchers("/base/operationLog/**").permitAll()
// .requestMatchers("/eng/**").permitAll()
@ -87,6 +91,7 @@ public class SecurityConfig {
// .requestMatchers("/base/msalongb/**").permitAll()
// .requestMatchers("/base/msalongdetb/**").permitAll()
// .requestMatchers("/smartImage/**").permitAll()
// .requestMatchers("/base/fpssrlR/**").permitAll()
.requestMatchers("/sms/**").permitAll()
.requestMatchers(HttpMethod.GET, "/").permitAll()
.requestMatchers(HttpMethod.GET,
@ -114,6 +119,7 @@ public class SecurityConfig {
.cors(cors -> {});
http.addFilterBefore(registerAccessTokenFilter, UsernamePasswordAuthenticationFilter.class);
http.addFilterBefore(bearerTokenFilter, UsernamePasswordAuthenticationFilter.class);
http.addFilterBefore(jwtAuthenticationTokenFilter, UsernamePasswordAuthenticationFilter.class);
http.exceptionHandling(ex -> ex

View File

@ -2,6 +2,7 @@ package com.yfd.platform.qgc_base.controller;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.yfd.platform.annotation.DynamicDictEvict;
import com.yfd.platform.annotation.Log;
import com.yfd.platform.common.DataSourceRequest;
import com.yfd.platform.config.ResponseResult;
@ -104,6 +105,7 @@ public class SdEngInfoBHController {
@Log(module = "电站管理", value = "新增电站")
@PostMapping("/add")
@Operation(summary = "新增电站")
@DynamicDictEvict(tableName = "SD_ENGINFO_B_H", codeColumn = "STCD", nameColumn = "ENNM")
public ResponseResult add(@RequestBody SdEngInfoBHOperateRequest request) {
SdEngInfoBH engInfo = request == null || request.getEngInfo() == null ? null : objectMapper.convertValue(request.getEngInfo(), SdEngInfoBH.class);
boolean result = engInfoBHService.addEngInfo(engInfo, request.getSource());
@ -113,6 +115,7 @@ public class SdEngInfoBHController {
@Log(module = "电站管理", value = "修改电站")
@PostMapping("/update")
@Operation(summary = "修改电站")
@DynamicDictEvict(tableName = "SD_ENGINFO_B_H", codeColumn = "STCD", nameColumn = "ENNM")
public ResponseResult update(@RequestBody SdEngInfoBHOperateRequest request) throws Exception {
boolean result = engInfoBHService.updateEngInfo(request.getEngInfo(), request.getSource());
return result ? ResponseResult.success("修改成功") : ResponseResult.error("修改失败");
@ -121,6 +124,7 @@ public class SdEngInfoBHController {
@Log(module = "电站管理", value = "删除电站")
@PostMapping("/delete")
@Operation(summary = "删除电站")
@DynamicDictEvict(tableName = "SD_ENGINFO_B_H", codeColumn = "STCD", nameColumn = "ENNM")
public ResponseResult delete(@RequestBody SdEngInfoBHOperateRequest request) {
boolean result = engInfoBHService.deleteEngInfo(request == null ? null : request.getIds(),
request == null ? null : request.getSource());

View File

@ -1,13 +1,14 @@
package com.yfd.platform.qgc_base.controller;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.yfd.platform.annotation.Log;
import com.yfd.platform.common.DataSourceRequest;
import com.yfd.platform.config.ResponseResult;
import com.yfd.platform.qgc_base.domain.SdEngInfoBHOperateRequest;
import com.yfd.platform.qgc_base.domain.SdFpssrlR;
import com.yfd.platform.qgc_base.domain.SdFpssrlRAiRequest;
import com.yfd.platform.qgc_base.domain.*;
import com.yfd.platform.qgc_base.service.ISdFishDictoryBService;
import com.yfd.platform.qgc_base.service.ISdFpssrlRService;
import com.yfd.platform.qgc_data.service.AttachmentUploadService;
import io.swagger.v3.oas.annotations.Operation;
@ -19,6 +20,7 @@ import org.springframework.web.multipart.MultipartFile;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
/**
@ -41,6 +43,9 @@ public class SdFpssrlRController {
@Resource
private AttachmentUploadService attachmentUploadService;
@Resource
private ISdFishDictoryBService sdFishDictoryBService;
// ==================== CRUD 方法 ====================
@PostMapping("/queryPageList")
@ -131,7 +136,14 @@ public class SdFpssrlRController {
if (requests == null || requests.isEmpty()) {
return ResponseResult.error("请求数据不能为空");
}
List<SdFishDictoryB> list = sdFishDictoryBService.list(new LambdaQueryWrapper<SdFishDictoryB>().eq(SdFishDictoryB::getIsDeleted, "0").select(SdFishDictoryB::getId, SdFishDictoryB::getName));
Map<String, String> idNameMap = list.stream()
.filter(item -> item.getId() != null && item.getName() != null)
.collect(Collectors.toMap(
SdFishDictoryB::getName,
SdFishDictoryB::getId,
(oldValue, newValue) -> oldValue // 如果有重复 key 保留旧值实际不会重复
));
// 逐条校验
for (int i = 0; i < requests.size(); i++) {
SdFpssrlRAiRequest req = requests.get(i);
@ -141,16 +153,22 @@ public class SdFpssrlRController {
if (req.getStcd() == null || req.getStcd().isEmpty()) {
return ResponseResult.error("" + (i + 1) + "条过鱼设施编码(stcd)不能为空");
}
if (req.getFwdx() == null || req.getFwdx().isEmpty()) {
return ResponseResult.error("" + (i + 1) + "条服务对象(fwdx)不能为空");
}
if (req.getTm() == null) {
return ResponseResult.error("" + (i + 1) + "条识别时间(tm)不能为空");
}
if (req.getFtp() == null || req.getFtp().isEmpty()) {
return ResponseResult.error("" + (i + 1) + "条鱼种类(ftp)不能为空");
}
if (StrUtil.isNotBlank(req.getFtp())) {
req.setFtp(idNameMap.getOrDefault(req.getFtp(), req.getFtp()));
}
}
try {
List<SdFpssrlR> result = sdFpssrlRService.processAiReportBatch(requests);
List<SdFpssrlAiR> result = sdFpssrlRService.processAiReportBatch(requests);
// List<String> ids = result.stream().map(SdFpssrlR::getId).collect(Collectors.toList());
log.info("AI批量上报成功共{}条", result.size());
return ResponseResult.success();

View File

@ -104,6 +104,9 @@ public class SdAiboxBH implements Serializable {
@FieldChinese("是否启用")
private Integer usfl;
@TableField(exist = false)
private String usflName;
/**
* 数据是否接入
*/

View File

@ -60,6 +60,10 @@ public class SdEngInfoBH implements Serializable {
@FieldChinese("是否启用")
private Integer usfl;
/** 是否启用名称 */
@TableField(exist = false)
private String usflName;
/** 水能利用数据是否接入 */
@FieldChinese("水能利用数据是否接入")
private Integer dtin;
@ -219,15 +223,31 @@ public class SdEngInfoBH implements Serializable {
@FieldChinese("建设状态")
private String bldstt;
/** 站类 */
@FieldChinese("站类")
private String sttp;
/** 站类名称 */
@TableField(exist = false)
private String sttpName;
/** 建设状态分类 */
@TableField("BLDSTT_CODE")
@FieldChinese("建设状态分类")
private Integer bldsttCode;
/** 建设状态分类名称 */
@TableField(exist = false)
private String bldsttCodeName;
/** 工程类别 */
@FieldChinese("工程类别")
private Integer engtp;
/** 工程类别名称 */
@TableField(exist = false)
private String engtpName;
/** 工程规模 */
@FieldChinese("工程规模")
private Integer prsc;
@ -236,14 +256,26 @@ public class SdEngInfoBH implements Serializable {
@FieldChinese("工程规模(水库库容)")
private Integer scrsc;
/** 工程规模(水库库容)名称 */
@TableField(exist = false)
private String scrscName;
/** 工程等别 */
@FieldChinese("工程等别")
private String prgr;
/** 工程等别名称 */
@TableField(exist = false)
private String prgrName;
/** 电站-主要功能 */
@FieldChinese("电站-主要功能")
private String fn;
/** 电站-主要功能名称 */
@TableField(exist = false)
private String fnName;
/** 地震基本烈度 */
@FieldChinese("地震基本烈度")
private String bsssin;
@ -256,31 +288,58 @@ public class SdEngInfoBH implements Serializable {
@FieldChinese("是否调节水库")
private Integer adjustEng;
/** 是否调节水库名称 */
@TableField(exist = false)
private String adjustEngName;
/** 有无拦河坝 */
@TableField("ISHVBRRG")
@FieldChinese("有无拦河坝")
private String ishvrgrg;
/** 有无拦河坝名称 */
@TableField(exist = false)
private String ishvrgrgName;
/** 水库调节性能 */
@FieldChinese("水库调节性能")
private String rgcp;
@TableField(exist = false)
private String rgcpName;
/** 坝体材质 */
@FieldChinese("坝体材质")
private Integer dmat;
/** 坝体材质名称 */
@TableField(exist = false)
private String dmatName;
/** 坝体类型 */
@FieldChinese("坝体类型")
private String dmtp;
/** 坝体类型名称 */
@TableField(exist = false)
private String dmtpName;
/** 开发方式 */
@FieldChinese("开发方式")
private String dvtp;
/** 开发方式名称 */
@TableField(exist = false)
private String dvtpName;
/** 建设类型 */
@FieldChinese("建设类型")
private String cntp;
/** 建设类型名称 */
@TableField(exist = false)
private String cntpName;
/** 管理单位 */
@FieldChinese("管理单位")
private String mnun;
@ -293,6 +352,10 @@ public class SdEngInfoBH implements Serializable {
@FieldChinese("归属部门")
private String blsys;
/** 归属部门名称 */
@TableField(exist = false)
private String blsysName;
/** 绕经度方向旋转矩阵值 */
@FieldChinese("绕经度方向旋转矩阵值")
private Double roll;
@ -313,6 +376,10 @@ public class SdEngInfoBH implements Serializable {
@FieldChinese("是否受下游顶托")
private String impdstrz;
/** 是否受下游顶托名称 */
@TableField(exist = false)
private String impdstrzName;
/** 工程概况 */
@FieldChinese("工程概况")
private String prov;
@ -831,6 +898,10 @@ public class SdEngInfoBH implements Serializable {
@FieldChinese("航道级别")
private String chngrd;
/** 渠道级别名称 */
@TableField(exist = false)
private String chngrdName;
/** 渠化航道里程 */
@FieldChinese("渠化航道里程")
private Double chnlnth;
@ -968,6 +1039,10 @@ public class SdEngInfoBH implements Serializable {
@FieldChinese("是否主要流域电站")
private Integer chiefbasineng;
/** 是否主要流域电站名称 */
@TableField(exist = false)
private String chiefbasinengName;
/** 蓄水开始时间 */
@FieldChinese("蓄水开始时间")
private String swsdt;
@ -1037,18 +1112,34 @@ public class SdEngInfoBH implements Serializable {
@FieldChinese("环境监测数据接入情况")
private Integer dtinEnv;
/** 环境监测数据接入情况描述 */
@TableField(exist = false)
private String dtinEnvName;
/** 最新运行状态1=运行中 2=未运行 */
@FieldChinese("最新运行状态")
private Integer runState;
/** 最新运行状态描述 */
@TableField(exist = false)
private String runStateName;
/** 告警状态 */
@FieldChinese("告警状态")
private String warnState;
/** 告警状态描述 */
@TableField(exist = false)
private String warnStateName;
/** 开展环保自动检测工作状态0=暂无数据 1=正常 */
@FieldChinese("开展环保自动检测工作状态")
private Integer coenvwState;
/** 开展环保自动检测工作状态描述 */
@TableField(exist = false)
private String coenvwStateName;
/** 在线地址 */
@FieldChinese("在线地址")
private String url;

View File

@ -0,0 +1,121 @@
package com.yfd.platform.qgc_base.domain;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Date;
/**
* <p>
* 过鱼设施AI盒子自动数据表
* </p>
*/
@Data
@TableName("SD_FPSSRL_AI_R")
public class SdFpssrlAiR implements Serializable {
private static final long serialVersionUID = 1L;
/** 主键ID */
@TableId(type = IdType.ASSIGN_UUID)
private String id;
/** 过鱼设施编码 */
private String stcd;
/** 时间 */
private Date tm;
/** 鱼种类 */
private String ftp;
/** 过鱼数量 */
private Integer fcnt;
/** 鱼尺寸:大/中/小 */
private String fsz;
/** 鱼长度 */
private BigDecimal length;
/** 鱼宽度 */
private BigDecimal width;
/** 鱼速度 */
private String fishspeed;
/** 游向0=上行 1=下行 */
private Integer direction;
/** 鱼位置 */
private Long fishposition;
/** 鱼截图主图片url */
private String firstImgUrl;
/** 鱼截图副图片url */
private String secondImgUrl;
/** 视频url */
private String videoUrl;
/** 水温:单位:℃ */
private BigDecimal temperature;
/** 水位单位m */
private BigDecimal waterlevel;
/** 流速单位m/s */
private BigDecimal speed;
/** 流量单位m3/s */
private BigDecimal q;
/** 溶氧单位mg/L */
private BigDecimal dox;
/** 浊度单位NTU */
private Integer tu;
/** 过鱼通道 */
private String channelno;
/** AI盒子编码 */
private String aiBoxCode;
/** 创建人 */
private String recordUser;
/** 创建时间 */
private Date recordTime;
/** 更新人 */
private String modifyUser;
/** 更新时间 */
private Date modifyTime;
/** 是否已删除0=未删除 1=已删除 */
private Integer isDeleted;
/** 删除人 */
private String deleteUser;
/** 删除时间 */
private Date deleteTime;
/** 附件ID */
private String fid;
/** 备注 */
private String remark;
/** 过鱼设施名称(非表字段,用于列表展示) */
@TableField(exist = false)
private String stnm;
}

View File

@ -38,6 +38,11 @@ public class SdFpssrlRAiRequest {
*/
private String fsz;
/**
* 服务对象
*/
private String fwdx;
/**
* 鱼长度单位cm
*/

View File

@ -245,7 +245,8 @@ public class SdVdinfoB implements Serializable {
/** 视频站设备机位变更日期 */
@FieldChinese("视频站设备机位变更日期")
private Integer jwupdate;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Date jwupdate;
/** 视频站AI识别是否启用 */
@FieldChinese("视频站AI识别是否启用")

View File

@ -0,0 +1,22 @@
package com.yfd.platform.qgc_base.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.yfd.platform.qgc_base.domain.SdFpssrlAiR;
import org.apache.ibatis.annotations.Mapper;
import java.util.List;
/**
* <p>
* 过鱼设施AI盒子自动数据表 Mapper 接口
* </p>
*/
@Mapper
public interface SdFpssrlAiRMapper extends BaseMapper<SdFpssrlAiR> {
/**
* 批量合并过鱼AI自动数据基于 STCD + TM + FTP 唯一
* 存在则更新不存在则新增
*/
int mergeFishRecords(List<SdFpssrlAiR> list);
}

View File

@ -3,6 +3,7 @@ package com.yfd.platform.qgc_base.service;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.yfd.platform.common.DataSourceRequest;
import com.yfd.platform.qgc_base.domain.SdFpssrlAiR;
import com.yfd.platform.qgc_base.domain.SdFpssrlR;
import com.yfd.platform.qgc_base.domain.SdFpssrlRAiRequest;
@ -48,5 +49,5 @@ public interface ISdFpssrlRService extends IService<SdFpssrlR> {
/**
* 批量处理AI设备上报的识别数据
*/
List<SdFpssrlR> processAiReportBatch(List<SdFpssrlRAiRequest> requests);
List<SdFpssrlAiR> processAiReportBatch(List<SdFpssrlRAiRequest> requests);
}

View File

@ -52,10 +52,12 @@ public class SdAiboxBHServiceImpl extends ServiceImpl<SdAiboxBHMapper, SdAiboxBH
CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("mway").modifyProperty("mwayName").dictType("STATIC").dictSource("MWAY").build());
CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("bldsttCode").modifyProperty("bldsttCodeName").dictType("STATIC").dictSource("BLDSTT_CODE").build());
// CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("dtinType").modifyProperty("dtinTypeName").dictType("STATIC").dictSource("DTIN_TYPE").build());
CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("sttp").modifyProperty("sttpName").dictType("DYNAMIC").dictSource("SD_STTP_B").codeColumn("STTP_CODE").nameColumn("STTP_NAME").filter("NVL(IS_DELETED, 0) = 0 ").build());
CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("baseId").modifyProperty("baseName").dictType("DYNAMIC").dictSource("SD_HYDROBASE").codeColumn("BASEID").nameColumn("BASENAME").filter("NVL(IS_DELETED, 0) = 0 ").build());
CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("rstcd").modifyProperty("ennm").dictType("DYNAMIC").dictSource("SD_ENGINFO_B_H").codeColumn("STCD").nameColumn("ENNM").filter("NVL(IS_DELETED, 0) = 0 ").build());
CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("sttp").modifyProperty("sttpName").dictType("DYNAMIC").dictSource("SD_STTP_B").codeColumn("STTP_CODE").nameColumn("STTP_NAME").filter("IS_DELETED = 0 ").build());
CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("baseId").modifyProperty("baseName").dictType("DYNAMIC").dictSource("SD_HYDROBASE").codeColumn("BASEID").nameColumn("BASENAME").filter("IS_DELETED = 0 ").build());
CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("rstcd").modifyProperty("ennm").dictType("DYNAMIC").dictSource("SD_ENGINFO_B_H").codeColumn("STCD").nameColumn("ENNM").filter("IS_DELETED = 0 ").build());
CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("rvcd").modifyProperty("rvnm").dictType("DYNAMIC").dictSource("V_SD_RVCD_DIC_TREE").codeColumn("RVCD").nameColumn("RVNM").build());
CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("usfl").modifyProperty("usflName").dictType("STATIC").dictSource("TY_SF").build());
}

View File

@ -40,9 +40,9 @@ public class SdAimonitorBHServiceImpl extends ServiceImpl<SdAimonitorBHMapper, S
CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("dtin").modifyProperty("dtinName").dictType("STATIC").dictSource("DTIN").build());
CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("mway").modifyProperty("mwayName").dictType("STATIC").dictSource("MWAY").build());
CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("bldsttCode").modifyProperty("bldsttCodeName").dictType("STATIC").dictSource("BLDSTT_CODE").build());
CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("sttp").modifyProperty("sttpName").dictType("DYNAMIC").dictSource("SD_STTP_B").codeColumn("STTP_CODE").nameColumn("STTP_NAME").filter("NVL(IS_DELETED, 0) = 0 ").build());
CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("baseId").modifyProperty("baseName").dictType("DYNAMIC").dictSource("SD_HYDROBASE").codeColumn("BASEID").nameColumn("BASENAME").filter("NVL(IS_DELETED, 0) = 0 ").build());
CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("rstcd").modifyProperty("ennm").dictType("DYNAMIC").dictSource("SD_ENGINFO_B_H").codeColumn("STCD").nameColumn("ENNM").filter("NVL(IS_DELETED, 0) = 0 ").build());
CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("sttp").modifyProperty("sttpName").dictType("DYNAMIC").dictSource("SD_STTP_B").codeColumn("STTP_CODE").nameColumn("STTP_NAME").filter("IS_DELETED = 0 ").build());
CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("baseId").modifyProperty("baseName").dictType("DYNAMIC").dictSource("SD_HYDROBASE").codeColumn("BASEID").nameColumn("BASENAME").filter("IS_DELETED = 0 ").build());
CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("rstcd").modifyProperty("ennm").dictType("DYNAMIC").dictSource("SD_ENGINFO_B_H").codeColumn("STCD").nameColumn("ENNM").filter("IS_DELETED = 0 ").build());
CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("rvcd").modifyProperty("rvnm").dictType("DYNAMIC").dictSource("V_SD_RVCD_DIC_TREE").codeColumn("RVCD").nameColumn("RVNM").build());
}

View File

@ -45,9 +45,9 @@ public class SdArtsgBHServiceImpl extends ServiceImpl<SdArtsgBHMapper, SdArtsgBH
CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("dtin").modifyProperty("dtinName").dictType("STATIC").dictSource("DTIN").build());
CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("bldsttCode").modifyProperty("bldsttCodeName").dictType("STATIC").dictSource("BLDSTT_CODE").build());
// CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("dtinType").modifyProperty("dtinTypeName").dictType("STATIC").dictSource("DTIN_TYPE").build());
CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("sttp").modifyProperty("sttpName").dictType("DYNAMIC").dictSource("SD_STTP_B").codeColumn("STTP_CODE").nameColumn("STTP_NAME").filter("NVL(IS_DELETED, 0) = 0 ").build());
CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("baseId").modifyProperty("baseName").dictType("DYNAMIC").dictSource("SD_HYDROBASE").codeColumn("BASEID").nameColumn("BASENAME").filter("NVL(IS_DELETED, 0) = 0 ").build());
CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("rstcd").modifyProperty("ennm").dictType("DYNAMIC").dictSource("SD_ENGINFO_B_H").codeColumn("STCD").nameColumn("ENNM").filter("NVL(IS_DELETED, 0) = 0 ").build());
CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("sttp").modifyProperty("sttpName").dictType("DYNAMIC").dictSource("SD_STTP_B").codeColumn("STTP_CODE").nameColumn("STTP_NAME").filter("IS_DELETED = 0 ").build());
CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("baseId").modifyProperty("baseName").dictType("DYNAMIC").dictSource("SD_HYDROBASE").codeColumn("BASEID").nameColumn("BASENAME").filter("IS_DELETED = 0 ").build());
CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("rstcd").modifyProperty("ennm").dictType("DYNAMIC").dictSource("SD_ENGINFO_B_H").codeColumn("STCD").nameColumn("ENNM").filter("IS_DELETED = 0 ").build());
CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("rvcd").modifyProperty("rvnm").dictType("DYNAMIC").dictSource("V_SD_RVCD_DIC_TREE").codeColumn("RVCD").nameColumn("RVNM").build());
}

View File

@ -51,9 +51,9 @@ public class SdDwBHServiceImpl extends ServiceImpl<SdDwBHMapper, SdDwBH> impleme
CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("dtin").modifyProperty("dtinName").dictType("STATIC").dictSource("DTIN").build());
CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("bldsttCode").modifyProperty("bldsttCodeName").dictType("STATIC").dictSource("BLDSTT_CODE").build());
// CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("dtinType").modifyProperty("dtinTypeName").dictType("STATIC").dictSource("DTIN_TYPE").build());
CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("sttp").modifyProperty("sttpName").dictType("DYNAMIC").dictSource("SD_STTP_B").codeColumn("STTP_CODE").nameColumn("STTP_NAME").filter("NVL(IS_DELETED, 0) = 0 ").build());
CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("baseId").modifyProperty("baseName").dictType("DYNAMIC").dictSource("SD_HYDROBASE").codeColumn("BASEID").nameColumn("BASENAME").filter("NVL(IS_DELETED, 0) = 0 ").build());
CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("rstcd").modifyProperty("ennm").dictType("DYNAMIC").dictSource("SD_ENGINFO_B_H").codeColumn("STCD").nameColumn("ENNM").filter("NVL(IS_DELETED, 0) = 0 ").build());
CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("sttp").modifyProperty("sttpName").dictType("DYNAMIC").dictSource("SD_STTP_B").codeColumn("STTP_CODE").nameColumn("STTP_NAME").filter("IS_DELETED = 0 ").build());
CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("baseId").modifyProperty("baseName").dictType("DYNAMIC").dictSource("SD_HYDROBASE").codeColumn("BASEID").nameColumn("BASENAME").filter("IS_DELETED = 0 ").build());
CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("rstcd").modifyProperty("ennm").dictType("DYNAMIC").dictSource("SD_ENGINFO_B_H").codeColumn("STCD").nameColumn("ENNM").filter("IS_DELETED = 0 ").build());
}
@Override

View File

@ -16,6 +16,7 @@ import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.JsonMappingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.yfd.platform.annotation.FieldChinese;
import com.yfd.platform.common.DataSourceLoadOptionsBase;
import com.yfd.platform.common.DataSourceRequest;
import com.yfd.platform.common.DataSourceResult;
@ -45,9 +46,7 @@ import com.yfd.platform.qgc_base.service.IMsOperationLogService;
import com.yfd.platform.qgc_base.service.ISdEngInfoBHService;
import com.yfd.platform.qgc_eng.eq.entity.vo.LastTmEngEqDataVo;
import com.yfd.platform.system.service.IAdminAuthService;
import com.yfd.platform.utils.QgcQueryWrapperUtil;
import com.yfd.platform.utils.RedisCacheUtil;
import com.yfd.platform.utils.SecurityUtils;
import com.yfd.platform.utils.*;
import jakarta.annotation.Resource;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.Cacheable;
@ -66,13 +65,61 @@ import java.util.stream.Collectors;
*/
@Service
public class SdEngInfoBHServiceImpl extends ServiceImpl<SdEngInfoBHMapper, SdEngInfoBH> implements ISdEngInfoBHService {
private static final String TABLE_NAME = "SD_FISHDICTORY_B";
private static final Map<String, String> ENG_CODE_NAME_FIELD_MAP = new LinkedHashMap<>();
@Resource
private RedisCacheUtil redisCacheUtil;
@Resource
private IDataScopeFilterService dataScopeFilterService;
@Resource
private DictCodeToNameConverter dictCodeToNameConverter;
/**
* 代码转名称元数据配置列表静态初始化
* <p>
* 每个模块的 ServiceImpl 中可按需定义自己的 codeToNameMetadataBoList
* 在查询方法返回前调用 dictCodeToNameConverter.convertCodeToName(voList, codeToNameMetadataBoList)
* 即可自动将 code 字段转为对应的 name 字段
* </p>
*
* <pre>
* 使用示例
* // 在查询方法末尾调用
* dictCodeToNameConverter.convertCodeToName(voList, CODE_TO_NAME_META_LIST);
* </pre>
*/
private static final List<CodeToNameMetadataBo> CODE_TO_NAME_META_LIST = new ArrayList<>();
static {
CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("dtin").modifyProperty("dtinName").dictType("STATIC").dictSource("DTIN").build());
CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("mway").modifyProperty("mwayName").dictType("STATIC").dictSource("MWAY").build());
CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("bldsttCode").modifyProperty("bldsttCodeName").dictType("STATIC").dictSource("BLDSTT_CODE").build());
CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("dtinEnv").modifyProperty("dtinEnvName").dictType("STATIC").dictSource("DTIN_ENV").build());
CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("sttp").modifyProperty("sttpName").dictType("DYNAMIC").dictSource("SD_STTP_B").codeColumn("STTP_CODE").nameColumn("STTP_NAME").filter("IS_DELETED = 0 ").build());
CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("usfl").modifyProperty("usflName").dictType("STATIC").dictSource("USFL").build());
CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("runState").modifyProperty("runStateName").dictType("STATIC").dictSource("RUN_STATE").build());
CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("warnState").modifyProperty("warnStateName").dictType("STATIC").dictSource("WARN_STATE").build());
CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("coenvwState").modifyProperty("coenvwStateName").dictType("STATIC").dictSource("COENVW_STATE").build());
CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("scrsc").modifyProperty("scrscStateName").dictType("STATIC").dictSource("SCRSC").build());
CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("adjustEng").modifyProperty("adjustEngName").dictType("STATIC").dictSource("TY_SF").build());
CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("chiefbasineng").modifyProperty("chiefbasinengName").dictType("STATIC").dictSource("TY_SF").build());
CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("impdstrz").modifyProperty("impdstrzName").dictType("STATIC").dictSource("TY_SF").build());
CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("ishvbrrg").modifyProperty("ishvbrrgName").dictType("STATIC").dictSource("YW_TY").build());
CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("dvtp").modifyProperty("dvtpName").dictType("STATIC").dictSource("DVTP").build());
CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("blsys").modifyProperty("blsysName").dictType("STATIC").dictSource("BLSYS").build());
CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("chngrd").modifyProperty("chngrdName").dictType("STATIC").dictSource("CHNGRD").build());
CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("cntp").modifyProperty("cntpName").dictType("STATIC").dictSource("CNTP").build());
CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("dmat").modifyProperty("dmatName").dictType("STATIC").dictSource("DMAT").build());
CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("dmtp").modifyProperty("dmtpName").dictType("STATIC").dictSource("DMTP").build());
CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("engtp").modifyProperty("engtpName").dictType("STATIC").dictSource("ENGTP").build());
CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("fn").modifyProperty("fnName").dictType("STATIC").dictSource("ENG_FN").build());
CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("prgr").modifyProperty("prgrName").dictType("STATIC").dictSource("PRGR").build());
}
static {
ENG_CODE_NAME_FIELD_MAP.put("baseId", "baseName");
ENG_CODE_NAME_FIELD_MAP.put("hbrvcd", "hbrvcdName");
@ -252,10 +299,11 @@ public class SdEngInfoBHServiceImpl extends ServiceImpl<SdEngInfoBHMapper, SdEng
@CacheEvict(cacheNames = "engInfoCache", allEntries = true)
@Transactional(rollbackFor = Exception.class)
public boolean addEngInfo(SdEngInfoBH engInfo, String source) {
fillRelatedNameFields(engInfo);
// fillRelatedNameFields(engInfo);
boolean result = this.save(engInfo);
if (result) {
msOperationLogService.recordEngAddLog(engInfo, source);
dictCodeToNameConverter.convertCodeToName(engInfo, CODE_TO_NAME_META_LIST);
msOperationLogService.recordAddDetailLog(engInfo.getStcd(),TABLE_NAME, engInfo, source, CODE_TO_NAME_META_LIST);
}
return result;
}
@ -273,11 +321,13 @@ public class SdEngInfoBHServiceImpl extends ServiceImpl<SdEngInfoBHMapper, SdEng
SdEngInfoBH after = before == null ? engInfo : BeanUtil.copyProperties(before, SdEngInfoBH.class);
if (after != null) {
BeanUtil.copyProperties(engInfo, after, CopyOptions.create().ignoreNullValue());
fillRelatedNameFields(after);
// fillRelatedNameFields(after);
}
boolean result = this.updateById(after);
if (result && before != null) {
msOperationLogService.recordEngUpdateLog(before, after, source);
dictCodeToNameConverter.convertCodeToName(engInfo, CODE_TO_NAME_META_LIST);
dictCodeToNameConverter.convertCodeToName(before, CODE_TO_NAME_META_LIST);
msOperationLogService.recordModifyDetailLog(engInfo.getStcd(),TABLE_NAME, before, after, source, CODE_TO_NAME_META_LIST);
}
return result;
}
@ -302,7 +352,9 @@ public class SdEngInfoBHServiceImpl extends ServiceImpl<SdEngInfoBHMapper, SdEng
fillRelatedNameFields(after);
boolean result = updateEngInfoByPatch(stcd, after, filteredPatch);
if (result) {
msOperationLogService.recordEngUpdateLog(before, after, source);
dictCodeToNameConverter.convertCodeToName(after, CODE_TO_NAME_META_LIST);
dictCodeToNameConverter.convertCodeToName(before, CODE_TO_NAME_META_LIST);
msOperationLogService.recordModifyDetailLog(before.getStcd(),TABLE_NAME,before, after, source, CODE_TO_NAME_META_LIST);
}
return result;
}
@ -562,7 +614,9 @@ public class SdEngInfoBHServiceImpl extends ServiceImpl<SdEngInfoBHMapper, SdEng
.set(SdEngInfoBH::getDeleteTime, new Date()));
if (result) {
for (SdEngInfoBH before : beforeList) {
msOperationLogService.recordEngDeleteLog(before, source);
dictCodeToNameConverter.convertCodeToName(before, CODE_TO_NAME_META_LIST);
msOperationLogService.recordDeleteDetailLog(before.getStcd(),TABLE_NAME, before, source,CODE_TO_NAME_META_LIST);
// msOperationLogService.recordEngDeleteLog(before, source);
}
}
return result;

View File

@ -51,9 +51,9 @@ public class SdEqBHServiceImpl extends ServiceImpl<SdEqBHMapper, SdEqBH> impleme
CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("dtin").modifyProperty("dtinName").dictType("STATIC").dictSource("DTIN").build());
CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("bldsttCode").modifyProperty("bldsttCodeName").dictType("STATIC").dictSource("BLDSTT_CODE").build());
// CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("dtinType").modifyProperty("dtinTypeName").dictType("STATIC").dictSource("DTIN_TYPE").build());
CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("sttp").modifyProperty("sttpName").dictType("DYNAMIC").dictSource("SD_STTP_B").codeColumn("STTP_CODE").nameColumn("STTP_NAME").filter("NVL(IS_DELETED, 0) = 0 ").build());
CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("baseId").modifyProperty("baseName").dictType("DYNAMIC").dictSource("SD_HYDROBASE").codeColumn("BASEID").nameColumn("BASENAME").filter("NVL(IS_DELETED, 0) = 0 ").build());
CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("rstcd").modifyProperty("ennm").dictType("DYNAMIC").dictSource("SD_ENGINFO_B_H").codeColumn("STCD").nameColumn("ENNM").filter("NVL(IS_DELETED, 0) = 0 ").build());
CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("sttp").modifyProperty("sttpName").dictType("DYNAMIC").dictSource("SD_STTP_B").codeColumn("STTP_CODE").nameColumn("STTP_NAME").filter("IS_DELETED = 0 ").build());
CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("baseId").modifyProperty("baseName").dictType("DYNAMIC").dictSource("SD_HYDROBASE").codeColumn("BASEID").nameColumn("BASENAME").filter("IS_DELETED = 0 ").build());
CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("rstcd").modifyProperty("ennm").dictType("DYNAMIC").dictSource("SD_ENGINFO_B_H").codeColumn("STCD").nameColumn("ENNM").filter("IS_DELETED = 0 ").build());
}
@Override

View File

@ -48,9 +48,9 @@ public class SdFbrdBHServiceImpl extends ServiceImpl<SdFbrdBHMapper, SdFbrdBH> i
CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("dtin").modifyProperty("dtinName").dictType("STATIC").dictSource("DTIN").build());
CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("bldsttCode").modifyProperty("bldsttCodeName").dictType("STATIC").dictSource("BLDSTT_CODE").build());
// CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("dtinType").modifyProperty("dtinTypeName").dictType("STATIC").dictSource("DTIN_TYPE").build());
CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("sttp").modifyProperty("sttpName").dictType("DYNAMIC").dictSource("SD_STTP_B").codeColumn("STTP_CODE").nameColumn("STTP_NAME").filter("NVL(IS_DELETED, 0) = 0 ").build());
CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("baseId").modifyProperty("baseName").dictType("DYNAMIC").dictSource("SD_HYDROBASE").codeColumn("BASEID").nameColumn("BASENAME").filter("NVL(IS_DELETED, 0) = 0 ").build());
CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("rstcd").modifyProperty("ennm").dictType("DYNAMIC").dictSource("SD_ENGINFO_B_H").codeColumn("STCD").nameColumn("ENNM").filter("NVL(IS_DELETED, 0) = 0 ").build());
CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("sttp").modifyProperty("sttpName").dictType("DYNAMIC").dictSource("SD_STTP_B").codeColumn("STTP_CODE").nameColumn("STTP_NAME").filter("IS_DELETED = 0 ").build());
CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("baseId").modifyProperty("baseName").dictType("DYNAMIC").dictSource("SD_HYDROBASE").codeColumn("BASEID").nameColumn("BASENAME").filter("IS_DELETED = 0 ").build());
CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("rstcd").modifyProperty("ennm").dictType("DYNAMIC").dictSource("SD_ENGINFO_B_H").codeColumn("STCD").nameColumn("ENNM").filter("IS_DELETED = 0 ").build());
}
@Override

View File

@ -51,9 +51,9 @@ public class SdFhbtBHServiceImpl extends ServiceImpl<SdFhbtBHMapper, SdFhbtBH> i
CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("dtin").modifyProperty("dtinName").dictType("STATIC").dictSource("DTIN").build());
// CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("bldsttCode").modifyProperty("bldsttCodeName").dictType("STATIC").dictSource("BLDSTT_CODE").build());
// CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("dtinType").modifyProperty("dtinTypeName").dictType("STATIC").dictSource("DTIN_TYPE").build());
// CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("sttp").modifyProperty("sttpName").dictType("DYNAMIC").dictSource("SD_STTP_B").codeColumn("STTP_CODE").nameColumn("STTP_NAME").filter("NVL(IS_DELETED, 0) = 0 ").build());
CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("baseId").modifyProperty("baseName").dictType("DYNAMIC").dictSource("SD_HYDROBASE").codeColumn("BASEID").nameColumn("BASENAME").filter("NVL(IS_DELETED, 0) = 0 ").build());
CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("rstcd").modifyProperty("ennm").dictType("DYNAMIC").dictSource("SD_ENGINFO_B_H").codeColumn("STCD").nameColumn("ENNM").filter("NVL(IS_DELETED, 0) = 0 ").build());
// CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("sttp").modifyProperty("sttpName").dictType("DYNAMIC").dictSource("SD_STTP_B").codeColumn("STTP_CODE").nameColumn("STTP_NAME").filter("IS_DELETED = 0 ").build());
CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("baseId").modifyProperty("baseName").dictType("DYNAMIC").dictSource("SD_HYDROBASE").codeColumn("BASEID").nameColumn("BASENAME").filter("IS_DELETED = 0 ").build());
CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("rstcd").modifyProperty("ennm").dictType("DYNAMIC").dictSource("SD_ENGINFO_B_H").codeColumn("STCD").nameColumn("ENNM").filter("IS_DELETED = 0 ").build());
CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("rvcd").modifyProperty("rvnm").dictType("DYNAMIC").dictSource("V_SD_RVCD_DIC_TREE").codeColumn("RVCD").nameColumn("RVNM").build());
}

View File

@ -63,9 +63,9 @@ public class SdFpssBHServiceImpl extends ServiceImpl<SdFpssBHMapper, SdFpssBH> i
CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("dtin").modifyProperty("dtinName").dictType("STATIC").dictSource("DTIN").build());
CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("bldsttCode").modifyProperty("bldsttCodeName").dictType("STATIC").dictSource("BLDSTT_CODE").build());
// CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("dtinType").modifyProperty("dtinTypeName").dictType("STATIC").dictSource("DTIN_TYPE").build());
CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("sttp").modifyProperty("sttpName").dictType("DYNAMIC").dictSource("SD_STTP_B").codeColumn("STTP_CODE").nameColumn("STTP_NAME").filter("NVL(IS_DELETED, 0) = 0 ").build());
CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("baseId").modifyProperty("baseName").dictType("DYNAMIC").dictSource("SD_HYDROBASE").codeColumn("BASEID").nameColumn("BASENAME").filter("NVL(IS_DELETED, 0) = 0 ").build());
CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("rstcd").modifyProperty("ennm").dictType("DYNAMIC").dictSource("SD_ENGINFO_B_H").codeColumn("STCD").nameColumn("ENNM").filter("NVL(IS_DELETED, 0) = 0 ").build());
CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("sttp").modifyProperty("sttpName").dictType("DYNAMIC").dictSource("SD_STTP_B").codeColumn("STTP_CODE").nameColumn("STTP_NAME").filter("IS_DELETED = 0 ").build());
CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("baseId").modifyProperty("baseName").dictType("DYNAMIC").dictSource("SD_HYDROBASE").codeColumn("BASEID").nameColumn("BASENAME").filter("IS_DELETED = 0 ").build());
CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("rstcd").modifyProperty("ennm").dictType("DYNAMIC").dictSource("SD_ENGINFO_B_H").codeColumn("STCD").nameColumn("ENNM").filter("IS_DELETED = 0 ").build());
CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("rvcd").modifyProperty("rvnm").dictType("DYNAMIC").dictSource("V_SD_RVCD_DIC_TREE").codeColumn("RVCD").nameColumn("RVNM").build());
CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("mway").modifyProperty("mwayName").dictType("STATIC").dictSource("MWAY").build());
CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("isUp").modifyProperty("isUpName").dictType("STATIC").dictSource("TY_SF").build());

View File

@ -6,8 +6,10 @@ import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.yfd.platform.common.DataSourceRequest;
import com.yfd.platform.qgc_base.domain.SdFpssrlAiR;
import com.yfd.platform.qgc_base.domain.SdFpssrlR;
import com.yfd.platform.qgc_base.domain.SdFpssrlRAiRequest;
import com.yfd.platform.qgc_base.mapper.SdFpssrlAiRMapper;
import com.yfd.platform.qgc_base.mapper.SdFpssrlRMapper;
import com.yfd.platform.qgc_base.service.IMsOperationLogService;
import com.yfd.platform.qgc_base.service.ISdFpssrlRService;
@ -35,6 +37,8 @@ public class SdFpssrlRServiceImpl extends ServiceImpl<SdFpssrlRMapper, SdFpssrlR
@Resource
private IMsOperationLogService msOperationLogService;
@Resource
private SdFpssrlAiRMapper fpssrlAiRMapper;
@Override
public Page<SdFpssrlR> queryPageList(DataSourceRequest request) {
@ -130,12 +134,13 @@ public class SdFpssrlRServiceImpl extends ServiceImpl<SdFpssrlRMapper, SdFpssrlR
@Override
@Transactional(rollbackFor = Exception.class)
public List<SdFpssrlR> processAiReportBatch(List<SdFpssrlRAiRequest> requests) {
List<SdFpssrlR> entities = new ArrayList<>();
public List<SdFpssrlAiR> processAiReportBatch(List<SdFpssrlRAiRequest> requests) {
List<SdFpssrlAiR> entities = new ArrayList<>();
Date now = new Date();
for (SdFpssrlRAiRequest req : requests) {
SdFpssrlR entity = new SdFpssrlR();
entity.setStcd(req.getStcd());
SdFpssrlAiR entity = new SdFpssrlAiR();
entity.setStcd(req.getFwdx());
entity.setAiBoxCode(req.getStcd());
entity.setTm(req.getTm());
entity.setFtp(req.getFtp());
entity.setFcnt(req.getFcnt() != null ? req.getFcnt() : 1);
@ -164,7 +169,7 @@ public class SdFpssrlRServiceImpl extends ServiceImpl<SdFpssrlRMapper, SdFpssrlR
entity.setIsDeleted(0);
entities.add(entity);
}
baseMapper.mergeFishRecords(entities);
fpssrlAiRMapper.mergeFishRecords(entities);
return entities;
}
}

View File

@ -79,7 +79,7 @@ public class SdHbrvDicServiceImpl extends ServiceImpl<SdHbrvDicMapper, SdHbrvDic
// static {
//
// CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("grd").modifyProperty("grdName").dictType("STATIC").dictSource("TEST").build());
// CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("baseid").modifyProperty("basename").dictType("DYNAMIC").dictSource("SD_HYDROBASE").codeColumn("BASEID").nameColumn("BASENAME").filter("NVL(IS_DELETED, 0) = 0 ").build());
// CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("baseid").modifyProperty("basename").dictType("DYNAMIC").dictSource("SD_HYDROBASE").codeColumn("BASEID").nameColumn("BASENAME").filter("IS_DELETED = 0 ").build());
// }

View File

@ -51,9 +51,9 @@ public class SdOpinfoBHServiceImpl extends ServiceImpl<SdOpinfoBHMapper, SdOpinf
CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("dtin").modifyProperty("dtinName").dictType("STATIC").dictSource("DTIN").build());
CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("bldsttCode").modifyProperty("bldsttCodeName").dictType("STATIC").dictSource("BLDSTT_CODE").build());
// CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("dtinType").modifyProperty("dtinTypeName").dictType("STATIC").dictSource("DTIN_TYPE").build());
CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("sttp").modifyProperty("sttpName").dictType("DYNAMIC").dictSource("SD_STTP_B").codeColumn("STTP_CODE").nameColumn("STTP_NAME").filter("NVL(IS_DELETED, 0) = 0 ").build());
CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("baseId").modifyProperty("baseName").dictType("DYNAMIC").dictSource("SD_HYDROBASE").codeColumn("BASEID").nameColumn("BASENAME").filter("NVL(IS_DELETED, 0) = 0 ").build());
CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("rstcd").modifyProperty("ennm").dictType("DYNAMIC").dictSource("SD_ENGINFO_B_H").codeColumn("STCD").nameColumn("ENNM").filter("NVL(IS_DELETED, 0) = 0 ").build());
CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("sttp").modifyProperty("sttpName").dictType("DYNAMIC").dictSource("SD_STTP_B").codeColumn("STTP_CODE").nameColumn("STTP_NAME").filter("IS_DELETED = 0 ").build());
CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("baseId").modifyProperty("baseName").dictType("DYNAMIC").dictSource("SD_HYDROBASE").codeColumn("BASEID").nameColumn("BASENAME").filter("IS_DELETED = 0 ").build());
CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("rstcd").modifyProperty("ennm").dictType("DYNAMIC").dictSource("SD_ENGINFO_B_H").codeColumn("STCD").nameColumn("ENNM").filter("IS_DELETED = 0 ").build());
CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("rvcd").modifyProperty("rvnm").dictType("DYNAMIC").dictSource("V_SD_RVCD_DIC_TREE").codeColumn("RVCD").nameColumn("RVNM").build());
}

View File

@ -48,9 +48,9 @@ public class SdOtteBHServiceImpl extends ServiceImpl<SdOtteBHMapper, SdOtteBH> i
CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("dtin").modifyProperty("dtinName").dictType("STATIC").dictSource("DTIN").build());
CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("bldsttCode").modifyProperty("bldsttCodeName").dictType("STATIC").dictSource("BLDSTT_CODE").build());
// CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("dtinType").modifyProperty("dtinTypeName").dictType("STATIC").dictSource("DTIN_TYPE").build());
CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("sttp").modifyProperty("sttpName").dictType("DYNAMIC").dictSource("SD_STTP_B").codeColumn("STTP_CODE").nameColumn("STTP_NAME").filter("NVL(IS_DELETED, 0) = 0 ").build());
CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("baseId").modifyProperty("baseName").dictType("DYNAMIC").dictSource("SD_HYDROBASE").codeColumn("BASEID").nameColumn("BASENAME").filter("NVL(IS_DELETED, 0) = 0 ").build());
CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("rstcd").modifyProperty("ennm").dictType("DYNAMIC").dictSource("SD_ENGINFO_B_H").codeColumn("STCD").nameColumn("ENNM").filter("NVL(IS_DELETED, 0) = 0 ").build());
CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("sttp").modifyProperty("sttpName").dictType("DYNAMIC").dictSource("SD_STTP_B").codeColumn("STTP_CODE").nameColumn("STTP_NAME").filter("IS_DELETED = 0 ").build());
CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("baseId").modifyProperty("baseName").dictType("DYNAMIC").dictSource("SD_HYDROBASE").codeColumn("BASEID").nameColumn("BASENAME").filter("IS_DELETED = 0 ").build());
CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("rstcd").modifyProperty("ennm").dictType("DYNAMIC").dictSource("SD_ENGINFO_B_H").codeColumn("STCD").nameColumn("ENNM").filter("IS_DELETED = 0 ").build());
CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("rvcd").modifyProperty("rvnm").dictType("DYNAMIC").dictSource("V_SD_RVCD_DIC_TREE").codeColumn("RVCD").nameColumn("RVNM").build());
CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("usfl").modifyProperty("usflName").dictType("STATIC").dictSource("USFL").build());

View File

@ -47,9 +47,9 @@ public class SdOtweBHServiceImpl extends ServiceImpl<SdOtweBHMapper, SdOtweBH> i
CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("dtin").modifyProperty("dtinName").dictType("STATIC").dictSource("DTIN").build());
CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("bldsttCode").modifyProperty("bldsttCodeName").dictType("STATIC").dictSource("BLDSTT_CODE").build());
// CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("dtinType").modifyProperty("dtinTypeName").dictType("STATIC").dictSource("DTIN_TYPE").build());
CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("sttp").modifyProperty("sttpName").dictType("DYNAMIC").dictSource("SD_STTP_B").codeColumn("STTP_CODE").nameColumn("STTP_NAME").filter("NVL(IS_DELETED, 0) = 0 ").build());
CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("baseId").modifyProperty("baseName").dictType("DYNAMIC").dictSource("SD_HYDROBASE").codeColumn("BASEID").nameColumn("BASENAME").filter("NVL(IS_DELETED, 0) = 0 ").build());
CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("rstcd").modifyProperty("ennm").dictType("DYNAMIC").dictSource("SD_ENGINFO_B_H").codeColumn("STCD").nameColumn("ENNM").filter("NVL(IS_DELETED, 0) = 0 ").build());
CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("sttp").modifyProperty("sttpName").dictType("DYNAMIC").dictSource("SD_STTP_B").codeColumn("STTP_CODE").nameColumn("STTP_NAME").filter("IS_DELETED = 0 ").build());
CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("baseId").modifyProperty("baseName").dictType("DYNAMIC").dictSource("SD_HYDROBASE").codeColumn("BASEID").nameColumn("BASENAME").filter("IS_DELETED = 0 ").build());
CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("rstcd").modifyProperty("ennm").dictType("DYNAMIC").dictSource("SD_ENGINFO_B_H").codeColumn("STCD").nameColumn("ENNM").filter("IS_DELETED = 0 ").build());
CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("rvcd").modifyProperty("rvnm").dictType("DYNAMIC").dictSource("V_SD_RVCD_DIC_TREE").codeColumn("RVCD").nameColumn("RVNM").build());
CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("usfl").modifyProperty("usflName").dictType("STATIC").dictSource("USFL").build());
}

View File

@ -51,9 +51,9 @@ public class SdSonarBHServiceImpl extends ServiceImpl<SdSonarBHMapper, SdSonarBH
CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("mway").modifyProperty("mwayName").dictType("STATIC").dictSource("MWAY").build());
CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("bldsttCode").modifyProperty("bldsttCodeName").dictType("STATIC").dictSource("BLDSTT_CODE").build());
// CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("dtinType").modifyProperty("dtinTypeName").dictType("STATIC").dictSource("DTIN_TYPE").build());
CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("sttp").modifyProperty("sttpName").dictType("DYNAMIC").dictSource("SD_STTP_B").codeColumn("STTP_CODE").nameColumn("STTP_NAME").filter("NVL(IS_DELETED, 0) = 0 ").build());
CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("baseId").modifyProperty("baseName").dictType("DYNAMIC").dictSource("SD_HYDROBASE").codeColumn("BASEID").nameColumn("BASENAME").filter("NVL(IS_DELETED, 0) = 0 ").build());
CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("rstcd").modifyProperty("ennm").dictType("DYNAMIC").dictSource("SD_ENGINFO_B_H").codeColumn("STCD").nameColumn("ENNM").filter("NVL(IS_DELETED, 0) = 0 ").build());
CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("sttp").modifyProperty("sttpName").dictType("DYNAMIC").dictSource("SD_STTP_B").codeColumn("STTP_CODE").nameColumn("STTP_NAME").filter("IS_DELETED = 0 ").build());
CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("baseId").modifyProperty("baseName").dictType("DYNAMIC").dictSource("SD_HYDROBASE").codeColumn("BASEID").nameColumn("BASENAME").filter("IS_DELETED = 0 ").build());
CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("rstcd").modifyProperty("ennm").dictType("DYNAMIC").dictSource("SD_ENGINFO_B_H").codeColumn("STCD").nameColumn("ENNM").filter("IS_DELETED = 0 ").build());
CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("rvcd").modifyProperty("rvnm").dictType("DYNAMIC").dictSource("V_SD_RVCD_DIC_TREE").codeColumn("RVCD").nameColumn("RVNM").build());
CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("usfl").modifyProperty("usflName").dictType("STATIC").dictSource("USFL").build());

View File

@ -47,9 +47,9 @@ public class SdTeBHServiceImpl extends ServiceImpl<SdTeBHMapper, SdTeBH> impleme
CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("dtin").modifyProperty("dtinName").dictType("STATIC").dictSource("DTIN").build());
CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("bldsttCode").modifyProperty("bldsttCodeName").dictType("STATIC").dictSource("BLDSTT_CODE").build());
// CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("dtinType").modifyProperty("dtinTypeName").dictType("STATIC").dictSource("DTIN_TYPE").build());
CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("sttp").modifyProperty("sttpName").dictType("DYNAMIC").dictSource("SD_STTP_B").codeColumn("STTP_CODE").nameColumn("STTP_NAME").filter("NVL(IS_DELETED, 0) = 0 ").build());
CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("baseId").modifyProperty("baseName").dictType("DYNAMIC").dictSource("SD_HYDROBASE").codeColumn("BASEID").nameColumn("BASENAME").filter("NVL(IS_DELETED, 0) = 0 ").build());
CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("rstcd").modifyProperty("ennm").dictType("DYNAMIC").dictSource("SD_ENGINFO_B_H").codeColumn("STCD").nameColumn("ENNM").filter("NVL(IS_DELETED, 0) = 0 ").build());
CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("sttp").modifyProperty("sttpName").dictType("DYNAMIC").dictSource("SD_STTP_B").codeColumn("STTP_CODE").nameColumn("STTP_NAME").filter("IS_DELETED = 0 ").build());
CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("baseId").modifyProperty("baseName").dictType("DYNAMIC").dictSource("SD_HYDROBASE").codeColumn("BASEID").nameColumn("BASENAME").filter("IS_DELETED = 0 ").build());
CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("rstcd").modifyProperty("ennm").dictType("DYNAMIC").dictSource("SD_ENGINFO_B_H").codeColumn("STCD").nameColumn("ENNM").filter("IS_DELETED = 0 ").build());
CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("rvcd").modifyProperty("rvnm").dictType("DYNAMIC").dictSource("V_SD_RVCD_DIC_TREE").codeColumn("RVCD").nameColumn("RVNM").build());
}

View File

@ -50,9 +50,9 @@ public class SdVaBHServiceImpl extends ServiceImpl<SdVaBHMapper, SdVaBH> impleme
CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("dtin").modifyProperty("dtinName").dictType("STATIC").dictSource("DTIN").build());
CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("bldsttCode").modifyProperty("bldsttCodeName").dictType("STATIC").dictSource("BLDSTT_CODE").build());
CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("usfl").modifyProperty("usflName").dictType("STATIC").dictSource("USFL").build());
CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("sttp").modifyProperty("sttpName").dictType("DYNAMIC").dictSource("SD_STTP_B").codeColumn("STTP_CODE").nameColumn("STTP_NAME").filter("NVL(IS_DELETED, 0) = 0 ").build());
CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("baseId").modifyProperty("baseName").dictType("DYNAMIC").dictSource("SD_HYDROBASE").codeColumn("BASEID").nameColumn("BASENAME").filter("NVL(IS_DELETED, 0) = 0 ").build());
CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("rstcd").modifyProperty("ennm").dictType("DYNAMIC").dictSource("SD_ENGINFO_B_H").codeColumn("STCD").nameColumn("ENNM").filter("NVL(IS_DELETED, 0) = 0 ").build());
CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("sttp").modifyProperty("sttpName").dictType("DYNAMIC").dictSource("SD_STTP_B").codeColumn("STTP_CODE").nameColumn("STTP_NAME").filter("IS_DELETED = 0 ").build());
CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("baseId").modifyProperty("baseName").dictType("DYNAMIC").dictSource("SD_HYDROBASE").codeColumn("BASEID").nameColumn("BASENAME").filter("IS_DELETED = 0 ").build());
CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("rstcd").modifyProperty("ennm").dictType("DYNAMIC").dictSource("SD_ENGINFO_B_H").codeColumn("STCD").nameColumn("ENNM").filter("IS_DELETED = 0 ").build());
}
@Override

View File

@ -49,9 +49,9 @@ public class SdVdinfoBServiceImpl extends ServiceImpl<SdVdinfoBMapper, SdVdinfoB
CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("dtin").modifyProperty("dtinName").dictType("STATIC").dictSource("DTIN").build());
CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("bldsttCode").modifyProperty("bldsttCodeName").dictType("STATIC").dictSource("BLDSTT_CODE").build());
// CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("dtinType").modifyProperty("dtinTypeName").dictType("STATIC").dictSource("DTIN_TYPE").build());
CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("sttp").modifyProperty("sttpName").dictType("DYNAMIC").dictSource("SD_STTP_B").codeColumn("STTP_CODE").nameColumn("STTP_NAME").filter("NVL(IS_DELETED, 0) = 0 ").build());
CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("baseId").modifyProperty("baseName").dictType("DYNAMIC").dictSource("SD_HYDROBASE").codeColumn("BASEID").nameColumn("BASENAME").filter("NVL(IS_DELETED, 0) = 0 ").build());
CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("rstcd").modifyProperty("ennm").dictType("DYNAMIC").dictSource("SD_ENGINFO_B_H").codeColumn("STCD").nameColumn("ENNM").filter("NVL(IS_DELETED, 0) = 0 ").build());
CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("sttp").modifyProperty("sttpName").dictType("DYNAMIC").dictSource("SD_STTP_B").codeColumn("STTP_CODE").nameColumn("STTP_NAME").filter("IS_DELETED = 0 ").build());
CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("baseId").modifyProperty("baseName").dictType("DYNAMIC").dictSource("SD_HYDROBASE").codeColumn("BASEID").nameColumn("BASENAME").filter("IS_DELETED = 0 ").build());
CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("rstcd").modifyProperty("ennm").dictType("DYNAMIC").dictSource("SD_ENGINFO_B_H").codeColumn("STCD").nameColumn("ENNM").filter("IS_DELETED = 0 ").build());
CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("rvcd").modifyProperty("rvnm").dictType("DYNAMIC").dictSource("V_SD_RVCD_DIC_TREE").codeColumn("RVCD").nameColumn("RVNM").build());
CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("addvcd").modifyProperty("addvcdName").dictType("DYNAMIC").dictSource("SD_ADDVCD_DIC").codeColumn("ADDVCD").nameColumn("ADDVNM").build());
@ -86,7 +86,7 @@ public class SdVdinfoBServiceImpl extends ServiceImpl<SdVdinfoBMapper, SdVdinfoB
if (result && before != null) {
dictCodeToNameConverter.convertCodeToName(before, CODE_TO_NAME_META_LIST);
dictCodeToNameConverter.convertCodeToName(entity, CODE_TO_NAME_META_LIST);
msOperationLogService.recordModifyDetailLog(entity.getStcd(),TABLE_NAME, entity.getStcd(), "修改", source, CODE_TO_NAME_META_LIST);
msOperationLogService.recordModifyDetailLog(entity.getStcd(),TABLE_NAME, before,entity, source, CODE_TO_NAME_META_LIST);
}
return result;
}

View File

@ -50,9 +50,9 @@ public class SdVpBHServiceImpl extends ServiceImpl<SdVpBHMapper, SdVpBH> impleme
CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("dtin").modifyProperty("dtinName").dictType("STATIC").dictSource("DTIN").build());
CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("bldsttCode").modifyProperty("bldsttCodeName").dictType("STATIC").dictSource("BLDSTT_CODE").build());
// CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("dtinType").modifyProperty("dtinTypeName").dictType("STATIC").dictSource("DTIN_TYPE").build());
CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("sttp").modifyProperty("sttpName").dictType("DYNAMIC").dictSource("SD_STTP_B").codeColumn("STTP_CODE").nameColumn("STTP_NAME").filter("NVL(IS_DELETED, 0) = 0 ").build());
CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("baseId").modifyProperty("baseName").dictType("DYNAMIC").dictSource("SD_HYDROBASE").codeColumn("BASEID").nameColumn("BASENAME").filter("NVL(IS_DELETED, 0) = 0 ").build());
CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("rstcd").modifyProperty("ennm").dictType("DYNAMIC").dictSource("SD_ENGINFO_B_H").codeColumn("STCD").nameColumn("ENNM").filter("NVL(IS_DELETED, 0) = 0 ").build());
CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("sttp").modifyProperty("sttpName").dictType("DYNAMIC").dictSource("SD_STTP_B").codeColumn("STTP_CODE").nameColumn("STTP_NAME").filter("IS_DELETED = 0 ").build());
CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("baseId").modifyProperty("baseName").dictType("DYNAMIC").dictSource("SD_HYDROBASE").codeColumn("BASEID").nameColumn("BASENAME").filter("IS_DELETED = 0 ").build());
CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("rstcd").modifyProperty("ennm").dictType("DYNAMIC").dictSource("SD_ENGINFO_B_H").codeColumn("STCD").nameColumn("ENNM").filter("IS_DELETED = 0 ").build());
}
@Override

View File

@ -49,9 +49,9 @@ public class SdWeBHServiceImpl extends ServiceImpl<SdWeBHMapper, SdWeBH> impleme
// CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("mway").modifyProperty("mwayName").dictType("STATIC").dictSource("MWAY").build());
CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("bldsttCode").modifyProperty("bldsttCodeName").dictType("STATIC").dictSource("BLDSTT_CODE").build());
// CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("dtinType").modifyProperty("dtinTypeName").dictType("STATIC").dictSource("DTIN_TYPE").build());
CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("sttp").modifyProperty("sttpName").dictType("DYNAMIC").dictSource("SD_STTP_B").codeColumn("STTP_CODE").nameColumn("STTP_NAME").filter("NVL(IS_DELETED, 0) = 0 ").build());
CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("baseId").modifyProperty("baseName").dictType("DYNAMIC").dictSource("SD_HYDROBASE").codeColumn("BASEID").nameColumn("BASENAME").filter("NVL(IS_DELETED, 0) = 0 ").build());
CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("rstcd").modifyProperty("ennm").dictType("DYNAMIC").dictSource("SD_ENGINFO_B_H").codeColumn("STCD").nameColumn("ENNM").filter("NVL(IS_DELETED, 0) = 0 ").build());
CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("sttp").modifyProperty("sttpName").dictType("DYNAMIC").dictSource("SD_STTP_B").codeColumn("STTP_CODE").nameColumn("STTP_NAME").filter("IS_DELETED = 0 ").build());
CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("baseId").modifyProperty("baseName").dictType("DYNAMIC").dictSource("SD_HYDROBASE").codeColumn("BASEID").nameColumn("BASENAME").filter("IS_DELETED = 0 ").build());
CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("rstcd").modifyProperty("ennm").dictType("DYNAMIC").dictSource("SD_ENGINFO_B_H").codeColumn("STCD").nameColumn("ENNM").filter("IS_DELETED = 0 ").build());
CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("rvcd").modifyProperty("rvnm").dictType("DYNAMIC").dictSource("V_SD_RVCD_DIC_TREE").codeColumn("RVCD").nameColumn("RVNM").build());
}

View File

@ -53,9 +53,9 @@ public class SdWqBHServiceImpl extends ServiceImpl<SdWqBHMapper, SdWqBH> impleme
CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("bldsttCode").modifyProperty("bldsttCodeName").dictType("STATIC").dictSource("BLDSTT_CODE").build());
CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("wwqtg").modifyProperty("wwqtgName").dictType("STATIC").dictSource("WWQTG").build());
CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("dtinType").modifyProperty("dtinTypeName").dictType("STATIC").dictSource("DTIN_TYPE").build());
CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("sttp").modifyProperty("sttpName").dictType("DYNAMIC").dictSource("SD_STTP_B").codeColumn("STTP_CODE").nameColumn("STTP_NAME").filter("NVL(IS_DELETED, 0) = 0 ").build());
CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("baseId").modifyProperty("baseName").dictType("DYNAMIC").dictSource("SD_HYDROBASE").codeColumn("BASEID").nameColumn("BASENAME").filter("NVL(IS_DELETED, 0) = 0 ").build());
CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("rstcd").modifyProperty("ennm").dictType("DYNAMIC").dictSource("SD_ENGINFO_B_H").codeColumn("STCD").nameColumn("ENNM").filter("NVL(IS_DELETED, 0) = 0 ").build());
CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("sttp").modifyProperty("sttpName").dictType("DYNAMIC").dictSource("SD_STTP_B").codeColumn("STTP_CODE").nameColumn("STTP_NAME").filter("IS_DELETED = 0 ").build());
CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("baseId").modifyProperty("baseName").dictType("DYNAMIC").dictSource("SD_HYDROBASE").codeColumn("BASEID").nameColumn("BASENAME").filter("IS_DELETED = 0 ").build());
CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("rstcd").modifyProperty("ennm").dictType("DYNAMIC").dictSource("SD_ENGINFO_B_H").codeColumn("STCD").nameColumn("ENNM").filter("IS_DELETED = 0 ").build());
}
@Override

View File

@ -54,9 +54,9 @@ public class SdWtBHServiceImpl extends ServiceImpl<SdWtBHMapper, SdWtBH> impleme
CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("mway").modifyProperty("mwayName").dictType("STATIC").dictSource("MWAY").build());
CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("bldsttCode").modifyProperty("bldsttCodeName").dictType("STATIC").dictSource("BLDSTT_CODE").build());
CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("dtinType").modifyProperty("dtinTypeName").dictType("STATIC").dictSource("DTIN_TYPE").build());
CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("sttp").modifyProperty("sttpName").dictType("DYNAMIC").dictSource("SD_STTP_B").codeColumn("STTP_CODE").nameColumn("STTP_NAME").filter("NVL(IS_DELETED, 0) = 0 ").build());
CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("baseId").modifyProperty("baseName").dictType("DYNAMIC").dictSource("SD_HYDROBASE").codeColumn("BASEID").nameColumn("BASENAME").filter("NVL(IS_DELETED, 0) = 0 ").build());
CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("rstcd").modifyProperty("ennm").dictType("DYNAMIC").dictSource("SD_ENGINFO_B_H").codeColumn("STCD").nameColumn("ENNM").filter("NVL(IS_DELETED, 0) = 0 ").build());
CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("sttp").modifyProperty("sttpName").dictType("DYNAMIC").dictSource("SD_STTP_B").codeColumn("STTP_CODE").nameColumn("STTP_NAME").filter("IS_DELETED = 0 ").build());
CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("baseId").modifyProperty("baseName").dictType("DYNAMIC").dictSource("SD_HYDROBASE").codeColumn("BASEID").nameColumn("BASENAME").filter("IS_DELETED = 0 ").build());
CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("rstcd").modifyProperty("ennm").dictType("DYNAMIC").dictSource("SD_ENGINFO_B_H").codeColumn("STCD").nameColumn("ENNM").filter("IS_DELETED = 0 ").build());
}

View File

@ -1,12 +1,15 @@
package com.yfd.platform.qgc_env.fb.controller;
import com.yfd.platform.common.DataSourceRequest;
import com.yfd.platform.common.DataSourceResult;
import com.yfd.platform.config.ResponseResult;
import com.yfd.platform.qgc_env.fb.entity.vo.BreedStageVO;
import com.yfd.platform.qgc_env.fb.service.FbStationService;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.annotation.Resource;
import cn.hutool.core.util.StrUtil;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
@ -15,6 +18,8 @@ import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
@RestController
@RequestMapping("/fb")
@Tag(name = "鱼类增殖站模块")
@ -60,6 +65,84 @@ public class FbStationController {
return ResponseResult.successData(fbStationService.getYearRpStatistics(year));
}
@PostMapping("/bsmfr/GetKendoListCust")
@Operation(summary = "亲鱼档案管理记录列表")
public ResponseResult getBsmfRKendoListCust(@RequestBody DataSourceRequest dataSourceRequest) {
return ResponseResult.successData(fbStationService.getBsmfRList(dataSourceRequest));
}
@PostMapping("/bsdeathr/GetKendoListCust")
@Operation(summary = "亲鱼死亡记录列表")
public ResponseResult getBsdeathRKendoListCust(@RequestBody DataSourceRequest dataSourceRequest) {
return ResponseResult.successData(fbStationService.getBsdeathRList(dataSourceRequest));
}
@PostMapping("/bsctmob/GetKendoListCust")
@Operation(summary = "亲鱼培育方式列表")
public ResponseResult getBsctmoBKendoListCust(@RequestBody DataSourceRequest dataSourceRequest) {
return ResponseResult.successData(fbStationService.getBsctmoBList(dataSourceRequest));
}
@PostMapping("/fbbwtr/GetKendoListCust")
@Operation(summary = "亲鱼培育水温观测记录列表")
public ResponseResult getFbbwtRKendoListCust(@RequestBody DataSourceRequest dataSourceRequest) {
return ResponseResult.successData(fbStationService.getFbbwtRList(dataSourceRequest));
}
@PostMapping("/fbcwqr/GetKendoListCust")
@Operation(summary = "亲鱼培育水质监测记录列表")
public ResponseResult getFbcwqRKendoListCust(@RequestBody DataSourceRequest dataSourceRequest) {
return ResponseResult.successData(fbStationService.getFbcwqRList(dataSourceRequest));
}
@PostMapping("/bsrfir/GetKendoListCust")
@Operation(summary = "亲鱼培育投喂记录列表")
public ResponseResult getBsrfiRKendoListCust(@RequestBody DataSourceRequest dataSourceRequest) {
return ResponseResult.successData(fbStationService.getBsrfiRList(dataSourceRequest));
}
@PostMapping("/outfishr/GetKendoListCust")
@Operation(summary = "淘汰亲鱼基本信息记录列表")
public ResponseResult getOutfishRKendoListCust(@RequestBody DataSourceRequest dataSourceRequest) {
return ResponseResult.successData(fbStationService.getOutfishRList(dataSourceRequest));
}
@PostMapping("/fishartinlr/GetKendoListCust")
@Operation(summary = "鱼类人工催产记录列表")
public ResponseResult getFishartinlRKendoListCust(@RequestBody DataSourceRequest dataSourceRequest) {
return ResponseResult.successData(fbStationService.getFishartinlRList(dataSourceRequest));
}
@PostMapping("/fishhatchrecr/GetKendoListCust")
@Operation(summary = "鱼类受精卵孵化过程记录列表")
public ResponseResult getFishhatchrecRKendoListCust(@RequestBody DataSourceRequest dataSourceRequest) {
return ResponseResult.successData(fbStationService.getFishhatchrecRList(dataSourceRequest));
}
@PostMapping("/fishhatchpror/GetKendoListCust")
@Operation(summary = "鱼类孵化过程巡查记录列表")
public ResponseResult getFishhatchproRKendoListCust(@RequestBody DataSourceRequest dataSourceRequest) {
return ResponseResult.successData(fbStationService.getFishhatchproRList(dataSourceRequest));
}
@PostMapping("/scwemr/GetKendoListCust")
@Operation(summary = "苗种培育水环境监测记录列表")
public ResponseResult getScwemRKendoListCust(@RequestBody DataSourceRequest dataSourceRequest) {
return ResponseResult.successData(fbStationService.getScwemRList(dataSourceRequest));
}
@PostMapping("/fishbreedr/GetKendoListCust")
@Operation(summary = "鱼苗和鱼种培育记录列表")
public ResponseResult getFishbreedRKendoListCust(@RequestBody DataSourceRequest dataSourceRequest) {
return ResponseResult.successData(fbStationService.getFishbreedRList(dataSourceRequest));
}
@PostMapping("/fishdpacr/GetKendoListCust")
@Operation(summary = "鱼病防治记录列表")
public ResponseResult getFishdpacRKendoListCust(@RequestBody DataSourceRequest dataSourceRequest) {
return ResponseResult.successData(fbStationService.getFishdpacRList(dataSourceRequest));
}
@PostMapping("/bsmfr/qgc/GetKendoListCust")
@Operation(summary = "(全过程)增殖站二级页面: 亲鱼选配与培育->亲鱼信息")
public ResponseResult getBsmfrQgcKendoListCust(@RequestBody DataSourceRequest dataSourceRequest) {
@ -79,6 +162,38 @@ public class FbStationController {
return ResponseResult.successData(fbStationService.getFbRelatedYrByStcd(stcd));
}
@PostMapping("/station/eng/GetAggregateData")
@Operation(summary = "电站放流统计-返回有数据的年份")
public ResponseResult getAggregateData(@RequestBody DataSourceRequest dataSourceRequest) {
return ResponseResult.successData(fbStationService.getAggregateData(dataSourceRequest));
}
@PostMapping("/station/eng/GetKendoListCust")
@Operation(summary = "电站放流统计")
public ResponseResult getEngKendoListCust(@RequestBody DataSourceRequest dataSourceRequest) {
return ResponseResult.successData(fbStationService.getEngKendoListCust(dataSourceRequest));
}
@PostMapping("/breedStage/GetKendoListCust")
@Operation(summary = "条件过滤数据列表定制")
public ResponseResult getBreedStageKendoListCust(@RequestBody DataSourceRequest dataSourceRequest) {
String stcd = null;
List<DataSourceRequest.FilterDescriptor> filters = dataSourceRequest.getFilter().getFilters();
for (DataSourceRequest.FilterDescriptor filter : filters) {
if ("stcd".equals(filter.getField())) {
stcd = (String) filter.getValue();
}
}
if (StrUtil.isEmpty(stcd)) {
return ResponseResult.error("增殖站stcd不能为空");
}
List<BreedStageVO> breedStageList = fbStationService.getBreedStageList(stcd);
DataSourceResult<BreedStageVO> dataSourceResult = new DataSourceResult<>();
dataSourceResult.setData(breedStageList);
dataSourceResult.setTotal(breedStageList.size());
return ResponseResult.successData(dataSourceResult);
}
@PostMapping("/msfbrdm/fbFlData/GetKendoListCust")
@Operation(summary = "增殖站增殖情况(app)")
public ResponseResult getFbFlData(@RequestBody DataSourceRequest dataSourceRequest) {

View File

@ -0,0 +1,30 @@
package com.yfd.platform.qgc_env.fb.entity.vo;
import lombok.Data;
import lombok.experimental.Accessors;
/**
* 鱼类增殖阶段
*/
@Data
@Accessors(chain = true)
public class BreedStageVO {
/** 增殖站编码 */
private String stcd;
/** 阶段名称 */
private String key;
/** 阶段状态1=有数据 2=无数据 */
private String value;
/** 是否为最新数据 */
private Boolean newest;
/** 最新表 */
private String newSurface;
/** 主菜单 */
private String firstGrade;
}

View File

@ -0,0 +1,76 @@
package com.yfd.platform.qgc_env.fb.entity.vo;
import lombok.Data;
import java.math.BigDecimal;
import java.util.Date;
/**
* 亲鱼培育方式 VO
*/
@Data
public class FbBsctmoBVo {
/** 主键 */
private String id;
/** 设施编码 */
private String stcd;
/** 鱼池编号 */
private String fpnum;
/** 鱼池名称 */
private String fpName;
/** 鱼种类 */
private String ftp;
/** 鱼类名称 */
private String ftpName;
/** 数量(尾) */
private Long value;
/** 全长(cm) */
private BigDecimal length;
/** 体重(g) */
private BigDecimal weight;
/** 培育方式1=流水单养 2=流水混养 3=静水 4=循环水 */
private Integer ctmo;
/** 培育方式名称 */
private String ctmoName;
/** 放养密度 */
private String skds;
/** 体重范围值 */
private String fwgh;
/** 记录人 */
private String recorder;
/** 创建人 */
private String recordUser;
/** 创建时间 */
private Date recordTime;
/** 更新人 */
private String modifyUser;
/** 更新时间 */
private Date modifyTime;
/** 是否已删除 */
private Integer isDeleted;
/** 删除人 */
private String deleteUser;
/** 删除时间 */
private Date deleteTime;
}

View File

@ -0,0 +1,79 @@
package com.yfd.platform.qgc_env.fb.entity.vo;
import lombok.Data;
import java.math.BigDecimal;
import java.util.Date;
/**
* 亲鱼死亡记录 VO
*/
@Data
public class FbBsdeathRVo {
/** 主键 */
private String id;
/** 设施编码 */
private String stcd;
/** 死亡日期 */
private Date tm;
/** 鱼池编号 */
private String fpnum;
/** 鱼池名称 */
private String fpName;
/** 鱼种类 */
private String ftp;
/** 鱼类名称 */
private String ftpName;
/** 标记编号 */
private String signnum;
/** 全长(cm) */
private BigDecimal length;
/** 体重(g) */
private BigDecimal weight;
/** 死亡症状 */
private String spod;
/** 死亡诊断 */
private String deathd;
/** 记录人 */
private String recorder;
/** 数量(尾) */
private Long value;
/** 附件ID */
private String fid;
/** 创建人 */
private String recordUser;
/** 创建时间 */
private Date recordTime;
/** 更新人 */
private String modifyUser;
/** 更新时间 */
private Date modifyTime;
/** 是否已删除 */
private Integer isDeleted;
/** 删除人 */
private String deleteUser;
/** 删除时间 */
private Date deleteTime;
}

View File

@ -0,0 +1,82 @@
package com.yfd.platform.qgc_env.fb.entity.vo;
import lombok.Data;
import java.math.BigDecimal;
import java.util.Date;
/**
* 亲鱼档案管理记录 VO
*/
@Data
public class FbBsmfRVo {
/** 主键 */
private String id;
/** 设施编码 */
private String stcd;
/** 引进日期 */
private Date tm;
/** 鱼种类 */
private String ftp;
/** 鱼类名称 */
private String ftpName;
/** 亲鱼来源 */
private String bssr;
/** 亲鱼来源名称 */
private String bssrName;
/** 全长(cm) */
private BigDecimal length;
/** 体重(g) */
private BigDecimal weight;
/** 鱼龄 */
private BigDecimal age;
/** 性别1=雄鱼 2=雌鱼 */
private Integer sex;
/** 性别名称 */
private String sexName;
/** 标记编号 */
private String signnum;
/** 记录人 */
private String recorder;
/** 数量 */
private Long value;
/** 附件ID */
private String fid;
/** 创建人 */
private String recordUser;
/** 创建时间 */
private Date recordTime;
/** 更新人 */
private String modifyUser;
/** 更新时间 */
private Date modifyTime;
/** 是否已删除 */
private Integer isDeleted;
/** 删除人 */
private String deleteUser;
/** 删除时间 */
private Date deleteTime;
}

View File

@ -0,0 +1,73 @@
package com.yfd.platform.qgc_env.fb.entity.vo;
import lombok.Data;
import java.math.BigDecimal;
import java.util.Date;
/**
* 亲鱼培育投喂记录 VO
*/
@Data
public class FbBsrfiRVo {
/** 主键 */
private String id;
/** 设施编码 */
private String stcd;
/** 鱼池编号 */
private String fpnum;
/** 鱼种类 */
private String ftp;
/** 投喂日期 */
private Date tm;
/** 饲料种类 */
private String ftype;
/** 投食量(g) */
private BigDecimal cfe;
/** 水交换频次(次/d) */
private Long warfre;
/** 记录人 */
private String recorder;
/** 总体量(g) */
private BigDecimal tbw;
/** 日投喂率(%) */
private BigDecimal dfr;
/** 摄食情况 */
private String fdi;
/** 附件ID */
private String fid;
/** 创建人 */
private String recordUser;
/** 创建时间 */
private Date recordTime;
/** 更新人 */
private String modifyUser;
/** 更新时间 */
private Date modifyTime;
/** 是否已删除 */
private Integer isDeleted;
/** 删除人 */
private String deleteUser;
/** 删除时间 */
private Date deleteTime;
}

View File

@ -0,0 +1,22 @@
package com.yfd.platform.qgc_env.fb.entity.vo;
import lombok.Data;
import java.math.BigDecimal;
/**
* 电站放流统计-有数据的年份
*/
@Data
public class FbEngFishVo {
/** 电站编码 */
private String stcd;
/** 电站名称 */
private String ennm;
/** 计划放流尾数 */
private BigDecimal fcntjh;
/** 实际放流尾数 */
private BigDecimal fcntjc;
/** 计划放流日期(年份) */
private String plansd;
}

View File

@ -0,0 +1,64 @@
package com.yfd.platform.qgc_env.fb.entity.vo;
import lombok.Data;
import java.math.BigDecimal;
import java.util.Date;
/**
* 亲鱼培育水温观测记录 VO
*/
@Data
public class FbFbbwtRVo {
/** 主键 */
private String id;
/** 设施编码 */
private String stcd;
/** 观测日期 */
private Date tm;
/** 鱼池编号 */
private String fpnum;
/** 鱼池名称 */
private String fpName;
/** 8点水温 */
private BigDecimal wte;
/** 14点水温 */
private BigDecimal wtf;
/** 20点水温 */
private BigDecimal wtt;
/** 记录人 */
private String recorder;
/** 附件ID */
private String fid;
/** 创建人 */
private String recordUser;
/** 创建时间 */
private Date recordTime;
/** 更新人 */
private String modifyUser;
/** 更新时间 */
private Date modifyTime;
/** 是否已删除 */
private Integer isDeleted;
/** 删除人 */
private String deleteUser;
/** 删除时间 */
private Date deleteTime;
}

View File

@ -0,0 +1,70 @@
package com.yfd.platform.qgc_env.fb.entity.vo;
import lombok.Data;
import java.math.BigDecimal;
import java.util.Date;
/**
* 亲鱼培育水质监测记录 VO
*/
@Data
public class FbFbcwqRVo {
/** 主键 */
private String id;
/** 设施编码 */
private String stcd;
/** 鱼池编号 */
private String fpnum;
/** 鱼池名称 */
private String fpName;
/** 氨氮(mg/L) */
private BigDecimal nh3n;
/** 亚硝酸盐(mg/L) */
private BigDecimal no2;
/** 溶解氧(mg/L) */
private BigDecimal dox;
/** pH */
private BigDecimal ph;
/** 记录人 */
private String recorder;
/** 是否符合标准 */
private Integer iffit;
/** 监测时段 */
private Date tm;
/** 附件ID */
private String fid;
/** 创建人 */
private String recordUser;
/** 创建时间 */
private Date recordTime;
/** 更新人 */
private String modifyUser;
/** 更新时间 */
private Date modifyTime;
/** 是否已删除 */
private Integer isDeleted;
/** 删除人 */
private String deleteUser;
/** 删除时间 */
private Date deleteTime;
}

View File

@ -0,0 +1,88 @@
package com.yfd.platform.qgc_env.fb.entity.vo;
import lombok.Data;
import java.math.BigDecimal;
import java.util.Date;
/**
* 鱼类人工催产记录 VO
*/
@Data
public class FbFishartinlRVo {
/** 主键 */
private String id;
/** 设施编码 */
private String stcd;
/** 鱼种类 */
private String ftp;
/** 催产日期 */
private Date tm;
/** 雌鱼数量 */
private Long ffisht;
/** 雌鱼催产剂种类 */
private Integer fpitocintype;
/** 雌鱼总剂量 */
private BigDecimal fdose;
/** 雌鱼注射方式 */
private String finjmo;
/** 气温(℃) */
private BigDecimal air;
/** 水温(℃) */
private BigDecimal wartem;
/** 溶解氧(mg/L) */
private BigDecimal dox;
/** 记录人 */
private String recorder;
/** 性别1=雄鱼 2=雌鱼 */
private Integer sex;
/** 附件ID */
private String fid;
/** 雄鱼注射方式 */
private Long mfisht;
/** 雄鱼催产剂种类 */
private Integer mpitocintype;
/** 雄鱼总剂量 */
private BigDecimal mdose;
/** 雄鱼注射方式 */
private String minjmo;
/** 创建人 */
private String recordUser;
/** 创建时间 */
private Date recordTime;
/** 更新人 */
private String modifyUser;
/** 更新时间 */
private Date modifyTime;
/** 是否已删除 */
private Integer isDeleted;
/** 删除人 */
private String deleteUser;
/** 删除时间 */
private Date deleteTime;
}

View File

@ -0,0 +1,76 @@
package com.yfd.platform.qgc_env.fb.entity.vo;
import lombok.Data;
import java.math.BigDecimal;
import java.util.Date;
/**
* 鱼苗和鱼种培育记录 VO
*/
@Data
public class FbFishbreedRVo {
/** 主键 */
private String id;
/** 设施编码 */
private String stcd;
/** 培育日期 */
private Date tm;
/** 鱼池编号 */
private String farmno;
/** 鱼种类 */
private String ftp;
/** 数量(尾) */
private Long counts;
/** 平均规格全长(cm) */
private BigDecimal length;
/** 平均规格体重(g) */
private BigDecimal weight;
/** 饲料或饵料种类 */
private String feedtp;
/** 投食量(g) */
private BigDecimal foodint;
/** 日投食率(%) */
private BigDecimal dfr;
/** 摄食情况 */
private String fin;
/** 记录人 */
private String recorder;
/** 附件ID */
private String fid;
/** 创建人 */
private String recordUser;
/** 创建时间 */
private Date recordTime;
/** 更新人 */
private String modifyUser;
/** 更新时间 */
private Date modifyTime;
/** 是否已删除 */
private Integer isDeleted;
/** 删除人 */
private String deleteUser;
/** 删除时间 */
private Date deleteTime;
}

View File

@ -0,0 +1,79 @@
package com.yfd.platform.qgc_env.fb.entity.vo;
import lombok.Data;
import java.math.BigDecimal;
import java.util.Date;
/**
* 鱼病防治记录表 VO
*/
@Data
public class FbFishdpacRVo {
/** 主键 */
private String id;
/** 设施编码 */
private String stcd;
/** 鱼池编号 */
private String fpnum;
/** 鱼种类 */
private String ftp;
/** 平均体重(g) */
private BigDecimal weight;
/** 发病症状 */
private String symptoms;
/** 鱼药种类 */
private String fishdrugtype;
/** 用药方法 */
private Integer method;
/** 用药剂量(mg/kg) */
private BigDecimal dose;
/** 用药天数(d) */
private BigDecimal days;
/** 治疗效果 */
private Integer treateffect;
/** 记录人 */
private String recorder;
/** 日期 */
private Date tm;
/** 附件ID */
private String fid;
/** 备注 */
private String remark;
/** 创建人 */
private String recordUser;
/** 创建时间 */
private Date recordTime;
/** 更新人 */
private String modifyUser;
/** 更新时间 */
private Date modifyTime;
/** 是否已删除 */
private Integer isDeleted;
/** 删除人 */
private String deleteUser;
/** 删除时间 */
private Date deleteTime;
}

View File

@ -0,0 +1,82 @@
package com.yfd.platform.qgc_env.fb.entity.vo;
import lombok.Data;
import java.math.BigDecimal;
import java.util.Date;
/**
* 鱼类孵化过程巡查记录 VO
*/
@Data
public class FbFishhatchproRVo {
/** 主键 */
private String id;
/** 设施编码 */
private String stcd;
/** 孵化设施编号 */
private String devno;
/** 记录时间 */
private Date recordtm;
/** 水温(℃) */
private BigDecimal wartem;
/** 与上一时段水温差(℃) */
private BigDecimal wtdiff;
/** 溶解氧(mg/L) */
private BigDecimal dox;
/** pH */
private BigDecimal ph;
/** 胚胎发育时期 */
private String empsta;
/** 水交换频次(次/d) */
private Long warfre;
/** 孵化密度是否均匀0=否 1=是 */
private Integer iseven;
/** 记录人 */
private String recorder;
/** 备注 */
private String remarks;
/** 产卵时间 */
private Date spawntm;
/** 巡查时间 */
private Date tm;
/** 附件ID */
private String fid;
/** 创建人 */
private String recordUser;
/** 创建时间 */
private Date recordTime;
/** 更新人 */
private String modifyUser;
/** 更新时间 */
private Date modifyTime;
/** 是否已删除 */
private Integer isDeleted;
/** 删除人 */
private String deleteUser;
/** 删除时间 */
private Date deleteTime;
}

View File

@ -0,0 +1,73 @@
package com.yfd.platform.qgc_env.fb.entity.vo;
import lombok.Data;
import java.math.BigDecimal;
import java.util.Date;
/**
* 鱼类受精卵孵化过程记录 VO
*/
@Data
public class FbFishhatchrecRVo {
/** 主键 */
private String id;
/** 设施编码 */
private String stcd;
/** 鱼种类 */
private String ftp;
/** 亲鱼来源 */
private String fishsrc;
/** 鱼卵数量(万粒) */
private BigDecimal eggcount;
/** 受精率(%) */
private BigDecimal ferrate;
/** 孵化率(%) */
private BigDecimal hatchrate;
/** 出苗时长(h) */
private BigDecimal outhour;
/** 出苗数量(万尾) */
private BigDecimal outcount;
/** 出苗率(%) */
private BigDecimal outrate;
/** 记录人 */
private String recorder;
/** 孵化时间 */
private Date tm;
/** 附件ID */
private String fid;
/** 创建人 */
private String recordUser;
/** 创建时间 */
private Date recordTime;
/** 更新人 */
private String modifyUser;
/** 更新时间 */
private Date modifyTime;
/** 是否已删除 */
private Integer isDeleted;
/** 删除人 */
private String deleteUser;
/** 删除时间 */
private Date deleteTime;
}

View File

@ -0,0 +1,85 @@
package com.yfd.platform.qgc_env.fb.entity.vo;
import lombok.Data;
import java.math.BigDecimal;
import java.util.Date;
/**
* 淘汰亲鱼基本信息记录 VO
*/
@Data
public class FbOutfishRVo {
/** 主键 */
private String id;
/** 设施编码 */
private String stcd;
/** 录入时间 */
private Date recordertm;
/** 标记编号 */
private String signno;
/** 鱼种类 */
private String ftp;
/** 亲鱼来源 */
private String src;
/** 性别1=雄鱼 2=雌鱼 */
private Integer sex;
/** 鱼龄 */
private BigDecimal age;
/** 全长(cm) */
private BigDecimal length;
/** 体重(g) */
private BigDecimal weight;
/** 繁殖年限 */
private Long agelmt;
/** 繁殖次数 */
private Long brecount;
/** 淘汰日期 */
private Date tm;
/** 淘汰原因 */
private String outrea;
/** 处置方式 */
private Integer hand;
/** 记录人 */
private String recorder;
/** 附件ID */
private String fid;
/** 创建人 */
private String recordUser;
/** 创建时间 */
private Date recordTime;
/** 更新人 */
private String modifyUser;
/** 更新时间 */
private Date modifyTime;
/** 是否已删除 */
private Integer isDeleted;
/** 删除人 */
private String deleteUser;
/** 删除时间 */
private Date deleteTime;
}

View File

@ -0,0 +1,73 @@
package com.yfd.platform.qgc_env.fb.entity.vo;
import lombok.Data;
import java.math.BigDecimal;
import java.util.Date;
/**
* 苗种培育水环境监测记录表 VO
*/
@Data
public class FbScwemRVo {
/** 主键 */
private String id;
/** 设施编码 */
private String stcd;
/** 监测日期 */
private Date tm;
/** 鱼池编号 */
private String fpnum;
/** 鱼池名称 */
private String fpName;
/** 水温(℃) */
private BigDecimal wartem;
/** 与上一时段水温差(℃) */
private BigDecimal wtdiff;
/** 氨氮(mg/L) */
private BigDecimal nh3n;
/** 亚硝酸盐(mg/L) */
private BigDecimal no2;
/** 溶解氧(mg/L) */
private BigDecimal dox;
/** pH */
private BigDecimal ph;
/** 记录人 */
private String recorder;
/** 附件ID */
private String fid;
/** 创建人 */
private String recordUser;
/** 创建时间 */
private Date recordTime;
/** 更新人 */
private String modifyUser;
/** 更新时间 */
private Date modifyTime;
/** 是否已删除 */
private Integer isDeleted;
/** 删除人 */
private String deleteUser;
/** 删除时间 */
private Date deleteTime;
}

View File

@ -2,22 +2,7 @@ package com.yfd.platform.qgc_env.fb.service;
import com.yfd.platform.common.DataSourceRequest;
import com.yfd.platform.common.DataSourceResult;
import com.yfd.platform.qgc_env.fb.entity.vo.FbBsmfRQgcVo;
import com.yfd.platform.qgc_env.fb.entity.vo.FbBsmfRFishTableVo;
import com.yfd.platform.qgc_env.fb.entity.vo.FbFlDataVo;
import com.yfd.platform.qgc_env.fb.entity.vo.FbFishCountFinishVo;
import com.yfd.platform.qgc_env.fb.entity.vo.FbFishRunQgcVo;
import com.yfd.platform.qgc_env.fb.entity.vo.FbFishTypeStcdVo;
import com.yfd.platform.qgc_env.fb.entity.vo.FbFishTypeFinishVo;
import com.yfd.platform.qgc_env.fb.entity.vo.FbRelatedYrVo;
import com.yfd.platform.qgc_env.fb.entity.vo.FbMsfbrdmQgcVo;
import com.yfd.platform.qgc_env.fb.entity.vo.FbResearchVo;
import com.yfd.platform.qgc_env.fb.entity.vo.FbStInfoResultVo;
import com.yfd.platform.qgc_env.fb.entity.vo.FbStationStaticsDataVo;
import com.yfd.platform.qgc_env.fb.entity.vo.YearRpStatisticsVo;
import com.yfd.platform.qgc_env.fb.entity.vo.FbStationOverviewSecondVo;
import com.yfd.platform.qgc_env.fb.entity.vo.FbTracingPointVo;
import com.yfd.platform.qgc_env.fb.entity.vo.TableVo;
import com.yfd.platform.qgc_env.fb.entity.vo.*;
import java.util.List;
import java.util.Map;
@ -67,4 +52,84 @@ public interface FbStationService {
DataSourceResult<FbTracingPointVo> getFbPointKendoListCust(DataSourceRequest dataSourceRequest);
DataSourceResult<FbTracingPointVo> getFbBuiltPointKendoListCust(DataSourceRequest dataSourceRequest);
/**
* 电站放流统计-返回有数据的年份
*/
DataSourceResult<FbEngFishVo> getAggregateData(DataSourceRequest dataSourceRequest);
/**
* 电站放流统计列表
*/
DataSourceResult<FbEngFishVo> getEngKendoListCust(DataSourceRequest dataSourceRequest);
/**
* 获取增殖站各阶段数据状态选配/繁殖/培育/防治
*/
List<BreedStageVO> getBreedStageList(String stcd);
/**
* 亲鱼档案管理记录列表
*/
DataSourceResult<FbBsmfRVo> getBsmfRList(DataSourceRequest dataSourceRequest);
/**
* 亲鱼死亡记录列表
*/
DataSourceResult<FbBsdeathRVo> getBsdeathRList(DataSourceRequest dataSourceRequest);
/**
* 亲鱼培育方式列表
*/
DataSourceResult<FbBsctmoBVo> getBsctmoBList(DataSourceRequest dataSourceRequest);
/**
* 亲鱼培育水温观测记录列表
*/
DataSourceResult<FbFbbwtRVo> getFbbwtRList(DataSourceRequest dataSourceRequest);
/**
* 亲鱼培育水质监测记录列表
*/
DataSourceResult<FbFbcwqRVo> getFbcwqRList(DataSourceRequest dataSourceRequest);
/**
* 亲鱼培育投喂记录列表
*/
DataSourceResult<FbBsrfiRVo> getBsrfiRList(DataSourceRequest dataSourceRequest);
/**
* 淘汰亲鱼基本信息记录列表
*/
DataSourceResult<FbOutfishRVo> getOutfishRList(DataSourceRequest dataSourceRequest);
/**
* 鱼类人工催产记录列表
*/
DataSourceResult<FbFishartinlRVo> getFishartinlRList(DataSourceRequest dataSourceRequest);
/**
* 鱼类受精卵孵化过程记录列表
*/
DataSourceResult<FbFishhatchrecRVo> getFishhatchrecRList(DataSourceRequest dataSourceRequest);
/**
* 鱼类孵化过程巡查记录列表
*/
DataSourceResult<FbFishhatchproRVo> getFishhatchproRList(DataSourceRequest dataSourceRequest);
/**
* 苗种培育水环境监测记录列表
*/
DataSourceResult<FbScwemRVo> getScwemRList(DataSourceRequest dataSourceRequest);
/**
* 鱼苗和鱼种培育记录列表
*/
DataSourceResult<FbFishbreedRVo> getFishbreedRList(DataSourceRequest dataSourceRequest);
/**
* 鱼病防治记录列表
*/
DataSourceResult<FbFishdpacRVo> getFishdpacRList(DataSourceRequest dataSourceRequest);
}

View File

@ -285,7 +285,10 @@ public class SdWtvtRServiceImpl extends ServiceImpl<SdWtvtRMapper, SdWtvtYearVo>
sql.append("(STCD = ? AND TM = TO_DATE(SUBSTR(?, 1, 19), 'YYYY-MM-DD HH24:MI:SS'))");
DataParam item = dataParamList.get(i);
params.add(item == null ? null : item.getId());
params.add(item == null ? null : item.getDt());
String timeStr = (item.getDt() != null && !item.getDt().isEmpty())
? item.getDt()
: item.getTm();
params.add(timeStr);
}
jdbcTemplate.update(sql.toString(), params.toArray());
}

View File

@ -0,0 +1,89 @@
package com.yfd.platform.system.controller;
import cn.hutool.core.util.StrUtil;
import com.yfd.platform.config.ResponseResult;
import com.yfd.platform.utils.DictCodeToNameConverter;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.annotation.Resource;
import org.springframework.web.bind.annotation.*;
import java.util.Map;
/**
* 字典缓存管理接口
*
* <p>提供手动刷新字典缓存的功能用于紧急情况或运维场景
*
* <h3>使用方式</h3>
* <ul>
* <li>清除全部缓存POST /dict/cache/clearAll</li>
* <li>清除指定静态字典缓存POST /dict/cache/clearStatic?dictCode=xxx</li>
* <li>清除指定动态字典缓存POST /dict/cache/clearDynamic?tableName=xxx&codeColumn=xxx&nameColumn=xxx</li>
* <li>查看缓存统计GET /dict/cache/stats</li>
* </ul>
*/
@RestController
@RequestMapping("/dict/cache")
@Tag(name = "字典缓存管理")
public class DictCacheManageController {
@Resource
private DictCodeToNameConverter dictCodeToNameConverter;
/**
* 清除所有字典缓存
*/
@PostMapping("/clearAll")
@Operation(summary = "清除所有字典缓存")
public ResponseResult clearAllCache() {
dictCodeToNameConverter.clearCache();
return ResponseResult.success("所有字典缓存已清除");
}
/**
* 清除指定静态字典缓存
*
* @param dictCode 字典编码
*/
@PostMapping("/clearStatic")
@Operation(summary = "清除指定静态字典缓存")
public ResponseResult clearStaticCache(@RequestParam String dictCode) {
if (StrUtil.isBlank(dictCode)) {
return ResponseResult.error("dictCode 不能为空");
}
dictCodeToNameConverter.clearStaticDictCache(dictCode);
return ResponseResult.success("静态字典缓存已清除: " + dictCode);
}
/**
* 清除指定动态字典缓存
*
* @param tableName 数据库表名
* @param codeColumn 编码列名
* @param nameColumn 名称列名
* @param filter 额外过滤条件可选
*/
@PostMapping("/clearDynamic")
@Operation(summary = "清除指定动态字典缓存")
public ResponseResult clearDynamicCache(@RequestParam String tableName,
@RequestParam String codeColumn,
@RequestParam String nameColumn,
@RequestParam(required = false) String filter) {
if (StrUtil.isBlank(tableName) || StrUtil.isBlank(codeColumn) || StrUtil.isBlank(nameColumn)) {
return ResponseResult.error("tableName、codeColumn、nameColumn 不能为空");
}
dictCodeToNameConverter.clearDynamicDictCache(tableName, codeColumn, nameColumn, filter);
return ResponseResult.success("动态字典缓存已清除: " + tableName);
}
/**
* 查看缓存统计信息
*/
@GetMapping("/stats")
@Operation(summary = "查看字典缓存统计信息")
public ResponseResult getCacheStats() {
Map<String, Object> stats = dictCodeToNameConverter.getCacheStats();
return ResponseResult.successData(stats);
}
}

View File

@ -8,8 +8,10 @@ import com.yfd.platform.system.domain.SysDictionaryItems;
import com.yfd.platform.system.mapper.SysDictionaryItemsMapper;
import com.yfd.platform.system.service.ISysDictionaryService;
import com.yfd.platform.system.service.ISysDictionaryItemsService;
import com.yfd.platform.utils.DictCacheInvalidateEvent;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.springframework.context.ApplicationEventPublisher;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.*;
@ -36,6 +38,9 @@ public class SysDictionaryController {
@Resource
private ISysDictionaryItemsService sysDictionaryItemsService;
@Resource
private ApplicationEventPublisher eventPublisher;
/**********************************
* 用途说明: 获取数据字典列表
* 参数说明 dictType 字典类型
@ -61,8 +66,15 @@ public class SysDictionaryController {
@PostMapping("/deleteById")
@Operation(summary = "根据ID删除字典")
public ResponseResult deleteDictById(@RequestParam String id) {
// 删除前获取 dictCode用于后续清除缓存
SysDictionary dict = sysDictionaryService.getById(id);
String dictCode = dict != null ? dict.getDictCode() : null;
boolean ok = sysDictionaryService.deleteDictById(id);
if (ok) {
// 发布静态字典缓存失效事件
if (StrUtil.isNotBlank(dictCode)) {
eventPublisher.publishEvent(new DictCacheInvalidateEvent(this, dictCode));
}
return ResponseResult.success();
} else {
return ResponseResult.error();

View File

@ -5,11 +5,15 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.yfd.platform.annotation.Log;
import com.yfd.platform.config.ResponseResult;
import com.yfd.platform.system.domain.SysDictionary;
import com.yfd.platform.system.domain.SysDictionaryItems;
import com.yfd.platform.system.mapper.SysDictionaryItemsMapper;
import com.yfd.platform.system.service.ISysDictionaryItemsService;
import com.yfd.platform.system.service.ISysDictionaryService;
import com.yfd.platform.utils.DictCacheInvalidateEvent;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.springframework.context.ApplicationEventPublisher;
import org.springframework.web.bind.annotation.*;
import jakarta.annotation.Resource;
@ -33,6 +37,31 @@ public class SysDictionaryItemsController {
@Resource
private ISysDictionaryItemsService sysDictionaryItemsService;
@Resource
private ISysDictionaryService sysDictionaryService;
@Resource
private ApplicationEventPublisher eventPublisher;
/**
* 根据 dictId 查询 dictCode用于发布缓存失效事件
*/
private String getDictCodeByDictId(String dictId) {
if (StrUtil.isBlank(dictId)) return null;
SysDictionary dict = sysDictionaryService.getById(dictId);
return dict != null ? dict.getDictCode() : null;
}
/**
* 发布静态字典缓存失效事件
*/
private void invalidateStaticCache(String dictId) {
String dictCode = getDictCodeByDictId(dictId);
if (StrUtil.isNotBlank(dictCode)) {
eventPublisher.publishEvent(new DictCacheInvalidateEvent(this, dictCode));
}
}
/**********************************
* 用途说明: 分页查询字典项信息
* 参数说明 dictID 字典ID ItemName 字典项名称 pageNum 当前页
@ -77,6 +106,8 @@ public class SysDictionaryItemsController {
boolean ok =
sysDictionaryItemsService.addDictionaryItem(sysDictionaryItems);
if (ok) {
// 发布静态字典缓存失效事件
invalidateStaticCache(sysDictionaryItems.getDictId());
return ResponseResult.success();
} else {
return ResponseResult.error();
@ -98,6 +129,8 @@ public class SysDictionaryItemsController {
boolean ok =
sysDictionaryItemsService.updateById(sysDictionaryItems);
if (ok) {
// 发布静态字典缓存失效事件
invalidateStaticCache(sysDictionaryItems.getDictId());
return ResponseResult.success();
} else {
return ResponseResult.error();
@ -132,8 +165,13 @@ public class SysDictionaryItemsController {
if (StrUtil.isBlank(id)) {
return ResponseResult.error("参数为空");
}
// 删除前获取 dictId用于清除缓存
SysDictionaryItems item = sysDictionaryItemsService.getById(id);
String dictId = item != null ? item.getDictId() : null;
boolean ok = sysDictionaryItemsService.removeById(id);
if (ok) {
// 发布静态字典缓存失效事件
invalidateStaticCache(dictId);
return ResponseResult.success();
} else {
return ResponseResult.error();
@ -155,8 +193,18 @@ public class SysDictionaryItemsController {
String[] splitIds = id.split(",");
// 数组转集合
List<String> ids = Arrays.asList(splitIds);
// 批量删除前获取所有相关的 dictId去重后逐个清除缓存
List<SysDictionaryItems> items = sysDictionaryItemsService.listByIds(ids);
boolean ok = sysDictionaryItemsService.removeByIds(ids);
if (ok) {
// 发布静态字典缓存失效事件
if (items != null) {
items.stream()
.map(SysDictionaryItems::getDictId)
.filter(StrUtil::isNotBlank)
.distinct()
.forEach(dictId -> invalidateStaticCache(dictId));
}
return ResponseResult.success();
} else {
return ResponseResult.error();

View File

@ -0,0 +1,29 @@
package com.yfd.platform.utils;
import cn.hutool.core.util.StrUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.ApplicationEventPublisher;
import org.springframework.stereotype.Component;
@Component
@Slf4j
public class DictCacheHelper {
private final ApplicationEventPublisher publisher;
public DictCacheHelper(ApplicationEventPublisher publisher) {
this.publisher = publisher;
}
// 统一的Key生成器唯一维护点
public String buildDynamicKey(String tableName, String codeColumn, String nameColumn, String filter) {
return tableName + "|" + codeColumn + "|" + nameColumn + "|" + StrUtil.nullToDefault(filter, "");
}
// 核心触发清理事件参数与加载方法完全一致
public void evictDynamic(String tableName, String codeColumn, String nameColumn, String filter) {
String cacheKey = buildDynamicKey(tableName, codeColumn, nameColumn, filter);
// 携带cacheKey
publisher.publishEvent(new DictCacheInvalidateEvent(this, "DYNAMIC", cacheKey));
log.info("已发布动态字典清理事件: table={}, key={}", tableName, cacheKey);
}
}

View File

@ -0,0 +1,47 @@
package com.yfd.platform.utils;
import cn.hutool.core.util.StrUtil;
import lombok.Getter;
import org.springframework.context.ApplicationEvent;
/**
* 字典缓存失效事件
*
* <p>当静态字典或动态字典数据发生变更时发布此事件通知
* {@link DictCodeToNameConverter} 清除对应缓存
*/
@Getter
public class DictCacheInvalidateEvent extends ApplicationEvent {
private static final long serialVersionUID = 1L;
/** 缓存类型STATIC / DYNAMIC仅供日志或监控使用 */
private final String cacheType;
/** 完整的缓存键(最重要,监听器直接用这个去 invalidate */
private final String cacheKey;
// ========== 静态字典专用构造 ==========
public DictCacheInvalidateEvent(Object source, String dictCode) {
super(source);
this.cacheType = "STATIC";
this.cacheKey = dictCode; // 静态字典的 cacheKey 就是 dictCode
}
// ========== 动态字典专用构造 ==========
public DictCacheInvalidateEvent(Object source, String tableName,
String codeColumn, String nameColumn, String filter) {
super(source);
this.cacheType = "DYNAMIC";
// 关键Key 在这里拼好监听器直接拿 cacheKey 不再二次拼接
this.cacheKey = tableName + "|" + codeColumn + "|" + nameColumn + "|"
+ StrUtil.nullToDefault(filter, "");
}
// 如果外部已经拼好了 Key也可以直接传入更灵活
public DictCacheInvalidateEvent(Object source, String cacheType, String cacheKey) {
super(source);
this.cacheType = cacheType;
this.cacheKey = cacheKey;
}
}

View File

@ -2,25 +2,29 @@ package com.yfd.platform.utils;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.github.benmanes.caffeine.cache.Cache;
import com.github.benmanes.caffeine.cache.Caffeine;
import com.yfd.platform.common.MicroservicDynamicSQLMapper;
import com.yfd.platform.system.domain.SysDictionary;
import com.yfd.platform.system.domain.SysDictionaryItems;
import com.yfd.platform.system.mapper.SysDictionaryItemsMapper;
import com.yfd.platform.system.mapper.SysDictionaryMapper;
import jakarta.annotation.PostConstruct;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.event.EventListener;
import org.springframework.stereotype.Component;
import java.lang.reflect.Field;
import java.util.*;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;
/**
* 字典代码转名称转换器
* <p>
* 支持静态字典SYS_DICTIONARY / SYS_DICTIONARY_ITEMS和动态字典业务表查询
* VO 中的 code 字段值转换为对应的 name 字段值
* 使用 Caffeine Cache 存储字典映射TTL=1小时自动过期兜底
* 并通过监听 {@link DictCacheInvalidateEvent} 在字典数据变更时即时清除缓存
* </p>
*
* <h3>使用方式</h3>
@ -56,13 +60,17 @@ import java.util.stream.Collectors;
* }
* </pre>
*
* @author Generated
* @since 2025-05-18
*/
@Slf4j
@Component
public class DictCodeToNameConverter {
/** 默认缓存 TTL1 小时 */
private static final long CACHE_TTL_HOURS = 1;
/** 最大缓存条目数 */
private static final long MAX_CACHE_SIZE = 500;
@Resource
private SysDictionaryMapper sysDictionaryMapper;
@ -73,14 +81,52 @@ public class DictCodeToNameConverter {
private MicroservicDynamicSQLMapper<?> microservicDynamicSQLMapper;
/**
* 静态字典缓存dictCode -> Map<itemCode, dictName>
* 静态字典缓存dictCode -> Map&lt;itemCode, dictName&gt;
* TTL=1小时最大 500 条目
*/
private final Map<String, Map<String, String>> staticDictCache = new ConcurrentHashMap<>();
private Cache<String, Map<String, String>> staticDictCache;
/**
* 动态字典缓存缓存key -> Map<code, name>
* 动态字典缓存缓存key -> Map&lt;code, name&gt;
* TTL=1小时最大 500 条目
*/
private final Map<String, Map<String, String>> dynamicDictCache = new ConcurrentHashMap<>();
private Cache<String, Map<String, String>> dynamicDictCache;
@PostConstruct
public void init() {
staticDictCache = Caffeine.newBuilder()
.expireAfterWrite(CACHE_TTL_HOURS, TimeUnit.HOURS)
.maximumSize(MAX_CACHE_SIZE)
.removalListener((key, value, cause) ->
log.debug("静态字典缓存失效: dictCode={}, cause={}", key, cause))
.build();
dynamicDictCache = Caffeine.newBuilder()
.expireAfterWrite(CACHE_TTL_HOURS, TimeUnit.HOURS)
.maximumSize(MAX_CACHE_SIZE)
.removalListener((key, value, cause) ->
log.debug("动态字典缓存失效: key={}, cause={}", key, cause))
.build();
log.info("DictCodeToNameConverter 初始化完成, TTL={}小时, maxSize={}", CACHE_TTL_HOURS, MAX_CACHE_SIZE);
}
// ==================== 缓存失效事件监听 ====================
/**
* 监听字典缓存失效事件即时清除对应缓存
*/
@EventListener
public void onDictCacheInvalidate(DictCacheInvalidateEvent event) {
if ("STATIC".equalsIgnoreCase(event.getCacheType())) {
staticDictCache.invalidate(event.getCacheKey());
} else if ("DYNAMIC".equalsIgnoreCase(event.getCacheType())) {
dynamicDictCache.invalidate(event.getCacheKey());
}
log.info("字典缓存已清除: type={}, key={}", event.getCacheType(), event.getCacheKey());
}
// ==================== 对外转换方法 ====================
/**
* 批量转换根据元数据配置 VO 列表中的 code 字段转换为对应的 name 字段
@ -108,17 +154,7 @@ public class DictCodeToNameConverter {
}
/**
* 分页结果转换 Page 中所有记录的 code 字段转换为对应的 name 字段
*
* <pre>
* 使用示例
* Page&lt;SdHbrvDic&gt; page = hbrvDicService.queryPageList(...);
* dictCodeToNameConverter.convertCodeToName(page, CODE_TO_NAME_META_LIST);
* </pre>
*
* @param page 分页对象
* @param metadataList 元数据配置列表
* @param <T> VO 类型
* 分页结果转换
*/
public <T> void convertCodeToName(Page<T> page, List<CodeToNameMetadataBo> metadataList) {
if (page == null || page.getRecords() == null || page.getRecords().isEmpty()) {
@ -128,17 +164,7 @@ public class DictCodeToNameConverter {
}
/**
* 单个对象转换将单个对象的 code 字段转换为对应的 name 字段
*
* <pre>
* 使用示例
* SdHbrvDic hbrvDic = hbrvDicService.getById(hbrvcd);
* dictCodeToNameConverter.convertCodeToName(hbrvDic, CODE_TO_NAME_META_LIST);
* </pre>
*
* @param obj 单个对象
* @param metadataList 元数据配置列表
* @param <T> VO 类型
* 单个对象转换
*/
public <T> void convertCodeToName(T obj, List<CodeToNameMetadataBo> metadataList) {
if (obj == null || metadataList == null || metadataList.isEmpty()) {
@ -147,14 +173,13 @@ public class DictCodeToNameConverter {
convertCodeToName(Collections.singletonList(obj), metadataList);
}
// ==================== 缓存管理方法 ====================
/**
* 加载静态字典映射
*
* @param dictCode 字典编码
* @return Map<itemCode, dictName>
* 加载静态字典映射 Caffeine Cache 获取缓存未命中则查库
*/
public Map<String, String> loadStaticDictMap(String dictCode) {
return staticDictCache.computeIfAbsent(dictCode, key -> {
return staticDictCache.get(dictCode, key -> {
Map<String, String> map = new LinkedHashMap<>();
try {
SysDictionary dict = sysDictionaryMapper.selectOne(
@ -175,6 +200,7 @@ public class DictCodeToNameConverter {
map.put(item.getItemCode(), StrUtil.nullToDefault(item.getDictName(), item.getItemCode()));
}
}
log.debug("静态字典已加载: dictCode={}, size={}", key, map.size());
} catch (Exception e) {
log.error("加载静态字典失败: dictCode={}", key, e);
}
@ -183,17 +209,11 @@ public class DictCodeToNameConverter {
}
/**
* 加载动态字典映射从业务表查询
*
* @param tableName 表名
* @param codeColumn 编码列名
* @param nameColumn 名称列名
* @param filter 额外过滤条件
* @return Map<code, name>
* 加载动态字典映射 Caffeine Cache 获取缓存未命中则查库
*/
public Map<String, String> loadDynamicDictMap(String tableName, String codeColumn, String nameColumn, String filter) {
String cacheKey = tableName + "|" + codeColumn + "|" + nameColumn + "|" + StrUtil.nullToDefault(filter, "");
return dynamicDictCache.computeIfAbsent(cacheKey, key -> {
return dynamicDictCache.get(cacheKey, key -> {
Map<String, String> map = new LinkedHashMap<>();
try {
StringBuilder sql = new StringBuilder();
@ -213,6 +233,7 @@ public class DictCodeToNameConverter {
map.put(code, StrUtil.nullToDefault(name, code));
}
}
log.debug("动态字典已加载: tableName={}, size={}", tableName, map.size());
} catch (Exception e) {
log.error("加载动态字典失败: tableName={}", tableName, e);
}
@ -220,6 +241,48 @@ public class DictCodeToNameConverter {
});
}
/**
* 清除所有缓存
*/
public void clearCache() {
staticDictCache.invalidateAll();
dynamicDictCache.invalidateAll();
log.info("所有字典缓存已清除");
}
/**
* 清除指定静态字典缓存
*/
public void clearStaticDictCache(String dictCode) {
if (StrUtil.isNotBlank(dictCode)) {
staticDictCache.invalidate(dictCode);
log.info("静态字典缓存已清除: dictCode={}", dictCode);
}
}
/**
* 清除指定动态字典缓存
*/
public void clearDynamicDictCache(String tableName, String codeColumn, String nameColumn, String filter) {
String cacheKey = tableName + "|" + codeColumn + "|" + nameColumn + "|" + StrUtil.nullToDefault(filter, "");
dynamicDictCache.invalidate(cacheKey);
log.info("动态字典缓存已清除: key={}", cacheKey);
}
/**
* 获取缓存统计信息
*/
public Map<String, Object> getCacheStats() {
Map<String, Object> stats = new LinkedHashMap<>();
stats.put("staticDictSize", staticDictCache.estimatedSize());
stats.put("dynamicDictSize", dynamicDictCache.estimatedSize());
stats.put("ttlHours", CACHE_TTL_HOURS);
stats.put("maxSize", MAX_CACHE_SIZE);
return stats;
}
// ==================== 私有方法 ====================
/**
* 根据元数据加载 code->name 映射
*/
@ -231,7 +294,7 @@ public class DictCodeToNameConverter {
metadata.getDictSource(),
metadata.getCodeColumn(),
metadata.getNameColumn(),
metadata.getFilter()
null
);
}
log.warn("未知字典类型: dictType={}", metadata.getDictType());
@ -251,7 +314,6 @@ public class DictCodeToNameConverter {
String nameValue;
if (metadata.isMulti()) {
// 多选逗号分隔的多个code
nameValue = Arrays.stream(codeValue.split(","))
.map(String::trim)
.filter(StrUtil::isNotBlank)
@ -267,40 +329,12 @@ public class DictCodeToNameConverter {
}
}
/**
* 清除所有缓存
*/
public void clearCache() {
staticDictCache.clear();
dynamicDictCache.clear();
}
/**
* 清除指定静态字典缓存
*/
public void clearStaticDictCache(String dictCode) {
staticDictCache.remove(dictCode);
}
/**
* 清除指定动态字典缓存
*/
public void clearDynamicDictCache(String tableName, String codeColumn, String nameColumn, String filter) {
String cacheKey = tableName + "|" + codeColumn + "|" + nameColumn + "|" + StrUtil.nullToDefault(filter, "");
dynamicDictCache.remove(cacheKey);
}
// ==================== 反射工具方法 ====================
/**
* 通过反射获取对象的字段值转为字符串支持驼峰命名
*/
private <T> String getFieldValue(T obj, String fieldName) {
try {
Field field = findField(obj.getClass(), fieldName);
if (field == null) {
return null;
}
if (field == null) return null;
field.setAccessible(true);
Object value = field.get(obj);
return value != null ? value.toString() : null;
@ -309,82 +343,51 @@ public class DictCodeToNameConverter {
}
}
/**
* 通过反射设置对象的字段值支持驼峰命名
*/
private <T> void setFieldValue(T obj, String fieldName, String value) {
try {
Field field = findField(obj.getClass(), fieldName);
if (field == null) {
return;
}
if (field == null) return;
field.setAccessible(true);
field.set(obj, value);
} catch (Exception ignored) {
// 忽略设置失败
}
}
/**
* 查找字段忽略大小写支持驼峰和下划线变体递归查找父类
*/
private Field findField(Class<?> clazz, String fieldName) {
if (clazz == null || clazz == Object.class) {
return null;
}
// 先精确匹配
if (clazz == null || clazz == Object.class) return null;
for (Field field : clazz.getDeclaredFields()) {
if (field.getName().equals(fieldName)) {
return field;
}
if (field.getName().equals(fieldName)) return field;
}
// 忽略大小写匹配
for (Field field : clazz.getDeclaredFields()) {
if (field.getName().equalsIgnoreCase(fieldName)) {
return field;
}
if (field.getName().equalsIgnoreCase(fieldName)) return field;
}
// 驼峰-下划线互转匹配
String camelName = underlineToCamel(fieldName);
String underlineName = camelToUnderline(fieldName);
for (Field field : clazz.getDeclaredFields()) {
String fName = field.getName();
if (fName.equalsIgnoreCase(camelName) || fName.equalsIgnoreCase(underlineName)) {
return field;
}
if (fName.equalsIgnoreCase(camelName) || fName.equalsIgnoreCase(underlineName)) return field;
}
return findField(clazz.getSuperclass(), fieldName);
}
private String underlineToCamel(String str) {
if (StrUtil.isBlank(str) || !str.contains("_")) {
return str;
}
if (StrUtil.isBlank(str) || !str.contains("_")) return str;
StringBuilder sb = new StringBuilder();
boolean upper = false;
for (char c : str.toCharArray()) {
if (c == '_') {
upper = true;
} else {
sb.append(upper ? Character.toUpperCase(c) : c);
upper = false;
}
if (c == '_') { upper = true; }
else { sb.append(upper ? Character.toUpperCase(c) : c); upper = false; }
}
return sb.toString();
}
private String camelToUnderline(String str) {
if (StrUtil.isBlank(str)) {
return str;
}
if (StrUtil.isBlank(str)) return str;
StringBuilder sb = new StringBuilder();
for (int i = 0; i < str.length(); i++) {
char c = str.charAt(i);
if (Character.isUpperCase(c)) {
sb.append('_').append(Character.toLowerCase(c));
} else {
sb.append(c);
}
if (Character.isUpperCase(c)) sb.append('_').append(Character.toLowerCase(c));
else sb.append(c);
}
return sb.toString();
}

View File

@ -0,0 +1,83 @@
<?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_base.mapper.SdFpssrlAiRMapper">
<!-- 批量合并过鱼AI自动数据基于 STCD + TM + FTP + AI_BOX_CODE 唯一) -->
<insert id="mergeFishRecords" parameterType="java.util.List">
MERGE INTO SD_FPSSRL_AI_R T
USING (
<foreach collection="list" item="obj" index="index" separator="UNION ALL">
SELECT
#{obj.stcd, jdbcType=VARCHAR} AS STCD,
#{obj.tm, jdbcType=TIMESTAMP} AS TM,
#{obj.ftp, jdbcType=VARCHAR} AS FTP,
#{obj.fcnt, jdbcType=INTEGER} AS FCNT,
#{obj.fsz, jdbcType=VARCHAR} AS FSZ,
#{obj.length, jdbcType=DECIMAL} AS LENGTH,
#{obj.width, jdbcType=DECIMAL} AS WIDTH,
#{obj.fishspeed, jdbcType=VARCHAR} AS FISHSPEED,
#{obj.direction, jdbcType=INTEGER} AS DIRECTION,
#{obj.fishposition, jdbcType=DECIMAL} AS FISHPOSITION,
#{obj.firstImgUrl, jdbcType=VARCHAR} AS FIRSTIMGURL,
#{obj.secondImgUrl, jdbcType=VARCHAR} AS SECONDIMGURL,
#{obj.videoUrl, jdbcType=VARCHAR} AS VIDEOURL,
#{obj.temperature, jdbcType=DECIMAL} AS TEMPERATURE,
#{obj.waterlevel, jdbcType=DECIMAL} AS WATERLEVEL,
#{obj.speed, jdbcType=DECIMAL} AS SPEED,
#{obj.q, jdbcType=DECIMAL} AS Q,
#{obj.dox, jdbcType=DECIMAL} AS DOX,
#{obj.tu, jdbcType=INTEGER} AS TU,
#{obj.channelno, jdbcType=VARCHAR} AS CHANNELNO,
#{obj.aiBoxCode, jdbcType=VARCHAR} AS AI_BOX_CODE,
#{obj.fid, jdbcType=VARCHAR} AS FID,
#{obj.remark, jdbcType=VARCHAR} AS REMARK,
#{obj.recordUser, jdbcType=VARCHAR} AS RECORD_USER,
#{obj.modifyUser, jdbcType=VARCHAR} AS MODIFY_USER
FROM DUAL
</foreach>
) S
ON (T.STCD = S.STCD AND T.TM = S.TM AND T.FTP = S.FTP
AND T.AI_BOX_CODE = S.AI_BOX_CODE AND T.IS_DELETED = 0)
WHEN MATCHED THEN
UPDATE SET
T.FCNT = S.FCNT,
T.FSZ = S.FSZ,
T.LENGTH = S.LENGTH,
T.WIDTH = S.WIDTH,
T.FISHSPEED = S.FISHSPEED,
T.DIRECTION = S.DIRECTION,
T.FISHPOSITION = S.FISHPOSITION,
T.FIRSTIMGURL = S.FIRSTIMGURL,
T.SECONDIMGURL = S.SECONDIMGURL,
T.VIDEOURL = S.VIDEOURL,
T.TEMPERATURE = S.TEMPERATURE,
T.WATERLEVEL = S.WATERLEVEL,
T.SPEED = S.SPEED,
T.Q = S.Q,
T.DOX = S.DOX,
T.TU = S.TU,
T.CHANNELNO = S.CHANNELNO,
T.FID = S.FID,
T.REMARK = S.REMARK,
T.MODIFY_USER = S.MODIFY_USER,
T.MODIFY_TIME = SYSDATE
WHEN NOT MATCHED THEN
INSERT (
ID, STCD, TM, FTP, FCNT, FSZ, LENGTH, WIDTH, FISHSPEED,
DIRECTION, FISHPOSITION, FIRSTIMGURL, SECONDIMGURL, VIDEOURL,
TEMPERATURE, WATERLEVEL, SPEED, Q, DOX, TU, CHANNELNO, AI_BOX_CODE,
FID, REMARK, RECORD_USER, RECORD_TIME, MODIFY_USER, MODIFY_TIME,
IS_DELETED
) VALUES (
SYS_GUID(),
S.STCD, S.TM, S.FTP, S.FCNT, S.FSZ, S.LENGTH, S.WIDTH, S.FISHSPEED,
S.DIRECTION, S.FISHPOSITION, S.FIRSTIMGURL, S.SECONDIMGURL, S.VIDEOURL,
S.TEMPERATURE, S.WATERLEVEL, S.SPEED, S.Q, S.DOX, S.TU, S.CHANNELNO,
NVL(S.AI_BOX_CODE, '未知'),
S.FID, S.REMARK, S.RECORD_USER, SYSDATE, S.MODIFY_USER, SYSDATE,
0
)
</insert>
</mapper>

View File

@ -11,9 +11,9 @@ VITE_APP_BASE_URL = 'http://localhost:8093'
# 测试环境
# VITE_APP_BASE_URL = 'http://172.16.21.142:8093'
# 汤伟
VITE_APP_BASE_URL = 'http://10.84.111.235:8093'
# VITE_APP_BASE_URL = 'http://10.84.111.235:8093'
# 李林
# VITE_APP_BASE_URL = 'http://10.84.111.25:8093'
VITE_APP_BASE_URL = 'http://10.84.111.25:8093'
## 开发环境 附件服务地址
VITE_APP_ATTACHMENT_URL = 'https://211.99.26.225:12125'

View File

@ -109,7 +109,7 @@ export class MapCesium implements MapInterface {
this.containerId = container.id;
this.containerElement = container;
this.showLoadingOverlay(container);
const token = 'bearer fa8aa37c-1e52-4631-a699-625b4147ace8';
const token = 'bearer b734a443-2c8f-4f4a-8698-44828cc5f709';
this.viewer = new Cesium.Viewer(container, {
animation: false,

View File

@ -0,0 +1,115 @@
<template>
<!-- 第一步输入修改依据 -->
<a-modal
v-model:open="dataSourceVisible"
:title="title"
ok-text="确定"
cancel-text="取消"
@ok="handleDataSourceConfirm"
>
<div>
<p style="color: red; margin-bottom: 8px">请输入修改依据以继续删除操作</p>
<a-textarea
v-model:value="dataSource"
placeholder="请输入修改依据"
:rows="4"
/>
</div>
</a-modal>
<!-- 第二步确认删除 -->
<a-modal
v-model:open="confirmVisible"
title="确认删除"
ok-text="确认删除"
cancel-text="取消"
:ok-button-props="{ danger: true }"
:confirm-loading="confirmLoading"
@ok="handleFinalDelete"
>
<div>
<p style="color: red; font-weight: bold">请慎重操作</p>
<p>{{ label }}名称{{ deleteRecord?.stnm }}</p>
<p>修改依据{{ dataSource || '无' }}</p>
<p>确定要删除该{{ label }}</p>
</div>
</a-modal>
</template>
<script setup lang="ts">
import { ref } from 'vue';
import { message } from 'ant-design-vue';
import { deletePowerInfo } from '@/api/DataQueryMenuModule';
import { useDraggable } from '@/utils/drag';
const props = withDefaults(
defineProps<{
/** 自定义删除函数,接收 (record, reason) 参数 */
deleteFn?: (record: any, reason: string) => Promise<any>;
/** 弹窗标题 */
title?: string;
/** 显示标签(如"电站"、"数据" */
label?: string;
}>(),
{
title: '删除电站',
label: '电站'
}
);
const emit = defineEmits(['success']);
const dataSourceVisible = ref(false);
const confirmVisible = ref(false);
const confirmLoading = ref(false);
const dataSource = ref('');
const deleteRecord = ref<any>(null);
const onSuccess = ref<Function>(() => {});
//
const open = (record: any, callback: Function) => {
deleteRecord.value = record;
dataSource.value = '';
dataSourceVisible.value = true;
onSuccess.value = callback;
};
useDraggable(dataSourceVisible, { boundary: true, resetOnOpen: true });
useDraggable(confirmVisible, { boundary: true, resetOnOpen: true });
//
const handleDataSourceConfirm = () => {
dataSourceVisible.value = false;
confirmVisible.value = true;
};
//
const handleFinalDelete = async () => {
confirmLoading.value = true; //
try {
let res: any;
if (props.deleteFn) {
// 使
res = await props.deleteFn(deleteRecord.value, dataSource.value);
} else {
// 使
const params = {
ids: [deleteRecord.value.stcd],
source: dataSource.value
};
res = await deletePowerInfo(params);
}
if (res?.code == 0 || res?.success) {
message.success('删除成功');
confirmVisible.value = false;
onSuccess.value();
} else {
message.error(res?.msg || '删除失败');
}
} catch (error) {
message.error('删除失败,请重试');
} finally {
confirmLoading.value = false; //
}
};
defineExpose({ open });
</script>

View File

@ -103,7 +103,7 @@ const buildGroupedColumns = () => {
const groupMap = new Map<string, ColumnItem[]>();
// defaultConfig: true
const filteredList = props.userColumnList.filter(item => item.defaultConfig !== true);
const filteredList = props.userColumnList.filter(item => item.enable == 1);
// groupType
for (const item of filteredList) {

View File

@ -19,6 +19,16 @@
<!-- ===== 概述 ===== -->
<a-col :span="24"><div class="form-group-title">概述</div></a-col>
<a-col :span="8">
<a-form-item label="电站编码" name="stcd">
<a-input
v-model:value="formData.stcd"
placeholder="请输入电站编码"
:disabled="!isAdd"
style="width: 100%"
/>
</a-form-item>
</a-col>
<a-col :span="8">
<a-form-item label="电站名称" name="ennm">
<a-input
@ -1121,11 +1131,14 @@ const formRef = ref();
const confirmLoading = ref(false);
const formData = ref<any>({});
const originalRecord = ref<any>({});
const formRules = ref<any>({
const formRules = computed(() => ({
stcd: props.isAdd
? [{ required: true, message: '请输入电站编码', trigger: 'blur' }]
: [],
ennm: [{ required: true, message: '请输入电站名称', trigger: 'blur' }],
baseId: [{ required: true, message: '请选择基地', trigger: 'change' }],
reachcd: [{ required: true, message: '请选择所在河段', trigger: 'change' }]
});
}));
//
const confirmModalVisible = ref(false);

View File

@ -60,6 +60,7 @@
<!-- 编辑电站 Modal -->
<EditPowerModal
v-model:open="editVisible"
:is-add="isAdd"
:dvtp-list="dvtpList"
:record="editRecord"
:top-hynm-list="topHynmList"
@ -491,7 +492,7 @@ const fetchColumnConfig = () => {
// API orderIndex checked 1
const sorted = [...list]
.filter((item: any) => item.checked === 1 && item.defaultConfig !== true)
.filter((item: any) => item.checked === 1 && item.enable == 1)
.sort((a: any, b: any) => a.orderIndex - b.orderIndex);
const cols = sorted.map((item: any) => {

View File

@ -42,7 +42,7 @@ const columns = ref<any[]>([
{ key: 'baseName', title: '水电基地', dataIndex: 'baseName', visible: true, width: 120, ellipsis: true },
{ key: 'ennm', title: '所属电站', dataIndex: 'ennm', visible: true, width: 100, ellipsis: true },
{ key: 'zzfldxName', title: '放流对象', dataIndex: 'zzfldxName', visible: true, width: 120, ellipsis: true },
{ key: 'zzfldx', title: '放流对象', dataIndex: 'zzfldx', visible: true, width: 120, ellipsis: true },
{ key: 'zzflcnt', title: '放流规模(尾)', dataIndex: 'zzflcnt', visible: true, width: 120 },
{ key: 'zzflbjfs', title: '标记方式', dataIndex: 'zzflbjfs', visible: true, width: 100, ellipsis: true },

View File

@ -1,5 +1,5 @@
<template>
<div class="export-container">
<div class="export-container body_one">
<a-form
ref="formRef"
:model="formData"
@ -321,4 +321,9 @@ onMounted(() => {
}
}
}
.body_one {
position: relative;
z-index: 900;
pointer-events: all;
}
</style>

View File

@ -548,4 +548,9 @@ onMounted(() => {
});
</script>
<style scoped lang="scss"></style>
<style scoped lang="scss">
.body_one {
position: relative;
z-index: 900;
pointer-events: all;
}</style>

View File

@ -205,4 +205,9 @@ onMounted(() => {
});
</script>
<style scoped lang="scss"></style>
<style scoped lang="scss">
.body_one {
position: relative;
z-index: 900;
pointer-events: all;
}</style>

View File

@ -14,9 +14,16 @@ VITE_APP_BASE_URL = 'http://localhost:8093'
VITE_APP_BASE_URL = 'http://10.84.111.235:8093'
# 李林
# VITE_APP_BASE_URL = 'http://10.84.111.25:8093'
<<<<<<< HEAD
=======
# 小扈
# VITE_APP_BASE_URL = 'http://10.84.111.182:8093'
>>>>>>> 0401f9354ff2bc8266a31aa2b2c445832e5da807
## 开发环境 附件服务地址
VITE_APP_ATTACHMENT_URL = 'https://211.99.26.225:12125'
## 生产环境 附件服务地址
VITE_APP_ATTACHMENT_URL1 = 'http://211.99.26.225:12127'
# 地图服务地址
VITE_APP_MAP_URL = 'https://211.99.26.225:18085'
# ?menu=systemManageMenu&page=disposeManage

View File

@ -10,5 +10,7 @@ VITE_APP_BASE_URL = 'http://localhost:8093'
VITE_APP_BASE_API_URL = 'https://211.99.26.225:12130/prod-api'
## 生产环境 附件服务地址
VITE_APP_ATTACHMENT_URL = 'https://211.99.26.225:12125'
## 生产环境 附件服务地址
VITE_APP_ATTACHMENT_URL1 = 'http://211.99.26.225:12127'
# 地图服务地址
VITE_APP_MAP_URL = 'https://211.99.26.225:18085'

View File

@ -0,0 +1,47 @@
import request from '@/utils/request';
/**
* +
* POST /wmp-env-server/env/vp/basin/GetKendoListCust
* @param params -- { filter: { rstcd }, group, groupResultFlat }
*/
export function getBotanicalGardenList(data: any) {
return request({
url: '/wmp-env-server/env/vp/basin/GetKendoListCust',
method: 'post',
data: data,
});
}
/**
*
* POST /wmp-env-server/env/vp/bcount/GetKendoListCust
* @param params -- { filter: { year, stcd } }
*/
export function getBotanicalGardenStatistic(params: any) {
const { filter, group, groupResultFlat } = params;
return request({
url: '/wmp-env-server/env/vp/bcount/GetKendoListCust',
method: 'post',
data: {
data: {
filter,
group,
groupResultFlat
}
}
});
}
/**
* BasicTable listUrl
* POST /wmp-env-server/env/vpr/basinVpIntDetail
* @param params -- BasicTable { filter, skip, take, sort, ... }
*/
export function getBotanicalGardenDetailData(params: any) {
return request({
url: '/vap/vpr/basinVpIntDetail',
method: 'post',
data: params
});
}

View File

@ -0,0 +1,154 @@
import request from '@/utils/request';
/**
* TreeSelect
* POST /sys/psbmodulelbb/getTreeConfiguredps
* getStationList
*/
export function getTreeConfiguredps() {
return request({
url: '/sys/psbmodulelbb/getTreeConfiguredps',
method: 'post',
data: {
filter: {
logic: 'and',
filters: [
{
field: 'wbsType',
operator: 'eq',
value: 'PSB_RVCD'
}
],
sort: [
{
field: 'baseId',
dir: 'asc'
}
]
}
}
});
}
/**
* psbmodulelbb
* POST /wmp-sys-server/sys/psbmodulelbb/GetKendoListCust
*/
export function getPowerSubjectLayout(
stcd: string,
templateId?: string,
ext = 'true'
) {
const filters = {
logic: 'and',
filters: [
{
field: 'stcd',
operator: 'eq',
dataType: 'string',
value: stcd
},
{
field: 'templateId',
operator: 'eq',
dataType: 'string',
value: templateId || null
},
{
field: 'ext',
operator: 'eq',
dataType: 'string',
value: ext
}
]
};
return request({
url: '/sys/psbmodulelbb/GetKendoListCust',
method: 'post',
data: { filter: filters }
});
}
/**
* -
* POST /wmp-env-server/fb/station/eng/GetAggregateData
*/
export function getPowerStationReleaseYear(data) {
return request({
url: '/fb/station/eng/GetAggregateData',
method: 'post',
data: data
});
}
/**
* -
* POST /wmp-env-server/fb/station/eng/GetKendoListCust
*/
export function getPowerStationReleaseData(params: any) {
return request({
url: '/fb/station/eng/GetKendoListCust',
method: 'post',
data:params
});
}
/**
*
* POST /wmp-eng-server/common/societyeffb/GetKendoListCust
*/
export function getSocialInvestmentData(data: any) {
return request({
url: '/wmp-eng-server/common/societyeffb/GetKendoListCust',
method: 'post',
data: data
});
}
/**
*
* POST /dec-lygk-base-server/base/msstbprpt/GetKendoList
*/
export function getZenZhiZhanList(data: any) {
return request({
url: '/fb/msstbprpt/GetKendoList',
method: 'post',
data: data
});
}
/**
*
* POST /wmp-env-server/fb/breedStage/GetKendoListCust
*/
export function getHatcheryOperationData(data:any) {
return request({
url: '/fb/breedStage/GetKendoListCust',
method: 'post',
data: data
});
}
/**
*
* POST /wmp-env-server/env/fishDic/GetKendoList
*/
export function getFishDic(data:any) {
return request({
url: '/fpr/fishDic/GetKendoList',
method: 'post',
data: data
});
}
/**
* -
* POST /wmp-env-server/fb/msfbrd/qgc/GetKendoListCust
*/
export function getPowerStationReleaseDetail(data: any) {
return request({
url: '/fb/msfbrdm/qgc/GetKendoListCust',
method: 'post',
data: data
});
}

View File

@ -1,26 +1,98 @@
import request from '@/utils/request';
// 获取所有倾斜摄影
//
export function warnruleGetKendoList(data: any) {
return request({
url: '/api/wmp-sys-server/sys/warn/rule/GetKendoList',
url: '/sys/warnRule/GetKendoListCust',
method: 'post',
data: data
});
}
//预警类型下拉框 //水质等级下拉框
export function dictGetRemoteDictValue(data: any) {
export function bindGetKendoList(data: any) {
return request({
url: '/api/dec-modules-usm-springcloud-starter/usm/v1/dict/getRemoteDictValue',
method: 'get',
params: data
url: '/sys/warnRule/bind/GetKendoList',
method: 'post',
data: data
});
}
//新增修改获取相关输入数据
export function ruleysList(data: any) {
return request({
url: '/api/wmp-sys-server/sys/warn/rule/ysList',
url: '/sys/warnRule/ysList',
method: 'post',
data: data
});
}
// 新增/修改预警规则
export function warnruleAddOrUpdate(data: any) {
return request({
url: '/sys/warnRule/addOrUpdate',
method: 'post',
data: data
});
}
// 删除预警规则
export function warnruleDelete(params: { id: string }) {
return request({
url: '/sys/warnRule/delete',
method: 'get',
params: params
});
}
// 获取所属电站列表
export function getStationList() {
return request({
url: '/sys/psbmodulelbb/getTreeConfiguredps',
method: 'post',
data: {
filter: {
logic: 'and',
filters: [
{
field: 'wbsType',
operator: 'eq',
value: 'PSB_RVCD'
}
]
}
}
});
}
// 删除绑定预警规则
export function warnruleBindDelete(params: { id: string }) {
return request({
url: '/sys/warnRule/bind/delete',
method: 'get',
params: params
});
}
// 根据电站获取预警规则列表
export function getRuleListByStcd(params: { stcd: string; ruleType: string }) {
return request({
url: '/sys/warnRule/getRuleListByStcd',
method: 'get',
params
});
}
// 根据预警规则ID获取详情含 detail 数据)
export function getDetailById(params: { ruleId: string }) {
return request({
url: '/sys/warnRule/getDetailById',
method: 'get',
params
});
}
// 修改规则是否展示
export function updateShow(data:any) {
return request({
url: '/sys/warnRule/updateShow',
method: 'post',
params:data
});
}

View File

@ -0,0 +1,25 @@
import request from '@/utils/request';
/**
*
* rstcd sttpCode
*/
export function videoSurveillance(data: any) {
return request({
url: '/vd/msstbprpt/GetKendoList',
method: 'post',
data
});
}
/**
*
* stcd
*/
export function realTimeVideo(data:any) {
return request({
url: '/vd/runData/GetKendoListCust',
method: 'post',
data
});
}

View File

@ -0,0 +1,27 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="20px" height="8px" viewBox="0 0 20 8" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<title>arrowDownLine2</title>
<defs>
<filter id="filter-1">
<feColorMatrix in="SourceGraphic" type="matrix" values="0 0 0 0 0.184314 0 0 0 0 0.419608 0 0 0 0 0.596078 0 0 0 1.000000 0"></feColorMatrix>
</filter>
<linearGradient x1="50%" y1="0%" x2="50%" y2="100%" id="linearGradient-2">
<stop stop-color="#00F4FE" stop-opacity="0" offset="0%"></stop>
<stop stop-color="#00EDFD" offset="50.3632549%"></stop>
<stop stop-color="#00E6FC" stop-opacity="0" offset="100%"></stop>
</linearGradient>
</defs>
<g id="1-首页" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<g id="1.1.1-电站专题" transform="translate(-1544.000000, -1239.000000)">
<g id="编组备份-4" transform="translate(1476.000000, 70.000000)">
<g id="编组-3" transform="translate(16.000000, 1072.000000)">
<g id="arrowDownLine2" transform="translate(51.571254, 96.742752)" filter="url(#filter-1)">
<g>
<polygon id="ArrowDownLine" fill="url(#linearGradient-2)" fill-rule="nonzero" transform="translate(10.505921, 4.257248) scale(-1, 1) rotate(-270.000000) translate(-10.505921, -4.257248) " points="7 -5.48550424 7.85749293 -6 14.0118417 4.25724788 7.85749293 14.5144958 7 14 12.8457465 4.25724788"></polygon>
</g>
</g>
</g>
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.7 KiB

View File

@ -0,0 +1,34 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="56px" height="56px" viewBox="0 0 56 56" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<title>FishStation</title>
<defs>
<path d="M9.0836405,48.6439317 C20.4848773,59.0912405 38.196623,58.3179289 48.6439317,46.9166921 C59.0912405,35.5154553 58.3179289,17.8037096 46.9166921,7.35640088 C35.5154553,-3.09090785 17.8037096,-2.31759633 7.35640088,9.0836405 C-3.09090785,20.4848773 -2.31759633,38.196623 9.0836405,48.6439317 Z" id="path-1"></path>
<mask id="mask-2" maskContentUnits="userSpaceOnUse" maskUnits="objectBoundingBox" x="0" y="0" width="56.0003326" height="56.0003326" fill="white">
<use xlink:href="#path-1"></use>
</mask>
<circle id="path-3" cx="28.0001663" cy="28.0001663" r="21"></circle>
<mask id="mask-4" maskContentUnits="userSpaceOnUse" maskUnits="objectBoundingBox" x="0" y="0" width="42" height="42" fill="white">
<use xlink:href="#path-3"></use>
</mask>
<linearGradient x1="50%" y1="0%" x2="50%" y2="100%" id="linearGradient-5">
<stop stop-color="#05D9FF" offset="0%"></stop>
<stop stop-color="#02B2FF" offset="100%"></stop>
</linearGradient>
</defs>
<g id="页面-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<g id="08_增殖放流" transform="translate(-1512.000000, -537.000000)">
<g id="BGSM备份-4" transform="translate(1464.000000, 436.000000)">
<g id="编组-3" transform="translate(16.000000, 61.000000)">
<g id="FishStation" transform="translate(32.000000, 40.000000)">
<use id="椭圆形" stroke-opacity="0.45" stroke="#007FCC" mask="url(#mask-2)" stroke-width="8.75" stroke-dasharray="42,1.75" xlink:href="#path-1"></use>
<circle id="椭圆形" stroke-opacity="0.65" stroke="#02B2FF" stroke-width="0.875" fill="#014380" cx="28.0001663" cy="28.0001663" r="24.0625"></circle>
<use id="椭圆形备份-3" stroke="#02B2FF" mask="url(#mask-4)" stroke-width="3.5" stroke-dasharray="3.5,0.875" xlink:href="#path-3"></use>
<path d="M23.6237633,32.0387229 L23.6237633,35.0001891 L26.7401593,33.2949884 C36.8668397,35.0001891 42.0001663,28.7188456 42.0001663,28.7188456 C39.2962975,25.3989847 32.606162,24.0521677 32.606162,24.0521677 L26.464835,21.0001663 L26.4191017,24.2761678 C23.5323113,24.634568 19.2697742,27.7313803 19.2697742,27.7313803 C18.6295063,27.1023125 14.0001663,24.0960544 14.0001663,24.0960544 C16.2000349,25.7116552 16.2000349,31.7689877 14.0001663,33.3845939 L19.2697742,29.7949868 C19.8204292,30.3335222 23.6237633,32.0387229 23.6237633,32.0387229 Z M36.6838963,26.9231206 C37.5089642,26.9231206 38.151097,27.5960533 38.151097,28.4043213 C38.151097,29.166854 37.5089642,29.8397895 36.6838963,29.8397895 C35.8597635,29.8397895 35.2185622,29.1668568 35.2185622,28.4043213 C35.217628,27.5960533 35.8597608,26.9231206 36.6838963,26.9231206 Z" id="形状" fill="url(#linearGradient-5)" fill-rule="nonzero"></path>
<circle id="椭圆形" fill="#FDDD60" cx="21" cy="22.75" r="1"></circle>
<circle id="椭圆形备份-5" fill="#FDDD60" cx="40.2501663" cy="21.8751663" r="1.75"></circle>
</g>
</g>
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 3.4 KiB

View File

@ -1,5 +1,6 @@
<template>
<div
id="map-baselayer"
class="baselayer-switcher"
:style="{ right: drawerOpen ? '480px' : '12px' }"
v-if="uiStore.mapType == '2D'"
@ -62,6 +63,16 @@ const nineSectionsImg: any = {
const activeKey = ref(layers[0].key);
// store
watch(
() => mapViewStore.activeBaseLayerKey,
(newKey) => {
if (newKey && layers.some(l => l.key === newKey)) {
activeKey.value = newKey;
}
}
);
/**
* 判断图层管理中的基础底图customBaseLayer是否被选中
*/

View File

@ -974,7 +974,8 @@ onUnmounted(() => {
display: flex;
justify-content: space-between;
flex-direction: column;
background-color: #fff;
// box-shadow: 0 1px 2px #00000026;
.qgc_title {
width: 100%;
background-color: #e5edf3;

View File

@ -10,6 +10,7 @@ import {
drawDotImg5,
offset5
} from '@/utils/GisUrlList';
import { LAYOUT_GRID_SKELETONS } from '@/views/dianZhanZhuanTi/layoutGridSkeletons';
declare global {
interface Window {
__lyConfigs?: {
@ -321,162 +322,82 @@ const getListByPosition = (data: any, position: string) =>
/**
*
* @param layoutType -
* @param data -
* @param offset -
* @param data - { type, data: BclDataItem[] }
* @param offset - + padding + gap 460440px + 10px + 10px
* @param bottomRowHeight - '200px'
*/
export const setMapLegendPos = (
layoutType: string,
data: any,
offset = 456
offset = 460,
bottomRowHeight?: string
) => {
const menuStateString = localStorage.getItem('menuState'); //处理澜沧江左侧菜单状态
const menuStateString = localStorage.getItem('menuState');
const menuState =
menuStateString !== null ? JSON.parse(menuStateString) : true;
const _theme = localStorage.getItem('ly-theme') || window.__lyConfigs?.theme;
const leftEle = document.querySelector('#page-layout-left') as HTMLElement;
const rightEle = document.querySelector('#page-layout-right') as HTMLElement;
const bottomEle = document.querySelector(
'#page-layout-bottom'
) as HTMLElement;
const legend = document.querySelector('#qgc-legendtl') as HTMLElement; // 图例
const filter = document.querySelector('#map-filter-container') as HTMLElement; // 全局表单
const compassControl = document.querySelector(
'#map-compassControl'
) as HTMLElement; // 全局表单
const controller = document.querySelector('#map-controller') as HTMLElement; // 地图工具栏
const monitor = document.querySelector('#map-monitor') as HTMLElement; // 地图工具栏
const baselayer = document.querySelector('#map-baselayer') as HTMLElement; // 底图模式切换
// const vd = document.querySelector('#vd_operate') as HTMLElement // 底部视频
const left = [
'layout1',
'layout2',
'layout3',
'layout4',
'layout6',
'layout7',
'layout8',
'layout9',
'layout10',
'layout11',
'layout14',
'layout15',
'layout16',
'layout17'
]; // 左侧布局
const right = [
'layout1',
'layout2',
'layout3',
'layout4',
'layout5',
'layout6',
'layout8',
'layout10',
'layout11',
'layout15',
'layout16',
'layout17'
]; // 右侧布局
const bottom1 = [
'layout1',
'layout6',
'layout8',
'layout9',
'layout10',
'layout16'
]; // 三行底部布局
const bottom2 = ['layout2', 'layout15']; // 四行底部布局
const w = `${offset}px`;
const l = `${_theme === 'ly-8' ? (menuState ? 643 : 510) : offset}px`;
let b = `0px`;
const le = ['layout17', 'layout10'].includes(layoutType) ? 0 : 1;
const legend = document.querySelector('#qgc-legendtl') as HTMLElement;
const filter = document.querySelector('#map-filter-container') as HTMLElement;
const compassControl = document.querySelector('#map-compassControl') as HTMLElement;
const controller = document.querySelector('#map-controller') as HTMLElement;
const monitor = document.querySelector('#map-monitor') as HTMLElement;
const baselayer = document.querySelector('#map-baselayer') as HTMLElement;
const leftList = getListByPosition(data, 'left');
const rightList = getListByPosition(data, 'right');
const bottomList = getListByPosition(data, 'bottom');
let bottom = '0';
const hasLeft = leftList?.length > 0;
const hasRight = rightList?.length > 0;
const hasBottom = bottomList?.length > 0;
console.log('[图例] hasLeft:', hasLeft, 'hasBottom:', hasBottom, 'bottomRowHeight:', bottomRowHeight);
const w = `${offset}px`;
const l = `${_theme === 'ly-8' ? (menuState ? 643 : 510) : offset}px`;
let b = `0px`;
if (_theme === 'ly-8') {
if (window.__mapMode === '3D') {
b = `200px`;
} else {
b = `${menuState ? 200 : 50}px`;
b = window.__mapMode === '3D' ? '200px' : `${menuState ? 200 : 50}px`;
}
// 底部偏移
// px 值:直接 + padding(10px)
// fr 值:按占比算,如 3 行各 1fr = calc((100% - 40px) / 3 + 10px)
let bottomOffset = '12px';
if (hasBottom && bottomRowHeight) {
const pxMatch = bottomRowHeight.match(/^(\d+)px$/);
if (pxMatch) {
bottomOffset = `${parseInt(pxMatch[1]) + 10}px`;
} else if (bottomRowHeight.endsWith('fr')) {
const rows = (LAYOUT_GRID_SKELETONS[layoutType]?.gridTemplateRows || '').split(' ').filter(Boolean);
const n = rows.length; // 总行数
const gaps = (n - 1) * 10; // 行间距
bottomOffset = `calc((100% - 20px - ${gaps}px) / ${n} + 10px)`;
}
}
if (bottomList?.length > 0) {
if (bottom1.includes(layoutType)) {
bottom = 'calc((100% - 16px) / 3 + 8px)';
}
if (bottom2.includes(layoutType)) {
bottom = 'calc((100% - 24px) / 4 + 8px)';
}
} else {
// 没有底部布局时,底部高度为
bottom = '28px';
}
const rle = ['layout6'].includes(layoutType) || bottom != '28px' ? 0 : 1;
const leftHide = leftEle?.classList?.contains('hide');
const rightHide = rightEle?.classList?.contains('hide');
const bottomHide = bottomEle?.classList?.contains('hide');
if (legend) {
legend.style.left =
!leftHide && left.includes(layoutType) && leftList?.length > le ? l : b;
legend.style.bottom = bottomHide
? '0'
: bottomList?.length > 0
? bottom
: '12px';
legend.style.left = hasLeft ? `calc(${l} - 10px)` : b;
legend.style.bottom = bottomOffset;
}
if (filter) {
if (layoutType === 'layout10') {
filter.style.left =
!leftHide && left.includes(layoutType) && leftList?.length > 1 ? l : b;
} else {
filter.style.left =
!leftHide &&
left.includes(layoutType) &&
leftList?.length > 0 &&
layoutType !== 'layout17'
? l
: b;
}
filter.style.left = hasLeft ? l : b;
}
if (compassControl) {
if (layoutType === 'layout10') {
compassControl.style.left =
!leftHide && left.includes(layoutType) && leftList?.length > 1 ? l : b;
} else {
compassControl.style.left =
!leftHide &&
left.includes(layoutType) &&
leftList?.length > 0 &&
layoutType !== 'layout17'
? l
: b;
}
compassControl.style.left = hasLeft ? l : b;
}
if (controller) {
controller.style.right =
!rightHide && right.includes(layoutType) && rightList?.length > rle
? w
: '0';
controller.style.bottom = bottomHide ? '0' : bottom;
controller.style.right = hasRight ? w : '0';
controller.style.bottom = hasBottom ? `calc(${bottomOffset} + 10px)` : '0';
}
if (monitor) {
monitor.style.right =
!rightHide && right.includes(layoutType) && rightList?.length > rle
? w
: '0';
// monitor.style.bottom = bottomHide ? '0' : bottom
monitor.style.right = hasRight ? w : '0';
}
if (baselayer) {
baselayer.style.right =
!rightHide && right.includes(layoutType) && rightList?.length > rle
? `calc(${w} + 60px)`
: '60px';
baselayer.style.bottom = bottomHide ? '0' : bottom;
baselayer.style.right = hasRight ? `calc(${w} + 60px)` : '60px';
baselayer.style.bottom = hasBottom ? bottomOffset : '0';
}
};

View File

@ -142,7 +142,7 @@ export class MapCesium implements MapInterface {
try {
this.containerId = container.id;
this.containerElement = container;
const token = 'bearer fa8aa37c-1e52-4631-a699-625b4147ace8';
const token = 'bearer b734a443-2c8f-4f4a-8698-44828cc5f709';
this.viewer = new Cesium.Viewer(container, {
animation: false,

View File

@ -1,5 +1,5 @@
<template>
<div class="map-controller" :style="{ right: drawerOpen ? '480px' : '12px' }">
<div id="map-controller" class="map-controller" :style="{ right: drawerOpen ? '480px' : '12px' }">
<div
class="map-controller-group"
v-for="(item, index) in controllers"

View File

@ -1,5 +1,5 @@
<template>
<div class="mapLegendView" v-show="!uiStore.isRoaming">
<div id="qgc-legendtl" class="mapLegendView" v-show="!uiStore.isRoaming">
<div class="legendTitle">
图例
<span class="legendBtn" @click="isOpen = !isOpen">

View File

@ -30,7 +30,7 @@
</template>
<script lang="ts" setup>
import { ref, onMounted, onUnmounted, watch, nextTick, computed } from 'vue';
import { ref, onMounted, onUnmounted, watch, nextTick, computed, inject } from 'vue';
import * as echarts from 'echarts';
import SidePanelItem from '@/components/SidePanelItem/index.vue';
import { wqGetKendoListCust } from '@/api/sz'
@ -247,8 +247,12 @@ watch(tabs, (newVal) => {
});
}
});
// 使 provide jidiStore
const injectedStation = inject<any>('dianZhanStation', null);
const stationSource = computed(() => injectedStation?.value || JidiSelectEventStore.selectedItem);
watch(
() => JidiSelectEventStore.selectedItem,
() => stationSource.value,
(newVal) => {
if (newVal && newVal.wbsCode) {
baseid.value = newVal.wbsCode;
@ -751,8 +755,9 @@ onMounted(() => {
setTimeout(() => {
initChart();
// selectedItem
if (JidiSelectEventStore.selectedItem?.wbsCode) {
baseid.value = JidiSelectEventStore.selectedItem.wbsCode;
const currentStation = injectedStation?.value || JidiSelectEventStore.selectedItem;
if (currentStation?.wbsCode) {
baseid.value = currentStation.wbsCode;
getEchartsData();
}
}, 100);

View File

@ -29,7 +29,8 @@ import {
onMounted,
onBeforeUnmount,
watch,
nextTick
nextTick,
inject
} from 'vue';
import * as echarts from 'echarts';
import type { ECharts } from 'echarts';
@ -727,8 +728,12 @@ onBeforeUnmount(() => {
});
});
// 使 provide jidiStore
const injectedStation = inject<any>('dianZhanStation', null);
const stationSource = computed(() => injectedStation?.value || JidiSelectEventStore.selectedItem);
watch(
() => JidiSelectEventStore.selectedItem,
() => stationSource.value,
async newVal => {
if (!newVal || !newVal.wbsCode) {
return;

View File

@ -44,7 +44,7 @@
</template>
<script lang="ts" setup>
import { ref, watch } from 'vue';
import { ref, watch, inject, computed } from 'vue';
import SidePanelItem from '@/components/SidePanelItem/index.vue';
import { environmentalProtectionConstruction } from '@/api/home';
import { useJidiSelectEventStore } from '@/store/modules/jidiSelectEvent';
@ -142,9 +142,12 @@ const handleCardClick = (facility: any) => {
modalVisible.value = true;
};
//
// 使 provide jidiStore
const injectedStation = inject<any>('dianZhanStation', null);
const stationSource = computed(() => injectedStation?.value || JidiSelectEventStore.selectedItem);
watch(
() => JidiSelectEventStore.selectedItem,
() => stationSource.value,
(newVal) => {
if (newVal && newVal.wbsCode) {
baseid.value = newVal.wbsCode;

View File

@ -62,8 +62,7 @@
</template>
<script lang="ts" setup>
import { ref, onMounted, onUnmounted, nextTick,watch } from 'vue';
// import { ref, watch } from 'vue';
import { ref, onMounted, onUnmounted, nextTick, watch, inject, computed } from 'vue';
import { useJidiSelectEventStore } from '@/store/modules/jidiSelectEvent';
import SidePanelItem from '@/components/SidePanelItem/index.vue';
import LsstjkTk from './LsstjkTk.vue';
@ -288,9 +287,13 @@ const getSelectData = async () => {
});
};
// 使 provide jidiStore
const injectedStation = inject<any>('dianZhanStation', null);
const stationSource = computed(() => injectedStation?.value || JidiSelectEventStore.selectedItem);
// ==================== ====================
watch(
() => JidiSelectEventStore.selectedItem,
() => stationSource.value,
async newVal => {
if (newVal && newVal.wbsCode) {
baseid.value = newVal.wbsCode;

View File

@ -8,6 +8,7 @@ export const useMapViewStore = defineStore('map-view', () => {
const searchTimeRange = ref<[any, any]>([dayjs().subtract(1, 'M'), dayjs()]);
const selectedBaseId = ref('');
const currentZoomLevel = ref(4.5);
const activeBaseLayerKey = ref('s_province_boundaries');
// 备注:统一写入当前选中的图层 key始终保持去重后的结果。
const setCheckedLayerKeys = (keys: string[] = []) => {
@ -72,12 +73,18 @@ export const useMapViewStore = defineStore('map-view', () => {
currentZoomLevel.value = 4.5;
};
const setActiveBaseLayerKey = (key: string) => {
activeBaseLayerKey.value = key;
};
return {
checkedLayerKeys,
legendCheckedState,
searchTimeRange,
selectedBaseId,
currentZoomLevel,
activeBaseLayerKey,
setActiveBaseLayerKey,
setCheckedLayerKeys,
getCheckedLayerKeys,
setLegendCheckedState,

View File

@ -20,7 +20,7 @@
</template>
<script lang="ts" setup>
import { ref, onMounted, onUnmounted, nextTick, watch } from 'vue';
import { ref, onMounted, onUnmounted, nextTick, watch, inject, computed } from 'vue';
import * as echarts from 'echarts';
import type { EChartsOption } from 'echarts';
import SidePanelItem from '@/components/SidePanelItem/index.vue';
@ -637,8 +637,12 @@ const getselsectData = async () => {
//
};
////
// 使 provide jidiStore
const injectedStation = inject<any>('dianZhanStation', null);
const stationSource = computed(() => injectedStation?.value || JidiSelectEventStore.selectedItem);
watch(
() => JidiSelectEventStore.selectedItem,
() => stationSource.value,
newVal => {
baseid.value = newVal.wbsCode;
getselsectData();

View File

@ -98,7 +98,7 @@
</template>
<script lang="ts" setup>
import { ref, onMounted, watch } from 'vue';
import { ref, onMounted, watch, inject, computed } from 'vue';
import SidePanelItem from '@/components/SidePanelItem/index.vue';
import {
qgcetQgcStaticData,
@ -301,8 +301,12 @@ const getData = async () => {
spinning.value = false;
}
};
// 使 provide jidiStore
const injectedStation = inject<any>('dianZhanStation', null);
const stationSource = computed(() => injectedStation?.value || JidiSelectEventStore.selectedItem);
watch(
() => JidiSelectEventStore.selectedItem,
() => stationSource.value,
newVal => {
if (newVal && newVal.wbsCode) {
baseid.value = newVal.wbsCode;

View File

@ -61,7 +61,7 @@
</template>
<script lang="ts" setup>
import { ref, watch } from 'vue';
import { ref, watch, inject, computed } from 'vue';
import { useJidiSelectEventStore } from '@/store/modules/jidiSelectEvent';
import SidePanelItem from '@/components/SidePanelItem/index.vue';
import SsstdcgkTk from './SsstdcgkTk.vue';
@ -322,9 +322,13 @@ const getSelectData = async () => {
});
};
// 使 provide jidiStore
const injectedStation = inject<any>('dianZhanStation', null);
const stationSource = computed(() => injectedStation?.value || JidiSelectEventStore.selectedItem);
// ==================== ====================
watch(
() => JidiSelectEventStore.selectedItem,
() => stationSource.value,
async newVal => {
if (newVal && newVal.wbsCode) {
baseid.value = newVal.wbsCode;

View File

@ -22,7 +22,7 @@
</template>
<script lang="ts" setup>
import { ref, onMounted, onBeforeUnmount, nextTick, watch } from 'vue';
import { ref, onMounted, onBeforeUnmount, nextTick, watch, inject, computed } from 'vue';
import * as echarts from 'echarts';
import type { EChartsOption } from 'echarts';
import SidePanelItem from '@/components/SidePanelItem/index.vue';
@ -1170,9 +1170,13 @@ watch(
{ immediate: true }
);
// 使 provide jidiStore
const injectedStation = inject<any>('dianZhanStation', null);
const stationSource = computed(() => injectedStation?.value || JidiSelectEventStore.selectedItem);
const wbsCode = ref('');
watch(
() => JidiSelectEventStore.selectedItem,
() => stationSource.value,
newVal => {
console.log(newVal);
wbsCode.value = newVal.wbsCode;

View File

@ -17,7 +17,7 @@
</template>
<script lang="ts" setup>
import { ref, onMounted, onUnmounted, nextTick, watch } from 'vue';
import { ref, onMounted, onUnmounted, nextTick, watch, inject, computed } from 'vue';
import * as echarts from 'echarts';
import type { ECharts } from 'echarts';
import SidePanelItem from '@/components/SidePanelItem/index.vue';
@ -282,8 +282,12 @@ const handlePanelChange1 = async data => {
}
};
// 使 provide jidiStore
const injectedStation = inject<any>('dianZhanStation', null);
const stationSource = computed(() => injectedStation?.value || JidiSelectEventStore.selectedItem);
watch(
() => JidiSelectEventStore.selectedItem,
() => stationSource.value,
newVal => {
if (newVal && newVal.wbsCode) {
baseid.value = newVal.wbsCode;

View File

@ -103,7 +103,7 @@ const buildGroupedColumns = () => {
const groupMap = new Map<string, ColumnItem[]>();
// defaultConfig: true
const filteredList = props.userColumnList.filter(item => item.defaultConfig !== true);
const filteredList = props.userColumnList.filter(item => item.enable == 1);
// groupType
for (const item of filteredList) {

Some files were not shown because too many files have changed in this diff Show More