Przeglądaj źródła

add.课程目标达成情况评价依据合理性审核表

caozixuan 8 miesięcy temu
rodzic
commit
3ccf8d858c

+ 7 - 0
distributed-print-business/src/main/resources/db/log/脚本-caozx.sql

@@ -11,3 +11,10 @@ CREATE TABLE obe_course_outline_audit_report (
     rationality_evaluation MEDIUMTEXT NULL COMMENT '合理性评价',
     PRIMARY KEY (id)
 )  ENGINE=INNODB DEFAULT CHARACTER SET=UTF8MB4 COLLATE=utf8mb4_general_ci COMMENT='课程目标达成情况评价依据合理性审核表';
+
+-- 2024-10-09
+INSERT INTO sys_privilege (id, name, url, type, parent_id, sequence, property, enable, default_auth, front_display) VALUES ('3060', '课程大纲-审核', '/api/admin/obe/course_outline/audit_report', 'URL', '3000', '7', 'AUTH', '1', '1', '1');
+INSERT INTO sys_privilege (id, name, url, type, parent_id, sequence, property, enable, default_auth, front_display) VALUES ('3061', '课程大纲-审核及合理性', '/api/admin/obe/course_outline/audit_rationality_report', 'URL', '3000', '8', 'AUTH', '1', '1', '1');
+INSERT INTO sys_privilege (id, name, url, type, parent_id, sequence, property, enable, default_auth, front_display) VALUES ('3062', '课程大纲-审核报告保存', '/api/admin/obe/course_outline/audit/save', 'URL', '3000', '9', 'AUTH', '1', '1', '1');
+INSERT INTO sys_privilege (id, name, url, type, parent_id, sequence, property, related, enable, default_auth, front_display) VALUES ('3063', '审核', 'Audit', 'LINK', '3000', '8', 'AUTH', '3060,3062', '1', '0', '1');
+INSERT INTO sys_privilege (id, name, url, type, parent_id, sequence, property, related, enable, default_auth, front_display) VALUES ('3064', '审核&合理性', 'AuditAndRationality', 'LINK', '3000', '9', 'AUTH', '3061,3062', '1', '0', '1');

+ 47 - 20
distributed-print/src/main/java/com/qmth/distributed/print/api/obe/ObeCourseOutlineController.java

@@ -11,6 +11,8 @@ import com.qmth.teachcloud.common.util.ResultUtil;
 import com.qmth.teachcloud.obe.been.params.ObeCourseOutlineParam;
 import com.qmth.teachcloud.obe.been.result.ObeCourseBasicInfoResult;
 import com.qmth.teachcloud.obe.been.result.ObeCourseOutlineResult;
+import com.qmth.teachcloud.obe.been.result.report.audit.AuditReport;
+import com.qmth.teachcloud.obe.service.ObeCourseOutlineAuditReportService;
 import com.qmth.teachcloud.obe.service.ObeCourseOutlineService;
 import io.swagger.annotations.*;
 import org.springframework.validation.BindingResult;
@@ -37,29 +39,28 @@ public class ObeCourseOutlineController {
     @Resource
     private ObeCourseOutlineService obeCourseOutlineService;
 
+    @Resource
+    private ObeCourseOutlineAuditReportService obeCourseOutlineAuditReportService;
+
     @ApiOperation(value = "课程大纲-查询")
     @RequestMapping(value = "/page", method = RequestMethod.POST)
-    @ApiResponses({@ApiResponse(code = 200, message = "查询成功", response = ObeCourseOutlineResult.class)})
+    @ApiResponses({ @ApiResponse(code = 200, message = "查询成功", response = ObeCourseOutlineResult.class) })
     public Result findObeCourseOutlinePage(@ApiParam(value = "专业id") @RequestParam(required = false) String professionalId,
-                                           @ApiParam(value = "培养方案id") @RequestParam(required = false) String cultureProgramId,
-                                           @ApiParam(value = "课程id") @RequestParam(required = false) String courseId,
-                                           @ApiParam(value = "课程大纲名称(模糊查询)") @RequestParam(required = false) String name,
-                                           @ApiParam(value = "分页页码", required = true) @RequestParam @Min(SystemConstant.PAGE_NUMBER_MIN) Integer pageNumber,
-                                           @ApiParam(value = "分页数", required = true) @RequestParam @Min(SystemConstant.PAGE_SIZE_MIN) @Max(SystemConstant.PAGE_SIZE_MAX) Integer pageSize) {
+            @ApiParam(value = "培养方案id") @RequestParam(required = false) String cultureProgramId, @ApiParam(value = "课程id") @RequestParam(required = false) String courseId,
+            @ApiParam(value = "课程大纲名称(模糊查询)") @RequestParam(required = false) String name, @ApiParam(value = "分页页码", required = true) @RequestParam @Min(SystemConstant.PAGE_NUMBER_MIN) Integer pageNumber,
+            @ApiParam(value = "分页数", required = true) @RequestParam @Min(SystemConstant.PAGE_SIZE_MIN) @Max(SystemConstant.PAGE_SIZE_MAX) Integer pageSize) {
 
         return ResultUtil.ok(obeCourseOutlineService.findObeCourseOutlinePage(SystemConstant.convertIdToLong(professionalId),
-                SystemConstant.convertIdToLong(cultureProgramId), SystemConstant.convertIdToLong(courseId),
-                name, pageNumber, pageSize));
+                SystemConstant.convertIdToLong(cultureProgramId), SystemConstant.convertIdToLong(courseId), name, pageNumber, pageSize));
     }
 
     @ApiOperation(value = "课程考核设置-查询")
     @RequestMapping(value = "/assessment_setting_page", method = RequestMethod.POST)
