feat(可回溯): 重构

重构为mysql
This commit is contained in:
BrandWang
2023-05-08 16:06:42 +08:00
parent 7412cafda0
commit bc0e40193c
22 changed files with 362 additions and 809 deletions
@@ -1,5 +1,6 @@
package com.wabestway.recall.trace.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import io.swagger.annotations.Api;
@@ -10,16 +11,13 @@ import com.wabestway.recall.trace.service.RecallOrderApiService;
import com.wabestway.commons.http.Paging;
import com.wabestway.commons.http.ResObj;
/**
*
*
* @author wangH
* @company 北京华焱坤泰科技有限公司
* @Time 2023-05-06 17:37:03
*/
@RestController
@RequestMapping("/trace/recallOrder")
@RequestMapping("/order")
@Api(tags = {"-接口"}, description = "-接口")
public class RecallOrderController {
@Autowired
@@ -44,26 +42,13 @@ public class RecallOrderController {
}
/**
* 保存
* 生成回溯MP4文件
*
* @return
*/
@PostMapping("/save")
@ApiOperation(value = "保存", notes = "保存", httpMethod = "POST")
public ResObj saveRecallOrder(@RequestBody RecallOrderDTO paramRequest) {
return recallOrderApiService.saveRecallOrder(paramRequest);
@GetMapping("/ffmpeg")
public ResObj createMp4() {
return recallOrderApiService.traceVideo();
}
/**
* 修改
*/
@PostMapping("/update")
@ApiOperation(value = "修改", notes = "修改", httpMethod = "POST")
public ResObj updateRecallOrder(@RequestBody RecallOrderDTO paramRequest) {
return recallOrderApiService.updateRecallOrder(paramRequest);
}
@PostMapping("/changeStatus")
@ApiOperation(value = "启禁用更新", notes = "启禁用更新", httpMethod = "POST")
public ResObj changeStatus(@RequestBody RecallOrderDTO paramRequest) {
return recallOrderApiService.changeStatus(paramRequest.getId(), paramRequest.getStatus());
}
}
@@ -1,69 +1,34 @@
package com.wabestway.recall.trace.controller;
import com.wabestway.recall.trace.dto.TraceDTO;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import com.wabestway.recall.trace.dto.RecallRecordDTO;
import com.wabestway.recall.trace.vo.RecallRecordVO;
import com.wabestway.recall.trace.service.RecallRecordApiService;
import com.wabestway.commons.http.Paging;
import com.wabestway.commons.http.ResObj;
/**
*
*
* @author wangH
* @company 北京华焱坤泰科技有限公司
* @Time 2023-05-06 17:37:03
*/
@RestController
@RequestMapping("/trace/recallRecord")
@RequestMapping("/track")
@Api(tags = {"-接口"}, description = "-接口")
public class RecallRecordController {
@Autowired
private RecallRecordApiService recallRecordApiService;
/**
* 列表
*/
@PostMapping("/list")
@ApiOperation(value = "分页列表查询", notes = "条件分页查询列表", httpMethod = "POST")
public ResObj<Paging<RecallRecordVO>> list(@RequestBody RecallRecordDTO paramRequest) {
return recallRecordApiService.list(paramRequest);
}
/**
* 信息
*/
@GetMapping("/info/{id}")
@ApiOperation(value = "根据id查详情", notes = "根据id查详情", httpMethod = "GET")
public ResObj<RecallRecordVO> info(@PathVariable("id") String id) {
return recallRecordApiService.getRecallRecord(id);
}
/**
* 保存
*/
@PostMapping("/save")
@ApiOperation(value = "保存", notes = "保存", httpMethod = "POST")
public ResObj saveRecallRecord(@RequestBody RecallRecordDTO paramRequest) {
return recallRecordApiService.saveRecallRecord(paramRequest);
public ResObj saveRecallRecord(@RequestBody TraceDTO record) {
return recallRecordApiService.save(record);
}
/**
* 修改
*/
@PostMapping("/update")
@ApiOperation(value = "修改", notes = "修改", httpMethod = "POST")
public ResObj updateRecallRecord(@RequestBody RecallRecordDTO paramRequest) {
return recallRecordApiService.updateRecallRecord(paramRequest);
}
@PostMapping("/changeStatus")
@ApiOperation(value = "启禁用更新", notes = "启禁用更新", httpMethod = "POST")
public ResObj changeStatus(@RequestBody RecallRecordDTO paramRequest) {
return recallRecordApiService.changeStatus(paramRequest.getId(), paramRequest.getStatus());
}
}
@@ -29,26 +29,10 @@ public interface RecallOrderApiService {
* @return
*/
ResObj<RecallOrderVO> getRecallOrder(String id);
ResObj<RecallOrderVO> getRecallOrderByOrderId(String orderId);
/**
* 保存
* @param paramReq
* 根据回溯文件生成MP4视频
* @return
*/
ResObj saveRecallOrder(RecallOrderDTO paramReq);
/**
* 修改
* @param paramReq
* @return
*/
ResObj updateRecallOrder(RecallOrderDTO paramReq);
/**
* 启禁用
* @param id
* @param status
* @return
*/
ResObj changeStatus(String id, String status);
ResObj traceVideo();
}
@@ -1,15 +1,15 @@
package com.wabestway.recall.trace.service;
import java.util.List;
import com.wabestway.recall.trace.dto.RecallRecordDTO;
import com.wabestway.recall.trace.dto.TraceDTO;
import com.wabestway.recall.trace.vo.RecallRecordVO;
import com.wabestway.commons.http.Paging;
import com.wabestway.commons.http.ResObj;
/**
*
*
* @author wangH
* @company 北京华焱坤泰科技有限公司
* @Time 2023-05-06 17:37:03
@@ -17,38 +17,11 @@ import com.wabestway.commons.http.ResObj;
public interface RecallRecordApiService {
/**
* 列表
* @param paramReq
* 回溯数据记录
*
* @param record
* @return
*/
ResObj<Paging<RecallRecordVO>> list(RecallRecordDTO paramReq);
ResObj save(TraceDTO record);
/**
* 查询详情
* @param id
* @return
*/
ResObj<RecallRecordVO> getRecallRecord(String id);
/**
* 保存
* @param paramReq
* @return
*/
ResObj saveRecallRecord(RecallRecordDTO paramReq);
/**
* 修改
* @param paramReq
* @return
*/
ResObj updateRecallRecord(RecallRecordDTO paramReq);
/**
* 启禁用
* @param id
* @param status
* @return
*/
ResObj changeStatus(String id, String status);
}
@@ -1,31 +1,48 @@
package com.wabestway.recall.trace.service.impl;
import cn.hutool.core.io.FileUtil;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.wabestway.commons.http.Paging;
import com.wabestway.commons.http.ResObj;
import com.wabestway.commons.enums.DataValidEnum;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.BeanUtils;
import com.wabestway.ins.utils.UUIDUtil;
import com.wabestway.engine.api.dfs.UploadFileDTO;
import com.wabestway.engine.api.dfs.UploadRespVO;
import com.wabestway.engine.api.feign.DfsStorageFeignClient;
import com.wabestway.recall.trace.entity.RecallOrderEntity;
import com.wabestway.recall.trace.entity.RecallRecordEntity;
import com.wabestway.recall.trace.service.RecallOrderService;
import com.wabestway.recall.trace.service.RecallRecordService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import com.wabestway.recall.trace.dto.RecallOrderDTO;
import com.wabestway.recall.trace.vo.RecallOrderVO;
import com.wabestway.recall.trace.service.RecallOrderApiService;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import com.wabestway.recall.trace.util.HeaderDataUtil;
import java.io.*;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.Comparator;
import java.util.List;
import java.util.stream.Collectors;
/**
*
*
* @author wangH
* @company 北京华焱坤泰科技有限公司
* @Time 2023-05-06 17:37:03
*/
@Slf4j
@Service
public class RecallOrderApiServiceImpl implements RecallOrderApiService {
@Autowired
private RecallOrderService recallOrderService;
@Autowired
private DfsStorageFeignClient storageFeignClient;
@Autowired
private RecallRecordService recallRecordService;
@Override
public ResObj<Paging<RecallOrderVO>> list(RecallOrderDTO paramReq) {
@@ -38,48 +55,119 @@ public class RecallOrderApiServiceImpl implements RecallOrderApiService {
@Override
public ResObj<RecallOrderVO> getRecallOrder(String id) {
RecallOrderVO recallOrderVO = recallOrderService.queryRecallOrderById(id);
return ResObj.ok(recallOrderVO);
}
@Transactional
@Override
public ResObj saveRecallOrder(RecallOrderDTO paramReq) {
RecallOrderEntity recallOrder = new RecallOrderEntity();
BeanUtils.copyProperties(paramReq, recallOrder);
public ResObj<RecallOrderVO> getRecallOrderByOrderId(String orderId) {
return null;
}
recallOrder.setId(UUIDUtil.generate());//赋值id
recallOrder.setStatus(DataValidEnum.VALID.getCode());
recallOrder.setCreateBy(HeaderDataUtil.getUserId());//创建人
recallOrder.setCreateTime(System.currentTimeMillis());//创建时间
recallOrder.setUpdateBy(HeaderDataUtil.getUserId());//更新人
recallOrder.setUpdateTime(System.currentTimeMillis());//更新时间
@Override
public ResObj traceVideo() {
LambdaQueryWrapper<RecallOrderEntity> orderQuery = Wrappers.lambdaQuery();
orderQuery.eq(RecallOrderEntity::getComplete, "1");
orderQuery.isNull(RecallOrderEntity::getFileId);
orderQuery.orderByDesc(RecallOrderEntity::getCompleteDate);
List<RecallOrderEntity> orderList = recallOrderService.getBaseMapper().selectList(orderQuery);
orderList.forEach(order -> {
LambdaQueryWrapper<RecallRecordEntity> recordQuery = Wrappers.lambdaQuery();
recordQuery.eq(RecallRecordEntity::getTraceId, order.getTraceId());
recordQuery.orderByAsc(RecallRecordEntity::getCreateTime);
List<RecallRecordEntity> recordList = recallRecordService.getBaseMapper().selectList(recordQuery);
recallOrderService.save(recallOrder);
List<String> events = recordList.stream()
.flatMap(entity -> entity.getEvents().stream())
.collect(Collectors.toList());
JSONArray array = JSONArray.parseArray(JSON.toJSONString(events));
try {
createVideo(order, array.toJSONString());
} catch (IOException ex) {
ex.printStackTrace();
}
});
return ResObj.ok();
}
@Transactional
@Override
public ResObj updateRecallOrder(RecallOrderDTO paramReq) {
RecallOrderEntity recallOrder = new RecallOrderEntity();
BeanUtils.copyProperties(paramReq, recallOrder);
recallOrder.setUpdateBy(HeaderDataUtil.getUserId());//更新人
recallOrder.setUpdateTime(System.currentTimeMillis());//更新时间
recallOrderService.updateById(recallOrder);
return ResObj.ok();
void createVideo(RecallOrderEntity fo, String jsonData) throws IOException {
// 创建临时目录
Path tempDir = null;
try {
tempDir = Files.createTempDirectory("ts");
} catch (IOException e) {
e.printStackTrace();
}
System.out.println("Created temporary directory: " + tempDir);
try {
File tempFile = new File(tempDir.toFile(), "traces.json");
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();
Thread processThread = new Thread(() -> {
try {
// 读取命令输出
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 (InterruptedException | IOException e) {
e.printStackTrace();
}
});
processThread.start();
// Continue with other tasks here...
try {
processThread.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
File file = new File(tempDir.toFile(), "video.mp4");
if (file.exists()) {
log.info(String.valueOf(file.length()));
//byte[] fileBytes = Files.readAllBytes(file.toPath());
byte[] fileBytes = FileUtil.readBytes(file);
String titles = fo.getOrderId() + ".mp4";
UploadFileDTO uploadFileDTO = new UploadFileDTO(fileBytes, "RECALL", titles);
ResObj<UploadRespVO> uploadResObj = storageFeignClient.uploadBytes(uploadFileDTO);
log.info(JSON.toJSONString(uploadResObj));
if (uploadResObj.isOk()) {
fo.setFileId(uploadResObj.getData().getFileId());
fo.setFileUrl(uploadResObj.getData().getFileUrl());
fo.setUpdateTime(System.currentTimeMillis());
recallOrderService.updateRecallOrderById(fo);
}
}
} catch (Exception e) {
e.printStackTrace();
log.error(e.getMessage());
} finally {
// 删除临时目录
Files.walk(tempDir)
.sorted(Comparator.reverseOrder())
.map(Path::toFile)
.forEach(File::delete);
}
}
@Transactional
@Override
public ResObj changeStatus(String id, String status) {
RecallOrderEntity recallOrder = new RecallOrderEntity();
recallOrder.setId(id);
recallOrder.setStatus(status);
recallOrder.setUpdateBy(HeaderDataUtil.getUserId());
recallOrder.setUpdateTime(System.currentTimeMillis());
recallOrderService.updateRecallOrderById(recallOrder);
return ResObj.ok();
}
}
@@ -1,85 +1,85 @@
package com.wabestway.recall.trace.service.impl;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.wabestway.commons.http.Paging;
import com.alibaba.fastjson.JSON;
import com.wabestway.commons.http.ResObj;
import com.wabestway.commons.enums.DataValidEnum;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.BeanUtils;
import com.wabestway.ins.utils.UUIDUtil;
import com.wabestway.recall.trace.dto.TraceDTO;
import com.wabestway.recall.trace.entity.RecallOrderEntity;
import com.wabestway.recall.trace.entity.RecallRecordEntity;
import com.wabestway.recall.trace.dto.RecallRecordDTO;
import com.wabestway.recall.trace.vo.RecallRecordVO;
import com.wabestway.recall.trace.service.RecallOrderService;
import com.wabestway.recall.trace.service.RecallRecordService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import com.wabestway.recall.trace.service.RecallRecordApiService;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import com.wabestway.recall.trace.util.HeaderDataUtil;
import java.util.Optional;
import java.util.UUID;
/**
*
*
* @author wangH
* @company 北京华焱坤泰科技有限公司
* @Time 2023-05-06 17:37:03
*/
@Service
@Slf4j
public class RecallRecordApiServiceImpl implements RecallRecordApiService {
@Autowired
private RecallRecordService recallRecordService;
@Autowired
private RecallOrderService recallOrderService;
@Override
public ResObj<Paging<RecallRecordVO>> list(RecallRecordDTO paramReq) {
IPage<RecallRecordVO> resultPage = recallRecordService.queryRecallRecordByCondition(paramReq.getPage(), paramReq.getPageSize(), paramReq);
public ResObj save(TraceDTO record) {
String orderId = record.getOrderId();
String traceId = Optional.ofNullable(orderId)
.map(recallOrderService::queryRecallOrderByOrderId)
.map(RecallOrderEntity::getTraceId)
.orElse(UUID.randomUUID().toString().replace("-", ""));
Paging<RecallRecordVO> paging = new Paging(resultPage.getRecords(), paramReq.getPage(), resultPage.getSize(), resultPage.getTotal());
return ResObj.ok(paging);
}
boolean isLastEvent = record.isLast();
@Override
public ResObj<RecallRecordVO> getRecallRecord(String id) {
RecallRecordVO recallRecordVO = recallRecordService.queryRecallRecordById(id);
RecallOrderEntity order = Optional.ofNullable(orderId)
.flatMap(id -> Optional.ofNullable(recallOrderService.queryRecallOrderByOrderId(id)))
.orElseGet(() -> {
RecallOrderEntity newOrder = new RecallOrderEntity();
newOrder.setId(UUID.randomUUID().toString().replace("-", ""));
newOrder.setOrderId(orderId);
newOrder.setTraceId(traceId);
newOrder.setProductCode(record.getProductCode());
newOrder.setProductName(record.getProductName());
newOrder.setCreateTime(System.currentTimeMillis());
newOrder.setUpdateTime(System.currentTimeMillis());
newOrder.setAppKey(record.getAppKey());
newOrder.setArchived("0");
newOrder.setComplete(isLastEvent ? "1" : "0");
if (isLastEvent) {
newOrder.setCompleteDate(System.currentTimeMillis());
}
recallOrderService.save(newOrder);
return ResObj.ok(recallRecordVO);
}
record.setTraceId(traceId);
record.setOrderId(orderId);
return newOrder;
});
if (isLastEvent) {
order.setComplete("1");
order.setCompleteDate(System.currentTimeMillis());
order.setUpdateTime(System.currentTimeMillis());
recallOrderService.updateRecallOrderById(order);
}
@Transactional
@Override
public ResObj saveRecallRecord(RecallRecordDTO paramReq) {
RecallRecordEntity recallRecord = new RecallRecordEntity();
BeanUtils.copyProperties(paramReq, recallRecord);
recallRecord.setId(UUIDUtil.generate());//赋值id
recallRecord.setStatus(DataValidEnum.VALID.getCode());
recallRecord.setCreateBy(HeaderDataUtil.getUserId());//创建人
recallRecord.setCreateTime(System.currentTimeMillis());//创建时间
recallRecord.setUpdateBy(HeaderDataUtil.getUserId());//更新人
recallRecord.setUpdateTime(System.currentTimeMillis());//更新时间
BeanUtils.copyProperties(record, recallRecord);
recallRecord.setId(UUID.randomUUID().toString().replace("-", ""));
recallRecord.setCreateTime(System.currentTimeMillis());
recallRecordService.save(recallRecord);
return ResObj.ok();
}
@Transactional
@Override
public ResObj updateRecallRecord(RecallRecordDTO paramReq) {
RecallRecordEntity recallRecord = new RecallRecordEntity();
BeanUtils.copyProperties(paramReq, recallRecord);
recallRecord.setUpdateBy(HeaderDataUtil.getUserId());//更新人
recallRecord.setUpdateTime(System.currentTimeMillis());//更新时间
recallRecordService.updateById(recallRecord);
return ResObj.ok();
}
@Transactional
@Override
public ResObj changeStatus(String id, String status) {
RecallRecordEntity recallRecord = new RecallRecordEntity();
recallRecord.setId(id);
recallRecord.setStatus(status);
recallRecord.setUpdateBy(HeaderDataUtil.getUserId());
recallRecord.setUpdateTime(System.currentTimeMillis());
recallRecordService.updateRecallRecordById(recallRecord);
return ResObj.ok();
record.setEvents(null);
log.info("保存数据:{}", JSON.toJSONString(record));
return ResObj.ok(record);
}
}