package jnpf.dmsService; import jnpf.audit.sdk.annotation.AuditLog; import jnpf.dmsMapper.DmsApprovedBatchMapper; import jnpf.dmsMapper.DmsApprovedDisableMapper; import jnpf.dmsEntity.storage.approval.DmsDisableRequest; import org.springframework.beans.factory.annotation.Value; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.scheduling.annotation.EnableScheduling; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Service; import java.util.List; @Slf4j @Service @EnableScheduling @RequiredArgsConstructor @ConditionalOnProperty(name = "dms.approved-files.effective-job.enabled", havingValue = "true", matchIfMissing = true) public class DmsApprovedFileEffectiveJob { private static final int DISCOVERY_PAGE_SIZE = 100; private final DmsApprovedBatchMapper receipts; private final DmsApprovedFileRetryService retry; private final DmsApprovedDisableMapper disables; private final DmsApprovedDisableService disableService; @Value("${dms.approved-disable.enabled:false}") private boolean disableEnabled; @Value("${dms.approved-files.retry-backoff-enabled:true}") private boolean retryBackoffEnabled = true; @Scheduled(cron = "${dms.approved-files.effective-job.cron:0 * * * * ?}") @AuditLog(action = "DMS_APPROVED_FILES_DUE", bizCodeExpr = "''", recordSuccess = false) public void activateDue() { receipts.discover(); if (disableEnabled) { discoverDisables(); } for (jnpf.dmsEntity.storage.approval.DmsApprovedBatch receipt : receipts.retryCandidates(disableEnabled, retryBackoffEnabled)) { try { retry.process(receipt); } catch (RuntimeException error) { log.error("批准文件本次处理失败,后续按登记进度自动重试 tenant={} batch={}", receipt.getTenantId(), receipt.getId(), error); } } } private void discoverDisables() { DmsDisableRequest after = null; while (true) { List page = disables.approvedApplications(after, DISCOVERY_PAGE_SIZE); for (DmsDisableRequest source : page) { try { disableService.enqueue(source.getTenantId(), source.getFlowId(), source.getTaskId(), source.getOperation()); } catch (RuntimeException error) { log.error("停用申请接收失败 tenant={} task={} application={}", source.getTenantId(), source.getTaskId(), source.getApplicationId(), error); } } if (page.size() < DISCOVERY_PAGE_SIZE) return; // Advance past failures too. OFFSET would skip rows as successful enqueues leave the query. after = page.get(page.size() - 1); } } }