解决冲突

This commit is contained in:
s2042968 2024-12-19 17:33:30 +08:00
commit a839b0c866
36 changed files with 1187 additions and 725 deletions

View File

@ -63,11 +63,6 @@
<artifactId>pagehelper</artifactId> <artifactId>pagehelper</artifactId>
<version>5.1.2</version> <version>5.1.2</version>
</dependency> </dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.8.1</version>
</dependency>
<dependency> <dependency>
<groupId>com.alibaba</groupId> <groupId>com.alibaba</groupId>
<artifactId>druid</artifactId> <artifactId>druid</artifactId>

View File

@ -1,12 +1,88 @@
package com.electromagnetic.industry.software.manage.controller; package com.electromagnetic.industry.software.manage.controller;
import com.electromagnetic.industry.software.common.resp.ElectromagneticResult;
import com.electromagnetic.industry.software.manage.pojo.req.FileInfoQueryDTO;
import com.electromagnetic.industry.software.manage.service.EdFileInfoService;
import org.springframework.core.io.InputStreamResource;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@RestController @RestController
@RequestMapping("/data/ed/file") @RequestMapping("/data/ed/file")
public class EdFileInfoController { public class EdFileInfoController {
@Resource
private EdFileInfoService edFileInfoService;
@RequestMapping("tree")
public ElectromagneticResult<?> tree() {
return edFileInfoService.tree();
}
@RequestMapping("createFolder")
public ElectromagneticResult<?> createFolder(@RequestParam String parentId, @RequestParam String newFolderName) {
return edFileInfoService.createFolder(parentId, newFolderName);
}
@RequestMapping("deleteFolder")
public ElectromagneticResult<?> deleteFolder(@RequestParam String id, @RequestParam Integer dataType) {
return edFileInfoService.deleteFolder(id, dataType);
}
@RequestMapping("info")
public ElectromagneticResult<?> info(@RequestBody FileInfoQueryDTO fileInfoQueryDTO) {
return edFileInfoService.queryEdFileInfo(fileInfoQueryDTO);
}
@RequestMapping("upload")
public ElectromagneticResult<?> upload() {
return null;
}
@RequestMapping("download")
public ResponseEntity<InputStreamResource> download(@RequestParam String id, HttpServletResponse response) {
return edFileInfoService.download(id, response);
}
@RequestMapping("updateFileInfo")
public ElectromagneticResult<?> updateFileInfo() {
return null;
}
@RequestMapping("deleteFile")
public ElectromagneticResult<?> deleteFile() {
return null;
}
@RequestMapping("moveFile")
public ElectromagneticResult<?> moveFile() {
return null;
}
@RequestMapping("copyFile")
public ElectromagneticResult<?> copyFile() {
return null;
}
@RequestMapping("versionView")
public ElectromagneticResult<?> versionView() {
return null;
}
@RequestMapping("versionBack")
public ElectromagneticResult<?> versionBack() {
return null;
}
@RequestMapping("batchExport")
public ElectromagneticResult<?> batchExport() {
return null;
}
} }

View File

@ -19,8 +19,8 @@ public class PermissionController {
@Resource @Resource
private PermissionService permissionService; private PermissionService permissionService;
@ApiOperation(value="查询当前用户在当前目录的功能权限",notes = "") @ApiOperation(value = "查询当前用户在当前目录的功能权限", notes = "")
@GetMapping(value="/{fileId}") @GetMapping(value = "/{fileId}")
public ElectromagneticResult<?> getUserPermission(@PathVariable("fileId") String fileId) { public ElectromagneticResult<?> getUserPermission(@PathVariable("fileId") String fileId) {
String userId = UserThreadLocal.getUserId(); String userId = UserThreadLocal.getUserId();
return ElectromagneticResultUtil.success(permissionService.getUserPermission(userId, fileId)); return ElectromagneticResultUtil.success(permissionService.getUserPermission(userId, fileId));

View File

@ -2,7 +2,7 @@ package com.electromagnetic.industry.software.manage.controller;
import com.electromagnetic.industry.software.common.resp.ElectromagneticResult; import com.electromagnetic.industry.software.common.resp.ElectromagneticResult;
import com.electromagnetic.industry.software.manage.pojo.req.FolderResortDTO; import com.electromagnetic.industry.software.manage.pojo.req.FolderResortDTO;
import com.electromagnetic.industry.software.manage.service.EdFileInfoService; import com.electromagnetic.industry.software.manage.service.EdPrjService;
import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RequestParam;
@ -17,56 +17,56 @@ import java.util.List;
public class ProjectController { public class ProjectController {
@Resource @Resource
private EdFileInfoService edFileInfoService; private EdPrjService edPrjService;
@RequestMapping("create") @RequestMapping("create")
public ElectromagneticResult<?> create(@RequestParam String prjName) { public ElectromagneticResult<?> create(@RequestParam String prjName) {
return edFileInfoService.createNewPrj(prjName); return edPrjService.createNewPrj(prjName);
} }
@RequestMapping("delete") @RequestMapping("delete")
public ElectromagneticResult<?> delete(@RequestParam String prjId) { public ElectromagneticResult<?> delete(@RequestParam String prjId) {
return edFileInfoService.delete(prjId); return edPrjService.delete(prjId);
} }
@RequestMapping("modify") @RequestMapping("modify")
public ElectromagneticResult<?> modifyPrjName(@RequestParam String newPrjName, @RequestParam String prjId) { public ElectromagneticResult<?> modifyPrjName(@RequestParam String newPrjName, @RequestParam String prjId) {
return edFileInfoService.modifyPrjName(prjId, newPrjName); return edPrjService.modifyPrjName(prjId, newPrjName);
} }
@RequestMapping("queryAll") @RequestMapping("queryAll")
public ElectromagneticResult<?> queryAll() { public ElectromagneticResult<?> queryAll() {
return edFileInfoService.queryAllPrjInfo(); return edPrjService.queryAllPrjInfo();
} }
@RequestMapping("addFolder") @RequestMapping("addFolder")
public ElectromagneticResult<?> addFolder(@RequestParam String folderName, @RequestParam String parentId) { public ElectromagneticResult<?> addFolder(@RequestParam String folderName, @RequestParam String parentId) {
return edFileInfoService.addFolder(parentId, folderName); return edPrjService.addFolder(parentId, folderName);
} }
@RequestMapping("modifyFolder") @RequestMapping("modifyFolder")
public ElectromagneticResult<?> modifyFolder(@RequestParam String newFolderName, @RequestParam String id) { public ElectromagneticResult<?> modifyFolder(@RequestParam String newFolderName, @RequestParam String id, @RequestParam String parentId) {
return edFileInfoService.modifyFolder(id, newFolderName); return edPrjService.modifyFolder(id, newFolderName, parentId);
} }
@RequestMapping("deleteFolder") @RequestMapping("deleteFolder")
public ElectromagneticResult<?> deleteFolder(@RequestParam String fileId) { public ElectromagneticResult<?> deleteFolder(@RequestParam String id, @RequestParam String parentId) {
return edFileInfoService.deleteFolder(fileId); return edPrjService.deleteFolder(id, parentId);
} }
@RequestMapping("folderResort") @RequestMapping("folderResort")
public ElectromagneticResult<?> folderResort(@RequestBody List<FolderResortDTO> folderResortDTOList) { public ElectromagneticResult<?> folderResort(@RequestBody List<FolderResortDTO> folderResortDTOList) {
return edFileInfoService.folderResort(folderResortDTOList); return edPrjService.folderResort(folderResortDTOList);
} }
@RequestMapping("publish") @RequestMapping("publish")
public ElectromagneticResult<?> publish(@RequestParam String prjId) { public ElectromagneticResult<?> publish(@RequestParam String prjId) {
return edFileInfoService.publish(prjId); return edPrjService.publish(prjId);
} }
@RequestMapping("follow") @RequestMapping("follow")
public ElectromagneticResult<?> follow(@RequestParam String sourceId, @RequestParam String targetId) { public ElectromagneticResult<?> follow(@RequestParam String sourceId, @RequestParam String targetId) {
return edFileInfoService.follow(sourceId, targetId); return edPrjService.follow(sourceId, targetId);
} }
} }

View File

@ -70,13 +70,13 @@ public class UserController {
return userService.logout(token); return userService.logout(token);
} }
@ApiOperation(value="人员绑定", notes = "") @ApiOperation(value = "人员绑定", notes = "")
@RequestMapping(value = "/bindRoles", method = RequestMethod.POST) @RequestMapping(value = "/bindRoles", method = RequestMethod.POST)
public ElectromagneticResult<?> bindRoles(@RequestBody UserRoleRequest userRoleRequest) { public ElectromagneticResult<?> bindRoles(@RequestBody UserRoleRequest userRoleRequest) {
if (userService.bindRoles(userRoleRequest)) { if (userService.bindRoles(userRoleRequest)) {
return ElectromagneticResultUtil.success(true); return ElectromagneticResultUtil.success(true);
} else { } else {
return ElectromagneticResultUtil.fail("500","不可绑定空用户"); return ElectromagneticResultUtil.fail("500", "不可绑定空用户");
} }
} }
} }

View File

@ -11,6 +11,4 @@ public interface EdFileInfoMapper extends BaseMapper<EdFileInfo> {
String maxPrjId(); String maxPrjId();
List<EdFileInfo> selectAllAdminFolder(String prjId);
} }

View File

