Kaynağa Gözat

组织人员管理迁移

jincheng 3 hafta önce
ebeveyn
işleme
69630529fc
28 değiştirilmiş dosya ile 1661 ekleme ve 0 silme
  1. 5 0
      ship-module-ota/ship-module-ota-api/src/main/java/com/yc/ship/module/ota/enums/ErrorCodeConstants.java
  2. 94 0
      ship-module-ota/ship-module-ota-biz/src/main/java/com/yc/ship/module/ota/controller/admin/trainingcertificate/TrainingCertificateController.java
  3. 55 0
      ship-module-ota/ship-module-ota-biz/src/main/java/com/yc/ship/module/ota/controller/admin/trainingcertificate/vo/TrainingCertificatePageReqVO.java
  4. 74 0
      ship-module-ota/ship-module-ota-biz/src/main/java/com/yc/ship/module/ota/controller/admin/trainingcertificate/vo/TrainingCertificateRespVO.java
  5. 57 0
      ship-module-ota/ship-module-ota-biz/src/main/java/com/yc/ship/module/ota/controller/admin/trainingcertificate/vo/TrainingCertificateSaveReqVO.java
  6. 105 0
      ship-module-ota/ship-module-ota-biz/src/main/java/com/yc/ship/module/ota/controller/admin/trainingplan/TrainingPlanController.java
  7. 57 0
      ship-module-ota/ship-module-ota-biz/src/main/java/com/yc/ship/module/ota/controller/admin/trainingplan/vo/TrainingPlanPageReqVO.java
  8. 63 0
      ship-module-ota/ship-module-ota-biz/src/main/java/com/yc/ship/module/ota/controller/admin/trainingplan/vo/TrainingPlanRespVO.java
  9. 57 0
      ship-module-ota/ship-module-ota-biz/src/main/java/com/yc/ship/module/ota/controller/admin/trainingplan/vo/TrainingPlanSaveReqVO.java
  10. 93 0
      ship-module-ota/ship-module-ota-biz/src/main/java/com/yc/ship/module/ota/controller/admin/trainingscore/TrainingScoreController.java
  11. 63 0
      ship-module-ota/ship-module-ota-biz/src/main/java/com/yc/ship/module/ota/controller/admin/trainingscore/vo/TrainingScorePageReqVO.java
  12. 72 0
      ship-module-ota/ship-module-ota-biz/src/main/java/com/yc/ship/module/ota/controller/admin/trainingscore/vo/TrainingScoreRespVO.java
  13. 54 0
      ship-module-ota/ship-module-ota-biz/src/main/java/com/yc/ship/module/ota/controller/admin/trainingscore/vo/TrainingScoreSaveReqVO.java
  14. 80 0
      ship-module-ota/ship-module-ota-biz/src/main/java/com/yc/ship/module/ota/dal/dataobject/trainingcertificate/TrainingCertificateDO.java
  15. 72 0
      ship-module-ota/ship-module-ota-biz/src/main/java/com/yc/ship/module/ota/dal/dataobject/trainingplan/TrainingPlanDO.java
  16. 81 0
      ship-module-ota/ship-module-ota-biz/src/main/java/com/yc/ship/module/ota/dal/dataobject/trainingscore/TrainingScoreDO.java
  17. 33 0
      ship-module-ota/ship-module-ota-biz/src/main/java/com/yc/ship/module/ota/dal/mysql/trainingcertificate/TrainingCertificateMapper.java
  18. 33 0
      ship-module-ota/ship-module-ota-biz/src/main/java/com/yc/ship/module/ota/dal/mysql/trainingplan/TrainingPlanMapper.java
  19. 45 0
      ship-module-ota/ship-module-ota-biz/src/main/java/com/yc/ship/module/ota/dal/mysql/trainingscore/TrainingScoreMapper.java
  20. 57 0
      ship-module-ota/ship-module-ota-biz/src/main/java/com/yc/ship/module/ota/service/trainingcertificate/TrainingCertificateService.java
  21. 71 0
      ship-module-ota/ship-module-ota-biz/src/main/java/com/yc/ship/module/ota/service/trainingcertificate/TrainingCertificateServiceImpl.java
  22. 68 0
      ship-module-ota/ship-module-ota-biz/src/main/java/com/yc/ship/module/ota/service/trainingplan/TrainingPlanService.java
  23. 113 0
      ship-module-ota/ship-module-ota-biz/src/main/java/com/yc/ship/module/ota/service/trainingplan/TrainingPlanServiceImpl.java
  24. 54 0
      ship-module-ota/ship-module-ota-biz/src/main/java/com/yc/ship/module/ota/service/trainingscore/TrainingScoreService.java
  25. 69 0
      ship-module-ota/ship-module-ota-biz/src/main/java/com/yc/ship/module/ota/service/trainingscore/TrainingScoreServiceImpl.java
  26. 12 0
      ship-module-ota/ship-module-ota-biz/src/main/resources/mapper/trainingcertificate/TrainingCertificateMapper.xml
  27. 12 0
      ship-module-ota/ship-module-ota-biz/src/main/resources/mapper/trainingplan/TrainingPlanMapper.xml
  28. 12 0
      ship-module-ota/ship-module-ota-biz/src/main/resources/mapper/trainingscore/TrainingScoreMapper.xml

+ 5 - 0
ship-module-ota/ship-module-ota-api/src/main/java/com/yc/ship/module/ota/enums/ErrorCodeConstants.java

@@ -48,4 +48,9 @@ public interface ErrorCodeConstants {
     ErrorCode APPLY_MARKETING_NOT_FAIL = new ErrorCode(50_107, "申请政策失败");
     ErrorCode ORDER_PAY_AUTO_REFUND = new ErrorCode(30_046, "当前订单已不能支付");
 
+    // ========== 培训模块 ==========
+    ErrorCode TRAINING_PLAN_NOT_EXISTS = new ErrorCode(11_028, "培训计划不存在");
+    ErrorCode TRAINING_SCORE_NOT_EXISTS = new ErrorCode(11_029, "培训记录-人员关联表(成绩表)不存在");
+    ErrorCode TRAINING_CERTIFICATE_NOT_EXISTS = new ErrorCode(11_030, "培训证书不存在");
+
 }

+ 94 - 0
ship-module-ota/ship-module-ota-biz/src/main/java/com/yc/ship/module/ota/controller/admin/trainingcertificate/TrainingCertificateController.java

@@ -0,0 +1,94 @@
+package com.yc.ship.module.ota.controller.admin.trainingcertificate;
+
+import com.yc.ship.framework.apilog.core.annotation.ApiAccessLog;
+import com.yc.ship.framework.common.pojo.CommonResult;
+import com.yc.ship.framework.common.pojo.PageParam;
+import com.yc.ship.framework.common.pojo.PageResult;
+import com.yc.ship.framework.common.util.object.BeanUtils;
+import com.yc.ship.framework.excel.core.util.ExcelUtils;
+import com.yc.ship.module.ota.controller.admin.trainingcertificate.vo.TrainingCertificatePageReqVO;
+import com.yc.ship.module.ota.controller.admin.trainingcertificate.vo.TrainingCertificateRespVO;
+import com.yc.ship.module.ota.controller.admin.trainingcertificate.vo.TrainingCertificateSaveReqVO;
+import com.yc.ship.module.ota.dal.dataobject.trainingcertificate.TrainingCertificateDO;
+import com.yc.ship.module.ota.service.trainingcertificate.TrainingCertificateService;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.Parameter;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletResponse;
+import javax.validation.Valid;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import java.io.IOException;
+import java.util.List;
+
+import static com.yc.ship.framework.apilog.core.enums.OperateTypeEnum.EXPORT;
+import static com.yc.ship.framework.common.pojo.CommonResult.success;
+
+
+@Tag(name = "管理后台 - 培训证书")
+@RestController
+@RequestMapping("/training/certificate")
+@Validated
+public class TrainingCertificateController {
+
+    @Resource
+    private TrainingCertificateService certificateService;
+
+    @PostMapping("/create")
+    @Operation(summary = "创建培训证书")
+    @PreAuthorize("@ss.hasPermission('training:certificate:create')")
+    public CommonResult<Long> createCertificate(@Valid @RequestBody TrainingCertificateSaveReqVO createReqVO) {
+        return success(certificateService.createCertificate(createReqVO));
+    }
+
+    @PutMapping("/update")
+    @Operation(summary = "更新培训证书")
+    @PreAuthorize("@ss.hasPermission('training:certificate:update')")
+    public CommonResult<Boolean> updateCertificate(@Valid @RequestBody TrainingCertificateSaveReqVO updateReqVO) {
+        certificateService.updateCertificate(updateReqVO);
+        return success(true);
+    }
+
+    @DeleteMapping("/delete")
+    @Operation(summary = "删除培训证书")
+    @Parameter(name = "id", description = "编号", required = true)
+    @PreAuthorize("@ss.hasPermission('training:certificate:delete')")
+    public CommonResult<Boolean> deleteCertificate(@RequestParam("id") Long id) {
+        certificateService.deleteCertificate(id);
+        return success(true);
+    }
+
+    @GetMapping("/get")
+    @Operation(summary = "获得培训证书")
+    @Parameter(name = "id", description = "编号", required = true, example = "1024")
+    @PreAuthorize("@ss.hasPermission('training:certificate:query')")
+    public CommonResult<TrainingCertificateRespVO> getCertificate(@RequestParam("id") Long id) {
+        TrainingCertificateDO certificate = certificateService.getCertificate(id);
+        return success(BeanUtils.toBean(certificate, TrainingCertificateRespVO.class));
+    }
+
+    @GetMapping("/page")
+    @Operation(summary = "获得培训证书分页")
+    @PreAuthorize("@ss.hasPermission('training:certificate:query')")
+    public CommonResult<PageResult<TrainingCertificateRespVO>> getCertificatePage(@Valid TrainingCertificatePageReqVO pageReqVO) {
+        PageResult<TrainingCertificateDO> pageResult = certificateService.getCertificatePage(pageReqVO);
+        return success(BeanUtils.toBean(pageResult, TrainingCertificateRespVO.class));
+    }
+
+    @GetMapping("/export-excel")
+    @Operation(summary = "导出培训证书 Excel")
+    @PreAuthorize("@ss.hasPermission('training:certificate:export')")
+    @ApiAccessLog(operateType = EXPORT)
+    public void exportCertificateExcel(@Valid TrainingCertificatePageReqVO pageReqVO,
+              HttpServletResponse response) throws IOException {
+        pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
+        List<TrainingCertificateDO> list = certificateService.getCertificatePage(pageReqVO).getList();
+        // 导出 Excel
+        ExcelUtils.write(response, "培训证书.xls", "数据", TrainingCertificateRespVO.class,
+                        BeanUtils.toBean(list, TrainingCertificateRespVO.class));
+    }
+
+}

