fix: 任务模板 API 修复与学校端功能实现

- TaskTemplateCreateRequest: isDefault/isPublic 改为 Boolean 类型
- SchoolTaskTemplateController: 接入 TaskTemplateService 实现完整 CRUD
- getTemplates: 支持 publicOnly、keyword、taskType 参数
- 学校端列表显示全部模板(含 isPublic=0)
- 前端 getTaskTemplates: 分页字段 Number 转换

Made-with: Cursor
This commit is contained in:
zhonghua 2026-03-20 13:49:15 +08:00
parent 37a6aba8cc
commit 802327f075
6 changed files with 66 additions and 40 deletions

View File

@ -890,10 +890,10 @@ export const getTaskTemplates = (params?: {
}) => http.get<{ list: TaskTemplate[]; total: number; pageNum: number; pageSize: number; pages: number }>('/v1/school/task-templates', { params })
.then(res => ({
list: res.list || res.records || [],
total: res.total || 0,
pageNum: res.pageNum || 1,
pageSize: res.pageSize || 10,
pages: res.pages || 0,
total: Number(res.total) || 0,
pageNum: Number(res.pageNum) || 1,
pageSize: Number(res.pageSize) || 10,
pages: Number(res.pages) || 0,
}));
export const getTaskTemplate = (id: number) =>

View File

