From 8968409b2d43cf2e1db1a95fc4e4ad95d72793bc Mon Sep 17 00:00:00 2001 From: wangys <3401275564@qq.com> Date: Fri, 24 Oct 2025 18:28:26 +0800 Subject: [PATCH] =?UTF-8?q?serv-=E5=AD=A6=E4=B9=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../.bin/mysql/sql/createTableLearning.sql | 42 +- .../.bin/mysql/sql/initMenuData.sql | 6 +- schoolNewsServ/admin/pom.xml | 5 + schoolNewsServ/api/api-achievement/pom.xml | 24 + .../api/achievement/AchievementService.java | 184 +++++++ schoolNewsServ/api/api-all/pom.xml | 9 +- .../api/news/resource/ResourceService.java | 2 +- .../xyzh/api/study/course/CourseService.java | 1 + .../study/record/LearningRecordService.java | 32 +- .../api/study/task/LearningTaskService.java | 32 +- .../achievement/UserAchievementService.java | 76 --- .../collection/UserCollectionService.java | 6 +- schoolNewsServ/api/pom.xml | 12 +- .../core/enums/AchievementConditionType.java | 90 ++++ .../core/enums/AchievementEventType.java | 84 ++++ .../xyzh/common/core/enums/TaskItemType.java | 33 ++ .../common/core/event/AchievementEvent.java | 151 ++++++ .../common/dto/study/TbLearningRecord.java | 65 ++- .../{TbTaskCourse.java => TbTaskItem.java} | 69 ++- .../xyzh/common/dto/study/TbTaskResource.java | 139 ------ .../usercenter/TbUserAchievementProgress.java | 134 +++++ .../java/org/xyzh/common/vo/TaskItemVO.java | 78 +-- .../main/java/org/xyzh/common/vo/TaskVO.java | 34 +- .../news/controller/ResourceController.java | 2 +- .../org/xyzh/news/mapper/ResourceMapper.java | 9 + .../service/impl/NCResourceServiceImpl.java | 29 +- .../main/resources/mapper/ResourceMapper.xml | 8 + schoolNewsServ/pom.xml | 26 +- .../study/controller/CourseController.java | 1 + .../controller/LearningRecordController.java | 70 +-- .../controller/LearningTaskController.java | 9 +- .../study/mapper/LearningRecordMapper.java | 4 +- .../xyzh/study/mapper/TaskCourseMapper.java | 162 ------ .../org/xyzh/study/mapper/TaskItemMapper.java | 194 ++++++++ .../xyzh/study/mapper/TaskResourceMapper.java | 169 ------- .../org/xyzh/study/mapper/TaskUserMapper.java | 11 + .../service/impl/SCCourseServiceImpl.java | 2 + .../impl/SCLearningRecordServiceImpl.java | 258 ++++++++-- .../impl/SCLearningTaskServiceImpl.java | 310 ++++++++---- .../resources/mapper/LearningRecordMapper.xml | 45 +- .../resources/mapper/LearningTaskMapper.xml | 2 +- .../resources/mapper/TaskCourseMapper.xml | 209 -------- .../main/resources/mapper/TaskItemMapper.xml | 398 +++++++++++++++ .../resources/mapper/TaskResourceMapper.xml | 208 -------- .../main/resources/mapper/TaskUserMapper.xml | 37 +- schoolNewsServ/usercenter/pom.xml | 5 + .../controller/UserAchievementController.java | 84 ---- .../controller/UserCollectionController.java | 30 +- .../usercenter/mapper/AchievementMapper.java | 140 ------ .../mapper/UserAchievementMapper.java | 130 ----- .../service/UCUserAchievementService.java | 14 - .../impl/UCUserAchievementServiceImpl.java | 67 --- .../impl/UCUserCollectionServiceImpl.java | 19 +- .../resources/mapper/AchievementMapper.xml | 463 ------------------ .../mapper/UserAchievementMapper.xml | 291 ----------- 55 files changed, 2144 insertions(+), 2570 deletions(-) create mode 100644 schoolNewsServ/api/api-achievement/pom.xml create mode 100644 schoolNewsServ/api/api-achievement/src/main/java/org/xyzh/api/achievement/AchievementService.java delete mode 100644 schoolNewsServ/api/api-usercenter/src/main/java/org/xyzh/api/usercenter/achievement/UserAchievementService.java create mode 100644 schoolNewsServ/common/common-core/src/main/java/org/xyzh/common/core/enums/AchievementConditionType.java create mode 100644 schoolNewsServ/common/common-core/src/main/java/org/xyzh/common/core/enums/AchievementEventType.java create mode 100644 schoolNewsServ/common/common-core/src/main/java/org/xyzh/common/core/enums/TaskItemType.java create mode 100644 schoolNewsServ/common/common-core/src/main/java/org/xyzh/common/core/event/AchievementEvent.java rename schoolNewsServ/common/common-dto/src/main/java/org/xyzh/common/dto/study/{TbTaskCourse.java => TbTaskItem.java} (64%) delete mode 100644 schoolNewsServ/common/common-dto/src/main/java/org/xyzh/common/dto/study/TbTaskResource.java create mode 100644 schoolNewsServ/common/common-dto/src/main/java/org/xyzh/common/dto/usercenter/TbUserAchievementProgress.java delete mode 100644 schoolNewsServ/study/src/main/java/org/xyzh/study/mapper/TaskCourseMapper.java create mode 100644 schoolNewsServ/study/src/main/java/org/xyzh/study/mapper/TaskItemMapper.java delete mode 100644 schoolNewsServ/study/src/main/java/org/xyzh/study/mapper/TaskResourceMapper.java delete mode 100644 schoolNewsServ/study/src/main/resources/mapper/TaskCourseMapper.xml create mode 100644 schoolNewsServ/study/src/main/resources/mapper/TaskItemMapper.xml delete mode 100644 schoolNewsServ/study/src/main/resources/mapper/TaskResourceMapper.xml delete mode 100644 schoolNewsServ/usercenter/src/main/java/org/xyzh/usercenter/controller/UserAchievementController.java delete mode 100644 schoolNewsServ/usercenter/src/main/java/org/xyzh/usercenter/mapper/AchievementMapper.java delete mode 100644 schoolNewsServ/usercenter/src/main/java/org/xyzh/usercenter/mapper/UserAchievementMapper.java delete mode 100644 schoolNewsServ/usercenter/src/main/java/org/xyzh/usercenter/service/UCUserAchievementService.java delete mode 100644 schoolNewsServ/usercenter/src/main/java/org/xyzh/usercenter/service/impl/UCUserAchievementServiceImpl.java delete mode 100644 schoolNewsServ/usercenter/src/main/resources/mapper/AchievementMapper.xml delete mode 100644 schoolNewsServ/usercenter/src/main/resources/mapper/UserAchievementMapper.xml diff --git a/schoolNewsServ/.bin/mysql/sql/createTableLearning.sql b/schoolNewsServ/.bin/mysql/sql/createTableLearning.sql index d310191..aa108fa 100644 --- a/schoolNewsServ/.bin/mysql/sql/createTableLearning.sql +++ b/schoolNewsServ/.bin/mysql/sql/createTableLearning.sql @@ -21,12 +21,13 @@ CREATE TABLE `tb_learning_task` ( KEY `idx_time` (`start_time`, `end_time`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='学习任务表'; --- 任务关联资源表 -DROP TABLE IF EXISTS `tb_task_resource`; -CREATE TABLE `tb_task_resource` ( +-- 任务项关联表(统一管理资源和课程) +DROP TABLE IF EXISTS `tb_task_item`; +CREATE TABLE `tb_task_item` ( `id` VARCHAR(50) NOT NULL COMMENT '关联ID', `task_id` VARCHAR(50) NOT NULL COMMENT '任务ID', - `resource_id` VARCHAR(50) NOT NULL COMMENT '资源ID', + `item_type` INT(4) NOT NULL COMMENT '项类型(1资源 2课程)', + `item_id` VARCHAR(50) NOT NULL COMMENT '项ID(资源ID或课程ID)', `required` TINYINT(1) DEFAULT 1 COMMENT '是否必须完成', `order_num` INT(4) DEFAULT 0 COMMENT '排序号', `creator` VARCHAR(50) DEFAULT NULL COMMENT '创建者', @@ -36,30 +37,10 @@ CREATE TABLE `tb_task_resource` ( `delete_time` TIMESTAMP NULL DEFAULT NULL COMMENT '删除时间', `deleted` TINYINT(1) NOT NULL DEFAULT 0 COMMENT '是否删除', PRIMARY KEY (`id`), - UNIQUE KEY `uk_task_resource` (`task_id`, `resource_id`), + UNIQUE KEY `uk_task_item` (`task_id`, `item_type`, `item_id`), KEY `idx_task` (`task_id`), - KEY `idx_resource` (`resource_id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='任务资源关联表'; - --- 任务关联课程表 -DROP TABLE IF EXISTS `tb_task_course`; -CREATE TABLE `tb_task_course` ( - `id` VARCHAR(50) NOT NULL COMMENT '关联ID', - `task_id` VARCHAR(50) NOT NULL COMMENT '任务ID', - `course_id` VARCHAR(50) NOT NULL COMMENT '课程ID', - `required` TINYINT(1) DEFAULT 1 COMMENT '是否必须完成', - `order_num` INT(4) DEFAULT 0 COMMENT '排序号', - `creator` VARCHAR(50) DEFAULT NULL COMMENT '创建者', - `create_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', - `updater` VARCHAR(50) DEFAULT NULL COMMENT '更新者', - `update_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', - `delete_time` TIMESTAMP NULL DEFAULT NULL COMMENT '删除时间', - `deleted` TINYINT(1) NOT NULL DEFAULT 0 COMMENT '是否删除', - PRIMARY KEY (`id`), - UNIQUE KEY `uk_task_course` (`task_id`, `course_id`), - KEY `idx_task` (`task_id`), - KEY `idx_course` (`course_id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='任务课程关联表'; + KEY `idx_item` (`item_type`, `item_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='任务项关联表'; -- 任务接收人员表 DROP TABLE IF EXISTS `tb_task_user`; @@ -89,9 +70,12 @@ DROP TABLE IF EXISTS `tb_learning_record`; CREATE TABLE `tb_learning_record` ( `id` VARCHAR(50) NOT NULL COMMENT '记录ID', `user_id` VARCHAR(50) NOT NULL COMMENT '用户ID', - `resource_type` INT(4) NOT NULL COMMENT '资源类型(1资源 2课程 3章节)', - `resource_id` VARCHAR(50) NOT NULL COMMENT '资源ID', `task_id` VARCHAR(50) DEFAULT NULL COMMENT '任务ID', + `resource_type` INT(4) NOT NULL COMMENT '资源类型(1资源 2课程 3章节)', + `resource_id` VARCHAR(50) DEFAULT NULL COMMENT '资源ID', + `course_id` VARCHAR(50) DEFAULT NULL COMMENT '课程ID', + `chapter_id` VARCHAR(50) DEFAULT NULL COMMENT '章节ID', + `node_id` VARCHAR(50) DEFAULT NULL COMMENT '节点ID', `duration` INT(11) DEFAULT 0 COMMENT '学习时长(秒)', `progress` DECIMAL(5,2) DEFAULT 0.00 COMMENT '学习进度(0-100)', `is_complete` TINYINT(1) DEFAULT 0 COMMENT '是否完成', diff --git a/schoolNewsServ/.bin/mysql/sql/initMenuData.sql b/schoolNewsServ/.bin/mysql/sql/initMenuData.sql index 8c6dafd..e8d3af2 100644 --- a/schoolNewsServ/.bin/mysql/sql/initMenuData.sql +++ b/schoolNewsServ/.bin/mysql/sql/initMenuData.sql @@ -71,9 +71,9 @@ INSERT INTO `tb_sys_menu` (id, menu_id, name, parent_id, url, component, icon, o ('300', 'menu_study_plan', '学习计划', NULL, '/study-plan', 'study-plan/StudyPlanView', 'el-icon-reading', 3, 1, 'NavigationLayout', '1', now()), ('301', 'menu_study_tasks', '学习任务', 'menu_study_plan', '/study-plan/tasks', 'study-plan/StudyTasksView', 'el-icon-s-order', 1, 1, 'NavigationLayout', '1', now()), ('302', 'menu_course_center', '课程中心', 'menu_study_plan', '/study-plan/course', 'study-plan/CourseCenterView', 'el-icon-video-play', 2, 1, 'NavigationLayout', '1', now()), -('303', 'menu_task_detail', '任务详情', 'menu_study_plan', '/study-plan/task-detail', 'study-plan/LearningTaskDetailView', 'el-icon-document', 3, 3, 'BlankLayout', '1', now()), -('304', 'menu_course_detail', '课程详情', 'menu_study_plan', '/study-plan/course-detail', 'study-plan/CourseDetailView', 'el-icon-video-play', 4, 3, 'BlankLayout', '1', now()), -('305', 'menu_course_study', '课程学习', 'menu_study_plan', '/study-plan/course-study', 'study-plan/CourseStudyView', 'el-icon-video-play', 5, 3, 'BlankLayout', '1', now()), +('303', 'menu_task_detail', '任务详情', 'menu_study_plan', '/study-plan/task-detail', 'study-plan/LearningTaskDetailView', 'el-icon-document', 3, 3, 'NavigationLayout', '1', now()), +('304', 'menu_course_detail', '课程详情', 'menu_study_plan', '/study-plan/course-detail', 'study-plan/CourseDetailView', 'el-icon-video-play', 4, 3, 'NavigationLayout', '1', now()), +('305', 'menu_course_study', '课程学习', 'menu_study_plan', '/study-plan/course-study', 'study-plan/CourseStudyView', 'el-icon-video-play', 5, 3, 'NavigationLayout', '1', now()), ('400', 'menu_user_dropdown', '用户下拉菜单', NULL, '', '', 'el-icon-user', 4, 0, 'NavigationLayout', '1', now()), -- 个人中心 ('401', 'menu_user_center', '个人中心', 'menu_user_dropdown', '/user-center', 'user-center/UserCenterView', 'el-icon-user', 4, 1, 'NavigationLayout', '1', now()), diff --git a/schoolNewsServ/admin/pom.xml b/schoolNewsServ/admin/pom.xml index 7daec84..6ce664d 100644 --- a/schoolNewsServ/admin/pom.xml +++ b/schoolNewsServ/admin/pom.xml @@ -54,6 +54,11 @@ usercenter ${school-news.version} + + org.xyzh + achievement + ${school-news.version} + org.xyzh file diff --git a/schoolNewsServ/api/api-achievement/pom.xml b/schoolNewsServ/api/api-achievement/pom.xml new file mode 100644 index 0000000..b57580c --- /dev/null +++ b/schoolNewsServ/api/api-achievement/pom.xml @@ -0,0 +1,24 @@ + + + 4.0.0 + + org.xyzh + api + ${school-news.version} + + + org.xyzh + api-achievement + ${school-news.version} + jar + api-achievement + 成就模块API接口 + + + 21 + 21 + + + diff --git a/schoolNewsServ/api/api-achievement/src/main/java/org/xyzh/api/achievement/AchievementService.java b/schoolNewsServ/api/api-achievement/src/main/java/org/xyzh/api/achievement/AchievementService.java new file mode 100644 index 0000000..e48d3f2 --- /dev/null +++ b/schoolNewsServ/api/api-achievement/src/main/java/org/xyzh/api/achievement/AchievementService.java @@ -0,0 +1,184 @@ +package org.xyzh.api.achievement; + +import org.xyzh.common.core.domain.ResultDomain; +import org.xyzh.common.core.event.AchievementEvent; +import org.xyzh.common.core.page.PageDomain; +import org.xyzh.common.core.page.PageParam; +import org.xyzh.common.dto.usercenter.TbAchievement; +import org.xyzh.common.dto.usercenter.TbUserAchievement; +import org.xyzh.common.dto.usercenter.TbUserAchievementProgress; + +import java.util.List; +import java.util.Map; + +/** + * @description 成就服务接口 + * @filename AchievementService.java + * @author yslg + * @copyright xyzh + * @since 2025-10-24 + */ +public interface AchievementService { + + // ==================== 成就定义管理 ==================== + + /** + * @description 创建成就 + * @param achievement 成就信息 + * @return ResultDomain 创建结果 + */ + ResultDomain createAchievement(TbAchievement achievement); + + /** + * @description 更新成就 + * @param achievement 成就信息 + * @return ResultDomain 更新结果 + */ + ResultDomain updateAchievement(TbAchievement achievement); + + /** + * @description 删除成就 + * @param achievementID 成就ID + * @return ResultDomain 删除结果 + */ + ResultDomain deleteAchievement(String achievementID); + + /** + * @description 获取所有成就列表 + * @param type 成就类型(可选) + * @param level 成就等级(可选) + * @return ResultDomain 成就列表 + */ + ResultDomain getAllAchievements(Integer type, Integer level); + + /** + * @description 分页查询成就 + * @param filter 过滤条件 + * @param pageParam 分页参数 + * @return ResultDomain 成就分页数据 + */ + ResultDomain getAchievementPage(TbAchievement filter, PageParam pageParam); + + /** + * @description 获取成就详情 + * @param achievementID 成就ID + * @return ResultDomain 成就详情 + */ + ResultDomain getAchievementDetail(String achievementID); + + // ==================== 用户成就管理 ==================== + + /** + * @description 获取用户已获得的成就 + * @param userID 用户ID + * @param type 成就类型(可选) + * @return ResultDomain 用户成就列表 + */ + ResultDomain getUserAchievements(String userID, Integer type); + + /** + * @description 获取当前用户的成就列表 + * @param type 成就类型(可选) + * @return ResultDomain 用户成就列表 + */ + ResultDomain getMyAchievements(Integer type); + + /** + * @description 检查用户是否已获得成就 + * @param userID 用户ID + * @param achievementID 成就ID + * @return ResultDomain 是否已获得 + */ + ResultDomain hasAchievement(String userID, String achievementID); + + /** + * @description 手动授予用户成就(管理员功能) + * @param userID 用户ID + * @param achievementID 成就ID + * @return ResultDomain 授予结果 + */ + ResultDomain grantAchievement(String userID, String achievementID); + + /** + * @description 撤销用户成就(管理员功能) + * @param userID 用户ID + * @param achievementID 成就ID + * @return ResultDomain 撤销结果 + */ + ResultDomain revokeAchievement(String userID, String achievementID); + + // ==================== 成就进度管理 ==================== + + /** + * @description 获取用户成就进度 + * @param userID 用户ID + * @param achievementID 成就ID(可选,为空则获取所有进度) + * @return ResultDomain 成就进度列表 + */ + ResultDomain getUserAchievementProgress(String userID, String achievementID); + + /** + * @description 获取当前用户的成就进度 + * @param achievementID 成就ID(可选) + * @return ResultDomain 成就进度列表 + */ + ResultDomain getMyAchievementProgress(String achievementID); + + /** + * @description 更新用户成就进度 + * @param userID 用户ID + * @param achievementID 成就ID + * @param incrementValue 增量值 + * @return ResultDomain 更新后的进度 + */ + ResultDomain updateProgress(String userID, String achievementID, Integer incrementValue); + + // ==================== 成就检测与触发 ==================== + + /** + * @description 处理成就事件(核心方法) + * @param event 成就事件 + * @return ResultDomain> 本次触发的成就列表 + */ + ResultDomain> processAchievementEvent(AchievementEvent event); + + /** + * @description 检查用户是否满足成就条件 + * @param userID 用户ID + * @param achievementID 成就ID + * @return ResultDomain 是否满足条件 + */ + ResultDomain checkAchievementCondition(String userID, String achievementID); + + /** + * @description 批量检查用户可获得的成就 + * @param userID 用户ID + * @return ResultDomain> 可获得的成就列表 + */ + ResultDomain> checkAvailableAchievements(String userID); + + // ==================== 成就统计 ==================== + + /** + * @description 获取用户成就统计 + * @param userID 用户ID + * @return ResultDomain> 统计信息 + */ + ResultDomain> getUserAchievementStatistics(String userID); + + /** + * @description 获取成就排行榜 + * @param limit 排行榜条数 + * @return ResultDomain> 排行榜数据 + */ + ResultDomain> getAchievementRanking(Integer limit); + + /** + * @description 获取最近获得成就的用户 + * @param achievementID 成就ID + * @param limit 查询条数 + * @return ResultDomain> 用户成就列表 + */ + ResultDomain> getRecentAchievers(String achievementID, Integer limit); +} + diff --git a/schoolNewsServ/api/api-all/pom.xml b/schoolNewsServ/api/api-all/pom.xml index 1f7ffad..7bb5571 100644 --- a/schoolNewsServ/api/api-all/pom.xml +++ b/schoolNewsServ/api/api-all/pom.xml @@ -24,6 +24,10 @@ org.xyzh api-auth + + org.xyzh + api-achievement + org.xyzh @@ -45,6 +49,9 @@ org.xyzh api-ai - + + org.xyzh + api-file + \ No newline at end of file diff --git a/schoolNewsServ/api/api-news/src/main/java/org/xyzh/api/news/resource/ResourceService.java b/schoolNewsServ/api/api-news/src/main/java/org/xyzh/api/news/resource/ResourceService.java index cf4ef0e..98fdc04 100644 --- a/schoolNewsServ/api/api-news/src/main/java/org/xyzh/api/news/resource/ResourceService.java +++ b/schoolNewsServ/api/api-news/src/main/java/org/xyzh/api/news/resource/ResourceService.java @@ -106,7 +106,7 @@ public interface ResourceService { * @author yslg * @since 2025-10-15 */ - ResultDomain incrementViewCount(String resourceID); + ResultDomain incrementViewCount(String resourceID); /** * @description 增加点赞次数 diff --git a/schoolNewsServ/api/api-study/src/main/java/org/xyzh/api/study/course/CourseService.java b/schoolNewsServ/api/api-study/src/main/java/org/xyzh/api/study/course/CourseService.java index 344561b..6d0ccfd 100644 --- a/schoolNewsServ/api/api-study/src/main/java/org/xyzh/api/study/course/CourseService.java +++ b/schoolNewsServ/api/api-study/src/main/java/org/xyzh/api/study/course/CourseService.java @@ -6,6 +6,7 @@ import org.xyzh.common.core.page.PageRequest; import org.xyzh.common.dto.study.TbCourse; import org.xyzh.common.dto.study.TbCourseChapter; import org.xyzh.common.dto.study.TbCourseNode; +import org.xyzh.common.dto.study.TbLearningRecord; import org.xyzh.common.vo.CourseVO; import java.util.List; diff --git a/schoolNewsServ/api/api-study/src/main/java/org/xyzh/api/study/record/LearningRecordService.java b/schoolNewsServ/api/api-study/src/main/java/org/xyzh/api/study/record/LearningRecordService.java index 64dbaac..071a0de 100644 --- a/schoolNewsServ/api/api-study/src/main/java/org/xyzh/api/study/record/LearningRecordService.java +++ b/schoolNewsServ/api/api-study/src/main/java/org/xyzh/api/study/record/LearningRecordService.java @@ -19,12 +19,12 @@ public interface LearningRecordService { * @description 获取用户学习记录 * @param userID 用户ID * @param resourceType 资源类型(可选) - * @param taskID 任务ID(可选) + * @param resourceID 资源ID(可选) * @return ResultDomain 学习记录列表 * @author yslg * @since 2025-10-15 */ - ResultDomain getUserLearningRecords(String userID, Integer resourceType, String taskID); + ResultDomain getLearningRecord(TbLearningRecord learningRecord); /** * @description 获取资源学习记录 @@ -34,7 +34,7 @@ public interface LearningRecordService { * @author yslg * @since 2025-10-15 */ - ResultDomain getResourceLearningRecords(Integer resourceType, String resourceID); + ResultDomain getResourceLearningRecords(TbLearningRecord learningRecord); /** * @description 创建或更新学习记录 @@ -43,32 +43,25 @@ public interface LearningRecordService { * @author yslg * @since 2025-10-15 */ - ResultDomain saveLearningRecord(TbLearningRecord learningRecord); + ResultDomain insertLearningRecord(TbLearningRecord learningRecord); /** * @description 更新学习进度 - * @param userID 用户ID - * @param resourceType 资源类型 - * @param resourceID 资源ID - * @param progress 进度 - * @param duration 学习时长(秒) + * @param learningRecord 学习记录 * @return ResultDomain 更新结果 * @author yslg * @since 2025-10-15 */ - ResultDomain updateLearningProgress(String userID, Integer resourceType, String resourceID, BigDecimal progress, Integer duration); + ResultDomain updateLearningRecord(TbLearningRecord learningRecord); /** * @description 标记学习完成 - * @param userID 用户ID - * @param resourceType 资源类型 - * @param resourceID 资源ID - * @param taskID 任务ID(可选) + * @param learningRecord 学习记录 * @return ResultDomain 更新结果 * @author yslg * @since 2025-10-15 */ - ResultDomain markLearningComplete(String userID, Integer resourceType, String resourceID, String taskID); + ResultDomain markLearningComplete(TbLearningRecord learningRecord); /** * @description 获取用户学习统计 @@ -108,4 +101,13 @@ public interface LearningRecordService { * @since 2025-10-15 */ ResultDomain getTaskLearningStatistics(String taskID); + + /** + * @description 获取用户课程的学习记录 + * @param learningRecord 学习记录 + * @return ResultDomain 学习记录 + * @author yslg + * @since 2025-10-24 + */ + ResultDomain getCourseLearningRecord(TbLearningRecord learningRecord); } diff --git a/schoolNewsServ/api/api-study/src/main/java/org/xyzh/api/study/task/LearningTaskService.java b/schoolNewsServ/api/api-study/src/main/java/org/xyzh/api/study/task/LearningTaskService.java index ba5798b..1321602 100644 --- a/schoolNewsServ/api/api-study/src/main/java/org/xyzh/api/study/task/LearningTaskService.java +++ b/schoolNewsServ/api/api-study/src/main/java/org/xyzh/api/study/task/LearningTaskService.java @@ -6,8 +6,7 @@ import org.xyzh.common.dto.study.TbLearningTask; import org.xyzh.common.dto.study.TbTaskUser; import org.xyzh.common.vo.TaskItemVO; import org.xyzh.common.vo.TaskVO; -import org.xyzh.common.dto.study.TbTaskCourse; -import org.xyzh.common.dto.study.TbTaskResource; +import org.xyzh.common.dto.study.TbTaskItem; import java.util.List; @@ -48,6 +47,15 @@ public interface LearningTaskService { */ ResultDomain getTaskById(String taskID); + /** + * @description 根据ID获取任务用户详情 + * @param taskID 任务ID + * @return ResultDomain 任务用户详情 + * @author yslg + * @since 2025-10-15 + */ + ResultDomain getTaskUser(String taskID); + /** * @description 创建学习任务 * @param task 任务信息 @@ -154,20 +162,20 @@ public interface LearningTaskService { /** * @description 获取任务课程列表 * @param taskID 任务ID - * @return ResultDomain 课程列表 + * @return ResultDomain 课程列表 * @author yslg * @since 2025-10-15 */ - ResultDomain getTaskCourses(String taskID); + ResultDomain getTaskCourses(String taskID); /** * @description 添加任务课程 - * @param taskCourse 任务课程信息 - * @return ResultDomain 添加结果 + * @param taskItem 任务项信息 + * @return ResultDomain 添加结果 * @author yslg * @since 2025-10-15 */ - ResultDomain addTaskCourse(TbTaskCourse taskCourse); + ResultDomain addTaskCourse(TbTaskItem taskItem); /** * @description 移除任务课程 @@ -184,20 +192,20 @@ public interface LearningTaskService { /** * @description 获取任务资源列表 * @param taskID 任务ID - * @return ResultDomain 资源列表 + * @return ResultDomain 资源列表 * @author yslg * @since 2025-10-15 */ - ResultDomain getTaskResources(String taskID); + ResultDomain getTaskResources(String taskID); /** * @description 添加任务资源 - * @param taskResource 任务资源信息 - * @return ResultDomain 添加结果 + * @param taskItem 任务项信息 + * @return ResultDomain 添加结果 * @author yslg * @since 2025-10-15 */ - ResultDomain addTaskResource(TbTaskResource taskResource); + ResultDomain addTaskResource(TbTaskItem taskItem); /** * @description 移除任务资源 diff --git a/schoolNewsServ/api/api-usercenter/src/main/java/org/xyzh/api/usercenter/achievement/UserAchievementService.java b/schoolNewsServ/api/api-usercenter/src/main/java/org/xyzh/api/usercenter/achievement/UserAchievementService.java deleted file mode 100644 index 9bc89ff..0000000 --- a/schoolNewsServ/api/api-usercenter/src/main/java/org/xyzh/api/usercenter/achievement/UserAchievementService.java +++ /dev/null @@ -1,76 +0,0 @@ -package org.xyzh.api.usercenter.achievement; - -import org.xyzh.common.core.domain.ResultDomain; -import org.xyzh.common.dto.usercenter.TbAchievement; -import org.xyzh.common.dto.usercenter.TbUserAchievement; - -import java.util.List; - -/** - * @description 用户成就服务接口 - * @filename UserAchievementService.java - * @author yslg - * @copyright xyzh - * @since 2025-10-15 - */ -public interface UserAchievementService { - - /** - * @description 获取所有成就列表 - * @param type 成就类型(可选) - * @param level 成就等级(可选) - * @return ResultDomain 成就列表 - * @author yslg - * @since 2025-10-15 - */ - ResultDomain getAllAchievements(Integer type, Integer level); - - /** - * @description 获取用户已获得的成就 - * @param userID 用户ID - * @param type 成就类型(可选) - * @return ResultDomain 用户成就列表 - * @author yslg - * @since 2025-10-15 - */ - ResultDomain getUserAchievements(String userID, Integer type); - - /** - * @description 检查用户是否已获得成就 - * @param userID 用户ID - * @param achievementID 成就ID - * @return ResultDomain 是否已获得 - * @author yslg - * @since 2025-10-15 - */ - ResultDomain hasAchievement(String userID, String achievementID); - - /** - * @description 授予用户成就 - * @param userID 用户ID - * @param achievementID 成就ID - * @return ResultDomain 授予结果 - * @author yslg - * @since 2025-10-15 - */ - ResultDomain grantAchievement(String userID, String achievementID); - - /** - * @description 获取成就详情 - * @param achievementID 成就ID - * @return ResultDomain 成就详情 - * @author yslg - * @since 2025-10-15 - */ - ResultDomain getAchievementDetail(String achievementID); - - /** - * @description 检查用户是否满足成就条件 - * @param userID 用户ID - * @param achievementID 成就ID - * @return ResultDomain 是否满足条件 - * @author yslg - * @since 2025-10-15 - */ - ResultDomain checkAchievementCondition(String userID, String achievementID); -} diff --git a/schoolNewsServ/api/api-usercenter/src/main/java/org/xyzh/api/usercenter/collection/UserCollectionService.java b/schoolNewsServ/api/api-usercenter/src/main/java/org/xyzh/api/usercenter/collection/UserCollectionService.java index bb41cf9..30a91bc 100644 --- a/schoolNewsServ/api/api-usercenter/src/main/java/org/xyzh/api/usercenter/collection/UserCollectionService.java +++ b/schoolNewsServ/api/api-usercenter/src/main/java/org/xyzh/api/usercenter/collection/UserCollectionService.java @@ -23,14 +23,12 @@ public interface UserCollectionService { /** * @description 取消收藏 - * @param userID 用户ID - * @param collectionType 收藏类型 - * @param collectionID 收藏对象ID + * @param userCollection 收藏信息 * @return ResultDomain 取消结果 * @author yslg * @since 2025-10-15 */ - ResultDomain removeCollection(String userID, Integer collectionType, String collectionID); + ResultDomain removeCollection(TbUserCollection userCollection); /** * @description 检查是否已收藏 diff --git a/schoolNewsServ/api/pom.xml b/schoolNewsServ/api/pom.xml index a1ecc67..2798bc2 100644 --- a/schoolNewsServ/api/pom.xml +++ b/schoolNewsServ/api/pom.xml @@ -18,6 +18,7 @@ api-auth api-system api-usercenter + api-achievement api-ai api-study api-news @@ -61,6 +62,11 @@ api-usercenter ${school-news.version} + + org.xyzh + api-achievement + ${school-news.version} + org.xyzh api-ai @@ -71,7 +77,11 @@ api-news ${school-news.version} - + + org.xyzh + api-file + ${school-news.version} + diff --git a/schoolNewsServ/common/common-core/src/main/java/org/xyzh/common/core/enums/AchievementConditionType.java b/schoolNewsServ/common/common-core/src/main/java/org/xyzh/common/core/enums/AchievementConditionType.java new file mode 100644 index 0000000..5b7b323 --- /dev/null +++ b/schoolNewsServ/common/common-core/src/main/java/org/xyzh/common/core/enums/AchievementConditionType.java @@ -0,0 +1,90 @@ +package org.xyzh.common.core.enums; + +/** + * @description 成就条件类型枚举 + * @filename AchievementConditionType.java + * @author yslg + * @copyright xyzh + * @since 2025-10-24 + */ +public enum AchievementConditionType { + + /** + * 1-学习时长(分钟) + */ + LEARNING_TIME(1, "学习时长"), + + /** + * 2-浏览资源数量 + */ + RESOURCE_VIEW_COUNT(2, "浏览资源数量"), + + /** + * 3-完成课程数量 + */ + COURSE_COMPLETE_COUNT(3, "完成课程数量"), + + /** + * 4-连续登录天数 + */ + CONTINUOUS_LOGIN_DAYS(4, "连续登录天数"), + + /** + * 5-收藏资源数量 + */ + RESOURCE_COLLECT_COUNT(5, "收藏资源数量"), + + /** + * 6-完成任务数量 + */ + TASK_COMPLETE_COUNT(6, "完成任务数量"), + + /** + * 7-获得积分数量 + */ + POINTS_EARNED(7, "获得积分数量"), + + /** + * 8-发表评论数量 + */ + COMMENT_COUNT(8, "发表评论数量"), + + /** + * 9-完成章节数量 + */ + CHAPTER_COMPLETE_COUNT(9, "完成章节数量"), + + /** + * 10-累计登录天数 + */ + TOTAL_LOGIN_DAYS(10, "累计登录天数"); + + private final int code; + private final String description; + + AchievementConditionType(int code, String description) { + this.code = code; + this.description = description; + } + + public int getCode() { + return code; + } + + public String getDescription() { + return description; + } + + /** + * 根据code获取条件类型 + */ + public static AchievementConditionType fromCode(int code) { + for (AchievementConditionType type : values()) { + if (type.code == code) { + return type; + } + } + return null; + } +} + diff --git a/schoolNewsServ/common/common-core/src/main/java/org/xyzh/common/core/enums/AchievementEventType.java b/schoolNewsServ/common/common-core/src/main/java/org/xyzh/common/core/enums/AchievementEventType.java new file mode 100644 index 0000000..11522fc --- /dev/null +++ b/schoolNewsServ/common/common-core/src/main/java/org/xyzh/common/core/enums/AchievementEventType.java @@ -0,0 +1,84 @@ +package org.xyzh.common.core.enums; + +/** + * @description 成就事件类型枚举 + * @filename AchievementEventType.java + * @author yslg + * @copyright xyzh + * @since 2025-10-24 + */ +public enum AchievementEventType { + + /** + * 学习相关事件 + */ + LEARNING_TIME_UPDATED("learning_time_updated", "学习时长更新"), + COURSE_COMPLETED("course_completed", "课程完成"), + COURSE_STARTED("course_started", "开始学习课程"), + CHAPTER_COMPLETED("chapter_completed", "章节完成"), + + /** + * 资源相关事件 + */ + RESOURCE_VIEWED("resource_viewed", "浏览资源"), + RESOURCE_COLLECTED("resource_collected", "收藏资源"), + RESOURCE_SHARED("resource_shared", "分享资源"), + + /** + * 任务相关事件 + */ + TASK_COMPLETED("task_completed", "任务完成"), + TASK_ITEM_COMPLETED("task_item_completed", "任务项完成"), + + /** + * 互动相关事件 + */ + COMMENT_POSTED("comment_posted", "发表评论"), + LIKE_GIVEN("like_given", "点赞"), + + /** + * 登录相关事件 + */ + USER_LOGIN("user_login", "用户登录"), + CONTINUOUS_LOGIN("continuous_login", "连续登录"), + + /** + * 积分相关事件 + */ + POINTS_EARNED("points_earned", "获得积分"), + + /** + * 测试相关事件 + */ + TEST_PASSED("test_passed", "测试通过"), + TEST_PERFECT_SCORE("test_perfect_score", "测试满分"); + + private final String code; + private final String description; + + AchievementEventType(String code, String description) { + this.code = code; + this.description = description; + } + + public String getCode() { + return code; + } + + public String getDescription() { + return description; + } + + /** + * 根据code获取事件类型 + */ + public static AchievementEventType fromCode(String code) { + for (AchievementEventType type : values()) { + if (type.code.equals(code)) { + return type; + } + } + return null; + } +} + diff --git a/schoolNewsServ/common/common-core/src/main/java/org/xyzh/common/core/enums/TaskItemType.java b/schoolNewsServ/common/common-core/src/main/java/org/xyzh/common/core/enums/TaskItemType.java new file mode 100644 index 0000000..1bb0532 --- /dev/null +++ b/schoolNewsServ/common/common-core/src/main/java/org/xyzh/common/core/enums/TaskItemType.java @@ -0,0 +1,33 @@ +package org.xyzh.common.core.enums; + +/** + * @description 任务项类型常量 + * @filename TaskItemType.java + * @author yslg + * @copyright xyzh + * @since 2025-10-24 + */ +public enum TaskItemType { + + /** + * 资源类型 + */ + RESOURCE(1), + + /** + * 课程类型 + */ + COURSE(2); + + private int value; + + TaskItemType(int value) { + this.value = value; + } + + public int getValue() { + return value; + } + +} + diff --git a/schoolNewsServ/common/common-core/src/main/java/org/xyzh/common/core/event/AchievementEvent.java b/schoolNewsServ/common/common-core/src/main/java/org/xyzh/common/core/event/AchievementEvent.java new file mode 100644 index 0000000..3cccdeb --- /dev/null +++ b/schoolNewsServ/common/common-core/src/main/java/org/xyzh/common/core/event/AchievementEvent.java @@ -0,0 +1,151 @@ +package org.xyzh.common.core.event; + +import org.xyzh.common.core.enums.AchievementEventType; + +import java.util.Date; +import java.util.HashMap; +import java.util.Map; + +/** + * @description 成就事件数据类 + * @filename AchievementEvent.java + * @author yslg + * @copyright xyzh + * @since 2025-10-24 + */ +public class AchievementEvent { + + /** + * 用户ID + */ + private String userID; + + /** + * 事件类型 + */ + private AchievementEventType eventType; + + /** + * 事件值(如学习时长、资源数量等) + */ + private Integer eventValue; + + /** + * 事件时间 + */ + private Date eventTime; + + /** + * 额外数据 + */ + private Map extraData; + + public AchievementEvent() { + this.eventTime = new Date(); + this.extraData = new HashMap<>(); + } + + public AchievementEvent(String userID, AchievementEventType eventType, Integer eventValue) { + this.userID = userID; + this.eventType = eventType; + this.eventValue = eventValue; + this.eventTime = new Date(); + this.extraData = new HashMap<>(); + } + + /** + * 构建器模式 + */ + public static class Builder { + private final AchievementEvent event; + + public Builder(String userID, AchievementEventType eventType) { + event = new AchievementEvent(); + event.userID = userID; + event.eventType = eventType; + } + + public Builder value(Integer value) { + event.eventValue = value; + return this; + } + + public Builder extra(String key, Object value) { + event.extraData.put(key, value); + return this; + } + + public Builder time(Date time) { + event.eventTime = time; + return this; + } + + public AchievementEvent build() { + return event; + } + } + + public static Builder builder(String userID, AchievementEventType eventType) { + return new Builder(userID, eventType); + } + + public String getUserID() { + return userID; + } + + public void setUserID(String userID) { + this.userID = userID; + } + + public AchievementEventType getEventType() { + return eventType; + } + + public void setEventType(AchievementEventType eventType) { + this.eventType = eventType; + } + + public Integer getEventValue() { + return eventValue; + } + + public void setEventValue(Integer eventValue) { + this.eventValue = eventValue; + } + + public Date getEventTime() { + return eventTime; + } + + public void setEventTime(Date eventTime) { + this.eventTime = eventTime; + } + + public Map getExtraData() { + return extraData; + } + + public void setExtraData(Map extraData) { + this.extraData = extraData; + } + + public Object getExtraData(String key) { + return extraData.get(key); + } + + public void putExtraData(String key, Object value) { + this.extraData.put(key, value); + } + + @Override + public String toString() { + return "AchievementEvent{" + + "userID='" + userID + '\'' + + ", eventType=" + eventType + + ", eventValue=" + eventValue + + ", eventTime=" + eventTime + + ", extraData=" + extraData + + '}'; + } +} + diff --git a/schoolNewsServ/common/common-dto/src/main/java/org/xyzh/common/dto/study/TbLearningRecord.java b/schoolNewsServ/common/common-dto/src/main/java/org/xyzh/common/dto/study/TbLearningRecord.java index 4c76940..c88909f 100644 --- a/schoolNewsServ/common/common-dto/src/main/java/org/xyzh/common/dto/study/TbLearningRecord.java +++ b/schoolNewsServ/common/common-dto/src/main/java/org/xyzh/common/dto/study/TbLearningRecord.java @@ -19,6 +19,11 @@ public class TbLearningRecord extends BaseDTO { * @description 用户ID */ private String userID; + + /** + * @description 任务ID + */ + private String taskID; /** * @description 资源类型(1资源 2课程 3章节) @@ -29,11 +34,21 @@ public class TbLearningRecord extends BaseDTO { * @description 资源ID */ private String resourceID; - + /** - * @description 任务ID + * @description 课程ID */ - private String taskID; + private String courseID; + + /** + * @description 章节ID + */ + private String chapterID; + + /** + * @description 节点ID + */ + private String nodeID; /** * @description 学习时长(秒) @@ -79,11 +94,6 @@ public class TbLearningRecord extends BaseDTO { * @description 删除时间 */ private Date deleteTime; - - /** - * @description 是否删除 - */ - private Boolean deleted; public String getUserID() { return userID; @@ -93,6 +103,14 @@ public class TbLearningRecord extends BaseDTO { this.userID = userID; } + public String getTaskID() { + return taskID; + } + + public void setTaskID(String taskID) { + this.taskID = taskID; + } + public Integer getResourceType() { return resourceType; } @@ -109,12 +127,30 @@ public class TbLearningRecord extends BaseDTO { this.resourceID = resourceID; } - public String getTaskID() { - return taskID; + + + public String getCourseID() { + return courseID; } - public void setTaskID(String taskID) { - this.taskID = taskID; + public void setCourseID(String courseID) { + this.courseID = courseID; + } + + public String getChapterID() { + return chapterID; + } + + public void setChapterID(String chapterID) { + this.chapterID = chapterID; + } + + public String getNodeID() { + return nodeID; + } + + public void setNodeID(String nodeID) { + this.nodeID = nodeID; } public Integer getDuration() { @@ -194,9 +230,12 @@ public class TbLearningRecord extends BaseDTO { return "TbLearningRecord{" + "id=" + getID() + ", userID='" + userID + '\'' + + ", taskID='" + taskID + '\'' + ", resourceType=" + resourceType + ", resourceID='" + resourceID + '\'' + - ", taskID='" + taskID + '\'' + + ", courseID='" + courseID + '\'' + + ", chapterID='" + chapterID + '\'' + + ", nodeID='" + nodeID + '\'' + ", duration=" + duration + ", progress=" + progress + ", isComplete=" + isComplete + diff --git a/schoolNewsServ/common/common-dto/src/main/java/org/xyzh/common/dto/study/TbTaskCourse.java b/schoolNewsServ/common/common-dto/src/main/java/org/xyzh/common/dto/study/TbTaskItem.java similarity index 64% rename from schoolNewsServ/common/common-dto/src/main/java/org/xyzh/common/dto/study/TbTaskCourse.java rename to schoolNewsServ/common/common-dto/src/main/java/org/xyzh/common/dto/study/TbTaskItem.java index 68353fe..ae38ee7 100644 --- a/schoolNewsServ/common/common-dto/src/main/java/org/xyzh/common/dto/study/TbTaskCourse.java +++ b/schoolNewsServ/common/common-dto/src/main/java/org/xyzh/common/dto/study/TbTaskItem.java @@ -4,13 +4,13 @@ import org.xyzh.common.dto.BaseDTO; import java.util.Date; /** - * @description 任务课程关联表 - * @filename TbTaskCourse.java + * @description 任务项关联表(统一管理资源和课程) + * @filename TbTaskItem.java * @author yslg * @copyright xyzh - * @since 2025-10-15 + * @since 2025-10-24 */ -public class TbTaskCourse extends BaseDTO { +public class TbTaskItem extends BaseDTO { private static final long serialVersionUID = 1L; @@ -20,9 +20,14 @@ public class TbTaskCourse extends BaseDTO { private String taskID; /** - * @description 课程ID + * @description 项类型(1资源 2课程) */ - private String courseID; + private Integer itemType; + + /** + * @description 项ID(资源ID或课程ID) + */ + private String itemID; /** * @description 是否必须完成 @@ -43,21 +48,8 @@ public class TbTaskCourse extends BaseDTO { * @description 更新者 */ private String updater; + - /** - * @description 更新时间 - */ - private Date updateTime; - - /** - * @description 删除时间 - */ - private Date deleteTime; - - /** - * @description 是否删除 - */ - private Boolean deleted; public String getTaskID() { return taskID; @@ -67,12 +59,20 @@ public class TbTaskCourse extends BaseDTO { this.taskID = taskID; } - public String getCourseID() { - return courseID; + public Integer getItemType() { + return itemType; } - public void setCourseID(String courseID) { - this.courseID = courseID; + public void setItemType(Integer itemType) { + this.itemType = itemType; + } + + public String getItemID() { + return itemID; + } + + public void setItemID(String itemID) { + this.itemID = itemID; } public Boolean getRequired() { @@ -107,31 +107,18 @@ public class TbTaskCourse extends BaseDTO { this.updater = updater; } - public Date getUpdateTime() { - return updateTime; - } - - public void setUpdateTime(Date updateTime) { - this.updateTime = updateTime; - } - - public Date getDeleteTime() { - return deleteTime; - } - - public void setDeleteTime(Date deleteTime) { - this.deleteTime = deleteTime; - } @Override public String toString() { - return "TbTaskCourse{" + + return "TbTaskItem{" + "id=" + getID() + ", taskID='" + taskID + '\'' + - ", courseID='" + courseID + '\'' + + ", itemType=" + itemType + + ", itemID='" + itemID + '\'' + ", required=" + required + ", orderNum=" + orderNum + ", createTime=" + getCreateTime() + '}'; } } + diff --git a/schoolNewsServ/common/common-dto/src/main/java/org/xyzh/common/dto/study/TbTaskResource.java b/schoolNewsServ/common/common-dto/src/main/java/org/xyzh/common/dto/study/TbTaskResource.java deleted file mode 100644 index d5d4dbc..0000000 --- a/schoolNewsServ/common/common-dto/src/main/java/org/xyzh/common/dto/study/TbTaskResource.java +++ /dev/null @@ -1,139 +0,0 @@ -package org.xyzh.common.dto.study; - -import org.xyzh.common.dto.BaseDTO; -import java.util.Date; - -/** - * @description 任务资源关联表 - * @filename TbTaskResource.java - * @author yslg - * @copyright xyzh - * @since 2025-10-15 - */ -public class TbTaskResource extends BaseDTO { - - private static final long serialVersionUID = 1L; - - /** - * @description 任务ID - */ - private String taskID; - - /** - * @description 资源ID - */ - private String resourceID; - - /** - * @description 是否必须完成 - */ - private Boolean required; - - /** - * @description 排序号 - */ - private Integer orderNum; - - /** - * @description 创建者 - */ - private String creator; - - /** - * @description 更新者 - */ - private String updater; - - /** - * @description 更新时间 - */ - private Date updateTime; - - /** - * @description 删除时间 - */ - private Date deleteTime; - - /** - * @description 是否删除 - */ - private Boolean deleted; - - public String getTaskID() { - return taskID; - } - - public void setTaskID(String taskID) { - this.taskID = taskID; - } - - public String getResourceID() { - return resourceID; - } - - public void setResourceID(String resourceID) { - this.resourceID = resourceID; - } - - public Boolean getRequired() { - return required; - } - - public void setRequired(Boolean required) { - this.required = required; - } - - public Integer getOrderNum() { - return orderNum; - } - - public void setOrderNum(Integer orderNum) { - this.orderNum = orderNum; - } - - public String getCreator() { - return creator; - } - - public void setCreator(String creator) { - this.creator = creator; - } - - public String getUpdater() { - return updater; - } - - public void setUpdater(String updater) { - this.updater = updater; - } - - public Date getUpdateTime() { - return updateTime; - } - - public void setUpdateTime(Date updateTime) { - this.updateTime = updateTime; - } - - public Date getDeleteTime() { - return deleteTime; - } - - public void setDeleteTime(Date deleteTime) { - this.deleteTime = deleteTime; - } - - - - @Override - public String toString() { - return "TbTaskResource{" + - "id=" + getID() + - ", taskID='" + taskID + '\'' + - ", resourceID='" + resourceID + '\'' + - ", required=" + required + - ", orderNum=" + orderNum + - ", createTime=" + getCreateTime() + - '}'; - } -} diff --git a/schoolNewsServ/common/common-dto/src/main/java/org/xyzh/common/dto/usercenter/TbUserAchievementProgress.java b/schoolNewsServ/common/common-dto/src/main/java/org/xyzh/common/dto/usercenter/TbUserAchievementProgress.java new file mode 100644 index 0000000..a93b1f1 --- /dev/null +++ b/schoolNewsServ/common/common-dto/src/main/java/org/xyzh/common/dto/usercenter/TbUserAchievementProgress.java @@ -0,0 +1,134 @@ +package org.xyzh.common.dto.usercenter; + +import org.xyzh.common.dto.BaseDTO; +import java.util.Date; + +/** + * @description 用户成就进度表 - 追踪用户朝向成就的进度 + * @filename TbUserAchievementProgress.java + * @author yslg + * @copyright xyzh + * @since 2025-10-24 + */ +public class TbUserAchievementProgress extends BaseDTO { + + private static final long serialVersionUID = 1L; + + /** + * @description 用户ID + */ + private String userID; + + /** + * @description 成就ID + */ + private String achievementID; + + /** + * @description 当前进度值 + */ + private Integer currentValue; + + /** + * @description 目标进度值(冗余字段,方便查询) + */ + private Integer targetValue; + + /** + * @description 进度百分比 (0-100) + */ + private Integer progressPercentage; + + /** + * @description 是否已完成 + */ + private Boolean completed; + + /** + * @description 最后更新时间 + */ + private Date lastUpdateTime; + + public String getUserID() { + return userID; + } + + public void setUserID(String userID) { + this.userID = userID; + } + + public String getAchievementID() { + return achievementID; + } + + public void setAchievementID(String achievementID) { + this.achievementID = achievementID; + } + + public Integer getCurrentValue() { + return currentValue; + } + + public void setCurrentValue(Integer currentValue) { + this.currentValue = currentValue; + updateProgressPercentage(); + } + + public Integer getTargetValue() { + return targetValue; + } + + public void setTargetValue(Integer targetValue) { + this.targetValue = targetValue; + updateProgressPercentage(); + } + + public Integer getProgressPercentage() { + return progressPercentage; + } + + public void setProgressPercentage(Integer progressPercentage) { + this.progressPercentage = progressPercentage; + } + + public Boolean getCompleted() { + return completed; + } + + public void setCompleted(Boolean completed) { + this.completed = completed; + } + + public Date getLastUpdateTime() { + return lastUpdateTime; + } + + public void setLastUpdateTime(Date lastUpdateTime) { + this.lastUpdateTime = lastUpdateTime; + } + + /** + * 更新进度百分比 + */ + private void updateProgressPercentage() { + if (currentValue != null && targetValue != null && targetValue > 0) { + this.progressPercentage = Math.min(100, (int) ((currentValue * 100.0) / targetValue)); + this.completed = currentValue >= targetValue; + } + } + + @Override + public String toString() { + return "TbUserAchievementProgress{" + + "id=" + getID() + + ", userID='" + userID + '\'' + + ", achievementID='" + achievementID + '\'' + + ", currentValue=" + currentValue + + ", targetValue=" + targetValue + + ", progressPercentage=" + progressPercentage + + ", completed=" + completed + + ", lastUpdateTime=" + lastUpdateTime + + '}'; + } +} + diff --git a/schoolNewsServ/common/common-dto/src/main/java/org/xyzh/common/vo/TaskItemVO.java b/schoolNewsServ/common/common-dto/src/main/java/org/xyzh/common/vo/TaskItemVO.java index f9a0c84..541bbb5 100644 --- a/schoolNewsServ/common/common-dto/src/main/java/org/xyzh/common/vo/TaskItemVO.java +++ b/schoolNewsServ/common/common-dto/src/main/java/org/xyzh/common/vo/TaskItemVO.java @@ -1,17 +1,15 @@ package org.xyzh.common.vo; import java.math.BigDecimal; -import java.util.ArrayList; import java.util.Date; -import java.util.List; import org.xyzh.common.dto.study.TbLearningTask; -import org.xyzh.common.dto.study.TbTaskCourse; -import org.xyzh.common.dto.study.TbTaskResource; +import org.xyzh.common.dto.study.TbTaskItem; import org.xyzh.common.dto.study.TbTaskUser; public class TaskItemVO extends TbLearningTask { + private Integer itemType; private String courseID; private String courseName; private String resourceID; @@ -29,18 +27,31 @@ public class TaskItemVO extends TbLearningTask { public TaskItemVO() { } - public TaskItemVO(TbTaskCourse taskCourse) { - this.courseID = taskCourse.getCourseID(); - this.setTaskID(taskCourse.getTaskID()); - this.orderNum = taskCourse.getOrderNum(); - this.required = taskCourse.getRequired(); + public Integer getItemType() { + return itemType; } - public TaskItemVO(TbTaskResource taskResource) { - this.resourceID = taskResource.getResourceID(); - this.setTaskID(taskResource.getTaskID()); - this.required = taskResource.getRequired(); - this.orderNum = taskResource.getOrderNum(); + public void setItemType(Integer itemType) { + this.itemType = itemType; + } + + public TaskItemVO(TbTaskItem taskItem) { + this.itemType = taskItem.getItemType(); + this.setTaskID(taskItem.getTaskID()); + this.orderNum = taskItem.getOrderNum(); + this.required = taskItem.getRequired(); + this.setID(taskItem.getID()); + this.setCreateTime(taskItem.getCreateTime()); + this.setCreator(taskItem.getCreator()); + + // 根据类型设置对应的ID + if (taskItem.getItemType() != null) { + if (taskItem.getItemType() == 2) { // 课程 + this.courseID = taskItem.getItemID(); + } else if (taskItem.getItemType() == 1) { // 资源 + this.resourceID = taskItem.getItemID(); + } + } } public TaskItemVO(TbTaskUser taskUser) { this.userID = taskUser.getUserID(); @@ -100,21 +111,30 @@ public class TaskItemVO extends TbLearningTask { this.orderNum = orderNum; } - public TbTaskCourse toTaskCourse() { - TbTaskCourse taskCourse = new TbTaskCourse(); - taskCourse.setCourseID(courseID); - taskCourse.setTaskID(getTaskID()); - taskCourse.setCreateTime(getCreateTime()); - taskCourse.setCreator(getCreator()); - return taskCourse; - } - public TbTaskResource toTaskResource() { - TbTaskResource taskResource = new TbTaskResource(); - taskResource.setResourceID(resourceID); - taskResource.setTaskID(getTaskID()); - taskResource.setCreateTime(getCreateTime()); - taskResource.setCreator(getCreator()); - return taskResource; + public TbTaskItem toTaskItem() { + TbTaskItem taskItem = new TbTaskItem(); + taskItem.setID(getID()); + taskItem.setTaskID(getTaskID()); + taskItem.setItemType(itemType); + taskItem.setRequired(required); + taskItem.setOrderNum(orderNum); + taskItem.setCreateTime(getCreateTime()); + taskItem.setCreator(getCreator()); + + // 根据类型设置对应的itemID + if (courseID != null && !courseID.isEmpty()) { + taskItem.setItemID(courseID); + if (itemType == null) { + taskItem.setItemType(2); // 课程 + } + } else if (resourceID != null && !resourceID.isEmpty()) { + taskItem.setItemID(resourceID); + if (itemType == null) { + taskItem.setItemType(1); // 资源 + } + } + + return taskItem; } public TbTaskUser toTaskUser() { TbTaskUser taskUser = new TbTaskUser(); diff --git a/schoolNewsServ/common/common-dto/src/main/java/org/xyzh/common/vo/TaskVO.java b/schoolNewsServ/common/common-dto/src/main/java/org/xyzh/common/vo/TaskVO.java index 69aed09..cf10df3 100644 --- a/schoolNewsServ/common/common-dto/src/main/java/org/xyzh/common/vo/TaskVO.java +++ b/schoolNewsServ/common/common-dto/src/main/java/org/xyzh/common/vo/TaskVO.java @@ -2,8 +2,7 @@ package org.xyzh.common.vo; import org.xyzh.common.dto.BaseDTO; import org.xyzh.common.dto.study.TbLearningTask; -import org.xyzh.common.dto.study.TbTaskCourse; -import org.xyzh.common.dto.study.TbTaskResource; +import org.xyzh.common.dto.study.TbTaskItem; import org.xyzh.common.dto.study.TbTaskUser; import java.util.List; @@ -77,31 +76,28 @@ public class TaskVO extends BaseDTO{ public void setTaskStatus(Integer taskStatus) { this.taskStatus = taskStatus; } - public List toTaskCourses() { - return getTaskCourses().stream().map(TaskItemVO::toTaskCourse).collect(Collectors.toList()); + public List toTaskCourses() { + return getTaskCourses().stream().map(TaskItemVO::toTaskItem).collect(Collectors.toList()); } - public List toTaskResources() { - return getTaskResources().stream().map(TaskItemVO::toTaskResource).collect(Collectors.toList()); + public List toTaskResources() { + return getTaskResources().stream().map(TaskItemVO::toTaskItem).collect(Collectors.toList()); } public List toTaskUsers() { return getTaskUsers().stream().map(TaskItemVO::toTaskUser).collect(Collectors.toList()); } - public void setTaskCourseList(List taskCourses) { - if (taskCourses == null) { + public void setTaskItemList(List taskItems) { + if (taskItems == null) { return; } - this.taskCourses = taskCourses.stream().map(item -> { - return new TaskItemVO(item); - }).collect(Collectors.toList()); - } - public void setTaskResourceList(List taskResources) { - if (taskResources == null) { - return; - } - this.taskResources = taskResources.stream().map(item -> { - return new TaskItemVO(item); - }).collect(Collectors.toList()); + this.taskCourses = taskItems.stream() + .filter(item -> item.getItemType() == 2) + .map(TaskItemVO::new) + .collect(Collectors.toList()); + this.taskResources = taskItems.stream() + .filter(item -> item.getItemType() == 1) + .map(TaskItemVO::new) + .collect(Collectors.toList()); } public void setTaskUserList(List taskUsers) { if (taskUsers == null) { diff --git a/schoolNewsServ/news/src/main/java/org/xyzh/news/controller/ResourceController.java b/schoolNewsServ/news/src/main/java/org/xyzh/news/controller/ResourceController.java index 4d5d8c7..d1186f4 100644 --- a/schoolNewsServ/news/src/main/java/org/xyzh/news/controller/ResourceController.java +++ b/schoolNewsServ/news/src/main/java/org/xyzh/news/controller/ResourceController.java @@ -124,7 +124,7 @@ public class ResourceController { * 增加浏览次数 */ @PostMapping("/resource/{resourceID}/view") - public ResultDomain incrementViewCount(@PathVariable("resourceID") String resourceID) { + public ResultDomain incrementViewCount(@PathVariable("resourceID") String resourceID) { return resourceService.incrementViewCount(resourceID); } diff --git a/schoolNewsServ/news/src/main/java/org/xyzh/news/mapper/ResourceMapper.java b/schoolNewsServ/news/src/main/java/org/xyzh/news/mapper/ResourceMapper.java index 7b185c2..f4cf83c 100644 --- a/schoolNewsServ/news/src/main/java/org/xyzh/news/mapper/ResourceMapper.java +++ b/schoolNewsServ/news/src/main/java/org/xyzh/news/mapper/ResourceMapper.java @@ -173,4 +173,13 @@ public interface ResourceMapper extends BaseMapper { * @since 2025-10-15 */ int updateResourceCollectCount(@Param("resourceID") String resourceID, @Param("collectionValue") Integer collectionValue); + + /** + * @description 增加资源浏览次数 + * @param resourceID 资源ID + * @return int 影响行数 + * @author yslg + * @since 2025-10-15 + */ + int incrementViewCount(@Param("resourceID") String resourceID); } diff --git a/schoolNewsServ/news/src/main/java/org/xyzh/news/service/impl/NCResourceServiceImpl.java b/schoolNewsServ/news/src/main/java/org/xyzh/news/service/impl/NCResourceServiceImpl.java index 0498ddd..7315a62 100644 --- a/schoolNewsServ/news/src/main/java/org/xyzh/news/service/impl/NCResourceServiceImpl.java +++ b/schoolNewsServ/news/src/main/java/org/xyzh/news/service/impl/NCResourceServiceImpl.java @@ -397,7 +397,7 @@ public class NCResourceServiceImpl implements ResourceService { if (result > 0) { logger.info("发布资源成功: {}", resourceID); // 重新查询返回完整数据 - TbResource updated = resourceMapper.selectById(resource.getID()); + TbResource updated = resourceMapper.selectByResourceId(resource.getID()); resultDomain.success("发布资源成功", updated); return resultDomain; } else { @@ -437,7 +437,7 @@ public class NCResourceServiceImpl implements ResourceService { if (result > 0) { logger.info("下架资源成功: {}", resourceID); // 重新查询返回完整数据 - TbResource updated = resourceMapper.selectById(resource.getID()); + TbResource updated = resourceMapper.selectByResourceId(resource.getID()); resultDomain.success("下架资源成功", updated); return resultDomain; } else { @@ -453,33 +453,20 @@ public class NCResourceServiceImpl implements ResourceService { @Override @Transactional(rollbackFor = Exception.class) - public ResultDomain incrementViewCount(String resourceID) { - ResultDomain resultDomain = new ResultDomain<>(); + public ResultDomain incrementViewCount(String resourceID) { + ResultDomain resultDomain = new ResultDomain<>(); try { - // 参数验证 + // 参数验证 if (!StringUtils.hasText(resourceID)) { resultDomain.fail("资源ID不能为空"); return resultDomain; } - // 查询资源 - TbResource resource = resourceMapper.selectByResourceId(resourceID); - if (resource == null || resource.getDeleted()) { - resultDomain.fail("资源不存在"); - return resultDomain; - } - - // 增加浏览次数 - Integer currentCount = resource.getViewCount() != null ? resource.getViewCount() : 0; - resource.setViewCount(currentCount + 1); - resource.setUpdateTime(new Date()); - - int result = resourceMapper.updateResource(resource); + int result = resourceMapper.incrementViewCount(resourceID); if (result > 0) { logger.info("增加资源浏览次数成功: {}", resourceID); // 重新查询返回完整数据 - TbResource updated = resourceMapper.selectById(resource.getID()); - resultDomain.success("增加浏览次数成功", updated); + resultDomain.success("增加浏览次数成功", true); return resultDomain; } else { resultDomain.fail("增加浏览次数失败"); @@ -563,7 +550,7 @@ public class NCResourceServiceImpl implements ResourceService { return resultDomain; } else if (isCollected.isSuccess() && isCollected.getData() && collectionValue == -1) { - ResultDomain removeCollection = userCollectionService.removeCollection(user.getID(), collection.getCollectionType(), resourceID); + ResultDomain removeCollection = userCollectionService.removeCollection(collection); if (removeCollection.isSuccess()) { resourceMapper.updateResourceCollectCount(resourceID, -1); resultDomain.success("已取消收藏", resource); diff --git a/schoolNewsServ/news/src/main/resources/mapper/ResourceMapper.xml b/schoolNewsServ/news/src/main/resources/mapper/ResourceMapper.xml index b08310e..7717dcc 100644 --- a/schoolNewsServ/news/src/main/resources/mapper/ResourceMapper.xml +++ b/schoolNewsServ/news/src/main/resources/mapper/ResourceMapper.xml @@ -310,4 +310,12 @@ SET collect_count = collect_count + #{collectionValue} WHERE resource_id = #{resourceID} + + + + + UPDATE tb_resource + SET view_count = view_count + 1 + WHERE resource_id = #{resourceID} + diff --git a/schoolNewsServ/pom.xml b/schoolNewsServ/pom.xml index efa33de..fa7ecc0 100644 --- a/schoolNewsServ/pom.xml +++ b/schoolNewsServ/pom.xml @@ -17,6 +17,7 @@ news study usercenter + achievement ai file @@ -102,16 +103,21 @@ study ${school-news.version} - - org.xyzh - usercenter - ${school-news.version} - - - org.xyzh - ai - ${school-news.version} - + + org.xyzh + usercenter + ${school-news.version} + + + org.xyzh + achievement + ${school-news.version} + + + org.xyzh + ai + ${school-news.version} + diff --git a/schoolNewsServ/study/src/main/java/org/xyzh/study/controller/CourseController.java b/schoolNewsServ/study/src/main/java/org/xyzh/study/controller/CourseController.java index 6b741e3..52ce863 100644 --- a/schoolNewsServ/study/src/main/java/org/xyzh/study/controller/CourseController.java +++ b/schoolNewsServ/study/src/main/java/org/xyzh/study/controller/CourseController.java @@ -10,6 +10,7 @@ import org.xyzh.common.core.page.PageRequest; import org.xyzh.common.dto.study.TbCourse; import org.xyzh.common.dto.study.TbCourseChapter; import org.xyzh.common.dto.study.TbCourseNode; +import org.xyzh.common.dto.study.TbLearningRecord; import org.xyzh.common.vo.ChapterVO; import org.xyzh.common.vo.CourseVO; import org.springframework.web.bind.annotation.PostMapping; diff --git a/schoolNewsServ/study/src/main/java/org/xyzh/study/controller/LearningRecordController.java b/schoolNewsServ/study/src/main/java/org/xyzh/study/controller/LearningRecordController.java index 147c283..43fbe9d 100644 --- a/schoolNewsServ/study/src/main/java/org/xyzh/study/controller/LearningRecordController.java +++ b/schoolNewsServ/study/src/main/java/org/xyzh/study/controller/LearningRecordController.java @@ -7,6 +7,10 @@ import org.springframework.web.bind.annotation.*; import org.xyzh.api.study.record.LearningRecordService; import org.xyzh.common.core.domain.ResultDomain; import org.xyzh.common.dto.study.TbLearningRecord; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.PathVariable; + /** * @description 学习记录控制器 @@ -16,7 +20,7 @@ import org.xyzh.common.dto.study.TbLearningRecord; * @since 2025-10-15 */ @RestController -@RequestMapping("/study/record") +@RequestMapping("/study/records") public class LearningRecordController { private static final Logger logger = LoggerFactory.getLogger(LearningRecordController.class); @@ -26,68 +30,46 @@ public class LearningRecordController { /** * 获取学习记录 */ - @GetMapping("/list") - public ResultDomain getLearningRecords( - @RequestParam(required = false) String userID, - @RequestParam(required = false) String resourceType, - @RequestParam(required = false) String resourceID) { - return null; - // return learningRecordService.getLearningRecords(userID, courseID, taskID); + @PostMapping("/list") + public ResultDomain getLearningRecordList(@RequestBody TbLearningRecord learningRecord) { + return learningRecordService.getLearningRecord(learningRecord); } /** * 创建学习记录 */ - @PostMapping("/create") - public ResultDomain createLearningRecord(@RequestBody TbLearningRecord record) { - return null; - // return learningRecordService.createLearningRecord(record); + @PostMapping("/record") + public ResultDomain insertLearningRecord(@RequestBody TbLearningRecord record) { + return learningRecordService.insertLearningRecord(record); } /** * 更新学习记录 */ - @PutMapping("/update") + @PutMapping("/record") public ResultDomain updateLearningRecord(@RequestBody TbLearningRecord record) { - return null; - // return learningRecordService.updateLearningRecord(record); + return learningRecordService.updateLearningRecord(record); } /** * 删除学习记录 */ - @DeleteMapping("/{recordID}") - public ResultDomain deleteLearningRecord(@PathVariable("recordID") String recordID) { - return null; - // return learningRecordService.deleteLearningRecord(recordID); + @DeleteMapping("/record") + public ResultDomain deleteLearningRecord(@RequestBody TbLearningRecord learningRecord) { + return learningRecordService.deleteLearningRecord(learningRecord.getID()); + } + + @PutMapping("/complete") + public ResultDomain markLearningComplete(@RequestBody TbLearningRecord learningRecord) { + return learningRecordService.markLearningComplete(learningRecord); } /** - * 根据ID获取学习记录 + * 查询用户课程的学习记录 */ - @GetMapping("/{recordID}") - public ResultDomain getRecordById(@PathVariable("recordID") String recordID) { - return null; - // return learningRecordService.getRecordById(recordID); - } - - /** - * 更新学习进度 - */ - @PutMapping("/{recordID}/progress") - public ResultDomain updateLearningProgress( - @PathVariable("recordID") String recordID, - @RequestParam Integer progress) { - return null; - // return learningRecordService.updateLearningProgress(recordID, progress); - } - - /** - * 完成学习 - */ - @PostMapping("/{recordID}/complete") - public ResultDomain completeLearning(@PathVariable("recordID") String recordID) { - return null; - // return learningRecordService.completeLearning(recordID); + @PostMapping("/course/records") + public ResultDomain getCourseLearningRecord(@RequestBody TbLearningRecord learningRecord) { + + return learningRecordService.getCourseLearningRecord(learningRecord); } } diff --git a/schoolNewsServ/study/src/main/java/org/xyzh/study/controller/LearningTaskController.java b/schoolNewsServ/study/src/main/java/org/xyzh/study/controller/LearningTaskController.java index ab00c7a..6adaad8 100644 --- a/schoolNewsServ/study/src/main/java/org/xyzh/study/controller/LearningTaskController.java +++ b/schoolNewsServ/study/src/main/java/org/xyzh/study/controller/LearningTaskController.java @@ -15,8 +15,6 @@ import org.xyzh.common.dto.study.TbLearningTask; import org.xyzh.common.dto.study.TbTaskUser; import org.xyzh.common.vo.TaskItemVO; import org.xyzh.common.vo.TaskVO; -import org.xyzh.common.dto.study.TbTaskCourse; -import org.xyzh.common.dto.study.TbTaskResource; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.PostMapping; @@ -65,6 +63,11 @@ public class LearningTaskController { return learningTaskService.getTaskById(taskID); } + @GetMapping("/{taskID}/user") + public ResultDomain getTaskUser(@PathVariable("taskID") String taskID) { + return learningTaskService.getTaskUser(taskID); + } + /** * 创建任务 */ @@ -157,4 +160,6 @@ public class LearningTaskController { return learningTaskService.getUserProgress(userID); } + + } diff --git a/schoolNewsServ/study/src/main/java/org/xyzh/study/mapper/LearningRecordMapper.java b/schoolNewsServ/study/src/main/java/org/xyzh/study/mapper/LearningRecordMapper.java index 9034d17..6bd9fef 100644 --- a/schoolNewsServ/study/src/main/java/org/xyzh/study/mapper/LearningRecordMapper.java +++ b/schoolNewsServ/study/src/main/java/org/xyzh/study/mapper/LearningRecordMapper.java @@ -62,7 +62,7 @@ public interface LearningRecordMapper extends BaseMapper { * @author yslg * @since 2025-10-15 */ - TbLearningRecord selectByUserIdAndCourseId(@Param("userId") String userId, @Param("courseId") String courseId); + List selectByUserIdAndCourseId(@Param("userId") String userId, @Param("courseId") String courseId); /** * @description 根据状态查询学习记录列表 @@ -107,7 +107,7 @@ public interface LearningRecordMapper extends BaseMapper { * @author yslg * @since 2025-10-15 */ - int deleteLearningRecord(TbLearningRecord learningRecord); + int deleteLearningRecord(@Param("recordId") String recordId); /** * @description 批量插入学习记录 diff --git a/schoolNewsServ/study/src/main/java/org/xyzh/study/mapper/TaskCourseMapper.java b/schoolNewsServ/study/src/main/java/org/xyzh/study/mapper/TaskCourseMapper.java deleted file mode 100644 index 71d13c6..0000000 --- a/schoolNewsServ/study/src/main/java/org/xyzh/study/mapper/TaskCourseMapper.java +++ /dev/null @@ -1,162 +0,0 @@ -package org.xyzh.study.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import org.apache.ibatis.annotations.Mapper; -import org.apache.ibatis.annotations.Param; -import org.xyzh.common.core.page.PageParam; -import org.xyzh.common.dto.study.TbTaskCourse; -import org.xyzh.common.vo.TaskItemVO; - -import java.util.List; - -/** - * @description TaskCourseMapper.java文件描述 任务课程关联数据访问层 - * @filename TaskCourseMapper.java - * @author yslg - * @copyright xyzh - * @since 2025-10-15 - */ -@Mapper -public interface TaskCourseMapper extends BaseMapper { - - /** - * @description 查询任务课程关联列表 - * @param filter 过滤条件 - * @return List 任务课程关联列表 - * @author yslg - * @since 2025-10-15 - */ - List selectTaskCourses(TbTaskCourse filter); - - /** - * @description 根据关联ID查询关联信息 - * @param relationId 关联ID - * @return TbTaskCourse 关联信息 - * @author yslg - * @since 2025-10-15 - */ - TbTaskCourse selectByRelationId(@Param("relationId") String relationId); - - /** - * @description 根据任务ID查询课程关联列表 - * @param taskId 任务ID - * @return List 课程关联列表 - * @author yslg - * @since 2025-10-15 - */ - List selectByTaskId(@Param("taskId") String taskId); - - List selectTaskItemByTaskId(@Param("taskId") String taskId); - - /** - * @description 根据课程ID查询任务关联列表 - * @param courseId 课程ID - * @return List 任务关联列表 - * @author yslg - * @since 2025-10-15 - */ - List selectByCourseId(@Param("courseId") String courseId); - - /** - * @description 根据任务ID和课程ID查询关联信息 - * @param taskId 任务ID - * @param courseId 课程ID - * @return TbTaskCourse 关联信息 - * @author yslg - * @since 2025-10-15 - */ - TbTaskCourse selectByTaskIdAndCourseId(@Param("taskId") String taskId, @Param("courseId") String courseId); - - /** - * @description 检查任务课程关联是否存在 - * @param taskId 任务ID - * @param courseId 课程ID - * @param excludeId 排除的关联ID(用于更新时排除自身) - * @return int 存在的数量 - * @author yslg - * @since 2025-10-15 - */ - int countByTaskIdAndCourseId(@Param("taskId") String taskId, @Param("courseId") String courseId, @Param("excludeId") String excludeId); - - /** - * @description 插入任务课程关联 - * @param taskCourse 任务课程关联 - * @return int 影响行数 - * @author yslg - * @since 2025-10-15 - */ - int insertTaskCourse(TbTaskCourse taskCourse); - - /** - * @description 更新任务课程关联 - * @param taskCourse 任务课程关联 - * @return int 影响行数 - * @author yslg - * @since 2025-10-15 - */ - int updateTaskCourse(TbTaskCourse taskCourse); - - /** - * @description 删除任务课程关联 - * @param taskCourse 任务课程关联 - * @return int 影响行数 - * @author yslg - * @since 2025-10-15 - */ - int deleteTaskCourse(TbTaskCourse taskCourse); - - /** - * @description 批量插入任务课程关联 - * @param taskCourseList 任务课程关联列表 - * @return int 影响行数 - * @author yslg - * @since 2025-10-15 - */ - int batchInsertTaskCourses(@Param("taskCourseList") List taskCourseList); - - /** - * @description 批量删除任务课程关联 - * @param ids 关联ID列表 - * @return int 影响行数 - * @author yslg - * @since 2025-10-15 - */ - int batchDeleteTaskCourses(@Param("ids") List ids); - - /** - * @description 根据任务ID批量删除课程关联 - * @param taskId 任务ID - * @return int 影响行数 - * @author yslg - * @since 2025-10-15 - */ - int deleteByTaskId(@Param("taskId") String taskId); - - /** - * @description 根据课程ID批量删除任务关联 - * @param courseId 课程ID - * @return int 影响行数 - * @author yslg - * @since 2025-10-15 - */ - int deleteByCourseId(@Param("courseId") String courseId); - - /** - * @description 分页查询任务课程关联 - * @param filter 过滤条件 - * @param pageParam 分页参数 - * @return List 任务课程关联列表 - * @author yslg - * @since 2025-10-15 - */ - List selectTaskCoursesPage(@Param("filter") TbTaskCourse filter, @Param("pageParam") PageParam pageParam); - - /** - * @description 统计任务课程关联总数 - * @param filter 过滤条件 - * @return long 总数 - * @author yslg - * @since 2025-10-15 - */ - long countTaskCourses(@Param("filter") TbTaskCourse filter); -} diff --git a/schoolNewsServ/study/src/main/java/org/xyzh/study/mapper/TaskItemMapper.java b/schoolNewsServ/study/src/main/java/org/xyzh/study/mapper/TaskItemMapper.java new file mode 100644 index 0000000..cda45cd --- /dev/null +++ b/schoolNewsServ/study/src/main/java/org/xyzh/study/mapper/TaskItemMapper.java @@ -0,0 +1,194 @@ +package org.xyzh.study.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; +import org.xyzh.common.core.page.PageParam; +import org.xyzh.common.dto.study.TbTaskItem; +import org.xyzh.common.vo.TaskItemVO; + +import java.util.List; + +/** + * @description TaskItemMapper.java文件描述 任务项关联数据访问层 + * @filename TaskItemMapper.java + * @author yslg + * @copyright xyzh + * @since 2025-10-24 + */ +@Mapper +public interface TaskItemMapper extends BaseMapper { + + /** + * @description 查询任务项关联列表 + * @param filter 过滤条件 + * @return List 任务项关联列表 + * @author yslg + * @since 2025-10-24 + */ + List selectTaskItems(TbTaskItem filter); + + /** + * @description 根据关联ID查询关联信息 + * @param relationId 关联ID + * @return TbTaskItem 关联信息 + * @author yslg + * @since 2025-10-24 + */ + TbTaskItem selectByRelationId(@Param("relationId") String relationId); + + /** + * @description 根据任务ID查询项关联列表 + * @param taskId 任务ID + * @return List 项关联列表 + * @author yslg + * @since 2025-10-24 + */ + List selectByTaskId(@Param("taskId") String taskId); + + /** + * @description 根据任务ID和类型查询项关联列表 + * @param taskId 任务ID + * @param itemType 项类型(1资源 2课程) + * @return List 项关联列表 + * @author yslg + * @since 2025-10-24 + */ + List selectByTaskIdAndType(@Param("taskId") String taskId, @Param("itemType") Integer itemType); + + /** + * @description 根据任务ID查询任务项VO列表 + * @param taskId 任务ID + * @return List 任务项VO列表 + * @author yslg + * @since 2025-10-24 + */ + List selectTaskItemVOByTaskId(@Param("taskId") String taskId); + + /** + * @description 根据任务ID和用户ID查询任务项视图对象列表(包含该用户的学习状态) + * @param taskId 任务ID + * @param userId 用户ID + * @return List 任务项视图对象列表 + * @author yslg + * @since 2025-10-24 + */ + List selectTaskItemVOByTaskIdAndUserId(@Param("taskId") String taskId, @Param("userId") String userId); + + /** + * @description 根据项ID查询任务关联列表 + * @param itemId 项ID + * @param itemType 项类型(1资源 2课程) + * @return List 任务关联列表 + * @author yslg + * @since 2025-10-24 + */ + List selectByItemId(@Param("itemId") String itemId, @Param("itemType") Integer itemType); + + /** + * @description 根据任务ID和项ID查询关联信息 + * @param taskId 任务ID + * @param itemId 项ID + * @param itemType 项类型 + * @return TbTaskItem 关联信息 + * @author yslg + * @since 2025-10-24 + */ + TbTaskItem selectByTaskIdAndItemId(@Param("taskId") String taskId, @Param("itemId") String itemId, @Param("itemType") Integer itemType); + + /** + * @description 检查任务项关联是否存在 + * @param taskId 任务ID + * @param itemId 项ID + * @param itemType 项类型 + * @param excludeId 排除的关联ID(用于更新时排除自身) + * @return int 存在的数量 + * @author yslg + * @since 2025-10-24 + */ + int countByTaskIdAndItemId(@Param("taskId") String taskId, @Param("itemId") String itemId, @Param("itemType") Integer itemType, @Param("excludeId") String excludeId); + + /** + * @description 插入任务项关联 + * @param taskItem 任务项关联 + * @return int 影响行数 + * @author yslg + * @since 2025-10-24 + */ + int insertTaskItem(TbTaskItem taskItem); + + /** + * @description 更新任务项关联 + * @param taskItem 任务项关联 + * @return int 影响行数 + * @author yslg + * @since 2025-10-24 + */ + int updateTaskItem(TbTaskItem taskItem); + + /** + * @description 删除任务项关联 + * @param taskItem 任务项关联 + * @return int 影响行数 + * @author yslg + * @since 2025-10-24 + */ + int deleteTaskItem(TbTaskItem taskItem); + + /** + * @description 批量插入任务项关联 + * @param taskItemList 任务项关联列表 + * @return int 影响行数 + * @author yslg + * @since 2025-10-24 + */ + int batchInsertTaskItems(@Param("taskItemList") List taskItemList); + + /** + * @description 批量删除任务项关联 + * @param ids 关联ID列表 + * @return int 影响行数 + * @author yslg + * @since 2025-10-24 + */ + int batchDeleteTaskItems(@Param("ids") List ids); + + /** + * @description 根据任务ID批量删除项关联 + * @param taskId 任务ID + * @return int 影响行数 + * @author yslg + * @since 2025-10-24 + */ + int deleteByTaskId(@Param("taskId") String taskId); + + /** + * @description 根据项ID批量删除任务关联 + * @param itemId 项ID + * @param itemType 项类型 + * @return int 影响行数 + * @author yslg + * @since 2025-10-24 + */ + int deleteByItemId(@Param("itemId") String itemId, @Param("itemType") Integer itemType); + + /** + * @description 分页查询任务项关联 + * @param filter 过滤条件 + * @param pageParam 分页参数 + * @return List 任务项关联列表 + * @author yslg + * @since 2025-10-24 + */ + List selectTaskItemsPage(@Param("filter") TbTaskItem filter, @Param("pageParam") PageParam pageParam); + + /** + * @description 统计任务项关联总数 + * @param filter 过滤条件 + * @return long 总数 + * @author yslg + * @since 2025-10-24 + */ + long countTaskItems(@Param("filter") TbTaskItem filter); +} + diff --git a/schoolNewsServ/study/src/main/java/org/xyzh/study/mapper/TaskResourceMapper.java b/schoolNewsServ/study/src/main/java/org/xyzh/study/mapper/TaskResourceMapper.java deleted file mode 100644 index f3412cb..0000000 --- a/schoolNewsServ/study/src/main/java/org/xyzh/study/mapper/TaskResourceMapper.java +++ /dev/null @@ -1,169 +0,0 @@ -package org.xyzh.study.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import org.apache.ibatis.annotations.Mapper; -import org.apache.ibatis.annotations.Param; -import org.xyzh.common.core.page.PageParam; -import org.xyzh.common.dto.study.TbTaskResource; -import org.xyzh.common.vo.TaskItemVO; - -import java.util.List; - -/** - * @description TaskResourceMapper.java文件描述 任务资源关联数据访问层 - * @filename TaskResourceMapper.java - * @author yslg - * @copyright xyzh - * @since 2025-10-15 - */ -@Mapper -public interface TaskResourceMapper extends BaseMapper { - - /** - * @description 查询任务资源关联列表 - * @param filter 过滤条件 - * @return List 任务资源关联列表 - * @author yslg - * @since 2025-10-15 - */ - List selectTaskResources(TbTaskResource filter); - - /** - * @description 根据关联ID查询关联信息 - * @param relationId 关联ID - * @return TbTaskResource 关联信息 - * @author yslg - * @since 2025-10-15 - */ - TbTaskResource selectByRelationId(@Param("relationId") String relationId); - - /** - * @description 根据任务ID查询资源关联列表 - * @param taskId 任务ID - * @return List 资源关联列表 - * @author yslg - * @since 2025-10-15 - */ - List selectByTaskId(@Param("taskId") String taskId); - - /** - * @description 根据任务ID查询任务资源关联列表 - * @param taskId 任务ID - * @return List 任务资源关联列表 - * @author yslg - * @since 2025-10-15 - */ - List selectTaskItemByTaskId(@Param("taskId") String taskId); - - /** - * @description 根据资源ID查询任务关联列表 - * @param resourceId 资源ID - * @return List 任务关联列表 - * @author yslg - * @since 2025-10-15 - */ - List selectByResourceId(@Param("resourceId") String resourceId); - - /** - * @description 根据任务ID和资源ID查询关联信息 - * @param taskId 任务ID - * @param resourceId 资源ID - * @return TbTaskResource 关联信息 - * @author yslg - * @since 2025-10-15 - */ - TbTaskResource selectByTaskIdAndResourceId(@Param("taskId") String taskId, @Param("resourceId") String resourceId); - - /** - * @description 检查任务资源关联是否存在 - * @param taskId 任务ID - * @param resourceId 资源ID - * @param excludeId 排除的关联ID(用于更新时排除自身) - * @return int 存在的数量 - * @author yslg - * @since 2025-10-15 - */ - int countByTaskIdAndResourceId(@Param("taskId") String taskId, @Param("resourceId") String resourceId, @Param("excludeId") String excludeId); - - /** - * @description 插入任务资源关联 - * @param taskResource 任务资源关联 - * @return int 影响行数 - * @author yslg - * @since 2025-10-15 - */ - int insertTaskResource(TbTaskResource taskResource); - - /** - * @description 更新任务资源关联 - * @param taskResource 任务资源关联 - * @return int 影响行数 - * @author yslg - * @since 2025-10-15 - */ - int updateTaskResource(TbTaskResource taskResource); - - /** - * @description 删除任务资源关联 - * @param taskResource 任务资源关联 - * @return int 影响行数 - * @author yslg - * @since 2025-10-15 - */ - int deleteTaskResource(TbTaskResource taskResource); - - /** - * @description 批量插入任务资源关联 - * @param taskResourceList 任务资源关联列表 - * @return int 影响行数 - * @author yslg - * @since 2025-10-15 - */ - int batchInsertTaskResources(@Param("taskResourceList") List taskResourceList); - - /** - * @description 批量删除任务资源关联 - * @param ids 关联ID列表 - * @return int 影响行数 - * @author yslg - * @since 2025-10-15 - */ - int batchDeleteTaskResources(@Param("ids") List ids); - - /** - * @description 根据任务ID批量删除资源关联 - * @param taskId 任务ID - * @return int 影响行数 - * @author yslg - * @since 2025-10-15 - */ - int deleteByTaskId(@Param("taskId") String taskId); - - /** - * @description 根据资源ID批量删除任务关联 - * @param resourceId 资源ID - * @return int 影响行数 - * @author yslg - * @since 2025-10-15 - */ - int deleteByResourceId(@Param("resourceId") String resourceId); - - /** - * @description 分页查询任务资源关联 - * @param filter 过滤条件 - * @param pageParam 分页参数 - * @return List 任务资源关联列表 - * @author yslg - * @since 2025-10-15 - */ - List selectTaskResourcesPage(@Param("filter") TbTaskResource filter, @Param("pageParam") PageParam pageParam); - - /** - * @description 统计任务资源关联总数 - * @param filter 过滤条件 - * @return long 总数 - * @author yslg - * @since 2025-10-15 - */ - long countTaskResources(@Param("filter") TbTaskResource filter); -} diff --git a/schoolNewsServ/study/src/main/java/org/xyzh/study/mapper/TaskUserMapper.java b/schoolNewsServ/study/src/main/java/org/xyzh/study/mapper/TaskUserMapper.java index 4a3eada..14f1a86 100644 --- a/schoolNewsServ/study/src/main/java/org/xyzh/study/mapper/TaskUserMapper.java +++ b/schoolNewsServ/study/src/main/java/org/xyzh/study/mapper/TaskUserMapper.java @@ -47,6 +47,8 @@ public interface TaskUserMapper extends BaseMapper { List selectByTaskId(@Param("taskId") String taskId); List selectTaskItemByTaskId(@Param("taskId") String taskId); + + List selectUserTaskItem(@Param("taskId") String taskId, @Param("userId") String userId); /** * @description 根据用户ID查询任务关联列表 * @param userId 用户ID @@ -105,6 +107,15 @@ public interface TaskUserMapper extends BaseMapper { */ int insertTaskUser(TbTaskUser taskUser); + /** + * @description 更新任务用户关联 + * @param taskUser 任务用户关联 + * @return int 影响行数 + * @author yslg + * @since 2025-10-24 + */ + int updateTaskUser(TbTaskUser taskUser); + /** * @description 删除任务用户关联 * @param taskUser 任务用户关联 diff --git a/schoolNewsServ/study/src/main/java/org/xyzh/study/service/impl/SCCourseServiceImpl.java b/schoolNewsServ/study/src/main/java/org/xyzh/study/service/impl/SCCourseServiceImpl.java index b159ee9..74db2ea 100644 --- a/schoolNewsServ/study/src/main/java/org/xyzh/study/service/impl/SCCourseServiceImpl.java +++ b/schoolNewsServ/study/src/main/java/org/xyzh/study/service/impl/SCCourseServiceImpl.java @@ -21,6 +21,7 @@ import org.xyzh.common.dto.study.TbCourse; import org.xyzh.common.dto.study.TbCourseChapter; import org.xyzh.common.dto.study.TbCourseNode; import org.xyzh.common.dto.study.TbCourseTag; +import org.xyzh.common.dto.study.TbLearningRecord; import org.xyzh.common.dto.user.TbSysUser; import org.xyzh.common.utils.IDUtils; import org.xyzh.common.vo.ChapterVO; @@ -107,6 +108,7 @@ public class SCCourseServiceImpl implements SCCourseService { }).collect(Collectors.toList()); courseVO.setCourseChapters(chapterVOs); } + resultDomain.success("获取课程详情成功", courseVO); return resultDomain; } diff --git a/schoolNewsServ/study/src/main/java/org/xyzh/study/service/impl/SCLearningRecordServiceImpl.java b/schoolNewsServ/study/src/main/java/org/xyzh/study/service/impl/SCLearningRecordServiceImpl.java index 73d0bf9..5cc9c94 100644 --- a/schoolNewsServ/study/src/main/java/org/xyzh/study/service/impl/SCLearningRecordServiceImpl.java +++ b/schoolNewsServ/study/src/main/java/org/xyzh/study/service/impl/SCLearningRecordServiceImpl.java @@ -1,15 +1,25 @@ package org.xyzh.study.service.impl; import java.math.BigDecimal; +import java.util.Date; +import java.util.List; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.xyzh.common.core.domain.ResultDomain; +import org.xyzh.common.core.enums.TaskItemType; import org.xyzh.common.dto.study.TbLearningRecord; +import org.xyzh.common.dto.study.TbTaskItem; +import org.xyzh.common.dto.study.TbTaskUser; +import org.xyzh.common.dto.user.TbSysUser; +import org.xyzh.common.vo.TaskItemVO; import org.xyzh.api.study.record.LearningRecordService; import org.xyzh.study.mapper.LearningRecordMapper; +import org.xyzh.study.mapper.TaskItemMapper; +import org.xyzh.study.mapper.TaskUserMapper; +import org.xyzh.system.utils.LoginUtil; /** * @description 学习记录服务实现类 @@ -26,62 +36,244 @@ public class SCLearningRecordServiceImpl implements LearningRecordService { @Autowired private LearningRecordMapper learningRecordMapper; + @Autowired + private TaskItemMapper taskItemMapper; + + @Autowired + private TaskUserMapper taskUserMapper; + @Override - public ResultDomain deleteLearningRecord(String recordID) { - // TODO Auto-generated method stub - return null; + public ResultDomain insertLearningRecord(TbLearningRecord learningRecord) { + ResultDomain resultDomain = new ResultDomain<>(); + TbSysUser user = LoginUtil.getCurrentUser(); + if (user == null) { + resultDomain.fail("请先登录"); + return resultDomain; + } + learningRecord.setUserID(user.getID()); + learningRecord.setCreateTime(new Date()); + if (learningRecord.getResourceType() == null) { + resultDomain.fail("资源类型不能为空"); + return resultDomain; + } + if (learningRecord.getResourceType() == 1 && learningRecord.getResourceID() == null) { + resultDomain.fail("资源ID不能为空"); + return resultDomain; + } + if (learningRecord.getResourceType() == 2 && (learningRecord.getCourseID() == null || learningRecord.getChapterID() == null || learningRecord.getNodeID() == null)) { + resultDomain.fail("课程信息不能为空"); + return resultDomain; + } + List records = learningRecordMapper.selectLearningRecords(learningRecord); + if (records.size() > 0) { + resultDomain.fail("学习记录已存在"); + return resultDomain; + } + List allTaskItems = taskItemMapper.selectTaskItemVOByTaskIdAndUserId(learningRecord.getTaskID(), user.getID()); + if (allTaskItems == null || allTaskItems.isEmpty()) { + TbTaskUser taskUser = new TbTaskUser(); + taskUser.setTaskID(learningRecord.getTaskID()); + taskUser.setUserID(user.getID()); + taskUser.setProgress(new BigDecimal(0)); + taskUser.setUpdater(user.getID()); + + // 全部完成 + taskUser.setStatus(1); + taskUser.setUpdateTime(new Date()); + taskUserMapper.updateTaskUser(taskUser); + } + + int result = learningRecordMapper.insertLearningRecord(learningRecord); + if (result > 0) { + resultDomain.success("创建学习记录成功", learningRecord); + return resultDomain; + } else { + resultDomain.fail("创建学习记录失败"); + return resultDomain; + } } @Override - public ResultDomain getResourceLearningRecords(Integer resourceType, String resourceID) { - // TODO Auto-generated method stub - return null; + public ResultDomain updateLearningRecord(TbLearningRecord learningRecord) { + ResultDomain resultDomain = new ResultDomain<>(); + TbSysUser user = LoginUtil.getCurrentUser(); + if (user == null) { + resultDomain.fail("请先登录"); + return resultDomain; + } + learningRecord.setUpdater(user.getID()); + + int result = learningRecordMapper.updateLearningRecord(learningRecord); + if (result > 0) { + resultDomain.success("更新学习记录成功", learningRecord); + return resultDomain; + } else { + resultDomain.fail("更新学习记录失败"); + return resultDomain; + } + } + + @Override + public ResultDomain deleteLearningRecord(String recordID) { + ResultDomain resultDomain = new ResultDomain<>(); + int result = learningRecordMapper.deleteLearningRecord(recordID); + if (result > 0) { + resultDomain.success("删除学习记录成功", true); + return resultDomain; + } else { + resultDomain.fail("删除学习记录失败"); + return resultDomain; + } + } + + + @Override + public ResultDomain getLearningRecord(TbLearningRecord learningRecord) { + ResultDomain resultDomain = new ResultDomain<>(); + List records = learningRecordMapper.selectLearningRecords(learningRecord); + resultDomain.success("获取学习记录成功", records); + return resultDomain; + } + + + @Override + public ResultDomain getCourseLearningRecord(TbLearningRecord learningRecord) { + ResultDomain resultDomain = new ResultDomain<>(); + + if (learningRecord.getCourseID() == null) { + resultDomain.fail("课程ID不能为空"); + return resultDomain; + } + learningRecord.setResourceType(2); + List records = learningRecordMapper.selectLearningRecords(learningRecord); + resultDomain.success("获取学习记录成功", records); + return resultDomain; + } + + @Override + public ResultDomain getResourceLearningRecords(TbLearningRecord learningRecord) { + ResultDomain resultDomain = new ResultDomain<>(); + TbSysUser user = LoginUtil.getCurrentUser(); + if (user == null) { + resultDomain.fail("请先登录"); + return resultDomain; + } + learningRecord.setUserID(user.getID()); + if (learningRecord.getResourceID() == null) { + resultDomain.fail("资源ID不能为空"); + return resultDomain; + } + learningRecord.setResourceType(1); + List records = learningRecordMapper.selectLearningRecords(learningRecord); + resultDomain.success("获取学习记录成功", records); + return resultDomain; } @Override public ResultDomain getTaskLearningStatistics(String taskID) { - // TODO Auto-generated method stub - return null; + // TODO Auto-generated method stub + return null; } @Override public ResultDomain getUserLearningProgress(String userID, Integer resourceType, - String resourceID) { - // TODO Auto-generated method stub - return null; - } - - @Override - public ResultDomain getUserLearningRecords(String userID, Integer resourceType, String taskID) { - // TODO Auto-generated method stub - return null; + String resourceID) { + // TODO Auto-generated method stub + return null; } @Override public ResultDomain getUserLearningStatistics(String userID, Integer resourceType) { - // TODO Auto-generated method stub - return null; + // TODO Auto-generated method stub + return null; } - @Override - public ResultDomain markLearningComplete(String userID, Integer resourceType, String resourceID, - String taskID) { - // TODO Auto-generated method stub - return null; - } @Override - public ResultDomain saveLearningRecord(TbLearningRecord learningRecord) { - // TODO Auto-generated method stub - return null; + public ResultDomain markLearningComplete(TbLearningRecord learningRecord) { + ResultDomain resultDomain = new ResultDomain<>(); + TbSysUser user = LoginUtil.getCurrentUser(); + if (user == null) { + resultDomain.fail("请先登录"); + return resultDomain; + } + learningRecord.setUpdater(user.getID()); + learningRecord.setCompleteTime(new Date()); + learningRecord.setIsComplete(true); + int result = learningRecordMapper.updateLearningRecord(learningRecord); + if (result > 0) { + // 检查是否完成了该任务的所有任务项 + String taskId = learningRecord.getTaskID(); + String userId = user.getID(); + if (taskId != null && !taskId.isEmpty()) { + checkAndUpdateTaskCompletion(taskId, userId); + } + + resultDomain.success("标记学习完成成功", learningRecord); + return resultDomain; + } else { + resultDomain.fail("标记学习完成失败"); + return resultDomain; + } } - @Override - public ResultDomain updateLearningProgress(String userID, Integer resourceType, String resourceID, - BigDecimal progress, Integer duration) { - // TODO Auto-generated method stub - return null; + /** + * @description 检查并更新任务完成状态 + * @param taskId 任务ID + * @param userId 用户ID + * @author yslg + * @since 2025-10-24 + */ + private void checkAndUpdateTaskCompletion(String taskId, String userId) { + try { + // 获取该任务下所有任务项(包含该用户的学习状态) + List allTaskItems = taskItemMapper.selectTaskItemVOByTaskIdAndUserId(taskId, userId); + if (allTaskItems == null || allTaskItems.isEmpty()) { + return; + } + + // 检查是否所有必须的任务项都已完成(status = 2) + boolean allCompleted = true; + int totalRequired = 0; + int completedRequired = 0; + + for (TaskItemVO item : allTaskItems) { + if (item.getRequired() != null && item.getRequired()) { + totalRequired++; + if (item.getStatus() != null && item.getStatus() == 2) { + completedRequired++; + } else { + allCompleted = false; + } + } + } + if (!allCompleted) { + return; + } + + // 计算总进度 + BigDecimal progressPercent = BigDecimal.valueOf(100); + + // 更新 task_user 状态 + TbTaskUser taskUser = new TbTaskUser(); + taskUser.setTaskID(taskId); + taskUser.setUserID(userId); + taskUser.setProgress(progressPercent); + taskUser.setUpdater(userId); + + // 全部完成 + taskUser.setStatus(2); + taskUser.setCompleteTime(new Date()); + taskUserMapper.updateTaskUser(taskUser); + logger.info("更新任务用户状态成功 - taskId: {}, userId: {}, status: {}, progress: {}", + taskId, userId, taskUser.getStatus(), progressPercent); + } catch (Exception e) { + logger.error("检查并更新任务完成状态失败 - taskId: {}, userId: {}", taskId, userId, e); + } } + + + } diff --git a/schoolNewsServ/study/src/main/java/org/xyzh/study/service/impl/SCLearningTaskServiceImpl.java b/schoolNewsServ/study/src/main/java/org/xyzh/study/service/impl/SCLearningTaskServiceImpl.java index b35a2b9..9570e55 100644 --- a/schoolNewsServ/study/src/main/java/org/xyzh/study/service/impl/SCLearningTaskServiceImpl.java +++ b/schoolNewsServ/study/src/main/java/org/xyzh/study/service/impl/SCLearningTaskServiceImpl.java @@ -20,16 +20,15 @@ import org.xyzh.common.dto.user.TbSysUser; import org.xyzh.common.utils.IDUtils; import org.xyzh.common.dto.study.TbLearningTask; import org.xyzh.common.dto.study.TbTaskUser; -import org.xyzh.common.dto.study.TbTaskCourse; -import org.xyzh.common.dto.study.TbTaskResource; +import org.xyzh.common.dto.study.TbTaskItem; import org.xyzh.common.vo.TaskItemVO; import org.xyzh.common.vo.TaskVO; import org.xyzh.study.mapper.LearningTaskMapper; import org.xyzh.study.mapper.TaskUserMapper; import org.xyzh.system.utils.LoginUtil; -import org.xyzh.study.mapper.TaskCourseMapper; -import org.xyzh.study.mapper.TaskResourceMapper; +import org.xyzh.study.mapper.TaskItemMapper; import org.xyzh.api.study.task.LearningTaskService; +import org.xyzh.common.core.enums.TaskItemType; /** * @description 学习任务服务实现类 @@ -50,19 +49,16 @@ public class SCLearningTaskServiceImpl implements LearningTaskService { private TaskUserMapper taskUserMapper; @Autowired - private TaskCourseMapper taskCourseMapper; - - @Autowired - private TaskResourceMapper taskResourceMapper; + private TaskItemMapper taskItemMapper; @Override - public ResultDomain addTaskCourse(TbTaskCourse taskCourse) { + public ResultDomain addTaskCourse(TbTaskItem taskItem) { // TODO Auto-generated method stub return null; } @Override - public ResultDomain addTaskResource(TbTaskResource taskResource) { + public ResultDomain addTaskResource(TbTaskItem taskItem) { // TODO Auto-generated method stub return null; } @@ -148,22 +144,35 @@ public class SCLearningTaskServiceImpl implements LearningTaskService { learningTask.setTaskID(taskID); learningTask.setCreateTime(now); learningTaskMapper.insertLearningTask(learningTask); - // 绑定课程 - List taskCourses = taskVO.toTaskCourses(); + + // 绑定任务项(课程和资源) + List taskItems = new ArrayList<>(); + + // 转换课程为任务项 + List taskCourses = taskVO.toTaskCourses(); taskCourses.forEach(item -> { item.setTaskID(taskID); + item.setItemType(TaskItemType.COURSE.getValue()); item.setCreator(currentUser.getID()); item.setCreateTime(now); }); - taskCourseMapper.batchInsertTaskCourses(taskCourses); - // 绑定资源 - List taskResources = taskVO.toTaskResources(); + taskItems.addAll(taskCourses); + + // 转换资源为任务项 + List taskResources = taskVO.toTaskResources(); taskResources.forEach(item -> { item.setTaskID(taskID); + item.setItemType(TaskItemType.RESOURCE.getValue()); item.setCreator(currentUser.getID()); item.setCreateTime(now); }); - taskResourceMapper.batchInsertTaskResources(taskResources); + taskItems.addAll(taskResources); + + // 批量插入任务项 + if (!taskItems.isEmpty()) { + taskItemMapper.batchInsertTaskItems(taskItems); + } + // 绑定用户 List taskUsers = taskVO.toTaskUsers(); taskUsers.forEach(item -> { @@ -202,19 +211,35 @@ public class SCLearningTaskServiceImpl implements LearningTaskService { task.setUpdateTime(now); learningTaskMapper.updateLearningTask(task); - // 2. 处理任务课程关联 + // 2. 处理任务项关联(课程和资源) List newCourseItems = taskVO.getTaskCourses(); + List newResourceItems = taskVO.getTaskResources(); if (newCourseItems == null) { newCourseItems = new ArrayList<>(); } + if (newResourceItems == null) { + newResourceItems = new ArrayList<>(); + } - // 获取现有的课程关联 - List existingCourses = taskCourseMapper.selectByTaskId(taskID); - Map existingCourseMap = existingCourses.stream() - .collect(Collectors.toMap(TbTaskCourse::getCourseID, course -> course)); + // 获取现有的所有任务项 + List existingItems = taskItemMapper.selectByTaskId(taskID); + + // 分离课程和资源 + List existingCourses = existingItems.stream() + .filter(item -> item.getItemType().equals(TaskItemType.COURSE.getValue())) + .collect(Collectors.toList()); + List existingResources = existingItems.stream() + .filter(item -> item.getItemType().equals(TaskItemType.RESOURCE.getValue())) + .collect(Collectors.toList()); + + Map existingCourseMap = existingCourses.stream() + .collect(Collectors.toMap(TbTaskItem::getItemID, item -> item)); + Map existingResourceMap = existingResources.stream() + .collect(Collectors.toMap(TbTaskItem::getItemID, item -> item)); Set newCourseIDs = new HashSet<>(); - List coursesToInsert = new ArrayList<>(); + Set newResourceIDs = new HashSet<>(); + List itemsToInsert = new ArrayList<>(); // 处理新的课程关联 for (TaskItemVO item : newCourseItems) { @@ -222,85 +247,62 @@ public class SCLearningTaskServiceImpl implements LearningTaskService { if (courseID == null || courseID.isEmpty()) { continue; } - newCourseIDs.add(courseID); - // 如果不存在,则新增 if (!existingCourseMap.containsKey(courseID)) { - TbTaskCourse taskCourse = new TbTaskCourse(); - taskCourse.setID(IDUtils.generateID()); - taskCourse.setTaskID(taskID); - taskCourse.setCourseID(courseID); - taskCourse.setCreator(user.getID()); - taskCourse.setCreateTime(now); - coursesToInsert.add(taskCourse); + TbTaskItem taskItem = new TbTaskItem(); + taskItem.setID(IDUtils.generateID()); + taskItem.setTaskID(taskID); + taskItem.setItemType(TaskItemType.COURSE.getValue()); + taskItem.setItemID(courseID); + taskItem.setRequired(item.getRequired()); + taskItem.setOrderNum(item.getOrderNum()); + taskItem.setCreator(user.getID()); + taskItem.setCreateTime(now); + itemsToInsert.add(taskItem); } } - // 找出要删除的课程关联 - List courseIDsToDelete = existingCourseMap.values().stream() - .filter(course -> !newCourseIDs.contains(course.getCourseID())) - .map(TbTaskCourse::getID) - .collect(Collectors.toList()); - - if (!courseIDsToDelete.isEmpty()) { - taskCourseMapper.batchDeleteTaskCourses(courseIDsToDelete); - } - - if (!coursesToInsert.isEmpty()) { - taskCourseMapper.batchInsertTaskCourses(coursesToInsert); - } - - // 3. 处理任务资源关联 - List newResourceItems = taskVO.getTaskResources(); - if (newResourceItems == null) { - newResourceItems = new ArrayList<>(); - } - - // 获取现有的资源关联 - List existingResources = taskResourceMapper.selectByTaskId(taskID); - Map existingResourceMap = existingResources.stream() - .collect(Collectors.toMap(TbTaskResource::getResourceID, resource -> resource)); - - Set newResourceIDs = new HashSet<>(); - List resourcesToInsert = new ArrayList<>(); - // 处理新的资源关联 for (TaskItemVO item : newResourceItems) { String resourceID = item.getResourceID(); if (resourceID == null || resourceID.isEmpty()) { continue; } - newResourceIDs.add(resourceID); - // 如果不存在,则新增 if (!existingResourceMap.containsKey(resourceID)) { - TbTaskResource taskResource = new TbTaskResource(); - taskResource.setID(IDUtils.generateID()); - taskResource.setTaskID(taskID); - taskResource.setResourceID(resourceID); - taskResource.setCreator(user.getID()); - taskResource.setCreateTime(now); - resourcesToInsert.add(taskResource); + TbTaskItem taskItem = new TbTaskItem(); + taskItem.setID(IDUtils.generateID()); + taskItem.setTaskID(taskID); + taskItem.setItemType(TaskItemType.RESOURCE.getValue()); + taskItem.setItemID(resourceID); + taskItem.setRequired(item.getRequired()); + taskItem.setOrderNum(item.getOrderNum()); + taskItem.setCreator(user.getID()); + taskItem.setCreateTime(now); + itemsToInsert.add(taskItem); } } - // 找出要删除的资源关联 - List resourceIDsToDelete = existingResourceMap.values().stream() - .filter(resource -> !newResourceIDs.contains(resource.getResourceID())) - .map(TbTaskResource::getID) - .collect(Collectors.toList()); + // 找出要删除的任务项 + List itemIDsToDelete = new ArrayList<>(); + existingCourseMap.values().stream() + .filter(item -> !newCourseIDs.contains(item.getItemID())) + .forEach(item -> itemIDsToDelete.add(item.getID())); + existingResourceMap.values().stream() + .filter(item -> !newResourceIDs.contains(item.getItemID())) + .forEach(item -> itemIDsToDelete.add(item.getID())); - if (!resourceIDsToDelete.isEmpty()) { - taskResourceMapper.batchDeleteTaskResources(resourceIDsToDelete); + if (!itemIDsToDelete.isEmpty()) { + taskItemMapper.batchDeleteTaskItems(itemIDsToDelete); } - if (!resourcesToInsert.isEmpty()) { - taskResourceMapper.batchInsertTaskResources(resourcesToInsert); + if (!itemsToInsert.isEmpty()) { + taskItemMapper.batchInsertTaskItems(itemsToInsert); } - // 4. 处理任务用户关联 + // 3. 处理任务用户关联 List newUserItems = taskVO.getTaskUsers(); if (newUserItems == null) { newUserItems = new ArrayList<>(); @@ -368,33 +370,143 @@ public class SCLearningTaskServiceImpl implements LearningTaskService { resultDomain.fail("任务不存在"); return resultDomain; } - List taskCourses = taskCourseMapper.selectTaskItemByTaskId(taskID); - List taskResources = taskResourceMapper.selectTaskItemByTaskId(taskID); + + // 获取所有任务项 + List allTaskItems = taskItemMapper.selectTaskItemVOByTaskId(taskID); + + // 一次循环完成分离和统计 + List taskCourses = new ArrayList<>(); + List taskResources = new ArrayList<>(); + int completedTaskNum = 0; + int learningTaskNum = 0; + int notStartTaskNum = 0; + + for (TaskItemVO item : allTaskItems) { + // 分离课程和资源 + if (item.getItemType() != null) { + if (item.getItemType().equals(TaskItemType.COURSE.getValue())) { + taskCourses.add(item); + } else if (item.getItemType().equals(TaskItemType.RESOURCE.getValue())) { + taskResources.add(item); + } + } + + // 统计状态 + Integer status = item.getStatus(); + if (status != null) { + if (status == 2) { + completedTaskNum++; + } else if (status == 1) { + learningTaskNum++; + } else if (status == 0) { + notStartTaskNum++; + } + } + } + + taskVO.setCompletedTaskNum(completedTaskNum); + taskVO.setLearningTaskNum(learningTaskNum); + taskVO.setNotStartTaskNum(notStartTaskNum); + List taskUsers = taskUserMapper.selectTaskItemByTaskId(taskID); taskVO.setLearningTask(task); taskVO.setTaskCourses(taskCourses); taskVO.setTaskResources(taskResources); taskVO.setTaskUsers(taskUsers); + + taskVO.setTotalTaskNum(allTaskItems.size()); + + + resultDomain.success("获取任务详情成功", taskVO); return resultDomain; } + @Override - public ResultDomain getTaskCourses(String taskID) { - // TODO Auto-generated method stub - return null; + public ResultDomain getTaskUser(String taskID) { + ResultDomain resultDomain = new ResultDomain<>(); + TaskVO taskVO = new TaskVO(); + TbLearningTask task = learningTaskMapper.selectByTaskId(taskID); + if (task == null) { + resultDomain.fail("任务不存在"); + return resultDomain; + } + + // 获取所有任务项 + List allTaskItems = taskItemMapper.selectTaskItemVOByTaskId(taskID); + + // 一次循环完成分离和统计 + List taskCourses = new ArrayList<>(); + List taskResources = new ArrayList<>(); + int completedTaskNum = 0; + int learningTaskNum = 0; + int notStartTaskNum = 0; + + for (TaskItemVO item : allTaskItems) { + // 分离课程和资源 + if (item.getItemType() != null) { + if (item.getItemType().equals(TaskItemType.COURSE.getValue())) { + taskCourses.add(item); + } else if (item.getItemType().equals(TaskItemType.RESOURCE.getValue())) { + taskResources.add(item); + } + } + + // 统计状态 + Integer status = item.getStatus(); + if (status != null) { + if (status == 2) { + completedTaskNum++; + } else if (status == 1) { + learningTaskNum++; + } else if (status == 0) { + notStartTaskNum++; + } + } + } + + taskVO.setCompletedTaskNum(completedTaskNum); + taskVO.setLearningTaskNum(learningTaskNum); + taskVO.setNotStartTaskNum(notStartTaskNum); + + List taskUsers = taskUserMapper.selectUserTaskItem(taskID, LoginUtil.getCurrentUser().getID()); + taskVO.setLearningTask(task); + taskVO.setTaskCourses(taskCourses); + taskVO.setTaskResources(taskResources); + taskVO.setTaskUsers(taskUsers); + + taskVO.setTotalTaskNum(allTaskItems.size()); + + + + resultDomain.success("获取任务详情成功", taskVO); + return resultDomain; + } + + + @Override + public ResultDomain getTaskCourses(String taskID) { + ResultDomain resultDomain = new ResultDomain<>(); + List taskCourses = taskItemMapper.selectByTaskIdAndType(taskID, TaskItemType.COURSE.getValue()); + resultDomain.success("获取任务课程列表成功", taskCourses); + return resultDomain; } @Override public ResultDomain getTaskList(TbLearningTask filter) { - // TODO Auto-generated method stub - return null; + ResultDomain resultDomain = new ResultDomain<>(); + List taskList = learningTaskMapper.selectLearningTasks(filter); + resultDomain.success("获取任务列表成功", taskList); + return resultDomain; } @Override - public ResultDomain getTaskResources(String taskID) { - // TODO Auto-generated method stub - return null; + public ResultDomain getTaskResources(String taskID) { + ResultDomain resultDomain = new ResultDomain<>(); + List taskResources = taskItemMapper.selectByTaskIdAndType(taskID, TaskItemType.RESOURCE.getValue()); + resultDomain.success("获取任务资源列表成功", taskResources); + return resultDomain; } @Override @@ -407,14 +519,28 @@ public class SCLearningTaskServiceImpl implements LearningTaskService { @Override public ResultDomain removeTaskCourse(String taskID, String courseID) { - // TODO Auto-generated method stub - return null; + ResultDomain resultDomain = new ResultDomain<>(); + TbTaskItem taskItem = taskItemMapper.selectByTaskIdAndItemId(taskID, courseID, TaskItemType.COURSE.getValue()); + if (taskItem != null) { + taskItemMapper.deleteTaskItem(taskItem); + resultDomain.success("移除任务课程成功", true); + } else { + resultDomain.fail("任务课程不存在"); + } + return resultDomain; } @Override public ResultDomain removeTaskResource(String taskID, String resourceID) { - // TODO Auto-generated method stub - return null; + ResultDomain resultDomain = new ResultDomain<>(); + TbTaskItem taskItem = taskItemMapper.selectByTaskIdAndItemId(taskID, resourceID, TaskItemType.RESOURCE.getValue()); + if (taskItem != null) { + taskItemMapper.deleteTaskItem(taskItem); + resultDomain.success("移除任务资源成功", true); + } else { + resultDomain.fail("任务资源不存在"); + } + return resultDomain; } @Override diff --git a/schoolNewsServ/study/src/main/resources/mapper/LearningRecordMapper.xml b/schoolNewsServ/study/src/main/resources/mapper/LearningRecordMapper.xml index 3dbf439..e603ead 100644 --- a/schoolNewsServ/study/src/main/resources/mapper/LearningRecordMapper.xml +++ b/schoolNewsServ/study/src/main/resources/mapper/LearningRecordMapper.xml @@ -6,9 +6,12 @@ + - + + + @@ -20,7 +23,7 @@ - id, user_id, resource_type, resource_id, task_id, duration, progress, + id, user_id, task_id, resource_type, resource_id, course_id, chapter_id, node_id, duration, progress, is_complete, complete_time, last_learn_time, create_time, update_time @@ -30,14 +33,23 @@ AND user_id = #{userID} + + AND task_id = #{taskID} + AND resource_type = #{resourceType} AND resource_id = #{resourceID} - - AND task_id = #{taskID} + + AND course_id = #{courseID} + + + AND chapter_id = #{chapterID} + + + AND node_id = #{nodeID} AND is_complete = #{isComplete} @@ -85,7 +97,7 @@ SELECT FROM tb_learning_record - WHERE user_id = #{userId} AND resource_id = #{courseId} + WHERE user_id = #{userId} AND course_id = #{courseId} AND resource_type = 2 @@ -113,11 +125,11 @@ INSERT INTO tb_learning_record ( - id, user_id, resource_type, resource_id, task_id, duration, progress, - is_complete, complete_time, last_learn_time, create_time, update_time + id, user_id, task_id, resource_type, resource_id, course_id, chapter_id, node_id, duration, progress, + is_complete, complete_time, last_learn_time, create_time ) VALUES ( - #{id}, #{userID}, #{resourceType}, #{resourceID}, #{taskID}, #{duration}, #{progress}, - #{isComplete}, #{completeTime}, #{lastLearnTime}, #{createTime}, #{updateTime} + #{id}, #{userID}, #{taskID}, #{resourceType}, #{resourceID}, #{courseID}, #{chapterID}, #{nodeID}, #{duration}, #{progress}, + #{isComplete}, #{completeTime}, #{lastLearnTime}, #{createTime} ) @@ -125,18 +137,6 @@ UPDATE tb_learning_record - - user_id = #{userID}, - - - resource_type = #{resourceType}, - - - resource_id = #{resourceID}, - - - task_id = #{taskID}, - duration = #{duration}, @@ -152,6 +152,9 @@ last_learn_time = #{lastLearnTime}, + + updater = #{updater}, + update_time = #{updateTime}, diff --git a/schoolNewsServ/study/src/main/resources/mapper/LearningTaskMapper.xml b/schoolNewsServ/study/src/main/resources/mapper/LearningTaskMapper.xml index a023de2..7a51635 100644 --- a/schoolNewsServ/study/src/main/resources/mapper/LearningTaskMapper.xml +++ b/schoolNewsServ/study/src/main/resources/mapper/LearningTaskMapper.xml @@ -226,7 +226,7 @@ - SELECT - - FROM tb_task_course - - ORDER BY order_num ASC, create_time ASC - - - - - - - - - - - - - - - - - - - - - - INSERT INTO tb_task_course ( - id, task_id, course_id, required, order_num, creator, create_time - ) VALUES ( - #{id}, #{taskID}, #{courseID}, #{required}, #{orderNum}, #{creator}, #{createTime} - ) - - - - - UPDATE tb_task_course - - - task_id = #{taskID}, - - - course_id = #{courseID}, - - - required = #{required}, - - - order_num = #{orderNum}, - - - creator = #{creator}, - - - create_time = #{createTime}, - - - WHERE id = #{id} - - - - - DELETE FROM tb_task_course - WHERE id = #{id} - - - - - INSERT INTO tb_task_course ( - id, task_id, course_id, required, order_num, creator, create_time - ) VALUES - - ( - #{item.id}, #{item.taskID}, #{item.courseID}, #{item.required}, - #{item.orderNum}, #{item.creator}, #{item.createTime} - ) - - - - - - DELETE FROM tb_task_course - WHERE id IN - - #{id} - - - - - - DELETE FROM tb_task_course - WHERE task_id = #{taskId} - - - - - DELETE FROM tb_task_course - WHERE course_id = #{courseId} - - - - - - - - - diff --git a/schoolNewsServ/study/src/main/resources/mapper/TaskItemMapper.xml b/schoolNewsServ/study/src/main/resources/mapper/TaskItemMapper.xml new file mode 100644 index 0000000..36d2af3 --- /dev/null +++ b/schoolNewsServ/study/src/main/resources/mapper/TaskItemMapper.xml @@ -0,0 +1,398 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + id, task_id, item_type, item_id, required, order_num, creator, create_time, + updater, update_time, delete_time, deleted + + + + + + deleted = 0 + + AND task_id = #{taskID} + + + AND item_type = #{itemType} + + + AND item_id = #{itemID} + + + AND required = #{required} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + INSERT INTO tb_task_item ( + id, task_id, item_type, item_id, required, order_num, creator, create_time + ) VALUES ( + #{id}, #{taskID}, #{itemType}, #{itemID}, #{required}, #{orderNum}, #{creator}, #{createTime} + ) + + + + + UPDATE tb_task_item + + + task_id = #{taskID}, + + + item_type = #{itemType}, + + + item_id = #{itemID}, + + + required = #{required}, + + + order_num = #{orderNum}, + + + updater = #{updater}, + + + update_time = #{updateTime}, + + + delete_time = #{deleteTime}, + + + deleted = #{deleted}, + + + WHERE id = #{id} + + + + + UPDATE tb_task_item + SET deleted = 1, delete_time = NOW() + WHERE id = #{id} + + + + + INSERT INTO tb_task_item ( + id, task_id, item_type, item_id, required, order_num, creator, create_time + ) VALUES + + ( + #{item.id}, #{item.taskID}, #{item.itemType}, #{item.itemID}, #{item.required}, + #{item.orderNum}, #{item.creator}, #{item.createTime} + ) + + + + + + UPDATE tb_task_item + SET deleted = 1, delete_time = NOW() + WHERE id IN + + #{id} + + + + + + UPDATE tb_task_item + SET deleted = 1, delete_time = NOW() + WHERE task_id = #{taskId} + + + + + UPDATE tb_task_item + SET deleted = 1, delete_time = NOW() + WHERE item_id = #{itemId} AND item_type = #{itemType} + + + + + + + + + diff --git a/schoolNewsServ/study/src/main/resources/mapper/TaskResourceMapper.xml b/schoolNewsServ/study/src/main/resources/mapper/TaskResourceMapper.xml deleted file mode 100644 index a40ec94..0000000 --- a/schoolNewsServ/study/src/main/resources/mapper/TaskResourceMapper.xml +++ /dev/null @@ -1,208 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - id, task_id, resource_id, required, order_num, creator, create_time - - - - - - - AND task_id = #{taskID} - - - AND resource_id = #{resourceID} - - - AND required = #{required} - - - - - - - - - - - - - - - - - - - - - - - - - - INSERT INTO tb_task_resource ( - id, task_id, resource_id, required, order_num, creator, create_time - ) VALUES ( - #{id}, #{taskID}, #{resourceID}, #{required}, #{orderNum}, #{creator}, #{createTime} - ) - - - - - UPDATE tb_task_resource - - - task_id = #{taskID}, - - - resource_id = #{resourceID}, - - - required = #{required}, - - - order_num = #{orderNum}, - - - creator = #{creator}, - - - create_time = #{createTime}, - - - WHERE id = #{id} - - - - - DELETE FROM tb_task_resource - WHERE id = #{id} - - - - - INSERT INTO tb_task_resource ( - id, task_id, resource_id, required, order_num, creator, create_time - ) VALUES - - ( - #{item.id}, #{item.taskID}, #{item.resourceID}, #{item.required}, - #{item.orderNum}, #{item.creator}, #{item.createTime} - ) - - - - - - DELETE FROM tb_task_resource - WHERE id IN - - #{id} - - - - - - DELETE FROM tb_task_resource - WHERE task_id = #{taskId} - - - - - DELETE FROM tb_task_resource - WHERE resource_id = #{resourceId} - - - - - - - - - diff --git a/schoolNewsServ/study/src/main/resources/mapper/TaskUserMapper.xml b/schoolNewsServ/study/src/main/resources/mapper/TaskUserMapper.xml index dee8a61..6afd035 100644 --- a/schoolNewsServ/study/src/main/resources/mapper/TaskUserMapper.xml +++ b/schoolNewsServ/study/src/main/resources/mapper/TaskUserMapper.xml @@ -94,6 +94,16 @@ ORDER BY ttu.create_time ASC + + - SELECT - - FROM tb_achievement - WHERE id = #{id} - - - - - - - - - - - - - - - - - - - - INSERT INTO tb_achievement ( - id, achievement_id, name, description, icon, type, level, condition_type, - condition_value, points, order_num, creator, updater, create_time, update_time, - delete_time, deleted - ) VALUES ( - #{entity.id}, #{entity.achievementId}, #{entity.name}, #{entity.description}, #{entity.icon}, - #{entity.type}, #{entity.level}, #{entity.conditionType}, #{entity.conditionValue}, - #{entity.points}, #{entity.orderNum}, #{entity.creator}, #{entity.updater}, - #{entity.createTime}, #{entity.updateTime}, #{entity.deleteTime}, #{entity.deleted} - ) - - - - - INSERT INTO tb_achievement ( - id, achievement_id, name, description, icon, type, level, condition_type, - condition_value, points, order_num, creator, updater, create_time, update_time, - delete_time, deleted - ) VALUES - - ( - #{entity.id}, #{entity.achievementId}, #{entity.name}, #{entity.description}, #{entity.icon}, - #{entity.type}, #{entity.level}, #{entity.conditionType}, #{entity.conditionValue}, - #{entity.points}, #{entity.orderNum}, #{entity.creator}, #{entity.updater}, - #{entity.createTime}, #{entity.updateTime}, #{entity.deleteTime}, #{entity.deleted} - ) - - - - - - UPDATE tb_achievement - - - achievement_id = #{entity.achievementId}, - - - name = #{entity.name}, - - - description = #{entity.description}, - - - icon = #{entity.icon}, - - - type = #{entity.type}, - - - level = #{entity.level}, - - - condition_type = #{entity.conditionType}, - - - condition_value = #{entity.conditionValue}, - - - points = #{entity.points}, - - - order_num = #{entity.orderNum}, - - - creator = #{entity.creator}, - - - updater = #{entity.updater}, - - - update_time = #{entity.updateTime}, - - - delete_time = #{entity.deleteTime}, - - - deleted = #{entity.deleted}, - - - WHERE id = #{entity.id} - - - - - UPDATE tb_achievement - - - achievement_id = #{entity.achievementId}, - - - name = #{entity.name}, - - - description = #{entity.description}, - - - icon = #{entity.icon}, - - - type = #{entity.type}, - - - level = #{entity.level}, - - - condition_type = #{entity.conditionType}, - - - condition_value = #{entity.conditionValue}, - - - points = #{entity.points}, - - - order_num = #{entity.orderNum}, - - - creator = #{entity.creator}, - - - updater = #{entity.updater}, - - - update_time = #{entity.updateTime}, - - - delete_time = #{entity.deleteTime}, - - - deleted = #{entity.deleted}, - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - INSERT INTO tb_achievement ( - id, achievement_id, name, description, icon, type, level, condition_type, - condition_value, points, order_num, creator, updater, create_time, update_time, - delete_time, deleted - ) VALUES ( - #{id}, #{achievementId}, #{name}, #{description}, #{icon}, #{type}, #{level}, - #{conditionType}, #{conditionValue}, #{points}, #{orderNum}, #{creator}, #{updater}, - #{createTime}, #{updateTime}, #{deleteTime}, #{deleted} - ) - - - - - UPDATE tb_achievement - - - achievement_id = #{achievementId}, - - - name = #{name}, - - - description = #{description}, - - - icon = #{icon}, - - - type = #{type}, - - - level = #{level}, - - - condition_type = #{conditionType}, - - - condition_value = #{conditionValue}, - - - points = #{points}, - - - order_num = #{orderNum}, - - - creator = #{creator}, - - - updater = #{updater}, - - - update_time = #{updateTime}, - - - delete_time = #{deleteTime}, - - - deleted = #{deleted}, - - - WHERE id = #{id} - - - - - DELETE FROM tb_achievement - WHERE id = #{id} - - - - - INSERT INTO tb_achievement ( - id, achievement_id, name, description, icon, type, level, condition_type, - condition_value, points, order_num, creator, updater, create_time, update_time, - delete_time, deleted - ) VALUES - - ( - #{item.id}, #{item.achievementId}, #{item.name}, #{item.description}, #{item.icon}, - #{item.type}, #{item.level}, #{item.conditionType}, #{item.conditionValue}, - #{item.points}, #{item.orderNum}, #{item.creator}, #{item.updater}, - #{item.createTime}, #{item.updateTime}, #{item.deleteTime}, #{item.deleted} - ) - - - - - - DELETE FROM tb_achievement - WHERE id IN - - #{id} - - - - - - - - - - \ No newline at end of file diff --git a/schoolNewsServ/usercenter/src/main/resources/mapper/UserAchievementMapper.xml b/schoolNewsServ/usercenter/src/main/resources/mapper/UserAchievementMapper.xml deleted file mode 100644 index 80f13fe..0000000 --- a/schoolNewsServ/usercenter/src/main/resources/mapper/UserAchievementMapper.xml +++ /dev/null @@ -1,291 +0,0 @@ - - - - - - - - - - - - - - - id, user_id, achievement_id, obtain_time - - - - - - - - AND id = #{filter.id} - - - AND user_id = #{filter.userId} - - - AND achievement_id = #{filter.achievementId} - - - AND obtain_time = #{filter.obtainTime} - - - - - - - - - - - - - - - - - - - - - - - - - - INSERT INTO tb_user_achievement ( - id, user_id, achievement_id, obtain_time - ) VALUES ( - #{entity.id}, #{entity.userId}, #{entity.achievementId}, #{entity.obtainTime} - ) - - - - - INSERT INTO tb_user_achievement ( - id, user_id, achievement_id, obtain_time - ) VALUES - - ( - #{entity.id}, #{entity.userId}, #{entity.achievementId}, #{entity.obtainTime} - ) - - - - - - UPDATE tb_user_achievement - - - user_id = #{entity.userId}, - - - achievement_id = #{entity.achievementId}, - - - obtain_time = #{entity.obtainTime}, - - - WHERE id = #{entity.id} - - - - - UPDATE tb_user_achievement - - - user_id = #{entity.userId}, - - - achievement_id = #{entity.achievementId}, - - - obtain_time = #{entity.obtainTime}, - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - INSERT INTO tb_user_achievement ( - id, user_id, achievement_id, obtain_time - ) VALUES ( - #{id}, #{userId}, #{achievementId}, #{obtainTime} - ) - - - - - UPDATE tb_user_achievement - - - user_id = #{userId}, - - - achievement_id = #{achievementId}, - - - obtain_time = #{obtainTime}, - - - WHERE id = #{id} - - - - - DELETE FROM tb_user_achievement - WHERE id = #{id} - - - - - INSERT INTO tb_user_achievement ( - id, user_id, achievement_id, obtain_time - ) VALUES - - ( - #{item.id}, #{item.userId}, #{item.achievementId}, #{item.obtainTime} - ) - - - - - - DELETE FROM tb_user_achievement - WHERE id IN - - #{id} - - - - - - - - - - \ No newline at end of file