fix: 优化逻辑
This commit is contained in:
parent
645b97435c
commit
a7e4cd8c0d
@ -35,6 +35,9 @@ import jakarta.annotation.Resource;
|
|||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
import org.springframework.transaction.annotation.Transactional;
|
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.*;
|
import java.util.*;
|
||||||
|
|
||||||
@ -86,6 +89,9 @@ public class FishDraftDataServiceImpl extends ServiceImpl<FishDraftDataMapper, F
|
|||||||
@Resource
|
@Resource
|
||||||
private ISdFpssRService sdFpssRService;
|
private ISdFpssRService sdFpssRService;
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
private PlatformTransactionManager transactionManager;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Page<FishDraftDataVO> queryPageList(DataSourceRequest dataSourceRequest) {
|
public Page<FishDraftDataVO> queryPageList(DataSourceRequest dataSourceRequest) {
|
||||||
Page<FishDraftDataVO> page = KendoUtil.getPage(dataSourceRequest);
|
Page<FishDraftDataVO> page = KendoUtil.getPage(dataSourceRequest);
|
||||||
@ -295,12 +301,13 @@ public class FishDraftDataServiceImpl extends ServiceImpl<FishDraftDataMapper, F
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@Transactional(rollbackFor = Exception.class)
|
|
||||||
public boolean submitDrafts(List<String> ids) {
|
public boolean submitDrafts(List<String> ids) {
|
||||||
if (ids == null || ids.isEmpty()) {
|
if (ids == null || ids.isEmpty()) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
String operatorId = SecurityUtils.getUserId();
|
String operatorId = SecurityUtils.getUserId();
|
||||||
|
Map<String, String> originalStatusMap = new HashMap<>();
|
||||||
|
List<String> succeededIds = new ArrayList<>();
|
||||||
|
|
||||||
ApprovalMain approvalMain = new ApprovalMain();
|
ApprovalMain approvalMain = new ApprovalMain();
|
||||||
approvalMain.setApprovalNo("APR" + System.currentTimeMillis());
|
approvalMain.setApprovalNo("APR" + System.currentTimeMillis());
|
||||||
@ -311,19 +318,46 @@ public class FishDraftDataServiceImpl extends ServiceImpl<FishDraftDataMapper, F
|
|||||||
approvalMain.setStatus("PENDING");
|
approvalMain.setStatus("PENDING");
|
||||||
// 查询当前人的数据权限
|
// 查询当前人的数据权限
|
||||||
setUserDataScope(approvalMain);
|
setUserDataScope(approvalMain);
|
||||||
approvalMainService.save(approvalMain);
|
try {
|
||||||
|
executeInNewTransaction(() -> {
|
||||||
|
approvalMainService.save(approvalMain);
|
||||||
|
return true;
|
||||||
|
});
|
||||||
|
|
||||||
List<String> unlockedIds = listIdsByLockFlag(ids, 0);
|
List<FishDraftData> unlockedDrafts = listDraftsByIdsAndLockFlag(ids, 0);
|
||||||
Date submitTime = new Date();
|
for (FishDraftData draft : unlockedDrafts) {
|
||||||
updateByIdsInBatches(unlockedIds, entity -> {
|
originalStatusMap.put(draft.getId(), draft.getStatus());
|
||||||
entity.setApprovalId(approvalMain.getId());
|
}
|
||||||
entity.setStatus("PENDING");
|
Date submitTime = new Date();
|
||||||
entity.setSubmitTime(submitTime);
|
|
||||||
});
|
|
||||||
|
|
||||||
|
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());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
approvalLogService.logSubmit(approvalMain.getId(), operatorId, "批量提交草稿,共" + ids.size() + "条");
|
executeInNewTransaction(() -> {
|
||||||
return true;
|
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) {
|
private void setUserDataScope(ApprovalMain approvalMain) {
|
||||||
@ -413,7 +447,6 @@ public class FishDraftDataServiceImpl extends ServiceImpl<FishDraftDataMapper, F
|
|||||||
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@Transactional(rollbackFor = Exception.class)
|
|
||||||
public boolean batchApprove(List<String> ids, String approveComment) {
|
public boolean batchApprove(List<String> ids, String approveComment) {
|
||||||
if (ids == null || ids.isEmpty()) {
|
if (ids == null || ids.isEmpty()) {
|
||||||
return false;
|
return false;
|
||||||
@ -422,43 +455,59 @@ public class FishDraftDataServiceImpl extends ServiceImpl<FishDraftDataMapper, F
|
|||||||
String operatorId = SecurityUtils.getUserId();
|
String operatorId = SecurityUtils.getUserId();
|
||||||
|
|
||||||
List<FishDraftData> dataList = listByIdsInBatches(ids);
|
List<FishDraftData> dataList = listByIdsInBatches(ids);
|
||||||
Set<String> processedApprovalIds = new HashSet<>();
|
Map<String, List<FishDraftData>> approvalDraftMap = new LinkedHashMap<>();
|
||||||
List<String> validIds = new ArrayList<>();
|
|
||||||
List<SdFpssR> fpssRList = new ArrayList<>();
|
|
||||||
|
|
||||||
for (FishDraftData fishDraftData : dataList) {
|
for (FishDraftData fishDraftData : dataList) {
|
||||||
if ("PENDING".equals(fishDraftData.getStatus())) {
|
if ("PENDING".equals(fishDraftData.getStatus())) {
|
||||||
validIds.add(fishDraftData.getId());
|
String approvalId = StrUtil.blankToDefault(fishDraftData.getApprovalId(), "__NO_APPROVAL__");
|
||||||
if (fishDraftData.getApprovalId() != null) {
|
approvalDraftMap.computeIfAbsent(approvalId, key -> new ArrayList<>()).add(fishDraftData);
|
||||||
processedApprovalIds.add(fishDraftData.getApprovalId());
|
|
||||||
}
|
|
||||||
SdFpssR fpssR = convertToSdFpssR(fishDraftData, operatorId);
|
|
||||||
fpssRList.add(fpssR);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!validIds.isEmpty()) {
|
try {
|
||||||
updateByIdsInBatches(validIds, entity -> {
|
for (Map.Entry<String, List<FishDraftData>> entry : approvalDraftMap.entrySet()) {
|
||||||
entity.setStatus("APPROVED");
|
String approvalId = entry.getKey();
|
||||||
entity.setApproveTime(now);
|
List<FishDraftData> approvalDrafts = entry.getValue();
|
||||||
entity.setUpdatedBy(operatorId);
|
for (List<FishDraftData> batchDrafts : splitList(approvalDrafts, IN_QUERY_BATCH_SIZE)) {
|
||||||
});
|
executeInNewTransaction(() -> {
|
||||||
boolean b = sdFpssRService.saveOrUpdateBatch(fpssRList);
|
List<String> batchIds = new ArrayList<>();
|
||||||
log.info("=======================插入数据条数======================="+fpssRList.size());
|
List<SdFpssR> fpssRList = new ArrayList<>();
|
||||||
for (String approvalId : processedApprovalIds) {
|
for (FishDraftData batchDraft : batchDrafts) {
|
||||||
ApprovalMain approvalMain = approvalMainService.getById(approvalId);
|
batchIds.add(batchDraft.getId());
|
||||||
approvalLogService.logApprove(approvalId, SecurityUtils.getUserId(), approveComment);
|
fpssRList.add(convertToSdFpssR(batchDraft, operatorId));
|
||||||
if (approvalMain != null) {
|
}
|
||||||
approvalMain.setStatus("APPROVED");
|
updateByIdsBatch(batchIds, entity -> {
|
||||||
approvalMain.setApproverId(operatorId);
|
entity.setStatus("APPROVED");
|
||||||
approvalMain.setApproveTime(now);
|
entity.setApproveTime(now);
|
||||||
approvalMain.setRemark(approveComment);
|
entity.setUpdatedBy(operatorId);
|
||||||
approvalMainService.updateById(approvalMain);
|
});
|
||||||
|
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) {
|
||||||
|
approvalMain.setStatus("APPROVED");
|
||||||
|
approvalMain.setApproverId(operatorId);
|
||||||
|
approvalMain.setApproveTime(now);
|
||||||
|
approvalMain.setRemark(approveComment);
|
||||||
|
approvalMainService.updateById(approvalMain);
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
return true;
|
||||||
|
} catch (Exception e) {
|
||||||
|
log.error("批量审批失败", e);
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private SdFpssR convertToSdFpssR(FishDraftData draft, String operatorId) {
|
private SdFpssR convertToSdFpssR(FishDraftData draft, String operatorId) {
|
||||||
@ -536,7 +585,6 @@ public class FishDraftDataServiceImpl extends ServiceImpl<FishDraftDataMapper, F
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@Transactional(rollbackFor = Exception.class)
|
|
||||||
public boolean rejectBatch(List<String> ids, String rejectReason) {
|
public boolean rejectBatch(List<String> ids, String rejectReason) {
|
||||||
if (ids == null || ids.isEmpty()) {
|
if (ids == null || ids.isEmpty()) {
|
||||||
return false;
|
return false;
|
||||||
@ -548,39 +596,52 @@ public class FishDraftDataServiceImpl extends ServiceImpl<FishDraftDataMapper, F
|
|||||||
String operatorId = SecurityUtils.getUserId();
|
String operatorId = SecurityUtils.getUserId();
|
||||||
|
|
||||||
List<FishDraftData> dataList = listByIdsInBatches(ids);
|
List<FishDraftData> dataList = listByIdsInBatches(ids);
|
||||||
Set<String> processedApprovalIds = new HashSet<>();
|
Map<String, List<FishDraftData>> approvalDraftMap = new LinkedHashMap<>();
|
||||||
List<String> validIds = new ArrayList<>();
|
|
||||||
|
|
||||||
for (FishDraftData fishDraftData : dataList) {
|
for (FishDraftData fishDraftData : dataList) {
|
||||||
if ("PENDING".equals(fishDraftData.getStatus())) {
|
if ("PENDING".equals(fishDraftData.getStatus())) {
|
||||||
validIds.add(fishDraftData.getId());
|
String approvalId = StrUtil.blankToDefault(fishDraftData.getApprovalId(), "__NO_APPROVAL__");
|
||||||
if (fishDraftData.getApprovalId() != null) {
|
approvalDraftMap.computeIfAbsent(approvalId, key -> new ArrayList<>()).add(fishDraftData);
|
||||||
processedApprovalIds.add(fishDraftData.getApprovalId());
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!validIds.isEmpty()) {
|
try {
|
||||||
updateByIdsInBatches(validIds, entity -> {
|
for (Map.Entry<String, List<FishDraftData>> entry : approvalDraftMap.entrySet()) {
|
||||||
entity.setStatus("REJECTED");
|
String approvalId = entry.getKey();
|
||||||
entity.setApproveTime(now);
|
List<FishDraftData> approvalDrafts = entry.getValue();
|
||||||
entity.setUpdatedBy(operatorId);
|
for (List<FishDraftData> batchDrafts : splitList(approvalDrafts, IN_QUERY_BATCH_SIZE)) {
|
||||||
});
|
executeInNewTransaction(() -> {
|
||||||
|
List<String> batchIds = new ArrayList<>();
|
||||||
for (String approvalId : processedApprovalIds) {
|
for (FishDraftData batchDraft : batchDrafts) {
|
||||||
approvalLogService.logReject(approvalId, operatorId, rejectReason);
|
batchIds.add(batchDraft.getId());
|
||||||
ApprovalMain approvalMain = approvalMainService.getById(approvalId);
|
}
|
||||||
if (approvalMain != null) {
|
updateByIdsBatch(batchIds, entity -> {
|
||||||
approvalMain.setStatus("REJECTED");
|
entity.setStatus("REJECTED");
|
||||||
approvalMain.setApproverId(operatorId);
|
entity.setApproveTime(now);
|
||||||
approvalMain.setApproveTime(now);
|
entity.setUpdatedBy(operatorId);
|
||||||
approvalMain.setRemark(rejectReason);
|
});
|
||||||
approvalMainService.updateById(approvalMain);
|
return true;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
if (!"__NO_APPROVAL__".equals(approvalId)) {
|
||||||
|
executeInNewTransaction(() -> {
|
||||||
|
approvalLogService.logReject(approvalId, operatorId, rejectReason);
|
||||||
|
ApprovalMain approvalMain = approvalMainService.getById(approvalId);
|
||||||
|
if (approvalMain != null) {
|
||||||
|
approvalMain.setStatus("REJECTED");
|
||||||
|
approvalMain.setApproverId(operatorId);
|
||||||
|
approvalMain.setApproveTime(now);
|
||||||
|
approvalMain.setRemark(rejectReason);
|
||||||
|
approvalMainService.updateById(approvalMain);
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
return true;
|
||||||
|
} catch (Exception e) {
|
||||||
|
log.error("批量驳回失败", e);
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -720,6 +781,36 @@ public class FishDraftDataServiceImpl extends ServiceImpl<FishDraftDataMapper, F
|
|||||||
return result;
|
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,
|
private boolean updateByIdsInBatches(List<String> ids,
|
||||||
java.util.function.Consumer<FishDraftData> entityCustomizer) {
|
java.util.function.Consumer<FishDraftData> entityCustomizer) {
|
||||||
List<String> normalizedIds = normalizeBatchValues(ids);
|
List<String> normalizedIds = normalizeBatchValues(ids);
|
||||||
@ -728,18 +819,42 @@ public class FishDraftDataServiceImpl extends ServiceImpl<FishDraftDataMapper, F
|
|||||||
}
|
}
|
||||||
boolean updated = false;
|
boolean updated = false;
|
||||||
for (List<String> batchIds : splitList(normalizedIds, IN_QUERY_BATCH_SIZE)) {
|
for (List<String> batchIds : splitList(normalizedIds, IN_QUERY_BATCH_SIZE)) {
|
||||||
List<FishDraftData> batchEntities = new ArrayList<>(batchIds.size());
|
updated = updateByIdsBatch(batchIds, entityCustomizer) || updated;
|
||||||
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;
|
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);
|
||||||
|
entity.setApprovalId(null);
|
||||||
|
entity.setSubmitTime(null);
|
||||||
|
entity.setStatus(originalStatusMap.get(batchId));
|
||||||
|
rollbackEntities.add(entity);
|
||||||
|
}
|
||||||
|
return this.updateBatchById(rollbackEntities, IN_QUERY_BATCH_SIZE);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
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) {
|
private List<String> normalizeBatchValues(List<String> values) {
|
||||||
if (values == null || values.isEmpty()) {
|
if (values == null || values.isEmpty()) {
|
||||||
return Collections.emptyList();
|
return Collections.emptyList();
|
||||||
|
|||||||
@ -111,6 +111,19 @@ spring:
|
|||||||
mvc:
|
mvc:
|
||||||
pathmatch:
|
pathmatch:
|
||||||
matching-strategy: ant_path_matcher
|
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:
|
servlet:
|
||||||
multipart:
|
multipart:
|
||||||
max-file-size: 300MB
|
max-file-size: 300MB
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user