diff --git a/backend/src/main/java/com/yfd/platform/data/controller/FishDraftDataController.java b/backend/src/main/java/com/yfd/platform/data/controller/FishDraftDataController.java index 318650e..6415ee3 100644 --- a/backend/src/main/java/com/yfd/platform/data/controller/FishDraftDataController.java +++ b/backend/src/main/java/com/yfd/platform/data/controller/FishDraftDataController.java @@ -15,6 +15,7 @@ import java.util.Map; import java.util.concurrent.CompletableFuture; import cn.hutool.core.io.FileUtil; +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; @@ -35,6 +36,8 @@ import jakarta.annotation.Resource; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; import org.springframework.security.core.context.SecurityContext; import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.transaction.annotation.Transactional; @@ -71,6 +74,9 @@ public class FishDraftDataController { @Resource private AttachmentUploadService attachmentUploadService; + @Autowired + private ThreadPoolTaskExecutor taskExecutor; + @PostMapping("/page") @Operation(summary = "分页查询过鱼数据(关联电站和设施)") public ResponseResult queryPageList(@RequestBody DataSourceRequest dataSourceRequest) { @@ -232,6 +238,41 @@ public class FishDraftDataController { @Operation(summary = "批量删除草稿(软删除)") public ResponseResult batchRemoveDraft(@RequestBody List ids) { boolean result = fishDraftDataService.batchRemoveDraft(ids); + if(result){ + List list = fishDraftDataService.list(new LambdaQueryWrapper().in(FishDraftData::getId, ids).select(FishDraftData::getPicpth, FishDraftData::getVdpth, FishDraftData::getId)); + // 异步删除附件 + CompletableFuture.runAsync(() -> { + for (FishDraftData fishDraftData : list) { + String picpth = fishDraftData.getPicpth(); + String vdpth = fishDraftData.getVdpth(); + + try { + if (StrUtil.isNotBlank(picpth)) { + // 假设 picpth 是分号或逗号分隔的文件ID/路径 + List split = StrUtil.split(picpth, StrUtil.C_COMMA); + for (String fileId : split) { + if (StrUtil.isNotBlank(fileId)) { + attachmentUploadService.deleteFile(fileId.trim()); + } + } + } + if (StrUtil.isNotBlank(vdpth)) { + List split = StrUtil.split(vdpth, StrUtil.C_COMMA); + for (String fileId : split) { + if (StrUtil.isNotBlank(fileId)) { + attachmentUploadService.deleteFile(fileId.trim()); + } + } + } + } catch (Exception e) { + log.error("异步删除附件失败, dataId: {}", fishDraftData.getId(), e); + } + } + }, taskExecutor).exceptionally(ex -> { + log.error("异步删除任务执行异常", ex); + return null; + }); + } return result ? ResponseResult.success("删除成功") : ResponseResult.error("删除失败"); } diff --git a/backend/src/main/java/com/yfd/platform/data/service/impl/FishImportServiceImpl.java b/backend/src/main/java/com/yfd/platform/data/service/impl/FishImportServiceImpl.java index 2ee0827..0cfe76f 100644 --- a/backend/src/main/java/com/yfd/platform/data/service/impl/FishImportServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/data/service/impl/FishImportServiceImpl.java @@ -284,7 +284,7 @@ public class FishImportServiceImpl implements IFishImportService { data.setEnnm(cellValue.trim()); data.setRstcd(cellValue); } else { - String stcd = directStcdList.stream().filter(sdEngInfoBH -> sdEngInfoBH.getEnnm().equals(cellValue.trim())).map(SdEngInfoBH::getStcd).findFirst().get(); + String stcd = directStcdList.stream().filter(sdEngInfoBH -> sdEngInfoBH.getEnnm().equals(cellValue.trim())).map(SdEngInfoBH::getStcd).findFirst().orElse( null); if (StrUtil.isBlank(stcd)) { importRow.getWarnings().add("rstcd"); data.setEnnm(cellValue.trim()); @@ -329,7 +329,7 @@ public class FishImportServiceImpl implements IFishImportService { data.setHbrvcd(cellValue); data.setHbrvnm(cellValue); } else { - String hbrvcdCode = allowedHbrvcdList.stream().filter(sdHbrvDic -> sdHbrvDic.getHbrvnm().equals(cellValue.trim())).map(SdHbrvDic::getHbrvcd).findFirst().get(); + String hbrvcdCode = allowedHbrvcdList.stream().filter(sdHbrvDic -> sdHbrvDic.getHbrvnm().equals(cellValue.trim())).map(SdHbrvDic::getHbrvcd).findFirst().orElse( null); if (StrUtil.isBlank(hbrvcdCode)) { importRow.getWarnings().add("hbrvcd"); data.setHbrvcd(cellValue.trim()); @@ -510,7 +510,7 @@ public class FishImportServiceImpl implements IFishImportService { importRow.getWarnings().add("stcd"); data.setStcd(cellValue); } else { - String stcd = sdFpssList.stream().filter(sdFpssBH -> sdFpssBH.getStnm().equals(cellValue.trim())).map(SdFpssBH::getStcd).findFirst().get(); + String stcd = sdFpssList.stream().filter(sdFpssBH -> sdFpssBH.getStnm().equals(cellValue.trim())).map(SdFpssBH::getStcd).findFirst().orElse( null); if (StrUtil.isBlank(stcd)) { importRow.getWarnings().add("stcd"); data.setStcd(cellValue.trim()); diff --git a/backend/src/main/java/com/yfd/platform/data/service/impl/ImportTaskServiceImpl.java b/backend/src/main/java/com/yfd/platform/data/service/impl/ImportTaskServiceImpl.java index c8cb5f6..1ffcd3b 100644 --- a/backend/src/main/java/com/yfd/platform/data/service/impl/ImportTaskServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/data/service/impl/ImportTaskServiceImpl.java @@ -164,7 +164,7 @@ public class ImportTaskServiceImpl extends ServiceImpl().eq(ImportTask::getId, taskId).select(ImportTask::getId,ImportTask::getStatus, ImportTask::getTempDir)); if (importTask == null) { return false; } @@ -176,9 +176,10 @@ public class ImportTaskServiceImpl extends ServiceImpl selectForDropdown(SdEngInfoBHRequest sdEngInfoBHRequest) { - String userId = SecurityUtils.getUserId(); - String currentUsername = SecurityUtils.getCurrentUsername(); - - // 管理员直接查询 - if ("admin".equals(currentUsername)) { - return queryEngInfoList(sdEngInfoBHRequest, null, null); - } - - // 获取用户权限范围 - List sysUserDataScopes = sysUserDataScopeMapper.selectList( - new LambdaQueryWrapper() - .eq(SysUserDataScope::getUserId, userId) - .select(SysUserDataScope::getOrgId, SysUserDataScope::getOrgType) - ); - - if (sysUserDataScopes == null || sysUserDataScopes.isEmpty()) { - return new ArrayList<>(); - } - - // 分类权限类型 - Set stationCodes = new HashSet<>(); - Set basinCodes = new HashSet<>(); - - for (SysUserDataScope scope : sysUserDataScopes) { - String orgType = scope.getOrgType(); - String orgId = scope.getOrgId(); - - if ("STATION".equals(orgType)) { - stationCodes.add(orgId); - } else if ("HBRVCD".equals(orgType)) { - basinCodes.add(orgId); - } - } - - // 如果有具体站点权限且数量较少,直接使用 IN - if (!stationCodes.isEmpty() && stationCodes.size() <= 100) { - return queryEngInfoList(sdEngInfoBHRequest, stationCodes, null); - } - - // 如果只有流域权限或站点数量过多,使用流域过滤 - if (!basinCodes.isEmpty()) { - return queryEngInfoList(sdEngInfoBHRequest, null, basinCodes); - } - - // 站点数量过多但没有流域信息,分批查询 - if (!stationCodes.isEmpty()) { - return queryEngInfoByBatches(sdEngInfoBHRequest, stationCodes); - } - - return new ArrayList<>(); - } - - /** - * 查询工程信息列表 - */ - private List queryEngInfoList(SdEngInfoBHRequest request, - Set stationCodes, - Set basinCodes) { - LambdaQueryWrapper wrapper = buildQueryWrapper(request); - - // 添加权限过滤 - if (stationCodes != null && !stationCodes.isEmpty()) { - wrapper.in(SdEngInfoBH::getStcd, stationCodes); - } else if (basinCodes != null && !basinCodes.isEmpty()) { - wrapper.in(SdEngInfoBH::getHbrvcd, basinCodes); - } - - return this.list(wrapper); - } - - /** - * 分批查询(当站点数量过多时) - */ - private List queryEngInfoByBatches(SdEngInfoBHRequest request, Set stationCodes) { - List result = new ArrayList<>(); - int batchSize = 100; // 每批最多 100 个站点 - - List stationList = new ArrayList<>(stationCodes); - for (int i = 0; i < stationList.size(); i += batchSize) { - int end = Math.min(i + batchSize, stationList.size()); - List batch = stationList.subList(i, end); - - LambdaQueryWrapper wrapper = buildQueryWrapper(request); - wrapper.in(SdEngInfoBH::getStcd, batch); - - List batchResult = this.list(wrapper); - if (batchResult != null && !batchResult.isEmpty()) { - result.addAll(batchResult); - } - } - - return result; - } - - /** - * 构建查询条件 - */ - private LambdaQueryWrapper buildQueryWrapper(SdEngInfoBHRequest request) { - String baseId = request.getBaseId(); - String hbrvcd = request.getHbrvcd(); - String ennm = request.getEnnm(); - List rvcds = request.getRvcds(); - List hbrvcds = request.getHbrvcds(); - + String baseId = sdEngInfoBHRequest.getBaseId(); + String hbrvcd = sdEngInfoBHRequest.getHbrvcd(); + String ennm = sdEngInfoBHRequest.getEnnm(); + List rvcds = sdEngInfoBHRequest.getRvcds(); + List hbrvcds = sdEngInfoBHRequest.getHbrvcds(); LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); wrapper.eq(StringUtils.hasText(baseId), SdEngInfoBH::getBaseId, baseId) .eq(StringUtils.hasText(hbrvcd), SdEngInfoBH::getHbrvcd, hbrvcd) @@ -182,9 +83,19 @@ public class SdEngInfoBHServiceImpl extends ServiceImpl authorizedStations = getUserAuthorizedStationCodes(); + if (authorizedStations != null && !authorizedStations.isEmpty()) { + List list = this.list(wrapper); + return list.stream() + .filter(item -> authorizedStations.contains(item.getStcd())) + .collect(Collectors.toList()); + }else{ + return new ArrayList<>(); + } } - @Override public Set getUserAuthorizedStationCodes() { String userId = SecurityUtils.getUserId(); diff --git a/backend/src/main/java/com/yfd/platform/env/service/impl/SdFpssBHServiceImpl.java b/backend/src/main/java/com/yfd/platform/env/service/impl/SdFpssBHServiceImpl.java index 036578e..d620898 100644 --- a/backend/src/main/java/com/yfd/platform/env/service/impl/SdFpssBHServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/env/service/impl/SdFpssBHServiceImpl.java @@ -67,28 +67,42 @@ public class SdFpssBHServiceImpl extends ServiceImpl i @Override public List selectForDropdown(String rstcd, String stnm, String baseId) { + // 管理员直接查询,无需权限过滤 + if ("admin".equals(SecurityUtils.getCurrentUsername())) { + return queryFpssList(rstcd, stnm, baseId); + } + + // 获取用户有权限的工程编码 Set authorizedStations = getUserAuthorizedStationCodes(); - List result; - - if (StringUtils.hasText(baseId)) { - result = baseMapper.selectForDropdownWithBaseId(rstcd, stnm, baseId); - } else { - LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - wrapper.eq(StringUtils.hasText(rstcd), SdFpssBH::getRstcd, rstcd) - .like(StringUtils.hasText(stnm), SdFpssBH::getStnm, stnm) - .orderByDesc(SdFpssBH::getOrderIndex); - result = list(wrapper); - } - if (authorizedStations.isEmpty()&&"admin".equals(SecurityUtils.getCurrentUsername())) { - return result; + // 无权限直接返回空列表 + if (authorizedStations == null || authorizedStations.isEmpty()) { + return new ArrayList<>(); } + // 查询数据 + List result = queryFpssList(rstcd, stnm, baseId); + + // 权限过滤 return result.stream() - .filter(fpss -> authorizedStations.contains(fpss.getRstcd())) + .filter(fpss -> fpss.getRstcd() != null && authorizedStations.contains(fpss.getRstcd())) .collect(Collectors.toList()); } + /** + * 查询过鱼设施列表(公共方法) + */ + private List queryFpssList(String rstcd, String stnm, String baseId) { + if (StringUtils.hasText(baseId)) { + return baseMapper.selectForDropdownWithBaseId(rstcd, stnm, baseId); + } else { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(StringUtils.hasText(rstcd), SdFpssBH::getRstcd, rstcd) + .like(StringUtils.hasText(stnm), SdFpssBH::getStnm, stnm) + .orderByDesc(SdFpssBH::getOrderIndex); + return list(wrapper); + } + } @Override public Set getUserAuthorizedStationCodes() { String userId = SecurityUtils.getUserId(); diff --git a/backend/src/main/java/com/yfd/platform/env/service/impl/SdHbrvDicServiceImpl.java b/backend/src/main/java/com/yfd/platform/env/service/impl/SdHbrvDicServiceImpl.java index da19175..90ea0e9 100644 --- a/backend/src/main/java/com/yfd/platform/env/service/impl/SdHbrvDicServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/env/service/impl/SdHbrvDicServiceImpl.java @@ -92,8 +92,16 @@ public class SdHbrvDicServiceImpl extends ServiceImpl selectForDropdown(String hbrvnm, String baseid) { - Set authorizedStations = getUserAuthorizedStationCodes(); + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.like(hbrvnm != null && !hbrvnm.isEmpty(), SdHbrvDic::getHbrvnm, hbrvnm) + .eq(baseid != null && !baseid.isEmpty(), SdHbrvDic::getBaseid, baseid) + .eq(SdHbrvDic::getEnabled, 1) + .orderByAsc(SdHbrvDic::getOrderIndex); + if("admin".equals(SecurityUtils.getCurrentUsername())){ + return this.list(wrapper); + } + Set authorizedStations = getUserAuthorizedStationCodes(); if (authorizedStations != null && !authorizedStations.isEmpty()) { List engInfos = engInfoBHMapper.selectList( new LambdaQueryWrapper() @@ -104,21 +112,19 @@ public class SdHbrvDicServiceImpl extends ServiceImpl id != null && !id.isEmpty()) .distinct() - .collect(Collectors.toList()); + .toList(); if (!hbrvcds.isEmpty()) { - wrapper.in(SdHbrvDic::getHbrvcd, hbrvcds); + List list = this.list(wrapper); + return list.stream() + .filter(hbrvDic -> hbrvcds.contains(hbrvDic.getHbrvcd())) + .collect(Collectors.toList()); } else { return new ArrayList<>(); } - }else if (!"admin".equals(SecurityUtils.getCurrentUsername())){ + }else { return new ArrayList<>(); } - wrapper.like(hbrvnm != null && !hbrvnm.isEmpty(), SdHbrvDic::getHbrvnm, hbrvnm) - .eq(baseid != null && !baseid.isEmpty(), SdHbrvDic::getBaseid, baseid) - .eq(SdHbrvDic::getEnabled, 1) - .orderByAsc(SdHbrvDic::getOrderIndex); - return this.list(wrapper); } @Override