package org.springblade.mdm.gkw.programnode.service; import com.baomidou.mybatisplus.core.metadata.IPage; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.codec.digest.DigestUtils; import org.apache.commons.io.FileUtils; import org.apache.commons.lang3.StringUtils; import org.springblade.core.log.exception.ServiceException; import org.springblade.core.mp.base.BizServiceImpl; import org.springblade.core.mp.support.Condition; import org.springblade.core.tool.utils.Charsets; import org.springblade.core.tool.utils.Func; import org.springblade.mdm.basesetting.machine.MachineService; import org.springblade.mdm.basesetting.machine.entity.Machine; import org.springblade.mdm.gkw.programnode.entity.MachineFile; import org.springblade.mdm.gkw.programnode.mapper.MachineFileMapper; import org.springblade.mdm.machineback.vo.MachineBackFileQueryVO; import org.springblade.mdm.machineback.vo.MachineBackFileVO; import org.springblade.mdm.utils.FileContentUtil; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.io.File; import java.io.IOException; import java.io.InputStream; import java.nio.charset.Charset; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.util.List; /** * 机床文件 * * @author yangys */ @Slf4j @Service @AllArgsConstructor public class MachineFileService extends BizServiceImpl { private final MachineService machineService; /** * 检测文件是否存在 * @param name 文件名 * @param md5 文件md5 * @param machineCode 所属机床 * @return 是否存在于库内 */ public boolean fileExists(String name, String md5,String machineCode) { return this.lambdaQuery().eq(MachineFile::getName, name).eq(MachineFile::getMd5, md5).eq(MachineFile::getMachineCode, machineCode).count()>0; } @Transactional(readOnly = true) public String getMachineFileContent(Long id) { MachineFile machineFile = getById(id); Machine machine = machineService.getByCode(machineFile.getMachineCode()); String filePathStr = getBasePath(machine,machineFile.getDirType())+ File.separator+machineFile.getName(); String content; Path filePath = Paths.get(filePathStr); if(!filePath.toFile().exists()){ return StringUtils.EMPTY; } try (InputStream inputStream = Files.newInputStream(filePath)) { // 使用输入流读取文件内容 content = FileContentUtil.getContentFromStream(inputStream); } catch (IOException e) { log.error("读取文件md5失败",e); return StringUtils.EMPTY; } return content; } /** * 获取基本路径 * @param machine * @param dirType * @return */ public static String getBasePath(Machine machine,String dirType){ String dirPath; switch (dirType) { case MachineFile.DIR_TYPE_REC: dirPath = machine.getProgReceiveDir(); break; case MachineFile.DIR_TYPE_SEND: dirPath = machine.getProgSendDir(); break; case MachineFile.DIR_TYPE_TEMP: dirPath = machine.getProgTempDir(); break; default: log.warn("目录类型不匹配:{}",dirType); return null;//不符合任何类型,直接退出 } return dirPath; } @Transactional public void saveFileConent(Long id, String content) throws IOException { MachineFile machineFile = getById(id); Machine machine = machineService.getByCode(machineFile.getMachineCode()); String filePathStr = getBasePath(machine,machineFile.getDirType())+ File.separator+machineFile.getName(); Path filePath = Paths.get(filePathStr); String charsetName = "UTF-8"; try (InputStream inputStream = Files.newInputStream(filePath)) { // 使用输入流读取文件内容 charsetName = FileContentUtil.detectFromInputStream(inputStream); } catch (IOException e) { log.error("读取文件编码失败",e); throw new ServiceException("获取文件编码失败"); } FileUtils.writeStringToFile(filePath.toFile(),content,charsetName); } @Transactional(readOnly = true) public IPage machineBackFilePageQuery(MachineBackFileQueryVO query) { return this.baseMapper.machineBackFilePageQuery(Condition.getPage(query),query); } }