From bfccc46f7344b667de5d2a0e2ef50126f60c28e0 Mon Sep 17 00:00:00 2001 From: wangzhibiao Date: Mon, 14 Sep 2026 23:52:49 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E5=9F=B9=E8=AE=AD=EF=BC=9A?= =?UTF-8?q?=E5=AF=B9=E9=BD=90=E6=97=A7=E7=BB=9F=E8=AE=A1=E5=88=86=E6=9E=90?= =?UTF-8?q?=E8=83=BD=E5=8A=9B=E4=B8=8EV2=E6=8E=A5=E5=8F=A3=E5=A5=91?= =?UTF-8?q?=E7=BA=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../train/TrainClassReportController.java | 41 +- .../train/TrainStudentCheckinController.java | 41 +- .../train/TrainStudentPortraitController.java | 41 +- .../train/TrainStudyDurationController.java | 41 +- ...lyticsPermissionMigrationContractTest.java | 48 +++ ...gacyAnalyticsV2ControllerContractTest.java | 74 ++++ .../ruoyi/train/domain/TrainClassReport.java | 194 ++------- .../train/domain/TrainStudentCheckin.java | 216 +++------- .../train/domain/TrainStudentPortrait.java | 175 +++----- .../train/domain/TrainStudyDuration.java | 203 +++------- .../train/mapper/TrainClassReportMapper.java | 31 -- .../mapper/TrainStudentCheckinMapper.java | 31 -- .../mapper/TrainStudentPortraitMapper.java | 31 -- .../mapper/TrainStudyDurationMapper.java | 31 -- .../service/ITrainClassReportService.java | 31 -- .../service/ITrainStudentCheckinService.java | 31 -- .../service/ITrainStudentPortraitService.java | 31 -- .../service/ITrainStudyDurationService.java | 31 -- .../impl/TrainClassReportServiceImpl.java | 51 +-- .../impl/TrainStudentCheckinServiceImpl.java | 49 +-- .../impl/TrainStudentPortraitServiceImpl.java | 51 +-- .../impl/TrainStudyDurationServiceImpl.java | 49 +-- .../mapper/train/TrainClassReportMapper.xml | 121 ++---- .../train/TrainStudentCheckinMapper.xml | 130 +++--- .../train/TrainStudentPortraitMapper.xml | 114 ++---- .../mapper/train/TrainStudyDurationMapper.xml | 124 +++--- .../LegacyAnalyticsV2MapperContractTest.java | 71 ++++ .../impl/LegacyAnalyticsV2ServiceTest.java | 101 +++++ .../002_legacy_analytics_permissions.sql | 108 +++++ build_ui/src/api/train/checkin.js | 28 -- build_ui/src/api/train/duration.js | 28 -- build_ui/src/api/train/portrait.js | 28 -- build_ui/src/api/train/report.js | 28 -- build_ui/src/views/train/checkin/index.vue | 374 +++--------------- build_ui/src/views/train/duration/index.vue | 344 ++-------------- build_ui/src/views/train/portrait/index.vue | 300 ++------------ build_ui/src/views/train/report/index.vue | 357 +++-------------- docs/_meta/legacy-analytics-v2-audit.md | 122 ++++++ 38 files changed, 1080 insertions(+), 2820 deletions(-) create mode 100644 RuoYi-Vue/ruoyi-admin/src/test/java/com/ruoyi/web/controller/train/LegacyAnalyticsPermissionMigrationContractTest.java create mode 100644 RuoYi-Vue/ruoyi-admin/src/test/java/com/ruoyi/web/controller/train/LegacyAnalyticsV2ControllerContractTest.java create mode 100644 RuoYi-Vue/ruoyi-train/src/test/java/com/ruoyi/train/mapper/LegacyAnalyticsV2MapperContractTest.java create mode 100644 RuoYi-Vue/ruoyi-train/src/test/java/com/ruoyi/train/service/impl/LegacyAnalyticsV2ServiceTest.java create mode 100644 RuoYi-Vue/sql/system/kingbase/002_legacy_analytics_permissions.sql create mode 100644 docs/_meta/legacy-analytics-v2-audit.md diff --git a/RuoYi-Vue/ruoyi-admin/src/main/java/com/ruoyi/web/controller/train/TrainClassReportController.java b/RuoYi-Vue/ruoyi-admin/src/main/java/com/ruoyi/web/controller/train/TrainClassReportController.java index 724c88a2a..4b6f4fa50 100644 --- a/RuoYi-Vue/ruoyi-admin/src/main/java/com/ruoyi/web/controller/train/TrainClassReportController.java +++ b/RuoYi-Vue/ruoyi-admin/src/main/java/com/ruoyi/web/controller/train/TrainClassReportController.java @@ -6,10 +6,7 @@ import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.PutMapping; -import org.springframework.web.bind.annotation.DeleteMapping; import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import com.ruoyi.common.annotation.Log; @@ -37,7 +34,7 @@ public class TrainClassReportController extends BaseController /** * 查询开班报到列表 */ - @PreAuthorize("@ss.hasPermi('system:report:list')") + @PreAuthorize("@ss.hasPermi('train:report:list')") @GetMapping("/list") public TableDataInfo list(TrainClassReport trainClassReport) { @@ -49,7 +46,7 @@ public class TrainClassReportController extends BaseController /** * 导出开班报到列表 */ - @PreAuthorize("@ss.hasPermi('system:report:export')") + @PreAuthorize("@ss.hasPermi('train:report:export')") @Log(title = "开班报到", businessType = BusinessType.EXPORT) @PostMapping("/export") public void export(HttpServletResponse response, TrainClassReport trainClassReport) @@ -62,43 +59,11 @@ public class TrainClassReportController extends BaseController /** * 获取开班报到详细信息 */ - @PreAuthorize("@ss.hasPermi('system:report:query')") + @PreAuthorize("@ss.hasPermi('train:report:list')") @GetMapping(value = "/{reportId}") public AjaxResult getInfo(@PathVariable("reportId") Long reportId) { return success(trainClassReportService.selectTrainClassReportByReportId(reportId)); } - /** - * 新增开班报到 - */ - @PreAuthorize("@ss.hasPermi('system:report:add')") - @Log(title = "开班报到", businessType = BusinessType.INSERT) - @PostMapping - public AjaxResult add(@RequestBody TrainClassReport trainClassReport) - { - return toAjax(trainClassReportService.insertTrainClassReport(trainClassReport)); - } - - /** - * 修改开班报到 - */ - @PreAuthorize("@ss.hasPermi('system:report:edit')") - @Log(title = "开班报到", businessType = BusinessType.UPDATE) - @PutMapping - public AjaxResult edit(@RequestBody TrainClassReport trainClassReport) - { - return toAjax(trainClassReportService.updateTrainClassReport(trainClassReport)); - } - - /** - * 删除开班报到 - */ - @PreAuthorize("@ss.hasPermi('system:report:remove')") - @Log(title = "开班报到", businessType = BusinessType.DELETE) - @DeleteMapping("/{reportIds}") - public AjaxResult remove(@PathVariable Long[] reportIds) - { - return toAjax(trainClassReportService.deleteTrainClassReportByReportIds(reportIds)); - } } diff --git a/RuoYi-Vue/ruoyi-admin/src/main/java/com/ruoyi/web/controller/train/TrainStudentCheckinController.java b/RuoYi-Vue/ruoyi-admin/src/main/java/com/ruoyi/web/controller/train/TrainStudentCheckinController.java index b288fec4c..615318bbf 100644 --- a/RuoYi-Vue/ruoyi-admin/src/main/java/com/ruoyi/web/controller/train/TrainStudentCheckinController.java +++ b/RuoYi-Vue/ruoyi-admin/src/main/java/com/ruoyi/web/controller/train/TrainStudentCheckinController.java @@ -6,10 +6,7 @@ import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.PutMapping; -import org.springframework.web.bind.annotation.DeleteMapping; import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import com.ruoyi.common.annotation.Log; @@ -37,7 +34,7 @@ public class TrainStudentCheckinController extends BaseController /** * 查询学生签到列表 */ - @PreAuthorize("@ss.hasPermi('system:checkin:list')") + @PreAuthorize("@ss.hasPermi('train:attendance:list')") @GetMapping("/list") public TableDataInfo list(TrainStudentCheckin trainStudentCheckin) { @@ -49,7 +46,7 @@ public class TrainStudentCheckinController extends BaseController /** * 导出学生签到列表 */ - @PreAuthorize("@ss.hasPermi('system:checkin:export')") + @PreAuthorize("@ss.hasPermi('train:attendance:export')") @Log(title = "学生签到", businessType = BusinessType.EXPORT) @PostMapping("/export") public void export(HttpServletResponse response, TrainStudentCheckin trainStudentCheckin) @@ -62,43 +59,11 @@ public class TrainStudentCheckinController extends BaseController /** * 获取学生签到详细信息 */ - @PreAuthorize("@ss.hasPermi('system:checkin:query')") + @PreAuthorize("@ss.hasPermi('train:attendance:list')") @GetMapping(value = "/{checkinId}") public AjaxResult getInfo(@PathVariable("checkinId") Long checkinId) { return success(trainStudentCheckinService.selectTrainStudentCheckinByCheckinId(checkinId)); } - /** - * 新增学生签到 - */ - @PreAuthorize("@ss.hasPermi('system:checkin:add')") - @Log(title = "学生签到", businessType = BusinessType.INSERT) - @PostMapping - public AjaxResult add(@RequestBody TrainStudentCheckin trainStudentCheckin) - { - return toAjax(trainStudentCheckinService.insertTrainStudentCheckin(trainStudentCheckin)); - } - - /** - * 修改学生签到 - */ - @PreAuthorize("@ss.hasPermi('system:checkin:edit')") - @Log(title = "学生签到", businessType = BusinessType.UPDATE) - @PutMapping - public AjaxResult edit(@RequestBody TrainStudentCheckin trainStudentCheckin) - { - return toAjax(trainStudentCheckinService.updateTrainStudentCheckin(trainStudentCheckin)); - } - - /** - * 删除学生签到 - */ - @PreAuthorize("@ss.hasPermi('system:checkin:remove')") - @Log(title = "学生签到", businessType = BusinessType.DELETE) - @DeleteMapping("/{checkinIds}") - public AjaxResult remove(@PathVariable Long[] checkinIds) - { - return toAjax(trainStudentCheckinService.deleteTrainStudentCheckinByCheckinIds(checkinIds)); - } } diff --git a/RuoYi-Vue/ruoyi-admin/src/main/java/com/ruoyi/web/controller/train/TrainStudentPortraitController.java b/RuoYi-Vue/ruoyi-admin/src/main/java/com/ruoyi/web/controller/train/TrainStudentPortraitController.java index 5b5a0140d..bfbd86d6d 100644 --- a/RuoYi-Vue/ruoyi-admin/src/main/java/com/ruoyi/web/controller/train/TrainStudentPortraitController.java +++ b/RuoYi-Vue/ruoyi-admin/src/main/java/com/ruoyi/web/controller/train/TrainStudentPortraitController.java @@ -6,10 +6,7 @@ import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.PutMapping; -import org.springframework.web.bind.annotation.DeleteMapping; import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import com.ruoyi.common.annotation.Log; @@ -37,7 +34,7 @@ public class TrainStudentPortraitController extends BaseController /** * 查询学员画像列表 */ - @PreAuthorize("@ss.hasPermi('system:portrait:list')") + @PreAuthorize("@ss.hasPermi('train:portrait:query')") @GetMapping("/list") public TableDataInfo list(TrainStudentPortrait trainStudentPortrait) { @@ -49,7 +46,7 @@ public class TrainStudentPortraitController extends BaseController /** * 导出学员画像列表 */ - @PreAuthorize("@ss.hasPermi('system:portrait:export')") + @PreAuthorize("@ss.hasPermi('train:portrait:export')") @Log(title = "学员画像", businessType = BusinessType.EXPORT) @PostMapping("/export") public void export(HttpServletResponse response, TrainStudentPortrait trainStudentPortrait) @@ -62,43 +59,11 @@ public class TrainStudentPortraitController extends BaseController /** * 获取学员画像详细信息 */ - @PreAuthorize("@ss.hasPermi('system:portrait:query')") + @PreAuthorize("@ss.hasPermi('train:portrait:query')") @GetMapping(value = "/{portraitId}") public AjaxResult getInfo(@PathVariable("portraitId") Long portraitId) { return success(trainStudentPortraitService.selectTrainStudentPortraitByPortraitId(portraitId)); } - /** - * 新增学员画像 - */ - @PreAuthorize("@ss.hasPermi('system:portrait:add')") - @Log(title = "学员画像", businessType = BusinessType.INSERT) - @PostMapping - public AjaxResult add(@RequestBody TrainStudentPortrait trainStudentPortrait) - { - return toAjax(trainStudentPortraitService.insertTrainStudentPortrait(trainStudentPortrait)); - } - - /** - * 修改学员画像 - */ - @PreAuthorize("@ss.hasPermi('system:portrait:edit')") - @Log(title = "学员画像", businessType = BusinessType.UPDATE) - @PutMapping - public AjaxResult edit(@RequestBody TrainStudentPortrait trainStudentPortrait) - { - return toAjax(trainStudentPortraitService.updateTrainStudentPortrait(trainStudentPortrait)); - } - - /** - * 删除学员画像 - */ - @PreAuthorize("@ss.hasPermi('system:portrait:remove')") - @Log(title = "学员画像", businessType = BusinessType.DELETE) - @DeleteMapping("/{portraitIds}") - public AjaxResult remove(@PathVariable Long[] portraitIds) - { - return toAjax(trainStudentPortraitService.deleteTrainStudentPortraitByPortraitIds(portraitIds)); - } } diff --git a/RuoYi-Vue/ruoyi-admin/src/main/java/com/ruoyi/web/controller/train/TrainStudyDurationController.java b/RuoYi-Vue/ruoyi-admin/src/main/java/com/ruoyi/web/controller/train/TrainStudyDurationController.java index 9966d603a..966ec8e33 100644 --- a/RuoYi-Vue/ruoyi-admin/src/main/java/com/ruoyi/web/controller/train/TrainStudyDurationController.java +++ b/RuoYi-Vue/ruoyi-admin/src/main/java/com/ruoyi/web/controller/train/TrainStudyDurationController.java @@ -6,10 +6,7 @@ import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.PutMapping; -import org.springframework.web.bind.annotation.DeleteMapping; import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import com.ruoyi.common.annotation.Log; @@ -37,7 +34,7 @@ public class TrainStudyDurationController extends BaseController /** * 查询学习时长统计列表 */ - @PreAuthorize("@ss.hasPermi('system:duration:list')") + @PreAuthorize("@ss.hasPermi('train:learning:list')") @GetMapping("/list") public TableDataInfo list(TrainStudyDuration trainStudyDuration) { @@ -49,7 +46,7 @@ public class TrainStudyDurationController extends BaseController /** * 导出学习时长统计列表 */ - @PreAuthorize("@ss.hasPermi('system:duration:export')") + @PreAuthorize("@ss.hasPermi('train:learning:export')") @Log(title = "学习时长统计", businessType = BusinessType.EXPORT) @PostMapping("/export") public void export(HttpServletResponse response, TrainStudyDuration trainStudyDuration) @@ -62,43 +59,11 @@ public class TrainStudyDurationController extends BaseController /** * 获取学习时长统计详细信息 */ - @PreAuthorize("@ss.hasPermi('system:duration:query')") + @PreAuthorize("@ss.hasPermi('train:learning:list')") @GetMapping(value = "/{durId}") public AjaxResult getInfo(@PathVariable("durId") Long durId) { return success(trainStudyDurationService.selectTrainStudyDurationByDurId(durId)); } - /** - * 新增学习时长统计 - */ - @PreAuthorize("@ss.hasPermi('system:duration:add')") - @Log(title = "学习时长统计", businessType = BusinessType.INSERT) - @PostMapping - public AjaxResult add(@RequestBody TrainStudyDuration trainStudyDuration) - { - return toAjax(trainStudyDurationService.insertTrainStudyDuration(trainStudyDuration)); - } - - /** - * 修改学习时长统计 - */ - @PreAuthorize("@ss.hasPermi('system:duration:edit')") - @Log(title = "学习时长统计", businessType = BusinessType.UPDATE) - @PutMapping - public AjaxResult edit(@RequestBody TrainStudyDuration trainStudyDuration) - { - return toAjax(trainStudyDurationService.updateTrainStudyDuration(trainStudyDuration)); - } - - /** - * 删除学习时长统计 - */ - @PreAuthorize("@ss.hasPermi('system:duration:remove')") - @Log(title = "学习时长统计", businessType = BusinessType.DELETE) - @DeleteMapping("/{durIds}") - public AjaxResult remove(@PathVariable Long[] durIds) - { - return toAjax(trainStudyDurationService.deleteTrainStudyDurationByDurIds(durIds)); - } } diff --git a/RuoYi-Vue/ruoyi-admin/src/test/java/com/ruoyi/web/controller/train/LegacyAnalyticsPermissionMigrationContractTest.java b/RuoYi-Vue/ruoyi-admin/src/test/java/com/ruoyi/web/controller/train/LegacyAnalyticsPermissionMigrationContractTest.java new file mode 100644 index 000000000..4df250a34 --- /dev/null +++ b/RuoYi-Vue/ruoyi-admin/src/test/java/com/ruoyi/web/controller/train/LegacyAnalyticsPermissionMigrationContractTest.java @@ -0,0 +1,48 @@ +package com.ruoyi.web.controller.train; + +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; + +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import org.junit.Test; + +/** Static contract guard for the current-release analytics menu permission delta. */ +public class LegacyAnalyticsPermissionMigrationContractTest +{ + @Test + public void migrationClosesReadAndExportPermissionsWithoutRoleWrites() throws Exception + { + String sql = new String(Files.readAllBytes(findMigration()), StandardCharsets.UTF_8).toLowerCase(); + assertContains(sql, + "menu_id = 2170", "train:report:list", "train:report:export", + "menu_id = 2171", "train:attendance:list", "train:attendance:export", + "menu_id = 2172", "train:learning:list", "train:learning:export", + "menu_id = 2173", "train:portrait:query", "train:portrait:export", + "menu_type = 'c'", "'f'", "where not exists"); + assertFalse("migration must not modify role assignments", sql.contains("insert into public.sys_role_menu")); + assertFalse("migration must not modify role assignments", sql.contains("update public.sys_role_menu")); + assertFalse("migration must not modify role assignments", sql.contains("delete from public.sys_role_menu")); + assertFalse("read-only analytics must not create add permission", sql.contains("train:report:add")); + assertFalse("read-only analytics must not create edit permission", sql.contains("train:attendance:edit")); + assertFalse("read-only analytics must not create remove permission", sql.contains("train:learning:remove")); + assertFalse("read-only analytics must not create delete permission", sql.contains("train:portrait:delete")); + } + + private Path findMigration() + { + for (Path path = Paths.get("").toAbsolutePath(); path != null; path = path.getParent()) + { + Path candidate = path.resolve("sql/system/kingbase/002_legacy_analytics_permissions.sql"); + if (Files.isRegularFile(candidate)) return candidate; + } + throw new IllegalStateException("permission migration not found from working directory"); + } + + private void assertContains(String sql, String... tokens) + { + for (String token : tokens) assertTrue("missing migration token: " + token, sql.contains(token)); + } +} diff --git a/RuoYi-Vue/ruoyi-admin/src/test/java/com/ruoyi/web/controller/train/LegacyAnalyticsV2ControllerContractTest.java b/RuoYi-Vue/ruoyi-admin/src/test/java/com/ruoyi/web/controller/train/LegacyAnalyticsV2ControllerContractTest.java new file mode 100644 index 000000000..eef420c09 --- /dev/null +++ b/RuoYi-Vue/ruoyi-admin/src/test/java/com/ruoyi/web/controller/train/LegacyAnalyticsV2ControllerContractTest.java @@ -0,0 +1,74 @@ +package com.ruoyi.web.controller.train; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; + +import java.lang.reflect.Method; +import org.junit.Test; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; + +/** Controller gate for V2-aligned, read-only legacy analytics pages. */ +public class LegacyAnalyticsV2ControllerContractTest +{ + @Test + public void reportControllerIsReadOnlyAndUsesTrainPermission() throws Exception + { + assertReadOnly(TrainClassReportController.class, "train:report:list"); + } + + @Test + public void checkinControllerIsReadOnlyAndUsesAttendancePermission() throws Exception + { + assertReadOnly(TrainStudentCheckinController.class, "train:attendance:list"); + } + + @Test + public void durationControllerIsReadOnlyAndUsesLearningPermission() throws Exception + { + assertReadOnly(TrainStudyDurationController.class, "train:learning:list"); + } + + @Test + public void portraitControllerIsReadOnlyAndUsesPortraitPermission() throws Exception + { + assertReadOnly(TrainStudentPortraitController.class, "train:portrait:query"); + } + + private void assertReadOnly(Class controller, String listPermission) throws Exception + { + Method list = null; + Method export = null; + Method detail = null; + int endpointCount = 0; + for (Method method : controller.getDeclaredMethods()) + { + boolean endpoint = method.isAnnotationPresent(GetMapping.class) + || method.isAnnotationPresent(PostMapping.class) + || method.isAnnotationPresent(PutMapping.class) + || method.isAnnotationPresent(DeleteMapping.class); + if (endpoint) endpointCount++; + assertFalse("legacy PUT must not remain", method.isAnnotationPresent(PutMapping.class)); + assertFalse("legacy DELETE must not remain", method.isAnnotationPresent(DeleteMapping.class)); + if ("list".equals(method.getName())) list = method; + if ("export".equals(method.getName())) export = method; + if ("getInfo".equals(method.getName())) detail = method; + } + assertEquals("list, export, and detail only", 3, endpointCount); + assertEquals("@ss.hasPermi('" + listPermission + "')", list.getAnnotation(PreAuthorize.class).value()); + assertEquals("@ss.hasPermi('" + listPermission + "')", detail.getAnnotation(PreAuthorize.class).value()); + assertEquals("@ss.hasPermi('" + exportPermission(controller) + "')", export.getAnnotation(PreAuthorize.class).value()); + } + + private String exportPermission(Class controller) + { + if (controller == TrainClassReportController.class) return "train:report:export"; + if (controller == TrainStudentCheckinController.class) return "train:attendance:export"; + if (controller == TrainStudyDurationController.class) return "train:learning:export"; + if (controller == TrainStudentPortraitController.class) return "train:portrait:export"; + throw new IllegalArgumentException("Unexpected controller: " + controller.getName()); + } +} diff --git a/RuoYi-Vue/ruoyi-train/src/main/java/com/ruoyi/train/domain/TrainClassReport.java b/RuoYi-Vue/ruoyi-train/src/main/java/com/ruoyi/train/domain/TrainClassReport.java index 08fc25e36..4df391253 100644 --- a/RuoYi-Vue/ruoyi-train/src/main/java/com/ruoyi/train/domain/TrainClassReport.java +++ b/RuoYi-Vue/ruoyi-train/src/main/java/com/ruoyi/train/domain/TrainClassReport.java @@ -2,175 +2,53 @@ package com.ruoyi.train.domain; import java.util.Date; import com.fasterxml.jackson.annotation.JsonFormat; -import org.apache.commons.lang3.builder.ToStringBuilder; -import org.apache.commons.lang3.builder.ToStringStyle; import com.ruoyi.common.annotation.Excel; import com.ruoyi.common.core.domain.BaseEntity; -/** - * 开班报到对象 train_class_report - * - * @author ruoyi - * @date 2026-09-08 - */ +/** V2 report read model backed by train_class_report and enrollment joins. */ public class TrainClassReport extends BaseEntity { private static final long serialVersionUID = 1L; - - /** 报到主键ID */ private Long reportId; - - /** 开班计划ID train_class_plan.plan_id */ - @Excel(name = "开班计划ID train_class_plan.plan_id") + private Long enrollmentId; private String planId; - - /** 学员学号 train_student.s_id */ - @Excel(name = "学员学号 train_student.s_id") + @Excel(name = "培训计划") + private String planName; private String studentId; - - /** 报到方式:1 身份证刷卡 2 人脸识别 */ - @Excel(name = "报到方式:1 身份证刷卡 2 人脸识别") + @Excel(name = "学员") + private String studentName; + @Excel(name = "报到方式", readConverterExp = "1=人脸识别,2=身份证刷卡,3=二维码,4=人工录入") private Integer reportWay; - - /** 报到一体机设备编号 */ - @Excel(name = "报到一体机设备编号") + @Excel(name = "核验设备") private String reportDeviceSn; - - /** 实际报到时间 */ - @JsonFormat(pattern = "yyyy-MM-dd") - @Excel(name = "实际报到时间", width = 30, dateFormat = "yyyy-MM-dd") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @Excel(name = "报到时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss") private Date reportTime; + @Excel(name = "核验结果", readConverterExp = "1=核验通过,2=核验不匹配,3=人工放行") + private Integer verifyResult; + @Excel(name = "核验说明") + private String verifyNote; - /** 0 未报到 1 已报到 2 请假未到 */ - @Excel(name = "0 未报到 1 已报到 2 请假未到") - private Integer reportStatus; - - /** 分配宿舍ID train_dormitory_info.dorm_id */ - @Excel(name = "分配宿舍ID train_dormitory_info.dorm_id") - private String allocDormId; - - /** 分配教室ID train_classroom_info.class_room_id */ - @Excel(name = "分配教室ID train_classroom_info.class_room_id") - private String allocClassroomId; - - /** 分配实训场地ID train_training_site.site_id */ - @Excel(name = "分配实训场地ID train_training_site.site_id") - private String allocSiteId; - - public void setReportId(Long reportId) - { - this.reportId = reportId; - } - - public Long getReportId() - { - return reportId; - } - - public void setPlanId(String planId) - { - this.planId = planId; - } - - public String getPlanId() - { - return planId; - } - - public void setStudentId(String studentId) - { - this.studentId = studentId; - } - - public String getStudentId() - { - return studentId; - } - - public void setReportWay(Integer reportWay) - { - this.reportWay = reportWay; - } - - public Integer getReportWay() - { - return reportWay; - } - - public void setReportDeviceSn(String reportDeviceSn) - { - this.reportDeviceSn = reportDeviceSn; - } - - public String getReportDeviceSn() - { - return reportDeviceSn; - } - - public void setReportTime(Date reportTime) - { - this.reportTime = reportTime; - } - - public Date getReportTime() - { - return reportTime; - } - - public void setReportStatus(Integer reportStatus) - { - this.reportStatus = reportStatus; - } - - public Integer getReportStatus() - { - return reportStatus; - } - - public void setAllocDormId(String allocDormId) - { - this.allocDormId = allocDormId; - } - - public String getAllocDormId() - { - return allocDormId; - } - - public void setAllocClassroomId(String allocClassroomId) - { - this.allocClassroomId = allocClassroomId; - } - - public String getAllocClassroomId() - { - return allocClassroomId; - } - - public void setAllocSiteId(String allocSiteId) - { - this.allocSiteId = allocSiteId; - } - - public String getAllocSiteId() - { - return allocSiteId; - } - - @Override - public String toString() { - return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) - .append("reportId", getReportId()) - .append("planId", getPlanId()) - .append("studentId", getStudentId()) - .append("reportWay", getReportWay()) - .append("reportDeviceSn", getReportDeviceSn()) - .append("reportTime", getReportTime()) - .append("reportStatus", getReportStatus()) - .append("allocDormId", getAllocDormId()) - .append("allocClassroomId", getAllocClassroomId()) - .append("allocSiteId", getAllocSiteId()) - .append("createTime", getCreateTime()) - .toString(); - } + public Long getReportId() { return reportId; } + public void setReportId(Long reportId) { this.reportId = reportId; } + public Long getEnrollmentId() { return enrollmentId; } + public void setEnrollmentId(Long enrollmentId) { this.enrollmentId = enrollmentId; } + public String getPlanId() { return planId; } + public void setPlanId(String planId) { this.planId = planId; } + public String getPlanName() { return planName; } + public void setPlanName(String planName) { this.planName = planName; } + public String getStudentId() { return studentId; } + public void setStudentId(String studentId) { this.studentId = studentId; } + public String getStudentName() { return studentName; } + public void setStudentName(String studentName) { this.studentName = studentName; } + public Integer getReportWay() { return reportWay; } + public void setReportWay(Integer reportWay) { this.reportWay = reportWay; } + public String getReportDeviceSn() { return reportDeviceSn; } + public void setReportDeviceSn(String reportDeviceSn) { this.reportDeviceSn = reportDeviceSn; } + public Date getReportTime() { return reportTime; } + public void setReportTime(Date reportTime) { this.reportTime = reportTime; } + public Integer getVerifyResult() { return verifyResult; } + public void setVerifyResult(Integer verifyResult) { this.verifyResult = verifyResult; } + public String getVerifyNote() { return verifyNote; } + public void setVerifyNote(String verifyNote) { this.verifyNote = verifyNote; } } diff --git a/RuoYi-Vue/ruoyi-train/src/main/java/com/ruoyi/train/domain/TrainStudentCheckin.java b/RuoYi-Vue/ruoyi-train/src/main/java/com/ruoyi/train/domain/TrainStudentCheckin.java index a443cece8..e854d5af1 100644 --- a/RuoYi-Vue/ruoyi-train/src/main/java/com/ruoyi/train/domain/TrainStudentCheckin.java +++ b/RuoYi-Vue/ruoyi-train/src/main/java/com/ruoyi/train/domain/TrainStudentCheckin.java @@ -2,176 +2,72 @@ package com.ruoyi.train.domain; import java.util.Date; import com.fasterxml.jackson.annotation.JsonFormat; -import org.apache.commons.lang3.builder.ToStringBuilder; -import org.apache.commons.lang3.builder.ToStringStyle; import com.ruoyi.common.annotation.Excel; import com.ruoyi.common.core.domain.BaseEntity; -/** - * 学生签到对象 train_student_checkin - * - * @author ruoyi - * @date 2026-09-08 - */ +/** V2 attendance read model backed by enrollment and lesson relationships. */ public class TrainStudentCheckin extends BaseEntity { private static final long serialVersionUID = 1L; - - /** 签到记录ID */ private Long checkinId; - - /** 开班计划ID */ - @Excel(name = "开班计划ID") + private Long enrollmentId; + private Long lessonId; private String planId; - - /** 课程ID */ - @Excel(name = "课程ID") - private String cId; - - /** 学员学号 */ - @Excel(name = "学员学号") + @Excel(name = "培训计划") + private String planName; private String studentId; - - /** 签到电子班牌设备ID train_electronic_board.board_id */ - @Excel(name = "签到电子班牌设备ID train_electronic_board.board_id") + @Excel(name = "学员") + private String studentName; + @Excel(name = "课程") + private String courseName; private String boardId; - - /** 1 人脸签到 2 二维码签到 3 后台手动补签 */ - @Excel(name = "1 人脸签到 2 二维码签到 3 后台手动补签") + @Excel(name = "班牌编号") + private String boardSn; + @Excel(name = "班牌名称") + private String boardName; + @Excel(name = "签到方式", readConverterExp = "1=人脸,2=刷卡,3=扫码,4=教师代签") private Integer checkinWay; + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @Excel(name = "签到时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss") + private Date signInTime; + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @Excel(name = "签退时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss") + private Date signOutTime; + @Excel(name = "考勤状态", readConverterExp = "0=缺勤,1=正常出勤,2=迟到,3=早退,4=请假") + private Integer attendanceStatus; + @Excel(name = "人工修正", readConverterExp = "0=否,1=是") + private Integer manualFlag; - /** 签到时间 */ - @JsonFormat(pattern = "yyyy-MM-dd") - @Excel(name = "签到时间", width = 30, dateFormat = "yyyy-MM-dd") - private Date checkinTime; - - /** 1 正常签到 2 迟到 3 早退 4 缺勤 */ - @Excel(name = "1 正常签到 2 迟到 3 早退 4 缺勤") - private Integer checkinStatus; - - /** 本节课程上课时间 */ - @JsonFormat(pattern = "yyyy-MM-dd") - @Excel(name = "本节课程上课时间", width = 30, dateFormat = "yyyy-MM-dd") - private Date lessonStartTime; - - /** 本节课程下课时间 */ - @JsonFormat(pattern = "yyyy-MM-dd") - @Excel(name = "本节课程下课时间", width = 30, dateFormat = "yyyy-MM-dd") - private Date lessonEndTime; - - public void setCheckinId(Long checkinId) - { - this.checkinId = checkinId; - } - - public Long getCheckinId() - { - return checkinId; - } - - public void setPlanId(String planId) - { - this.planId = planId; - } - - public String getPlanId() - { - return planId; - } - - public void setcId(String cId) - { - this.cId = cId; - } - - public String getcId() - { - return cId; - } - - public void setStudentId(String studentId) - { - this.studentId = studentId; - } - - public String getStudentId() - { - return studentId; - } - - public void setBoardId(String boardId) - { - this.boardId = boardId; - } - - public String getBoardId() - { - return boardId; - } - - public void setCheckinWay(Integer checkinWay) - { - this.checkinWay = checkinWay; - } - - public Integer getCheckinWay() - { - return checkinWay; - } - - public void setCheckinTime(Date checkinTime) - { - this.checkinTime = checkinTime; - } - - public Date getCheckinTime() - { - return checkinTime; - } - - public void setCheckinStatus(Integer checkinStatus) - { - this.checkinStatus = checkinStatus; - } - - public Integer getCheckinStatus() - { - return checkinStatus; - } - - public void setLessonStartTime(Date lessonStartTime) - { - this.lessonStartTime = lessonStartTime; - } - - public Date getLessonStartTime() - { - return lessonStartTime; - } - - public void setLessonEndTime(Date lessonEndTime) - { - this.lessonEndTime = lessonEndTime; - } - - public Date getLessonEndTime() - { - return lessonEndTime; - } - - @Override - public String toString() { - return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) - .append("checkinId", getCheckinId()) - .append("planId", getPlanId()) - .append("cId", getcId()) - .append("studentId", getStudentId()) - .append("boardId", getBoardId()) - .append("checkinWay", getCheckinWay()) - .append("checkinTime", getCheckinTime()) - .append("checkinStatus", getCheckinStatus()) - .append("lessonStartTime", getLessonStartTime()) - .append("lessonEndTime", getLessonEndTime()) - .toString(); - } + public Long getCheckinId() { return checkinId; } + public void setCheckinId(Long checkinId) { this.checkinId = checkinId; } + public Long getEnrollmentId() { return enrollmentId; } + public void setEnrollmentId(Long enrollmentId) { this.enrollmentId = enrollmentId; } + public Long getLessonId() { return lessonId; } + public void setLessonId(Long lessonId) { this.lessonId = lessonId; } + public String getPlanId() { return planId; } + public void setPlanId(String planId) { this.planId = planId; } + public String getPlanName() { return planName; } + public void setPlanName(String planName) { this.planName = planName; } + public String getStudentId() { return studentId; } + public void setStudentId(String studentId) { this.studentId = studentId; } + public String getStudentName() { return studentName; } + public void setStudentName(String studentName) { this.studentName = studentName; } + public String getCourseName() { return courseName; } + public void setCourseName(String courseName) { this.courseName = courseName; } + public String getBoardId() { return boardId; } + public void setBoardId(String boardId) { this.boardId = boardId; } + public String getBoardSn() { return boardSn; } + public void setBoardSn(String boardSn) { this.boardSn = boardSn; } + public String getBoardName() { return boardName; } + public void setBoardName(String boardName) { this.boardName = boardName; } + public Integer getCheckinWay() { return checkinWay; } + public void setCheckinWay(Integer checkinWay) { this.checkinWay = checkinWay; } + public Date getSignInTime() { return signInTime; } + public void setSignInTime(Date signInTime) { this.signInTime = signInTime; } + public Date getSignOutTime() { return signOutTime; } + public void setSignOutTime(Date signOutTime) { this.signOutTime = signOutTime; } + public Integer getAttendanceStatus() { return attendanceStatus; } + public void setAttendanceStatus(Integer attendanceStatus) { this.attendanceStatus = attendanceStatus; } + public Integer getManualFlag() { return manualFlag; } + public void setManualFlag(Integer manualFlag) { this.manualFlag = manualFlag; } } diff --git a/RuoYi-Vue/ruoyi-train/src/main/java/com/ruoyi/train/domain/TrainStudentPortrait.java b/RuoYi-Vue/ruoyi-train/src/main/java/com/ruoyi/train/domain/TrainStudentPortrait.java index 89565668f..65a3733c9 100644 --- a/RuoYi-Vue/ruoyi-train/src/main/java/com/ruoyi/train/domain/TrainStudentPortrait.java +++ b/RuoYi-Vue/ruoyi-train/src/main/java/com/ruoyi/train/domain/TrainStudentPortrait.java @@ -1,144 +1,63 @@ package com.ruoyi.train.domain; import java.math.BigDecimal; -import org.apache.commons.lang3.builder.ToStringBuilder; -import org.apache.commons.lang3.builder.ToStringStyle; +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; import com.ruoyi.common.annotation.Excel; import com.ruoyi.common.core.domain.BaseEntity; -/** - * 学员画像对象 train_student_portrait - * - * @author ruoyi - * @date 2026-09-08 - */ +/** V2 system-generated portrait read model. */ public class TrainStudentPortrait extends BaseEntity { private static final long serialVersionUID = 1L; - - /** 画像ID */ private Long portraitId; - - /** 学员学号 */ - @Excel(name = "学员学号") - private String studentId; - - /** 开班计划ID */ - @Excel(name = "开班计划ID") + private Long enrollmentId; private String planId; - - /** 累计学习总时长 */ - @Excel(name = "累计学习总时长") + @Excel(name = "培训计划") + private String planName; + private String studentId; + @Excel(name = "学员") + private String studentName; + @Excel(name = "出勤率(%)") + private BigDecimal attendanceRate; + @Excel(name = "理论成绩") + private BigDecimal theoryScore; + @Excel(name = "实操成绩") + private BigDecimal practicalScore; + @Excel(name = "累计学习学时") private BigDecimal totalStudyHour; - - /** 平均成绩 */ - @Excel(name = "平均成绩") - private BigDecimal avgScore; - - /** 签到率 */ - @Excel(name = "签到率") - private BigDecimal checkinRate; - - /** 画像标签,逗号分割,例如:动手能力强,理论薄弱 */ - @Excel(name = "画像标签,逗号分割,例如:动手能力强,理论薄弱") + @Excel(name = "画像标签") private String labelTag; - - /** 画像综合描述 */ - @Excel(name = "画像综合描述") + @Excel(name = "综合评价") private String portraitContent; + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @Excel(name = "生成时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss") + private Date generatedTime; - public void setPortraitId(Long portraitId) - { - this.portraitId = portraitId; - } - - public Long getPortraitId() - { - return portraitId; - } - - public void setStudentId(String studentId) - { - this.studentId = studentId; - } - - public String getStudentId() - { - return studentId; - } - - public void setPlanId(String planId) - { - this.planId = planId; - } - - public String getPlanId() - { - return planId; - } - - public void setTotalStudyHour(BigDecimal totalStudyHour) - { - this.totalStudyHour = totalStudyHour; - } - - public BigDecimal getTotalStudyHour() - { - return totalStudyHour; - } - - public void setAvgScore(BigDecimal avgScore) - { - this.avgScore = avgScore; - } - - public BigDecimal getAvgScore() - { - return avgScore; - } - - public void setCheckinRate(BigDecimal checkinRate) - { - this.checkinRate = checkinRate; - } - - public BigDecimal getCheckinRate() - { - return checkinRate; - } - - public void setLabelTag(String labelTag) - { - this.labelTag = labelTag; - } - - public String getLabelTag() - { - return labelTag; - } - - public void setPortraitContent(String portraitContent) - { - this.portraitContent = portraitContent; - } - - public String getPortraitContent() - { - return portraitContent; - } - - @Override - public String toString() { - return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) - .append("portraitId", getPortraitId()) - .append("studentId", getStudentId()) - .append("planId", getPlanId()) - .append("totalStudyHour", getTotalStudyHour()) - .append("avgScore", getAvgScore()) - .append("checkinRate", getCheckinRate()) - .append("labelTag", getLabelTag()) - .append("portraitContent", getPortraitContent()) - .append("updateTime", getUpdateTime()) - .toString(); - } + public Long getPortraitId() { return portraitId; } + public void setPortraitId(Long portraitId) { this.portraitId = portraitId; } + public Long getEnrollmentId() { return enrollmentId; } + public void setEnrollmentId(Long enrollmentId) { this.enrollmentId = enrollmentId; } + public String getPlanId() { return planId; } + public void setPlanId(String planId) { this.planId = planId; } + public String getPlanName() { return planName; } + public void setPlanName(String planName) { this.planName = planName; } + public String getStudentId() { return studentId; } + public void setStudentId(String studentId) { this.studentId = studentId; } + public String getStudentName() { return studentName; } + public void setStudentName(String studentName) { this.studentName = studentName; } + public BigDecimal getAttendanceRate() { return attendanceRate; } + public void setAttendanceRate(BigDecimal attendanceRate) { this.attendanceRate = attendanceRate; } + public BigDecimal getTheoryScore() { return theoryScore; } + public void setTheoryScore(BigDecimal theoryScore) { this.theoryScore = theoryScore; } + public BigDecimal getPracticalScore() { return practicalScore; } + public void setPracticalScore(BigDecimal practicalScore) { this.practicalScore = practicalScore; } + public BigDecimal getTotalStudyHour() { return totalStudyHour; } + public void setTotalStudyHour(BigDecimal totalStudyHour) { this.totalStudyHour = totalStudyHour; } + public String getLabelTag() { return labelTag; } + public void setLabelTag(String labelTag) { this.labelTag = labelTag; } + public String getPortraitContent() { return portraitContent; } + public void setPortraitContent(String portraitContent) { this.portraitContent = portraitContent; } + public Date getGeneratedTime() { return generatedTime; } + public void setGeneratedTime(Date generatedTime) { this.generatedTime = generatedTime; } } diff --git a/RuoYi-Vue/ruoyi-train/src/main/java/com/ruoyi/train/domain/TrainStudyDuration.java b/RuoYi-Vue/ruoyi-train/src/main/java/com/ruoyi/train/domain/TrainStudyDuration.java index a0253520f..0defbec84 100644 --- a/RuoYi-Vue/ruoyi-train/src/main/java/com/ruoyi/train/domain/TrainStudyDuration.java +++ b/RuoYi-Vue/ruoyi-train/src/main/java/com/ruoyi/train/domain/TrainStudyDuration.java @@ -2,161 +2,76 @@ package com.ruoyi.train.domain; import java.util.Date; import com.fasterxml.jackson.annotation.JsonFormat; -import org.apache.commons.lang3.builder.ToStringBuilder; -import org.apache.commons.lang3.builder.ToStringStyle; import com.ruoyi.common.annotation.Excel; import com.ruoyi.common.core.domain.BaseEntity; -/** - * 学习时长统计对象 train_study_duration - * - * @author ruoyi - * @date 2026-09-08 - */ +/** V2 external learning-event read model. */ public class TrainStudyDuration extends BaseEntity { private static final long serialVersionUID = 1L; - - /** 记录ID */ private Long durId; - - /** 学员学号 */ - @Excel(name = "学员学号") - private String studentId; - - /** 开班计划ID */ - @Excel(name = "开班计划ID") + private Long enrollmentId; + private Long planCourseId; private String planId; - - /** 课程ID */ - @Excel(name = "课程ID") - private String cId; - - /** 设备类型:阅览室一体机 / 听书机 / VR实训 / 3D拆解 / 3D巡检 */ - @Excel(name = "设备类型:阅览室一体机 / 听书机 / VR实训 / 3D拆解 / 3D巡检") - private String deviceType; - - /** 开始学习时间 */ - @JsonFormat(pattern = "yyyy-MM-dd") - @Excel(name = "开始学习时间", width = 30, dateFormat = "yyyy-MM-dd") + @Excel(name = "培训计划") + private String planName; + private String studentId; + @Excel(name = "学员") + private String studentName; + @Excel(name = "课程") + private String courseName; + private String resourceId; + @Excel(name = "学习资源") + private String resourceName; + @Excel(name = "学习内容") + private String learningContent; + @Excel(name = "来源系统") + private String sourceSystem; + private String sourceEventId; + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @Excel(name = "开始时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss") private Date startTime; - - /** 结束学习时间 */ - @JsonFormat(pattern = "yyyy-MM-dd") - @Excel(name = "结束学习时间", width = 30, dateFormat = "yyyy-MM-dd") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @Excel(name = "结束时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss") private Date endTime; - - /** 学习时长,单位秒 */ - @Excel(name = "学习时长,单位秒") + @Excel(name = "有效时长(秒)") private Long studySeconds; - - /** 数据同步入库时间 */ - @JsonFormat(pattern = "yyyy-MM-dd") - @Excel(name = "数据同步入库时间", width = 30, dateFormat = "yyyy-MM-dd") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @Excel(name = "入库时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss") private Date syncTime; - public void setDurId(Long durId) - { - this.durId = durId; - } - - public Long getDurId() - { - return durId; - } - - public void setStudentId(String studentId) - { - this.studentId = studentId; - } - - public String getStudentId() - { - return studentId; - } - - public void setPlanId(String planId) - { - this.planId = planId; - } - - public String getPlanId() - { - return planId; - } - - public void setcId(String cId) - { - this.cId = cId; - } - - public String getcId() - { - return cId; - } - - public void setDeviceType(String deviceType) - { - this.deviceType = deviceType; - } - - public String getDeviceType() - { - return deviceType; - } - - public void setStartTime(Date startTime) - { - this.startTime = startTime; - } - - public Date getStartTime() - { - return startTime; - } - - public void setEndTime(Date endTime) - { - this.endTime = endTime; - } - - public Date getEndTime() - { - return endTime; - } - - public void setStudySeconds(Long studySeconds) - { - this.studySeconds = studySeconds; - } - - public Long getStudySeconds() - { - return studySeconds; - } - - public void setSyncTime(Date syncTime) - { - this.syncTime = syncTime; - } - - public Date getSyncTime() - { - return syncTime; - } - - @Override - public String toString() { - return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) - .append("durId", getDurId()) - .append("studentId", getStudentId()) - .append("planId", getPlanId()) - .append("cId", getcId()) - .append("deviceType", getDeviceType()) - .append("startTime", getStartTime()) - .append("endTime", getEndTime()) - .append("studySeconds", getStudySeconds()) - .append("syncTime", getSyncTime()) - .toString(); - } + public Long getDurId() { return durId; } + public void setDurId(Long durId) { this.durId = durId; } + public Long getEnrollmentId() { return enrollmentId; } + public void setEnrollmentId(Long enrollmentId) { this.enrollmentId = enrollmentId; } + public Long getPlanCourseId() { return planCourseId; } + public void setPlanCourseId(Long planCourseId) { this.planCourseId = planCourseId; } + public String getPlanId() { return planId; } + public void setPlanId(String planId) { this.planId = planId; } + public String getPlanName() { return planName; } + public void setPlanName(String planName) { this.planName = planName; } + public String getStudentId() { return studentId; } + public void setStudentId(String studentId) { this.studentId = studentId; } + public String getStudentName() { return studentName; } + public void setStudentName(String studentName) { this.studentName = studentName; } + public String getCourseName() { return courseName; } + public void setCourseName(String courseName) { this.courseName = courseName; } + public String getResourceId() { return resourceId; } + public void setResourceId(String resourceId) { this.resourceId = resourceId; } + public String getResourceName() { return resourceName; } + public void setResourceName(String resourceName) { this.resourceName = resourceName; } + public String getLearningContent() { return learningContent; } + public void setLearningContent(String learningContent) { this.learningContent = learningContent; } + public String getSourceSystem() { return sourceSystem; } + public void setSourceSystem(String sourceSystem) { this.sourceSystem = sourceSystem; } + public String getSourceEventId() { return sourceEventId; } + public void setSourceEventId(String sourceEventId) { this.sourceEventId = sourceEventId; } + public Date getStartTime() { return startTime; } + public void setStartTime(Date startTime) { this.startTime = startTime; } + public Date getEndTime() { return endTime; } + public void setEndTime(Date endTime) { this.endTime = endTime; } + public Long getStudySeconds() { return studySeconds; } + public void setStudySeconds(Long studySeconds) { this.studySeconds = studySeconds; } + public Date getSyncTime() { return syncTime; } + public void setSyncTime(Date syncTime) { this.syncTime = syncTime; } } diff --git a/RuoYi-Vue/ruoyi-train/src/main/java/com/ruoyi/train/mapper/TrainClassReportMapper.java b/RuoYi-Vue/ruoyi-train/src/main/java/com/ruoyi/train/mapper/TrainClassReportMapper.java index 258f75fda..1733911ac 100644 --- a/RuoYi-Vue/ruoyi-train/src/main/java/com/ruoyi/train/mapper/TrainClassReportMapper.java +++ b/RuoYi-Vue/ruoyi-train/src/main/java/com/ruoyi/train/mapper/TrainClassReportMapper.java @@ -27,35 +27,4 @@ public interface TrainClassReportMapper */ public List selectTrainClassReportList(TrainClassReport trainClassReport); - /** - * 新增开班报到 - * - * @param trainClassReport 开班报到 - * @return 结果 - */ - public int insertTrainClassReport(TrainClassReport trainClassReport); - - /** - * 修改开班报到 - * - * @param trainClassReport 开班报到 - * @return 结果 - */ - public int updateTrainClassReport(TrainClassReport trainClassReport); - - /** - * 删除开班报到 - * - * @param reportId 开班报到主键 - * @return 结果 - */ - public int deleteTrainClassReportByReportId(Long reportId); - - /** - * 批量删除开班报到 - * - * @param reportIds 需要删除的数据主键集合 - * @return 结果 - */ - public int deleteTrainClassReportByReportIds(Long[] reportIds); } diff --git a/RuoYi-Vue/ruoyi-train/src/main/java/com/ruoyi/train/mapper/TrainStudentCheckinMapper.java b/RuoYi-Vue/ruoyi-train/src/main/java/com/ruoyi/train/mapper/TrainStudentCheckinMapper.java index 23a18bba1..77c59df39 100644 --- a/RuoYi-Vue/ruoyi-train/src/main/java/com/ruoyi/train/mapper/TrainStudentCheckinMapper.java +++ b/RuoYi-Vue/ruoyi-train/src/main/java/com/ruoyi/train/mapper/TrainStudentCheckinMapper.java @@ -27,35 +27,4 @@ public interface TrainStudentCheckinMapper */ public List selectTrainStudentCheckinList(TrainStudentCheckin trainStudentCheckin); - /** - * 新增学生签到 - * - * @param trainStudentCheckin 学生签到 - * @return 结果 - */ - public int insertTrainStudentCheckin(TrainStudentCheckin trainStudentCheckin); - - /** - * 修改学生签到 - * - * @param trainStudentCheckin 学生签到 - * @return 结果 - */ - public int updateTrainStudentCheckin(TrainStudentCheckin trainStudentCheckin); - - /** - * 删除学生签到 - * - * @param checkinId 学生签到主键 - * @return 结果 - */ - public int deleteTrainStudentCheckinByCheckinId(Long checkinId); - - /** - * 批量删除学生签到 - * - * @param checkinIds 需要删除的数据主键集合 - * @return 结果 - */ - public int deleteTrainStudentCheckinByCheckinIds(Long[] checkinIds); } diff --git a/RuoYi-Vue/ruoyi-train/src/main/java/com/ruoyi/train/mapper/TrainStudentPortraitMapper.java b/RuoYi-Vue/ruoyi-train/src/main/java/com/ruoyi/train/mapper/TrainStudentPortraitMapper.java index 5b07ada29..02d89cab1 100644 --- a/RuoYi-Vue/ruoyi-train/src/main/java/com/ruoyi/train/mapper/TrainStudentPortraitMapper.java +++ b/RuoYi-Vue/ruoyi-train/src/main/java/com/ruoyi/train/mapper/TrainStudentPortraitMapper.java @@ -27,35 +27,4 @@ public interface TrainStudentPortraitMapper */ public List selectTrainStudentPortraitList(TrainStudentPortrait trainStudentPortrait); - /** - * 新增学员画像 - * - * @param trainStudentPortrait 学员画像 - * @return 结果 - */ - public int insertTrainStudentPortrait(TrainStudentPortrait trainStudentPortrait); - - /** - * 修改学员画像 - * - * @param trainStudentPortrait 学员画像 - * @return 结果 - */ - public int updateTrainStudentPortrait(TrainStudentPortrait trainStudentPortrait); - - /** - * 删除学员画像 - * - * @param portraitId 学员画像主键 - * @return 结果 - */ - public int deleteTrainStudentPortraitByPortraitId(Long portraitId); - - /** - * 批量删除学员画像 - * - * @param portraitIds 需要删除的数据主键集合 - * @return 结果 - */ - public int deleteTrainStudentPortraitByPortraitIds(Long[] portraitIds); } diff --git a/RuoYi-Vue/ruoyi-train/src/main/java/com/ruoyi/train/mapper/TrainStudyDurationMapper.java b/RuoYi-Vue/ruoyi-train/src/main/java/com/ruoyi/train/mapper/TrainStudyDurationMapper.java index 229163c32..b7f3816ac 100644 --- a/RuoYi-Vue/ruoyi-train/src/main/java/com/ruoyi/train/mapper/TrainStudyDurationMapper.java +++ b/RuoYi-Vue/ruoyi-train/src/main/java/com/ruoyi/train/mapper/TrainStudyDurationMapper.java @@ -27,35 +27,4 @@ public interface TrainStudyDurationMapper */ public List selectTrainStudyDurationList(TrainStudyDuration trainStudyDuration); - /** - * 新增学习时长统计 - * - * @param trainStudyDuration 学习时长统计 - * @return 结果 - */ - public int insertTrainStudyDuration(TrainStudyDuration trainStudyDuration); - - /** - * 修改学习时长统计 - * - * @param trainStudyDuration 学习时长统计 - * @return 结果 - */ - public int updateTrainStudyDuration(TrainStudyDuration trainStudyDuration); - - /** - * 删除学习时长统计 - * - * @param durId 学习时长统计主键 - * @return 结果 - */ - public int deleteTrainStudyDurationByDurId(Long durId); - - /** - * 批量删除学习时长统计 - * - * @param durIds 需要删除的数据主键集合 - * @return 结果 - */ - public int deleteTrainStudyDurationByDurIds(Long[] durIds); } diff --git a/RuoYi-Vue/ruoyi-train/src/main/java/com/ruoyi/train/service/ITrainClassReportService.java b/RuoYi-Vue/ruoyi-train/src/main/java/com/ruoyi/train/service/ITrainClassReportService.java index 5022ce0b2..01ac3c193 100644 --- a/RuoYi-Vue/ruoyi-train/src/main/java/com/ruoyi/train/service/ITrainClassReportService.java +++ b/RuoYi-Vue/ruoyi-train/src/main/java/com/ruoyi/train/service/ITrainClassReportService.java @@ -27,35 +27,4 @@ public interface ITrainClassReportService */ public List selectTrainClassReportList(TrainClassReport trainClassReport); - /** - * 新增开班报到 - * - * @param trainClassReport 开班报到 - * @return 结果 - */ - public int insertTrainClassReport(TrainClassReport trainClassReport); - - /** - * 修改开班报到 - * - * @param trainClassReport 开班报到 - * @return 结果 - */ - public int updateTrainClassReport(TrainClassReport trainClassReport); - - /** - * 批量删除开班报到 - * - * @param reportIds 需要删除的开班报到主键集合 - * @return 结果 - */ - public int deleteTrainClassReportByReportIds(Long[] reportIds); - - /** - * 删除开班报到信息 - * - * @param reportId 开班报到主键 - * @return 结果 - */ - public int deleteTrainClassReportByReportId(Long reportId); } diff --git a/RuoYi-Vue/ruoyi-train/src/main/java/com/ruoyi/train/service/ITrainStudentCheckinService.java b/RuoYi-Vue/ruoyi-train/src/main/java/com/ruoyi/train/service/ITrainStudentCheckinService.java index ce487fabc..fc1e446ac 100644 --- a/RuoYi-Vue/ruoyi-train/src/main/java/com/ruoyi/train/service/ITrainStudentCheckinService.java +++ b/RuoYi-Vue/ruoyi-train/src/main/java/com/ruoyi/train/service/ITrainStudentCheckinService.java @@ -27,35 +27,4 @@ public interface ITrainStudentCheckinService */ public List selectTrainStudentCheckinList(TrainStudentCheckin trainStudentCheckin); - /** - * 新增学生签到 - * - * @param trainStudentCheckin 学生签到 - * @return 结果 - */ - public int insertTrainStudentCheckin(TrainStudentCheckin trainStudentCheckin); - - /** - * 修改学生签到 - * - * @param trainStudentCheckin 学生签到 - * @return 结果 - */ - public int updateTrainStudentCheckin(TrainStudentCheckin trainStudentCheckin); - - /** - * 批量删除学生签到 - * - * @param checkinIds 需要删除的学生签到主键集合 - * @return 结果 - */ - public int deleteTrainStudentCheckinByCheckinIds(Long[] checkinIds); - - /** - * 删除学生签到信息 - * - * @param checkinId 学生签到主键 - * @return 结果 - */ - public int deleteTrainStudentCheckinByCheckinId(Long checkinId); } diff --git a/RuoYi-Vue/ruoyi-train/src/main/java/com/ruoyi/train/service/ITrainStudentPortraitService.java b/RuoYi-Vue/ruoyi-train/src/main/java/com/ruoyi/train/service/ITrainStudentPortraitService.java index 3b73191a2..029c36335 100644 --- a/RuoYi-Vue/ruoyi-train/src/main/java/com/ruoyi/train/service/ITrainStudentPortraitService.java +++ b/RuoYi-Vue/ruoyi-train/src/main/java/com/ruoyi/train/service/ITrainStudentPortraitService.java @@ -27,35 +27,4 @@ public interface ITrainStudentPortraitService */ public List selectTrainStudentPortraitList(TrainStudentPortrait trainStudentPortrait); - /** - * 新增学员画像 - * - * @param trainStudentPortrait 学员画像 - * @return 结果 - */ - public int insertTrainStudentPortrait(TrainStudentPortrait trainStudentPortrait); - - /** - * 修改学员画像 - * - * @param trainStudentPortrait 学员画像 - * @return 结果 - */ - public int updateTrainStudentPortrait(TrainStudentPortrait trainStudentPortrait); - - /** - * 批量删除学员画像 - * - * @param portraitIds 需要删除的学员画像主键集合 - * @return 结果 - */ - public int deleteTrainStudentPortraitByPortraitIds(Long[] portraitIds); - - /** - * 删除学员画像信息 - * - * @param portraitId 学员画像主键 - * @return 结果 - */ - public int deleteTrainStudentPortraitByPortraitId(Long portraitId); } diff --git a/RuoYi-Vue/ruoyi-train/src/main/java/com/ruoyi/train/service/ITrainStudyDurationService.java b/RuoYi-Vue/ruoyi-train/src/main/java/com/ruoyi/train/service/ITrainStudyDurationService.java index f70c04c66..33fad10a9 100644 --- a/RuoYi-Vue/ruoyi-train/src/main/java/com/ruoyi/train/service/ITrainStudyDurationService.java +++ b/RuoYi-Vue/ruoyi-train/src/main/java/com/ruoyi/train/service/ITrainStudyDurationService.java @@ -27,35 +27,4 @@ public interface ITrainStudyDurationService */ public List selectTrainStudyDurationList(TrainStudyDuration trainStudyDuration); - /** - * 新增学习时长统计 - * - * @param trainStudyDuration 学习时长统计 - * @return 结果 - */ - public int insertTrainStudyDuration(TrainStudyDuration trainStudyDuration); - - /** - * 修改学习时长统计 - * - * @param trainStudyDuration 学习时长统计 - * @return 结果 - */ - public int updateTrainStudyDuration(TrainStudyDuration trainStudyDuration); - - /** - * 批量删除学习时长统计 - * - * @param durIds 需要删除的学习时长统计主键集合 - * @return 结果 - */ - public int deleteTrainStudyDurationByDurIds(Long[] durIds); - - /** - * 删除学习时长统计信息 - * - * @param durId 学习时长统计主键 - * @return 结果 - */ - public int deleteTrainStudyDurationByDurId(Long durId); } diff --git a/RuoYi-Vue/ruoyi-train/src/main/java/com/ruoyi/train/service/impl/TrainClassReportServiceImpl.java b/RuoYi-Vue/ruoyi-train/src/main/java/com/ruoyi/train/service/impl/TrainClassReportServiceImpl.java index 43a23cf33..07820ba2c 100644 --- a/RuoYi-Vue/ruoyi-train/src/main/java/com/ruoyi/train/service/impl/TrainClassReportServiceImpl.java +++ b/RuoYi-Vue/ruoyi-train/src/main/java/com/ruoyi/train/service/impl/TrainClassReportServiceImpl.java @@ -1,9 +1,9 @@ package com.ruoyi.train.service.impl; import java.util.List; -import com.ruoyi.common.utils.DateUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import com.ruoyi.train.mapper.TrainClassReportMapper; import com.ruoyi.train.domain.TrainClassReport; import com.ruoyi.train.service.ITrainClassReportService; @@ -15,6 +15,7 @@ import com.ruoyi.train.service.ITrainClassReportService; * @date 2026-09-08 */ @Service +@Transactional(readOnly = true) public class TrainClassReportServiceImpl implements ITrainClassReportService { @Autowired @@ -44,52 +45,4 @@ public class TrainClassReportServiceImpl implements ITrainClassReportService return trainClassReportMapper.selectTrainClassReportList(trainClassReport); } - /** - * 新增开班报到 - * - * @param trainClassReport 开班报到 - * @return 结果 - */ - @Override - public int insertTrainClassReport(TrainClassReport trainClassReport) - { - trainClassReport.setCreateTime(DateUtils.getNowDate()); - return trainClassReportMapper.insertTrainClassReport(trainClassReport); - } - - /** - * 修改开班报到 - * - * @param trainClassReport 开班报到 - * @return 结果 - */ - @Override - public int updateTrainClassReport(TrainClassReport trainClassReport) - { - return trainClassReportMapper.updateTrainClassReport(trainClassReport); - } - - /** - * 批量删除开班报到 - * - * @param reportIds 需要删除的开班报到主键 - * @return 结果 - */ - @Override - public int deleteTrainClassReportByReportIds(Long[] reportIds) - { - return trainClassReportMapper.deleteTrainClassReportByReportIds(reportIds); - } - - /** - * 删除开班报到信息 - * - * @param reportId 开班报到主键 - * @return 结果 - */ - @Override - public int deleteTrainClassReportByReportId(Long reportId) - { - return trainClassReportMapper.deleteTrainClassReportByReportId(reportId); - } } diff --git a/RuoYi-Vue/ruoyi-train/src/main/java/com/ruoyi/train/service/impl/TrainStudentCheckinServiceImpl.java b/RuoYi-Vue/ruoyi-train/src/main/java/com/ruoyi/train/service/impl/TrainStudentCheckinServiceImpl.java index c777ae54e..54c3d59a5 100644 --- a/RuoYi-Vue/ruoyi-train/src/main/java/com/ruoyi/train/service/impl/TrainStudentCheckinServiceImpl.java +++ b/RuoYi-Vue/ruoyi-train/src/main/java/com/ruoyi/train/service/impl/TrainStudentCheckinServiceImpl.java @@ -3,6 +3,7 @@ package com.ruoyi.train.service.impl; import java.util.List; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import com.ruoyi.train.mapper.TrainStudentCheckinMapper; import com.ruoyi.train.domain.TrainStudentCheckin; import com.ruoyi.train.service.ITrainStudentCheckinService; @@ -14,6 +15,7 @@ import com.ruoyi.train.service.ITrainStudentCheckinService; * @date 2026-09-08 */ @Service +@Transactional(readOnly = true) public class TrainStudentCheckinServiceImpl implements ITrainStudentCheckinService { @Autowired @@ -43,51 +45,4 @@ public class TrainStudentCheckinServiceImpl implements ITrainStudentCheckinServi return trainStudentCheckinMapper.selectTrainStudentCheckinList(trainStudentCheckin); } - /** - * 新增学生签到 - * - * @param trainStudentCheckin 学生签到 - * @return 结果 - */ - @Override - public int insertTrainStudentCheckin(TrainStudentCheckin trainStudentCheckin) - { - return trainStudentCheckinMapper.insertTrainStudentCheckin(trainStudentCheckin); - } - - /** - * 修改学生签到 - * - * @param trainStudentCheckin 学生签到 - * @return 结果 - */ - @Override - public int updateTrainStudentCheckin(TrainStudentCheckin trainStudentCheckin) - { - return trainStudentCheckinMapper.updateTrainStudentCheckin(trainStudentCheckin); - } - - /** - * 批量删除学生签到 - * - * @param checkinIds 需要删除的学生签到主键 - * @return 结果 - */ - @Override - public int deleteTrainStudentCheckinByCheckinIds(Long[] checkinIds) - { - return trainStudentCheckinMapper.deleteTrainStudentCheckinByCheckinIds(checkinIds); - } - - /** - * 删除学生签到信息 - * - * @param checkinId 学生签到主键 - * @return 结果 - */ - @Override - public int deleteTrainStudentCheckinByCheckinId(Long checkinId) - { - return trainStudentCheckinMapper.deleteTrainStudentCheckinByCheckinId(checkinId); - } } diff --git a/RuoYi-Vue/ruoyi-train/src/main/java/com/ruoyi/train/service/impl/TrainStudentPortraitServiceImpl.java b/RuoYi-Vue/ruoyi-train/src/main/java/com/ruoyi/train/service/impl/TrainStudentPortraitServiceImpl.java index 6f8dec47e..18ec1c2ee 100644 --- a/RuoYi-Vue/ruoyi-train/src/main/java/com/ruoyi/train/service/impl/TrainStudentPortraitServiceImpl.java +++ b/RuoYi-Vue/ruoyi-train/src/main/java/com/ruoyi/train/service/impl/TrainStudentPortraitServiceImpl.java @@ -1,9 +1,9 @@ package com.ruoyi.train.service.impl; import java.util.List; -import com.ruoyi.common.utils.DateUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import com.ruoyi.train.mapper.TrainStudentPortraitMapper; import com.ruoyi.train.domain.TrainStudentPortrait; import com.ruoyi.train.service.ITrainStudentPortraitService; @@ -15,6 +15,7 @@ import com.ruoyi.train.service.ITrainStudentPortraitService; * @date 2026-09-08 */ @Service +@Transactional(readOnly = true) public class TrainStudentPortraitServiceImpl implements ITrainStudentPortraitService { @Autowired @@ -44,52 +45,4 @@ public class TrainStudentPortraitServiceImpl implements ITrainStudentPortraitSer return trainStudentPortraitMapper.selectTrainStudentPortraitList(trainStudentPortrait); } - /** - * 新增学员画像 - * - * @param trainStudentPortrait 学员画像 - * @return 结果 - */ - @Override - public int insertTrainStudentPortrait(TrainStudentPortrait trainStudentPortrait) - { - return trainStudentPortraitMapper.insertTrainStudentPortrait(trainStudentPortrait); - } - - /** - * 修改学员画像 - * - * @param trainStudentPortrait 学员画像 - * @return 结果 - */ - @Override - public int updateTrainStudentPortrait(TrainStudentPortrait trainStudentPortrait) - { - trainStudentPortrait.setUpdateTime(DateUtils.getNowDate()); - return trainStudentPortraitMapper.updateTrainStudentPortrait(trainStudentPortrait); - } - - /** - * 批量删除学员画像 - * - * @param portraitIds 需要删除的学员画像主键 - * @return 结果 - */ - @Override - public int deleteTrainStudentPortraitByPortraitIds(Long[] portraitIds) - { - return trainStudentPortraitMapper.deleteTrainStudentPortraitByPortraitIds(portraitIds); - } - - /** - * 删除学员画像信息 - * - * @param portraitId 学员画像主键 - * @return 结果 - */ - @Override - public int deleteTrainStudentPortraitByPortraitId(Long portraitId) - { - return trainStudentPortraitMapper.deleteTrainStudentPortraitByPortraitId(portraitId); - } } diff --git a/RuoYi-Vue/ruoyi-train/src/main/java/com/ruoyi/train/service/impl/TrainStudyDurationServiceImpl.java b/RuoYi-Vue/ruoyi-train/src/main/java/com/ruoyi/train/service/impl/TrainStudyDurationServiceImpl.java index 2cf865122..ac1419faa 100644 --- a/RuoYi-Vue/ruoyi-train/src/main/java/com/ruoyi/train/service/impl/TrainStudyDurationServiceImpl.java +++ b/RuoYi-Vue/ruoyi-train/src/main/java/com/ruoyi/train/service/impl/TrainStudyDurationServiceImpl.java @@ -3,6 +3,7 @@ package com.ruoyi.train.service.impl; import java.util.List; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import com.ruoyi.train.mapper.TrainStudyDurationMapper; import com.ruoyi.train.domain.TrainStudyDuration; import com.ruoyi.train.service.ITrainStudyDurationService; @@ -14,6 +15,7 @@ import com.ruoyi.train.service.ITrainStudyDurationService; * @date 2026-09-08 */ @Service +@Transactional(readOnly = true) public class TrainStudyDurationServiceImpl implements ITrainStudyDurationService { @Autowired @@ -43,51 +45,4 @@ public class TrainStudyDurationServiceImpl implements ITrainStudyDurationService return trainStudyDurationMapper.selectTrainStudyDurationList(trainStudyDuration); } - /** - * 新增学习时长统计 - * - * @param trainStudyDuration 学习时长统计 - * @return 结果 - */ - @Override - public int insertTrainStudyDuration(TrainStudyDuration trainStudyDuration) - { - return trainStudyDurationMapper.insertTrainStudyDuration(trainStudyDuration); - } - - /** - * 修改学习时长统计 - * - * @param trainStudyDuration 学习时长统计 - * @return 结果 - */ - @Override - public int updateTrainStudyDuration(TrainStudyDuration trainStudyDuration) - { - return trainStudyDurationMapper.updateTrainStudyDuration(trainStudyDuration); - } - - /** - * 批量删除学习时长统计 - * - * @param durIds 需要删除的学习时长统计主键 - * @return 结果 - */ - @Override - public int deleteTrainStudyDurationByDurIds(Long[] durIds) - { - return trainStudyDurationMapper.deleteTrainStudyDurationByDurIds(durIds); - } - - /** - * 删除学习时长统计信息 - * - * @param durId 学习时长统计主键 - * @return 结果 - */ - @Override - public int deleteTrainStudyDurationByDurId(Long durId) - { - return trainStudyDurationMapper.deleteTrainStudyDurationByDurId(durId); - } } diff --git a/RuoYi-Vue/ruoyi-train/src/main/resources/mapper/train/TrainClassReportMapper.xml b/RuoYi-Vue/ruoyi-train/src/main/resources/mapper/train/TrainClassReportMapper.xml index 608b376eb..f01c361a5 100644 --- a/RuoYi-Vue/ruoyi-train/src/main/resources/mapper/train/TrainClassReportMapper.xml +++ b/RuoYi-Vue/ruoyi-train/src/main/resources/mapper/train/TrainClassReportMapper.xml @@ -1,100 +1,47 @@ - + - - - - - - - - - - - - + + + + + + + + + + + + + + - - select report_id, plan_id, student_id, report_way, report_device_sn, report_time, report_status, alloc_dorm_id, alloc_classroom_id, alloc_site_id, create_time from train_class_report + select r.report_id, r.enrollment_id, e.plan_id, p.plan_name, + e.student_id, s.s_name as student_name, r.report_way, + r.report_device_sn, r.report_time, r.verify_result, r.verify_note, + r.create_by, r.create_time, r.remark + from train_class_report r + join train_enrollment e on e.enrollment_id = r.enrollment_id + left join train_class_plan p on p.plan_id = e.plan_id + left join train_student s on s.s_id = e.student_id - - - - - insert into train_class_report - - plan_id, - student_id, - report_way, - report_device_sn, - report_time, - report_status, - alloc_dorm_id, - alloc_classroom_id, - alloc_site_id, - create_time, - - - #{planId}, - #{studentId}, - #{reportWay}, - #{reportDeviceSn}, - #{reportTime}, - #{reportStatus}, - #{allocDormId}, - #{allocClassroomId}, - #{allocSiteId}, - #{createTime}, - - - - - update train_class_report - - plan_id = #{planId}, - student_id = #{studentId}, - report_way = #{reportWay}, - report_device_sn = #{reportDeviceSn}, - report_time = #{reportTime}, - report_status = #{reportStatus}, - alloc_dorm_id = #{allocDormId}, - alloc_classroom_id = #{allocClassroomId}, - alloc_site_id = #{allocSiteId}, - create_time = #{createTime}, - - where report_id = #{reportId} - - - - delete from train_class_report where report_id = #{reportId} - - - - delete from train_class_report where report_id in - - #{reportId} - - - \ No newline at end of file + diff --git a/RuoYi-Vue/ruoyi-train/src/main/resources/mapper/train/TrainStudentCheckinMapper.xml b/RuoYi-Vue/ruoyi-train/src/main/resources/mapper/train/TrainStudentCheckinMapper.xml index cf6e95768..2401192b2 100644 --- a/RuoYi-Vue/ruoyi-train/src/main/resources/mapper/train/TrainStudentCheckinMapper.xml +++ b/RuoYi-Vue/ruoyi-train/src/main/resources/mapper/train/TrainStudentCheckinMapper.xml @@ -1,96 +1,60 @@ - + - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + - - select checkin_id, plan_id, c_id, student_id, board_id, checkin_way, checkin_time, checkin_status, lesson_start_time, lesson_end_time from train_student_checkin + select a.checkin_id, a.enrollment_id, a.lesson_id, e.plan_id, p.plan_name, + e.student_id, s.s_name as student_name, c.c_name as course_name, + a.board_id, b.board_sn, b.board_name, a.checkin_way, + a.sign_in_time, a.sign_out_time, a.attendance_status, a.manual_flag, + a.create_by, a.create_time, a.update_by, a.update_time, a.remark + from train_student_checkin a + join train_enrollment e on e.enrollment_id = a.enrollment_id + join train_lesson l on l.lesson_id = a.lesson_id + join train_plan_course pc on pc.plan_course_id = l.plan_course_id + left join train_class_plan p on p.plan_id = e.plan_id + left join train_student s on s.s_id = e.student_id + left join train_course c on c.c_id = pc.c_id + left join train_electronic_board b on b.board_id = a.board_id - - - - - insert into train_student_checkin - - plan_id, - c_id, - student_id, - board_id, - checkin_way, - checkin_time, - checkin_status, - lesson_start_time, - lesson_end_time, - - - #{planId}, - #{cId}, - #{studentId}, - #{boardId}, - #{checkinWay}, - #{checkinTime}, - #{checkinStatus}, - #{lessonStartTime}, - #{lessonEndTime}, - - - - - update train_student_checkin - - plan_id = #{planId}, - c_id = #{cId}, - student_id = #{studentId}, - board_id = #{boardId}, - checkin_way = #{checkinWay}, - checkin_time = #{checkinTime}, - checkin_status = #{checkinStatus}, - lesson_start_time = #{lessonStartTime}, - lesson_end_time = #{lessonEndTime}, - - where checkin_id = #{checkinId} - - - - delete from train_student_checkin where checkin_id = #{checkinId} - - - - delete from train_student_checkin where checkin_id in - - #{checkinId} - - - \ No newline at end of file + diff --git a/RuoYi-Vue/ruoyi-train/src/main/resources/mapper/train/TrainStudentPortraitMapper.xml b/RuoYi-Vue/ruoyi-train/src/main/resources/mapper/train/TrainStudentPortraitMapper.xml index 36eb16ba4..eb97dd92d 100644 --- a/RuoYi-Vue/ruoyi-train/src/main/resources/mapper/train/TrainStudentPortraitMapper.xml +++ b/RuoYi-Vue/ruoyi-train/src/main/resources/mapper/train/TrainStudentPortraitMapper.xml @@ -1,90 +1,50 @@ - + - - - - - - - - - - + + + + + + + + + + + + + + + + + + - - select portrait_id, student_id, plan_id, total_study_hour, avg_score, checkin_rate, label_tag, portrait_content, update_time from train_student_portrait + select pt.portrait_id, pt.enrollment_id, e.plan_id, p.plan_name, + e.student_id, s.s_name as student_name, pt.attendance_rate, + pt.theory_score, pt.practical_score, pt.total_study_hour, + pt.label_tag, pt.portrait_content, pt.generated_time, + pt.create_by, pt.create_time, pt.update_by, pt.update_time, pt.remark + from train_student_portrait pt + join train_enrollment e on e.enrollment_id = pt.enrollment_id + left join train_class_plan p on p.plan_id = e.plan_id + left join train_student s on s.s_id = e.student_id - - - - - insert into train_student_portrait - - student_id, - plan_id, - total_study_hour, - avg_score, - checkin_rate, - label_tag, - portrait_content, - update_time, - - - #{studentId}, - #{planId}, - #{totalStudyHour}, - #{avgScore}, - #{checkinRate}, - #{labelTag}, - #{portraitContent}, - #{updateTime}, - - - - - update train_student_portrait - - student_id = #{studentId}, - plan_id = #{planId}, - total_study_hour = #{totalStudyHour}, - avg_score = #{avgScore}, - checkin_rate = #{checkinRate}, - label_tag = #{labelTag}, - portrait_content = #{portraitContent}, - update_time = #{updateTime}, - - where portrait_id = #{portraitId} - - - - delete from train_student_portrait where portrait_id = #{portraitId} - - - - delete from train_student_portrait where portrait_id in - - #{portraitId} - - - \ No newline at end of file + diff --git a/RuoYi-Vue/ruoyi-train/src/main/resources/mapper/train/TrainStudyDurationMapper.xml b/RuoYi-Vue/ruoyi-train/src/main/resources/mapper/train/TrainStudyDurationMapper.xml index 2dd116dff..fac790a85 100644 --- a/RuoYi-Vue/ruoyi-train/src/main/resources/mapper/train/TrainStudyDurationMapper.xml +++ b/RuoYi-Vue/ruoyi-train/src/main/resources/mapper/train/TrainStudyDurationMapper.xml @@ -1,91 +1,59 @@ - + - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + - - select dur_id, student_id, plan_id, c_id, device_type, start_time, end_time, study_seconds, sync_time from train_study_duration + select d.dur_id, d.enrollment_id, d.plan_course_id, e.plan_id, p.plan_name, + e.student_id, s.s_name as student_name, c.c_name as course_name, + d.resource_id, r.resource_name, d.learning_content, d.source_system, + d.source_event_id, d.start_time, d.end_time, d.study_seconds, + d.sync_time, d.create_by, d.create_time, d.remark + from train_study_duration d + join train_enrollment e on e.enrollment_id = d.enrollment_id + left join train_class_plan p on p.plan_id = e.plan_id + left join train_student s on s.s_id = e.student_id + left join train_plan_course pc on pc.plan_course_id = d.plan_course_id + left join train_course c on c.c_id = pc.c_id + left join train_resource r on r.resource_id = d.resource_id - - - - - insert into train_study_duration - - student_id, - plan_id, - c_id, - device_type, - start_time, - end_time, - study_seconds, - sync_time, - - - #{studentId}, - #{planId}, - #{cId}, - #{deviceType}, - #{startTime}, - #{endTime}, - #{studySeconds}, - #{syncTime}, - - - - - update train_study_duration - - student_id = #{studentId}, - plan_id = #{planId}, - c_id = #{cId}, - device_type = #{deviceType}, - start_time = #{startTime}, - end_time = #{endTime}, - study_seconds = #{studySeconds}, - sync_time = #{syncTime}, - - where dur_id = #{durId} - - - - delete from train_study_duration where dur_id = #{durId} - - - - delete from train_study_duration where dur_id in - - #{durId} - - - \ No newline at end of file + diff --git a/RuoYi-Vue/ruoyi-train/src/test/java/com/ruoyi/train/mapper/LegacyAnalyticsV2MapperContractTest.java b/RuoYi-Vue/ruoyi-train/src/test/java/com/ruoyi/train/mapper/LegacyAnalyticsV2MapperContractTest.java new file mode 100644 index 000000000..d1ae43103 --- /dev/null +++ b/RuoYi-Vue/ruoyi-train/src/test/java/com/ruoyi/train/mapper/LegacyAnalyticsV2MapperContractTest.java @@ -0,0 +1,71 @@ +package com.ruoyi.train.mapper; + +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; + +import java.io.InputStream; +import java.io.ByteArrayOutputStream; +import java.nio.charset.StandardCharsets; +import org.junit.Test; + +/** Static contract guard: analytics mappers may only query the V2 model. */ +public class LegacyAnalyticsV2MapperContractTest +{ + @Test + public void reportMapperUsesEnrollmentAndVerificationResult() throws Exception + { + String xml = mapper("TrainClassReportMapper.xml"); + assertContains(xml, "r.enrollment_id", "r.verify_result", "train_enrollment"); + assertOmits(xml, "report_status", "alloc_dorm_id", "alloc_classroom_id", "alloc_site_id"); + } + + @Test + public void checkinMapperUsesLessonAttendanceModel() throws Exception + { + String xml = mapper("TrainStudentCheckinMapper.xml"); + assertContains(xml, "a.enrollment_id", "a.lesson_id", "a.sign_in_time", "a.attendance_status"); + assertOmits(xml, "checkin_time", "checkin_status", "lesson_start_time", "lesson_end_time"); + } + + @Test + public void durationMapperUsesSourceEventModel() throws Exception + { + String xml = mapper("TrainStudyDurationMapper.xml"); + assertContains(xml, "d.enrollment_id", "d.plan_course_id", "d.source_system", "d.source_event_id"); + assertOmits(xml, "device_type"); + } + + @Test + public void portraitMapperUsesGeneratedMetricsModel() throws Exception + { + String xml = mapper("TrainStudentPortraitMapper.xml"); + assertContains(xml, "pt.enrollment_id", "pt.attendance_rate", "pt.theory_score", "pt.practical_score", "pt.generated_time"); + assertOmits(xml, "avg_score", "checkin_rate"); + } + + private String mapper(String name) throws Exception + { + try (InputStream input = getClass().getResourceAsStream("/mapper/train/" + name)) + { + assertTrue("missing mapper " + name, input != null); + ByteArrayOutputStream output = new ByteArrayOutputStream(); + byte[] buffer = new byte[1024]; + int length; + while ((length = input.read(buffer)) != -1) + { + output.write(buffer, 0, length); + } + return new String(output.toByteArray(), StandardCharsets.UTF_8); + } + } + + private void assertContains(String value, String... tokens) + { + for (String token : tokens) assertTrue("missing V2 token: " + token, value.contains(token)); + } + + private void assertOmits(String value, String... tokens) + { + for (String token : tokens) assertFalse("legacy token remains: " + token, value.contains(token)); + } +} diff --git a/RuoYi-Vue/ruoyi-train/src/test/java/com/ruoyi/train/service/impl/LegacyAnalyticsV2ServiceTest.java b/RuoYi-Vue/ruoyi-train/src/test/java/com/ruoyi/train/service/impl/LegacyAnalyticsV2ServiceTest.java new file mode 100644 index 000000000..dd759b5e0 --- /dev/null +++ b/RuoYi-Vue/ruoyi-train/src/test/java/com/ruoyi/train/service/impl/LegacyAnalyticsV2ServiceTest.java @@ -0,0 +1,101 @@ +package com.ruoyi.train.service.impl; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertSame; + +import java.lang.reflect.Field; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; +import org.junit.Test; +import com.ruoyi.train.domain.TrainClassReport; +import com.ruoyi.train.domain.TrainStudentCheckin; +import com.ruoyi.train.domain.TrainStudentPortrait; +import com.ruoyi.train.domain.TrainStudyDuration; +import com.ruoyi.train.mapper.TrainClassReportMapper; +import com.ruoyi.train.mapper.TrainStudentCheckinMapper; +import com.ruoyi.train.mapper.TrainStudentPortraitMapper; +import com.ruoyi.train.mapper.TrainStudyDurationMapper; + +/** Empty and populated read paths for the four reconciled analytics services. */ +public class LegacyAnalyticsV2ServiceTest +{ + @Test + public void reportReadPathHandlesEmptyAndPopulatedResults() throws Exception + { + TrainClassReport row = new TrainClassReport(); + TrainClassReportServiceImpl service = new TrainClassReportServiceImpl(); + inject(service, "trainClassReportMapper", new TrainClassReportMapper() { + public TrainClassReport selectTrainClassReportByReportId(Long id) { return row; } + public List selectTrainClassReportList(TrainClassReport query) { + return query.getEnrollmentId() == null ? Collections.emptyList() : Arrays.asList(row); + } + }); + assertEquals(0, service.selectTrainClassReportList(new TrainClassReport()).size()); + TrainClassReport query = new TrainClassReport(); + query.setEnrollmentId(1L); + assertEquals(1, service.selectTrainClassReportList(query).size()); + assertSame(row, service.selectTrainClassReportByReportId(1L)); + } + + @Test + public void checkinReadPathHandlesEmptyAndPopulatedResults() throws Exception + { + TrainStudentCheckin row = new TrainStudentCheckin(); + TrainStudentCheckinServiceImpl service = new TrainStudentCheckinServiceImpl(); + inject(service, "trainStudentCheckinMapper", new TrainStudentCheckinMapper() { + public TrainStudentCheckin selectTrainStudentCheckinByCheckinId(Long id) { return row; } + public List selectTrainStudentCheckinList(TrainStudentCheckin query) { + return query.getLessonId() == null ? Collections.emptyList() : Arrays.asList(row); + } + }); + assertEquals(0, service.selectTrainStudentCheckinList(new TrainStudentCheckin()).size()); + TrainStudentCheckin query = new TrainStudentCheckin(); + query.setLessonId(1L); + assertEquals(1, service.selectTrainStudentCheckinList(query).size()); + assertSame(row, service.selectTrainStudentCheckinByCheckinId(1L)); + } + + @Test + public void durationReadPathHandlesEmptyAndPopulatedResults() throws Exception + { + TrainStudyDuration row = new TrainStudyDuration(); + TrainStudyDurationServiceImpl service = new TrainStudyDurationServiceImpl(); + inject(service, "trainStudyDurationMapper", new TrainStudyDurationMapper() { + public TrainStudyDuration selectTrainStudyDurationByDurId(Long id) { return row; } + public List selectTrainStudyDurationList(TrainStudyDuration query) { + return query.getEnrollmentId() == null ? Collections.emptyList() : Arrays.asList(row); + } + }); + assertEquals(0, service.selectTrainStudyDurationList(new TrainStudyDuration()).size()); + TrainStudyDuration query = new TrainStudyDuration(); + query.setEnrollmentId(1L); + assertEquals(1, service.selectTrainStudyDurationList(query).size()); + assertSame(row, service.selectTrainStudyDurationByDurId(1L)); + } + + @Test + public void portraitReadPathHandlesEmptyAndPopulatedResults() throws Exception + { + TrainStudentPortrait row = new TrainStudentPortrait(); + TrainStudentPortraitServiceImpl service = new TrainStudentPortraitServiceImpl(); + inject(service, "trainStudentPortraitMapper", new TrainStudentPortraitMapper() { + public TrainStudentPortrait selectTrainStudentPortraitByPortraitId(Long id) { return row; } + public List selectTrainStudentPortraitList(TrainStudentPortrait query) { + return query.getEnrollmentId() == null ? Collections.emptyList() : Arrays.asList(row); + } + }); + assertEquals(0, service.selectTrainStudentPortraitList(new TrainStudentPortrait()).size()); + TrainStudentPortrait query = new TrainStudentPortrait(); + query.setEnrollmentId(1L); + assertEquals(1, service.selectTrainStudentPortraitList(query).size()); + assertSame(row, service.selectTrainStudentPortraitByPortraitId(1L)); + } + + private static void inject(Object target, String name, Object value) throws Exception + { + Field field = target.getClass().getDeclaredField(name); + field.setAccessible(true); + field.set(target, value); + } +} diff --git a/RuoYi-Vue/sql/system/kingbase/002_legacy_analytics_permissions.sql b/RuoYi-Vue/sql/system/kingbase/002_legacy_analytics_permissions.sql new file mode 100644 index 000000000..49fa6ad74 --- /dev/null +++ b/RuoYi-Vue/sql/system/kingbase/002_legacy_analytics_permissions.sql @@ -0,0 +1,108 @@ +-- ============================================================================= +-- Current Release Delta: Legacy Analytics menu/RBAC permission closure +-- Target: KingbaseES, schema public +-- Scope: menu data only; this is not a system schema migration. +-- +-- ID allocation evidence at authoring time: +-- public.sys_menu.menu_id is BIGINT NOT NULL with no default/identity; +-- live MAX(menu_id) = 2176; therefore 2177..2180 are reserved below. +-- The transaction fails unless the four page menu IDs still identify the +-- expected components and every required permission is unique after execution. +-- Existing role assignments are intentionally left unchanged. +-- ============================================================================= + +BEGIN; + +DO $$ +BEGIN + IF NOT EXISTS (SELECT 1 FROM public.sys_menu WHERE menu_id = 2170 AND component = 'train/report' AND menu_type = 'C') THEN + RAISE EXCEPTION 'Expected Report page menu 2170 was not found'; + END IF; + IF NOT EXISTS (SELECT 1 FROM public.sys_menu WHERE menu_id = 2171 AND component = 'train/checkin' AND menu_type = 'C') THEN + RAISE EXCEPTION 'Expected Checkin page menu 2171 was not found'; + END IF; + IF NOT EXISTS (SELECT 1 FROM public.sys_menu WHERE menu_id = 2172 AND component = 'train/duration' AND menu_type = 'C') THEN + RAISE EXCEPTION 'Expected Duration page menu 2172 was not found'; + END IF; + IF NOT EXISTS (SELECT 1 FROM public.sys_menu WHERE menu_id = 2173 AND component = 'train/portrait' AND menu_type = 'C') THEN + RAISE EXCEPTION 'Expected Portrait page menu 2173 was not found'; + END IF; + + IF EXISTS ( + SELECT 1 FROM public.sys_role_menu rm + WHERE rm.menu_id IN (2177, 2178, 2179, 2180) + AND NOT EXISTS (SELECT 1 FROM public.sys_menu m WHERE m.menu_id = rm.menu_id) + ) THEN + RAISE EXCEPTION 'Reserved export menu ID has an orphan role assignment'; + END IF; + + IF EXISTS (SELECT 1 FROM public.sys_menu WHERE menu_id = 2177 AND NOT (parent_id = 2170 AND menu_type = 'F' AND perms = 'train:report:export')) + OR EXISTS (SELECT 1 FROM public.sys_menu WHERE menu_id = 2178 AND NOT (parent_id = 2171 AND menu_type = 'F' AND perms = 'train:attendance:export')) + OR EXISTS (SELECT 1 FROM public.sys_menu WHERE menu_id = 2179 AND NOT (parent_id = 2172 AND menu_type = 'F' AND perms = 'train:learning:export')) + OR EXISTS (SELECT 1 FROM public.sys_menu WHERE menu_id = 2180 AND NOT (parent_id = 2173 AND menu_type = 'F' AND perms = 'train:portrait:export')) THEN + RAISE EXCEPTION 'Reserved export menu ID collides with an unrelated menu'; + END IF; +END $$; + +UPDATE public.sys_menu SET perms = 'train:report:list', update_by = 'admin', update_time = CURRENT_TIMESTAMP +WHERE menu_id = 2170 AND component = 'train/report' AND menu_type = 'C' + AND perms IS DISTINCT FROM 'train:report:list'; + +UPDATE public.sys_menu SET perms = 'train:attendance:list', update_by = 'admin', update_time = CURRENT_TIMESTAMP +WHERE menu_id = 2171 AND component = 'train/checkin' AND menu_type = 'C' + AND perms IS DISTINCT FROM 'train:attendance:list'; + +UPDATE public.sys_menu SET perms = 'train:learning:list', update_by = 'admin', update_time = CURRENT_TIMESTAMP +WHERE menu_id = 2172 AND component = 'train/duration' AND menu_type = 'C' + AND perms IS DISTINCT FROM 'train:learning:list'; + +UPDATE public.sys_menu SET perms = 'train:portrait:query', update_by = 'admin', update_time = CURRENT_TIMESTAMP +WHERE menu_id = 2173 AND component = 'train/portrait' AND menu_type = 'C' + AND perms IS DISTINCT FROM 'train:portrait:query'; + +INSERT INTO public.sys_menu + (menu_id, menu_name, parent_id, order_num, path, component, query, is_frame, is_cache, + menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark) +SELECT 2177, '开班签到导出', 2170, 1, '#', '', '', 1, 0, + 'F', '0', '0', 'train:report:export', '#', 'admin', CURRENT_TIMESTAMP, '', NULL, 'Legacy Analytics V2导出权限' +WHERE NOT EXISTS (SELECT 1 FROM public.sys_menu WHERE perms = 'train:report:export'); + +INSERT INTO public.sys_menu + (menu_id, menu_name, parent_id, order_num, path, component, query, is_frame, is_cache, + menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark) +SELECT 2178, '课程签到导出', 2171, 1, '#', '', '', 1, 0, + 'F', '0', '0', 'train:attendance:export', '#', 'admin', CURRENT_TIMESTAMP, '', NULL, 'Legacy Analytics V2导出权限' +WHERE NOT EXISTS (SELECT 1 FROM public.sys_menu WHERE perms = 'train:attendance:export'); + +INSERT INTO public.sys_menu + (menu_id, menu_name, parent_id, order_num, path, component, query, is_frame, is_cache, + menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark) +SELECT 2179, '学习时长导出', 2172, 1, '#', '', '', 1, 0, + 'F', '0', '0', 'train:learning:export', '#', 'admin', CURRENT_TIMESTAMP, '', NULL, 'Legacy Analytics V2导出权限' +WHERE NOT EXISTS (SELECT 1 FROM public.sys_menu WHERE perms = 'train:learning:export'); + +INSERT INTO public.sys_menu + (menu_id, menu_name, parent_id, order_num, path, component, query, is_frame, is_cache, + menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark) +SELECT 2180, '学员画像导出', 2173, 1, '#', '', '', 1, 0, + 'F', '0', '0', 'train:portrait:export', '#', 'admin', CURRENT_TIMESTAMP, '', NULL, 'Legacy Analytics V2导出权限' +WHERE NOT EXISTS (SELECT 1 FROM public.sys_menu WHERE perms = 'train:portrait:export'); + +DO $$ +BEGIN + IF (SELECT count(*) FROM public.sys_menu WHERE menu_id = 2170 AND perms = 'train:report:list') <> 1 + OR (SELECT count(*) FROM public.sys_menu WHERE menu_id = 2171 AND perms = 'train:attendance:list') <> 1 + OR (SELECT count(*) FROM public.sys_menu WHERE menu_id = 2172 AND perms = 'train:learning:list') <> 1 + OR (SELECT count(*) FROM public.sys_menu WHERE menu_id = 2173 AND perms = 'train:portrait:query') <> 1 THEN + RAISE EXCEPTION 'Legacy Analytics page permission update verification failed'; + END IF; + + IF (SELECT count(*) FROM public.sys_menu WHERE perms = 'train:report:export' AND parent_id = 2170 AND menu_type = 'F') <> 1 + OR (SELECT count(*) FROM public.sys_menu WHERE perms = 'train:attendance:export' AND parent_id = 2171 AND menu_type = 'F') <> 1 + OR (SELECT count(*) FROM public.sys_menu WHERE perms = 'train:learning:export' AND parent_id = 2172 AND menu_type = 'F') <> 1 + OR (SELECT count(*) FROM public.sys_menu WHERE perms = 'train:portrait:export' AND parent_id = 2173 AND menu_type = 'F') <> 1 THEN + RAISE EXCEPTION 'Legacy Analytics export permission verification failed or permission is not unique'; + END IF; +END $$; + +COMMIT; diff --git a/build_ui/src/api/train/checkin.js b/build_ui/src/api/train/checkin.js index 79db7fd63..c5c0dba6e 100644 --- a/build_ui/src/api/train/checkin.js +++ b/build_ui/src/api/train/checkin.js @@ -1,6 +1,5 @@ import request from '@/utils/request' -// 查询学生签到列表 export function listCheckin(query) { return request({ url: '/train/checkin/list', @@ -9,36 +8,9 @@ export function listCheckin(query) { }) } -// 查询学生签到详细 export function getCheckin(checkinId) { return request({ url: '/train/checkin/' + checkinId, method: 'get' }) } - -// 新增学生签到 -export function addCheckin(data) { - return request({ - url: '/train/checkin', - method: 'post', - data: data - }) -} - -// 修改学生签到 -export function updateCheckin(data) { - return request({ - url: '/train/checkin', - method: 'put', - data: data - }) -} - -// 删除学生签到 -export function delCheckin(checkinId) { - return request({ - url: '/train/checkin/' + checkinId, - method: 'delete' - }) -} diff --git a/build_ui/src/api/train/duration.js b/build_ui/src/api/train/duration.js index 42fb77883..1c2071882 100644 --- a/build_ui/src/api/train/duration.js +++ b/build_ui/src/api/train/duration.js @@ -1,6 +1,5 @@ import request from '@/utils/request' -// 查询学习时长统计列表 export function listDuration(query) { return request({ url: '/train/duration/list', @@ -9,36 +8,9 @@ export function listDuration(query) { }) } -// 查询学习时长统计详细 export function getDuration(durId) { return request({ url: '/train/duration/' + durId, method: 'get' }) } - -// 新增学习时长统计 -export function addDuration(data) { - return request({ - url: '/train/duration', - method: 'post', - data: data - }) -} - -// 修改学习时长统计 -export function updateDuration(data) { - return request({ - url: '/train/duration', - method: 'put', - data: data - }) -} - -// 删除学习时长统计 -export function delDuration(durId) { - return request({ - url: '/train/duration/' + durId, - method: 'delete' - }) -} diff --git a/build_ui/src/api/train/portrait.js b/build_ui/src/api/train/portrait.js index d901ebe89..849979d51 100644 --- a/build_ui/src/api/train/portrait.js +++ b/build_ui/src/api/train/portrait.js @@ -1,6 +1,5 @@ import request from '@/utils/request' -// 查询学员画像列表 export function listPortrait(query) { return request({ url: '/train/portrait/list', @@ -9,36 +8,9 @@ export function listPortrait(query) { }) } -// 查询学员画像详细 export function getPortrait(portraitId) { return request({ url: '/train/portrait/' + portraitId, method: 'get' }) } - -// 新增学员画像 -export function addPortrait(data) { - return request({ - url: '/train/portrait', - method: 'post', - data: data - }) -} - -// 修改学员画像 -export function updatePortrait(data) { - return request({ - url: '/train/portrait', - method: 'put', - data: data - }) -} - -// 删除学员画像 -export function delPortrait(portraitId) { - return request({ - url: '/train/portrait/' + portraitId, - method: 'delete' - }) -} diff --git a/build_ui/src/api/train/report.js b/build_ui/src/api/train/report.js index 1362af110..01cb5b966 100644 --- a/build_ui/src/api/train/report.js +++ b/build_ui/src/api/train/report.js @@ -1,6 +1,5 @@ import request from '@/utils/request' -// 查询开班报到列表 export function listReport(query) { return request({ url: '/train/report/list', @@ -9,36 +8,9 @@ export function listReport(query) { }) } -// 查询开班报到详细 export function getReport(reportId) { return request({ url: '/train/report/' + reportId, method: 'get' }) } - -// 新增开班报到 -export function addReport(data) { - return request({ - url: '/train/report', - method: 'post', - data: data - }) -} - -// 修改开班报到 -export function updateReport(data) { - return request({ - url: '/train/report', - method: 'put', - data: data - }) -} - -// 删除开班报到 -export function delReport(reportId) { - return request({ - url: '/train/report/' + reportId, - method: 'delete' - }) -} diff --git a/build_ui/src/views/train/checkin/index.vue b/build_ui/src/views/train/checkin/index.vue index e3a69ca06..8853a7c95 100644 --- a/build_ui/src/views/train/checkin/index.vue +++ b/build_ui/src/views/train/checkin/index.vue @@ -1,381 +1,107 @@