taskStatus

This commit is contained in:
Jerry Yan 2025-01-03 15:31:40 +08:00
parent c376e3b1b6
commit a91389ca99
19 changed files with 187 additions and 67 deletions

View File

@ -95,7 +95,7 @@ public class AppGoodsController {
@GetMapping("/task/face/{faceId}/template/{templateId}")
public ApiResponse<VideoTaskStatusVO> getTemplateTaskStatus(@PathVariable("faceId") Long faceId, @PathVariable("templateId") Long templateId) {
JwtInfo worker = JwtTokenUtil.getWorker();
return goodsService.getTemplateTaskStatus(worker.getUserId(), faceId, templateId);
return goodsService.getTaskStatusByTemplateId(worker.getUserId(), faceId, templateId);
}
@PostMapping("/submitVideoTask")

View File

@ -0,0 +1,57 @@
package com.ycwl.basic.controller.mobile;
import com.ycwl.basic.model.jwt.JwtInfo;
import com.ycwl.basic.model.mobile.goods.VideoTaskReq;
import com.ycwl.basic.model.mobile.goods.VideoTaskStatusVO;
import com.ycwl.basic.service.mobile.GoodsService;
import com.ycwl.basic.service.task.TaskService;
import com.ycwl.basic.utils.ApiResponse;
import com.ycwl.basic.utils.JwtTokenUtil;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/api/mobile/task/v1")
public class AppTaskController {
@Autowired
private GoodsService goodsService;
@Autowired
private TaskService taskService;
@GetMapping("/face/{faceId}")
public ApiResponse<VideoTaskStatusVO> getTaskStatusByFaceId(@PathVariable("faceId") Long faceId) {
JwtInfo worker = JwtTokenUtil.getWorker();
return goodsService.getTaskStatusByFaceId(worker.getUserId(), faceId);
}
@GetMapping("/scenic/{scenicId}")
public ApiResponse<VideoTaskStatusVO> getAllTaskStatusByScenicId(@PathVariable("scenicId") Long scenicId) {
JwtInfo worker = JwtTokenUtil.getWorker();
return goodsService.getTaskStatusByScenicId(worker.getUserId(), scenicId);
}
/**
* 查询用户当前景区的具体模版视频合成任务状态
*
* @param templateId 模版id
* @return 1 合成中 2 合成成功
*/
@ApiOperation("查询用户当前景区的具体模版视频合成任务状态 1 合成中 2 合成成功 ")
@GetMapping("/face/{faceId}/template/{templateId}")
public ApiResponse<VideoTaskStatusVO> getTemplateTaskStatus(@PathVariable("faceId") Long faceId, @PathVariable("templateId") Long templateId) {
JwtInfo worker = JwtTokenUtil.getWorker();
return goodsService.getTaskStatusByTemplateId(worker.getUserId(), faceId, templateId);
}
@PostMapping("/submit")
public ApiResponse<String> submitVideoTask(@RequestBody VideoTaskReq videoTaskReq) {
JwtInfo worker = JwtTokenUtil.getWorker();
taskService.createTaskByFaceIdAndTempalteId(videoTaskReq.getFaceId(),videoTaskReq.getTemplateId(),0);
return ApiResponse.success("成功");
}
}

View File

@ -36,11 +36,6 @@ public class TaskController {
public ApiResponse getById(@PathVariable Long id) {
return taskService.getById(id);
}
@ApiOperation("添加任务")
@PostMapping("/add")
public ApiResponse add(@RequestBody TaskEntity taskEntity) {
return taskService.add(taskEntity);
}
@ApiOperation("删除任务")
@DeleteMapping("/delete/{id}")
public ApiResponse deleteById(@PathVariable Long id) {

View File

@ -56,4 +56,6 @@ public interface TaskMapper {
int setFail(TaskEntity taskUpdate);
TaskEntity getFaceAutomaticTask(Long faceId);
TaskEntity get(Long taskId);
}

View File

@ -32,6 +32,6 @@ public interface TemplateMapper {
int deleteConfigByTemplateId(Long templateId);
int deleteConfigById(Long id);
List<TemplateEntity> listEnabledByScenicId(Long scenicId);
List<Long> listEnabledTemplateIdByScenicId(Long scenicId);
List<ContentPageVO> listFor(@Param("scenicId") Long scenicId);
}

View File

@ -34,9 +34,8 @@ public interface VideoMapper {
List<MemberVideoEntity> userFaceTemplateVideo(Long userId, Long faceId, Long templateId);
List<TaskEntity> listTaskByFaceRelation(Long userId, Long faceId);
List<TaskEntity> listTaskByFaceTemplateRelation(Long userId, Long faceId, Long templateId);
List<MemberVideoEntity> listRelationByFace(Long userId, Long faceId);
List<MemberVideoEntity> listRelationByFaceAndTemplate(Long userId, Long faceId, Long templateId);
List<TaskEntity> listTaskByScenicRelation(Long userId, Long scenicId);

View File

@ -5,6 +5,7 @@ import lombok.Data;
@Data
public class VideoTaskStatusVO {
private int status;
private Long taskId;
private Long videoId;
private Long templateId;
private Long faceId;

View File

@ -23,11 +23,6 @@ public class TaskRespVO {
@ApiModelProperty("执行任务的机器ID")
private Long workerId;
private Long faceId;
/**
* 用户ID可以不和用户关联
*/
@ApiModelProperty("用户ID")
private Long memberId;
/**
* 模板ID
*/

View File

@ -1,7 +1,17 @@
package com.ycwl.basic.repository;
import com.ycwl.basic.mapper.FaceMapper;
import com.ycwl.basic.mapper.FaceSampleMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;
@Component
public class FaceRepository {
@Autowired
private RedisTemplate<String, String> redisTemplate;
@Autowired
private FaceMapper faceMapper;
@Autowired
private FaceSampleMapper faceSampleMapper;
}

View File

@ -14,6 +14,7 @@ import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@ -30,12 +31,12 @@ public class TemplateRepository {
@Autowired
private RedisTemplate<String, String> redisTemplate;
public static final String TEMPLATE_CACHE_KEY = "template:%s";
public static final String TEMPLATE_ID_BY_SCENIC_ID_CACHE_KEY = "template:id:byScenic:%s";
public static final String TEMPLATE_CONFIG_CACHE_KEY = "template:%s:config";
public boolean determineTemplateCanGenerate(Long templateId, Long faceId) {
TemplateRespVO template = templateMapper.getById(templateId);
template.setChildren(templateMapper.getByPid(templateId));
TemplateRespVO template = getTemplate(templateId);
Map<String, Boolean> map = new HashMap<>();
for (TemplateRespVO child : template.getChildren()) {
if (child.getIsPlaceholder() == 1) {
@ -59,6 +60,20 @@ public class TemplateRepository {
return map.values().stream().filter(item -> item).count() >= templateConfig.getMinimalPlaceholderFill();
}
public List<TemplateRespVO> getTemplateListByScenicId(Long scenicId) {
List<Long> idList;
if (redisTemplate.hasKey(String.format(TEMPLATE_ID_BY_SCENIC_ID_CACHE_KEY, scenicId))) {
idList = JSONObject.parseArray(redisTemplate.opsForValue().get(String.format(TEMPLATE_ID_BY_SCENIC_ID_CACHE_KEY, scenicId)), Long.class);
} else {
idList = templateMapper.listEnabledTemplateIdByScenicId(scenicId);
redisTemplate.opsForValue().set(String.format(TEMPLATE_ID_BY_SCENIC_ID_CACHE_KEY, scenicId), JSONObject.toJSONString(idList));
}
if (idList == null || idList.isEmpty()) {
return Collections.emptyList();
}
return idList.stream().map(this::getTemplate).collect(Collectors.toList());
}
public TemplateRespVO getTemplate(Long templateId) {
if (redisTemplate.hasKey(String.format(TEMPLATE_CACHE_KEY, templateId))) {
return JSONObject.parseObject(redisTemplate.opsForValue().get(String.format(TEMPLATE_CACHE_KEY, templateId)), TemplateRespVO.class);
@ -90,6 +105,10 @@ public class TemplateRepository {
}
public boolean clearTemplateCache(Long templateId) {
if (redisTemplate.hasKey(String.format(TEMPLATE_CACHE_KEY, templateId))) {
TemplateRespVO template = getTemplate(templateId);
redisTemplate.delete(String.format(TEMPLATE_ID_BY_SCENIC_ID_CACHE_KEY, template.getScenicId()));
}
redisTemplate.delete(String.format(TEMPLATE_CACHE_KEY, templateId));
redisTemplate.delete(String.format(TEMPLATE_CONFIG_CACHE_KEY, templateId));
return true;

View File

@ -1,4 +1,34 @@
package com.ycwl.basic.repository;
import com.alibaba.fastjson.JSONObject;
import com.ycwl.basic.mapper.TaskMapper;
import com.ycwl.basic.mapper.VideoMapper;
import com.ycwl.basic.model.pc.task.entity.TaskEntity;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;
@Component
public class VideoTaskRepository {
@Autowired
private RedisTemplate<String, String> redisTemplate;
@Autowired
private TaskMapper taskMapper;
@Autowired
private VideoMapper videoMapper;
public static final String USER_TASK_CACHE_KEY = "task:user:%s";
public static final String TASK_CACHE_KEY = "task:byId:%s";
public TaskEntity getTaskById(Long taskId) {
if (redisTemplate.hasKey(String.format(TASK_CACHE_KEY, taskId))) {
return JSONObject.parseObject(redisTemplate.opsForValue().get(String.format(TASK_CACHE_KEY, taskId)), TaskEntity.class);
} else {
TaskEntity task = taskMapper.get(taskId);
if (task != null) {
redisTemplate.opsForValue().set(String.format(TASK_CACHE_KEY, taskId), JSONObject.toJSONString(task));
}
return task;
}
}
}

View File

@ -12,9 +12,9 @@ import com.ycwl.basic.model.pc.source.resp.SourceRespVO;
import com.ycwl.basic.model.pc.task.entity.TaskEntity;
import com.ycwl.basic.model.pc.task.resp.TaskRespVO;
import com.ycwl.basic.model.pc.video.entity.MemberVideoEntity;
import com.ycwl.basic.model.pc.video.entity.VideoEntity;
import com.ycwl.basic.model.pc.video.req.VideoReqQuery;
import com.ycwl.basic.model.pc.video.resp.VideoRespVO;
import com.ycwl.basic.repository.VideoTaskRepository;
import com.ycwl.basic.service.mobile.GoodsService;
import com.ycwl.basic.repository.TemplateRepository;
import com.ycwl.basic.utils.ApiResponse;
@ -28,7 +28,6 @@ import java.math.RoundingMode;
import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
import java.util.Optional;
import java.util.stream.Collectors;
@ -51,6 +50,8 @@ public class GoodsServiceImpl implements GoodsService {
private FaceMapper faceMapper;
@Autowired
private TemplateRepository templateRepository;
@Autowired
private VideoTaskRepository videoTaskRepository;
public ApiResponse<List<GoodsPageVO>> goodsList(GoodsReqQuery query) {
//查询原素材
@ -242,28 +243,35 @@ public class GoodsServiceImpl implements GoodsService {
*/
@Override
public ApiResponse<VideoTaskStatusVO> getTaskStatusByFaceId(Long userId, Long faceId) {
List<TaskEntity> taskList = videoMapper.listTaskByFaceRelation(userId, faceId);
List<MemberVideoEntity> taskList = videoMapper.listRelationByFace(userId, faceId);
VideoTaskStatusVO response = new VideoTaskStatusVO();
response.setFaceId(faceId);
if (taskList.isEmpty()) {
response.setStatus(0);
return ApiResponse.success(response);
}
long nullTask = taskList.stream().filter(Objects::isNull).count();
if (nullTask > 0) {
response.setScenicId(taskList.get(0).getScenicId());
response.setMaxCount(templateRepository.getTemplateListByScenicId(response.getScenicId()).size());
List<MemberVideoEntity> notFinishedTasks = taskList.stream().filter(task -> {
TaskEntity taskById = videoTaskRepository.getTaskById(task.getTaskId());
if (taskById == null) {
return true;
}
return taskById.getStatus() != 1;
}).collect(Collectors.toList());
if (!notFinishedTasks.isEmpty()) {
response.setCount(taskList.size() - notFinishedTasks.size());
response.setTemplateId(notFinishedTasks.get(0).getTemplateId());
response.setTaskId(notFinishedTasks.get(0).getTaskId());
response.setStatus(2);
return ApiResponse.success(response);
}
Optional<TaskEntity> taskEntity = taskList.stream().filter(task -> 1 == task.getStatus()).findFirst();
if (taskEntity.isPresent()) {
response.setTemplateId(taskEntity.get().getTemplateId());
VideoEntity video = videoMapper.findByTaskId(taskEntity.get().getId());
response.setVideoId(video.getId());
MemberVideoEntity lastVideo = taskList.get(taskList.size() - 1);
response.setTaskId(lastVideo.getTaskId());
response.setTemplateId(lastVideo.getTemplateId());
response.setVideoId(lastVideo.getVideoId());
response.setCount(taskList.size());
response.setStatus(1);
} else {
response.setStatus(2);
}
return ApiResponse.success(response);
}
@ -274,23 +282,36 @@ public class GoodsServiceImpl implements GoodsService {
}
@Override
public ApiResponse<VideoTaskStatusVO> getTemplateTaskStatus(Long userId, Long faceId, Long templateId) {
List<TaskEntity> taskList = videoMapper.listTaskByFaceTemplateRelation(userId, faceId, templateId);
public ApiResponse<VideoTaskStatusVO> getTaskStatusByTemplateId(Long userId, Long faceId, Long templateId) {
List<MemberVideoEntity> taskList = videoMapper.listRelationByFaceAndTemplate(userId, faceId, templateId);
VideoTaskStatusVO response = new VideoTaskStatusVO();
response.setFaceId(faceId);
if (taskList.isEmpty()) {
response.setStatus(0);
return ApiResponse.success(response);
}
Optional<TaskEntity> taskEntity = taskList.stream().filter(task -> task.getStatus() == 1).findFirst();
if (taskEntity.isPresent()) {
response.setTemplateId(taskEntity.get().getTemplateId());
VideoEntity video = videoMapper.findByTaskId(taskEntity.get().getId());
response.setVideoId(video.getId());
response.setStatus(1);
} else {
response.setStatus(2);
response.setScenicId(taskList.get(0).getScenicId());
response.setMaxCount(templateRepository.getTemplateListByScenicId(response.getScenicId()).size());
List<MemberVideoEntity> notFinishedTasks = taskList.stream().filter(task -> {
TaskEntity taskById = videoTaskRepository.getTaskById(task.getTaskId());
if (taskById == null) {
return true;
}
return taskById.getStatus() != 1;
}).collect(Collectors.toList());
if (!notFinishedTasks.isEmpty()) {
response.setCount(taskList.size() - notFinishedTasks.size());
response.setTemplateId(notFinishedTasks.get(0).getTemplateId());
response.setTaskId(notFinishedTasks.get(0).getTaskId());
response.setStatus(2);
return ApiResponse.success(response);
}
MemberVideoEntity lastVideo = taskList.get(taskList.size() - 1);
response.setTaskId(lastVideo.getTaskId());
response.setTemplateId(lastVideo.getTemplateId());
response.setVideoId(lastVideo.getVideoId());
response.setCount(taskList.size());
response.setStatus(1);
return ApiResponse.success(response);
}

View File

@ -41,16 +41,6 @@ public class TaskServiceImpl implements TaskService {
return ApiResponse.success(taskMapper.getById(id));
}
@Override
public ApiResponse<Boolean> add(TaskEntity task) {
int i = taskMapper.add(task);
if (i > 0) {
return ApiResponse.success(true);
}else {
return ApiResponse.fail("添加失败");
}
}
@Override
public ApiResponse<Boolean> deleteById(Long id) {
int i = taskMapper.deleteById(id);

View File

@ -141,7 +141,6 @@ public class TaskTaskServiceImpl implements TaskService {
TaskEntity taskEntity = new TaskEntity();
taskEntity.setId(SnowFlakeUtil.getLongId());
taskEntity.setFaceId(faceId);
taskEntity.setMemberId(faceRespVO.getMemberId());
taskEntity.setTemplateId(templateId);
taskEntity.setScenicId(scenicId);
taskEntity.setTaskParams(JSON.toJSONString(sourcesMap));
@ -190,8 +189,7 @@ public class TaskTaskServiceImpl implements TaskService {
if (faceSampleList.isEmpty()) {
return;
}
// TODO: 优化
List<TemplateEntity> templateList = templateMapper.listEnabledByScenicId(faceRespVO.getScenicId());
List<TemplateRespVO> templateList = templateRepository.getTemplateListByScenicId(faceRespVO.getScenicId());
if (templateList == null || templateList.isEmpty()) {
return;
}
@ -253,7 +251,6 @@ public class TaskTaskServiceImpl implements TaskService {
taskEntity.setId(SnowFlakeUtil.getLongId());
taskEntity.setScenicId(faceRespVO.getScenicId());
taskEntity.setFaceId(faceId);
taskEntity.setMemberId(faceRespVO.getMemberId());
taskEntity.setTemplateId(templateId);
taskEntity.setStatus(0);
taskEntity.setAutomatic(automatic);
@ -296,7 +293,6 @@ public class TaskTaskServiceImpl implements TaskService {
video = new VideoEntity();
video.setId(SnowFlakeUtil.getLongId());
video.setScenicId(task.getScenicId());
video.setMemberId(task.getMemberId());
video.setTemplateId(task.getTemplateId());
video.setTaskId(taskId);
video.setWorkerId(worker.getId());

View File

@ -45,11 +45,9 @@ public interface GoodsService {
* @param userId
* @return
*/
ApiResponse<VideoTaskStatusVO> getTaskStatusByFaceId(Long userId ,Long faceId);
ApiResponse<VideoTaskStatusVO> getAllTaskStatus(Long userId);
ApiResponse<VideoTaskStatusVO> getTemplateTaskStatus(Long userId, Long faceId, Long templateId);
ApiResponse<VideoTaskStatusVO> getTaskStatusByFaceId(Long userId ,Long faceId);
ApiResponse<VideoTaskStatusVO> getTaskStatusByTemplateId(Long userId, Long faceId, Long templateId);
ApiResponse<VideoTaskStatusVO> getTaskStatusByScenicId(Long userId, Long scenicId);
ApiResponse<GoodsDetailVO> sourceGoodsInfo(Long userId, Long sourceId);

View File

@ -16,7 +16,6 @@ public interface TaskService {
ApiResponse<PageInfo<TaskRespVO>> pageQuery(TaskReqQuery taskReqQuery);
ApiResponse<List<TaskRespVO>> list(TaskReqQuery taskReqQuery);
ApiResponse<TaskRespVO> getById(Long id);
ApiResponse<Boolean> add(TaskEntity task);
ApiResponse<Boolean> deleteById(Long id);
ApiResponse<Boolean> update(TaskEntity task);
ApiResponse<Boolean> updateStatus(Long id,Integer status);

View File

@ -107,4 +107,9 @@ from task
where face_id = #{faceId} and automatic = 1
limit 1
</select>
<select id="get" resultType="com.ycwl.basic.model.pc.task.entity.TaskEntity">
select *
from task
where id = #{id}
</select>
</mapper>

View File

@ -105,4 +105,9 @@
where t.scenic_id = #{scenicId} and pid = 0 and t.status = 1
order by sort
</select>
<select id="listEnabledTemplateIdByScenicId" resultType="java.lang.Long">
select t.id
from template t
where t.scenic_id = #{scenicId} and t.pid = 0 and t.status = 1
</select>
</mapper>

View File

@ -110,16 +110,14 @@
<select id="userFaceTemplateVideo" resultType="com.ycwl.basic.model.pc.video.entity.MemberVideoEntity">
select * from member_video where member_id = #{userId} and face_id = #{faceId} and template_id = #{templateId} order by id desc
</select>
<select id="listTaskByFaceRelation" resultType="com.ycwl.basic.model.pc.task.entity.TaskEntity">
select t.*
<select id="listRelationByFace" resultType="com.ycwl.basic.model.pc.video.entity.MemberVideoEntity">
select mv.*
from member_video mv
left join task t on mv.task_id = t.id
where mv.member_id = #{userId} and mv.face_id = #{faceId}
</select>
<select id="listTaskByFaceTemplateRelation" resultType="com.ycwl.basic.model.pc.task.entity.TaskEntity">
select t.*
<select id="listRelationByFaceAndTemplate" resultType="com.ycwl.basic.model.pc.video.entity.MemberVideoEntity">
select mv.*
from member_video mv
left join task t on mv.task_id = t.id
where mv.member_id = #{userId} and mv.face_id = #{faceId} and mv.template_id = #{templateId}
</select>
<select id="listTaskByScenicRelation" resultType="com.ycwl.basic.model.pc.task.entity.TaskEntity">