@ -1,15 +1,21 @@
package com.reading.platform.controller.school;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.reading.platform.common.annotation.RequireRole;
import com.reading.platform.common.enums.UserRole;
import com.reading.platform.common.mapper.TaskTemplateMapper;
import com.reading.platform.common.response.PageResult;
import com.reading.platform.common.response.Result;
import com.reading.platform.common.security.SecurityUtils;
import com.reading.platform.dto.request.TaskTemplateCreateRequest;
import com.reading.platform.dto.response.TaskTemplateResponse;
import com.reading.platform.entity.TaskTemplate;
import com.reading.platform.service.TaskTemplateService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.validation.Valid;
import lombok.RequiredArgsConstructor;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.*;
import java.util.List;
@ -24,45 +30,51 @@ import java.util.List;
@RequireRole(UserRole.SCHOOL)
public class SchoolTaskTemplateController {
private final TaskTemplateService taskTemplateService;
private final TaskTemplateMapper taskTemplateMapper;
@GetMapping
@Operation(summary = "获取模板列表")
public Result<PageResult<TaskTemplateResponse>> getTemplates(
@RequestParam(required = false, defaultValue = "1") Integer pageNum,
@RequestParam(required = false, defaultValue = "10") Integer pageSize,
@RequestParam(required = false) String type) {
// TODO: 实现模板列表查询
@RequestParam(required = false) String type,
@RequestParam(required = false) String taskType,
@RequestParam(required = false) String keyword) {
Long tenantId = SecurityUtils.getCurrentTenantId();
return Result.success(PageResult.of(List.of(), 0L, pageNum.longValue(), pageSize.longValue()));
String typeFilter = StringUtils.hasText(taskType) ? taskType : type;
Page<TaskTemplate> page = taskTemplateService.getTemplates(tenantId, pageNum, pageSize, typeFilter, keyword, false);
List<TaskTemplateResponse> voList = taskTemplateMapper.toVO(page.getRecords());
return Result.success(PageResult.of(voList, page.getTotal(), page.getCurrent(), page.getSize()));
}
@GetMapping("/default/{type}")
@Operation(summary = "获取默认模板")
public Result<TaskTemplateResponse> getDefaultTemplate(@PathVariable String type) {
// TODO: 实现默认模板查询需要根据 tenantId type 查询
Long tenantId = SecurityUtils.getCurrentTenantId();
return Result.success(TaskTemplateResponse.builder()
.type(type)
.build());
TaskTemplate template = taskTemplateService.getDefaultTemplate(tenantId, type);
return template != null ? Result.success(taskTemplateMapper.toVO(template)) : Result.success(null);
}
@GetMapping("/{id}")
@Operation(summary = "获取模板详情")
public Result<TaskTemplateResponse> getTemplate(@PathVariable Long id) {
// TODO: 实现模板详情查询需要验证模板属于当前租户
Long tenantId = SecurityUtils.getCurrentTenantId();
return Result.success(TaskTemplateResponse.builder()
.id(id)
.build());
TaskTemplate template = taskTemplateService.getTemplateById(id);
if (!template.getTenantId().equals(tenantId)) {
throw new com.reading.platform.common.exception.BusinessException(
com.reading.platform.common.enums.ErrorCode.FORBIDDEN, "无权访问该模板");
}
return Result.success(taskTemplateMapper.toVO(template));
}
@PostMapping
@Operation(summary = "创建模板")
public Result<TaskTemplateResponse> createTemplate(@RequestBody TaskTemplateCreateRequest request) {
// TODO: 实现创建模板
public Result<TaskTemplateResponse> createTemplate(@Valid @RequestBody TaskTemplateCreateRequest request) {
Long tenantId = SecurityUtils.getCurrentTenantId();
return Result.success(TaskTemplateResponse.builder()
.tenantId(tenantId)
.build());
Long userId = SecurityUtils.getCurrentUserId();
TaskTemplate template = taskTemplateService.createTemplate(tenantId, userId, request);
return Result.success(taskTemplateMapper.toVO(template));
}
@PutMapping("/{id}")
@ -70,18 +82,26 @@ public class SchoolTaskTemplateController {
public Result<TaskTemplateResponse> updateTemplate(
@PathVariable Long id,
@RequestBody TaskTemplateCreateRequest request) {
// TODO: 实现更新模板需要验证模板属于当前租户
Long tenantId = SecurityUtils.getCurrentTenantId();
return Result.success(TaskTemplateResponse.builder()
.id(id)
.build());
TaskTemplate existing = taskTemplateService.getTemplateById(id);
if (!existing.getTenantId().equals(tenantId)) {
throw new com.reading.platform.common.exception.BusinessException(
com.reading.platform.common.enums.ErrorCode.FORBIDDEN, "无权修改该模板");
}
TaskTemplate template = taskTemplateService.updateTemplate(id, request);
return Result.success(taskTemplateMapper.toVO(template));
}
@DeleteMapping("/{id}")
@Operation(summary = "删除模板")
public Result<Void> deleteTemplate(@PathVariable Long id) {
// TODO: 实现删除模板需要验证模板属于当前租户
Long tenantId = SecurityUtils.getCurrentTenantId();
TaskTemplate template = taskTemplateService.getTemplateById(id);
if (!template.getTenantId().equals(tenantId)) {
throw new com.reading.platform.common.exception.BusinessException(
com.reading.platform.common.enums.ErrorCode.FORBIDDEN, "无权删除该模板");
}
taskTemplateService.deleteTemplate(id);
return Result.success();
}
}
}

View File

@ -39,9 +39,10 @@ public class TeacherTaskTemplateController {
public Result<PageResult<TaskTemplateResponse>> getTemplates(
@RequestParam(required = false, defaultValue = "1") Integer pageNum,
@RequestParam(required = false, defaultValue = "10") Integer pageSize,
@RequestParam(required = false) String type) {
@RequestParam(required = false) String type,
@RequestParam(required = false) String keyword) {
Long tenantId = SecurityUtils.getCurrentTenantId();
Page<TaskTemplate> page = taskTemplateService.getTemplates(tenantId, pageNum, pageSize, type);
Page<TaskTemplate> page = taskTemplateService.getTemplates(tenantId, pageNum, pageSize, type, keyword, true);
List<TaskTemplateResponse> voList = taskTemplateMapper.toVO(page.getRecords());
return Result.success(PageResult.of(voList, page.getTotal(), page.getCurrent(), page.getSize()));
}

View File

@ -31,12 +31,12 @@ public class TaskTemplateCreateRequest {
private Integer defaultDuration;
@Schema(description = "是否默认模板")
private Integer isDefault;
private Boolean isDefault;
@Schema(description = "模板内容")
private String content;
@Schema(description = "是否公开")
private Integer isPublic;
private Boolean isPublic;
}

View File

@ -16,7 +16,7 @@ public interface TaskTemplateService extends com.baomidou.mybatisplus.extension.
/**
* 获取模板列表
*/
Page<TaskTemplate> getTemplates(Long tenantId, Integer pageNum, Integer pageSize, String type);
Page<TaskTemplate> getTemplates(Long tenantId, Integer pageNum, Integer pageSize, String type, String keyword, Boolean publicOnly);
/**
* 获取默认模板

View File

@ -37,18 +37,23 @@ public class TaskTemplateServiceImpl extends ServiceImpl<TaskTemplateMapper, Tas
private final TaskTargetMapper taskTargetMapper;
@Override
public Page<TaskTemplate> getTemplates(Long tenantId, Integer pageNum, Integer pageSize, String type) {
log.debug("获取模板列表,租户 ID: {}, 页码:{}, 类型:{}", tenantId, pageNum, type);
public Page<TaskTemplate> getTemplates(Long tenantId, Integer pageNum, Integer pageSize, String type, String keyword, Boolean publicOnly) {
log.debug("获取模板列表,租户 ID: {}, 页码:{}, 类型:{}, 关键词:{}", tenantId, pageNum, type, keyword);
Page<TaskTemplate> page = new Page<>(pageNum, pageSize);
LambdaQueryWrapper<TaskTemplate> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(TaskTemplate::getTenantId, tenantId);
wrapper.eq(TaskTemplate::getIsPublic, 1);
if (Boolean.TRUE.equals(publicOnly)) {
wrapper.eq(TaskTemplate::getIsPublic, 1);
}
wrapper.eq(TaskTemplate::getStatus, "ACTIVE");
if (StringUtils.hasText(type)) {
wrapper.eq(TaskTemplate::getType, type);
wrapper.and(w -> w.eq(TaskTemplate::getType, type).or().eq(TaskTemplate::getTaskType, type));
}
if (StringUtils.hasText(keyword)) {
wrapper.like(TaskTemplate::getName, keyword);
}
wrapper.orderByDesc(TaskTemplate::getCreatedAt);
@ -87,15 +92,15 @@ public class TaskTemplateServiceImpl extends ServiceImpl<TaskTemplateMapper, Tas
template.setTenantId(tenantId);
template.setName(request.getName());
template.setDescription(request.getDescription());
template.setType(request.getType());
template.setType(request.getType() != null ? request.getType() : request.getTaskType());
template.setTaskType(request.getTaskType());
template.setRelatedCourseId(request.getRelatedCourseId());
template.setDefaultDuration(request.getDefaultDuration() != null ? request.getDefaultDuration() : 7);
template.setIsDefault(request.getIsDefault() != null ? request.getIsDefault() : 0);
template.setIsDefault(Boolean.TRUE.equals(request.getIsDefault()) ? 1 : 0);
template.setStatus("ACTIVE");
template.setCreatedBy(userId);
template.setContent(request.getContent());
template.setIsPublic(request.getIsPublic() != null ? request.getIsPublic() : 0);
template.setIsPublic(Boolean.TRUE.equals(request.getIsPublic()) ? 1 : 0);
taskTemplateMapper.insert(template);
log.info("任务模板创建成功ID: {}", template.getId());
@ -128,13 +133,13 @@ public class TaskTemplateServiceImpl extends ServiceImpl<TaskTemplateMapper, Tas
template.setDefaultDuration(request.getDefaultDuration());
}
if (request.getIsDefault() != null) {
template.setIsDefault(request.getIsDefault());
template.setIsDefault(request.getIsDefault() ? 1 : 0);
}
if (request.getContent() != null) {
template.setContent(request.getContent());
}
if (request.getIsPublic() != null) {
template.setIsPublic(request.getIsPublic());
template.setIsPublic(request.getIsPublic() ? 1 : 0);
}
taskTemplateMapper.updateById(template);