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<BladeFile> uploadToOss(File... imageFiles) {
|
OssTemplate template = getOssTemplate();
|
List<BladeFile> 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<BladeFile> 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<BladeFile> files) {
|
List<String> 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<VisualDTO> createVisualDTO(Integer category, String... replaceText) {
|
List<VisualDTO> 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<String> 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<String> 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<String> 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<BladeFile> bladeFiles = uploadToOss(imageFiles);
|
String[] replaceText = replaceImageURL(bladeFiles, jsFilesText);
|
return replaceText;
|
}
|
}
|