From 645b97435c748d6b2ee19c9a214d3d5752e6f7e8 Mon Sep 17 00:00:00 2001 From: tangwei Date: Tue, 7 Jul 2026 16:15:49 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BC=98=E5=8C=96=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/FishDraftDataController.java | 51 ++++++- .../impl/FishDraftDataServiceImpl.java | 140 ++++++++++++++---- 2 files changed, 158 insertions(+), 33 deletions(-) diff --git a/backend/src/main/java/com/yfd/platform/qgc_data/controller/FishDraftDataController.java b/backend/src/main/java/com/yfd/platform/qgc_data/controller/FishDraftDataController.java index 4399f5e5..3534edde 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_data/controller/FishDraftDataController.java +++ b/backend/src/main/java/com/yfd/platform/qgc_data/controller/FishDraftDataController.java @@ -60,6 +60,8 @@ import java.util.*; @Slf4j public class FishDraftDataController { + private static final int IN_QUERY_BATCH_SIZE = 900; + @Resource private IFishDraftDataService fishDraftDataService; @@ -368,11 +370,10 @@ public class FishDraftDataController { @PostMapping("/batchApproveByApprovalId") @Operation(summary = "根据审批批次全部审批通过") public ResponseResult batchApproveByApprovalId(@RequestBody BatchApproveRequest request) { - if (request.getApprovalIds().isEmpty()) { + if (request.getApprovalIds() == null || request.getApprovalIds().isEmpty()) { return ResponseResult.error("请选择审批批次"); } - List draft = fishDraftDataService.list(new LambdaQueryWrapper().eq(FishDraftData::getDeletedFlag, 0).in(FishDraftData::getApprovalId, request.getApprovalIds()).eq(FishDraftData::getStatus, "PENDING").select(FishDraftData::getId)); - List ids = draft.stream().map(FishDraftData::getId).toList(); + List ids = listDraftIdsByApprovalIdsAndStatus(request.getApprovalIds(), "PENDING"); boolean result = fishDraftDataService.batchApprove(ids, request.getApproveComment()); return result ? ResponseResult.success("审批通过") : ResponseResult.error("审批失败"); } @@ -388,8 +389,7 @@ public class FishDraftDataController { @Operation(summary = "批量驳回") public ResponseResult batchRejectFull(@RequestBody BatchRejectRequest request) { if (request.getApprovalIds() != null && !request.getApprovalIds().isEmpty()) { - List draft = fishDraftDataService.list(new LambdaQueryWrapper().eq(FishDraftData::getDeletedFlag, 0).in(FishDraftData::getApprovalId, request.getApprovalIds()).eq(FishDraftData::getStatus, "PENDING").select(FishDraftData::getId)); - List ids = draft.stream().map(FishDraftData::getId).toList(); + List ids = listDraftIdsByApprovalIdsAndStatus(request.getApprovalIds(), "PENDING"); boolean result = fishDraftDataService.rejectBatch(ids, request.getRejectReason()); return result ? ResponseResult.success("驳回成功") : ResponseResult.error("驳回失败"); } @@ -429,6 +429,47 @@ public class FishDraftDataController { return result ? ResponseResult.success("修改成功") : ResponseResult.error("修改失败"); } + private List listDraftIdsByApprovalIdsAndStatus(List approvalIds, String status) { + List normalizedApprovalIds = normalizeBatchValues(approvalIds); + if (normalizedApprovalIds.isEmpty()) { + return Collections.emptyList(); + } + List ids = new ArrayList<>(); + for (List batchApprovalIds : splitList(normalizedApprovalIds, IN_QUERY_BATCH_SIZE)) { + List draft = fishDraftDataService.list(new LambdaQueryWrapper() + .eq(FishDraftData::getDeletedFlag, 0) + .in(FishDraftData::getApprovalId, batchApprovalIds) + .eq(FishDraftData::getStatus, status) + .select(FishDraftData::getId)); + ids.addAll(draft.stream().map(FishDraftData::getId).filter(StrUtil::isNotBlank).toList()); + } + return ids; + } + + private List normalizeBatchValues(List values) { + if (values == null || values.isEmpty()) { + return Collections.emptyList(); + } + LinkedHashSet normalized = new LinkedHashSet<>(); + for (String value : values) { + if (StrUtil.isNotBlank(value)) { + normalized.add(value.trim()); + } + } + return new ArrayList<>(normalized); + } + + private List> splitList(List source, int batchSize) { + if (source == null || source.isEmpty()) { + return Collections.emptyList(); + } + List> result = new ArrayList<>(); + for (int i = 0; i < source.size(); i += batchSize) { + result.add(source.subList(i, Math.min(source.size(), i + batchSize))); + } + return result; + } + @PostMapping("/delete") @Operation(summary = "删除过鱼数据") public ResponseResult delete(@RequestParam String id) { diff --git a/backend/src/main/java/com/yfd/platform/qgc_data/service/impl/FishDraftDataServiceImpl.java b/backend/src/main/java/com/yfd/platform/qgc_data/service/impl/FishDraftDataServiceImpl.java index 5a150f58..92fdd607 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_data/service/impl/FishDraftDataServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/qgc_data/service/impl/FishDraftDataServiceImpl.java @@ -2,7 +2,6 @@ package com.yfd.platform.qgc_data.service.impl; import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.yfd.platform.common.DataSourceLoadOptionsBase; @@ -48,6 +47,8 @@ import java.util.*; @Slf4j public class FishDraftDataServiceImpl extends ServiceImpl implements IFishDraftDataService { + private static final int IN_QUERY_BATCH_SIZE = 200; + @Resource private FishDraftDataMapper fishDraftDataMapper; @@ -254,16 +255,15 @@ public class FishDraftDataServiceImpl extends ServiceImpl ids) { - long count = this.count(new LambdaQueryWrapper().in(FishDraftData::getId, ids).eq(FishDraftData::getLockFlag, 1)); + long count = countByIdsAndLockFlag(ids, 1); if(count > 0){ return false; } - LambdaUpdateWrapper updateWrapper = new LambdaUpdateWrapper<>(); - updateWrapper.in(FishDraftData::getId, ids); - updateWrapper.set(FishDraftData::getDeletedFlag, 1); String userId = SecurityUtils.getUserId(); - updateWrapper.set(FishDraftData::getDeletedBy,userId ); - return this.update(updateWrapper); + return updateByIdsInBatches(ids, entity -> { + entity.setDeletedFlag(1); + entity.setDeletedBy(userId); + }); } @Override @@ -313,13 +313,13 @@ public class FishDraftDataServiceImpl extends ServiceImpl updateWrapper = new LambdaUpdateWrapper<>(); - updateWrapper.in(FishDraftData::getId, ids); - updateWrapper.eq(FishDraftData::getLockFlag, 0); - updateWrapper.set(FishDraftData::getApprovalId, approvalMain.getId()); - updateWrapper.set(FishDraftData::getStatus, "PENDING"); - updateWrapper.set(FishDraftData::getSubmitTime, new Date()); - this.update(updateWrapper); + List unlockedIds = listIdsByLockFlag(ids, 0); + Date submitTime = new Date(); + updateByIdsInBatches(unlockedIds, entity -> { + entity.setApprovalId(approvalMain.getId()); + entity.setStatus("PENDING"); + entity.setSubmitTime(submitTime); + }); approvalLogService.logSubmit(approvalMain.getId(), operatorId, "批量提交草稿,共" + ids.size() + "条"); @@ -421,7 +421,7 @@ public class FishDraftDataServiceImpl extends ServiceImpl dataList = this.listByIds(ids); + List dataList = listByIdsInBatches(ids); Set processedApprovalIds = new HashSet<>(); List validIds = new ArrayList<>(); List fpssRList = new ArrayList<>(); @@ -438,12 +438,11 @@ public class FishDraftDataServiceImpl extends ServiceImpl updateWrapper = new LambdaUpdateWrapper<>(); - updateWrapper.in(FishDraftData::getId, validIds); - updateWrapper.set(FishDraftData::getStatus, "APPROVED"); - updateWrapper.set(FishDraftData::getApproveTime, now); - updateWrapper.set(FishDraftData::getUpdatedBy, operatorId); - this.update(updateWrapper); + updateByIdsInBatches(validIds, entity -> { + entity.setStatus("APPROVED"); + entity.setApproveTime(now); + entity.setUpdatedBy(operatorId); + }); boolean b = sdFpssRService.saveOrUpdateBatch(fpssRList); log.info("=======================插入数据条数======================="+fpssRList.size()); for (String approvalId : processedApprovalIds) { @@ -548,7 +547,7 @@ public class FishDraftDataServiceImpl extends ServiceImpl dataList = this.listByIds(ids); + List dataList = listByIdsInBatches(ids); Set processedApprovalIds = new HashSet<>(); List validIds = new ArrayList<>(); @@ -562,12 +561,11 @@ public class FishDraftDataServiceImpl extends ServiceImpl updateWrapper = new LambdaUpdateWrapper<>(); - updateWrapper.in(FishDraftData::getId, validIds); - updateWrapper.set(FishDraftData::getStatus, "REJECTED"); - updateWrapper.set(FishDraftData::getApproveTime, now); - updateWrapper.set(FishDraftData::getUpdatedBy, operatorId); - this.update(updateWrapper); + updateByIdsInBatches(validIds, entity -> { + entity.setStatus("REJECTED"); + entity.setApproveTime(now); + entity.setUpdatedBy(operatorId); + }); for (String approvalId : processedApprovalIds) { approvalLogService.logReject(approvalId, operatorId, rejectReason); @@ -679,4 +677,90 @@ public class FishDraftDataServiceImpl extends ServiceImpl listByIdsInBatches(List ids) { + List normalizedIds = normalizeBatchValues(ids); + if (normalizedIds.isEmpty()) { + return new ArrayList<>(); + } + List result = new ArrayList<>(); + for (List batchIds : splitList(normalizedIds, IN_QUERY_BATCH_SIZE)) { + result.addAll(this.list(new LambdaQueryWrapper().in(FishDraftData::getId, batchIds))); + } + return result; + } + + private long countByIdsAndLockFlag(List ids, Integer lockFlag) { + List normalizedIds = normalizeBatchValues(ids); + if (normalizedIds.isEmpty()) { + return 0L; + } + long total = 0L; + for (List batchIds : splitList(normalizedIds, IN_QUERY_BATCH_SIZE)) { + total += this.count(new LambdaQueryWrapper() + .in(FishDraftData::getId, batchIds) + .eq(FishDraftData::getLockFlag, lockFlag)); + } + return total; + } + + private List listIdsByLockFlag(List ids, Integer lockFlag) { + List normalizedIds = normalizeBatchValues(ids); + if (normalizedIds.isEmpty()) { + return Collections.emptyList(); + } + List result = new ArrayList<>(); + for (List batchIds : splitList(normalizedIds, IN_QUERY_BATCH_SIZE)) { + List records = this.list(new LambdaQueryWrapper() + .select(FishDraftData::getId) + .in(FishDraftData::getId, batchIds) + .eq(FishDraftData::getLockFlag, lockFlag)); + result.addAll(records.stream().map(FishDraftData::getId).filter(StrUtil::isNotBlank).toList()); + } + return result; + } + + private boolean updateByIdsInBatches(List ids, + java.util.function.Consumer entityCustomizer) { + List normalizedIds = normalizeBatchValues(ids); + if (normalizedIds.isEmpty()) { + return false; + } + boolean updated = false; + for (List batchIds : splitList(normalizedIds, IN_QUERY_BATCH_SIZE)) { + List batchEntities = new ArrayList<>(batchIds.size()); + for (String batchId : batchIds) { + FishDraftData entity = new FishDraftData(); + entity.setId(batchId); + entityCustomizer.accept(entity); + batchEntities.add(entity); + } + updated = this.updateBatchById(batchEntities, IN_QUERY_BATCH_SIZE) || updated; + } + return updated; + } + + private List normalizeBatchValues(List values) { + if (values == null || values.isEmpty()) { + return Collections.emptyList(); + } + LinkedHashSet normalized = new LinkedHashSet<>(); + for (String value : values) { + if (StrUtil.isNotBlank(value)) { + normalized.add(value.trim()); + } + } + return new ArrayList<>(normalized); + } + + private List> splitList(List source, int batchSize) { + if (source == null || source.isEmpty()) { + return Collections.emptyList(); + } + List> result = new ArrayList<>(); + for (int i = 0; i < source.size(); i += batchSize) { + result.add(source.subList(i, Math.min(source.size(), i + batchSize))); + } + return result; + } }