@ -24,7 +24,7 @@ public class BaseModel {
/** /**
* 最后更新时间 * 最后更新时间
*/ */
@TableField(value = "update_time") @TableField(value = "updated_time")
private Date updateTime; private Date updateTime;
/** /**

View File

@ -2,7 +2,8 @@ package com.electromagnetic.industry.software.manage.pojo.models;
import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName; import com.baomidou.mybatisplus.annotation.TableName;
import lombok.*; import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors; import lombok.experimental.Accessors;
import lombok.experimental.FieldNameConstants; import lombok.experimental.FieldNameConstants;
@ -24,6 +25,12 @@ public class EdFileInfo extends BaseModel {
@TableField(value = "file_id") @TableField(value = "file_id")
private String fileId; private String fileId;
/**
* 父目录id
*/
@TableField(value = "parent_id")
private String parentId;
/** /**
* 文件类型 * 文件类型
*/ */
@ -67,12 +74,6 @@ public class EdFileInfo extends BaseModel {
@TableField(value = "file_path") @TableField(value = "file_path")
private String filePath; private String filePath;
/**
* 父目录id
*/
@TableField(value = "parent_id")
private String parentId;
/** /**
* 数据类型0-文件夹 1-文件 * 数据类型0-文件夹 1-文件
*/ */
@ -98,17 +99,11 @@ public class EdFileInfo extends BaseModel {
private Integer effectFlag; private Integer effectFlag;
/** /**
*保存状态0-上传中 1-上传成功 2-上传失败 * 保存状态0-上传中 1-上传成功 2-上传失败
*/ */
@TableField(value = "save_status") @TableField(value = "save_status")
private Integer saveStatus; private Integer saveStatus;
/**
* 文件夹发布状态0-未发布1-已发布
*/
@TableField(value = "publish_status")
private int publishStatus;
/** /**
* 文件大小 * 文件大小
*/ */
@ -118,6 +113,18 @@ public class EdFileInfo extends BaseModel {
/** /**
* 文件夹顺序 * 文件夹顺序
*/ */
@TableField("sort") @TableField(value = "sort")
private Integer sort; private Integer sort;
/**
* 文件编码
*/
@TableField(value = "file_code")
private String fileCode;
/**
* 是否是管理员定义的系统层级目录
*/
@TableField(value = "prj_dir")
private Boolean prjDir;
} }

View File

@ -13,7 +13,7 @@ public class RolePermission {
/** /**
* 角色编码 * 角色编码
*/ */
@TableField(value="role_id") @TableField(value = "role_id")
private String roleId; private String roleId;
/** /**

View File

@ -17,6 +17,6 @@ public class UserRole {
/** /**
* 角色编码 * 角色编码
*/ */
@TableField(value="role_id") @TableField(value = "role_id")
private String roleId; private String roleId;
} }

View File

@ -0,0 +1,38 @@
package com.electromagnetic.industry.software.manage.pojo.other;
import lombok.Data;
import java.util.Date;
@Data
public class FileInfoDTO {
private String id;
private String fileId;
private String fileType;
private String fileName;
private String fileNote;
private Integer fileVersion;
private String parentId;
private Integer dataType;
private Integer dataStatus;
private Integer saveStatus;
private String fileSize;
private Date updateTime;
private Date createTime;
private String fileCode;
}

View File

@ -0,0 +1,34 @@
package com.electromagnetic.industry.software.manage.pojo.req;
import lombok.Data;
@Data
public class FileInfoQueryDTO {
/** 父文件夹id */
private String parentId;
/** 当前页码 */
private Integer pageNum;
/** 每页的数量 */
private Integer pageSize;
/** 搜索关键词 */
private String keyword;
/** 文件类型 0-文件夹 1-文件)*/
private Integer fileType;
/** 上传时间0-升序1-降序)*/
private Integer createdTime;
/** 版本号0-升序1-降序 */
private Integer fileVersion;
/** 文件大小0-升序1-降序) */
private Integer fileSize;
/** 状态0-未发布 1-已发布 2-占用) */
private Integer dataStatus;
}

View File

@ -0,0 +1,19 @@
package com.electromagnetic.industry.software.manage.pojo.resp;
import com.electromagnetic.industry.software.manage.pojo.other.FileInfoDTO;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.ArrayList;
import java.util.List;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class FileInfoQueryPageVO {
private long total;
private List<FileInfoDTO> records = new ArrayList<>();
}

View File

@ -2,6 +2,7 @@ package com.electromagnetic.industry.software.manage.pojo.resp;
import lombok.Data; import lombok.Data;
import java.util.ArrayList;
import java.util.List; import java.util.List;
@Data @Data
@ -12,6 +13,6 @@ public class ProjectVO {
private String parentId; private String parentId;
private int sort; private int sort;
private List<ProjectVO> children; private List<ProjectVO> children = new ArrayList<>();
} }

View File

@ -1,81 +1,49 @@
package com.electromagnetic.industry.software.manage.service; package com.electromagnetic.industry.software.manage.service;
import com.electromagnetic.industry.software.common.resp.ElectromagneticResult; import com.electromagnetic.industry.software.common.resp.ElectromagneticResult;
import com.electromagnetic.industry.software.manage.pojo.req.FolderResortDTO; import com.electromagnetic.industry.software.manage.pojo.req.FileInfoQueryDTO;
import org.springframework.core.io.InputStreamResource;
import org.springframework.http.ResponseEntity;
import java.util.List; import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public interface EdFileInfoService { public interface EdFileInfoService {
/** /**
* 创建一个新的工程 * 查询文件列表
* @param prjName 新的工程名 * @param fileInfoQueryDTO
*/
ElectromagneticResult<?> createNewPrj(String prjName);
/**
* 修改项目名称
* @param prjId
* @param newPrjName
* @return * @return
*/ */
ElectromagneticResult<?> modifyPrjName(String prjId, String newPrjName); ElectromagneticResult<?> queryEdFileInfo(FileInfoQueryDTO fileInfoQueryDTO);
/** /**
* 删除一个项目做逻辑删除 * 新建文件夹
* @param prjId
* @return
*/
ElectromagneticResult<?> delete(String prjId);
/**
* 添加子集
* @param parentId * @param parentId
* @param folderName
* @return
*/
ElectromagneticResult<?> addFolder(String parentId, String folderName);
/**
* 查询所有项目
* @return
*/
ElectromagneticResult<?> queryAllPrjInfo();
/**
* 子集拖拽重排序
* @param folderResortDTOList
* @return
*/
ElectromagneticResult<?> folderResort(List<FolderResortDTO> folderResortDTOList);
/**
* 项目发布
* @param prjId
* @return
*/
ElectromagneticResult<?> publish(String prjId);
/**
* 删除子集
* @param fileId
* @return
*/
ElectromagneticResult<?> deleteFolder(String fileId);
/**
* 层级沿用
* @param sourceId
* @param targetId
* @return
*/
ElectromagneticResult<?> follow(String sourceId, String targetId);
/**
* 修改子集名称
* @param id
* @param newFolderName * @param newFolderName
* @return * @return
*/ */
ElectromagneticResult<?> modifyFolder(String id, String newFolderName); ElectromagneticResult<?> createFolder(String parentId, String newFolderName);
/**
* 项目层级结构查询
* @return
*/
ElectromagneticResult<?> tree();
/**
* 删除目录
*
* @param id
* @param dataType
* @return
*/
ElectromagneticResult<?> deleteFolder(String id, Integer dataType);
/**
* 下载文件
* @param id
* @return
*/
ResponseEntity<InputStreamResource> download(String id, HttpServletResponse response);
} }

View File

@ -0,0 +1,92 @@
package com.electromagnetic.industry.software.manage.service;
import com.electromagnetic.industry.software.common.resp.ElectromagneticResult;
import com.electromagnetic.industry.software.manage.pojo.req.FolderResortDTO;
import java.util.List;
public interface EdPrjService {
/**
* 创建一个新的工程
*
* @param prjName 新的工程名
*/
ElectromagneticResult<?> createNewPrj(String prjName);
/**
* 修改项目名称
*
* @param prjId
* @param newPrjName
* @return
*/
ElectromagneticResult<?> modifyPrjName(String prjId, String newPrjName);
/**
* 删除一个项目做逻辑删除
*
* @param prjId
* @return
*/
ElectromagneticResult<?> delete(String prjId);
/**
* 添加子集
*
* @param parentId
* @param folderName
* @return
*/
ElectromagneticResult<?> addFolder(String parentId, String folderName);
/**
* 查询所有项目
*
* @return
*/
ElectromagneticResult<?> queryAllPrjInfo();
/**
* 子集拖拽重排序
*
* @param folderResortDTOList
* @return
*/
ElectromagneticResult<?> folderResort(List<FolderResortDTO> folderResortDTOList);
/**
* 项目发布
*
* @param prjId
* @return
*/
ElectromagneticResult<?> publish(String prjId);
/**
* 删除子集
*
* @param fileId
* @param parentId
* @return
*/
ElectromagneticResult<?> deleteFolder(String fileId, String parentId);
/**
* 层级沿用
*
* @param sourceId
* @param targetId
* @return
*/
ElectromagneticResult<?> follow(String sourceId, String targetId);
/**
* 修改子集名称
*
* @param id
* @param newFolderName
* @return
*/
ElectromagneticResult<?> modifyFolder(String id, String newFolderName, String parentId);
}

View File

