Commit f0bbbb7f authored by fangxinjiang's avatar fangxinjiang

Merge remote-tracking branch 'origin/MVP1.7.18' into MVP1.7.18

parents 5d9b622e cd63095b
......@@ -33,8 +33,9 @@ spec: # 资源规范字段
#dapr.io/sidecar-memory-limit: "800Mi" #Dapr sidecar可以使用的最大内存量。默认情况下未设置 请参阅 https://kubernetes.io/docs/tasks/administer-cluster/manage-resources/quota-memory-cpu-namespace/ 的有效值。
#dapr.io/sidecar-cpu-request: 1 #Dapr sidecar要求的 CPU 数量
#dapr.io/sidecar-memory-request #Dapr sidecar 请求的内存数量
dapr.io/app-max-request-size: "600" # 明确指定应用请求大小
dapr.io/http-max-request-size: "600" #增加http和grpc服务器请求正文参数的最大大小,单位为MB,以处理大文件的上传。 默认值为 4 MB
dapr.io/http-read-buffer-size: "200" #Dapr has a default limit of 4KB for the http header read buffer size. When sending http headers that are bigger than the default 4KB, you can increase this value. Otherwise, you may encounter a Too big request header
dapr.io/http-read-buffer-size: "4096" #Dapr has a default limit of 4KB for the http header read buffer size. When sending http headers that are bigger than the default 4KB, you can increase this value. Otherwise, you may encounter a Too big request header
dapr.io/sidecar-listen-addresses: "0.0.0.0"
# 更多dapr配置请参考 https://www.bookstack.cn/read/dapr-1.5-zh/cc77b74e2cc2f4d4.md
......
......@@ -33,8 +33,9 @@ spec: # 资源规范字段
#dapr.io/sidecar-memory-limit: "800Mi" #Dapr sidecar可以使用的最大内存量。默认情况下未设置 请参阅 https://kubernetes.io/docs/tasks/administer-cluster/manage-resources/quota-memory-cpu-namespace/ 的有效值。
#dapr.io/sidecar-cpu-request: 1 #Dapr sidecar要求的 CPU 数量
#dapr.io/sidecar-memory-request #Dapr sidecar 请求的内存数量
dapr.io/app-max-request-size: "600" # 明确指定应用请求大小
dapr.io/http-max-request-size: "600" #增加http和grpc服务器请求正文参数的最大大小,单位为MB,以处理大文件的上传。 默认值为 4 MB
dapr.io/http-read-buffer-size: "16" #Dapr has a default limit of 4KB for the http header read buffer size. When sending http headers that are bigger than the default 4KB, you can increase this value. Otherwise, you may encounter a Too big request header
dapr.io/http-read-buffer-size: "4096" #Dapr has a default limit of 4KB for the http header read buffer size. When sending http headers that are bigger than the default 4KB, you can increase this value. Otherwise, you may encounter a Too big request header
#dapr.io/sidecar-listen-addresses: "0.0.0.0" 开通外部访问,仅限测试环境
# 更多dapr配置请参考 https://www.bookstack.cn/read/dapr-1.5-zh/cc77b74e2cc2f4d4.md
......
......@@ -136,25 +136,6 @@ public class TElectronicArchiveTaskController {
return R.ok(task);
}
/**
* 手动触发异步处理(用于重试)
*
* @param taskId 任务ID
* @return R
*/
@Operation(summary = "手动触发异步处理", description = "手动触发异步处理任务(用于重试失败的任务)")
@PostMapping("/retryProcess/{taskId}")
public R<?> retryProcess(@PathVariable("taskId") String taskId) {
TElectronicArchiveTask task = tElectronicArchiveTaskService.getById(taskId);
if (task == null) {
return R.failed("任务不存在");
}
// 只有生成中或失败的任务才能重试
// 这里可以根据需要增加失败状态
return importService.asyncProcessUpload(taskId);
}
/**
* 单个新增人员附件
* 前端先调用 /fileUpload/uploadArchiveFile 接口上传文件获取附件ID列表
......
......@@ -35,9 +35,10 @@ public interface ElectronicArchiveImportService {
* 第三步:异步处理上传
*
* @param taskId 任务ID
* @return 处理结果
* @param userId 用户ID
* @param userName 用户名
*/
R<?> asyncProcessUpload(String taskId);
void asyncProcessUpload(String taskId, String userId, String userName);
/**
* 生成任务编号
......
......@@ -22,6 +22,21 @@ public interface FileUploadService {
R<TAttaInfo> uploadFileReturnAtta(MultipartFile file, String filePath, String type, String domainId, String taskId) throws IOException;
/**
* 上传文件并返回附件信息(支持传递用户ID,用于异步场景)
*
* @param file 文件
* @param filePath 文件路径
* @param type 类型
* @param domainId 域ID
* @param taskId 任务ID
* @param userId 用户ID
* @param userName 用户名
* @return 附件信息
* @throws IOException IO异常
*/
R<TAttaInfo> uploadFileReturnAtta(MultipartFile file, String filePath, String type, String domainId, String taskId, String userId, String userName) throws IOException;
R<T> uploadAsso(MultipartFile file, String filePath, String type, String domain, String uploadType);
R<T> uploadAsso(MultipartFile file, String filePath, String type, String domain, String uploadType, String taskId);
......
......@@ -33,9 +33,11 @@ import com.yifu.cloud.plus.v1.yifu.common.security.util.SecurityUtils;
import com.yifu.cloud.plus.v1.yifu.insurances.constants.InsurancesConstants;
import lombok.RequiredArgsConstructor;
import lombok.extern.log4j.Log4j2;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.Cache;
import org.springframework.cache.CacheManager;
import org.springframework.cache.support.SimpleValueWrapper;
import org.springframework.context.annotation.Lazy;
import org.springframework.mock.web.MockMultipartFile;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;
......@@ -70,14 +72,22 @@ public class ElectronicArchiveImportServiceImpl implements ElectronicArchiveImpo
private final ArchivesDaprUtil archivesDaprUtil;
private final CacheManager cacheManager;
private final OSSUtil ossUtil;
private final SysConfigLimitMapper configLimitMapper;
/**
* 自注入代理对象,用于解决@Async注解在类内部调用时失效的问题
*
* @Lazy 延迟加载,避免循环依赖
*/
@Autowired
@Lazy
private ElectronicArchiveImportService self;
//初始化zip导入上限值
private int maxLimit = 1;
private AtomicInteger atomicInteger = new AtomicInteger(0);
private final SysConfigLimitMapper configLimitMapper;
/**
* 第一步:导入Excel模板文件
......@@ -163,15 +173,15 @@ public class ElectronicArchiveImportServiceImpl implements ElectronicArchiveImpo
taskService.save(task);
// 保存任务表附件
saveTaskAttachment(task.getId(), fileName, inputStream, "task_file"+"/" + task.getId() + "_" + fileName);
saveTaskAttachment(task.getId(), fileName, inputStream, "task_file" + "/" + task.getId() + "_" + fileName);
// 上传文件到阿里云OSS根目录
uploadFileToOSS("task_file"+"/" + task.getId() + "_" + fileName, fileBytes);
uploadFileToOSS("task_file" + "/" + task.getId() + "_" + fileName, fileBytes);
// 建立任务和档案详情的关联关系
createTaskArchiveRelations(task.getId(), successList);
return R.ok(task.getId(),"全部校验通过");
return R.ok(task.getId(), "全部校验通过");
} catch (Exception e) {
log.error("导入Excel文件失败", e);
......@@ -188,7 +198,7 @@ public class ElectronicArchiveImportServiceImpl implements ElectronicArchiveImpo
TEmployeeInfo empInfo;
TSettleDomainSelectVo settleResult;
R<TEmployeeInfo> empResult;
Map<String,String> map = new HashMap<>();
Map<String, String> map = new HashMap<>();
List<String> deptNoList = new ArrayList<>();
......@@ -210,7 +220,7 @@ public class ElectronicArchiveImportServiceImpl implements ElectronicArchiveImpo
if (Common.isNotNull(user) && isCheck) {
if (Common.isEmpty(deptNoList) || !deptNoList.contains(data.getDeptNo())) {
ErrorMessage<ArchiveImportVO> errorMessage = new ErrorMessage<>(data.getRowIndex()
,InsurancesConstants.DEPT_NO_NOT_IN_USER_DEPT_LIST,data);
, InsurancesConstants.DEPT_NO_NOT_IN_USER_DEPT_LIST, data);
errorMessageList.add(errorMessage);
continue;
}
......@@ -219,7 +229,7 @@ public class ElectronicArchiveImportServiceImpl implements ElectronicArchiveImpo
String uniqueKey = data.getEmpIdcard() + "_" + data.getEmpName();
if (null != map.get(uniqueKey)) {
ErrorMessage<ArchiveImportVO> errorMessage = new ErrorMessage<>(data.getRowIndex()
,"第" + data.getRowIndex() + "行:姓名和身份证信息存在重复数据",data);
, "第" + data.getRowIndex() + "行:姓名和身份证信息存在重复数据", data);
errorMessageList.add(errorMessage);
continue;
} else {
......@@ -230,7 +240,7 @@ public class ElectronicArchiveImportServiceImpl implements ElectronicArchiveImpo
settleResult = archivesDaprUtil.selectDeptByNo(data.getDeptNo());
if (Common.isEmpty(settleResult) || Common.isEmpty(settleResult.getCustomerCode())) {
ErrorMessage<ArchiveImportVO> errorMessage = new ErrorMessage<>(data.getRowIndex()
,"第" + data.getRowIndex() + "行:项目编码[" + data.getDeptNo() + "]信息不存在",data);
, "第" + data.getRowIndex() + "行:项目编码[" + data.getDeptNo() + "]信息不存在", data);
errorMessageList.add(errorMessage);
continue;
}
......@@ -242,7 +252,7 @@ public class ElectronicArchiveImportServiceImpl implements ElectronicArchiveImpo
empResult = archivesDaprUtil.getTEmployeeInfoByIdcardAndName(vo);
if (empResult == null || empResult.getData() == null) {
ErrorMessage<ArchiveImportVO> errorMessage = new ErrorMessage<>(data.getRowIndex()
,"第" + data.getRowIndex() + "行:人员档案信息不存在",data);
, "第" + data.getRowIndex() + "行:人员档案信息不存在", data);
errorMessageList.add(errorMessage);
continue;
}
......@@ -289,7 +299,7 @@ public class ElectronicArchiveImportServiceImpl implements ElectronicArchiveImpo
/**
* 保存任务表附件
*/
private void saveTaskAttachment(String taskId, String fileName, InputStream inputStream,String filePath) {
private void saveTaskAttachment(String taskId, String fileName, InputStream inputStream, String filePath) {
try {
TAttaInfo attaInfo = new TAttaInfo();
attaInfo.setAttaName(fileName);
......@@ -328,22 +338,22 @@ public class ElectronicArchiveImportServiceImpl implements ElectronicArchiveImpo
/**
* 获取项目权限
*
* @author huych
* @param userId
* @return {@link List< String>}
* @author huych
*/
public List<String> getDeptNoList(String userId){
public List<String> getDeptNoList(String userId) {
List<String> deptList = new ArrayList<>(16);
try{
try {
R<TSettleDomainListVo> settleDomainList = archivesDaprUtil.getSettleDomainIdsByUserId(userId);
if(Common.isNotNull(settleDomainList) && settleDomainList.getCode() == CommonConstants.SUCCESS){
if (Common.isNotNull(settleDomainList) && settleDomainList.getCode() == CommonConstants.SUCCESS) {
TSettleDomainListVo data = settleDomainList.getData();
if (Optional.ofNullable(data).isPresent()){
if (Optional.ofNullable(data).isPresent()) {
deptList = data.getDeptNos();
}
}
}catch (Exception e){
log.error("查询项目信息出错:"+e);
} catch (Exception e) {
log.error("查询项目信息出错:" + e);
}
return deptList;
}
......@@ -420,7 +430,7 @@ public class ElectronicArchiveImportServiceImpl implements ElectronicArchiveImpo
// 3. 校验同时上传任务数
maxLimit = configLimitMapper.getSysConfigLimitByKey("UPDOLOAD_MAX_LIMIT");
if (atomicInteger.incrementAndGet() > maxLimit){
if (atomicInteger.incrementAndGet() > maxLimit) {
atomicInteger.decrementAndGet();
return R.failed("有其他客服正在上传中,请5分钟后重试");
}
......@@ -451,8 +461,9 @@ public class ElectronicArchiveImportServiceImpl implements ElectronicArchiveImpo
zipAtta.setAttaSrc(tempZipFile.getAbsolutePath()); // 临时存储文件路径
attaInfoService.save(zipAtta);
// 调用异步处理
asyncProcessUpload(taskId);
// 调用异步处理(通过self代理对象调用,使@Async生效)
// 传递用户ID和用户名,因为异步线程无法获取用户上下文
self.asyncProcessUpload(taskId, user.getId(), user.getNickname());
return R.ok("ZIP文件提交成功,正在处理中");
......@@ -472,10 +483,14 @@ public class ElectronicArchiveImportServiceImpl implements ElectronicArchiveImpo
/**
* 第三步:异步处理上传
*
* @param taskId 任务ID
* @param userId 用户ID(用于上传反馈文件)
* @param userName 用户名(用于上传反馈文件)
*/
@Override
@Async
public R<?> asyncProcessUpload(String taskId) {
public void asyncProcessUpload(String taskId, String userId, String userName) {
List<ArchiveFeedbackVO> feedbackList = new ArrayList<>();
File tempDir = null;
......@@ -485,7 +500,8 @@ public class ElectronicArchiveImportServiceImpl implements ElectronicArchiveImpo
// 查询任务及关联的明细
TElectronicArchiveTask task = taskService.getById(taskId);
if (task == null) {
return R.failed("任务不存在");
log.error("任务不存在,任务ID:{}", taskId);
return;
}
// 查询ZIP附件(从附件导入中获取)
......@@ -495,7 +511,8 @@ public class ElectronicArchiveImportServiceImpl implements ElectronicArchiveImpo
if (CollUtil.isEmpty(zipAttas)) {
updateTaskStatus(task, ArchiveConstants.TASK_STATUS_NOT_UPLOADED);
return R.failed("ZIP附件不存在");
log.error("ZIP附件不存在,任务ID:{}", taskId);
return;
}
TAttaInfo zipAtta = zipAttas.get(0);
......@@ -503,13 +520,15 @@ public class ElectronicArchiveImportServiceImpl implements ElectronicArchiveImpo
// 从附件记录中获取ZIP文件路径
if (StrUtil.isBlank(zipAtta.getAttaSrc())) {
updateTaskStatus(task, ArchiveConstants.TASK_STATUS_NOT_UPLOADED);
return R.failed("ZIP文件路径为空");
log.error("ZIP文件路径为空,任务ID:{}", taskId);
return;
}
zipSourceFile = new File(zipAtta.getAttaSrc());
if (!zipSourceFile.exists()) {
updateTaskStatus(task, ArchiveConstants.TASK_STATUS_NOT_UPLOADED);
return R.failed("ZIP文件不存在");
log.error("ZIP文件不存在,任务ID:{},文件路径:{}", taskId, zipAtta.getAttaSrc());
return;
}
// 获取任务关联的明细
......@@ -518,7 +537,8 @@ public class ElectronicArchiveImportServiceImpl implements ElectronicArchiveImpo
if (CollUtil.isEmpty(relations)) {
updateTaskStatus(task, ArchiveConstants.TASK_STATUS_NOT_UPLOADED);
return R.failed("任务没有关联的明细数据");
log.error("任务没有关联的明细数据,任务ID:{}", taskId);
return;
}
List<String> detailIds = relations.stream()
......@@ -533,7 +553,8 @@ public class ElectronicArchiveImportServiceImpl implements ElectronicArchiveImpo
tempDir = new File(tempDirPath);
if (!tempDir.exists() && !tempDir.mkdirs()) {
updateTaskStatus(task, ArchiveConstants.TASK_STATUS_NOT_UPLOADED);
return R.failed("创建临时目录失败");
log.error("创建临时目录失败,任务ID:{},目录路径:{}", taskId, tempDirPath);
return;
}
// 解压ZIP文件
......@@ -542,7 +563,7 @@ public class ElectronicArchiveImportServiceImpl implements ElectronicArchiveImpo
if (!zipSourceFile.canRead()) {
log.error("ZIP文件不可读,路径:{}", zipSourceFile.getAbsolutePath());
updateTaskStatus(task, ArchiveConstants.TASK_STATUS_NOT_UPLOADED);
return R.failed("ZIP文件不可读");
return;
}
// 使用指定字符集解压(支持中文文件名)
// Windows系统通常使用GBK编码,Linux使用UTF-8
......@@ -556,7 +577,7 @@ public class ElectronicArchiveImportServiceImpl implements ElectronicArchiveImpo
log.error("解压ZIP文件失败,任务ID:{},ZIP路径:{},临时目录:{}",
taskId, zipSourceFile.getAbsolutePath(), tempDirPath, e);
updateTaskStatus(task, ArchiveConstants.TASK_STATUS_NOT_UPLOADED);
return R.failed("解压ZIP文件失败:" + e.getMessage() + ",请检查ZIP文件是否完整且格式正确");
return;
}
// 获取ZIP包的根目录(第一级目录,身份证+姓名目录)
......@@ -600,7 +621,7 @@ public class ElectronicArchiveImportServiceImpl implements ElectronicArchiveImpo
// 遍历该人员的所有文件夹
for (File personDir : personDirs) {
processPersonDirectoryWithResult(personDir, detail, materialTypes, failReasons, taskId);
processPersonDirectoryWithResult(personDir, detail, materialTypes, failReasons, taskId, userId, userName);
}
personMaterialTypesMap.put(uniqueKey, materialTypes);
......@@ -656,9 +677,9 @@ public class ElectronicArchiveImportServiceImpl implements ElectronicArchiveImpo
task.setStatus(ArchiveConstants.TASK_STATUS_GENERATED);
taskService.updateById(task);
// 生成反馈表
generateFeedbackExcel(task, feedbackList);
return R.ok("处理完成");
// 生成反馈表(传递用户信息)
generateFeedbackExcel(task, feedbackList, userId, userName);
log.info("异步任务处理完成,任务ID:{}", taskId);
} catch (Exception e) {
log.error("异步处理任务失败,任务ID:{}", taskId, e);
......@@ -667,7 +688,6 @@ public class ElectronicArchiveImportServiceImpl implements ElectronicArchiveImpo
if (task != null) {
updateTaskStatus(task, ArchiveConstants.TASK_STATUS_NOT_UPLOADED);
}
return R.failed("处理失败:" + e.getMessage());
} finally {
// 清理临时解压目录
if (tempDir != null && tempDir.exists()) {
......@@ -829,9 +849,12 @@ public class ElectronicArchiveImportServiceImpl implements ElectronicArchiveImpo
* @param materialTypes 成功处理的资料类型列表(输出参数)
* @param failReasons 失败原因列表(输出参数)
* @param taskId 任务ID
* @param userId 用户ID
* @param userName 用户名
*/
private void processPersonDirectoryWithResult(File personDir, TElectronicArchiveDetail detail,
List<String> materialTypes, List<String> failReasons, String taskId) {
List<String> materialTypes, List<String> failReasons, String taskId,
String userId, String userName) {
// 处理第三级目录(资料类型或直接是文件)
File[] subFiles = personDir.listFiles();
if (subFiles == null || subFiles.length == 0) {
......@@ -868,7 +891,7 @@ public class ElectronicArchiveImportServiceImpl implements ElectronicArchiveImpo
}
// 按资料类型分组处理目录下的所有文件
String result = processMaterialTypeDirectoryWithResult(subFile, detail, materialType, taskId);
String result = processMaterialTypeDirectoryWithResult(subFile, detail, materialType, taskId, userId, userName);
if ("success".equals(result)) {
materialTypesSet.add(materialType);
} else {
......@@ -882,7 +905,7 @@ public class ElectronicArchiveImportServiceImpl implements ElectronicArchiveImpo
// 统一处理所有直接文件(存量类型)
if (!stockFiles.isEmpty()) {
String result = processMaterialTypeFilesWithResult(stockFiles, detail, ArchiveConstants.MATERIAL_TYPE_STOCK, taskId);
String result = processMaterialTypeFilesWithResult(stockFiles, detail, ArchiveConstants.MATERIAL_TYPE_STOCK, taskId, userId, userName);
if ("success".equals(result)) {
materialTypesSet.add(ArchiveConstants.MATERIAL_TYPE_STOCK);
} else {
......@@ -927,10 +950,12 @@ public class ElectronicArchiveImportServiceImpl implements ElectronicArchiveImpo
* @param detail 电子档案明细
* @param materialType 资料类型
* @param taskId 任务ID
* @param userId 用户ID
* @param userName 用户名
* @return "success" 表示成功,其他表示失败原因
*/
private String processMaterialTypeDirectoryWithResult(File directory, TElectronicArchiveDetail detail,
String materialType, String taskId) {
String materialType, String taskId, String userId, String userName) {
// 收集该资料类型目录下的所有文件(递归收集子目录中的文件)
List<File> allFiles = new ArrayList<>();
collectAllFiles(directory, allFiles);
......@@ -940,7 +965,7 @@ public class ElectronicArchiveImportServiceImpl implements ElectronicArchiveImpo
}
// 统一处理该资料类型下的所有文件
return processMaterialTypeFilesWithResult(allFiles, detail, materialType, taskId);
return processMaterialTypeFilesWithResult(allFiles, detail, materialType, taskId, userId, userName);
}
/**
......@@ -1043,10 +1068,12 @@ public class ElectronicArchiveImportServiceImpl implements ElectronicArchiveImpo
* @param detail 电子档案明细
* @param materialType 资料类型
* @param taskId 任务ID
* @param userId 用户ID
* @param userName 用户名
* @return "success" 表示成功,其他表示失败原因
*/
private String processMaterialTypeFilesWithResult(List<File> files, TElectronicArchiveDetail detail,
String materialType, String taskId) {
String materialType, String taskId, String userId, String userName) {
// 第一步:验证所有文件格式
for (File file : files) {
String fileName = file.getName();
......@@ -1073,12 +1100,15 @@ public class ElectronicArchiveImportServiceImpl implements ElectronicArchiveImpo
}
// 上传文件到阿里云OSS,uploadFileReturnAtta会自动生成TAttaInfo记录
// 传递用户信息,支持异步场景
R<TAttaInfo> uploadResult = fileUploadService.uploadFileReturnAtta(
multipartFile,
ossDirectory,
CommonConstants.FOUR_STRING,
detail.getId(),
taskId
taskId,
userId,
userName
);
if (!R.isSuccess(uploadResult)) {
......@@ -1186,9 +1216,16 @@ public class ElectronicArchiveImportServiceImpl implements ElectronicArchiveImpo
/**
* 生成反馈表Excel
*
* @param task 任务信息
* @param feedbackList 反馈列表
* @param userId 用户ID
* @param userName 用户名
*/
private void generateFeedbackExcel(TElectronicArchiveTask task, List<ArchiveFeedbackVO> feedbackList) {
private void generateFeedbackExcel(TElectronicArchiveTask task, List<ArchiveFeedbackVO> feedbackList,
String userId, String userName) {
if (CollUtil.isEmpty(feedbackList)) {
log.warn("反馈列表为空,跳过生成反馈表,任务ID:{}", task.getId());
return;
}
......@@ -1203,28 +1240,35 @@ public class ElectronicArchiveImportServiceImpl implements ElectronicArchiveImpo
.sheet("处理结果反馈")
.doWrite(feedbackList);
// 上传反馈表到OSS
YifuUser user = SecurityUtils.getUser();
if (user != null) {
log.info("反馈表Excel文件生成成功,文件路径:{},记录数:{}", tempFilePath, feedbackList.size());
// 上传反馈表到OSS(传递用户信息)
if (StrUtil.isNotBlank(userId)) {
R<TAttaInfo> uploadResult = fileUploadService.uploadFileReturnAtta(
fileToMultipartFile(feedbackFile),
"archive/feedback",
ArchiveConstants.ATTA_RELATION_TYPE_FEEDBACK,
task.getId()
task.getId(),
null, // taskId为null
userId,
userName
);
if (R.isSuccess(uploadResult)) {
log.info("反馈表生成成功");
log.info("反馈表上传成功,任务ID:{},附件ID:{}", task.getId(), uploadResult.getData().getId());
} else {
log.error("反馈表上传失败");
log.error("反馈表上传失败,任务ID:{},失败原因:{}", task.getId(), uploadResult.getMsg());
}
} else {
log.error("用户ID为空,无法上传反馈表,任务ID:{}", task.getId());
}
// 删除临时文件
FileUtil.del(feedbackFile);
log.info("临时反馈表文件已删除:{}", tempFilePath);
} catch (Exception e) {
log.error("生成反馈表失败:", e);
log.error("生成反馈表失败,任务ID:{},异常信息:", task.getId(), e);
}
}
......
package com.yifu.cloud.plus.v1.batch.service.impl;
import cn.hutool.core.util.StrUtil;
import com.yifu.cloud.plus.v1.batch.entity.TAttaInfo;
import com.yifu.cloud.plus.v1.batch.mapper.SysConfigLimitMapper;
import com.yifu.cloud.plus.v1.batch.service.FileUploadService;
......@@ -14,17 +15,12 @@ import com.yifu.cloud.plus.v1.yifu.common.core.vo.YifuUser;
import com.yifu.cloud.plus.v1.yifu.common.security.util.SecurityUtils;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.authority.AuthorityUtils;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
import java.io.IOException;
import java.net.URL;
import java.time.LocalDateTime;
import java.util.Collection;
import java.util.HashSet;
import java.util.Set;
import java.util.concurrent.atomic.AtomicInteger;
@Service
......@@ -49,6 +45,18 @@ public class FileUploadServiceImpl implements FileUploadService {
@Override
public R<TAttaInfo> uploadFileReturnAtta(MultipartFile file, String filePath, String type, String domainId, String taskId) throws IOException {
// 从当前上下文获取用户信息
YifuUser user = SecurityUtils.getUser();
if (user != null) {
return uploadFileReturnAtta(file, filePath, type, domainId, taskId, user.getId(), user.getNickname());
} else {
return uploadFileReturnAtta(file, filePath, type, domainId, taskId, null, null);
}
}
@Override
public R<TAttaInfo> uploadFileReturnAtta(MultipartFile file, String filePath, String type, String domainId,
String taskId, String userId, String userName) throws IOException {
if (null == file) {
return R.failed("文件删除异常,请重新上传!");
}
......@@ -98,12 +106,23 @@ public class FileUploadServiceImpl implements FileUploadService {
attaInfo.setDomainId(domainId);
attaInfo.setTaskId(taskId);
Set<String> dbAuthsSet = new HashSet<>();
Collection<? extends GrantedAuthority> authorities = AuthorityUtils
.createAuthorityList(dbAuthsSet.toArray(new String[0]));
// 优先使用传入的用户信息(支持异步场景)
if (Common.isNotNull(userId) && StrUtil.isNotBlank(userId)) {
attaInfo.setCreateBy(userId);
attaInfo.setCreateName(userName);
} else {
// 从上下文获取(同步场景)
try {
YifuUser user = SecurityUtils.getUser();
if (user != null) {
attaInfo.setCreateBy(user.getId());
attaInfo.setCreateName(user.getNickname());
}
} catch (Exception e) {
log.warn("获取用户上下文失败,附件创建人将为空", e);
}
}
attaInfo = tAttaInfoService.add(attaInfo);
} catch (Exception e) {
log.error("OSS文件上传异常:" + e.getMessage());
......
......@@ -229,10 +229,13 @@ public class TElectronicArchiveDetailServiceImpl extends ServiceImpl<TElectronic
}
try {
//重复数据检测
Map<String,String> map = new HashMap<>();
// 1. 校验请求并查询档案信息
for (ArchiveBatchDownloadRequestVO request : requestList) {
try {
validateAndPrepareDownload(request, downloadMap, feedbackList, isCheck, deptNoList);
validateAndPrepareDownload(request, downloadMap, feedbackList, isCheck, deptNoList, map);
} catch (Exception e) {
log.error("处理下载请求失败,姓名:{},身份证:{},项目编码:{}",
request.getEmpName(), request.getEmpIdcard(), request.getDeptNo(), e);
......@@ -345,7 +348,8 @@ public class TElectronicArchiveDetailServiceImpl extends ServiceImpl<TElectronic
Map<String, ArchiveDownloadInfo> downloadMap,
List<ArchiveDownloadFeedbackVO> feedbackList,
boolean isCheck,
List<String> deptNoList) {
List<String> deptNoList,
Map<String,String> map) {
// 1. 根据姓名、身份证、项目编码、项目名称查询电子档案明细
LambdaQueryWrapper<TElectronicArchiveDetail> wrapper = Wrappers.<TElectronicArchiveDetail>lambdaQuery()
......@@ -362,6 +366,24 @@ public class TElectronicArchiveDetailServiceImpl extends ServiceImpl<TElectronic
// 查询档案明细
TElectronicArchiveDetail detail = baseMapper.selectOne(wrapper);
StringBuilder s = new StringBuilder();
s.append(request.getEmpIdcard());
s.append("_");
s.append(request.getDeptNo());
s.append("_");
s.append(request.getDeptName());
s.append("_");
s.append(request.getEmpName());
s.append("_");
s.append(request.getMaterialType());
if (null != map.get(s.toString())) {
feedbackList.add(createFeedbackVO(request, "存在重复的导出人员信息",detail));
return;
}else {
map.put(s.toString(), "1");
}
//项目权限校验
if (isCheck && !deptNoList.contains(request.getDeptNo())) {
feedbackList.add(createFeedbackVO(request, "没有该项目的权限",detail));
......
......@@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.yifu.cloud.plus.v1.batch.entity.TElectronicArchiveDetail;
import com.yifu.cloud.plus.v1.batch.entity.TElectronicArchiveTask;
import com.yifu.cloud.plus.v1.batch.entity.TTaskArchiveRelation;
import com.yifu.cloud.plus.v1.batch.mapper.TElectronicArchiveDetailMapper;
......@@ -67,7 +68,9 @@ public class TElectronicArchiveTaskServiceImpl extends ServiceImpl<TElectronicAr
//删除关联关系表
relationService.removeById(relation.getId());
//删除电子档案明细表
detailMapper.deleteById(relation.getArchiveDetailId());
detailMapper.delete(Wrappers.<TElectronicArchiveDetail>query().lambda()
.eq(TElectronicArchiveDetail::getStatus,CommonConstants.ZERO_STRING)
.eq(TElectronicArchiveDetail::getId,relation.getArchiveDetailId()));
}
}
return R.ok();
......
......@@ -39,7 +39,7 @@ public interface TInsurancePolicyMapper extends BaseMapper<TInsurancePolicy> {
*/
List<TInsurancePolicy> getInsurancePolicyList(@Param("param") InsurancePolicyListParam param);
Page<PolicyListVo> policyPageToAutoSelect(Page page,@Param("param") InsuredParam param);
IPage<PolicyListVo> policyPageToAutoSelect(Page page,@Param("param") InsuredParam param);
}
......
......@@ -75,5 +75,5 @@ public interface TInsurancePolicyService extends IService<TInsurancePolicy> {
R<List<ErrorMessage>> importInsurancePolicy(InputStream inputStream);
Page<PolicyListVo> policyPageToAutoSelect(Page<PolicyListVo> page, InsuredParam param, String mId);
IPage<PolicyListVo> policyPageToAutoSelect(Page<PolicyListVo> page, InsuredParam param, String mId);
}
......@@ -430,7 +430,7 @@ public class TInsurancePolicyServiceImpl extends ServiceImpl<TInsurancePolicyMap
@Override
public Page<PolicyListVo> policyPageToAutoSelect(Page<PolicyListVo> page, InsuredParam param, String mId) {
public IPage<PolicyListVo> policyPageToAutoSelect(Page<PolicyListVo> page, InsuredParam param, String mId) {
// 查保单未过期的数据
String today = LocalDateUtil.getDateSrt(LocalDate.now());
param.setPolicyEnd(today);
......
......@@ -1295,7 +1295,7 @@
<!-- 派增(0待审核、1待办理、3办理成功、4办理失败9 审核不通过)、派减(5待审核 6待办理 7 办理成功 8 办理失败 ) -->
and a.fund_status in ('0', '1', '3', '5', '6', '8')
<if test="type != null and type == '1'">
<if test="type != null and type = '1'">
and d.create_name not like '自动化%'
</if>
</select>
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment