diff --git a/backend/src/main/java/com/yfd/platform/config/MyMetaObjectHandler.java b/backend/src/main/java/com/yfd/platform/config/MyMetaObjectHandler.java
new file mode 100644
index 0000000..45ac60c
--- /dev/null
+++ b/backend/src/main/java/com/yfd/platform/config/MyMetaObjectHandler.java
@@ -0,0 +1,38 @@
+package com.yfd.platform.config;
+
+import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
+import org.apache.ibatis.reflection.MetaObject;
+import org.springframework.stereotype.Component;
+
+import java.util.Date;
+
+/**
+ * MyBatis-Plus 自动填充处理器
+ * 用于处理 @TableField(fill = FieldFill.INSERT/UPDATE) 注解
+ */
+@Component
+public class MyMetaObjectHandler implements MetaObjectHandler {
+
+ /**
+ * 插入时自动填充
+ */
+ @Override
+ public void insertFill(MetaObject metaObject) {
+ Date now = new Date();
+
+ // 自动填充创建时间
+ this.strictInsertFill(metaObject, "createdAt", Date.class, now);
+
+ // 自动填充更新时间
+ this.strictInsertFill(metaObject, "updatedAt", Date.class, now);
+ }
+
+ /**
+ * 更新时自动填充
+ */
+ @Override
+ public void updateFill(MetaObject metaObject) {
+ // 自动填充更新时间
+ this.strictUpdateFill(metaObject, "updatedAt", Date.class, new Date());
+ }
+}
diff --git a/backend/src/main/java/com/yfd/platform/config/SecurityConfig.java b/backend/src/main/java/com/yfd/platform/config/SecurityConfig.java
index 3ff643e..1558260 100644
--- a/backend/src/main/java/com/yfd/platform/config/SecurityConfig.java
+++ b/backend/src/main/java/com/yfd/platform/config/SecurityConfig.java
@@ -56,6 +56,7 @@ public class SecurityConfig {
.requestMatchers("/eng/**").permitAll()
.requestMatchers("/env/**").permitAll()
.requestMatchers("/sw/**").permitAll()
+ .requestMatchers("/data/**").permitAll()
.requestMatchers(HttpMethod.GET, "/").permitAll()
.requestMatchers(HttpMethod.GET,
"/*.html",
diff --git a/backend/src/main/java/com/yfd/platform/data/controller/SysUserDataScopeController.java b/backend/src/main/java/com/yfd/platform/data/controller/SysUserDataScopeController.java
new file mode 100644
index 0000000..c02ee7d
--- /dev/null
+++ b/backend/src/main/java/com/yfd/platform/data/controller/SysUserDataScopeController.java
@@ -0,0 +1,124 @@
+package com.yfd.platform.data.controller;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.yfd.platform.annotation.Log;
+import com.yfd.platform.config.ResponseResult;
+import com.yfd.platform.data.domain.SysUserDataScope;
+import com.yfd.platform.data.service.ISysUserDataScopeService;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import org.springframework.web.bind.annotation.*;
+
+import jakarta.annotation.Resource;
+import java.util.List;
+
+/**
+ *
+ * 数据填报用户权限关系表 前端控制器
+ *
+ */
+@RestController
+@RequestMapping("/data/userDataScope")
+@Tag(name = "数据填报用户权限")
+public class SysUserDataScopeController {
+
+ @Resource
+ private ISysUserDataScopeService dataScopeService;
+
+ /**
+ * 分页查询数据填报权限列表
+ */
+ @GetMapping("/queryPageList")
+ @Operation(summary = "分页查询数据填报权限列表")
+ public ResponseResult queryPageList(
+ @RequestParam(required = false) String userId,
+ @RequestParam(required = false) String orgType,
+ @RequestParam(required = false) String orgId,
+ @RequestParam(required = false) Integer status,
+ @RequestParam(defaultValue = "1") Long pageNum,
+ @RequestParam(defaultValue = "10") Long pageSize) {
+ Page page = new Page<>(pageNum, pageSize);
+ Page result = dataScopeService.queryPageList(page, userId, orgType, orgId, status);
+ return ResponseResult.successData(result);
+ }
+
+ /**
+ * 新增数据填报权限
+ */
+// @Log(module = "数据填报权限", value = "新增数据填报权限")
+ @PostMapping("/add")
+ @Operation(summary = "新增数据填报权限")
+ public ResponseResult add(@RequestBody SysUserDataScope dataScope) {
+ boolean result = dataScopeService.addDataScope(dataScope);
+ return result ? ResponseResult.success("新增成功") : ResponseResult.error("新增失败");
+ }
+
+ /**
+ * 修改数据填报权限
+ */
+ @Log(module = "数据填报权限", value = "修改数据填报权限")
+ @PostMapping("/update")
+ @Operation(summary = "修改数据填报权限")
+ public ResponseResult update(@RequestBody SysUserDataScope dataScope) {
+ if (dataScope.getId() == null || dataScope.getId().isEmpty()) {
+ return ResponseResult.error("缺少权限ID");
+ }
+ boolean result = dataScopeService.updateDataScope(dataScope);
+ return result ? ResponseResult.success("修改成功") : ResponseResult.error("修改失败");
+ }
+
+ /**
+ * 删除数据填报权限
+ */
+ @Log(module = "数据填报权限", value = "删除数据填报权限")
+ @PostMapping("/delete")
+ @Operation(summary = "删除数据填报权限")
+ public ResponseResult delete(@RequestParam String id) {
+ boolean result = dataScopeService.deleteDataScope(id);
+ return result ? ResponseResult.success("删除成功") : ResponseResult.error("删除失败");
+ }
+
+ /**
+ * 批量删除数据填报权限
+ */
+ @Log(module = "数据填报权限", value = "批量删除数据填报权限")
+ @PostMapping("/batchDelete")
+ @Operation(summary = "批量删除数据填报权限")
+ public ResponseResult batchDelete(@RequestBody List ids) {
+ if (ids == null || ids.isEmpty()) {
+ return ResponseResult.error("请选择要删除的记录");
+ }
+ boolean result = dataScopeService.batchDeleteDataScope(ids);
+ return result ? ResponseResult.success("批量删除成功") : ResponseResult.error("批量删除失败");
+ }
+
+ /**
+ * 根据用户ID查询权限列表
+ */
+ @GetMapping("/getByUserId")
+ @Operation(summary = "根据用户ID查询权限列表")
+ public ResponseResult getByUserId(@RequestParam Long userId) {
+ List list = dataScopeService.getByUserId(userId);
+ return ResponseResult.successData(list);
+ }
+
+ /**
+ * 根据资源类型和资源编码查询
+ */
+ @GetMapping("/getByOrg")
+ @Operation(summary = "根据资源类型和资源编码查询")
+ public ResponseResult getByOrg(@RequestParam String orgType, @RequestParam String orgId) {
+ List list = dataScopeService.getByOrg(orgType, orgId);
+ return ResponseResult.successData(list);
+ }
+
+ /**
+ * 查询用户有效权限(状态=1且在有效期内的)
+ */
+ @GetMapping("/getValidPermissions")
+ @Operation(summary = "查询用户有效权限")
+ public ResponseResult getValidPermissions(@RequestParam String userId) {
+ List list = dataScopeService.getValidPermissions(userId);
+ return ResponseResult.successData(list);
+ }
+}
diff --git a/backend/src/main/java/com/yfd/platform/data/domain/SysUserDataScope.java b/backend/src/main/java/com/yfd/platform/data/domain/SysUserDataScope.java
new file mode 100644
index 0000000..601c4a5
--- /dev/null
+++ b/backend/src/main/java/com/yfd/platform/data/domain/SysUserDataScope.java
@@ -0,0 +1,118 @@
+package com.yfd.platform.data.domain;
+
+import com.baomidou.mybatisplus.annotation.*;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.io.Serializable;
+import java.sql.Timestamp;
+import java.util.Date;
+
+/**
+ *
+ * 数据填报用户权限关系表
+ *
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@TableName("SYS_USER_DATA_SCOPE")
+public class SysUserDataScope implements Serializable {
+
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * 主键
+ */
+ @TableId(type = IdType.ASSIGN_UUID)
+ private String id;
+
+ /**
+ * 用户ID
+ */
+ private String userId;
+
+ /**
+ * 资源类型(BASIN/BASE/STATION)
+ */
+ private String orgType;
+
+ /**
+ * 资源编码(流域编码/基地编码/电站编码)
+ */
+ private String orgId;
+
+ /**
+ * 上级资源编码(可选,用于层级追溯)
+ */
+ private String parentId;
+
+ /**
+ * 所属站层级,默认空,后续使用
+ */
+ private Long orgLevel;
+
+ /**
+ * 所属站全路径(B001/BASE01/ST01),默认空,后续使用
+ */
+ private String path;
+
+ /**
+ * 权限类型(READ/WRITE/ADMIN等),默认READ
+ */
+ private String permissionType;
+
+ /**
+ * 角色标识(可选,如调度员/管理员),默认空,后续使用
+ */
+ private String roleCode;
+
+ /**
+ * 数据范围(ALL/SELF/CUSTOM),默认ALL,后续使用
+ */
+ private String dataScope;
+
+ /**
+ * 状态(1有效 0无效)默认有效
+ */
+ private Integer status;
+
+ /**
+ * 生效时间
+ */
+ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+ private Date startTime;
+
+ /**
+ * 失效时间
+ */
+ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+ private Date endTime;
+
+ /**
+ * 创建时间
+ */
+ @TableField(fill = FieldFill.INSERT)
+ private Date createdAt;
+
+ /**
+ * 创建人
+ */
+ private String createdBy;
+
+ /**
+ * 更新时间
+ */
+ @TableField(fill = FieldFill.INSERT_UPDATE)
+ private Date updatedAt;
+
+ /**
+ * 更新人
+ */
+ private String updatedBy;
+
+ /**
+ * 备注
+ */
+ private String remark;
+}
diff --git a/backend/src/main/java/com/yfd/platform/data/mapper/SysUserDataScopeMapper.java b/backend/src/main/java/com/yfd/platform/data/mapper/SysUserDataScopeMapper.java
new file mode 100644
index 0000000..525fba4
--- /dev/null
+++ b/backend/src/main/java/com/yfd/platform/data/mapper/SysUserDataScopeMapper.java
@@ -0,0 +1,46 @@
+package com.yfd.platform.data.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.yfd.platform.data.domain.SysUserDataScope;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ *
+ * 数据填报用户权限关系表 Mapper 接口
+ *
+ */
+public interface SysUserDataScopeMapper extends BaseMapper {
+
+ /**
+ * 分页查询数据填报权限
+ */
+ Page selectPageList(Page page,
+ @Param("userId") Long userId,
+ @Param("orgType") String orgType,
+ @Param("orgId") String orgId,
+ @Param("status") Integer status);
+
+ /**
+ * 根据用户ID查询权限列表
+ */
+ List selectByUserId(@Param("userId") Long userId);
+
+ /**
+ * 根据资源类型和资源编码查询
+ */
+ List selectByOrg(@Param("orgType") String orgType, @Param("orgId") String orgId);
+
+ /**
+ * 批量删除
+ */
+ int batchDelete(@Param("ids") List ids);
+
+ /**
+ * 查询有效权限(状态=1且在有效期内的)
+ */
+ List selectValidPermissions(@Param("userId") Long userId);
+}
diff --git a/backend/src/main/java/com/yfd/platform/data/service/ISysUserDataScopeService.java b/backend/src/main/java/com/yfd/platform/data/service/ISysUserDataScopeService.java
new file mode 100644
index 0000000..92a2393
--- /dev/null
+++ b/backend/src/main/java/com/yfd/platform/data/service/ISysUserDataScopeService.java
@@ -0,0 +1,55 @@
+package com.yfd.platform.data.service;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.yfd.platform.data.domain.SysUserDataScope;
+
+import java.util.List;
+
+/**
+ *
+ * 数据填报用户权限关系表 服务类
+ *
+ */
+public interface ISysUserDataScopeService extends IService {
+
+ /**
+ * 分页查询数据填报权限
+ */
+ Page queryPageList(Page page, String userId, String orgType, String orgId, Integer status);
+
+ /**
+ * 新增数据填报权限
+ */
+ boolean addDataScope(SysUserDataScope dataScope);
+
+ /**
+ * 修改数据填报权限
+ */
+ boolean updateDataScope(SysUserDataScope dataScope);
+
+ /**
+ * 删除数据填报权限
+ */
+ boolean deleteDataScope(String id);
+
+ /**
+ * 批量删除数据填报权限
+ */
+ boolean batchDeleteDataScope(List ids);
+
+ /**
+ * 根据用户ID查询权限列表
+ */
+ List getByUserId(Long userId);
+
+ /**
+ * 根据资源类型和资源编码查询
+ */
+ List getByOrg(String orgType, String orgId);
+
+ /**
+ * 查询用户有效权限(状态=1且在有效期内的)
+ */
+ List getValidPermissions(String userId);
+}
diff --git a/backend/src/main/java/com/yfd/platform/data/service/impl/SysUserDataScopeServiceImpl.java b/backend/src/main/java/com/yfd/platform/data/service/impl/SysUserDataScopeServiceImpl.java
new file mode 100644
index 0000000..3dd6828
--- /dev/null
+++ b/backend/src/main/java/com/yfd/platform/data/service/impl/SysUserDataScopeServiceImpl.java
@@ -0,0 +1,76 @@
+package com.yfd.platform.data.service.impl;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.yfd.platform.data.domain.SysUserDataScope;
+import com.yfd.platform.data.mapper.SysUserDataScopeMapper;
+import com.yfd.platform.data.service.ISysUserDataScopeService;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+/**
+ *
+ * 数据填报用户权限关系表 服务实现类
+ *
+ */
+@Service
+public class SysUserDataScopeServiceImpl extends ServiceImpl implements ISysUserDataScopeService {
+
+ @Override
+ public Page queryPageList(Page page, String userId, String orgType, String orgId, Integer status) {
+ return this.page(page, this.lambdaQuery()
+ .eq(userId != null, SysUserDataScope::getUserId, userId)
+ .eq(orgType != null && !orgType.isEmpty(), SysUserDataScope::getOrgType, orgType)
+ .eq(orgId != null && !orgId.isEmpty(), SysUserDataScope::getOrgId, orgId)
+ .eq(status != null, SysUserDataScope::getStatus, status)
+ .orderByDesc(SysUserDataScope::getCreatedAt)
+ .getWrapper());
+ }
+
+ @Override
+ public boolean addDataScope(SysUserDataScope dataScope) {
+ return this.save(dataScope);
+ }
+
+ @Override
+ public boolean updateDataScope(SysUserDataScope dataScope) {
+ return this.updateById(dataScope);
+ }
+
+ @Override
+ public boolean deleteDataScope(String id) {
+ return this.removeById(id);
+ }
+
+ @Override
+ public boolean batchDeleteDataScope(List ids) {
+ return this.removeByIds(ids);
+ }
+
+ @Override
+ public List getByUserId(Long userId) {
+ return this.lambdaQuery()
+ .eq(SysUserDataScope::getUserId, userId)
+ .orderByDesc(SysUserDataScope::getCreatedAt)
+ .list();
+ }
+
+ @Override
+ public List getByOrg(String orgType, String orgId) {
+ return this.lambdaQuery()
+ .eq(SysUserDataScope::getOrgType, orgType)
+ .eq(SysUserDataScope::getOrgId, orgId)
+ .orderByDesc(SysUserDataScope::getCreatedAt)
+ .list();
+ }
+
+ @Override
+ public List getValidPermissions(String userId) {
+ return this.lambdaQuery()
+ .eq(SysUserDataScope::getUserId, userId)
+ .eq(SysUserDataScope::getStatus, 1)
+ .orderByDesc(SysUserDataScope::getCreatedAt)
+ .list();
+ }
+}
diff --git a/backend/src/main/java/com/yfd/platform/eng/service/impl/EngEqIntervalServiceImpl.java b/backend/src/main/java/com/yfd/platform/eng/service/impl/EngEqIntervalServiceImpl.java
index 992bf23..d851bc6 100644
--- a/backend/src/main/java/com/yfd/platform/eng/service/impl/EngEqIntervalServiceImpl.java
+++ b/backend/src/main/java/com/yfd/platform/eng/service/impl/EngEqIntervalServiceImpl.java
@@ -82,7 +82,8 @@ public class EngEqIntervalServiceImpl implements EngEqIntervalService {
dataSourceResult.setData(list);
return dataSourceResult;
}
- List