@ -7,11 +7,12 @@ public interface PermissionService {
/** /**
* 查询当前用户在当前目录的功能权限 * 查询当前用户在当前目录的功能权限
*
* @param userId * @param userId
* @param fileId * @param fileId
* @return * @return
*/ */
Map<String,Boolean> getUserPermission(String userId, String fileId); Map<String, Boolean> getUserPermission(String userId, String fileId);
/** /**
* 获取当前用户有权限访问的目录id * 获取当前用户有权限访问的目录id

View File

@ -0,0 +1,297 @@
package com.electromagnetic.industry.software.manage.service.serviceimpl;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.lang.Assert;
import cn.hutool.core.lang.tree.Tree;
import cn.hutool.core.lang.tree.TreeNodeConfig;
import cn.hutool.core.lang.tree.TreeUtil;
import cn.hutool.core.text.StrFormatter;
import cn.hutool.json.JSONUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.electromagnetic.industry.software.common.enums.EffectFlagEnum;
import com.electromagnetic.industry.software.common.enums.EleDataSaveStatusEnum;
import com.electromagnetic.industry.software.common.enums.EleDataStatusEnum;
import com.electromagnetic.industry.software.common.enums.EleDataTypeEnum;
import com.electromagnetic.industry.software.common.exception.BizException;
import com.electromagnetic.industry.software.common.resp.ElectromagneticResult;
import com.electromagnetic.industry.software.common.util.EleCommonUtil;
import com.electromagnetic.industry.software.common.util.EleLog;
import com.electromagnetic.industry.software.common.util.ElectromagneticResultUtil;
import com.electromagnetic.industry.software.common.util.UserThreadLocal;
import com.electromagnetic.industry.software.manage.mapper.EdFileInfoMapper;
import com.electromagnetic.industry.software.manage.pojo.models.EdFileInfo;
import com.electromagnetic.industry.software.manage.pojo.resp.ProjectVO;
import com.electromagnetic.industry.software.manage.service.FileSystemService;
import lombok.Getter;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.core.env.Environment;
import org.springframework.stereotype.Component;
import javax.annotation.PostConstruct;
import javax.annotation.Resource;
import java.io.File;
import java.util.*;
import java.util.stream.Collectors;
import static com.electromagnetic.industry.software.common.cons.ElectromagneticConstants.*;
@Component
public class CommonService {
private final EleLog log = new EleLog(CommonService.class);
private static final Map<String, String> FILE_TYPE_ENUM = new HashMap<>();
@Value("${prj.folder.max.length}")
private int prjFolderMaxLength;
static {
FILE_TYPE_ENUM.put(EleDataTypeEnum.FOLDER.desc, "01");
FILE_TYPE_ENUM.put("py", "02");
FILE_TYPE_ENUM.put("zip", "03");
FILE_TYPE_ENUM.put("jpg", "04");
FILE_TYPE_ENUM.put("jpeg", "05");
FILE_TYPE_ENUM.put("png", "06");
FILE_TYPE_ENUM.put("gif", "07");
FILE_TYPE_ENUM.put("bmp", "08");
FILE_TYPE_ENUM.put("tif", "09");
FILE_TYPE_ENUM.put("tiff", "10");
FILE_TYPE_ENUM.put("svg", "11");
FILE_TYPE_ENUM.put("psd", "12");
FILE_TYPE_ENUM.put("pdf", "13");
FILE_TYPE_ENUM.put("doc", "14");
FILE_TYPE_ENUM.put("docx", "15");
FILE_TYPE_ENUM.put("xls", "16");
FILE_TYPE_ENUM.put("xlsx", "17");
FILE_TYPE_ENUM.put("ppt", "18");
FILE_TYPE_ENUM.put("pptx", "19");
}
@Getter
private String eleDataPath;
@Resource
private Environment environment;
@Resource
private EdFileInfoMapper edFileInfoMapper;
@Resource
private FileSystemService fileSystemService;
@PostConstruct
public void init() {
String osName = System.getProperty("os.name").toLowerCase();
eleDataPath = osName.startsWith("win") ? environment.getProperty("data.windows.path") : environment.getProperty("data.linux.path");
}
/**
* 检查同层级是否有同名的文件夹
*/
public boolean checkSameFolder(String parentId, String newFolderName) {
Long count = edFileInfoMapper.selectCount(Wrappers.lambdaQuery(EdFileInfo.class)
.eq(EdFileInfo::getParentId, parentId)
.eq(EdFileInfo::getFileName, newFolderName));
return count > 0;
}
public String getFileSysPath(String dbPath) {
ArrayList<String> paths = CollUtil.newArrayList(dbPath.split(MYSQL_FILE_PATH_SPLIT));
String path = getPath(paths);
return eleDataPath + File.separator + path;
}
public String getPath(List<String> ids) {
LambdaQueryWrapper<EdFileInfo> queryWrapper = Wrappers.lambdaQuery(EdFileInfo.class)
.select(EdFileInfo::getId, EdFileInfo::getFileName)
.in(EdFileInfo::getId, ids);
List<EdFileInfo> edFileInfos = edFileInfoMapper.selectList(queryWrapper);
Map<String, String> map = edFileInfos.stream().collect(Collectors.toMap(EdFileInfo::getId, EdFileInfo::getFileName));
StringBuilder path = new StringBuilder();
for (String id : ids) {
String tmp = map.get(id) + File.separator;
path.append(tmp);
}
return path.toString();
}
public String createFileCode(String parentId, String fileType, int version, String timeStr) {
return parentId + FILE_TYPE_ENUM.get(fileType) + version + timeStr;
}
public List<EdFileInfo> selectAllAdminFolder(String id) {
return edFileInfoMapper.selectList(Wrappers.lambdaQuery(EdFileInfo.class)
.eq(EdFileInfo::getEffectFlag, EffectFlagEnum.EFFECT.code)
.eq(EdFileInfo::getDataType, EleDataTypeEnum.FOLDER.code)
.eq(EdFileInfo::getPrjDir, true)
.likeRight(EdFileInfo::getFilePath, id));
}
public ElectromagneticResult<?> addFolder(String parentId, String folderName, boolean maxLengthCheck, boolean isPrjDir) {
// 验证名称是否合法
Assert.isTrue(EleCommonUtil.isFileNameValid(folderName), "文件名不符合规范只能包含中文字符、下划线、连字符、加号、数字和英文字符且长度小于32。");
if (!EleCommonUtil.isFileNameValid(folderName)) {
String info = StrFormatter.format("子集名称{}不符合要求", folderName);
log.error(info);
return ElectromagneticResultUtil.fail("-1", info);
}
LambdaQueryWrapper<EdFileInfo> queryWrapper = Wrappers.lambdaQuery(EdFileInfo.class)
.select(EdFileInfo::getId, EdFileInfo::getFilePath)
.eq(EdFileInfo::getId, parentId);
EdFileInfo edFileInfo = edFileInfoMapper.selectOne(queryWrapper);
String currentPath = edFileInfo.getFilePath();
List<String> paths = CollUtil.newArrayList(edFileInfo.getFilePath().split(MYSQL_FILE_PATH_SPLIT));
if (maxLengthCheck) {
if (paths.size() >= prjFolderMaxLength) {
String info = "当前子集已达到最大层级,禁止创建子集。";
log.error(info);
return ElectromagneticResultUtil.fail("-1", info);
}
}
// 判断文件夹名称是否存在
List<EdFileInfo> edFileInfos = edFileInfoMapper.selectList(Wrappers.lambdaQuery(EdFileInfo.class)
.select(EdFileInfo::getId, EdFileInfo::getFileName)
.eq(EdFileInfo::getParentId, parentId));
List<String> names = edFileInfos.stream().map(EdFileInfo::getFileName).collect(Collectors.toList());
if (names.contains(folderName)) {
String info = "该子集名称已存在";
log.error(info);
return ElectromagneticResultUtil.fail("-1", info);
}
try {
int id = Integer.parseInt(edFileInfoMapper.maxPrjId());
Date now = new Date();
String currentUserId = UserThreadLocal.getUserId();
String newFolderId = String.valueOf(id + 1);
String path = currentPath + MYSQL_FILE_PATH_SPLIT + newFolderId;
EdFileInfo fileInfo = new EdFileInfo();
String nowTimeStr = EleCommonUtil.getNowTimeStr();
fileInfo.setId(newFolderId)
.setFileId(newFolderId)
.setFileName(folderName)
.setFileVersion(FILE_START_VERSION)
.setParentId(parentId)
.setFileCode(createFileCode(parentId, EleDataTypeEnum.FOLDER.desc, FILE_START_VERSION, nowTimeStr))
.setFileTime(nowTimeStr)
.setPrjDir(isPrjDir)
.setDataType(EleDataTypeEnum.FOLDER.code)
.setDataStatus(EleDataStatusEnum.NOT_PUBLISHED.code)
.setEffectFlag(EffectFlagEnum.EFFECT.code)
.setSaveStatus(EleDataSaveStatusEnum.SUCCESS.code)
.setFilePath(path)
.setSort(names.size() + 1)
.setCreatedTime(now)
.setUpdateTime(now)
.setCreatedBy(currentUserId)
.setUpdatedBy(currentUserId);
edFileInfoMapper.insert(fileInfo);
// 保存到文件系统
String targetFilePath = getEleDataPath() + File.separator + getPath(paths) + File.separator + folderName;
fileSystemService.createDirectory(targetFilePath);
return ElectromagneticResultUtil.success(true);
} catch (Exception e) {
String info = "添加子集失败";
log.error(info, e);
throw new BizException(-1, info);
}
}
public ElectromagneticResult<?> queryAllPrjInfo() {
try {
LambdaQueryWrapper<EdFileInfo> queryWrapper = Wrappers.lambdaQuery(EdFileInfo.class)
.select(EdFileInfo::getId)
.eq(EdFileInfo::getParentId, PRJ_PARENT_ID)
.eq(EdFileInfo::getEffectFlag, EffectFlagEnum.EFFECT.code);
List<String> ids = edFileInfoMapper.selectList(queryWrapper).stream().map(EdFileInfo::getId).collect(Collectors.toList());
List<ProjectVO> projectVOS = new ArrayList<>();
for (String id : ids) {
List<EdFileInfo> edFileInfos = selectAllAdminFolder(id);
// 转换为树
TreeNodeConfig config = new TreeNodeConfig();
config.setIdKey(EdFileInfo.Fields.id);
config.setParentIdKey(EdFileInfo.Fields.parentId);
config.setWeightKey(EdFileInfo.Fields.sort);
List<Tree<String>> trees = TreeUtil.build(edFileInfos, PRJ_PARENT_ID, config, ((obj, treeNode) -> {
treeNode.putExtra(EdFileInfo.Fields.id, obj.getId());
treeNode.putExtra(EdFileInfo.Fields.parentId, obj.getParentId());
treeNode.putExtra(EdFileInfo.Fields.sort, obj.getSort());
treeNode.putExtra(EdFileInfo.Fields.fileName, obj.getFileName());
}));
String jsonStr = JSONUtil.toJsonStr(trees);
ProjectVO projectVO = JSONUtil.toList(jsonStr, ProjectVO.class).get(0);
projectVOS.add(projectVO);
}
return ElectromagneticResultUtil.success(projectVOS);
} catch (Exception e) {
String info = "查询项目失败";
log.error(info, e);
throw new BizException(-1, info);
}
}
public ElectromagneticResult<?> deleteFolder(String fileId, String parentId, boolean needResort) {
try {
// TODO 如果文件夹下存在文件不包括文件夹包括已经删除的文件则不允许删除
Long count = edFileInfoMapper.selectCount(Wrappers.lambdaQuery(EdFileInfo.class)
.like(EdFileInfo::getFilePath, MYSQL_FILE_PATH_SPLIT + fileId + MYSQL_FILE_PATH_SPLIT)
.eq(EdFileInfo::getDataType, EleDataTypeEnum.FILE.code));
if (count > 0) {
String info = "禁止删除非空文件夹";
log.info(info);
throw new BizException(-1, info);
}
LambdaQueryWrapper<EdFileInfo> queryWrapper = Wrappers.lambdaQuery(EdFileInfo.class)
.select(EdFileInfo::getId, EdFileInfo::getFilePath)
.like(EdFileInfo::getFilePath, MYSQL_FILE_PATH_SPLIT + fileId + MYSQL_FILE_PATH_SPLIT)
.eq(EdFileInfo::getEffectFlag, EffectFlagEnum.EFFECT.code);
List<EdFileInfo> edFileInfos = edFileInfoMapper.selectList(queryWrapper);
List<String> ids = edFileInfos.stream().map(EdFileInfo::getId).collect(Collectors.toList());
ids.add(fileId);
LambdaUpdateWrapper<EdFileInfo> updateWrapper = Wrappers.lambdaUpdate(EdFileInfo.class)
.set(EdFileInfo::getEffectFlag, EffectFlagEnum.NOT_EFFECTIVE.code)
.set(EdFileInfo::getSort, -1)
.set(EdFileInfo::getUpdateTime, new Date())
.set(EdFileInfo::getUpdatedBy, UserThreadLocal.getUserId())
.in(EdFileInfo::getId, ids);
edFileInfoMapper.update(null, updateWrapper);
if (!needResort) {
return ElectromagneticResultUtil.success(true);
}
// 同层级的resort
List<EdFileInfo> edFileInfos1 = edFileInfoMapper.selectList(Wrappers.lambdaQuery(EdFileInfo.class)
.select(EdFileInfo::getId, EdFileInfo::getSort)
.eq(EdFileInfo::getEffectFlag, EffectFlagEnum.EFFECT.code)
.eq(EdFileInfo::getParentId, parentId)
.orderByAsc(EdFileInfo::getSort));
Date now = new Date();
String currentUserId = UserThreadLocal.getUserId();
for (int i = 0; i < edFileInfos1.size(); i++) {
String id = edFileInfos1.get(i).getId();
edFileInfoMapper.update(null, Wrappers.lambdaUpdate(EdFileInfo.class)
.set(EdFileInfo::getSort, i + 1)
.set(EdFileInfo::getUpdatedBy, currentUserId)
.set(EdFileInfo::getUpdateTime, now)
.eq(EdFileInfo::getId, id));
}
return ElectromagneticResultUtil.success(true);
} catch (Exception e) {
String info = "删除子集异常";
log.error(info, e);
throw new BizException(-1, info);
}
}
}

View File