+ 55 - 0
ship-module-ota/ship-module-ota-biz/src/main/java/com/yc/ship/module/ota/controller/admin/trainingcertificate/vo/TrainingCertificatePageReqVO.java

@@ -0,0 +1,55 @@
+package com.yc.ship.module.ota.controller.admin.trainingcertificate.vo;
+
+import com.yc.ship.framework.common.pojo.PageParam;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.ToString;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.time.LocalDateTime;
+
+import static com.yc.ship.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
+
+
+@Schema(description = "管理后台 - 培训证书分页 Request VO")
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+public class TrainingCertificatePageReqVO extends PageParam {
+
+    @Schema(description = "证书编号")
+    private String certNo;
+
+    @Schema(description = "持证人ID", example = "3352")
+    private Long userId;
+
+    @Schema(description = "持证人姓名", example = "芋艿")
+    private String userName;
+
+    @Schema(description = "证书名称", example = "李四")
+    private String name;
+
+    @Schema(description = "发放时间")
+    @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+    private LocalDateTime[] issueTime;
+
+    @Schema(description = "有效期开始时间")
+    @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+    private LocalDateTime[] validStartTime;
+
+    @Schema(description = "有效期结束时间")
+    @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+    private LocalDateTime[] validEndTime;
+
+    @Schema(description = "状态", example = "1")
+    private Integer status;
+
+    @Schema(description = "证书电子版ID", example = "17666")
+    private Long certFileId;
+
+    @Schema(description = "创建时间")
+    @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+    private LocalDateTime[] createTime;
+
+}

+ 74 - 0
ship-module-ota/ship-module-ota-biz/src/main/java/com/yc/ship/module/ota/controller/admin/trainingcertificate/vo/TrainingCertificateRespVO.java

