package xiaozhi.modules.task.controller; 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.PutMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import lombok.RequiredArgsConstructor; import xiaozhi.common.exception.ErrorCode; import xiaozhi.common.exception.RenException; import xiaozhi.common.utils.Result; import xiaozhi.modules.parent.dto.ParentImmediateCloseDTO; import xiaozhi.modules.parent.service.ParentTaskService; import xiaozhi.modules.task.dto.TaskInstanceListDTO; import xiaozhi.modules.task.dto.TaskInstanceUpsertDTO; import xiaozhi.modules.task.service.TaskInstanceService; @Tag(name = "Task Instance") @RestController @RequestMapping("/task/instance") @RequiredArgsConstructor public class TaskInstanceController { private final TaskInstanceService taskInstanceService; private final ParentTaskService parentTaskService; @Operation(summary = "xiaozhi-server 关闭家长即时任务(口令切换/断线)") @PostMapping("/close-parent-immediate") public Result closeParentImmediate(@RequestBody ParentImmediateCloseDTO body) { int n = parentTaskService.closeFromServer(body); return new Result().ok(n); } @Operation(summary = "xiaozhi-server 上报 TaskSession 全文(幂等覆盖)") @PutMapping("/{id}") public Result upsert(@PathVariable("id") String id, @RequestBody TaskInstanceUpsertDTO body) { taskInstanceService.upsert(id, body); return new Result().ok(Boolean.TRUE); } @Operation(summary = "查询一条 TaskInstance(含 turns/events)") @GetMapping("/{id}") public Result get(@PathVariable("id") String id) { TaskInstanceUpsertDTO data = taskInstanceService.getDetail(id); if (data == null) { throw new RenException(ErrorCode.RESOURCE_NOT_FOUND); } return new Result().ok(data); } @Operation(summary = "按设备列出最近 TaskInstance(不含 turns 正文)") @GetMapping public Result list( @RequestParam("macAddress") String macAddress, @RequestParam(value = "appId", required = false) String appId, @RequestParam(value = "limit", required = false) Integer limit) { return new Result().ok(taskInstanceService.listByMac(macAddress, appId, limit)); } }