fix: 优化逻辑
This commit is contained in:
parent
645b97435c
commit
a7e4cd8c0d
@ -35,6 +35,9 @@ import jakarta.annotation.Resource;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
import org.springframework.transaction.TransactionDefinition;
|
||||
import org.springframework.transaction.PlatformTransactionManager;
|
||||
import org.springframework.transaction.support.TransactionTemplate;
|
||||
|
||||
import java.util.*;
|
||||
|
||||
@ -86,6 +89,9 @@ public class FishDraftDataServiceImpl extends ServiceImpl<FishDraftDataMapper, F
|
||||
@Resource
|
||||
private ISdFpssRService sdFpssRService;
|
||||
|
||||
@Resource
|
||||
private PlatformTransactionManager transactionManager;
|
||||
|
||||
@Override
|
||||
public Page<FishDraftDataVO> queryPageList(DataSourceRequest dataSourceRequest) {
|
||||
Page<FishDraftDataVO> page = KendoUtil.getPage(dataSourceRequest);
|
||||
@ -295,12 +301,13 @@ public class FishDraftDataServiceImpl extends ServiceImpl<FishDraftDataMapper, F
|
||||
}
|
||||
|
||||
@Override
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
public boolean submitDrafts(List<String> ids) {
|
||||
if (ids == null || ids.isEmpty()) {
|
||||
return false;
|
||||
}
|
||||
String operatorId = SecurityUtils.getUserId();
|
||||
Map<String, String> originalStatusMap = new HashMap<>();
|
||||
List<String> succeededIds = new ArrayList<>();
|
||||
|
||||
ApprovalMain approvalMain = new ApprovalMain();
|
||||
approvalMain.setApprovalNo("APR" + System.currentTimeMillis());
|
||||
@ -311,19 +318,46 @@ public class FishDraftDataServiceImpl extends ServiceImpl<FishDraftDataMapper, F
|
||||
approvalMain.setStatus("PENDING");
|
||||
// 查询当前人的数据权限
|
||||
setUserDataScope(approvalMain);
|
||||
try {
|
||||
executeInNewTransaction(() -> {
|
||||
approvalMainService.save(approvalMain);
|
||||
return true;
|
||||
});
|
||||
|
||||
List<String> unlockedIds = listIdsByLockFlag(ids, 0);
|
||||
List<FishDraftData> unlockedDrafts = listDraftsByIdsAndLockFlag(ids, 0);
|
||||
for (FishDraftData draft : unlockedDrafts) {
|
||||
originalStatusMap.put(draft.getId(), draft.getStatus());
|
||||
}
|
||||
Date submitTime = new Date();
|
||||
updateByIdsInBatches(unlockedIds, entity -> {
|
||||
|
||||
for (List<FishDraftData> batchDrafts : splitList(unlockedDrafts, IN_QUERY_BATCH_SIZE)) {
|
||||
executeInNewTransaction(() -> {
|
||||
List<String> batchIds = new ArrayList<>();
|
||||
for (FishDraftData batchDraft : batchDrafts) {
|
||||
batchIds.add(batchDraft.getId());
|
||||
}
|
||||
updateByIdsBatch(batchIds, entity -> {
|
||||
entity.setApprovalId(approvalMain.getId());
|
||||
entity.setStatus("PENDING");
|
||||
entity.setSubmitTime(submitTime);
|
||||
});
|
||||
return true;
|
||||
});
|
||||
for (FishDraftData batchDraft : batchDrafts) {
|
||||
succeededIds.add(batchDraft.getId());
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
executeInNewTransaction(() -> {
|
||||
approvalLogService.logSubmit(approvalMain.getId(), operatorId, "批量提交草稿,共" + ids.size() + "条");
|
||||
return true;
|
||||
});
|
||||
return true;
|
||||
} catch (Exception e) {
|
||||
log.error("批量提交草稿失败", e);
|
||||
rollbackSubmittedDrafts(approvalMain.getId(), succeededIds, originalStatusMap, e);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
private void setUserDataScope(ApprovalMain approvalMain) {
|
||||
@ -413,7 +447,6 @@ public class FishDraftDataServiceImpl extends ServiceImpl<FishDraftDataMapper, F
|
||||
|
||||
|
||||
@Override
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
public boolean batchApprove(List<String> ids, String approveComment) {
|
||||
if (ids == null || ids.isEmpty()) {
|
||||
return false;
|
||||
@ -422,30 +455,41 @@ public class FishDraftDataServiceImpl extends ServiceImpl<FishDraftDataMapper, F
|
||||
String operatorId = SecurityUtils.getUserId();
|
||||
|
||||
List<FishDraftData> dataList = listByIdsInBatches(ids);
|
||||
Set<String> processedApprovalIds = new HashSet<>();
|
||||
List<String> validIds = new ArrayList<>();
|
||||
List<SdFpssR> fpssRList = new ArrayList<>();
|
||||
|
||||
Map<String, List<FishDraftData>> approvalDraftMap = new LinkedHashMap<>();
|
||||
for (FishDraftData fishDraftData : dataList) {
|
||||
if ("PENDING".equals(fishDraftData.getStatus())) {
|
||||
validIds.add(fishDraftData.getId());
|
||||
if (fishDraftData.getApprovalId() != null) {
|
||||
processedApprovalIds.add(fishDraftData.getApprovalId());
|
||||
}
|
||||
SdFpssR fpssR = convertToSdFpssR(fishDraftData, operatorId);
|
||||
fpssRList.add(fpssR);
|
||||
String approvalId = StrUtil.blankToDefault(fishDraftData.getApprovalId(), "__NO_APPROVAL__");
|
||||
approvalDraftMap.computeIfAbsent(approvalId, key -> new ArrayList<>()).add(fishDraftData);
|
||||
}
|
||||
}
|
||||
|
||||
if (!validIds.isEmpty()) {
|
||||
updateByIdsInBatches(validIds, entity -> {
|
||||
try {
|
||||
for (Map.Entry<String, List<FishDraftData>> entry : approvalDraftMap.entrySet()) {
|
||||
String approvalId = entry.getKey();
|
||||
List<FishDraftData> approvalDrafts = entry.getValue();
|
||||
for (List<FishDraftData> batchDrafts : splitList(approvalDrafts, IN_QUERY_BATCH_SIZE)) {
|
||||
executeInNewTransaction(() -> {
|
||||
List<String> batchIds = new ArrayList<>();
|
||||
List<SdFpssR> fpssRList = new ArrayList<>();
|
||||
for (FishDraftData batchDraft : batchDrafts) {
|
||||
batchIds.add(batchDraft.getId());
|
||||
fpssRList.add(convertToSdFpssR(batchDraft, operatorId));
|
||||
}
|
||||
updateByIdsBatch(batchIds, entity -> {
|
||||
entity.setStatus("APPROVED");
|
||||
entity.setApproveTime(now);
|
||||
entity.setUpdatedBy(operatorId);
|
||||
});
|
||||
boolean b = sdFpssRService.saveOrUpdateBatch(fpssRList);
|
||||
log.info("=======================插入数据条数======================="+fpssRList.size());
|
||||
for (String approvalId : processedApprovalIds) {
|
||||
boolean saved = sdFpssRService.saveOrUpdateBatch(fpssRList, IN_QUERY_BATCH_SIZE);
|
||||
if (!saved) {
|
||||
throw new RuntimeException("保存正式表失败");
|
||||
}
|
||||
log.info("=======================插入数据条数======================={}", fpssRList.size());
|
||||
return true;
|
||||
});
|
||||
}
|
||||
if (!"__NO_APPROVAL__".equals(approvalId)) {
|
||||
executeInNewTransaction(() -> {
|
||||
ApprovalMain approvalMain = approvalMainService.getById(approvalId);
|
||||
approvalLogService.logApprove(approvalId, SecurityUtils.getUserId(), approveComment);
|
||||
if (approvalMain != null) {
|
||||
@ -455,10 +499,15 @@ public class FishDraftDataServiceImpl extends ServiceImpl<FishDraftDataMapper, F
|
||||
approvalMain.setRemark(approveComment);
|
||||
approvalMainService.updateById(approvalMain);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
});
|
||||
}
|
||||
}
|
||||
return true;
|
||||
} catch (Exception e) {
|
||||
log.error("批量审批失败", e);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
private SdFpssR convertToSdFpssR(FishDraftData draft, String operatorId) {
|
||||
@ -536,7 +585,6 @@ public class FishDraftDataServiceImpl extends ServiceImpl<FishDraftDataMapper, F
|
||||
}
|
||||
|
||||
@Override
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
public boolean rejectBatch(List<String> ids, String rejectReason) {
|
||||
if (ids == null || ids.isEmpty()) {
|
||||
return false;
|
||||
@ -548,26 +596,34 @@ public class FishDraftDataServiceImpl extends ServiceImpl<FishDraftDataMapper, F
|
||||
String operatorId = SecurityUtils.getUserId();
|
||||
|
||||
List<FishDraftData> dataList = listByIdsInBatches(ids);
|
||||
Set<String> processedApprovalIds = new HashSet<>();
|
||||
List<String> validIds = new ArrayList<>();
|
||||
|
||||
Map<String, List<FishDraftData>> approvalDraftMap = new LinkedHashMap<>();
|
||||
for (FishDraftData fishDraftData : dataList) {
|
||||
if ("PENDING".equals(fishDraftData.getStatus())) {
|
||||
validIds.add(fishDraftData.getId());
|
||||
if (fishDraftData.getApprovalId() != null) {
|
||||
processedApprovalIds.add(fishDraftData.getApprovalId());
|
||||
}
|
||||
String approvalId = StrUtil.blankToDefault(fishDraftData.getApprovalId(), "__NO_APPROVAL__");
|
||||
approvalDraftMap.computeIfAbsent(approvalId, key -> new ArrayList<>()).add(fishDraftData);
|
||||
}
|
||||
}
|
||||
|
||||
if (!validIds.isEmpty()) {
|
||||
updateByIdsInBatches(validIds, entity -> {
|
||||
try {
|
||||
for (Map.Entry<String, List<FishDraftData>> entry : approvalDraftMap.entrySet()) {
|
||||
String approvalId = entry.getKey();
|
||||
List<FishDraftData> approvalDrafts = entry.getValue();
|
||||
for (List<FishDraftData> batchDrafts : splitList(approvalDrafts, IN_QUERY_BATCH_SIZE)) {
|
||||
executeInNewTransaction(() -> {
|
||||
List<String> batchIds = new ArrayList<>();
|
||||
for (FishDraftData batchDraft : batchDrafts) {
|
||||
batchIds.add(batchDraft.getId());
|
||||
}
|
||||
updateByIdsBatch(batchIds, entity -> {
|
||||
entity.setStatus("REJECTED");
|
||||
entity.setApproveTime(now);
|
||||
entity.setUpdatedBy(operatorId);
|
||||
});
|
||||
|
||||
for (String approvalId : processedApprovalIds) {
|
||||
return true;
|
||||
});
|
||||
}
|
||||
if (!"__NO_APPROVAL__".equals(approvalId)) {
|
||||
executeInNewTransaction(() -> {
|
||||
approvalLogService.logReject(approvalId, operatorId, rejectReason);
|
||||
ApprovalMain approvalMain = approvalMainService.getById(approvalId);
|
||||
if (approvalMain != null) {
|
||||
@ -577,10 +633,15 @@ public class FishDraftDataServiceImpl extends ServiceImpl<FishDraftDataMapper, F
|
||||
approvalMain.setRemark(rejectReason);
|
||||
approvalMainService.updateById(approvalMain);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
});
|
||||
}
|
||||
}
|
||||
return true;
|
||||
} catch (Exception e) {
|
||||
log.error("批量驳回失败", e);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
@ -720,6 +781,36 @@ public class FishDraftDataServiceImpl extends ServiceImpl<FishDraftDataMapper, F
|
||||
return result;
|
||||
}
|
||||
|
||||
private List<FishDraftData> listDraftsByIdsAndLockFlag(List<String> ids, Integer lockFlag) {
|
||||
List<String> normalizedIds = normalizeBatchValues(ids);
|
||||
if (normalizedIds.isEmpty()) {
|
||||
return Collections.emptyList();
|
||||
}
|
||||
List<FishDraftData> result = new ArrayList<>();
|
||||
for (List<String> batchIds : splitList(normalizedIds, IN_QUERY_BATCH_SIZE)) {
|
||||
result.addAll(this.list(new LambdaQueryWrapper<FishDraftData>()
|
||||
.in(FishDraftData::getId, batchIds)
|
||||
.eq(FishDraftData::getLockFlag, lockFlag)));
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
private boolean updateByIdsBatch(List<String> ids,
|
||||
java.util.function.Consumer<FishDraftData> entityCustomizer) {
|
||||
List<String> normalizedIds = normalizeBatchValues(ids);
|
||||
if (normalizedIds.isEmpty()) {
|
||||
return false;
|
||||
}
|
||||
List<FishDraftData> batchEntities = new ArrayList<>(normalizedIds.size());
|
||||
for (String batchId : normalizedIds) {
|
||||
FishDraftData entity = new FishDraftData();
|
||||
entity.setId(batchId);
|
||||
entityCustomizer.accept(entity);
|
||||
batchEntities.add(entity);
|
||||
}
|
||||
return this.updateBatchById(batchEntities, IN_QUERY_BATCH_SIZE);
|
||||
}
|
||||
|
||||
private boolean updateByIdsInBatches(List<String> ids,
|
||||
java.util.function.Consumer<FishDraftData> entityCustomizer) {
|
||||
List<String> normalizedIds = normalizeBatchValues(ids);
|
||||
@ -728,16 +819,40 @@ public class FishDraftDataServiceImpl extends ServiceImpl<FishDraftDataMapper, F
|
||||
}
|
||||
boolean updated = false;
|
||||
for (List<String> batchIds : splitList(normalizedIds, IN_QUERY_BATCH_SIZE)) {
|
||||
List<FishDraftData> batchEntities = new ArrayList<>(batchIds.size());
|
||||
updated = updateByIdsBatch(batchIds, entityCustomizer) || updated;
|
||||
}
|
||||
return updated;
|
||||
}
|
||||
|
||||
private void rollbackSubmittedDrafts(String approvalId,
|
||||
List<String> succeededIds,
|
||||
Map<String, String> originalStatusMap,
|
||||
Exception originalException) {
|
||||
try {
|
||||
for (List<String> batchIds : splitList(normalizeBatchValues(succeededIds), IN_QUERY_BATCH_SIZE)) {
|
||||
executeInNewTransaction(() -> {
|
||||
List<FishDraftData> rollbackEntities = new ArrayList<>();
|
||||
for (String batchId : batchIds) {
|
||||
FishDraftData entity = new FishDraftData();
|
||||
entity.setId(batchId);
|
||||
entityCustomizer.accept(entity);
|
||||
batchEntities.add(entity);
|
||||
entity.setApprovalId(null);
|
||||
entity.setSubmitTime(null);
|
||||
entity.setStatus(originalStatusMap.get(batchId));
|
||||
rollbackEntities.add(entity);
|
||||
}
|
||||
updated = this.updateBatchById(batchEntities, IN_QUERY_BATCH_SIZE) || updated;
|
||||
return this.updateBatchById(rollbackEntities, IN_QUERY_BATCH_SIZE);
|
||||
});
|
||||
}
|
||||
return updated;
|
||||
executeInNewTransaction(() -> approvalMainService.removeById(approvalId));
|
||||
} catch (Exception rollbackException) {
|
||||
log.error("批量提交草稿回退失败,原始异常: {}", originalException.getMessage(), rollbackException);
|
||||
}
|
||||
}
|
||||
|
||||
private <T> T executeInNewTransaction(java.util.function.Supplier<T> action) {
|
||||
TransactionTemplate transactionTemplate = new TransactionTemplate(transactionManager);
|
||||
transactionTemplate.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRES_NEW);
|
||||
return transactionTemplate.execute(status -> action.get());
|
||||
}
|
||||
|
||||
private List<String> normalizeBatchValues(List<String> values) {
|
||||
|
||||
@ -111,6 +111,19 @@ spring:
|
||||
mvc:
|
||||
pathmatch:
|
||||
matching-strategy: ant_path_matcher
|
||||
data:
|
||||
redis:
|
||||
host: "${REDIS_HOST:172.16.21.142}"
|
||||
port: "${REDIS_PORT:6379}"
|
||||
password: "${REDIS_PASSWORD:zny5678}"
|
||||
database: "${REDIS_DATABASE:15}"
|
||||
timeout: 10000ms
|
||||
lettuce:
|
||||
pool:
|
||||
max-active: 8
|
||||
max-idle: 8
|
||||
min-idle: 2
|
||||
max-wait: 10000ms
|
||||
servlet:
|
||||
multipart:
|
||||
max-file-size: 300MB
|
||||
|
||||
Loading…
Reference in New Issue
Block a user