diff --git a/src/main/java/com/wabestway/recall/web/OrderController.java b/src/main/java/com/wabestway/recall/web/OrderController.java index 44d5439..4fda49b 100644 --- a/src/main/java/com/wabestway/recall/web/OrderController.java +++ b/src/main/java/com/wabestway/recall/web/OrderController.java @@ -1,5 +1,7 @@ package com.wabestway.recall.web; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; import com.wabestway.recall.model.Order; import com.wabestway.recall.model.OrderList; import com.wabestway.recall.model.Record; @@ -11,7 +13,13 @@ import org.springframework.web.bind.annotation.*; import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; +import java.io.*; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; import java.util.ArrayList; +import java.util.Comparator; import java.util.List; @@ -67,4 +75,75 @@ public class OrderController { }); }); } + + @GetMapping("/ffmpeg") + public Mono createMp4() { + Order order = new Order(); + order.setComplete("1"); + ExampleMatcher matcher = ExampleMatcher.matching() + .withIgnoreNullValues().withIgnorePaths("createAt", "last", "page", "pageSize"); + Example ep = Example.of(order, matcher); + Sort s = Sort.by("createAt"); + Flux flux = orderRepository.findAll(ep, s); + flux.subscribe(fo -> { + Flux rs = recordRepository.findAllByTraceIdOrderByCreateAtAsc(fo.getTraceId()); + Mono>> es = rs.map(rr -> rr.getEvents()).collectList(); + Mono> events = es.flatMapIterable(lists -> lists).flatMapIterable(list -> list).collectList(); + events.subscribe(e -> { + JSONArray array = JSONArray.parseArray(JSON.toJSONString(e)); + try { + createVideo(fo.getOrderId(), array.toJSONString()); + } catch (IOException ex) { + ex.printStackTrace(); + } + }); + }); + return Mono.just(ResObj.ok()); + } + + void createVideo(String dir, String jsonData) throws IOException { + + // 创建临时目录 + Path tempDir = null; + try { + tempDir = Files.createTempDirectory("dir"); + } catch (IOException e) { + e.printStackTrace(); + } + System.out.println("Created temporary directory: " + tempDir); + + try { + File tempFile = File.createTempFile("traces", ".json", tempDir.toFile()); + FileWriter fw = new FileWriter(tempFile); + BufferedWriter bw = new BufferedWriter(fw); + bw.write(jsonData); + bw.flush(); + bw.close(); + fw.close(); + String[] command = {"ts-node", "/opt/trace-transform/src/index.ts"}; + ProcessBuilder processBuilder = new ProcessBuilder(command); + processBuilder.directory(tempDir.toFile()); + // 在临时目录下执行命令 + Process process = processBuilder.start(); + // 读取命令输出 + BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream())); + String line; + while ((line = reader.readLine()) != null) { + System.out.println(line); + } + reader.close(); + + // 等待命令执行完成 + int exitCode = process.waitFor(); + System.out.println("Command exited with code " + exitCode); + } catch (IOException | InterruptedException e) { + e.printStackTrace(); + } finally { + // 删除临时目录 + Files.walk(tempDir) + .sorted(Comparator.reverseOrder()) + .map(Path::toFile) + .forEach(File::delete); + } + } }