package com.qianwen.smartman.modules.visual.utils; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.time.LocalDateTime; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.Optional; import java.util.regex.Matcher; import java.util.regex.Pattern; import java.util.stream.Collectors; import java.util.stream.Stream; import org.apache.commons.lang3.StringUtils; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.toolkit.IdWorker; import com.qianwen.core.oss.OssTemplate; import com.qianwen.core.oss.enums.OssStatusEnum; import com.qianwen.core.oss.model.BladeFile; import com.qianwen.core.tool.utils.SpringUtil; import com.qianwen.smartman.common.utils.Lambda; import com.qianwen.smartman.common.utils.SimpleHttpClient; import com.qianwen.smartman.modules.resource.builder.oss.OssBuilder; import com.qianwen.smartman.modules.resource.service.IOssService; import com.qianwen.smartman.modules.visual.dto.VisualDTO; import com.qianwen.smartman.modules.visual.dto.VisualTimeDTO; import com.qianwen.smartman.modules.visual.entity.Visual; import com.qianwen.smartman.modules.visual.entity.VisualConfig; import cn.hutool.core.io.FileUtil; import cn.hutool.core.util.ZipUtil; public class VisualUtils { private static final IOssService ossService = (IOssService) SpringUtil.getBean(IOssService.class); /** * 根据level(小时数)获取起止时间 * @param level 小时数 * @return 包含起止时间对象 */ public static VisualTimeDTO getTimeSectionByLevel(String level) { LocalDateTime now = LocalDateTime.now(); LocalDateTime startTime = now.minusHours(Long.parseLong(level)); LocalDateTime endTime = LocalDateTime.of(now.getYear(), now.getMonth(), now.getDayOfMonth(), now.getHour(), 59, 59, 999999999); return VisualTimeDTO.builder().startTime(startTime).endTime(endTime).build(); } public static VisualTimeDTO getTimeSectionDayByLevel(String level) { LocalDateTime now = LocalDateTime.now(); LocalDateTime localDateTime = now.minusDays(Long.parseLong(level)); LocalDateTime startTime = LocalDateTime.of(localDateTime.getYear(), localDateTime.getMonth(), localDateTime.getDayOfMonth(), localDateTime.getHour(), 0, 0); LocalDateTime endTime = LocalDateTime.of(now.getYear(), now.getMonth(), now.getDayOfMonth(), now.getHour() + 1, 0, 0); return VisualTimeDTO.builder().startTime(startTime).endTime(endTime).build(); } public static OssTemplate getOssTemplate() { OssBuilder ossBuilder = (OssBuilder) SpringUtil.getBean(OssBuilder.class); return ossBuilder.visualTemplate(); } public static List uploadToOss(File... imageFiles) { OssTemplate template = getOssTemplate(); List bladeFiles = Arrays.asList(imageFiles).parallelStream().map(item -> { try { FileInputStream inputStream = new FileInputStream(item); BladeFile bladeFile = template.putFile(item.getName(), inputStream); inputStream.close(); return bladeFile; } catch (FileNotFoundException e) { e.printStackTrace(); return null; } catch (IOException e2) { e2.printStackTrace(); return null; } }).collect(Collectors.toList()); return bladeFiles; } public static String[] replaceImageURL(List files, String... jsFilesText) { String[] replaceText = (String[]) Arrays.asList(jsFilesText).parallelStream().map(text -> { return replaceImageURL(text, files); }).toArray(xx -> { return new String[xx]; }); return replaceText; } public static String replaceImageURL(final String text, List files) { List urls = getTextImageUrls(text); String[] result = {text}; urls.stream().filter(url -> { return url != null; }).forEach(url2 -> { BladeFile bladeFile = (BladeFile) files.stream().filter(file -> { return url2.indexOf(file.getOriginalName()) != -1; }).findFirst().orElse(null); Optional.ofNullable(bladeFile).ifPresent(file2 -> { result[0] = result[0].replaceAll(url2, bladeFile.getName()); }); }); return result[0]; } public static List createVisualDTO(Integer category, String... replaceText) { List visualDTOS = Arrays.asList(replaceText).parallelStream().map(item -> { String textItem = item.replace("const option =", ""); JSONObject jsonObject = JSONObject.parseObject(textItem); JSONObject detail = jsonObject.getJSONObject("detail"); JSONObject visual = jsonObject.getJSONObject("visual"); JSONArray component = jsonObject.getJSONArray("component"); component.forEach(com -> { JSONObject comp = (JSONObject) com; if (comp != null) { comp.put("dataType", 0); } }); Visual resultVisual = new Visual(); if (visual != null) { resultVisual.setTitle(visual.getString("title")); resultVisual.setCategory(category); resultVisual.setBackgroundUrl(visual.getString("backgroundUrl")); } else { resultVisual.setTitle(IdWorker.getTimeId()); resultVisual.setCategory(category); resultVisual.setBackgroundUrl(detail.getString("backgroundImage")); } resultVisual.setStatus(1); VisualDTO visualDTO = new VisualDTO(); visualDTO.setVisual(resultVisual); VisualConfig visualConfig = new VisualConfig(); visualConfig.setDetail(detail.toJSONString()); visualConfig.setComponent(component.toJSONString()); visualDTO.setConfig(visualConfig); return visualDTO; }).collect(Collectors.toList()); return visualDTOS; } public static List getTextImageUrls(String... jsText) { String[] regexs = {"(https?|http):\\/\\/[-A-Za-z0-9+&@#/%?=~_|!:,.;]+[-A-Za-z0-9+&@#/%=~_|]", "(\"upload)\\/[-A-Za-z0-9+&@#/%?=~_|!:,.;]+[-A-Za-z0-9+&@#/%=~_|]"}; List array = new ArrayList<>(); Arrays.asList(regexs).parallelStream().forEach(regex -> { Pattern p = Pattern.compile(regex); Arrays.asList(jsText).parallelStream().forEach(text -> { Matcher m = p.matcher(text); while (m.find()) { String text1 = m.group(0); array.add(text1.startsWith("\"") ? text1.substring(1) : text1); } }); }); return array; } public static String getUrlFileName(String url, String suffixes) { Pattern pat = Pattern.compile("[\\w]+[\\.](" + suffixes + ")"); Matcher mc = pat.matcher(url); if (mc.find()) { String name = mc.group(); return name; } return null; } public static File visualDownload(String... details) { String base = "static/visual/" + IdWorker.get32UUID(); File dir = new File(base); dir.mkdirs(); List urls = getTextImageUrls(details); String host = (String) Optional.ofNullable(ossService.getOne(Lambda.eq((v0) -> { return v0.getStatus(); }, Integer.valueOf(OssStatusEnum.ENABLE.getNum())))).map((v0) -> { return v0.getEndpoint(); }).orElse(""); urls.parallelStream().forEach(url -> { url = url.startsWith("upload") ? host.concat("/visual/").concat(url) : url; String name = getUrlFileName(url, "jpeg|jpg|png|gif"); if (StringUtils.isNotBlank(name)) { try { SimpleHttpClient.download(url, base + "/images/" + name, 10240); } catch (Exception e) { e.printStackTrace(); } } }); Arrays.asList(details).parallelStream().forEach(text -> { FileUtil.writeString(text, new File(base + "/" + IdWorker.getId() + ".js"), "utf-8"); }); return ZipUtil.zip(dir); } public static String[] visualFileUpload(File[] files) { File imagesDir = Stream.of(files).filter(file -> { return file.isDirectory() && "images".equalsIgnoreCase(file.getName()); }).findFirst().orElse(null); String[] jsFilesText = (String[]) Stream.of(files).filter(file2 -> { return file2.isFile() && file2.getName().endsWith("js"); }).map(item -> { return FileUtil.readString(item, "utf-8"); }).toArray(xx -> { return new String[xx]; }); File[] imageFiles = imagesDir.listFiles(); List bladeFiles = uploadToOss(imageFiles); String[] replaceText = replaceImageURL(bladeFiles, jsFilesText); return replaceText; } }