/* * 自然写教学资源管理与内容分发系统软件 V1.0 * controller/DotCodeController.java - 点阵码生成API * controller/AuditController.java - 内容审核API */ package com.writech.resource.controller; import java.util.*; import java.util.logging.Logger; /** * 点阵码生成控制器 * * 提供点阵码资源的生成、查询、绑定等API接口。 * 点阵码是自然写系统的核心技术资源。 */ public class DotCodeController { private static final Logger logger = Logger.getLogger(DotCodeController.class.getName()); /** * 生成点阵码资源包 POST /api/v1/dotcode/generate * * 为指定资源(字帖/试卷/课件)生成配套的点阵码。 * 点阵码ID全局唯一分配,生成后可叠加到PDF模板上。 */ public Map generateDotCode(Map request) { String resourceId = (String) request.get("resource_id"); int pageCount = (int) request.getOrDefault("page_count", 1); double pageWidth = (double) request.getOrDefault("page_width", 210.0); double pageHeight = (double) request.getOrDefault("page_height", 297.0); boolean overlay = (boolean) request.getOrDefault("overlay_on_template", false); logger.info(String.format( "点阵码生成请求: resource=%s, pages=%d, size=%.0fx%.0f, overlay=%b", resourceId, pageCount, pageWidth, pageHeight, overlay )); // 参数校验 if (resourceId == null || resourceId.isEmpty()) { Map err = new HashMap<>(); err.put("code", 400); err.put("message", "resource_id不能为空"); return err; } if (pageCount < 1 || pageCount > 500) { Map err = new HashMap<>(); err.put("code", 400); err.put("message", "页数须在1-500之间"); return err; } // 调用点阵码生成服务 // DotCodeService.DotCodeGenerateRequest genReq = new DotCodeService.DotCodeGenerateRequest(); // genReq.setResourceId(resourceId); // genReq.setPageCount(pageCount); // DotCodeService.DotCodeGenerateResult result = dotCodeService.generateDotCodes(genReq); Map result = new HashMap<>(); result.put("code", 0); result.put("message", "点阵码生成成功"); result.put("data", Map.of( "resource_id", resourceId, "page_count", pageCount, "dot_code_ids", new ArrayList<>(), "output_file_url", "" )); return result; } /** * 查询点阵码绑定信息 GET /api/v1/dotcode/binding/{dotCodeId} * * 根据点阵码ID查询其绑定的资源和页面信息。 * 用于点阵笔采集到坐标后定位到具体页面。 */ public Map queryBinding(long dotCodeId) { logger.info("查询点阵码绑定: dotCodeId=" + dotCodeId); // DotCodeBinding binding = dotCodeService.queryBinding(dotCodeId); // if (binding == null) { // return errorResponse(404, "点阵码绑定信息不存在"); // } Map result = new HashMap<>(); result.put("code", 0); result.put("data", Map.of( "dot_code_id", dotCodeId, "resource_id", "", "page_index", 0, "area_type", "full_page", "area", Map.of("x", 0, "y", 0, "width", 210, "height", 297) )); return result; } /** * 查询资源关联的所有点阵码 GET /api/v1/dotcode/resource/{resourceId} */ public Map queryByResource(String resourceId) { logger.info("查询资源点阵码: resource=" + resourceId); // List bindings = dotCodeService.queryByResourceId(resourceId); Map result = new HashMap<>(); result.put("code", 0); result.put("data", Map.of( "resource_id", resourceId, "bindings", new ArrayList<>() )); return result; } /** * 撤销点阵码绑定 DELETE /api/v1/dotcode/binding/{dotCodeId} * * 撤销后该点阵码ID可被重新分配。 * 仅管理员可执行此操作。 */ public Map revokeBinding(long dotCodeId, String operatorId) { logger.info(String.format( "撤销点阵码绑定: dotCodeId=%d, operator=%s", dotCodeId, operatorId )); // dotCodeService.revokeBinding(dotCodeId); Map result = new HashMap<>(); result.put("code", 0); result.put("message", "点阵码绑定已撤销"); return result; } } /** * 内容审核控制器 * * 提供资源内容审核的完整流程API: * - 待审核资源列表查询 * - 审核通过/驳回/退回操作 * - 批量审核 * - 审核记录查询 * - 审核统计仪表盘 */ class AuditController { private static final Logger logger = Logger.getLogger(AuditController.class.getName()); /** * 获取待审核资源列表 GET /api/v1/resource/audit/pending * * 按上传时间排序,支持按类型和学科过滤。 */ public Map getPendingList( String type, String subject, int page, int pageSize ) { logger.info(String.format( "待审核列表: type=%s, subject=%s, page=%d", type, subject, page )); // 查询MySQL: status = 'PENDING' // List pending = resourceMapper.selectByStatus("PENDING", type, subject, page, pageSize); // int total = resourceMapper.countByStatus("PENDING", type, subject); Map result = new HashMap<>(); result.put("code", 0); result.put("data", Map.of( "total", 0, "page", page, "items", new ArrayList<>() )); return result; } /** * 执行审核操作 PUT /api/v1/resource/audit/{id} * * 审核通过后资源自动进入CDN分发,可被终端检索下载。 * 驳回后通知上传者修改。 */ public Map performAudit( String resourceId, Map auditData ) { String action = (String) auditData.get("action"); String comment = (String) auditData.get("comment"); String auditorId = (String) auditData.get("auditor_id"); logger.info(String.format( "审核操作: resource=%s, action=%s, auditor=%s", resourceId, action, auditorId )); // 校验审核动作合法性 Set validActions = new HashSet<>(Arrays.asList( "APPROVE", "REJECT", "RETURN" )); if (!validActions.contains(action)) { Map err = new HashMap<>(); err.put("code", 400); err.put("message", "不合法的审核操作: " + action); return err; } // 调用审核服务 // AuditService.AuditRequest req = new AuditService.AuditRequest(); // req.setResourceId(resourceId); // req.setAction(AuditService.AuditAction.valueOf(action)); // req.setComment(comment); // req.setAuditorId(auditorId); // return auditService.performAudit(req); Map result = new HashMap<>(); result.put("code", 0); result.put("message", "审核操作成功"); result.put("data", Map.of( "resource_id", resourceId, "action", action, "new_status", "APPROVE".equals(action) ? "APPROVED" : "REJECTED" )); return result; } /** * 批量审核 POST /api/v1/resource/audit/batch */ public Map batchAudit(Map batchRequest) { List resourceIds = (List) batchRequest.get("resource_ids"); String action = (String) batchRequest.get("action"); String comment = (String) batchRequest.get("comment"); String auditorId = (String) batchRequest.get("auditor_id"); logger.info(String.format( "批量审核: count=%d, action=%s", resourceIds.size(), action )); // return auditService.batchAudit(resourceIds, action, comment, auditorId); Map result = new HashMap<>(); result.put("code", 0); result.put("data", Map.of( "total", resourceIds.size(), "success", resourceIds.size(), "failed", 0 )); return result; } /** * 查询审核记录 GET /api/v1/resource/audit/records */ public Map getAuditRecords( String resourceId, String auditorId, int page, int pageSize ) { logger.info(String.format( "审核记录查询: resource=%s, auditor=%s", resourceId, auditorId )); // return auditService.queryAuditRecords(resourceId, auditorId, page, pageSize); Map result = new HashMap<>(); result.put("code", 0); result.put("data", Map.of( "total", 0, "page", page, "items", new ArrayList<>() )); return result; } /** * 审核统计仪表盘 GET /api/v1/resource/audit/stats * * 返回待审核数量、今日已审核数量、通过率等统计。 */ public Map getAuditStats() { // return auditService.getAuditStats(); Map result = new HashMap<>(); result.put("code", 0); result.put("data", Map.of( "pending_count", 0, "approved_today", 0, "rejected_today", 0, "approval_rate", 0.0, "avg_audit_hours", 0.0 )); return result; } }