Commit 1a88eefc authored by huyuchen's avatar huyuchen

huych-电子档案批量导入第三次提交

parent a787f0c5
......@@ -5,7 +5,6 @@ import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.yifu.cloud.plus.v1.yifu.common.core.constant.ExcelAttribute;
import com.yifu.cloud.plus.v1.yifu.common.mybatis.base.BaseEntity;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.EqualsAndHashCode;
......@@ -18,9 +17,9 @@ import lombok.EqualsAndHashCode;
*/
@Data
@TableName("t_task_archive_relation")
@EqualsAndHashCode(callSuper = true)
@EqualsAndHashCode()
@Schema(description = "电子档案上传任务和档案明细关系表")
public class TTaskArchiveRelation extends BaseEntity {
public class TTaskArchiveRelation {
/**
* 主键
......
......@@ -77,7 +77,7 @@ public class TElectronicArchiveTaskController {
*/
@Operation(summary = "导入Excel模板文件", description = "第一步:导入Excel模板文件,包含身份证、姓名、项目编码、项目名称")
@PostMapping("/importExcel")
public R<?> importExcel(@Parameter(description = "Excel文件") @RequestParam("file") MultipartFile file) {
public R<?> importExcel(@RequestBody MultipartFile file) {
if (file == null || file.isEmpty()) {
return R.failed("文件不能为空");
}
......@@ -104,7 +104,7 @@ public class TElectronicArchiveTaskController {
@Operation(summary = "导入ZIP文件", description = "第二步:导入ZIP文件,包含员工档案资料")
@PostMapping("/importZip")
public R<?> importZip(
@Parameter(description = "ZIP文件") @RequestParam("file") MultipartFile file,
@Parameter(description = "ZIP文件") @RequestBody MultipartFile file,
@Parameter(description = "任务ID") @RequestParam("taskId") String taskId) {
if (file == null || file.isEmpty()) {
......
......@@ -153,7 +153,7 @@ public class ElectronicArchiveImportServiceImpl implements ElectronicArchiveImpo
// 建立任务和档案详情的关联关系
createTaskArchiveRelations(task.getId(), successList);
return R.ok("导入成功,任务编号:" + taskCode);
return R.ok("导入成功,任务编号:" + task.getId());
} catch (Exception e) {
log.error("导入Excel文件失败", e);
......@@ -356,7 +356,8 @@ public class ElectronicArchiveImportServiceImpl implements ElectronicArchiveImpo
File tempZipFile = null;
try {
// 1. 校验ZIP大小
if (file.getSize() > ArchiveConstants.ZIP_MAX_SIZE) {
long fileSize = file.getSize();
if (fileSize > ArchiveConstants.ZIP_MAX_SIZE) {
return R.failed("ZIP文件大小不能超过500M");
}
......@@ -378,7 +379,7 @@ public class ElectronicArchiveImportServiceImpl implements ElectronicArchiveImpo
taskService.updateById(task);
// 将ZIP文件保存到临时目录
String tempDirPath = System.getProperty("java.io.tmpdir") + File.separator + "zip_upload_" + taskId;
String tempDirPath = System.getProperty("java.io.tmpdir") + "zip_load/" + System.currentTimeMillis() + "/";
File tempDir = new File(tempDirPath);
if (!tempDir.exists() && !tempDir.mkdirs()) {
throw new IOException("Failed to create directory: " + tempDirPath);
......@@ -390,7 +391,7 @@ public class ElectronicArchiveImportServiceImpl implements ElectronicArchiveImpo
// 保存ZIP附件信息(记录临时文件路径)
TAttaInfo zipAtta = new TAttaInfo();
zipAtta.setAttaName(file.getOriginalFilename());
zipAtta.setAttaSize(file.getSize());
zipAtta.setAttaSize(fileSize);
zipAtta.setRelationType(ArchiveConstants.ATTA_RELATION_TYPE_ZIP);
zipAtta.setDomainId(taskId);
zipAtta.setStatus(ArchiveConstants.ATTA_STATUS_DISABLED);
......@@ -479,40 +480,46 @@ public class ElectronicArchiveImportServiceImpl implements ElectronicArchiveImpo
));
// 创建临时目录用于解压ZIP文件
String tempDirPath = System.getProperty("java.io.tmpdir") + File.separator + "archive_" + taskId + "_" + System.currentTimeMillis();
String tempDirPath = System.getProperty("java.io.tmpdir") + File.separator + "archive_file" + File.separator
+ System.currentTimeMillis() + File.separator;
tempDir = new File(tempDirPath);
if (!tempDir.mkdirs()) {
if (!tempDir.exists() && !tempDir.mkdirs()) {
updateTaskStatus(task, ArchiveConstants.TASK_STATUS_NOT_UPLOADED);
return R.failed("创建临时目录失败");
}
// 解压ZIP文件
try {
ZipUtil.unzip(zipSourceFile, tempDir);
// 验证ZIP文件是否可读
if (!zipSourceFile.canRead()) {
log.error("ZIP文件不可读,路径:{}", zipSourceFile.getAbsolutePath());
updateTaskStatus(task, ArchiveConstants.TASK_STATUS_NOT_UPLOADED);
return R.failed("ZIP文件不可读");
}
// 使用指定字符集解压(支持中文文件名)
// Windows系统通常使用GBK编码,Linux使用UTF-8
try {
ZipUtil.unzip(zipSourceFile, tempDir, java.nio.charset.Charset.forName("GBK"));
} catch (Exception e1) {
// 如果GBK失败,尝试UTF-8
ZipUtil.unzip(zipSourceFile, tempDir, java.nio.charset.StandardCharsets.UTF_8);
}
} catch (Exception e) {
log.error("解压ZIP文件失败,任务ID:{}", taskId, e);
log.error("解压ZIP文件失败,任务ID:{},ZIP路径:{},临时目录:{}",
taskId, zipSourceFile.getAbsolutePath(), tempDirPath, e);
updateTaskStatus(task, ArchiveConstants.TASK_STATUS_NOT_UPLOADED);
return R.failed("解压ZIP文件失败:" + e.getMessage());
return R.failed("解压ZIP文件失败:" + e.getMessage() + ",请检查ZIP文件是否完整且格式正确");
}
// 获取ZIP包的根目录(第一级目录)
// 获取ZIP包的根目录(第一级目录,身份证+姓名目录
File[] zipRootDirs = tempDir.listFiles(File::isDirectory);
if (zipRootDirs == null || zipRootDirs.length == 0) {
updateTaskStatus(task, ArchiveConstants.TASK_STATUS_NOT_UPLOADED);
return R.failed("ZIP文件格式不正确");
}
File zipRootDir = zipRootDirs[0]; // 第一级目录
// 处理第二级目录(身份证+姓名目录)
File[] personDirs = zipRootDir.listFiles(File::isDirectory);
if (personDirs == null || personDirs.length == 0) {
updateTaskStatus(task, ArchiveConstants.TASK_STATUS_NOT_UPLOADED);
return R.failed("ZIP文件格式不正确");
}
// 遍历每个人员目录,递归处理所有附件
for (File personDir : personDirs) {
for (File personDir : zipRootDirs) {
processPersonDirectory(personDir, detailMap, feedbackList, taskId);
}
......@@ -757,7 +764,7 @@ public class ElectronicArchiveImportServiceImpl implements ElectronicArchiveImpo
detail.getId()
);
if (uploadResult == null || !R.isSuccess(uploadResult)) {
if (!R.isSuccess(uploadResult)) {
ArchiveFeedbackVO feedback = createFeedbackVO(detail, materialType,
ArchiveConstants.PROCESS_RESULT_FAILED,
"文件上传失败:" + fileName + ",原因:" + (uploadResult != null ? uploadResult.getMsg() : "未知错误"));
......
......@@ -1001,11 +1001,12 @@ public class TElectronicArchiveDetailServiceImpl extends ServiceImpl<TElectronic
public void initSearchVo(TElectronicArchiveDetailSearchVo searchVo) {
YifuUser user = SecurityUtils.getUser();
long roleId = 1839501715787390978L;
long roleId = 1569585030423158786L;
boolean isSsc = this.haveRole(user, roleId);
if (isSsc || CommonConstants.ZERO_STRING.equals(user.getSystemFlag())) {
long seeRoleId = 2003347621962379266L;
boolean isSeeSsc = this.haveRole(user, seeRoleId);
if (isSeeSsc || isSsc || CommonConstants.ZERO_STRING.equals(user.getSystemFlag())) {
searchVo.setAuthSql(null);
return;
}
}
......
......@@ -11,9 +11,12 @@ import com.yifu.cloud.plus.v1.batch.mapper.TElectronicArchiveTaskMapper;
import com.yifu.cloud.plus.v1.batch.service.TElectronicArchiveTaskService;
import com.yifu.cloud.plus.v1.batch.service.TTaskArchiveRelationService;
import com.yifu.cloud.plus.v1.batch.vo.TElectronicArchiveTaskSearchVo;
import com.yifu.cloud.plus.v1.yifu.common.core.constant.ClientNameConstants;
import com.yifu.cloud.plus.v1.yifu.common.core.constant.CommonConstants;
import com.yifu.cloud.plus.v1.yifu.common.core.util.Common;
import com.yifu.cloud.plus.v1.yifu.common.core.util.R;
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.log4j.Log4j2;
import org.springframework.stereotype.Service;
......@@ -42,6 +45,8 @@ public class TElectronicArchiveTaskServiceImpl extends ServiceImpl<TElectronicAr
*/
@Override
public IPage<TElectronicArchiveTask> getTElectronicArchiveTaskPage(Page<TElectronicArchiveTask> page, TElectronicArchiveTaskSearchVo tElectronicArchiveTask){
//权限赋值
initSearchVo(tElectronicArchiveTask);
return baseMapper.getTElectronicArchiveTaskPage(page,tElectronicArchiveTask);
}
......@@ -68,4 +73,22 @@ public class TElectronicArchiveTaskServiceImpl extends ServiceImpl<TElectronicAr
return R.ok();
}
public void initSearchVo(TElectronicArchiveTaskSearchVo searchVo) {
YifuUser user = SecurityUtils.getUser();
long roleId = 1569585030423158786L;
boolean isSsc = this.haveRole(user, roleId);
if (isSsc || CommonConstants.ZERO_STRING.equals(user.getSystemFlag())) {
searchVo.setCreateBy(null);
}
}
public boolean haveRole(YifuUser user, long roleId) {
List<Long> roleList = user.getClientRoleMap().get(ClientNameConstants.CLIENT_MVP);
for (Long role : roleList) {
if (role == roleId) {
return true;
}
}
return false;
}
}
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