@@ -0,0 +1,74 @@
+package com.yc.ship.module.ota.controller.admin.trainingcertificate.vo;
+
+import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.yc.ship.framework.excel.core.annotations.DictFormat;
+import com.yc.ship.framework.excel.core.convert.DictConvert;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.time.LocalDateTime;
+
+@Schema(description = "管理后台 - 培训证书 Response VO")
+@Data
+@ExcelIgnoreUnannotated
+public class TrainingCertificateRespVO {
+
+    @Schema(description = "主键ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "3457")
+    @ExcelProperty("主键ID")
+    private Long id;
+
+    @Schema(description = "证书编号", requiredMode = Schema.RequiredMode.REQUIRED)
+    @ExcelProperty("证书编号")
+    private String certNo;
+
+    @Schema(description = "持证人ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "3352")
+    @ExcelProperty("持证人ID")
+    private Long userId;
+
+    @Schema(description = "持证人姓名", example = "芋艿")
+    @ExcelProperty("持证人姓名")
+    private String userName;
+
+    @Schema(description = "关联培训记录ID", example = "9829")
+    @ExcelProperty("关联培训记录ID")
+    private Long recordId;
+
+    @Schema(description = "关联课程ID", example = "14307")
+    @ExcelProperty("关联课程ID")
+    private Long courseId;
+
+    @Schema(description = "证书名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "李四")
+    @ExcelProperty("证书名称")
+    private String name;
+
+    @Schema(description = "发放时间")
+    @ExcelProperty("发放时间")
+    private LocalDateTime issueTime;
+
+    @Schema(description = "有效期开始时间")
+    @ExcelProperty("有效期开始时间")
+    private LocalDateTime validStartTime;
+
+    @Schema(description = "有效期结束时间")
+    @ExcelProperty("有效期结束时间")
+    private LocalDateTime validEndTime;
+
+    @Schema(description = "状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
+    @ExcelProperty(value = "状态", converter = DictConvert.class)
+    @DictFormat("training_status") // TODO 代码优化:建议设置到对应的 DictTypeConstants 枚举类中
+    private Integer status;
+
+    @Schema(description = "证书电子版ID", example = "17666")
+    @ExcelProperty("证书电子版ID")
+    private Long certFileId;
+
+    @Schema(description = "备注", example = "你猜")
+    @ExcelProperty("备注")
+    private String remark;
+
+    @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
+    @ExcelProperty("创建时间")
+    private LocalDateTime createTime;
+
+}

+ 57 - 0
ship-module-ota/ship-module-ota-biz/src/main/java/com/yc/ship/module/ota/controller/admin/trainingcertificate/vo/TrainingCertificateSaveReqVO.java

@@ -0,0 +1,57 @@
+package com.yc.ship.module.ota.controller.admin.trainingcertificate.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import javax.validation.constraints.NotEmpty;
+import javax.validation.constraints.NotNull;
+import lombok.Data;
+
+import java.time.LocalDateTime;
+
+@Schema(description = "管理后台 - 培训证书新增/修改 Request VO")
+@Data
+public class TrainingCertificateSaveReqVO {
+
+    @Schema(description = "主键ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "3457")
+    private Long id;
+
+    @Schema(description = "证书编号", requiredMode = Schema.RequiredMode.REQUIRED)
+    @NotEmpty(message = "证书编号不能为空")
+    private String certNo;
+
+    @Schema(description = "持证人ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "3352")
+    @NotNull(message = "持证人ID不能为空")
+    private Long userId;
+
+    @Schema(description = "持证人姓名", example = "芋艿")
+    private String userName;
+
+    @Schema(description = "关联培训记录ID", example = "9829")
+    private Long recordId;
+
+    @Schema(description = "关联课程ID", example = "14307")
+    private Long courseId;
+
+    @Schema(description = "证书名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "李四")
+    @NotEmpty(message = "证书名称不能为空")
+    private String name;
+
+    @Schema(description = "发放时间")
+    private LocalDateTime issueTime;
+
+    @Schema(description = "有效期开始时间")
+    private LocalDateTime validStartTime;
+
+    @Schema(description = "有效期结束时间")
+    private LocalDateTime validEndTime;
+
+    @Schema(description = "状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
+    @NotNull(message = "状态不能为空")
+    private Integer status;
+
+    @Schema(description = "证书电子版ID", example = "17666")
+    private Long certFileId;
+
+    @Schema(description = "备注", example = "你猜")
+    private String remark;
+
+}

+ 105 - 0
ship-module-ota/ship-module-ota-biz/src/main/java/com/yc/ship/module/ota/controller/admin/trainingplan/TrainingPlanController.java

@@ -0,0 +1,105 @@
+package com.yc.ship.module.ota.controller.admin.trainingplan;
+
+import com.yc.ship.framework.apilog.core.annotation.ApiAccessLog;
+import com.yc.ship.framework.common.pojo.CommonResult;
+import com.yc.ship.framework.common.pojo.PageParam;
+import com.yc.ship.framework.common.pojo.PageResult;
+import com.yc.ship.framework.common.util.object.BeanUtils;
+import com.yc.ship.framework.excel.core.util.ExcelUtils;
+import com.yc.ship.module.ota.controller.admin.trainingplan.vo.TrainingPlanPageReqVO;
+import com.yc.ship.module.ota.controller.admin.trainingplan.vo.TrainingPlanRespVO;
+import com.yc.ship.module.ota.controller.admin.trainingplan.vo.TrainingPlanSaveReqVO;
+import com.yc.ship.module.ota.dal.dataobject.trainingplan.TrainingPlanDO;
+import com.yc.ship.module.ota.dal.dataobject.trainingscore.TrainingScoreDO;
+import com.yc.ship.module.ota.service.trainingplan.TrainingPlanService;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.Parameter;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletResponse;
+import javax.validation.Valid;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import java.io.IOException;
+import java.util.List;
+
+import static com.yc.ship.framework.apilog.core.enums.OperateTypeEnum.EXPORT;
+import static com.yc.ship.framework.common.pojo.CommonResult.success;
+
+
+@Tag(name = "管理后台 - 培训计划")
+@RestController
+@RequestMapping("/buss/training-plan")
+@Validated
+public class TrainingPlanController {
+
+    @Resource
+    private TrainingPlanService trainingPlanService;
+
+    @PostMapping("/create")
+    @Operation(summary = "创建培训计划")
+    @PreAuthorize("@ss.hasPermission('buss:training-plan:create')")
+    public CommonResult<Long> createTrainingPlan(@Valid @RequestBody TrainingPlanSaveReqVO createReqVO) {
+        return success(trainingPlanService.createTrainingPlan(createReqVO));
+    }
+
+    @PutMapping("/update")
+    @Operation(summary = "更新培训计划")
+    @PreAuthorize("@ss.hasPermission('buss:training-plan:update')")
+    public CommonResult<Boolean> updateTrainingPlan(@Valid @RequestBody TrainingPlanSaveReqVO updateReqVO) {
+        trainingPlanService.updateTrainingPlan(updateReqVO);
+        return success(true);
+    }
+
+    @DeleteMapping("/delete")
+    @Operation(summary = "删除培训计划")
+    @Parameter(name = "id", description = "编号", required = true)
+    @PreAuthorize("@ss.hasPermission('buss:training-plan:delete')")
+    public CommonResult<Boolean> deleteTrainingPlan(@RequestParam("id") Long id) {
+        trainingPlanService.deleteTrainingPlan(id);
+        return success(true);
+    }
+
+    @GetMapping("/get")
+    @Operation(summary = "获得培训计划")
+    @Parameter(name = "id", description = "编号", required = true, example = "1024")
+    @PreAuthorize("@ss.hasPermission('buss:training-plan:query')")
+    public CommonResult<TrainingPlanRespVO> getTrainingPlan(@RequestParam("id") Long id) {
+        TrainingPlanDO trainingPlan = trainingPlanService.getTrainingPlan(id);
+        return success(BeanUtils.toBean(trainingPlan, TrainingPlanRespVO.class));
+    }
+
+    @GetMapping("/page")
+    @Operation(summary = "获得培训计划分页")
+    @PreAuthorize("@ss.hasPermission('buss:training-plan:query')")
+    public CommonResult<PageResult<TrainingPlanRespVO>> getTrainingPlanPage(@Valid TrainingPlanPageReqVO pageReqVO) {
+        PageResult<TrainingPlanDO> pageResult = trainingPlanService.getTrainingPlanPage(pageReqVO);
+        return success(BeanUtils.toBean(pageResult, TrainingPlanRespVO.class));
+    }
+
+    @GetMapping("/export-excel")
+    @Operation(summary = "导出培训计划 Excel")
+    @PreAuthorize("@ss.hasPermission('buss:training-plan:export')")
+    @ApiAccessLog(operateType = EXPORT)
+    public void exportTrainingPlanExcel(@Valid TrainingPlanPageReqVO pageReqVO,
+              HttpServletResponse response) throws IOException {
+        pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
+        List<TrainingPlanDO> list = trainingPlanService.getTrainingPlanPage(pageReqVO).getList();
+        // 导出 Excel
+        ExcelUtils.write(response, "培训计划.xls", "数据", TrainingPlanRespVO.class,
+                        BeanUtils.toBean(list, TrainingPlanRespVO.class));
+    }
+
+    // ==================== 子表(培训记录-人员关联表(成绩表)) ====================
+
+    @GetMapping("/training-score/list-by-plan-id")
+    @Operation(summary = "获得培训记录-人员关联表(成绩表)列表")
+    @Parameter(name = "planId", description = "关联计划ID,一起培训计划的人数")
+    @PreAuthorize("@ss.hasPermission('buss:training-plan:query')")
+    public CommonResult<List<TrainingScoreDO>> getTrainingScoreListByPlanId(@RequestParam("planId") Long planId) {
+        return success(trainingPlanService.getTrainingScoreListByPlanId(planId));
+    }
+
+}

+ 57 - 0
ship-module-ota/ship-module-ota-biz/src/main/java/com/yc/ship/module/ota/controller/admin/trainingplan/vo/TrainingPlanPageReqVO.java

@@ -0,0 +1,57 @@
+package com.yc.ship.module.ota.controller.admin.trainingplan.vo;
+
+import com.yc.ship.framework.common.pojo.PageParam;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.ToString;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.time.LocalDateTime;
+
+import static com.yc.ship.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
+
+
+@Schema(description = "管理后台 - 培训计划分页 Request VO")
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+public class TrainingPlanPageReqVO extends PageParam {
+
+    @Schema(description = "计划名称", example = "李四")
+    private String name;
+
+    @Schema(description = "计划编码(唯一,规则:TRAIN_PLAN_YYYYMMDDXXXX)")
+    private String code;
+
+    @Schema(description = "计划描述", example = "你猜")
+    private String description;
+
+    @Schema(description = "开始时间")
+    @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+    private LocalDateTime[] startTime;
+
+    @Schema(description = "结束时间")
+    @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+    private LocalDateTime[] endTime;
+
+    @Schema(description = "状态(0=未执行,1=执行中,2=已完成,3=已取消,字典:training_plan_status)", example = "1")
+    private Integer status;
+
+    @Schema(description = "负责人ID(关联sys_user.id)", example = "25279")
+    private Long principalId;
+
+    @Schema(description = "负责人姓名(冗余)", example = "芋艿")
+    private String principalName;
+
+    @Schema(description = "备注", example = "你说的对")
+    private String remark;
+
+    @Schema(description = "创建时间")
+    @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+    private LocalDateTime[] createTime;
+
+    @Schema(description = "")
+    private String participantConfig;
+
+}

+ 63 - 0
ship-module-ota/ship-module-ota-biz/src/main/java/com/yc/ship/module/ota/controller/admin/trainingplan/vo/TrainingPlanRespVO.java

@@ -0,0 +1,63 @@
+package com.yc.ship.module.ota.controller.admin.trainingplan.vo;
+
+import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
+import com.alibaba.excel.annotation.ExcelProperty;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.time.LocalDateTime;
+
+@Schema(description = "管理后台 - 培训计划 Response VO")
+@Data
+@ExcelIgnoreUnannotated
+public class TrainingPlanRespVO {
+
+    @Schema(description = "主键ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "31596")
+    @ExcelProperty("主键ID")
+    private Long id;
+
+    @Schema(description = "计划名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "李四")
+    @ExcelProperty("计划名称")
+    private String name;
+
+    @Schema(description = "计划编码(唯一,规则:TRAIN_PLAN_YYYYMMDDXXXX)", requiredMode = Schema.RequiredMode.REQUIRED)
+    @ExcelProperty("计划编码(唯一,规则:TRAIN_PLAN_YYYYMMDDXXXX)")
+    private String code;
+
+    @Schema(description = "计划描述", example = "你猜")
+    @ExcelProperty("计划描述")
+    private String description;
+
+    @Schema(description = "开始时间", requiredMode = Schema.RequiredMode.REQUIRED)
+    @ExcelProperty("开始时间")
+    private LocalDateTime startTime;
+
+    @Schema(description = "结束时间", requiredMode = Schema.RequiredMode.REQUIRED)
+    @ExcelProperty("结束时间")
+    private LocalDateTime endTime;
+
+    @Schema(description = "状态(0=未执行,1=执行中,2=已完成,3=已取消,字典:training_plan_status)", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
+    @ExcelProperty("状态(0=未执行,1=执行中,2=已完成,3=已取消,字典:training_plan_status)")
+    private Integer status;
+
+    @Schema(description = "负责人ID(关联sys_user.id)", example = "25279")
+    @ExcelProperty("负责人ID(关联sys_user.id)")
+    private Long principalId;
+
+    @Schema(description = "负责人姓名(冗余)", example = "芋艿")
+    @ExcelProperty("负责人姓名(冗余)")
+    private String principalName;
+
+    @Schema(description = "备注", example = "你说的对")
+    @ExcelProperty("备注")
+    private String remark;
+
+    @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
+    @ExcelProperty("创建时间")
+    private LocalDateTime createTime;
+
+    @Schema(description = "")
+    @ExcelProperty("")
+    private String participantConfig;
+
+}

+ 57 - 0
ship-module-ota/ship-module-ota-biz/src/main/java/com/yc/ship/module/ota/controller/admin/trainingplan/vo/TrainingPlanSaveReqVO.java

@@ -0,0 +1,57 @@
+package com.yc.ship.module.ota.controller.admin.trainingplan.vo;
+
+import com.yc.ship.module.ota.dal.dataobject.trainingscore.TrainingScoreDO;
+import io.swagger.v3.oas.annotations.media.Schema;
+import javax.validation.constraints.NotEmpty;
+import javax.validation.constraints.NotNull;
+import lombok.Data;
+
+import java.time.LocalDateTime;
+import java.util.List;
+
+@Schema(description = "管理后台 - 培训计划新增/修改 Request VO")
+@Data
+public class TrainingPlanSaveReqVO {
+
+    @Schema(description = "主键ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "31596")
+    private Long id;
+
+    @Schema(description = "计划名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "李四")
+    @NotEmpty(message = "计划名称不能为空")
+    private String name;
+
+    @Schema(description = "计划编码(唯一,规则:TRAIN_PLAN_YYYYMMDDXXXX)", requiredMode = Schema.RequiredMode.REQUIRED)
+    @NotEmpty(message = "计划编码(唯一,规则:TRAIN_PLAN_YYYYMMDDXXXX)不能为空")
+    private String code;
+
+    @Schema(description = "计划描述", example = "你猜")
+    private String description;
+
+    @Schema(description = "开始时间", requiredMode = Schema.RequiredMode.REQUIRED)
+    @NotNull(message = "开始时间不能为空")
+    private LocalDateTime startTime;
+
+    @Schema(description = "结束时间", requiredMode = Schema.RequiredMode.REQUIRED)
+    @NotNull(message = "结束时间不能为空")
+    private LocalDateTime endTime;
+
+    @Schema(description = "状态(0=未执行,1=执行中,2=已完成,3=已取消,字典:training_plan_status)", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
+    @NotNull(message = "状态(0=未执行,1=执行中,2=已完成,3=已取消,字典:training_plan_status)不能为空")
+    private Integer status;
+
+    @Schema(description = "负责人ID(关联sys_user.id)", example = "25279")
+    private Long principalId;
+
+    @Schema(description = "负责人姓名(冗余)", example = "芋艿")
+    private String principalName;
+
+    @Schema(description = "备注", example = "你说的对")
+    private String remark;
+
+    @Schema(description = "")
+    private String participantConfig;
+
+    @Schema(description = "培训记录-人员关联表(成绩表)列表")
+    private List<TrainingScoreDO> trainingScores;
+
+}

+ 93 - 0
ship-module-ota/ship-module-ota-biz/src/main/java/com/yc/ship/module/ota/controller/admin/trainingscore/TrainingScoreController.java

@@ -0,0 +1,93 @@
+package com.yc.ship.module.ota.controller.admin.trainingscore;
+
+import com.yc.ship.framework.apilog.core.annotation.ApiAccessLog;
+import com.yc.ship.framework.common.pojo.CommonResult;
+import com.yc.ship.framework.common.pojo.PageParam;
+import com.yc.ship.framework.common.pojo.PageResult;
+import com.yc.ship.framework.common.util.object.BeanUtils;
+import com.yc.ship.framework.excel.core.util.ExcelUtils;
+import com.yc.ship.module.ota.controller.admin.trainingscore.vo.TrainingScorePageReqVO;
+import com.yc.ship.module.ota.controller.admin.trainingscore.vo.TrainingScoreRespVO;
+import com.yc.ship.module.ota.controller.admin.trainingscore.vo.TrainingScoreSaveReqVO;
+import com.yc.ship.module.ota.dal.dataobject.trainingscore.TrainingScoreDO;
+import com.yc.ship.module.ota.service.trainingscore.TrainingScoreService;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.Parameter;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletResponse;
+import javax.validation.Valid;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import java.io.IOException;
+import java.util.List;
+
+import static com.yc.ship.framework.apilog.core.enums.OperateTypeEnum.EXPORT;
+import static com.yc.ship.framework.common.pojo.CommonResult.success;
+
+@Tag(name = "管理后台 - 培训记录-人员关联表(成绩表)")
+@RestController
+@RequestMapping("/buss/training-score")
+@Validated
+public class TrainingScoreController {
+
+    @Resource
+    private TrainingScoreService trainingScoreService;
+
+    @PostMapping("/create")
+    @Operation(summary = "创建培训记录-人员关联表(成绩表)")
+    @PreAuthorize("@ss.hasPermission('buss:training-score:create')")
+    public CommonResult<Long> createTrainingScore(@Valid @RequestBody TrainingScoreSaveReqVO createReqVO) {
+        return success(trainingScoreService.createTrainingScore(createReqVO));
+    }
+
+    @PutMapping("/update")
+    @Operation(summary = "更新培训记录-人员关联表(成绩表)")
+    @PreAuthorize("@ss.hasPermission('buss:training-score:update')")
+    public CommonResult<Boolean> updateTrainingScore(@Valid @RequestBody TrainingScoreSaveReqVO updateReqVO) {
+        trainingScoreService.updateTrainingScore(updateReqVO);
+        return success(true);
+    }
+
+    @DeleteMapping("/delete")
+    @Operation(summary = "删除培训记录-人员关联表(成绩表)")
+    @Parameter(name = "id", description = "编号", required = true)
+    @PreAuthorize("@ss.hasPermission('buss:training-score:delete')")
+    public CommonResult<Boolean> deleteTrainingScore(@RequestParam("id") Long id) {
+        trainingScoreService.deleteTrainingScore(id);
+        return success(true);
+    }
+
+    @GetMapping("/get")
+    @Operation(summary = "获得培训记录-人员关联表(成绩表)")
+    @Parameter(name = "id", description = "编号", required = true, example = "1024")
+    @PreAuthorize("@ss.hasPermission('buss:training-score:query')")
+    public CommonResult<TrainingScoreRespVO> getTrainingScore(@RequestParam("id") Long id) {
+        TrainingScoreDO trainingScore = trainingScoreService.getTrainingScore(id);
+        return success(BeanUtils.toBean(trainingScore, TrainingScoreRespVO.class));
+    }
+
+    @GetMapping("/page")
+    @Operation(summary = "获得培训记录-人员关联表(成绩表)分页")
+    @PreAuthorize("@ss.hasPermission('buss:training-score:query')")
+    public CommonResult<PageResult<TrainingScoreRespVO>> getTrainingScorePage(@Valid TrainingScorePageReqVO pageReqVO) {
+        PageResult<TrainingScoreDO> pageResult = trainingScoreService.getTrainingScorePage(pageReqVO);
+        return success(BeanUtils.toBean(pageResult, TrainingScoreRespVO.class));
+    }
+
+    @GetMapping("/export-excel")
+    @Operation(summary = "导出培训记录-人员关联表(成绩表) Excel")
+    @PreAuthorize("@ss.hasPermission('buss:training-score:export')")
+    @ApiAccessLog(operateType = EXPORT)
+    public void exportTrainingScoreExcel(@Valid TrainingScorePageReqVO pageReqVO,
+              HttpServletResponse response) throws IOException {
+        pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
+        List<TrainingScoreDO> list = trainingScoreService.getTrainingScorePage(pageReqVO).getList();
+        // 导出 Excel
+        ExcelUtils.write(response, "培训记录-人员关联表(成绩表).xls", "数据", TrainingScoreRespVO.class,
+                        BeanUtils.toBean(list, TrainingScoreRespVO.class));
+    }
+
+}

+ 63 - 0
ship-module-ota/ship-module-ota-biz/src/main/java/com/yc/ship/module/ota/controller/admin/trainingscore/vo/TrainingScorePageReqVO.java

@@ -0,0 +1,63 @@
+package com.yc.ship.module.ota.controller.admin.trainingscore.vo;
+
+import com.yc.ship.framework.common.pojo.PageParam;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.ToString;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+
+import static com.yc.ship.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
+
+
+@Schema(description = "管理后台 - 培训记录-人员关联表(成绩表)分页 Request VO")
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+public class TrainingScorePageReqVO extends PageParam {
+
+    @Schema(description = "关联计划ID,一起培训计划的人数", example = "6351")
+    private Long planId;
+
+    @Schema(description = "计划编码(唯一,规则:TRAIN_PLAN_YYYYMMDDXXXX)")
+    private String code;
+
+    @Schema(description = "培训记录ID(关联training_record.id)", example = "6496")
+    private Long recordId;
+
+    @Schema(description = "参与人员ID(关联sys_user.id)", example = "29904")
+    private Long userId;
+
+    @Schema(description = "人员姓名(冗余)", example = "李四")
+    private String userName;
+
+    @Schema(description = "部门ID(冗余sys_user.dept_id)", example = "16061")
+    private Long deptId;
+
+    @Schema(description = "部门名称(冗余)", example = "芋艿")
+    private String deptName;
+
+    @Schema(description = "考试分数(0-100分,可选)")
+    private BigDecimal score;
+
+    @Schema(description = "是否通过(0=否,1=是,可选)")
+    private Boolean pass;
+
+    @Schema(description = "签到状态(0=未签到,1=已签到,字典:sign_in_status)", example = "2")
+    private Integer signInStatus;
+
+    @Schema(description = "签到时间")
+    @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+    private LocalDateTime[] signInTime;
+
+    @Schema(description = "备注", example = "你说的对")
+    private String remark;
+
+    @Schema(description = "创建时间")
+    @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+    private LocalDateTime[] createTime;
+
+}

+ 72 - 0
ship-module-ota/ship-module-ota-biz/src/main/java/com/yc/ship/module/ota/controller/admin/trainingscore/vo/TrainingScoreRespVO.java

@@ -0,0 +1,72 @@
+package com.yc.ship.module.ota.controller.admin.trainingscore.vo;
+
+import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
+import com.alibaba.excel.annotation.ExcelProperty;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+
+@Schema(description = "管理后台 - 培训记录-人员关联表(成绩表) Response VO")
+@Data
+@ExcelIgnoreUnannotated
+public class TrainingScoreRespVO {
+
+    @Schema(description = "主键ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "12838")
+    @ExcelProperty("主键ID")
+    private Long id;
+
+    @Schema(description = "关联计划ID,一起培训计划的人数", example = "6351")
+    @ExcelProperty("关联计划ID,一起培训计划的人数")
+    private Long planId;
+
+    @Schema(description = "计划编码(唯一,规则:TRAIN_PLAN_YYYYMMDDXXXX)", requiredMode = Schema.RequiredMode.REQUIRED)
+    @ExcelProperty("计划编码(唯一,规则:TRAIN_PLAN_YYYYMMDDXXXX)")
+    private String code;
+
+    @Schema(description = "培训记录ID(关联training_record.id)", requiredMode = Schema.RequiredMode.REQUIRED, example = "6496")
+    @ExcelProperty("培训记录ID(关联training_record.id)")
+    private Long recordId;
+
+    @Schema(description = "参与人员ID(关联sys_user.id)", requiredMode = Schema.RequiredMode.REQUIRED, example = "29904")
+    @ExcelProperty("参与人员ID(关联sys_user.id)")
+    private Long userId;
+
+    @Schema(description = "人员姓名(冗余)", example = "李四")
+    @ExcelProperty("人员姓名(冗余)")
+    private String userName;
+
+    @Schema(description = "部门ID(冗余sys_user.dept_id)", example = "16061")
+    @ExcelProperty("部门ID(冗余sys_user.dept_id)")
+    private Long deptId;
+
+    @Schema(description = "部门名称(冗余)", example = "芋艿")
+    @ExcelProperty("部门名称(冗余)")
+    private String deptName;
+
+    @Schema(description = "考试分数(0-100分,可选)")
+    @ExcelProperty("考试分数(0-100分,可选)")
+    private BigDecimal score;
+
+    @Schema(description = "是否通过(0=否,1=是,可选)")
+    @ExcelProperty("是否通过(0=否,1=是,可选)")
+    private Boolean pass;
+
+    @Schema(description = "签到状态(0=未签到,1=已签到,字典:sign_in_status)", example = "2")
+    @ExcelProperty("签到状态(0=未签到,1=已签到,字典:sign_in_status)")
+    private Integer signInStatus;
+
+    @Schema(description = "签到时间")
+    @ExcelProperty("签到时间")
+    private LocalDateTime signInTime;
+
+    @Schema(description = "备注", example = "你说的对")
+    @ExcelProperty("备注")
+    private String remark;
+
+    @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
+    @ExcelProperty("创建时间")
+    private LocalDateTime createTime;
+
+}

+ 54 - 0
ship-module-ota/ship-module-ota-biz/src/main/java/com/yc/ship/module/ota/controller/admin/trainingscore/vo/TrainingScoreSaveReqVO.java

@@ -0,0 +1,54 @@
+package com.yc.ship.module.ota.controller.admin.trainingscore.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+import javax.validation.constraints.*;
+
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+
+@Schema(description = "管理后台 - 培训记录-人员关联表(成绩表)新增/修改 Request VO")
+@Data
+public class TrainingScoreSaveReqVO {
+
+    @Schema(description = "主键ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "12838")
+    private Long id;
+
+    @Schema(description = "关联计划ID,一起培训计划的人数", example = "6351")
+    private Long planId;
+
+    @Schema(description = "计划编码(唯一,规则:TRAIN_PLAN_YYYYMMDDXXXX)", requiredMode = Schema.RequiredMode.REQUIRED)
+    private String code;
+
+    @Schema(description = "培训记录ID(关联training_record.id)", requiredMode = Schema.RequiredMode.REQUIRED, example = "6496")
+    private Long recordId;
+
+    @Schema(description = "参与人员ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "29904")
+    @NotNull(message = "参与人员ID(关联sys_user.id)不能为空")
+    private Long userId;
+
+    @Schema(description = "人员姓名(冗余)", example = "李四")
+    private String userName;
+
+    @Schema(description = "部门ID(冗余sys_user.dept_id)", example = "16061")
+    private Long deptId;
+
+    @Schema(description = "部门名称(冗余)", example = "芋艿")
+    private String deptName;
+
+    @Schema(description = "考试分数(0-100分,可选)")
+    private BigDecimal score;
+
+    @Schema(description = "是否通过(0=否,1=是,可选)")
+    private Boolean pass;
+
+    @Schema(description = "签到状态(0=未签到,1=已签到,字典:sign_in_status)", example = "2")
+    private Integer signInStatus;
+
+    @Schema(description = "签到时间")
+    private LocalDateTime signInTime;
+
+    @Schema(description = "备注", example = "你说的对")
+    private String remark;
+
+}

+ 80 - 0
ship-module-ota/ship-module-ota-biz/src/main/java/com/yc/ship/module/ota/dal/dataobject/trainingcertificate/TrainingCertificateDO.java

@@ -0,0 +1,80 @@
+package com.yc.ship.module.ota.dal.dataobject.trainingcertificate;
+
+import com.baomidou.mybatisplus.annotation.KeySequence;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.yc.ship.framework.mybatis.core.dataobject.BaseDO;
+import lombok.*;
+
+import java.time.LocalDateTime;
+
+/**
+ * 培训证书 DO
+ *
+ * @author 管理员
+ */
+@TableName("training_certificate")
+@KeySequence("training_certificate_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class TrainingCertificateDO extends BaseDO {
+
+    /**
+     * 主键ID
+     */
+    @TableId
+    private Long id;
+    /**
+     * 证书编号
+     */
+    private String certNo;
+    /**
+     * 持证人ID
+     */
+    private Long userId;
+    /**
+     * 持证人姓名
+     */
+    private String userName;
+    /**
+     * 关联培训记录ID
+     */
+    private Long recordId;
+    /**
+     * 关联课程ID
+     */
+    private Long courseId;
+    /**
+     * 证书名称
+     */
+    private String name;
+    /**
+     * 发放时间
+     */
+    private LocalDateTime issueTime;
+    /**
+     * 有效期开始时间
+     */
+    private LocalDateTime validStartTime;
+    /**
+     * 有效期结束时间
+     */
+    private LocalDateTime validEndTime;
+    /**
+     * 状态
+     */
+    private Integer status;
+    /**
+     * 证书电子版ID
+     */
+    private Long certFileId;
+    /**
+     * 备注
+     */
+    private String remark;
+
+}

+ 72 - 0
ship-module-ota/ship-module-ota-biz/src/main/java/com/yc/ship/module/ota/dal/dataobject/trainingplan/TrainingPlanDO.java

@@ -0,0 +1,72 @@
+package com.yc.ship.module.ota.dal.dataobject.trainingplan;
+
+import com.baomidou.mybatisplus.annotation.KeySequence;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.yc.ship.framework.mybatis.core.dataobject.BaseDO;
+import lombok.*;
+
+import java.time.LocalDateTime;
+
+/**
+ * 培训计划 DO
+ *
+ * @author 管理员
+ */
+@TableName("training_plan")
+@KeySequence("training_plan_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class TrainingPlanDO extends BaseDO {
+
+    /**
+     * 主键ID
+     */
+    @TableId
+    private Long id;
+    /**
+     * 计划名称
+     */
+    private String name;
+    /**
+     * 计划编码(唯一,规则:TRAIN_PLAN_YYYYMMDDXXXX)
+     */
+    private String code;
+    /**
+     * 计划描述
+     */
+    private String description;
+    /**
+     * 开始时间
+     */
+    private LocalDateTime startTime;
+    /**
+     * 结束时间
+     */
+    private LocalDateTime endTime;
+    /**
+     * 状态(0=未执行,1=执行中,2=已完成,3=已取消,字典:training_plan_status)
+     */
+    private Integer status;
+    /**
+     * 负责人ID(关联sys_user.id)
+     */
+    private Long principalId;
+    /**
+     * 负责人姓名(冗余)
+     */
+    private String principalName;
+    /**
+     * 备注
+     */
+    private String remark;
+    /**
+     * 
+     */
+    private String participantConfig;
+
+}

+ 81 - 0
ship-module-ota/ship-module-ota-biz/src/main/java/com/yc/ship/module/ota/dal/dataobject/trainingscore/TrainingScoreDO.java

@@ -0,0 +1,81 @@
+package com.yc.ship.module.ota.dal.dataobject.trainingscore;
+
+import com.baomidou.mybatisplus.annotation.KeySequence;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.yc.ship.framework.mybatis.core.dataobject.BaseDO;
+import lombok.*;
+
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+
+/**
+ * 培训记录-人员关联表(成绩表) DO
+ *
+ * @author 管理员
+ */
+@TableName("training_score")
+@KeySequence("training_score_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class TrainingScoreDO extends BaseDO {
+
+    /**
+     * 主键ID
+     */
+    @TableId
+    private Long id;
+    /**
+     * 关联计划ID,一起培训计划的人数
+     */
+    private Long planId;
+    /**
+     * 计划编码(唯一,规则:TRAIN_PLAN_YYYYMMDDXXXX)
+     */
+    private String code;
+    /**
+     * 培训记录ID(关联training_record.id)
+     */
+    private Long recordId;
+    /**
+     * 参与人员ID(关联sys_user.id)
+     */
+    private Long userId;
+    /**
+     * 人员姓名(冗余)
+     */
+    private String userName;
+    /**
+     * 部门ID(冗余sys_user.dept_id)
+     */
+    private Long deptId;
+    /**
+     * 部门名称(冗余)
+     */
+    private String deptName;
+    /**
+     * 考试分数(0-100分,可选)
+     */
+    private BigDecimal score;
+    /**
+     * 是否通过(0=否,1=是,可选)
+     */
+    private Boolean pass;
+    /**
+     * 签到状态(0=未签到,1=已签到,字典:sign_in_status)
+     */
+    private Integer signInStatus;
+    /**
+     * 签到时间
+     */
+    private LocalDateTime signInTime;
+    /**
+     * 备注
+     */
+    private String remark;
+
+}

+ 33 - 0
ship-module-ota/ship-module-ota-biz/src/main/java/com/yc/ship/module/ota/dal/mysql/trainingcertificate/TrainingCertificateMapper.java

@@ -0,0 +1,33 @@
+package com.yc.ship.module.ota.dal.mysql.trainingcertificate;
+
+import com.yc.ship.framework.common.pojo.PageResult;
+import com.yc.ship.framework.mybatis.core.mapper.BaseMapperX;
+import com.yc.ship.framework.mybatis.core.query.LambdaQueryWrapperX;
+import com.yc.ship.module.ota.controller.admin.trainingcertificate.vo.TrainingCertificatePageReqVO;
+import com.yc.ship.module.ota.dal.dataobject.trainingcertificate.TrainingCertificateDO;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * 培训证书 Mapper
+ *
+ * @author 管理员
+ */
+@Mapper
+public interface TrainingCertificateMapper extends BaseMapperX<TrainingCertificateDO> {
+
+    default PageResult<TrainingCertificateDO> selectPage(TrainingCertificatePageReqVO reqVO) {
+        return selectPage(reqVO, new LambdaQueryWrapperX<TrainingCertificateDO>()
+                .eqIfPresent(TrainingCertificateDO::getCertNo, reqVO.getCertNo())
+                .eqIfPresent(TrainingCertificateDO::getUserId, reqVO.getUserId())
+                .likeIfPresent(TrainingCertificateDO::getUserName, reqVO.getUserName())
+                .likeIfPresent(TrainingCertificateDO::getName, reqVO.getName())
+                .betweenIfPresent(TrainingCertificateDO::getIssueTime, reqVO.getIssueTime())
+                .betweenIfPresent(TrainingCertificateDO::getValidStartTime, reqVO.getValidStartTime())
+                .betweenIfPresent(TrainingCertificateDO::getValidEndTime, reqVO.getValidEndTime())
+                .eqIfPresent(TrainingCertificateDO::getStatus, reqVO.getStatus())
+                .eqIfPresent(TrainingCertificateDO::getCertFileId, reqVO.getCertFileId())
+                .betweenIfPresent(TrainingCertificateDO::getCreateTime, reqVO.getCreateTime())
+                .orderByDesc(TrainingCertificateDO::getId));
+    }
+
+}

+ 33 - 0
ship-module-ota/ship-module-ota-biz/src/main/java/com/yc/ship/module/ota/dal/mysql/trainingplan/TrainingPlanMapper.java

@@ -0,0 +1,33 @@
+package com.yc.ship.module.ota.dal.mysql.trainingplan;
+
+import com.yc.ship.framework.common.pojo.PageResult;
+import com.yc.ship.framework.mybatis.core.mapper.BaseMapperX;
+import com.yc.ship.framework.mybatis.core.query.LambdaQueryWrapperX;
+import com.yc.ship.module.ota.controller.admin.trainingplan.vo.TrainingPlanPageReqVO;
+import com.yc.ship.module.ota.dal.dataobject.trainingplan.TrainingPlanDO;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * 培训计划 Mapper
+ *
+ * @author 管理员
+ */
+@Mapper
+public interface TrainingPlanMapper extends BaseMapperX<TrainingPlanDO> {
+
+    default PageResult<TrainingPlanDO> selectPage(TrainingPlanPageReqVO reqVO) {
+        return selectPage(reqVO, new LambdaQueryWrapperX<TrainingPlanDO>()
+                .likeIfPresent(TrainingPlanDO::getName, reqVO.getName())
+                .eqIfPresent(TrainingPlanDO::getCode, reqVO.getCode())
+                .eqIfPresent(TrainingPlanDO::getDescription, reqVO.getDescription())
+                .betweenIfPresent(TrainingPlanDO::getStartTime, reqVO.getStartTime())
+                .betweenIfPresent(TrainingPlanDO::getEndTime, reqVO.getEndTime())
+                .eqIfPresent(TrainingPlanDO::getStatus, reqVO.getStatus())
+                .eqIfPresent(TrainingPlanDO::getPrincipalId, reqVO.getPrincipalId())
+                .likeIfPresent(TrainingPlanDO::getPrincipalName, reqVO.getPrincipalName())
+                .eqIfPresent(TrainingPlanDO::getRemark, reqVO.getRemark())
+                .betweenIfPresent(TrainingPlanDO::getCreateTime, reqVO.getCreateTime())
+                .eqIfPresent(TrainingPlanDO::getParticipantConfig, reqVO.getParticipantConfig())
+                .orderByDesc(TrainingPlanDO::getId));
+    }
+}

+ 45 - 0
ship-module-ota/ship-module-ota-biz/src/main/java/com/yc/ship/module/ota/dal/mysql/trainingscore/TrainingScoreMapper.java

@@ -0,0 +1,45 @@
+package com.yc.ship.module.ota.dal.mysql.trainingscore;
+import com.yc.ship.framework.common.pojo.PageResult;
+import com.yc.ship.framework.mybatis.core.mapper.BaseMapperX;
+import com.yc.ship.framework.mybatis.core.query.LambdaQueryWrapperX;
+import com.yc.ship.module.ota.controller.admin.trainingscore.vo.TrainingScorePageReqVO;
+import com.yc.ship.module.ota.dal.dataobject.trainingscore.TrainingScoreDO;
+import org.apache.ibatis.annotations.Mapper;
+
+import java.util.List;
+
+/**
+ * 培训记录-人员关联表(成绩表) Mapper
+ *
+ * @author 管理员
+ */
+@Mapper
+public interface TrainingScoreMapper extends BaseMapperX<TrainingScoreDO> {
+
+    default PageResult<TrainingScoreDO> selectPage(TrainingScorePageReqVO reqVO) {
+        return selectPage(reqVO, new LambdaQueryWrapperX<TrainingScoreDO>()
+                .eqIfPresent(TrainingScoreDO::getPlanId, reqVO.getPlanId())
+                .eqIfPresent(TrainingScoreDO::getCode, reqVO.getCode())
+                .eqIfPresent(TrainingScoreDO::getRecordId, reqVO.getRecordId())
+                .eqIfPresent(TrainingScoreDO::getUserId, reqVO.getUserId())
+                .likeIfPresent(TrainingScoreDO::getUserName, reqVO.getUserName())
+                .eqIfPresent(TrainingScoreDO::getDeptId, reqVO.getDeptId())
+                .likeIfPresent(TrainingScoreDO::getDeptName, reqVO.getDeptName())
+                .eqIfPresent(TrainingScoreDO::getScore, reqVO.getScore())
+                .eqIfPresent(TrainingScoreDO::getPass, reqVO.getPass())
+                .eqIfPresent(TrainingScoreDO::getSignInStatus, reqVO.getSignInStatus())
+                .betweenIfPresent(TrainingScoreDO::getSignInTime, reqVO.getSignInTime())
+                .eqIfPresent(TrainingScoreDO::getRemark, reqVO.getRemark())
+                .betweenIfPresent(TrainingScoreDO::getCreateTime, reqVO.getCreateTime())
+                .orderByDesc(TrainingScoreDO::getId));
+    }
+
+    default List<TrainingScoreDO> selectListByPlanId(Long planId) {
+        return selectList(TrainingScoreDO::getPlanId, planId);
+    }
+
+    default int deleteByPlanId(Long planId) {
+        return delete(TrainingScoreDO::getPlanId, planId);
+    }
+
+}

+ 57 - 0
ship-module-ota/ship-module-ota-biz/src/main/java/com/yc/ship/module/ota/service/trainingcertificate/TrainingCertificateService.java

@@ -0,0 +1,57 @@
+package com.yc.ship.module.ota.service.trainingcertificate;
+
+
+import com.yc.ship.framework.common.pojo.PageResult;
+import com.yc.ship.module.ota.controller.admin.trainingcertificate.vo.TrainingCertificatePageReqVO;
+import com.yc.ship.module.ota.controller.admin.trainingcertificate.vo.TrainingCertificateSaveReqVO;
+import com.yc.ship.module.ota.dal.dataobject.trainingcertificate.TrainingCertificateDO;
+
+import javax.validation.Valid;
+
+
+/**
+ * 培训证书 Service 接口
+ *
+ * @author 管理员
+ */
+public interface TrainingCertificateService {
+
+    /**
+     * 创建培训证书
+     *
+     * @param createReqVO 创建信息
+     * @return 编号
+     */
+    Long createCertificate(@Valid TrainingCertificateSaveReqVO createReqVO);
+
+    /**
+     * 更新培训证书
+     *
+     * @param updateReqVO 更新信息
+     */
+    void updateCertificate(@Valid TrainingCertificateSaveReqVO updateReqVO);
+
+    /**
+     * 删除培训证书
+     *
+     * @param id 编号
+     */
+    void deleteCertificate(Long id);
+
+    /**
+     * 获得培训证书
+     *
+     * @param id 编号
+     * @return 培训证书
+     */
+    TrainingCertificateDO getCertificate(Long id);
+
+    /**
+     * 获得培训证书分页
+     *
+     * @param pageReqVO 分页查询
+     * @return 培训证书分页
+     */
+    PageResult<TrainingCertificateDO> getCertificatePage(TrainingCertificatePageReqVO pageReqVO);
+
+}

+ 71 - 0
ship-module-ota/ship-module-ota-biz/src/main/java/com/yc/ship/module/ota/service/trainingcertificate/TrainingCertificateServiceImpl.java

@@ -0,0 +1,71 @@
+package com.yc.ship.module.ota.service.trainingcertificate;
+
+import com.yc.ship.framework.common.pojo.PageResult;
+import com.yc.ship.framework.common.util.object.BeanUtils;
+import com.yc.ship.module.ota.controller.admin.trainingcertificate.vo.TrainingCertificatePageReqVO;
+import com.yc.ship.module.ota.controller.admin.trainingcertificate.vo.TrainingCertificateSaveReqVO;
+import com.yc.ship.module.ota.dal.dataobject.trainingcertificate.TrainingCertificateDO;
+import com.yc.ship.module.ota.dal.mysql.trainingcertificate.TrainingCertificateMapper;
+import org.springframework.stereotype.Service;
+import org.springframework.validation.annotation.Validated;
+import javax.annotation.Resource;
+
+import static com.yc.ship.framework.common.exception.util.ServiceExceptionUtil.exception;
+import static com.yc.ship.module.ota.enums.ErrorCodeConstants.TRAINING_CERTIFICATE_NOT_EXISTS;
+
+
+/**
+ * 培训证书 Service 实现类
+ *
+ * @author 管理员
+ */
+@Service
+@Validated
+public class TrainingCertificateServiceImpl implements TrainingCertificateService {
+
+    @Resource
+    private TrainingCertificateMapper certificateMapper;
+
+    @Override
+    public Long createCertificate(TrainingCertificateSaveReqVO createReqVO) {
+        // 插入
+        TrainingCertificateDO certificate = BeanUtils.toBean(createReqVO, TrainingCertificateDO.class);
+        certificateMapper.insert(certificate);
+        // 返回
+        return certificate.getId();
+    }
+
+    @Override
+    public void updateCertificate(TrainingCertificateSaveReqVO updateReqVO) {
+        // 校验存在
+        validateCertificateExists(updateReqVO.getId());
+        // 更新
+        TrainingCertificateDO updateObj = BeanUtils.toBean(updateReqVO, TrainingCertificateDO.class);
+        certificateMapper.updateById(updateObj);
+    }
+
+    @Override
+    public void deleteCertificate(Long id) {
+        // 校验存在
+        validateCertificateExists(id);
+        // 删除
+        certificateMapper.deleteById(id);
+    }
+
+    private void validateCertificateExists(Long id) {
+        if (certificateMapper.selectById(id) == null) {
+            throw exception(TRAINING_CERTIFICATE_NOT_EXISTS);
+        }
+    }
+
+    @Override
+    public TrainingCertificateDO getCertificate(Long id) {
+        return certificateMapper.selectById(id);
+    }
+
+    @Override
+    public PageResult<TrainingCertificateDO> getCertificatePage(TrainingCertificatePageReqVO pageReqVO) {
+        return certificateMapper.selectPage(pageReqVO);
+    }
+
+}

+ 68 - 0
ship-module-ota/ship-module-ota-biz/src/main/java/com/yc/ship/module/ota/service/trainingplan/TrainingPlanService.java

@@ -0,0 +1,68 @@
+package com.yc.ship.module.ota.service.trainingplan;
+
+
+import com.yc.ship.framework.common.pojo.PageResult;
+import com.yc.ship.module.ota.controller.admin.trainingplan.vo.TrainingPlanPageReqVO;
+import com.yc.ship.module.ota.controller.admin.trainingplan.vo.TrainingPlanSaveReqVO;
+import com.yc.ship.module.ota.dal.dataobject.trainingplan.TrainingPlanDO;
+import com.yc.ship.module.ota.dal.dataobject.trainingscore.TrainingScoreDO;
+import javax.validation.Valid;
+
+import java.util.List;
+
+/**
+ * 培训计划 Service 接口
+ *
+ * @author 管理员
+ */
+public interface TrainingPlanService {
+
+    /**
+     * 创建培训计划
+     *
+     * @param createReqVO 创建信息
+     * @return 编号
+     */
+    Long createTrainingPlan(@Valid TrainingPlanSaveReqVO createReqVO);
+
+    /**
+     * 更新培训计划
+     *
+     * @param updateReqVO 更新信息
+     */
+    void updateTrainingPlan(@Valid TrainingPlanSaveReqVO updateReqVO);
+
+    /**
+     * 删除培训计划
+     *
+     * @param id 编号
+     */
+    void deleteTrainingPlan(Long id);
+
+    /**
+     * 获得培训计划
+     *
+     * @param id 编号
+     * @return 培训计划
+     */
+    TrainingPlanDO getTrainingPlan(Long id);
+
+    /**
+     * 获得培训计划分页
+     *
+     * @param pageReqVO 分页查询
+     * @return 培训计划分页
+     */
+    PageResult<TrainingPlanDO> getTrainingPlanPage(TrainingPlanPageReqVO pageReqVO);
+
+    // ==================== 子表(培训记录-人员关联表(成绩表)) ====================
+
+    /**
+     * 获得培训记录-人员关联表(成绩表)列表
+     *
+     * @param planId 关联计划ID,一起培训计划的人数
+     * @return 培训记录-人员关联表(成绩表)列表
+     */
+    List<TrainingScoreDO> getTrainingScoreListByPlanId(Long planId);
+
+}

+ 113 - 0
ship-module-ota/ship-module-ota-biz/src/main/java/com/yc/ship/module/ota/service/trainingplan/TrainingPlanServiceImpl.java

@@ -0,0 +1,113 @@
+package com.yc.ship.module.ota.service.trainingplan;
+
+import com.yc.ship.framework.common.pojo.PageResult;
+import com.yc.ship.framework.common.util.object.BeanUtils;
+import com.yc.ship.framework.mybatis.core.query.LambdaQueryWrapperX;
+import com.yc.ship.module.ota.controller.admin.trainingplan.vo.TrainingPlanPageReqVO;
+import com.yc.ship.module.ota.controller.admin.trainingplan.vo.TrainingPlanSaveReqVO;
+import com.yc.ship.module.ota.dal.dataobject.trainingplan.TrainingPlanDO;
+import com.yc.ship.module.ota.dal.dataobject.trainingscore.TrainingScoreDO;
+import com.yc.ship.module.ota.dal.mysql.trainingplan.TrainingPlanMapper;
+import com.yc.ship.module.ota.dal.mysql.trainingscore.TrainingScoreMapper;
+import javax.annotation.Resource;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.validation.annotation.Validated;
+
+import java.util.List;
+
+import static com.yc.ship.framework.common.exception.util.ServiceExceptionUtil.exception;
+import static com.yc.ship.module.ota.enums.ErrorCodeConstants.TRAINING_PLAN_NOT_EXISTS;
+
+
+/**
+ * 培训计划 Service 实现类
+ *
+ * @author 管理员
+ */
+@Service
+@Validated
+public class TrainingPlanServiceImpl implements TrainingPlanService {
+
+    @Resource
+    private TrainingPlanMapper trainingPlanMapper;
+    @Resource
+    private TrainingScoreMapper trainingScoreMapper;
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public Long createTrainingPlan(TrainingPlanSaveReqVO createReqVO) {
+        // 插入
+        TrainingPlanDO trainingPlan = BeanUtils.toBean(createReqVO, TrainingPlanDO.class);
+        trainingPlanMapper.insert(trainingPlan);
+
+        // 插入子表
+        createTrainingScoreList(trainingPlan.getId(), createReqVO.getTrainingScores());
+        // 返回
+        return trainingPlan.getId();
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void updateTrainingPlan(TrainingPlanSaveReqVO updateReqVO) {
+        // 校验存在
+        validateTrainingPlanExists(updateReqVO.getId());
+        // 更新
+        TrainingPlanDO updateObj = BeanUtils.toBean(updateReqVO, TrainingPlanDO.class);
+        trainingPlanMapper.updateById(updateObj);
+
+        // 更新子表
+        updateTrainingScoreList(updateReqVO.getId(), updateReqVO.getTrainingScores());
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void deleteTrainingPlan(Long id) {
+        // 校验存在
+        validateTrainingPlanExists(id);
+        // 删除
+        trainingPlanMapper.deleteById(id);
+
+        // 删除子表
+        deleteTrainingScoreByPlanId(id);
+    }
+
+    private void validateTrainingPlanExists(Long id) {
+        if (trainingPlanMapper.selectById(id) == null) {
+            throw exception(TRAINING_PLAN_NOT_EXISTS);
+        }
+    }
+
+    @Override
+    public TrainingPlanDO getTrainingPlan(Long id) {
+        return trainingPlanMapper.selectById(id);
+    }
+
+    @Override
+    public PageResult<TrainingPlanDO> getTrainingPlanPage(TrainingPlanPageReqVO pageReqVO) {
+        return trainingPlanMapper.selectPage(pageReqVO);
+    }
+
+    // ==================== 子表(培训记录-人员关联表(成绩表)) ====================
+
+    @Override
+    public List<TrainingScoreDO> getTrainingScoreListByPlanId(Long planId) {
+        return trainingScoreMapper.selectListByPlanId(planId);
+    }
+
+    private void createTrainingScoreList(Long planId, List<TrainingScoreDO> list) {
+        list.forEach(o -> o.setPlanId(planId));
+        trainingScoreMapper.insertBatch(list);
+    }
+
+    private void updateTrainingScoreList(Long planId, List<TrainingScoreDO> list) {
+        deleteTrainingScoreByPlanId(planId);
+		list.forEach(o -> o.setId(null).setUpdater(null).setUpdateTime(null)); // 解决更新情况下:1)id 冲突;2)updateTime 不更新
+        createTrainingScoreList(planId, list);
+    }
+
+    private void deleteTrainingScoreByPlanId(Long planId) {
+        trainingScoreMapper.deleteByPlanId(planId);
+    }
+
+}

+ 54 - 0
ship-module-ota/ship-module-ota-biz/src/main/java/com/yc/ship/module/ota/service/trainingscore/TrainingScoreService.java

@@ -0,0 +1,54 @@
+package com.yc.ship.module.ota.service.trainingscore;
+
+import com.yc.ship.framework.common.pojo.PageResult;
+import com.yc.ship.module.ota.controller.admin.trainingscore.vo.TrainingScorePageReqVO;
+import com.yc.ship.module.ota.controller.admin.trainingscore.vo.TrainingScoreSaveReqVO;
+import com.yc.ship.module.ota.dal.dataobject.trainingscore.TrainingScoreDO;
+import javax.validation.Valid;
+
+/**
+ * 培训记录-人员关联表(成绩表) Service 接口
+ *
+ * @author 管理员
+ */
+public interface TrainingScoreService {
+
+    /**
+     * 创建培训记录-人员关联表(成绩表)
+     *
+     * @param createReqVO 创建信息
+     * @return 编号
+     */
+    Long createTrainingScore(@Valid TrainingScoreSaveReqVO createReqVO);
+
+    /**
+     * 更新培训记录-人员关联表(成绩表)
+     *
+     * @param updateReqVO 更新信息
+     */
+    void updateTrainingScore(@Valid TrainingScoreSaveReqVO updateReqVO);
+
+    /**
+     * 删除培训记录-人员关联表(成绩表)
+     *
+     * @param id 编号
+     */
+    void deleteTrainingScore(Long id);
+
+    /**
+     * 获得培训记录-人员关联表(成绩表)
+     *
+     * @param id 编号
+     * @return 培训记录-人员关联表(成绩表)
+     */
+    TrainingScoreDO getTrainingScore(Long id);
+
+    /**
+     * 获得培训记录-人员关联表(成绩表)分页
+     *
+     * @param pageReqVO 分页查询
+     * @return 培训记录-人员关联表(成绩表)分页
+     */
+    PageResult<TrainingScoreDO> getTrainingScorePage(TrainingScorePageReqVO pageReqVO);
+
+}

+ 69 - 0
ship-module-ota/ship-module-ota-biz/src/main/java/com/yc/ship/module/ota/service/trainingscore/TrainingScoreServiceImpl.java

@@ -0,0 +1,69 @@
+package com.yc.ship.module.ota.service.trainingscore;
+import com.yc.ship.framework.common.pojo.PageResult;
+import com.yc.ship.framework.common.util.object.BeanUtils;
+import com.yc.ship.module.ota.controller.admin.trainingscore.vo.TrainingScorePageReqVO;
+import com.yc.ship.module.ota.controller.admin.trainingscore.vo.TrainingScoreSaveReqVO;
+import com.yc.ship.module.ota.dal.dataobject.trainingscore.TrainingScoreDO;
+import com.yc.ship.module.ota.dal.mysql.trainingscore.TrainingScoreMapper;
+import javax.annotation.Resource;
+import org.springframework.stereotype.Service;
+import org.springframework.validation.annotation.Validated;
+
+import static com.yc.ship.framework.common.exception.util.ServiceExceptionUtil.exception;
+import static com.yc.ship.module.ota.enums.ErrorCodeConstants.TRAINING_SCORE_NOT_EXISTS;
+
+/**
+ * 培训记录-人员关联表(成绩表) Service 实现类
+ *
+ * @author 管理员
+ */
+@Service
+@Validated
+public class TrainingScoreServiceImpl implements TrainingScoreService {
+
+    @Resource
+    private TrainingScoreMapper trainingScoreMapper;
+
+    @Override
+    public Long createTrainingScore(TrainingScoreSaveReqVO createReqVO) {
+        // 插入
+        TrainingScoreDO trainingScore = BeanUtils.toBean(createReqVO, TrainingScoreDO.class);
+        trainingScoreMapper.insert(trainingScore);
+        // 返回
+        return trainingScore.getId();
+    }
+
+    @Override
+    public void updateTrainingScore(TrainingScoreSaveReqVO updateReqVO) {
+        // 校验存在
+        validateTrainingScoreExists(updateReqVO.getId());
+        // 更新
+        TrainingScoreDO updateObj = BeanUtils.toBean(updateReqVO, TrainingScoreDO.class);
+        trainingScoreMapper.updateById(updateObj);
+    }
+
+    @Override
+    public void deleteTrainingScore(Long id) {
+        // 校验存在
+        validateTrainingScoreExists(id);
+        // 删除
+        trainingScoreMapper.deleteById(id);
+    }
+
+    private void validateTrainingScoreExists(Long id) {
+        if (trainingScoreMapper.selectById(id) == null) {
+            throw exception(TRAINING_SCORE_NOT_EXISTS);
+        }
+    }
+
+    @Override
+    public TrainingScoreDO getTrainingScore(Long id) {
+        return trainingScoreMapper.selectById(id);
+    }
+
+    @Override
+    public PageResult<TrainingScoreDO> getTrainingScorePage(TrainingScorePageReqVO pageReqVO) {
+        return trainingScoreMapper.selectPage(pageReqVO);
+    }
+
+}

+ 12 - 0
ship-module-ota/ship-module-ota-biz/src/main/resources/mapper/trainingcertificate/TrainingCertificateMapper.xml

@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.yc.ship.module.ota.dal.mysql.trainingcertificate.TrainingCertificateMapper">
+
+    <!--
+        一般情况下,尽可能使用 Mapper 进行 CRUD 增删改查即可。
+        无法满足的场景,例如说多表关联查询,才使用 XML 编写 SQL。
+        代码生成器暂时只生成 Mapper XML 文件本身,更多推荐 MybatisX 快速开发插件来生成查询。
+        文档可见:https://www.iocoder.cn/MyBatis/x-plugins/
+     -->
+
+</mapper>

+ 12 - 0
ship-module-ota/ship-module-ota-biz/src/main/resources/mapper/trainingplan/TrainingPlanMapper.xml

@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.yc.ship.module.ota.dal.mysql.trainingplan.TrainingPlanMapper">
+
+    <!--
+        一般情况下,尽可能使用 Mapper 进行 CRUD 增删改查即可。
+        无法满足的场景,例如说多表关联查询,才使用 XML 编写 SQL。
+        代码生成器暂时只生成 Mapper XML 文件本身,更多推荐 MybatisX 快速开发插件来生成查询。
+        文档可见:https://www.iocoder.cn/MyBatis/x-plugins/
+     -->
+
+</mapper>

+ 12 - 0
ship-module-ota/ship-module-ota-biz/src/main/resources/mapper/trainingscore/TrainingScoreMapper.xml

@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.yc.ship.module.ota.dal.mysql.trainingscore.TrainingScoreMapper">
+
+    <!--
+        一般情况下,尽可能使用 Mapper 进行 CRUD 增删改查即可。
+        无法满足的场景,例如说多表关联查询,才使用 XML 编写 SQL。
+        代码生成器暂时只生成 Mapper XML 文件本身,更多推荐 MybatisX 快速开发插件来生成查询。
+        文档可见:https://www.iocoder.cn/MyBatis/x-plugins/
+     -->
+
+</mapper>