Pārlūkot izejas kodu

并卷/重组异步执行异常处理

lvy 3 dienas atpakaļ
vecāks
revīzija
1d0dc0272e

+ 1 - 1
blade-service-api/blade-archive-api/src/main/java/org/springblade/archive/entity/ArchivesAuto.java

@@ -190,7 +190,7 @@ public class ArchivesAuto extends BaseEntity {
     @ApiModelProperty("颜色状态")
     private Integer colourStatus;
 
-    @ApiModelProperty("案卷操作(0:无,1:正在并卷,2:正在重组)")
+    @ApiModelProperty("案卷操作(0:无,1:正在并卷,2:正在重组,3:等待重组(拆卷完成后),-1:并卷失败,-2:重组失败)")
     private Integer actionType;
     //是否是影音
     public boolean isMedia() {

+ 3 - 3
blade-service/blade-archive/src/main/java/org/springblade/archive/controller/ArchivesAutoController.java

@@ -679,14 +679,14 @@ public class ArchivesAutoController extends BladeController {
 		if (archivesAutoList == null || archivesAutoList.isEmpty()) {
 			return;
 		}
-		List<ArchivesAuto> collect = archivesAutoList.stream().filter(item -> item.getActionType() != null && item.getActionType() != 0 && item.getActionType() != 3).collect(Collectors.toList());
+		List<ArchivesAuto> collect = archivesAutoList.stream().filter(item -> item.getActionType() != null && (item.getActionType() == 1 || item.getActionType() == 2)).collect(Collectors.toList());
 		if (!collect.isEmpty()) {
 			String names = collect.stream().map(ArchivesAuto::getName).collect(Collectors.joining(","));
 			throw  new ServiceException("【" + names + "】案卷正在重组或者并卷,请稍后在进行相关操作");
 		}
 		Set<Long> ids = archivesAutoList.stream().map(ArchivesAuto::getId).collect(Collectors.toSet());
 		boolean update = archivesAutoService.update(Wrappers.<ArchivesAuto>lambdaUpdate().set(ArchivesAuto::getActionType, type).in(ArchivesAuto::getId, ids)
-				.and(item -> item.in(ArchivesAuto::getActionType, 0,3).or().isNull(ArchivesAuto::getActionType)));
+				.and(item -> item.notIn(ArchivesAuto::getActionType, 1,2).or().isNull(ArchivesAuto::getActionType)));
 		if (!update) {
 			throw new ServiceException("操作失败,案卷可能正在重组或者并卷,请稍后在进行相关操作");
 		}
@@ -1294,7 +1294,7 @@ public class ArchivesAutoController extends BladeController {
 			}
 		}
 		// 修改标识
-		boolean update = archivesAutoService.update(Wrappers.<ArchivesAuto>lambdaUpdate().in(ArchivesAuto::getId, vo.getTargetId(), vo.getSourceId()).set(ArchivesAuto::getActionType, 3).last("and (action_type is null or action_type in (0,3))"));
+		boolean update = archivesAutoService.update(Wrappers.<ArchivesAuto>lambdaUpdate().in(ArchivesAuto::getId, vo.getTargetId(), vo.getSourceId()).set(ArchivesAuto::getActionType, 3).last("and (action_type is null or action_type not in (1,2))"));
 		if (!update) {
 			return R.fail("案卷【" + target.getName() + "】或【" + source.getName() + "】正在被其他用户操作,请稍后再试");
 		}

+ 72 - 15
blade-service/blade-archive/src/main/java/org/springblade/archive/service/impl/ArchivesAutoServiceImpl.java

@@ -55,6 +55,7 @@ import org.springblade.business.feign.TaskClient;
 import org.springblade.common.utils.CommonUtil;
 import org.springblade.common.utils.DeepSeekClient;
 import org.springblade.common.utils.SnowFlakeUtil;
+import org.springblade.common.utils.SystemUtils;
 import org.springblade.core.log.exception.ServiceException;
 import org.springblade.core.mp.base.BaseServiceImpl;
 import org.springblade.core.mp.support.Condition;
@@ -77,15 +78,18 @@ import org.springblade.system.entity.DictBiz;
 import org.springblade.system.feign.IDictBizClient;
 import org.springblade.system.user.entity.User;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.redis.core.StringRedisTemplate;
 import org.springframework.jdbc.core.BeanPropertyRowMapper;
 import org.springframework.jdbc.core.JdbcTemplate;
 import org.springframework.scheduling.annotation.Async;
+import org.springframework.scheduling.annotation.Scheduled;
 import org.springframework.stereotype.Service;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import org.springframework.transaction.annotation.Transactional;
 
 import org.springframework.web.multipart.MultipartFile;
 
+import javax.annotation.PostConstruct;
 import javax.annotation.Resource;
 import javax.servlet.http.HttpServletResponse;
 import java.io.*;
@@ -165,6 +169,8 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
 
 	private final ArchivesSortRuleService archivesSortRuleService;
 
+	private final StringRedisTemplate redisTemplate;
+
 
 	@Override
 	public IPage<ArchivesAutoVO> selectArchivesAutoPage(IPage<ArchivesAutoVO> page, ArchivesAutoVO archivesAuto) {
@@ -5178,15 +5184,30 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
 	@Async
 	public void reCreateArchiveAuto1(String ids) {
 		for (Long id : Func.toLongList(ids)) {
-			//先查出勾选的案卷
-			ArchivesAuto archivesAuto=this.getById(id);
-			//查出所有案卷文件
-			List<ArchiveFile>archiveFileList=archiveFileClient.getArchiveFileByArchiveIds(id+"");
-			//设置案卷页码和四要素
-			if (archiveFileList != null && !archiveFileList.isEmpty()) {
-				this.reCreateArchiveAuto(archivesAuto, archiveFileList);
+			try {
+				//先查出勾选的案卷
+				ArchivesAuto archivesAuto=this.getById(id);
+				if (archivesAuto == null || archivesAuto.getActionType() != 2) {
+					continue;
+				}
+				String value = redisTemplate.opsForValue().get("blade:archive:reCreateArchiveAuto1:" + archivesAuto.getId());
+				if (value != null) {
+					continue;
+				}
+				redisTemplate.opsForValue().set("blade:archive:reCreateArchiveAuto1:" + archivesAuto.getId(), "", 60 * 60 * 1000, TimeUnit.MILLISECONDS);
+				//查出所有案卷文件
+				List<ArchiveFile>archiveFileList=archiveFileClient.getArchiveFileByArchiveIds(id+"");
+				//设置案卷页码和四要素
+				if (archiveFileList != null && !archiveFileList.isEmpty()) {
+					this.reCreateArchiveAuto(archivesAuto, archiveFileList);
+				}
+				this.update(Wrappers.<ArchivesAuto>lambdaUpdate().set(ArchivesAuto::getActionType, 0).eq(ArchivesAuto::getId, id));
+			} catch (Exception e) {
+				log.error("案卷重组失败," + "案卷ID:" + id, e);
+				this.update(Wrappers.<ArchivesAuto>lambdaUpdate().set(ArchivesAuto::getActionType, -2).eq(ArchivesAuto::getId, id));
+			} finally {
+				redisTemplate.delete("blade:archive:reCreateArchiveAuto1:" + id);
 			}
-			this.update(Wrappers.<ArchivesAuto>lambdaUpdate().set(ArchivesAuto::getActionType, 0).eq(ArchivesAuto::getId, id));
 		}
 	}
 	@Override
@@ -5232,13 +5253,18 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
 			file.setArchiveSort(i++);
 			waitArchiveFiles.add(file);
 		}
-		archiveFileClient.updateArchiveFile(waitArchiveFiles);
-		archivesAuto.setName(name);
-		//删除其他案卷
-		archivesAutoList.remove(archivesAuto);
-		this.deleteLogic(archivesAutoList.stream().map(o->o.getId()).collect(Collectors.toList()));
-		this.reCreateArchiveAuto(archivesAuto, archiveFileList);
-		this.update(Wrappers.<ArchivesAuto>lambdaUpdate().set(ArchivesAuto::getActionType, 0).in(ArchivesAuto::getId, ids));
+		try {
+			archiveFileClient.updateArchiveFile(waitArchiveFiles);
+			archivesAuto.setName(name);
+			//删除其他案卷
+			archivesAutoList.remove(archivesAuto);
+			this.deleteLogic(archivesAutoList.stream().map(o->o.getId()).collect(Collectors.toList()));
+			this.reCreateArchiveAuto(archivesAuto, archiveFileList);
+			this.update(Wrappers.<ArchivesAuto>lambdaUpdate().set(ArchivesAuto::getActionType, 0).in(ArchivesAuto::getId, ids));
+		} catch (Exception e) {
+			log.error("案卷并卷失败," + "案卷Ids:" + ids, e);
+			this.update(Wrappers.<ArchivesAuto>lambdaUpdate().set(ArchivesAuto::getActionType, -1).in(ArchivesAuto::getId, ids));
+		}
 	}
 
 	/**
@@ -5324,6 +5350,37 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
 				.mapToInt(file -> file.getFilePage() != null ? file.getFilePage() : 0)
 				.sum();
 	}
+
+	@Scheduled(fixedDelay = 1000 * 60 * 10)
+	public void reCreateArchiveAuto() {
+		if (SystemUtils.isWindows() || SystemUtils.isMacOs()) {
+			return;
+		}
+		List<ArchivesAuto> archivesAutoList = this.list(Wrappers.<ArchivesAuto>lambdaQuery().eq(ArchivesAuto::getActionType, 2));
+		if (archivesAutoList == null || archivesAutoList.isEmpty()) {
+			return;
+		}
+		archivesAutoList.forEach(archivesAuto -> {
+			String value = redisTemplate.opsForValue().get("blade:archive:reCreateArchiveAuto1:" + archivesAuto.getId());
+			if (value == null) {
+				try {
+					redisTemplate.opsForValue().set("blade:archive:reCreateArchiveAuto1:" + archivesAuto.getId(), "", 60 * 60 * 1000, TimeUnit.MILLISECONDS);
+					//查出所有案卷文件
+					List<ArchiveFile>archiveFileList=archiveFileClient.getArchiveFileByArchiveIds(archivesAuto.getId()+"");
+					//设置案卷页码和四要素
+					if (archiveFileList != null && !archiveFileList.isEmpty()) {
+						this.reCreateArchiveAuto(archivesAuto, archiveFileList);
+					}
+					this.update(Wrappers.<ArchivesAuto>lambdaUpdate().set(ArchivesAuto::getActionType, 0).eq(ArchivesAuto::getId, archivesAuto.getId()));
+				} catch (Exception e) {
+					log.error("案卷重组失败," + "案卷ID:" + archivesAuto.getId(), e);
+					this.update(Wrappers.<ArchivesAuto>lambdaUpdate().set(ArchivesAuto::getActionType, -2).eq(ArchivesAuto::getId, archivesAuto.getId()));
+				} finally {
+					redisTemplate.delete("blade:archive:reCreateArchiveAuto1:" + archivesAuto.getId());
+				}
+			}
+		});
+	}
 }