package com.lqkj.link.module.zone.service; import com.lqkj.link.module.authority.repository.UserInfoRepository; import com.lqkj.link.module.zone.domain.ModelCategory; import com.lqkj.link.module.zone.domain.ModelInfo; import com.lqkj.link.module.zone.repository.ModelCategoryRepository; import com.lqkj.link.module.zone.repository.ModelInfoRepository; import com.lqkj.link.util.Unzipper; import org.apache.commons.compress.archivers.ArchiveException; import org.springframework.data.domain.Page; import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.Pageable; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.UUID; import java.util.stream.Collectors; @Service public class ResourceService { private final ModelCategoryRepository categoryRepository; private final ModelInfoRepository infoRepository; private final UserInfoRepository userInfoRepository; public ResourceService(ModelCategoryRepository categoryRepository, ModelInfoRepository infoRepository, UserInfoRepository userInfoRepository) { this.categoryRepository = categoryRepository; this.infoRepository = infoRepository; this.userInfoRepository = userInfoRepository; } public Page pageQuery(String categoryName, Integer page, Integer pageSize) { Pageable pageable = PageRequest.of(page, pageSize); Page categoryPage = categoryRepository.pageQuery(categoryName, pageable); for (ModelCategory category : categoryPage.getContent()) { category.setModelCount(infoRepository.countWithCategory(category.getCategoryId())); } return categoryPage; } public ModelCategory detail(Integer categoryId) { // modelCategory.setModelInfoList(infoRepository.listWithCategory(categoryId)); return categoryRepository.findById(categoryId).get(); } @Transactional public String save(ModelCategory category) throws IOException, ArchiveException { if ((category.getCategoryId() != null && categoryRepository.hasSameNameWithoutOne(category.getCategoryName(), category.getCategoryId())) || (category.getCategoryId() == null && categoryRepository.hasSameName(category.getCategoryName()))) { return "资源名称不能重复!"; } Boolean uploadCompress = category.getUploadCompress(); category = categoryRepository.save(category); String filePath = category.getCompressFilePath(); if (uploadCompress) { infoRepository.deleteWithCategory(category.getCategoryId()); // Unzipper.unzip("." + filePath, "./upload/resource/" + category.getCategoryId() + "/", false); Unzipper.unZipFiles(new File("." + filePath), "./upload/resource/" + category.getCategoryId() + "/"); Map modelInfoMap = infoRepository .listWithCategory(category.getCategoryId()) .stream() .collect(Collectors.toMap(ModelInfo::getModelName, ModelInfo -> ModelInfo)); String modelFolderPath = "./upload/resource/" + category.getCategoryId() + "/model"; File modelFolder = new File(modelFolderPath); if (modelFolder.isDirectory()) { List list = new ArrayList<>(); File[] models = modelFolder.listFiles(); assert models != null; for (File model : models) { if (model.isFile() && model.getName().endsWith(".fbx")) { String modelFileName = model.getName(); String modelPath = "/upload/resource/" + category.getCategoryId() + "/model/"; if (modelFileName.matches(".*[一-龥]+.*")) { // 如果包含中文,重命名 String newFileName = UUID.randomUUID() + ".fbx"; modelPath += newFileName; boolean rename = model.renameTo(new File("." + modelPath)); System.out.println(rename); // 材质文件也需要重命名 File oldMaterialFile = new File("." + "/upload/resource/" + category.getCategoryId() + "/model/" + modelFileName.replace(".fbx", ".json")); if (oldMaterialFile.exists()) { File newMaterialFile = new File("." + "/upload/resource/" + category.getCategoryId() + "/model/" + newFileName.replace(".fbx", ".json")); rename = oldMaterialFile.renameTo(newMaterialFile); System.out.println(rename); } // 模型图标也许要重命名 File oldIconFile = new File("." + "/upload/resource/" + category.getCategoryId() + "/icon/" + modelFileName.replace(".fbx", ".png")); if (oldIconFile.exists()) { File newIconFile = new File("." + "/upload/resource/" + category.getCategoryId() + "/icon/" + newFileName.replace(".fbx", ".png")); rename = oldIconFile.renameTo(newIconFile); System.out.println(rename); } } else { modelPath += modelFileName; } if (!modelInfoMap.containsKey(modelFileName.substring(0, modelFileName.lastIndexOf(".")))) { list.add(new ModelInfo(null, category.getCategoryId(), modelFileName.substring(0, modelFileName.lastIndexOf(".")), null, null, null, modelPath, modelPath.replace("model", "icon").replace("fbx", "png"), null, null)); } else { ModelInfo modelInfo = modelInfoMap.get(modelFileName.substring(0, modelFileName.lastIndexOf("."))); modelInfo.setOriginalPath(modelPath); modelInfo.setModelIcon(modelPath.replace("model", "icon").replace("fbx", "png")); modelInfo.setJsonPath(null); modelInfo.setTexturePath(null); list.add(modelInfo); modelInfoMap.remove(modelFileName.substring(0, modelFileName.lastIndexOf("."))); } } } infoRepository.saveAll(list); List deleteList = modelInfoMap .values() .stream() .map(ModelInfo::getModelId) .toList(); infoRepository.deleteAllByIdInBatch(deleteList); } } // 更新用户资源刷新状态 userInfoRepository.updateRefreshStatus(); return null; } public void deleteModel(Integer modelId) { infoRepository.deleteById(modelId); } @Transactional public void deleteCategory(List categoryId) { categoryRepository.deleteAllByIdInBatch(categoryId); // 更新用户资源刷新状态 userInfoRepository.updateRefreshStatus(); } public List> resourceCategory(String userCode) { return categoryRepository.queryWithUserCode(userCode); } public List models(String userCode) { return infoRepository.listWitUserCode(userCode); } public String savePersonal(ModelCategory modelCategory, String userCode) { if (modelCategory.getCategoryId() == 0) { modelCategory.setCategoryId(null); } Integer userId = userInfoRepository.findByUserCode(userCode).getUserId(); if ((modelCategory.getCategoryId() != null && categoryRepository.hasSameNameByUserWithoutOne(modelCategory.getCategoryName(), modelCategory.getCategoryId(), userId)) || (modelCategory.getCategoryId() == null && categoryRepository.hasSameNameByUser(modelCategory.getCategoryName(), userId))) { return "不能与已有文件夹重名!"; } modelCategory.setUserId(userId); categoryRepository.save(modelCategory); return null; } public void saveModel(ModelInfo modelInfo) { infoRepository.save(modelInfo); } }