@ -32,7 +32,6 @@ import com.electromagnetic.industry.software.manage.service.EDDataService;
import com.github.pagehelper.PageHelper; import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo; import com.github.pagehelper.PageInfo;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.core.io.FileSystemResource; import org.springframework.core.io.FileSystemResource;
import org.springframework.core.io.InputStreamResource; import org.springframework.core.io.InputStreamResource;
import org.springframework.http.HttpHeaders; import org.springframework.http.HttpHeaders;
@ -63,25 +62,25 @@ public class EDDataServiceImpl implements EDDataService {
private EDDataMapper edDataMapper; private EDDataMapper edDataMapper;
@Resource @Resource
private CategoryMapper categoryMapper; private CategoryMapper categoryMapper;
// @Value("${data.windows.path}") // @Value("${data.windows.path}")
private String uploadFilePath; private String uploadFilePath;
// @Value("${data.file.storage.dir}") // @Value("${data.file.storage.dir}")
private String fileStorageDir; private String fileStorageDir;
// @Value("${data.import.cache.dir}") // @Value("${data.import.cache.dir}")
private String importCacheDir; private String importCacheDir;
// @Value("${file.encode.passwd}") // @Value("${file.encode.passwd}")
private String encodePasswd; private String encodePasswd;
// @Value("${data.type.folder}") // @Value("${data.type.folder}")
private String dataTypeFolder; private String dataTypeFolder;
// @Value("${data.windows.path}") // @Value("${data.windows.path}")
private String windowsDir; private String windowsDir;
// @Value("${data.file.cache.dir}") // @Value("${data.file.cache.dir}")
private String fileCacheDir; private String fileCacheDir;
// @Value("${data.upload.cache.dir}") // @Value("${data.upload.cache.dir}")
private String uploadCacheDir; private String uploadCacheDir;
// @Value("${data.export.cache.dir}") // @Value("${data.export.cache.dir}")
private String exportCacheDir; private String exportCacheDir;
// @Value("${data.type.file}") // @Value("${data.type.file}")
private String dataTypeFile; private String dataTypeFile;
@Override @Override

View File

@ -1,520 +1,155 @@
package com.electromagnetic.industry.software.manage.service.serviceimpl; package com.electromagnetic.industry.software.manage.service.serviceimpl;
import cn.hutool.core.collection.CollUtil; import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.codec.Base64;
import cn.hutool.core.io.FileUtil;
import cn.hutool.core.lang.Assert; import cn.hutool.core.lang.Assert;
import cn.hutool.core.lang.tree.Tree;
import cn.hutool.core.lang.tree.TreeNodeConfig;
import cn.hutool.core.lang.tree.TreeUtil;
import cn.hutool.core.text.StrFormatter;
import cn.hutool.core.util.StrUtil; import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers; 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.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.electromagnetic.industry.software.common.enums.EffectFlagEnum;
import com.electromagnetic.industry.software.common.enums.EleDataSaveStatusEnum;
import com.electromagnetic.industry.software.common.enums.EleDataStatusEnum;
import com.electromagnetic.industry.software.common.enums.EleDataTypeEnum;
import com.electromagnetic.industry.software.common.exception.BizException; import com.electromagnetic.industry.software.common.exception.BizException;
import com.electromagnetic.industry.software.common.resp.ElectromagneticResult; import com.electromagnetic.industry.software.common.resp.ElectromagneticResult;
import com.electromagnetic.industry.software.common.util.*; import com.electromagnetic.industry.software.common.util.EleLog;
import com.electromagnetic.industry.software.common.util.ElectromagneticResultUtil;
import com.electromagnetic.industry.software.manage.mapper.EdFileInfoMapper; import com.electromagnetic.industry.software.manage.mapper.EdFileInfoMapper;
import com.electromagnetic.industry.software.manage.pojo.models.EdFileInfo; import com.electromagnetic.industry.software.manage.pojo.models.EdFileInfo;
import com.electromagnetic.industry.software.manage.pojo.req.FolderResortDTO; import com.electromagnetic.industry.software.manage.pojo.other.FileInfoDTO;
import com.electromagnetic.industry.software.manage.pojo.resp.ProjectVO; import com.electromagnetic.industry.software.manage.pojo.req.FileInfoQueryDTO;
import com.electromagnetic.industry.software.manage.pojo.resp.FileInfoQueryPageVO;
import com.electromagnetic.industry.software.manage.service.EdFileInfoService; import com.electromagnetic.industry.software.manage.service.EdFileInfoService;
import com.electromagnetic.industry.software.manage.service.FileSystemService; import org.springframework.core.io.FileSystemResource;
import org.springframework.beans.factory.annotation.Value; import org.springframework.core.io.InputStreamResource;
import org.springframework.core.env.Environment; import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import javax.annotation.PostConstruct;
import javax.annotation.Resource; import javax.annotation.Resource;
import java.io.File; import javax.servlet.http.HttpServletResponse;
import java.util.ArrayList; import java.io.IOException;
import java.util.Date; import java.net.BindException;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Objects;
import java.util.stream.Collectors;
import static com.electromagnetic.industry.software.common.cons.ElectromagneticConstants.*;
@Service @Service
public class EdFileInfoServiceImpl extends ServiceImpl<EdFileInfoMapper, EdFileInfo> implements EdFileInfoService { public class EdFileInfoServiceImpl extends ServiceImpl<EdFileInfoMapper, EdFileInfo> implements EdFileInfoService {
@Resource
private CommonService commonService;
private EleLog log = new EleLog(EdFileInfoServiceImpl.class); private EleLog log = new EleLog(EdFileInfoServiceImpl.class);
@Resource
private Environment environment;
@Resource
private FileSystemService fileSystemService;
@Value("${prj.folder.max.length}")
private int prjFolderMaxLength;
private String eleDataPath;
@PostConstruct
public void init() {
String osName = System.getProperty("os.name").toLowerCase();
eleDataPath = osName.startsWith("win") ? environment.getProperty("data.windows.path") : environment.getProperty("data.linux.path");
}
/** /**
* 创建一个新的工程 * 查询文件列表
* @param prjName 新的工程名 * @param fileInfoQueryDTO
*/
@Override
@Transactional(rollbackFor = Exception.class)
public ElectromagneticResult<?> createNewPrj(String prjName) {
Assert.isTrue(EleCommonUtil.isFileNameValid(prjName), "文件名不符合规范只能包含中文字符、下划线、连字符、加号、数字和英文字符且长度小于32。");
if (!EleCommonUtil.isFileNameValid(prjName)) {
String info = StrFormatter.format("工程名称{}不符合要求", prjName);
log.error(info);
return ElectromagneticResultUtil.fail("-1", info);
}
// 首先检查工程是否存在
// TODO 一个项目如果被废除了然后又新建了一个同名工程这种情况怎么处理需要产品确认当前这里先按照同名如果存在则抛出异常处理
LambdaQueryWrapper<EdFileInfo> existPrjWrapper = Wrappers.lambdaQuery(EdFileInfo.class)
.eq(EdFileInfo::getParentId, "")
.isNull(EdFileInfo::getParentId);
List<EdFileInfo> existEdFileInfos = this.baseMapper.selectList(existPrjWrapper);
if (CollUtil.isNotEmpty(existEdFileInfos)) {
String info = StrFormatter.format("{} 已经存在", prjName);
log.info(info);
ElectromagneticResultUtil.fail("-1", "该项目名称已经存在。");
}
try {
// 保存信息到MySQL
int id = Integer.parseInt(this.baseMapper.maxPrjId());
Date now = new Date();
String currentUserId = UserThreadLocal.getUserId();
String newPrjId = String.valueOf(id + 1);
EdFileInfo fileInfo = new EdFileInfo();
fileInfo.setId(newPrjId)
.setFileId(newPrjId)
.setFileName(prjName)
.setFileVersion(100)
.setFileTime(EleCommonUtil.getNowTimeStr())
.setDataType(EleDataTypeEnum.FOLDER.code)
.setDataStatus(EleDataStatusEnum.NOT_PUBLISHED.code)
.setEffectFlag(EffectFlagEnum.EFFECT.code)
.setSaveStatus(EleDataSaveStatusEnum.SUCCESS.code)
.setFilePath(newPrjId)
.setSort(1)
.setCreatedTime(now)
.setUpdateTime(now)
.setCreatedBy(currentUserId)
.setUpdatedBy(currentUserId);
this.save(fileInfo);
// 保存到文件系统
fileSystemService.createDirectory(eleDataPath);
} catch (Exception e) {
String info = StrFormatter.format("文件创建失败,具体为--->{}", e.getMessage());
log.error(info, e);
throw new BizException(-1, info);
}
return ElectromagneticResultUtil.success(true);
}
/**
* 修改项目名称
* @param prjId
* @param newPrjName
* @return * @return
*/ */
@Override @Override
@Transactional(rollbackFor = Exception.class) public ElectromagneticResult<?> queryEdFileInfo(FileInfoQueryDTO fileInfoQueryDTO) {
public ElectromagneticResult<?> modifyPrjName(String prjId, String newPrjName) {
try {
LambdaQueryWrapper<EdFileInfo> queryWrapper = Wrappers.lambdaQuery(EdFileInfo.class).eq(EdFileInfo::getId, prjId);
EdFileInfo fileInfo = this.baseMapper.selectOne(queryWrapper);
String oldPrjName = fileInfo.getFileName();
String newPath = eleDataPath + File.separator + newPrjName;
if (fileSystemService.checkFolderExist(newPath)) {
String info = StrFormatter.format("工程名{}已经存在", newPrjName);
log.error(info);
return ElectromagneticResultUtil.fail("-1", info);
}
fileInfo.setFileName(newPrjName);
this.baseMapper.updateById(fileInfo);
fileSystemService.renameFile(eleDataPath, oldPrjName, newPrjName);
} catch (Exception e) {
String info = StrFormatter.format("修改工程名异常--->{}{}", newPrjName, e.getMessage());
log.error(info, e);
throw new BizException(-1, info);
}
return ElectromagneticResultUtil.success(true);
}
/**
* 删除一个项目做逻辑删除
*
* @param prjId
* @return
*/
@Override
@Transactional(rollbackFor = Exception.class)
public ElectromagneticResult<?> delete(String prjId) {
try {
List<String> ids = new ArrayList<>();
ids.add(prjId);
LambdaQueryWrapper<EdFileInfo> queryWrapper = Wrappers.lambdaQuery(EdFileInfo.class)
.select(EdFileInfo::getId)
.likeRight(EdFileInfo::getFilePath, prjId + MYSQL_FILE_PATH_SPLIT);
List<EdFileInfo> edFileInfos = this.baseMapper.selectList(queryWrapper);
edFileInfos.forEach(e -> ids.add(e.getId()));
Wrappers.lambdaUpdate(EdFileInfo.class).set(EdFileInfo::getEffectFlag, EffectFlagEnum.NOT_EFFECTIVE.code).in(EdFileInfo::getId, ids);
return ElectromagneticResultUtil.success(true);
} catch (Exception e) {
String info = "删除项目失败";
log.error(info, e);
throw new BizException(-1, info);
}
}
/**
* 添加子集
*
* @param parentId
* @param folderName
* @return
*/
@Override
@Transactional(rollbackFor = Exception.class)
public ElectromagneticResult<?> addFolder(String parentId, String folderName) {
// 验证名称是否合法
Assert.isTrue(EleCommonUtil.isFileNameValid(folderName), "文件名不符合规范只能包含中文字符、下划线、连字符、加号、数字和英文字符且长度小于32。");
if (!EleCommonUtil.isFileNameValid(folderName)) {
String info = StrFormatter.format("子集名称{}不符合要求", folderName);
log.error(info);
return ElectromagneticResultUtil.fail("-1", info);
}
// 首先判断判断当前深度是否已经达到6层
LambdaQueryWrapper<EdFileInfo> queryWrapper = Wrappers.lambdaQuery(EdFileInfo.class) LambdaQueryWrapper<EdFileInfo> queryWrapper = Wrappers.lambdaQuery(EdFileInfo.class)
.select(EdFileInfo::getId, EdFileInfo::getFilePath) .select()
.eq(EdFileInfo::getId, parentId); .eq(EdFileInfo::getParentId, fileInfoQueryDTO.getParentId())
EdFileInfo edFileInfo = this.baseMapper.selectOne(queryWrapper); .like(StrUtil.isNotEmpty(fileInfoQueryDTO.getKeyword()), EdFileInfo::getFileName, fileInfoQueryDTO.getKeyword())
String currentPath = edFileInfo.getFilePath(); .like(StrUtil.isNotEmpty(fileInfoQueryDTO.getKeyword()), EdFileInfo::getFileNote, fileInfoQueryDTO.getKeyword())
List<String> paths = CollUtil.newArrayList(edFileInfo.getFilePath().split(MYSQL_FILE_PATH_SPLIT)); .eq(Objects.equals(fileInfoQueryDTO.getFileType(), 0), EdFileInfo::getFileType, 0)
if (paths.size() >= prjFolderMaxLength) { .eq(Objects.equals(fileInfoQueryDTO.getFileType(), 1), EdFileInfo::getFileType, 1)
String info = "当前子集已达到最大层级,禁止创建子集。";
log.error(info);
return ElectromagneticResultUtil.fail("-1", info);
}
// 判断文件夹名称是否存在 .eq(Objects.equals(fileInfoQueryDTO.getDataStatus(), 0), EdFileInfo::getDataStatus, 0)
List<EdFileInfo> edFileInfos = this.baseMapper.selectList(Wrappers.lambdaQuery(EdFileInfo.class) .eq(Objects.equals(fileInfoQueryDTO.getDataStatus(), 1), EdFileInfo::getDataStatus, 1)
.select(EdFileInfo::getId, EdFileInfo::getFileName) .eq(Objects.equals(fileInfoQueryDTO.getDataStatus(), 2), EdFileInfo::getDataStatus, 2)
.eq(EdFileInfo::getParentId, parentId));
List<String> names = edFileInfos.stream().map(EdFileInfo::getFileName).collect(Collectors.toList());
if (names.contains(folderName)) {
String info = "该子集名称已存在";
log.error(info);
return ElectromagneticResultUtil.fail("-1", info);
}
try { .orderByAsc(Objects.equals(fileInfoQueryDTO.getCreatedTime(), 0), EdFileInfo::getCreatedTime)
int id = Integer.parseInt(this.baseMapper.maxPrjId()); .orderByDesc(Objects.equals(fileInfoQueryDTO.getCreatedTime(), 1), EdFileInfo::getCreatedTime)
Date now = new Date();
String currentUserId = UserThreadLocal.getUserId(); .orderByAsc(Objects.equals(fileInfoQueryDTO.getFileVersion(), 0), EdFileInfo::getFileVersion)
String newFolderId = String.valueOf(id + 1); .orderByDesc(Objects.equals(fileInfoQueryDTO.getFileVersion(), 1), EdFileInfo::getFileVersion)
String path = currentPath + MYSQL_FILE_PATH_SPLIT + newFolderId;
EdFileInfo fileInfo = new EdFileInfo(); .orderByAsc(Objects.equals(fileInfoQueryDTO.getFileSize(), 0), EdFileInfo::getFileSize)
fileInfo.setId(newFolderId) .orderByDesc(Objects.equals(fileInfoQueryDTO.getFileSize(), 1), EdFileInfo::getFileSize)
.setFileId(newFolderId)
.setFileName(folderName) .orderByAsc(Objects.equals(fileInfoQueryDTO.getCreatedTime(), 0), EdFileInfo::getCreatedTime)
.setFileVersion(100) .orderByDesc(Objects.equals(fileInfoQueryDTO.getCreatedTime(), 1), EdFileInfo::getCreatedTime);
.setParentId(parentId) Page<EdFileInfo> edFileInfoPage = this.baseMapper.selectPage(new Page<>(fileInfoQueryDTO.getPageNum(), fileInfoQueryDTO.getPageSize()), queryWrapper);
.setFileTime(EleCommonUtil.getNowTimeStr()) long total = edFileInfoPage.getTotal();
.setDataType(EleDataTypeEnum.FOLDER.code) List<FileInfoDTO> records = BeanUtil.copyToList(edFileInfoPage.getRecords(), FileInfoDTO.class);
.setDataStatus(EleDataStatusEnum.NOT_PUBLISHED.code) return ElectromagneticResultUtil.success(new FileInfoQueryPageVO(total, records));
.setEffectFlag(EffectFlagEnum.EFFECT.code)
.setSaveStatus(EleDataSaveStatusEnum.SUCCESS.code)
.setFilePath(path)
.setSort(names.size() + 1)
.setCreatedTime(now)
.setUpdateTime(now)
.setCreatedBy(currentUserId)
.setUpdatedBy(currentUserId);
// 保存到文件系统
String targetFilePath = getPath(paths) + File.separator + folderName;
fileSystemService.createDirectory(targetFilePath);
return ElectromagneticResultUtil.success(true);
} catch (Exception e) {
String info = "添加子集失败";
log.error(info, e);
throw new BizException(-1, info);
}
} }
/** /**
* 查询所有项目 * 新建文件夹
* * @param parentId
* @return
*/
@Override
public ElectromagneticResult<?> queryAllPrjInfo() {
try {
LambdaQueryWrapper<EdFileInfo> queryWrapper = Wrappers.lambdaQuery(EdFileInfo.class)
.select(EdFileInfo::getId)
.eq(EdFileInfo::getParentId, 0)
.eq(EdFileInfo::getEffectFlag, EffectFlagEnum.NOT_EFFECTIVE.code);
List<String> ids = this.baseMapper.selectList(queryWrapper).stream().map(EdFileInfo::getId).collect(Collectors.toList());
List<ProjectVO> projectVOS = new ArrayList<>();
for (String id : ids) {
LambdaQueryWrapper<EdFileInfo> queryWrapper1 = Wrappers.lambdaQuery(EdFileInfo.class)
.select(EdFileInfo::getId, EdFileInfo::getFileName, EdFileInfo::getParentId, EdFileInfo::getSort)
.like(EdFileInfo::getFilePath, MYSQL_FILE_PATH_SPLIT + id + MYSQL_FILE_PATH_SPLIT);
List<EdFileInfo> edFileInfos = this.baseMapper.selectList(queryWrapper1);
// 转换为树
TreeNodeConfig config = new TreeNodeConfig();
config.setIdKey(EdFileInfo.Fields.id);
config.setParentIdKey(EdFileInfo.Fields.parentId);
config.setWeightKey(EdFileInfo.Fields.sort);
List<Tree<String>> trees = TreeUtil.build(edFileInfos, "0", config, ((obj, treeNode) -> {
treeNode.putExtra(EdFileInfo.Fields.id, obj.getId());
treeNode.putExtra(EdFileInfo.Fields.parentId, obj.getParentId());
treeNode.putExtra(EdFileInfo.Fields.sort, obj.getSort());
treeNode.putExtra(EdFileInfo.Fields.fileName, obj.getFileName());
}));
String jsonStr = JSONUtil.toJsonStr(trees);
ProjectVO projectVO = JSONUtil.toList(jsonStr, ProjectVO.class).get(0);
projectVOS.add(projectVO);
}
return ElectromagneticResultUtil.success(projectVOS);
} catch (Exception e) {
String info = "查询项目失败";
log.error(info, e);
throw new BizException(-1, info);
}
}
/**
* 子集拖拽重排序
*
* @param folderResortDTOList
* @return
*/
@Override
@Transactional(rollbackFor = Exception.class)
public ElectromagneticResult<?> folderResort(List<FolderResortDTO> folderResortDTOList) {
try {
for (FolderResortDTO folderResortDTO : folderResortDTOList) {
LambdaUpdateWrapper<EdFileInfo> updateWrapper = Wrappers.lambdaUpdate(EdFileInfo.class)
.set(EdFileInfo::getSort, folderResortDTO.getSort())
.eq(EdFileInfo::getId, folderResortDTO.getId());
this.update(updateWrapper);
}
return ElectromagneticResultUtil.success(true);
} catch (Exception e) {
String info = "子集重排序异常";
log.error(info, e);
throw new BizException(-1, info);
}
}
/**
* 项目发布
*
* @param prjId
* @return
*/
@Override
@Transactional(rollbackFor = Exception.class)
public ElectromagneticResult<?> publish(String prjId) {
try {
LambdaUpdateWrapper<EdFileInfo> updateWrapper = Wrappers.lambdaUpdate(EdFileInfo.class)
.set(EdFileInfo::getDataStatus, EleDataStatusEnum.PUBLISHED.code)
.likeRight(EdFileInfo::getFilePath, prjId);
this.update(updateWrapper);
return ElectromagneticResultUtil.success(true);
} catch (Exception e) {
String info = "项目发布异常";
log.error(info, e);
throw new BizException(-1, info);
}
}
/**
* 删除子集
*
* @param fileId
* @return
*/
@Override
public ElectromagneticResult<?> deleteFolder(String fileId) {
try {
// TODO是否需要判断文件夹是否为空
LambdaQueryWrapper<EdFileInfo> queryWrapper = Wrappers.lambdaQuery(EdFileInfo.class)
.select(EdFileInfo::getId, EdFileInfo::getFilePath)
.like(EdFileInfo::getFilePath, MYSQL_FILE_PATH_SPLIT + fileId + MYSQL_FILE_PATH_SPLIT)
.eq(EdFileInfo::getEffectFlag, EffectFlagEnum.EFFECT.code);
List<EdFileInfo> edFileInfos = this.baseMapper.selectList(queryWrapper);
List<String> ids = edFileInfos.stream().map(EdFileInfo::getId).collect(Collectors.toList());
ids.add(fileId);
LambdaUpdateWrapper<EdFileInfo> updateWrapper = Wrappers.lambdaUpdate(EdFileInfo.class)
.set(EdFileInfo::getEffectFlag, EffectFlagEnum.NOT_EFFECTIVE.code)
.set(EdFileInfo::getSort, -1)
.in(EdFileInfo::getId, ids);
this.baseMapper.update(null, updateWrapper);
String[] tmpFileIds = edFileInfos.get(0).getFilePath().split(MYSQL_FILE_PATH_SPLIT);
String parentId = tmpFileIds[0];
for (String tmpPathId : tmpFileIds) {
parentId = this.baseMapper.maxPrjId();
if (fileId.equals(tmpPathId)) {
break;
}
}
// 同层级的resort
List<EdFileInfo> edFileInfos1 = this.baseMapper.selectList(Wrappers.lambdaQuery(EdFileInfo.class)
.select(EdFileInfo::getId, EdFileInfo::getSort)
.eq(EdFileInfo::getEffectFlag, EffectFlagEnum.EFFECT.code)
.eq(EdFileInfo::getParentId, parentId)
.orderByAsc(EdFileInfo::getSort));
for (int i = 1; i <= edFileInfos1.size(); i++) {
String id = edFileInfos1.get(i).getId();
this.baseMapper.update(null, Wrappers.lambdaUpdate(EdFileInfo.class)
.set(EdFileInfo::getSort, i)
.eq(EdFileInfo::getId, id));
}
return ElectromagneticResultUtil.success(true);
} catch (Exception e) {
String info = "删除子集异常";
log.error(info, e);
throw new BizException(-1, info);
}
}
/**
* 层级沿用
*
* @param sourceId
* @param targetId
* @return
*/
@Override
public ElectromagneticResult<?> follow(String sourceId, String targetId) {
try {
String currentUserId = UserThreadLocal.getUserId();
// 把source工程的层级结构copy到目标工程
// 查找source的全部目录
List<EdFileInfo> sourceEdFileInfos = this.baseMapper.selectAllAdminFolder(sourceId);
List<EdFileInfo> targetEdFileInfos = this.baseMapper.selectAllAdminFolder(targetId);
// 确定层级最大为prjFolderMaxLength层现在逐层来处理
for (int i = 1; i <= prjFolderMaxLength; ++i) {
// 先查找source第i层下有那些子集
final int count = i;
EdFileInfo targetParentFile = targetEdFileInfos.stream()
.filter(e -> StrUtil.count(e.getFilePath(), MYSQL_FILE_PATH_SPLIT) == count - 1)
.collect(Collectors.toList()).get(0);
List<EdFileInfo> sourceTmpEdFiles = sourceEdFileInfos.stream()
.filter(e -> StrUtil.count(e.getFilePath(), MYSQL_FILE_PATH_SPLIT) == count)
.collect(Collectors.toList());
List<EdFileInfo> targetTmpEdFiles = targetEdFileInfos.stream()
.filter(e -> StrUtil.count(e.getFilePath(), MYSQL_FILE_PATH_SPLIT) == count)
.collect(Collectors.toList());
Map<String, EdFileInfo> sourceFileNameMap= sourceTmpEdFiles.stream().collect(Collectors.toMap(EdFileInfo::getFileName, e -> e));
List<String> targetFileNames = targetTmpEdFiles.stream().map(EdFileInfo::getFileName).collect(Collectors.toList());
for (EdFileInfo edFileInfo : sourceTmpEdFiles) {
String sourceFileName = edFileInfo.getFileName();
if (!targetFileNames.contains(sourceFileName)) {
EdFileInfo sourceFile = sourceFileNameMap.get(sourceFileName);
EdFileInfo targetFile = new EdFileInfo();
int maxFolderId = Integer.parseInt(this.baseMapper.maxPrjId());
String newFolderId = String.valueOf(maxFolderId + 1);
Date now = new Date();
targetFile.setId(newFolderId)
.setFileId(newFolderId)
.setFileName(sourceFile.getFileName())
.setFileVersion(100)
.setParentId(targetParentFile.getParentId())
.setFileTime(EleCommonUtil.getNowTimeStr())
.setDataType(EleDataTypeEnum.FOLDER.code)
.setDataStatus(EleDataStatusEnum.NOT_PUBLISHED.code)
.setEffectFlag(EffectFlagEnum.EFFECT.code)
.setSaveStatus(EleDataSaveStatusEnum.SUCCESS.code)
.setFilePath(targetParentFile.getFilePath() + MYSQL_FILE_PATH_SPLIT + newFolderId)
.setSort(targetTmpEdFiles.size() + 1)
.setCreatedTime(now)
.setUpdateTime(now)
.setCreatedBy(currentUserId)
.setUpdatedBy(currentUserId);
this.save(targetFile);
String targetSysFilePath = getSysFilePathByDbPath(targetFile.getFilePath()) + File.separator + sourceFileName;
fileSystemService.createDirectory(targetSysFilePath);
targetEdFileInfos = this.baseMapper.selectAllAdminFolder(targetId);
}
}
}
return ElectromagneticResultUtil.success(true);
} catch (Exception e) {
String info = StrFormatter.format("层级沿用失败");
log.error(info, e);
return ElectromagneticResultUtil.fail("-1", info);
}
}
/**
* 修改子集名称
*
* @param id
* @param newFolderName * @param newFolderName
* @return * @return
*/ */
@Override @Override
public ElectromagneticResult<?> modifyFolder(String id, String newFolderName) { public ElectromagneticResult<?> createFolder(String parentId, String newFolderName) {
return commonService.addFolder(parentId, newFolderName, false, false);
}
/**
* 项目层级结构查询
*
* @return
*/
@Override
public ElectromagneticResult<?> tree() {
return commonService.queryAllPrjInfo();
}
/**
* 删除目录
* @param id
* @param dataType
* @return
*/
@Override
public ElectromagneticResult<?> deleteFolder(String id, Integer dataType) {
Assert.isTrue(dataType == 0 || dataType == 1, "参数错误");
if (dataType == 0) {
return commonService.deleteFolder(id, null, false);
}
this.baseMapper.update(null, Wrappers.lambdaUpdate(EdFileInfo.class)
.set(EdFileInfo::getEffectFlag, false)
.eq(EdFileInfo::getId, id));
return ElectromagneticResultUtil.success(true);
}
/**
* 下载文件
*
* @param id
* @return
*/
@Override
public ResponseEntity<InputStreamResource> download(String id, HttpServletResponse response) {
try { try {
EdFileInfo fileInfo = this.baseMapper.selectOne(Wrappers.lambdaQuery(EdFileInfo.class) EdFileInfo fileInfo = this.baseMapper.selectOne(Wrappers.<EdFileInfo>lambdaQuery().eq(EdFileInfo::getId, id));
.eq(EdFileInfo::getId, id)); String fileSysPath = commonService.getFileSysPath(fileInfo.getFilePath());
String sysFilePath = getSysFilePathByDbPath(fileInfo.getFilePath()); Assert.isTrue(FileUtil.exist(fileSysPath), "下载文件不存在。");
this.baseMapper.update(null, Wrappers.lambdaUpdate(EdFileInfo.class) FileSystemResource fileSystemResource = new FileSystemResource(fileSysPath);
.set(EdFileInfo::getFileName, newFolderName)); HttpHeaders headers = new HttpHeaders();
fileSystemService.renameFile(sysFilePath, newFolderName); headers.add("Cache-Control", "no-cache, no-store, must-revalidate");
return ElectromagneticResultUtil.success(true); headers.add("Pragma", "no-cache");
} catch(Exception e) { headers.add("Expires", "0");
String info = StrFormatter.format("修改子集名称为{}失败", newFolderName); String fileName = Base64.encode(fileSystemResource.getFilename());
response.setHeader("content-disposition","attachment;filename=" + fileName);
// 构建响应实体(可以返回<byte[]或Resource返回类型取决body入参类型)
return ResponseEntity
.ok()
.headers(headers)
.contentLength(fileSystemResource.contentLength())
.contentType(MediaType.parseMediaType("application/octet-stream;charset=UTF-8"))
.body(new InputStreamResource(fileSystemResource.getInputStream()));
} catch (Exception e) {
String info = "下载文件异常";
log.error(info, e); log.error(info, e);
return ElectromagneticResultUtil.fail("-1", info); throw new BizException(-1, info);
} }
} }
private String getSysFilePathByDbPath(String dbPath) {
ArrayList<String> paths = CollUtil.newArrayList(dbPath.split(MYSQL_FILE_PATH_SPLIT));
return getPath(paths);
}
private String getPath(List<String> ids) {
LambdaQueryWrapper<EdFileInfo> queryWrapper = Wrappers.lambdaQuery(EdFileInfo.class)
.select(EdFileInfo::getId, EdFileInfo::getFileName)
.in(EdFileInfo::getId, ids);
List<EdFileInfo> edFileInfos = this.baseMapper.selectList(queryWrapper);
Map<String, String> map = edFileInfos.stream().collect(Collectors.toMap(EdFileInfo::getId, EdFileInfo::getFileName));
StringBuilder path = new StringBuilder();
for (String id : ids) {
String tmp = map.get(id) + File.separator;
path.append(tmp);
}
return path.toString();
}
} }

View File

@ -0,0 +1,387 @@
package com.electromagnetic.industry.software.manage.service.serviceimpl;
import cn.hutool.core.lang.Assert;
import cn.hutool.core.text.StrFormatter;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.electromagnetic.industry.software.common.enums.EffectFlagEnum;
import com.electromagnetic.industry.software.common.enums.EleDataSaveStatusEnum;
import com.electromagnetic.industry.software.common.enums.EleDataStatusEnum;
import com.electromagnetic.industry.software.common.enums.EleDataTypeEnum;
import com.electromagnetic.industry.software.common.exception.BizException;
import com.electromagnetic.industry.software.common.resp.ElectromagneticResult;
import com.electromagnetic.industry.software.common.util.EleCommonUtil;
import com.electromagnetic.industry.software.common.util.EleLog;
import com.electromagnetic.industry.software.common.util.ElectromagneticResultUtil;
import com.electromagnetic.industry.software.common.util.UserThreadLocal;
import com.electromagnetic.industry.software.manage.mapper.EdFileInfoMapper;
import com.electromagnetic.industry.software.manage.pojo.models.EdFileInfo;
import com.electromagnetic.industry.software.manage.pojo.req.FolderResortDTO;
import com.electromagnetic.industry.software.manage.service.EdPrjService;
import com.electromagnetic.industry.software.manage.service.FileSystemService;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource;
import java.io.File;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import static com.electromagnetic.industry.software.common.cons.ElectromagneticConstants.*;
@Service
public class EdPrjServiceImpl extends ServiceImpl<EdFileInfoMapper, EdFileInfo> implements EdPrjService {
private final EleLog log = new EleLog(EdPrjServiceImpl.class);
@Resource
private FileSystemService fileSystemService;
@Value("${prj.folder.max.length}")
private int prjFolderMaxLength;
@Resource
private CommonService commonService;
/**
* 创建一个新的工程
*
* @param prjName 新的工程名
*/
@Override
@Transactional(rollbackFor = Exception.class)
public ElectromagneticResult<?> createNewPrj(String prjName) {
Assert.isTrue(EleCommonUtil.isFileNameValid(prjName), "文件名不符合规范只能包含中文字符、下划线、连字符、加号、数字和英文字符且长度小于32。");
if (!EleCommonUtil.isFileNameValid(prjName)) {
String info = StrFormatter.format("工程名称{}不符合要求", prjName);
log.error(info);
return ElectromagneticResultUtil.fail("-1", info);
}
// 首先检查工程是否存在
// TODO 一个项目如果被废除了然后又新建了一个同名工程这种情况怎么处理需要产品确认当前这里先按照同名如果存在则抛出异常处理
Long count = this.baseMapper.selectCount(Wrappers.lambdaQuery(EdFileInfo.class)
.eq(EdFileInfo::getParentId, PRJ_PARENT_ID)
.eq(EdFileInfo::getFileName, prjName));
if (count > 0) {
String info = StrFormatter.format("{} 已经存在", prjName);
log.info(info);
ElectromagneticResultUtil.fail("-1", "该项目名称已经存在。");
}
try {
// 保存信息到MySQL
String maxPrjId = this.baseMapper.maxPrjId();
int id = Integer.parseInt(StrUtil.isEmpty(maxPrjId) ? "100000" : maxPrjId);
Date now = new Date();
String currentUserId = UserThreadLocal.getUserId();
String newPrjId = String.valueOf(id + 1);
EdFileInfo fileInfo = new EdFileInfo();
String nowTimeStr = EleCommonUtil.getNowTimeStr();
fileInfo.setId(newPrjId)
.setFileId(newPrjId)
.setFileName(prjName)
.setFileVersion(FILE_START_VERSION)
.setParentId(PRJ_PARENT_ID)
.setFileTime(nowTimeStr)
.setPrjDir(true)
.setDataType(EleDataTypeEnum.FOLDER.code)
.setDataStatus(EleDataStatusEnum.NOT_PUBLISHED.code)
.setEffectFlag(EffectFlagEnum.EFFECT.code)
.setSaveStatus(EleDataSaveStatusEnum.SUCCESS.code)
.setFilePath(newPrjId)
.setSort(1)
.setFileCode(commonService.createFileCode(newPrjId, EleDataTypeEnum.FOLDER.desc, FILE_START_VERSION, nowTimeStr))
.setCreatedTime(now)
.setUpdateTime(now)
.setCreatedBy(currentUserId)
.setUpdatedBy(currentUserId);
this.save(fileInfo);
// 保存到文件系统
fileSystemService.createDirectory(commonService.getEleDataPath() + File.separator + prjName);
} catch (Exception e) {
String info = StrFormatter.format("文件创建失败,具体为--->{}", e.getMessage());
log.error(info, e);
throw new BizException(-1, info);
}
return ElectromagneticResultUtil.success(true);
}
/**
* 修改项目名称
* @param prjId
* @param newPrjName
* @return
*/
@Override
@Transactional(rollbackFor = Exception.class)
public ElectromagneticResult<?> modifyPrjName(String prjId, String newPrjName) {
try {
Long count = this.baseMapper.selectCount(Wrappers.lambdaQuery(EdFileInfo.class)
.eq(EdFileInfo::getParentId, PRJ_PARENT_ID)
.eq(EdFileInfo::getFileName, newPrjName));
if (count > 0) {
String info = StrFormatter.format("{} 已经存在", newPrjName);
log.info(info);
ElectromagneticResultUtil.fail("-1", "该项目名称已经存在。");
}
EdFileInfo fileInfo = this.baseMapper.selectOne(Wrappers.lambdaQuery(EdFileInfo.class)
.select(EdFileInfo::getFileName)
.eq(EdFileInfo::getId, prjId));
String oldPrjName = fileInfo.getFileName();
String newPath = commonService.getEleDataPath();
if (fileSystemService.checkFolderExist(newPath)) {
String info = StrFormatter.format("工程名{}已经存在", newPrjName);
log.error(info);
return ElectromagneticResultUtil.fail("-1", info);
}
this.baseMapper.update(null, Wrappers.lambdaUpdate(EdFileInfo.class)
.eq(EdFileInfo::getId, prjId)
.set(EdFileInfo::getFileName, newPrjName)
.set(EdFileInfo::getUpdatedBy, UserThreadLocal.getUserId())
.set(EdFileInfo::getUpdateTime, new Date()));
fileSystemService.renameFile(commonService.getEleDataPath(), oldPrjName, newPrjName);
} catch (Exception e) {
String info = StrFormatter.format("修改工程名异常--->{}{}", newPrjName, e.getMessage());
log.error(info, e);
throw new BizException(-1, info);
}
return ElectromagneticResultUtil.success(true);
}
/**
* 删除一个项目做逻辑删除
* @param prjId
* @return
*/
@Override
@Transactional(rollbackFor = Exception.class)
public ElectromagneticResult<?> delete(String prjId) {
try {
Long count = this.baseMapper.selectCount(Wrappers.lambdaQuery(EdFileInfo.class)
.eq(EdFileInfo::getDataType, EleDataTypeEnum.FILE.code)
.likeRight(EdFileInfo::getFilePath, prjId));
if (count > 0) {
String info = StrFormatter.format("禁止删除非空项目");
log.info(info);
ElectromagneticResultUtil.fail("-1", info);
}
List<String> ids = new ArrayList<>();
ids.add(prjId);
LambdaQueryWrapper<EdFileInfo> queryWrapper = Wrappers.lambdaQuery(EdFileInfo.class)
.select(EdFileInfo::getId)
.likeRight(EdFileInfo::getFilePath, prjId + MYSQL_FILE_PATH_SPLIT);
List<EdFileInfo> edFileInfos = this.baseMapper.selectList(queryWrapper);
edFileInfos.forEach(e -> ids.add(e.getId()));
Wrappers.lambdaUpdate(EdFileInfo.class).set(EdFileInfo::getEffectFlag, EffectFlagEnum.NOT_EFFECTIVE.code).in(EdFileInfo::getId, ids);
return ElectromagneticResultUtil.success(true);
} catch (Exception e) {
String info = "删除项目失败";
log.error(info, e);
throw new BizException(-1, info);
}
}
/**
* 添加子集
*
* @param parentId
* @param folderName
* @return
*/
@Override
@Transactional(rollbackFor = Exception.class)
public ElectromagneticResult<?> addFolder(String parentId, String folderName) {
return commonService.addFolder(parentId, folderName, true, true);
}
/**
* 查询所有项目
*
* @return
*/
@Override
public ElectromagneticResult<?> queryAllPrjInfo() {
return commonService.queryAllPrjInfo();
}
/**
* 子集拖拽重排序
*
* @param folderResortDTOList
* @return
*/
@Override
@Transactional(rollbackFor = Exception.class)
public ElectromagneticResult<?> folderResort(List<FolderResortDTO> folderResortDTOList) {
try {
for (FolderResortDTO folderResortDTO : folderResortDTOList) {
LambdaUpdateWrapper<EdFileInfo> updateWrapper = Wrappers.lambdaUpdate(EdFileInfo.class)
.set(EdFileInfo::getSort, folderResortDTO.getSort())
.eq(EdFileInfo::getId, folderResortDTO.getId());
this.update(updateWrapper);
}
return ElectromagneticResultUtil.success(true);
} catch (Exception e) {
String info = "子集重排序异常";
log.error(info, e);
throw new BizException(-1, info);
}
}
/**
* 项目发布
*
* @param prjId
* @return
*/
@Override
@Transactional(rollbackFor = Exception.class)
public ElectromagneticResult<?> publish(String prjId) {
try {
LambdaUpdateWrapper<EdFileInfo> updateWrapper = Wrappers.lambdaUpdate(EdFileInfo.class)
.set(EdFileInfo::getDataStatus, EleDataStatusEnum.PUBLISHED.code)
.likeRight(EdFileInfo::getFilePath, prjId);
this.update(updateWrapper);
return ElectromagneticResultUtil.success(true);
} catch (Exception e) {
String info = "项目发布异常";
log.error(info, e);
throw new BizException(-1, info);
}
}
/**
* 删除子集
*
* @param fileId
* @param parentId
* @return
*/
@Override
@Transactional(rollbackFor = Exception.class)
public ElectromagneticResult<?> deleteFolder(String fileId, String parentId) {
return commonService.deleteFolder(fileId, parentId, true);
}
/**
* 层级沿用
*
* @param sourceId
* @param targetId
* @return
*/
@Override
public ElectromagneticResult<?> follow(String sourceId, String targetId) {
try {
String currentUserId = UserThreadLocal.getUserId();
// 把source工程的层级结构copy到目标工程
// 查找source的全部目录
List<EdFileInfo> sourceEdFileInfos = commonService.selectAllAdminFolder(sourceId);
List<EdFileInfo> targetEdFileInfos = commonService.selectAllAdminFolder(targetId);
// 确定层级最大为prjFolderMaxLength层现在逐层来处理
for (int i = 1; i <= prjFolderMaxLength; ++i) {
// 先查找source第i层下有那些子集
final int count = i;
EdFileInfo targetParentFile = targetEdFileInfos.stream()
.filter(e -> StrUtil.count(e.getFilePath(), MYSQL_FILE_PATH_SPLIT) == count - 1)
.collect(Collectors.toList()).get(0);
List<EdFileInfo> sourceTmpEdFiles = sourceEdFileInfos.stream()
.filter(e -> StrUtil.count(e.getFilePath(), MYSQL_FILE_PATH_SPLIT) == count)
.collect(Collectors.toList());
List<EdFileInfo> targetTmpEdFiles = targetEdFileInfos.stream()
.filter(e -> StrUtil.count(e.getFilePath(), MYSQL_FILE_PATH_SPLIT) == count)
.collect(Collectors.toList());
Map<String, EdFileInfo> sourceFileNameMap = sourceTmpEdFiles.stream().collect(Collectors.toMap(EdFileInfo::getFileName, e -> e));
List<String> targetFileNames = targetTmpEdFiles.stream().map(EdFileInfo::getFileName).collect(Collectors.toList());
for (EdFileInfo edFileInfo : sourceTmpEdFiles) {
String sourceFileName = edFileInfo.getFileName();
if (!targetFileNames.contains(sourceFileName)) {
EdFileInfo sourceFile = sourceFileNameMap.get(sourceFileName);
EdFileInfo targetFile = new EdFileInfo();
int maxFolderId = Integer.parseInt(this.baseMapper.maxPrjId());
String newFolderId = String.valueOf(maxFolderId + 1);
Date now = new Date();
targetFile.setId(newFolderId)
.setFileId(newFolderId)
.setFileName(sourceFile.getFileName())
.setFileVersion(FILE_START_VERSION)
.setPrjDir(true)
.setParentId(targetParentFile.getParentId())
.setFileTime(EleCommonUtil.getNowTimeStr())
.setDataType(EleDataTypeEnum.FOLDER.code)
.setDataStatus(EleDataStatusEnum.NOT_PUBLISHED.code)
.setEffectFlag(EffectFlagEnum.EFFECT.code)
.setSaveStatus(EleDataSaveStatusEnum.SUCCESS.code)
.setFilePath(targetParentFile.getFilePath() + MYSQL_FILE_PATH_SPLIT + newFolderId)
.setSort(targetTmpEdFiles.size() + 1)
.setCreatedTime(now)
.setUpdateTime(now)
.setCreatedBy(currentUserId)
.setUpdatedBy(currentUserId);
this.save(targetFile);
String targetSysFilePath = commonService.getFileSysPath(targetFile.getFilePath()) + File.separator + sourceFileName;
fileSystemService.createDirectory(targetSysFilePath);
targetEdFileInfos = commonService.selectAllAdminFolder(targetId);
}
}
}
return ElectromagneticResultUtil.success(true);
} catch (Exception e) {
String info = StrFormatter.format("层级沿用失败");
log.error(info, e);
return ElectromagneticResultUtil.fail("-1", info);
}
}
/**
* 修改子集名称
* @param id
* @param newFolderName
* @return
*/
@Override
@Transactional(rollbackFor = Exception.class)
public ElectromagneticResult<?> modifyFolder(String id, String newFolderName, String parentId) {
try {
// 首先检查同层是否有同名目录
if (commonService.checkSameFolder(parentId, newFolderName)) {
String info = "存在同名子集,禁止修改";
log.error(info);
throw new BizException(-1, info);
}
String currentUserId = UserThreadLocal.getUserId();
Date now = new Date();
EdFileInfo fileInfo = this.baseMapper.selectOne(Wrappers.lambdaQuery(EdFileInfo.class)
.eq(EdFileInfo::getId, id));
String sysFilePath = commonService.getFileSysPath(fileInfo.getFilePath());
this.baseMapper.update(null, Wrappers.lambdaUpdate(EdFileInfo.class)
.set(EdFileInfo::getUpdateTime, now)
.set(EdFileInfo::getUpdatedBy, currentUserId)
.eq(EdFileInfo::getId, id)
.set(EdFileInfo::getFileName, newFolderName));
fileSystemService.renameFile(sysFilePath, newFolderName);
return ElectromagneticResultUtil.success(true);
} catch (Exception e) {
String info = StrFormatter.format("修改子集名称为{}失败", newFolderName);
log.error(info, e);
throw new BizException(-1, info);
}
}
}

View File

@ -1,7 +1,6 @@
package com.electromagnetic.industry.software.manage.service.serviceimpl; package com.electromagnetic.industry.software.manage.service.serviceimpl;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import com.electromagnetic.industry.software.common.enums.FilePermission; import com.electromagnetic.industry.software.common.enums.FilePermission;
import com.electromagnetic.industry.software.common.util.UserThreadLocal; import com.electromagnetic.industry.software.common.util.UserThreadLocal;
import com.electromagnetic.industry.software.manage.mapper.RolePermissionMapper; import com.electromagnetic.industry.software.manage.mapper.RolePermissionMapper;
@ -27,13 +26,14 @@ public class PermissionServiceImpl implements PermissionService {
/** /**
* 查询当前用户在当前目录的功能权限 * 查询当前用户在当前目录的功能权限
*
* @param userId * @param userId
* @param fileId * @param fileId
* @return * @return
*/ */
@Override @Override
public Map<String,Boolean> getUserPermission (String userId, String fileId){ public Map<String, Boolean> getUserPermission(String userId, String fileId) {
Map<String,Boolean> result = new HashMap<>(); Map<String, Boolean> result = new HashMap<>();
QueryWrapper<UserRole> queryWrapper = new QueryWrapper<>(); QueryWrapper<UserRole> queryWrapper = new QueryWrapper<>();
queryWrapper.select("role_id").eq("user_id", userId); queryWrapper.select("role_id").eq("user_id", userId);
@ -70,8 +70,8 @@ public class PermissionServiceImpl implements PermissionService {
QueryWrapper<RolePermission> queryWrapper1 = new QueryWrapper<>(); QueryWrapper<RolePermission> queryWrapper1 = new QueryWrapper<>();
queryWrapper1.select("file_id") queryWrapper1.select("file_id")
.in("role_id",roleIds) .in("role_id", roleIds)
.eq("permission_code",FilePermission.VIEW); .eq("permission_code", FilePermission.VIEW);
List<Object> fileIds = rolePermissionMapper.selectObjs(queryWrapper1); List<Object> fileIds = rolePermissionMapper.selectObjs(queryWrapper1);
return fileIds.stream() return fileIds.stream()

View File

@ -2,6 +2,7 @@ package com.electromagnetic.industry.software.manage.service.serviceimpl;
import cn.hutool.core.date.DateTime; import cn.hutool.core.date.DateTime;
import cn.hutool.core.date.SystemClock; import cn.hutool.core.date.SystemClock;
import cn.hutool.core.util.RandomUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.electromagnetic.industry.software.common.cons.UserConstants; import com.electromagnetic.industry.software.common.cons.UserConstants;
import com.electromagnetic.industry.software.common.enums.EffectFlagEnum; import com.electromagnetic.industry.software.common.enums.EffectFlagEnum;
@ -27,14 +28,12 @@ import com.electromagnetic.industry.software.manage.pojo.resp.UserSearchResponse
import com.electromagnetic.industry.software.manage.service.UserService; import com.electromagnetic.industry.software.manage.service.UserService;
import io.jsonwebtoken.Jwts; import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm; import io.jsonwebtoken.SignatureAlgorithm;
import org.apache.commons.lang3.RandomStringUtils;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import javax.annotation.Resource; import javax.annotation.Resource;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Set;
import static cn.hutool.core.date.DateTime.now; import static cn.hutool.core.date.DateTime.now;
@ -120,7 +119,7 @@ public class UserServiceImpl implements UserService {
public ElectromagneticResult<?> createUser(UserRequest userRequest) { public ElectromagneticResult<?> createUser(UserRequest userRequest) {
User user = UserMappers.INSTANCE.getUserRequestToModel(userRequest); User user = UserMappers.INSTANCE.getUserRequestToModel(userRequest);
user.setSalt(RandomStringUtils.randomAlphanumeric(16)); user.setSalt(RandomUtil.randomString(16));
user.setUserId(IdWorker.getSnowFlakeIdString()); user.setUserId(IdWorker.getSnowFlakeIdString());
user.setUserPwd(SignUtils.MD5(UserConstants.DEFAULT_PASSWORD + user.getSalt())); user.setUserPwd(SignUtils.MD5(UserConstants.DEFAULT_PASSWORD + user.getSalt()));
user.setIsPublished(UserConstants.DEFAULT_PUBLISH_STATUS); user.setIsPublished(UserConstants.DEFAULT_PUBLISH_STATUS);
@ -250,7 +249,7 @@ public class UserServiceImpl implements UserService {
public Boolean bindRoles(UserRoleRequest userRolesRequest) { public Boolean bindRoles(UserRoleRequest userRolesRequest) {
String userId = userRolesRequest.getUserId(); String userId = userRolesRequest.getUserId();
List<String> roleIds = userRolesRequest.getRoleIds(); List<String> roleIds = userRolesRequest.getRoleIds();
if (userId == null ) { if (userId == null) {
return Boolean.FALSE; return Boolean.FALSE;
} }
// 删除当前用户原绑定角色 // 删除当前用户原绑定角色

View File

@ -1,17 +1,15 @@
#required #required
spring.application.name=electromagnetic-data spring.application.name=electromagnetic-data
logging.file.path=./logs
loggerPath=electromagnetic-data
spring.datasource.typd=com.alibaba.druid.pool.DruidDataSource spring.datasource.typd=com.alibaba.druid.pool.DruidDataSource
spring.datasource.url=jdbc:mysql://139.224.43.89:3306/em_data?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8&useSSL=true&serverTimezone=GMT%2B8&allowMultiQueries=true&rewriteBatchedStatements=true spring.datasource.url=jdbc:mysql://139.224.43.89:3306/em_data?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8&useSSL=true&serverTimezone=GMT%2B8&allowMultiQueries=true&rewriteBatchedStatements=true
spring.datasource.username=comac spring.datasource.username=comac
spring.datasource.password=2024*Comac spring.datasource.password=2024*Comac
spring.servlet.multipart.max-file-size=500MB
spring.servlet.multipart.max-request-size=10MB
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
mybatis-plus.mapper-locations=classpath:sqlmapper/*.xml mybatis-plus.mapper-locations=classpath:sqlmapper/*.xml
mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
spring.servlet.multipart.max-file-size=500MB
spring.servlet.multipart.max-request-size=10MB
pagehelper.helperDialect=mysql pagehelper.helperDialect=mysql
pagehelper.reasonable=false pagehelper.reasonable=false
server.port=12395 server.port=12395

View File

@ -4,14 +4,8 @@
<mapper namespace="com.electromagnetic.industry.software.manage.mapper.EdFileInfoMapper"> <mapper namespace="com.electromagnetic.industry.software.manage.mapper.EdFileInfoMapper">
<select id="maxPrjId" resultType="java.lang.String"> <select id="maxPrjId" resultType="java.lang.String">
select max(id) from ed_file_info where length(id) = 6 and (parent_id is null or parent_id = "") select max(id)
</select> from ed_file_info
where length(id) = 6
<select id="selectAllAdminFolder"
resultType="com.electromagnetic.industry.software.manage.pojo.models.EdFileInfo">
select id, file_name, parent_id, sort, file_path from ed_file_info where length(id) = 6 and effect_flag = 1 and data_type = 0
</select> </select>
</mapper> </mapper>

View File

@ -6,4 +6,7 @@ public interface ElectromagneticConstants {
String MYSQL_FILE_PATH_SPLIT = "_"; String MYSQL_FILE_PATH_SPLIT = "_";
int FILE_START_VERSION = 100;
String PRJ_PARENT_ID = "0";
} }

View File

@ -1,7 +1,6 @@
package com.electromagnetic.industry.software.common.enums; package com.electromagnetic.industry.software.common.enums;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.Getter;
/** /**
* 是否删除枚举 * 是否删除枚举
@ -19,7 +18,8 @@ public enum EffectFlagEnum {
* 无效 * 无效
*/ */
NOT_EFFECTIVE(0, "无效"); NOT_EFFECTIVE(0, "无效");
public Integer code;
public String desc; public final Integer code;
public final String desc;
} }

View File

@ -9,7 +9,7 @@ public enum EleDataSaveStatusEnum {
SUCCESS(1, "上传成功"), SUCCESS(1, "上传成功"),
FAIL(2, "上传失败"); FAIL(2, "上传失败");
public int code; public final int code;
public String des; public final String des;
} }

View File

@ -9,7 +9,7 @@ public enum EleDataStatusEnum {
PUBLISHED(1, "已发布"), PUBLISHED(1, "已发布"),
OCCUPY(2, "占用"); OCCUPY(2, "占用");
public int code; public final int code;
public String desc; public final String desc;
} }

View File

@ -5,9 +5,9 @@ import lombok.AllArgsConstructor;
@AllArgsConstructor @AllArgsConstructor
public enum EleDataTypeEnum { public enum EleDataTypeEnum {
FILE(0, "文件夹"), FOLDER(0, "folder"),
FOLDER(1, "普通文件"); FILE(1, "file");
public int code; public final int code;
public String desc; public final String desc;
} }

View File

@ -25,16 +25,6 @@ public enum FilePermission {
this.description = description; this.description = description;
} }
// 获取权限代码
public String getCode() {
return code;
}
// 获取权限描述
public String getDescription() {
return description;
}
// 根据 code 查找对应的枚举 // 根据 code 查找对应的枚举
public static FilePermission fromCode(String code) { public static FilePermission fromCode(String code) {
for (FilePermission permission : FilePermission.values()) { for (FilePermission permission : FilePermission.values()) {
@ -53,5 +43,15 @@ public enum FilePermission {
} }
return codes; return codes;
} }
// 获取权限代码
public String getCode() {
return code;
}
// 获取权限描述
public String getDescription() {
return description;
}
} }

View File

@ -15,7 +15,7 @@ public enum PublishEnum {
*/ */
UNPUBLISHED(0, "未发布"), UNPUBLISHED(0, "未发布"),
; ;
private Integer code; private final Integer code;
private String desc; private final String desc;
} }

View File

@ -2,7 +2,7 @@ package com.electromagnetic.industry.software.common.resp;
import java.io.Serializable; import java.io.Serializable;
public class ElectromagneticResult<T> implements Serializable, Result { public class ElectromagneticResult<T> implements Serializable {
private static final long serialVersionUID = -6408526187818056594L; private static final long serialVersionUID = -6408526187818056594L;
/** /**
@ -73,11 +73,6 @@ public class ElectromagneticResult<T> implements Serializable, Result {
this.data = data; this.data = data;
} }
@Override
public Integer getStatus() {
return success ? 1 : 0;
}
/** /**
* Getter method for property <tt>errorCode</tt>. * Getter method for property <tt>errorCode</tt>.
* *
@ -113,12 +108,4 @@ public class ElectromagneticResult<T> implements Serializable, Result {
public void setErrorMessage(String errorMessage) { public void setErrorMessage(String errorMessage) {
this.errorMessage = errorMessage; this.errorMessage = errorMessage;
} }
@Override
public Message getMessage() {
Message msg = new Message(this.getErrorMessage());
//页面展示时防止出现null状况
msg.setCode("");
return msg;
}
} }

View File

@ -1,50 +0,0 @@
package com.electromagnetic.industry.software.common.resp;
public class Message {
/**
* 返回结果码
*/
private String code;
/**
* 返回结果信息
*/
private String message;
/**
* 返回错误明细
*/
private ErrorContext errorContext;
public Message(String messageStr) {
this.message = messageStr;
}
public String getCode() {
return code;
}
public Message setCode(String code) {
this.code = code;
return this;
}
public String getMessage() {
return message;
}
@Override
public String toString() {
StringBuilder builder = new StringBuilder();
builder.append("code = ");
builder.append(code);
builder.append(", message = ");
builder.append(message);
builder.append(", ");
builder.append("BaseResult [");
builder.append("errorContext=");
builder.append(errorContext);
builder.append("]");
return builder.toString();
}
}

View File

@ -1,17 +0,0 @@
package com.electromagnetic.industry.software.common.resp;
public interface Result {
/**
* 返回状态
*
* @return
*/
Integer getStatus();
/**
* 返回消息
*
* @return
*/
Message getMessage();
}

View File

@ -22,6 +22,7 @@ public class EleLog {
public void warn(String msg) { public void warn(String msg) {
logger.warn(msg); logger.warn(msg);
} }
public void error(String msg) { public void error(String msg) {
logger.error(msg); logger.error(msg);
} }