-    @ApiResponses({@ApiResponse(code = 200, message = "查询成功", response = ObeCourseOutlineResult.class)})
+    @ApiResponses({ @ApiResponse(code = 200, message = "查询成功", response = ObeCourseOutlineResult.class) })
     public Result findAssessmentSettingPage(@ApiParam(value = "专业id") @RequestParam(required = false) String professionalId,
-                                            @ApiParam(value = "培养方案id") @RequestParam(required = false) String cultureProgramId,
-                                            @ApiParam(value = "课程id") @RequestParam(required = false) String courseId,
-                                            @ApiParam(value = "分页页码", required = true) @RequestParam @Min(SystemConstant.PAGE_NUMBER_MIN) Integer pageNumber,
-                                            @ApiParam(value = "分页数", required = true) @RequestParam @Min(SystemConstant.PAGE_SIZE_MIN) @Max(SystemConstant.PAGE_SIZE_MAX) Integer pageSize) {
+            @ApiParam(value = "培养方案id") @RequestParam(required = false) String cultureProgramId, @ApiParam(value = "课程id") @RequestParam(required = false) String courseId,
+            @ApiParam(value = "分页页码", required = true) @RequestParam @Min(SystemConstant.PAGE_NUMBER_MIN) Integer pageNumber,
+            @ApiParam(value = "分页数", required = true) @RequestParam @Min(SystemConstant.PAGE_SIZE_MIN) @Max(SystemConstant.PAGE_SIZE_MAX) Integer pageSize) {
 
         return ResultUtil.ok(obeCourseOutlineService.findObeCourseOutlinePage(SystemConstant.convertIdToLong(professionalId),
                 SystemConstant.convertIdToLong(cultureProgramId), SystemConstant.convertIdToLong(courseId), null, pageNumber, pageSize));
@@ -67,7 +68,7 @@ public class ObeCourseOutlineController {
 
     @ApiOperation(value = "课程大纲-保存")
     @RequestMapping(value = "/save", method = RequestMethod.POST)
-    @ApiResponses({@ApiResponse(code = 200, message = "创建成功", response = EditResult.class)})
+    @ApiResponses({ @ApiResponse(code = 200, message = "创建成功", response = EditResult.class) })
     @OperationLogDetail(detail = "新增课程大纲,参数[{{obeCourseOutlineParam}}]", operationType = OperationTypeEnum.ADD)
     public Result saveObeCourseOutline(@Valid @RequestBody ObeCourseOutlineParam obeCourseOutlineParam, BindingResult bindingResult) {
         if (bindingResult.hasErrors()) {
@@ -79,7 +80,7 @@ public class ObeCourseOutlineController {
 
     @ApiOperation(value = "课程大纲-删除")
     @RequestMapping(value = "/delete", method = RequestMethod.POST)
-    @ApiResponses({@ApiResponse(code = 200, message = "删除成功", response = EditResult.class)})
+    @ApiResponses({ @ApiResponse(code = 200, message = "删除成功", response = EditResult.class) })
     @OperationLogDetail(operationType = OperationTypeEnum.DELETE, detail = "删除操作,课程大纲id:[{{id}}]")
     public Result deleteObeCourseOutline(@ApiParam(value = "选择的要删除的课程大纲id", required = true) @RequestParam String id) {
         obeCourseOutlineService.removeObeCourseOutline(SystemConstant.convertIdToLong(id));
@@ -88,7 +89,7 @@ public class ObeCourseOutlineController {
 
     @ApiOperation(value = "课程考核设置-删除")
     @RequestMapping(value = "/assessment_setting_delete", method = RequestMethod.POST)
-    @ApiResponses({@ApiResponse(code = 200, message = "删除成功", response = EditResult.class)})
+    @ApiResponses({ @ApiResponse(code = 200, message = "删除成功", response = EditResult.class) })
     @OperationLogDetail(operationType = OperationTypeEnum.DELETE, detail = "删除操作,课程大纲id:[{{id}}]")
     public Result deleteAssessmentSetting(@ApiParam(value = "选择的要删除的课程大纲id", required = true) @RequestParam String id) {
         obeCourseOutlineService.removeAssessmentSetting(SystemConstant.convertIdToLong(id));
@@ -97,29 +98,55 @@ public class ObeCourseOutlineController {
 
     @ApiOperation(value = "课程大纲-课程基本信息")
     @RequestMapping(value = "/course_basic_info", method = RequestMethod.POST)
-    @ApiResponses({@ApiResponse(code = 200, message = "查询成功", response = ObeCourseBasicInfoResult.class)})
+    @ApiResponses({ @ApiResponse(code = 200, message = "查询成功", response = ObeCourseBasicInfoResult.class) })
     public Result findCourseBasicInfo(@ApiParam(value = "课程大纲id", required = true) @RequestParam String obeCourseOutlineId) {
         return ResultUtil.ok(obeCourseOutlineService.findCourseBasicInfo(SystemConstant.convertIdToLong(obeCourseOutlineId)));
     }
 
     @ApiOperation(value = "课程大纲-查询课程权重设置状态")
     @RequestMapping(value = "/find_course_weight_setting_status", method = RequestMethod.POST)
-    @ApiResponses({@ApiResponse(code = 200, message = "查询成功", response = Result.class)})
+    @ApiResponses({ @ApiResponse(code = 200, message = "查询成功", response = Result.class) })
     public Result findCourseWeightSettingStatus(@ApiParam(value = "课程大纲id", required = true) @RequestParam String obeCourseOutlineId) {
         return ResultUtil.ok(obeCourseOutlineService.findCourseWeightSettingStatus(SystemConstant.convertIdToLong(obeCourseOutlineId)));
     }
 
     @ApiOperation(value = "课程大纲-查询可选择的培养方案")
     @RequestMapping(value = "/can_choose_culture_program", method = RequestMethod.POST)
-    @ApiResponses({@ApiResponse(code = 200, message = "查询成功", response = DictionaryResult.class)})
+    @ApiResponses({ @ApiResponse(code = 200, message = "查询成功", response = DictionaryResult.class) })
     public Result findCanChooseCultureProgram() {
         return ResultUtil.ok(obeCourseOutlineService.findCanChooseCultureProgram());
     }
 
     @ApiOperation(value = "课程大纲-查询可选择的课程")
     @RequestMapping(value = "/can_choose_course", method = RequestMethod.POST)
-    @ApiResponses({@ApiResponse(code = 200, message = "查询成功", response = DictionaryResult.class)})
+    @ApiResponses({ @ApiResponse(code = 200, message = "查询成功", response = DictionaryResult.class) })
     public Result findCanChooseCourse(@ApiParam(value = "培养方案id", required = true) @RequestParam String cultureProgramId) {
         return ResultUtil.ok(obeCourseOutlineService.findCanChooseCourse(SystemConstant.convertIdToLong(cultureProgramId)));
     }
+
+    @ApiOperation(value = "课程大纲-审核")
+    @RequestMapping(value = "/audit_report", method = RequestMethod.POST)
+    @ApiResponses({ @ApiResponse(code = 200, message = "查询成功", response = AuditReport.class) })
+    public Result auditReport(@ApiParam(value = "课程大纲id") @RequestParam(required = false) Long obeCourseOutlineId) {
+        return ResultUtil.ok(obeCourseOutlineAuditReportService.getOrBuildAuditReport(obeCourseOutlineId, false));
+    }
+
+    @ApiOperation(value = "课程大纲-审核及合理性")
+    @RequestMapping(value = "/audit_rationality_report", method = RequestMethod.POST)
+    @ApiResponses({ @ApiResponse(code = 200, message = "查询成功", response = AuditReport.class) })
+    public Result auditRationalityReport(@ApiParam(value = "课程大纲id") @RequestParam(required = false) Long obeCourseOutlineId) {
+        return ResultUtil.ok(obeCourseOutlineAuditReportService.getOrBuildAuditReport(obeCourseOutlineId, true));
+    }
+
+    @ApiOperation(value = "课程大纲-审核报告保存")
+    @RequestMapping(value = "/audit/save", method = RequestMethod.POST)
+    @ApiResponses({ @ApiResponse(code = 200, message = "查询成功", response = Result.class) })
+    @OperationLogDetail(detail = "课程大纲审核报告保存,参数:课程大纲id[{{auditReport.courseOutlineId}}]", operationType = OperationTypeEnum.ADD)
+    public Result auditReport(@Valid @RequestBody AuditReport auditReport, BindingResult bindingResult) {
+        if (bindingResult.hasErrors()) {
+            return ResultUtil.error(bindingResult.getAllErrors().get(0).getDefaultMessage());
+        }
+        obeCourseOutlineAuditReportService.saveReport(auditReport);
+        return ResultUtil.ok();
+    }
 }

+ 37 - 0
teachcloud-obe/src/main/java/com/qmth/teachcloud/obe/been/result/report/audit/AuditReport.java

@@ -1,6 +1,12 @@
 package com.qmth.teachcloud.obe.been.result.report.audit;
 
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
 import io.swagger.annotations.ApiModelProperty;
+import org.hibernate.validator.constraints.Range;
+
+import javax.validation.constraints.NotEmpty;
+import javax.validation.constraints.NotNull;
 
 /**
  * @Description: 课程目标达成情况评价依据合理性审核表
@@ -8,15 +14,46 @@ import io.swagger.annotations.ApiModelProperty;
  * @Date: 2024-10-08
  */
 public class AuditReport {
+
+    @ApiModelProperty("id")
+    @JsonSerialize(using = ToStringSerializer.class)
+    @NotNull(message = "缺少id")
+    @Range(min = 1L, message = "缺少id")
+    private Long id;
+
+    @ApiModelProperty("课程大纲id")
+    @JsonSerialize(using = ToStringSerializer.class)
+    @NotNull(message = "缺少课程大纲id")
+    @Range(min = 1L, message = "缺少课程大纲id")
+    private Long courseOutlineId;
+
     @ApiModelProperty("课程基础信息")
+    @NotEmpty(message = "缺少报表课程基本信息")
     private CourseBasicInfo courseBasicInfo;
 
     @ApiModelProperty("课程目标情况")
+    @NotEmpty(message = "缺少报表课程目标情况")
     private CourseTargetInfo courseTargetInfo;
 
     @ApiModelProperty("合理性评价")
     private RationalityEvaluation rationalityEvaluation;
 
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public Long getCourseOutlineId() {
+        return courseOutlineId;
+    }
+
+    public void setCourseOutlineId(Long courseOutlineId) {
+        this.courseOutlineId = courseOutlineId;
+    }
+
     public CourseBasicInfo getCourseBasicInfo() {
         return courseBasicInfo;
     }

+ 10 - 10
teachcloud-obe/src/main/java/com/qmth/teachcloud/obe/been/result/report/audit/CourseEvaluate.java

@@ -15,10 +15,10 @@ public class CourseEvaluate {
     private String name;
 
     @ApiModelProperty("过程性评价")
-    private List<EvaluateInfo> procedureEvaluateLit;
+    private List<EvaluateInfo> procedureEvaluateList;
 
     @ApiModelProperty("终结性评价")
-    private EvaluateInfo finalityEvaluate;
+    private List<EvaluateInfo> finalityEvaluateList;
 
     public String getName() {
         return name;
@@ -28,20 +28,20 @@ public class CourseEvaluate {
         this.name = name;
     }
 
-    public List<EvaluateInfo> getProcedureEvaluateLit() {
-        return procedureEvaluateLit;
+    public List<EvaluateInfo> getProcedureEvaluateList() {
+        return procedureEvaluateList;
     }
 
-    public void setProcedureEvaluateLit(List<EvaluateInfo> procedureEvaluateLit) {
-        this.procedureEvaluateLit = procedureEvaluateLit;
+    public void setProcedureEvaluateList(List<EvaluateInfo> procedureEvaluateList) {
+        this.procedureEvaluateList = procedureEvaluateList;
     }
 
-    public EvaluateInfo getFinalityEvaluate() {
-        return finalityEvaluate;
+    public List<EvaluateInfo> getFinalityEvaluateList() {
+        return finalityEvaluateList;
     }
 
-    public void setFinalityEvaluate(EvaluateInfo finalityEvaluate) {
-        this.finalityEvaluate = finalityEvaluate;
+    public void setFinalityEvaluateList(List<EvaluateInfo> finalityEvaluateList) {
+        this.finalityEvaluateList = finalityEvaluateList;
     }
 }
 

+ 73 - 0
teachcloud-obe/src/main/java/com/qmth/teachcloud/obe/been/result/report/audit/ObeCourseWeightInfo.java

@@ -0,0 +1,73 @@
+package com.qmth.teachcloud.obe.been.result.report.audit;
+
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
+import com.qmth.teachcloud.obe.enums.CourseEvaluationTypeEnum;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.math.BigDecimal;
+
+/**
+ * @Description: 课程目标权重结果
+ * @Author: CaoZixuan
+ * @Date: 2024-10-09
+ */
+public class ObeCourseWeightInfo {
+
+    @ApiModelProperty("目标id")
+    @JsonSerialize(using = ToStringSerializer.class)
+    private Long targetId;
+
+    @ApiModelProperty("评价方式id")
+    @JsonSerialize(using = ToStringSerializer.class)
+    private Long evaluateId;
+
+    @ApiModelProperty("评价类型")
+    private CourseEvaluationTypeEnum type;
+
+    @ApiModelProperty("形式与内容")
+    private String evaluation;
+
+    @ApiModelProperty("权重分值")
+    private BigDecimal weight;
+
+    public Long getTargetId() {
+        return targetId;
+    }
+
+    public void setTargetId(Long targetId) {
+        this.targetId = targetId;
+    }
+
+    public Long getEvaluateId() {
+        return evaluateId;
+    }
+
+    public void setEvaluateId(Long evaluateId) {
+        this.evaluateId = evaluateId;
+    }
+
+    public CourseEvaluationTypeEnum getType() {
+        return type;
+    }
+
+    public void setType(CourseEvaluationTypeEnum type) {
+        this.type = type;
+    }
+
+    public String getEvaluation() {
+        return evaluation;
+    }
+
+    public void setEvaluation(String evaluation) {
+        this.evaluation = evaluation;
+    }
+
+    public BigDecimal getWeight() {
+        return weight;
+    }
+
+    public void setWeight(BigDecimal weight) {
+        this.weight = weight;
+    }
+}

+ 15 - 0
teachcloud-obe/src/main/java/com/qmth/teachcloud/obe/been/result/report/audit/RationalityEvaluation.java

@@ -2,6 +2,7 @@ package com.qmth.teachcloud.obe.been.result.report.audit;
 
 import io.swagger.annotations.ApiModelProperty;
 
+import java.util.ArrayList;
 import java.util.List;
 
 /**
@@ -76,4 +77,18 @@ public class RationalityEvaluation {
     public void setAuditDate(Long auditDate) {
         this.auditDate = auditDate;
     }
+
+    /**
+     * 初始化评价内容集合
+     */
+    public void initRationalityEvaluationDetailList() {
+        List<RationalityEvaluationDetail> rationalityEvaluationDetailList = new ArrayList<>();
+        rationalityEvaluationDetailList.add(new RationalityEvaluationDetail(1, "课程评价落实教学大纲情况"));
+        rationalityEvaluationDetailList.add(new RationalityEvaluationDetail(2, "评价形式是否合理(是否采用全过程、多元化形式开展评价)"));
+        rationalityEvaluationDetailList.add(new RationalityEvaluationDetail(3, "评价内容是否合理(是否能够覆盖课程目标的要求)"));
+        rationalityEvaluationDetailList.add(new RationalityEvaluationDetail(4, "评价内容是否合理(是否能够有效评价课程目标的达成情况)"));
+        rationalityEvaluationDetailList.add(new RationalityEvaluationDetail(5, "评价结果是否合理(是否能客观反映课程目标达成情况)"));
+        rationalityEvaluationDetailList.add(new RationalityEvaluationDetail(null, "合理性总体评价"));
+        this.setRationalityEvaluationDetailList(rationalityEvaluationDetailList);
+    }
 }

+ 44 - 7
teachcloud-obe/src/main/java/com/qmth/teachcloud/obe/been/result/report/audit/RationalityEvaluationDetail.java

@@ -1,6 +1,5 @@
 package com.qmth.teachcloud.obe.been.result.report.audit;
 
-import com.qmth.teachcloud.obe.enums.EvaluationLevelEnum;
 import io.swagger.annotations.ApiModelProperty;
 
 /**
@@ -16,8 +15,30 @@ public class RationalityEvaluationDetail {
     @ApiModelProperty("评价内容")
     private String content;
 
-    @ApiModelProperty("等级")
-    private EvaluationLevelEnum level;
+    @ApiModelProperty("合理")
+    private Boolean reasonable;
+
+    @ApiModelProperty("较合理")
+    private Boolean middle;
+
+    @ApiModelProperty("不合理")
+    private Boolean unreasonable;
+
+    public RationalityEvaluationDetail() {
+    }
+
+    public RationalityEvaluationDetail(Integer index, String content) {
+        this.index = index;
+        this.content = content;
+    }
+
+    public Integer getIndex() {
+        return index;
+    }
+
+    public void setIndex(Integer index) {
+        this.index = index;
+    }
 
     public String getContent() {
         return content;
@@ -27,11 +48,27 @@ public class RationalityEvaluationDetail {
         this.content = content;
     }
 
-    public EvaluationLevelEnum getLevel() {
-        return level;
+    public Boolean getReasonable() {
+        return reasonable;
+    }
+
+    public void setReasonable(Boolean reasonable) {
+        this.reasonable = reasonable;
+    }
+
+    public Boolean getMiddle() {
+        return middle;
+    }
+
+    public void setMiddle(Boolean middle) {
+        this.middle = middle;
+    }
+
+    public Boolean getUnreasonable() {
+        return unreasonable;
     }
 
-    public void setLevel(EvaluationLevelEnum level) {
-        this.level = level;
+    public void setUnreasonable(Boolean unreasonable) {
+        this.unreasonable = unreasonable;
     }
 }

+ 3 - 0
teachcloud-obe/src/main/java/com/qmth/teachcloud/obe/entity/ObeCourseWeight.java

@@ -26,12 +26,15 @@ public class ObeCourseWeight extends BaseEntity {
     private Long obeCourseOutlineId;
 
     @ApiModelProperty(value = "学校id")
+    @JsonSerialize(using = ToStringSerializer.class)
     private Long schoolId;
 
     @ApiModelProperty(value = "课程目标表id")
+    @JsonSerialize(using = ToStringSerializer.class)
     private Long targetId;
 
     @ApiModelProperty(value = "课程评价表id")
+    @JsonSerialize(using = ToStringSerializer.class)
     private Long evaluationId;
 
     @ApiModelProperty(value = "使用状态 1:使用 0:未使用")

+ 0 - 20
teachcloud-obe/src/main/java/com/qmth/teachcloud/obe/enums/EvaluationLevelEnum.java

@@ -1,20 +0,0 @@
-package com.qmth.teachcloud.obe.enums;
-
-/**
- * @Description: 评价等级
- * @Author: CaoZixuan
- * @Date: 2024-10-08
- */
-public enum EvaluationLevelEnum {
-    A("合理"), B("较合理"), C("不合理");
-
-    private final String desc;
-
-    EvaluationLevelEnum(String desc) {
-        this.desc = desc;
-    }
-
-    public String getDesc() {
-        return desc;
-    }
-}

+ 20 - 0
teachcloud-obe/src/main/java/com/qmth/teachcloud/obe/mapper/ObeCourseOutlineAuditReportMapper.java

@@ -1,7 +1,12 @@
 package com.qmth.teachcloud.obe.mapper;
 
+import com.qmth.teachcloud.obe.been.result.report.audit.CourseBasicInfo;
+import com.qmth.teachcloud.obe.been.result.report.audit.ObeCourseWeightInfo;
 import com.qmth.teachcloud.obe.entity.ObeCourseOutlineAuditReport;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
 
 /**
  * <p>
@@ -13,4 +18,19 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
  */
 public interface ObeCourseOutlineAuditReportMapper extends BaseMapper<ObeCourseOutlineAuditReport> {
 
+    /**
+     * 查询课程基本信息
+     *
+     * @param courseOutlineId 课程大纲
+     * @return 课程基本信息
+     */
+    CourseBasicInfo findCourseBasicInfo(@Param("courseOutlineId") Long courseOutlineId);
+
+    /**
+     * 查询课程权重详细信息
+     *
+     * @param courseOutlineId 课程大纲
+     * @return 课程权重详细信息
+     */
+    List<ObeCourseWeightInfo> findCourseWeightInfo(@Param("courseOutlineId") Long courseOutlineId);
 }

+ 44 - 0
teachcloud-obe/src/main/java/com/qmth/teachcloud/obe/service/ObeCourseOutlineAuditReportService.java

@@ -1,5 +1,9 @@
 package com.qmth.teachcloud.obe.service;
 
+import com.qmth.teachcloud.obe.been.result.report.audit.AuditReport;
+import com.qmth.teachcloud.obe.been.result.report.audit.CourseBasicInfo;
+import com.qmth.teachcloud.obe.been.result.report.audit.CourseTargetInfo;
+import com.qmth.teachcloud.obe.been.result.report.audit.RationalityEvaluation;
 import com.qmth.teachcloud.obe.entity.ObeCourseOutlineAuditReport;
 import com.baomidou.mybatisplus.extension.service.IService;
 
@@ -13,4 +17,44 @@ import com.baomidou.mybatisplus.extension.service.IService;
  */
 public interface ObeCourseOutlineAuditReportService extends IService<ObeCourseOutlineAuditReport> {
 
+    /**
+     * 获取或生成审核报告
+     *
+     * @param courseOutlineId 课程大纲id
+     * @param rationality     展示合理性评价部分
+     * @return 审核报告
+     */
+    AuditReport getOrBuildAuditReport(Long courseOutlineId, boolean rationality);
+
+    /**
+     * 获取课程基本信息
+     *
+     * @param courseOutlineId 课程大纲id
+     * @return 课程基本信息
+     */
+    CourseBasicInfo getCourseBasicInfo(Long courseOutlineId);
+
+    /**
+     * 获取课程目标信息
+     *
+     * @param courseOutlineId 课程大纲id
+     * @return 获取课程目标信息
+     */
+    CourseTargetInfo getCourseTargetInfo(Long courseOutlineId);
+
+    /**
+     * 获取课程目标合理性评价
+     *
+     * @param courseOutlineId 课程大纲id
+     * @return 获取课程目标合理性评价
+     */
+    RationalityEvaluation getRationalityEvaluation(Long courseOutlineId);
+
+    /**
+     * 保存审核报告
+     *
+     * @param auditReport 审核报告
+     * @return id
+     */
+    Long saveReport(AuditReport auditReport);
 }

+ 206 - 1
teachcloud-obe/src/main/java/com/qmth/teachcloud/obe/service/impl/ObeCourseOutlineAuditReportServiceImpl.java

@@ -1,10 +1,29 @@
 package com.qmth.teachcloud.obe.service.impl;
 
+import com.alibaba.fastjson.JSON;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.qmth.teachcloud.common.contant.SystemConstant;
+import com.qmth.teachcloud.common.enums.ExceptionResultEnum;
+import com.qmth.teachcloud.obe.been.result.report.audit.*;
+import com.qmth.teachcloud.obe.entity.ObeCourseOutline;
 import com.qmth.teachcloud.obe.entity.ObeCourseOutlineAuditReport;
+import com.qmth.teachcloud.obe.entity.ObeCourseTarget;
+import com.qmth.teachcloud.obe.enums.CourseEvaluationTypeEnum;
 import com.qmth.teachcloud.obe.mapper.ObeCourseOutlineAuditReportMapper;
 import com.qmth.teachcloud.obe.service.ObeCourseOutlineAuditReportService;
-import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.qmth.teachcloud.obe.service.ObeCourseOutlineService;
+import com.qmth.teachcloud.obe.service.ObeCourseTargetService;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import javax.annotation.Resource;
+import java.math.BigDecimal;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Objects;
+import java.util.stream.Collectors;
 
 /**
  * <p>
@@ -17,4 +36,190 @@ import org.springframework.stereotype.Service;
 @Service
 public class ObeCourseOutlineAuditReportServiceImpl extends ServiceImpl<ObeCourseOutlineAuditReportMapper, ObeCourseOutlineAuditReport> implements ObeCourseOutlineAuditReportService {
 
+    @Resource
+    private ObeCourseOutlineService obeCourseOutlineService;
+
+    @Resource
+    private ObeCourseTargetService obeCourseTargetService;
+
+    @Transactional
+    @Override
+    public AuditReport getOrBuildAuditReport(Long courseOutlineId, boolean rationality) {
+        AuditReport result = new AuditReport();
+        ObeCourseOutline obeCourseOutline = obeCourseOutlineService.getById(courseOutlineId);
+        if (Objects.isNull(obeCourseOutline)) {
+            throw ExceptionResultEnum.ERROR.exception("课程大纲不存在");
+        }
+
+        ObeCourseOutlineAuditReport dbReport = this.getOne(new QueryWrapper<ObeCourseOutlineAuditReport>().lambda().eq(ObeCourseOutlineAuditReport::getCourseOutlineId, courseOutlineId).last(SystemConstant.LIMIT1));
+        if (Objects.nonNull(dbReport)) {
+            // 曾生成过报告 -> 组装报告
+            Long auditSign = dbReport.getWeightSettingSign();
+            Long outlineSign = obeCourseOutline.getWeightSettingSign();
+
+            String courseBasicInfoStr = dbReport.getCourseBasicInfo();
+            String courseTargetInfoStr = dbReport.getCourseTargetInfo();
+            String rationalityEvaluationStr = dbReport.getRationalityEvaluation();
+
+            CourseBasicInfo courseBasicInfo = JSON.parseObject(courseBasicInfoStr, CourseBasicInfo.class);
+            CourseTargetInfo courseTargetInfo = JSON.parseObject(courseTargetInfoStr, CourseTargetInfo.class);
+            RationalityEvaluation rationalityEvaluation = JSON.parseObject(rationalityEvaluationStr,
+                    RationalityEvaluation.class);
+
+            if (!Objects.equals(auditSign, outlineSign)) {
+                // 权重设置有变化 -> 重新生成权重信息
+                courseTargetInfo = this.getCourseTargetInfo(courseOutlineId);
+            }
+            if (rationality && Objects.isNull(rationalityEvaluation)) {
+                // 如果缺少合理性信息 -> 重新生成
+                rationalityEvaluation = this.getRationalityEvaluation(courseOutlineId);
+            }
+            if (Objects.isNull(courseTargetInfo.getDate())) {
+                courseTargetInfo.setDate(System.currentTimeMillis());
+            }
+            if (Objects.nonNull(rationalityEvaluation)) {
+                if (Objects.isNull(rationalityEvaluation.getAuditDate())) {
+                    rationalityEvaluation.setAuditDate(System.currentTimeMillis());
+                }
+                if (Objects.isNull(rationalityEvaluation.getEvaluateDate())) {
+                    rationalityEvaluation.setEvaluateDate(System.currentTimeMillis());
+                }
+            }
+
+            result.setCourseBasicInfo(courseBasicInfo);
+            result.setCourseTargetInfo(courseTargetInfo);
+            result.setRationalityEvaluation(rationalityEvaluation);
+            result.setId(dbReport.getId());
+        } else {
+            // 还未生成过报告 -> 直接生成
+            result.setCourseBasicInfo(this.getCourseBasicInfo(courseOutlineId));
+            result.setCourseTargetInfo(this.getCourseTargetInfo(courseOutlineId));
+            RationalityEvaluation rationalityEvaluation = new RationalityEvaluation();
+            if (rationality) {
+                rationalityEvaluation = this.getRationalityEvaluation(courseOutlineId);
+            }
+            result.setRationalityEvaluation(rationalityEvaluation);
+        }
+        result.setCourseOutlineId(courseOutlineId);
+        result.setId(this.saveReport(result));
+        return result;
+    }
+
+    @Transactional
+    @Override
+    public CourseBasicInfo getCourseBasicInfo(Long courseOutlineId) {
+        return this.baseMapper.findCourseBasicInfo(courseOutlineId);
+    }
+
+    @Override
+    public CourseTargetInfo getCourseTargetInfo(Long courseOutlineId) {
+        CourseTargetInfo result = new CourseTargetInfo();
+        BigDecimal procedureTotalWeight = new BigDecimal(0);
+        BigDecimal finalityTotalWeight = new BigDecimal(0);
+        List<CourseEvaluate> courseEvaluateList = new ArrayList<>();
+
+        List<ObeCourseTarget> obeCourseTargetList = obeCourseTargetService.list(
+                new QueryWrapper<ObeCourseTarget>().lambda().eq(ObeCourseTarget::getObeCourseOutlineId, courseOutlineId));
+        List<ObeCourseWeightInfo> obeCourseWeightDatasource = this.baseMapper.findCourseWeightInfo(courseOutlineId);
+
+        for (ObeCourseTarget obeCourseTarget : obeCourseTargetList) {
+            Long targetId = obeCourseTarget.getId();
+            String targetName = obeCourseTarget.getTargetName();
+            // 过程性评价数据
+            List<ObeCourseWeightInfo> obeCourseWeighList = obeCourseWeightDatasource.stream()
+                    .filter(e -> targetId.equals(e.getTargetId())).collect(Collectors.toList());
+            List<EvaluateInfo> procedureEvaluateList = new ArrayList<>();
+            List<EvaluateInfo> finalityEvaluateList = new ArrayList<>();
+            for (ObeCourseWeightInfo obeCourseWeightInfo : obeCourseWeighList) {
+                BigDecimal weight = obeCourseWeightInfo.getWeight();
+                String evaluation = obeCourseWeightInfo.getEvaluation();
+                CourseEvaluationTypeEnum type = obeCourseWeightInfo.getType();
+                EvaluateInfo evaluateInfo = new EvaluateInfo();
+                evaluateInfo.setContent(evaluation);
+                evaluateInfo.setScore(weight);
+                if (CourseEvaluationTypeEnum.CUSTOM.equals(type)) {
+                    procedureEvaluateList.add(evaluateInfo);
+                    procedureTotalWeight = procedureTotalWeight.add(weight);
+                } else {
+                    finalityEvaluateList.add(evaluateInfo);
+                    finalityTotalWeight = finalityTotalWeight.add(weight);
+                }
+            }
+
+            CourseEvaluate courseEvaluate = new CourseEvaluate();
+            courseEvaluate.setName(targetName);
+            courseEvaluate.setProcedureEvaluateList(procedureEvaluateList);
+            courseEvaluate.setFinalityEvaluateList(finalityEvaluateList);
+            courseEvaluateList.add(courseEvaluate);
+        }
+        result.setCourseEvaluateList(courseEvaluateList);
+        result.setProceduralTotalScore(procedureTotalWeight);
+        result.setFinalityTotalScore(finalityTotalWeight);
+        result.setDate(System.currentTimeMillis());
+        return result;
+    }
+
+    @Override
+    public RationalityEvaluation getRationalityEvaluation(Long courseOutlineId) {
+        RationalityEvaluation result = new RationalityEvaluation();
+        result.initRationalityEvaluationDetailList();
+        result.setEvaluateDate(System.currentTimeMillis());
+        result.setAuditDate(System.currentTimeMillis());
+        return result;
+    }
+
+    @Transactional
+    @Override
+    public Long saveReport(AuditReport auditReport) {
+        Long courseOutlineId = auditReport.getCourseOutlineId();
+        ObeCourseOutline obeCourseOutline = obeCourseOutlineService.getById(courseOutlineId);
+        if (Objects.isNull(obeCourseOutline)) {
+            throw ExceptionResultEnum.ERROR.exception("未找到课程大纲");
+        }
+        Long weightSettingSign = obeCourseOutline.getWeightSettingSign();
+        CourseBasicInfo courseBasicInfo = auditReport.getCourseBasicInfo();
+        CourseTargetInfo courseTargetInfo = auditReport.getCourseTargetInfo();
+        RationalityEvaluation rationalityEvaluation = auditReport.getRationalityEvaluation();
+
+        if (Objects.isNull(courseTargetInfo.getCourseManager())) {
+            courseTargetInfo.setDate(null);
+        }
+        if (Objects.nonNull(rationalityEvaluation)) {
+            if (Objects.isNull(rationalityEvaluation.getAuditor())) {
+                rationalityEvaluation.setAuditDate(null);
+            }
+            if (Objects.isNull(rationalityEvaluation.getProfessionalManager())) {
+                rationalityEvaluation.setEvaluateDate(null);
+            }
+        }
+
+        ObeCourseOutlineAuditReport obeCourseOutlineAuditReport = new ObeCourseOutlineAuditReport();
+        Long id = auditReport.getId();
+        if (Objects.isNull(id)) {
+            // 新增
+            id = SystemConstant.getDbUuid();
+            obeCourseOutlineAuditReport.setId(id);
+            obeCourseOutlineAuditReport.setCourseOutlineId(courseOutlineId);
+            obeCourseOutlineAuditReport.setWeightSettingSign(weightSettingSign);
+            obeCourseOutlineAuditReport.setCourseBasicInfo(JSON.toJSONString(courseBasicInfo));
+            obeCourseOutlineAuditReport.setCourseTargetInfo(JSON.toJSONString(courseTargetInfo));
+            if (Objects.nonNull(rationalityEvaluation)) {
+                obeCourseOutlineAuditReport.setRationalityEvaluation(JSON.toJSONString(rationalityEvaluation));
+            }
+            this.save(obeCourseOutlineAuditReport);
+        } else {
+            // 编辑
+            UpdateWrapper<ObeCourseOutlineAuditReport> updateWrapper = new UpdateWrapper<>();
+            updateWrapper.lambda().eq(ObeCourseOutlineAuditReport::getId, id)
+                    .set(ObeCourseOutlineAuditReport::getCourseOutlineId, courseOutlineId)
+                    .set(ObeCourseOutlineAuditReport::getWeightSettingSign, weightSettingSign)
+                    .set(ObeCourseOutlineAuditReport::getCourseBasicInfo, JSON.toJSONString(courseBasicInfo))
+                    .set(ObeCourseOutlineAuditReport::getCourseTargetInfo, JSON.toJSONString(courseTargetInfo));
+            if (Objects.nonNull(rationalityEvaluation)) {
+                updateWrapper.lambda().set(ObeCourseOutlineAuditReport::getRationalityEvaluation, JSON.toJSONString(rationalityEvaluation));
+            }
+            this.update(updateWrapper);
+        }
+        return id;
+    }
 }

+ 42 - 0
teachcloud-obe/src/main/resources/mapper/ObeCourseOutlineAuditReportMapper.xml

@@ -2,4 +2,46 @@
 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 <mapper namespace="com.qmth.teachcloud.obe.mapper.ObeCourseOutlineAuditReportMapper">
 
+    <select id="findCourseBasicInfo"
+            resultType="com.qmth.teachcloud.obe.been.result.report.audit.CourseBasicInfo">
+        SELECT
+            bc.code AS courseCode,
+            bc.name AS courseName,
+            bs.name AS semester,
+            bp.name AS professional
+        FROM
+            obe_course_outline oco
+                LEFT JOIN
+            basic_course bc ON oco.course_id = bc.id
+                LEFT JOIN
+            basic_semester bs ON oco.semester_id = bs.id
+                LEFT JOIN
+            obe_culture_program ocp ON oco.culture_program_id = ocp.id
+                LEFT JOIN
+            basic_professional bp ON ocp.professional_id = bp.id
+        <where>
+            <if test="courseOutlineId != null">
+                AND oco.id = #{courseOutlineId}
+            </if>
+        </where>
+    </select>
+    <select id="findCourseWeightInfo"
+            resultType="com.qmth.teachcloud.obe.been.result.report.audit.ObeCourseWeightInfo">
+        SELECT
+            ocw.target_id AS targetId,
+            ocw.evaluation_id AS evaluationId,
+            oce.type AS type,
+            oce.evaluation AS evaluation,
+            ocw.weight AS weight
+        FROM
+            obe_course_weight ocw
+                LEFT JOIN
+            obe_course_evaluation oce ON ocw.evaluation_id = oce.id
+        <where>
+            AND ocw.enable
+            <if test="courseOutlineId != null">
+                AND ocw.obe_course_outline_id = #{courseOutlineId}
+            </if>
+        </where>
+    </select>
 </mapper>