From a600627f4c5a5c0d3a8e536c0f0775cd9392b285 Mon Sep 17 00:00:00 2001 From: wuzhen <52326163@qq.com> Date: Mon, 18 Aug 2025 15:48:34 +0800 Subject: [PATCH] wuzhen update --- .../ZsjyInternshipMonthlyController.java | 1 + ...ZsjyInternshipMonthlyReviewController.java | 159 +++++ .../zsjy/domain/ZsjyInternshipMonthly.java | 6 + .../domain/bo/ZsjyInternshipMonthlyAddBo.java | 1 + .../ZsjyInternshipMonthlyBatchReviewBo.java | 79 +++ .../bo/ZsjyInternshipMonthlyReviewBo.java | 61 ++ .../ZsjyInternshipMonthlyReviewQueryBo.java | 79 +++ .../domain/vo/ZsjyInternshipMonthlyVo.java | 19 + .../mapper/ZsjyInternshipMonthlyMapper.java | 54 ++ .../IZsjyInternshipMonthlyReviewService.java | 103 +++ .../IZsjyInternshipMonthlyService.java | 1 + ...sjyInternshipMonthlyReviewServiceImpl.java | 269 ++++++++ .../mapper/ZsjyInternshipMonthlyMapper.xml | 159 ++++- web/src/api/zsjy/internshipMonthly.ts | 1 + web/src/api/zsjy/internshipMonthlyReview.ts | 154 +++++ web/src/api/zsjy/types.ts | 195 ++++++ .../views/zsjy/internship/pmonthly/detail.vue | 1 + .../views/zsjy/internship/pmonthly/review.vue | 546 ++++++++++++++++ .../components/BatchReviewForm.vue | 395 ++++++++++++ .../pmonthreview/components/ReviewDetail.vue | 330 ++++++++++ .../pmonthreview/components/ReviewForm.vue | 383 ++++++++++++ .../zsjy/internship/pmonthreview/index.vue | 589 ++++++++++++++++++ 22 files changed, 3582 insertions(+), 3 deletions(-) create mode 100644 backend/ruoyi-modules/ruoyi-zsjy/src/main/java/org/dromara/zsjy/controller/ZsjyInternshipMonthlyReviewController.java create mode 100644 backend/ruoyi-modules/ruoyi-zsjy/src/main/java/org/dromara/zsjy/domain/bo/ZsjyInternshipMonthlyBatchReviewBo.java create mode 100644 backend/ruoyi-modules/ruoyi-zsjy/src/main/java/org/dromara/zsjy/domain/bo/ZsjyInternshipMonthlyReviewBo.java create mode 100644 backend/ruoyi-modules/ruoyi-zsjy/src/main/java/org/dromara/zsjy/domain/bo/ZsjyInternshipMonthlyReviewQueryBo.java create mode 100644 backend/ruoyi-modules/ruoyi-zsjy/src/main/java/org/dromara/zsjy/service/IZsjyInternshipMonthlyReviewService.java create mode 100644 backend/ruoyi-modules/ruoyi-zsjy/src/main/java/org/dromara/zsjy/service/impl/ZsjyInternshipMonthlyReviewServiceImpl.java create mode 100644 web/src/api/zsjy/internshipMonthlyReview.ts create mode 100644 web/src/views/zsjy/internship/pmonthly/review.vue create mode 100644 web/src/views/zsjy/internship/pmonthreview/components/BatchReviewForm.vue create mode 100644 web/src/views/zsjy/internship/pmonthreview/components/ReviewDetail.vue create mode 100644 web/src/views/zsjy/internship/pmonthreview/components/ReviewForm.vue create mode 100644 web/src/views/zsjy/internship/pmonthreview/index.vue diff --git a/backend/ruoyi-modules/ruoyi-zsjy/src/main/java/org/dromara/zsjy/controller/ZsjyInternshipMonthlyController.java b/backend/ruoyi-modules/ruoyi-zsjy/src/main/java/org/dromara/zsjy/controller/ZsjyInternshipMonthlyController.java index 996a1112..a53fe8cc 100644 --- a/backend/ruoyi-modules/ruoyi-zsjy/src/main/java/org/dromara/zsjy/controller/ZsjyInternshipMonthlyController.java +++ b/backend/ruoyi-modules/ruoyi-zsjy/src/main/java/org/dromara/zsjy/controller/ZsjyInternshipMonthlyController.java @@ -236,3 +236,4 @@ public class ZsjyInternshipMonthlyController extends BaseController { } } + \ No newline at end of file diff --git a/backend/ruoyi-modules/ruoyi-zsjy/src/main/java/org/dromara/zsjy/controller/ZsjyInternshipMonthlyReviewController.java b/backend/ruoyi-modules/ruoyi-zsjy/src/main/java/org/dromara/zsjy/controller/ZsjyInternshipMonthlyReviewController.java new file mode 100644 index 00000000..93f58450 --- /dev/null +++ b/backend/ruoyi-modules/ruoyi-zsjy/src/main/java/org/dromara/zsjy/controller/ZsjyInternshipMonthlyReviewController.java @@ -0,0 +1,159 @@ +package org.dromara.zsjy.controller; + +import cn.dev33.satoken.annotation.SaCheckPermission; +import org.dromara.common.core.domain.R; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.excel.utils.ExcelUtil; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.web.core.BaseController; + +import jakarta.servlet.http.HttpServletResponse; +import org.dromara.zsjy.domain.bo.ZsjyInternshipMonthlyBatchReviewBo; +import org.dromara.zsjy.domain.bo.ZsjyInternshipMonthlyReviewBo; +import org.dromara.zsjy.domain.bo.ZsjyInternshipMonthlyReviewQueryBo; +import org.dromara.zsjy.domain.vo.ZsjyInternshipMonthlyVo; +import org.dromara.zsjy.service.IZsjyInternshipMonthlyReviewService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.tags.Tag; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.List; +import java.util.Map; + +/** + * 学生月度实习总结审核Controller + * + * @author system + * @date 2025-01-27 + */ +@Slf4j +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/zsjy/internship/monthly/review") +@Tag(name = "学生月度实习总结审核", description = "班主任审核学生月度实习总结管理") +public class ZsjyInternshipMonthlyReviewController extends BaseController { + + private final IZsjyInternshipMonthlyReviewService reviewService; + + /** + * 查询待审核的学生月度实习总结列表 + */ + @Operation(summary = "查询待审核的学生月度实习总结列表", description = "班主任查看待审核的月度总结列表") + @SaCheckPermission("zsjy:internshipmonthly:review") + @GetMapping("/pending") + public TableDataInfo listPending(@Validated ZsjyInternshipMonthlyReviewQueryBo queryBo, PageQuery pageQuery) { + log.info("=== 审核Controller层调试 ==="); + log.info("接口被调用: /zsjy/internship/monthly/review/pending"); + log.info("查询参数: {}", queryBo); + log.info("分页参数: {}", pageQuery); + + return reviewService.queryPendingPageList(queryBo, pageQuery); + } + + /** + * 查询所有审核记录列表 (包含已审核和待审核) + */ + @Operation(summary = "查询所有审核记录列表", description = "班主任查看所有审核记录") + @SaCheckPermission("zsjy:internshipmonthly:review") + @GetMapping("/list") + public TableDataInfo listAll(@Validated ZsjyInternshipMonthlyReviewQueryBo queryBo, PageQuery pageQuery) { + log.info("=== 审核Controller层调试 ==="); + log.info("接口被调用: /zsjy/internship/monthly/review/list"); + log.info("查询参数: {}", queryBo); + log.info("分页参数: {}", pageQuery); + + return reviewService.queryReviewPageList(queryBo, pageQuery); + } + + /** + * 查询学生月度实习总结审核详情 + */ + @Operation(summary = "查询学生月度实习总结审核详情", description = "根据ID查询月度总结审核详情") + @SaCheckPermission("zsjy:internshipmonthly:review") + @GetMapping("/{monthlyId}/detail") + public R getReviewDetail(@Parameter(description = "月度总结ID") + @PathVariable Long monthlyId) { + log.info("查询月度总结审核详情, ID: {}", monthlyId); + return R.ok(reviewService.queryReviewDetail(monthlyId)); + } + + /** + * 单个审核学生月度实习总结 + */ + @Operation(summary = "单个审核学生月度实习总结", description = "班主任对单个月度总结进行审核") + @SaCheckPermission("zsjy:internshipmonthly:review") + @Log(title = "学生月度实习总结审核", businessType = BusinessType.UPDATE) + @PostMapping("/approve") + public R approve(@Validated(AddGroup.class) @RequestBody ZsjyInternshipMonthlyReviewBo reviewBo) { + log.info("审核月度总结: {}", reviewBo); + + Boolean result = reviewService.approveMonthly(reviewBo); + if (result) { + return R.ok("审核成功"); + } else { + return R.fail("审核失败"); + } + } + + /** + * 批量审核学生月度实习总结 + */ + @Operation(summary = "批量审核学生月度实习总结", description = "班主任批量审核多个月度总结") + @SaCheckPermission("zsjy:internshipmonthly:review") + @Log(title = "学生月度实习总结批量审核", businessType = BusinessType.UPDATE) + @PostMapping("/batch-approve") + public R> batchApprove(@Validated(AddGroup.class) @RequestBody ZsjyInternshipMonthlyBatchReviewBo batchReviewBo) { + log.info("批量审核月度总结: {}", batchReviewBo); + + Map result = reviewService.batchApproveMonthly(batchReviewBo); + return R.ok(result); + } + + /** + * 查询审核统计信息 + */ + @Operation(summary = "查询审核统计信息", description = "获取审核工作的统计数据") + @SaCheckPermission("zsjy:internshipmonthly:review") + @GetMapping("/statistics") + public R> getStatistics(@Validated ZsjyInternshipMonthlyReviewQueryBo queryBo) { + log.info("查询审核统计信息: {}", queryBo); + + Map statistics = reviewService.getReviewStatistics(queryBo); + return R.ok(statistics); + } + + /** + * 查询审核历史记录 + */ + @Operation(summary = "查询审核历史记录", description = "查看已完成的审核记录") + @SaCheckPermission("zsjy:internshipmonthly:review") + @GetMapping("/history") + public TableDataInfo getHistory(@Validated ZsjyInternshipMonthlyReviewQueryBo queryBo, PageQuery pageQuery) { + log.info("查询审核历史记录: {}", queryBo); + + return reviewService.queryHistoryPageList(queryBo, pageQuery); + } + + /** + * 导出审核记录 + */ + @Operation(summary = "导出审核记录", description = "导出学生月度总结审核记录") + @SaCheckPermission("zsjy:internshipmonthly:review") + @Log(title = "学生月度实习总结审核记录", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(@RequestBody ZsjyInternshipMonthlyReviewQueryBo queryBo, HttpServletResponse response) { + log.info("导出审核记录: {}", queryBo); + + List list = reviewService.queryReviewList(queryBo); + ExcelUtil.exportExcel(list, "学生月度实习总结审核记录", ZsjyInternshipMonthlyVo.class, response); + } + +} diff --git a/backend/ruoyi-modules/ruoyi-zsjy/src/main/java/org/dromara/zsjy/domain/ZsjyInternshipMonthly.java b/backend/ruoyi-modules/ruoyi-zsjy/src/main/java/org/dromara/zsjy/domain/ZsjyInternshipMonthly.java index 4213a17a..ace30589 100644 --- a/backend/ruoyi-modules/ruoyi-zsjy/src/main/java/org/dromara/zsjy/domain/ZsjyInternshipMonthly.java +++ b/backend/ruoyi-modules/ruoyi-zsjy/src/main/java/org/dromara/zsjy/domain/ZsjyInternshipMonthly.java @@ -158,6 +158,12 @@ public class ZsjyInternshipMonthly extends BaseEntity { @TableField("review_comment") private String reviewComment; + /** + * 改进建议 + */ + @TableField("review_suggestions") + private String reviewSuggestions; + /** * 提交时间 */ diff --git a/backend/ruoyi-modules/ruoyi-zsjy/src/main/java/org/dromara/zsjy/domain/bo/ZsjyInternshipMonthlyAddBo.java b/backend/ruoyi-modules/ruoyi-zsjy/src/main/java/org/dromara/zsjy/domain/bo/ZsjyInternshipMonthlyAddBo.java index 9cfd7357..988fa925 100644 --- a/backend/ruoyi-modules/ruoyi-zsjy/src/main/java/org/dromara/zsjy/domain/bo/ZsjyInternshipMonthlyAddBo.java +++ b/backend/ruoyi-modules/ruoyi-zsjy/src/main/java/org/dromara/zsjy/domain/bo/ZsjyInternshipMonthlyAddBo.java @@ -145,3 +145,4 @@ public class ZsjyInternshipMonthlyAddBo extends BaseEntity { private Date submitTime; } + \ No newline at end of file diff --git a/backend/ruoyi-modules/ruoyi-zsjy/src/main/java/org/dromara/zsjy/domain/bo/ZsjyInternshipMonthlyBatchReviewBo.java b/backend/ruoyi-modules/ruoyi-zsjy/src/main/java/org/dromara/zsjy/domain/bo/ZsjyInternshipMonthlyBatchReviewBo.java new file mode 100644 index 00000000..da098b86 --- /dev/null +++ b/backend/ruoyi-modules/ruoyi-zsjy/src/main/java/org/dromara/zsjy/domain/bo/ZsjyInternshipMonthlyBatchReviewBo.java @@ -0,0 +1,79 @@ +package org.dromara.zsjy.domain.bo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; + +import jakarta.validation.Valid; +import jakarta.validation.constraints.*; +import java.math.BigDecimal; +import java.util.List; + +/** + * 学生月度实习总结批量审核对象 ZsjyInternshipMonthlyBatchReviewBo + * + * @author system + * @date 2025-01-27 + */ +@Data +@Schema(description = "学生月度实习总结批量审核对象") +public class ZsjyInternshipMonthlyBatchReviewBo { + + /** + * 批量审核项目列表 + */ + @Schema(description = "批量审核项目列表") + @NotEmpty(message = "批量审核列表不能为空", groups = { AddGroup.class, EditGroup.class }) + @Valid + private List reviewItems; + + /** + * 批量审核项目 + */ + @Data + @Schema(description = "批量审核项目") + public static class BatchReviewItem { + + /** + * 月度总结ID + */ + @Schema(description = "月度总结ID") + @NotNull(message = "月度总结ID不能为空") + private Long monthlyId; + + /** + * 审核结果 (1通过/2拒绝) + */ + @Schema(description = "审核结果", allowableValues = {"1", "2"}) + @NotNull(message = "审核结果不能为空") + @Min(value = 1, message = "审核结果值必须为1或2") + @Max(value = 2, message = "审核结果值必须为1或2") + private Integer reviewStatus; + + /** + * 评分(百分制) + */ + @Schema(description = "评分") + @DecimalMin(value = "0", message = "评分不能小于0分") + @DecimalMax(value = "100", message = "评分不能大于100分") + @Digits(integer = 3, fraction = 1, message = "评分格式不正确") + private BigDecimal reviewScore; + + /** + * 审核意见 (必填) + */ + @Schema(description = "审核意见") + @NotBlank(message = "审核意见不能为空") + @Size(max = 500, message = "审核意见不能超过500字") + private String reviewComment; + + /** + * 改进建议 (选填) + */ + @Schema(description = "改进建议") + @Size(max = 500, message = "改进建议不能超过500字") + private String reviewSuggestions; + } + +} diff --git a/backend/ruoyi-modules/ruoyi-zsjy/src/main/java/org/dromara/zsjy/domain/bo/ZsjyInternshipMonthlyReviewBo.java b/backend/ruoyi-modules/ruoyi-zsjy/src/main/java/org/dromara/zsjy/domain/bo/ZsjyInternshipMonthlyReviewBo.java new file mode 100644 index 00000000..dd4b6c43 --- /dev/null +++ b/backend/ruoyi-modules/ruoyi-zsjy/src/main/java/org/dromara/zsjy/domain/bo/ZsjyInternshipMonthlyReviewBo.java @@ -0,0 +1,61 @@ +package org.dromara.zsjy.domain.bo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; + +import jakarta.validation.constraints.*; +import java.math.BigDecimal; + +/** + * 学生月度实习总结审核对象 ZsjyInternshipMonthlyReviewBo + * + * @author system + * @date 2025-01-27 + */ +@Data +@Schema(description = "学生月度实习总结审核对象") +public class ZsjyInternshipMonthlyReviewBo { + + /** + * 月度总结ID + */ + @Schema(description = "月度总结ID") + @NotNull(message = "月度总结ID不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long monthlyId; + + /** + * 审核结果 (1通过/2拒绝) + */ + @Schema(description = "审核结果", allowableValues = {"1", "2"}) + @NotNull(message = "审核结果不能为空", groups = { AddGroup.class, EditGroup.class }) + @Min(value = 1, message = "审核结果值必须为1或2", groups = { AddGroup.class, EditGroup.class }) + @Max(value = 2, message = "审核结果值必须为1或2", groups = { AddGroup.class, EditGroup.class }) + private Integer reviewStatus; + + /** + * 评分(百分制) + */ + @Schema(description = "评分") + @DecimalMin(value = "0", message = "评分不能小于0分", groups = { AddGroup.class, EditGroup.class }) + @DecimalMax(value = "100", message = "评分不能大于100分", groups = { AddGroup.class, EditGroup.class }) + @Digits(integer = 3, fraction = 1, message = "评分格式不正确", groups = { AddGroup.class, EditGroup.class }) + private BigDecimal reviewScore; + + /** + * 审核意见 (必填) + */ + @Schema(description = "审核意见") + @NotBlank(message = "审核意见不能为空", groups = { AddGroup.class, EditGroup.class }) + @Size(max = 500, message = "审核意见不能超过500字", groups = { AddGroup.class, EditGroup.class }) + private String reviewComment; + + /** + * 改进建议 (选填) + */ + @Schema(description = "改进建议") + @Size(max = 500, message = "改进建议不能超过500字", groups = { AddGroup.class, EditGroup.class }) + private String reviewSuggestions; + +} diff --git a/backend/ruoyi-modules/ruoyi-zsjy/src/main/java/org/dromara/zsjy/domain/bo/ZsjyInternshipMonthlyReviewQueryBo.java b/backend/ruoyi-modules/ruoyi-zsjy/src/main/java/org/dromara/zsjy/domain/bo/ZsjyInternshipMonthlyReviewQueryBo.java new file mode 100644 index 00000000..7a18286e --- /dev/null +++ b/backend/ruoyi-modules/ruoyi-zsjy/src/main/java/org/dromara/zsjy/domain/bo/ZsjyInternshipMonthlyReviewQueryBo.java @@ -0,0 +1,79 @@ +package org.dromara.zsjy.domain.bo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.dromara.common.mybatis.core.domain.BaseEntity; + +/** + * 学生月度实习总结审核查询对象 ZsjyInternshipMonthlyReviewQueryBo + * + * @author system + * @date 2025-01-27 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@Schema(description = "学生月度实习总结审核查询对象") +public class ZsjyInternshipMonthlyReviewQueryBo extends BaseEntity { + + /** + * 学生姓名 + */ + @Schema(description = "学生姓名") + private String studentName; + + /** + * 学号 + */ + @Schema(description = "学号") + private String studentNo; + + /** + * 班级名称 + */ + @Schema(description = "班级名称") + private String className; + + /** + * 总结月份 (格式: 2025-01) + */ + @Schema(description = "总结月份") + private String summaryMonth; + + /** + * 审核状态 (0待审核/1已审核通过/2审核拒绝) + */ + @Schema(description = "审核状态", allowableValues = {"0", "1", "2"}) + private Integer reviewStatus; + + /** + * 提交开始时间 + */ + @Schema(description = "提交开始时间") + private String submitTimeStart; + + /** + * 提交结束时间 + */ + @Schema(description = "提交结束时间") + private String submitTimeEnd; + + /** + * 实习单位名称 + */ + @Schema(description = "实习单位名称") + private String companyName; + + /** + * 学院名称 + */ + @Schema(description = "学院名称") + private String collegeName; + + /** + * 专业名称 + */ + @Schema(description = "专业名称") + private String majorName; + +} diff --git a/backend/ruoyi-modules/ruoyi-zsjy/src/main/java/org/dromara/zsjy/domain/vo/ZsjyInternshipMonthlyVo.java b/backend/ruoyi-modules/ruoyi-zsjy/src/main/java/org/dromara/zsjy/domain/vo/ZsjyInternshipMonthlyVo.java index d614ceb8..cc5aef4a 100644 --- a/backend/ruoyi-modules/ruoyi-zsjy/src/main/java/org/dromara/zsjy/domain/vo/ZsjyInternshipMonthlyVo.java +++ b/backend/ruoyi-modules/ruoyi-zsjy/src/main/java/org/dromara/zsjy/domain/vo/ZsjyInternshipMonthlyVo.java @@ -52,6 +52,18 @@ public class ZsjyInternshipMonthlyVo implements Serializable { @Schema(description = "学生学号") private String studentNumber; + /** + * 班级名称 - 通过关联查询获取 + */ + @Schema(description = "班级名称") + private String className; + + /** + * 专业名称 - 通过关联查询获取 + */ + @Schema(description = "专业名称") + private String majorName; + /** * 总结月份 (格式: 2025-01) */ @@ -173,6 +185,12 @@ public class ZsjyInternshipMonthlyVo implements Serializable { @Schema(description = "审核意见") private String reviewComment; + /** + * 改进建议 + */ + @Schema(description = "改进建议") + private String reviewSuggestions; + /** * 提交时间 */ @@ -251,3 +269,4 @@ public class ZsjyInternshipMonthlyVo implements Serializable { private Date updateTime; } + \ No newline at end of file diff --git a/backend/ruoyi-modules/ruoyi-zsjy/src/main/java/org/dromara/zsjy/mapper/ZsjyInternshipMonthlyMapper.java b/backend/ruoyi-modules/ruoyi-zsjy/src/main/java/org/dromara/zsjy/mapper/ZsjyInternshipMonthlyMapper.java index 21069aef..96314632 100644 --- a/backend/ruoyi-modules/ruoyi-zsjy/src/main/java/org/dromara/zsjy/mapper/ZsjyInternshipMonthlyMapper.java +++ b/backend/ruoyi-modules/ruoyi-zsjy/src/main/java/org/dromara/zsjy/mapper/ZsjyInternshipMonthlyMapper.java @@ -5,9 +5,11 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import org.apache.ibatis.annotations.Param; import org.dromara.zsjy.domain.ZsjyInternshipMonthly; import org.dromara.zsjy.domain.bo.ZsjyInternshipMonthlyQueryBo; +import org.dromara.zsjy.domain.bo.ZsjyInternshipMonthlyReviewQueryBo; import org.dromara.zsjy.domain.vo.ZsjyInternshipMonthlyVo; import java.util.List; +import java.util.Map; /** * 学生月度实习总结Mapper接口 @@ -79,4 +81,56 @@ public interface ZsjyInternshipMonthlyMapper extends BaseMapper countByStatus(@Param("studentId") Long studentId); + /** + * 查询审核分页列表 + * + * @param page 分页参数 + * @param queryBo 查询条件 + * @param studentIds 学生ID列表 + * @return 审核分页结果 + */ + Page selectReviewPage(Page page, + @Param("bo") ZsjyInternshipMonthlyReviewQueryBo queryBo, + @Param("studentIds") List studentIds); + + /** + * 查询审核列表 + * + * @param queryBo 查询条件 + * @param studentIds 学生ID列表 + * @return 审核列表 + */ + List selectReviewList(@Param("bo") ZsjyInternshipMonthlyReviewQueryBo queryBo, + @Param("studentIds") List studentIds); + + /** + * 查询审核历史分页列表 + * + * @param page 分页参数 + * @param queryBo 查询条件 + * @param studentIds 学生ID列表 + * @return 审核历史分页结果 + */ + Page selectHistoryPage(Page page, + @Param("bo") ZsjyInternshipMonthlyReviewQueryBo queryBo, + @Param("studentIds") List studentIds); + + /** + * 查询审核统计信息 + * + * @param queryBo 查询条件 + * @param studentIds 学生ID列表 + * @return 统计信息 + */ + Map selectReviewStatistics(@Param("bo") ZsjyInternshipMonthlyReviewQueryBo queryBo, + @Param("studentIds") List studentIds); + + /** + * 根据班主任ID查询管理的学生ID列表 + * + * @param classTeacherId 班主任ID + * @return 学生ID列表 + */ + List selectStudentIdsByClassTeacher(@Param("classTeacherId") Long classTeacherId); + } diff --git a/backend/ruoyi-modules/ruoyi-zsjy/src/main/java/org/dromara/zsjy/service/IZsjyInternshipMonthlyReviewService.java b/backend/ruoyi-modules/ruoyi-zsjy/src/main/java/org/dromara/zsjy/service/IZsjyInternshipMonthlyReviewService.java new file mode 100644 index 00000000..4d3e3250 --- /dev/null +++ b/backend/ruoyi-modules/ruoyi-zsjy/src/main/java/org/dromara/zsjy/service/IZsjyInternshipMonthlyReviewService.java @@ -0,0 +1,103 @@ +package org.dromara.zsjy.service; + +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.zsjy.domain.bo.ZsjyInternshipMonthlyBatchReviewBo; +import org.dromara.zsjy.domain.bo.ZsjyInternshipMonthlyReviewBo; +import org.dromara.zsjy.domain.bo.ZsjyInternshipMonthlyReviewQueryBo; +import org.dromara.zsjy.domain.vo.ZsjyInternshipMonthlyVo; + +import java.util.List; +import java.util.Map; + +/** + * 学生月度实习总结审核Service接口 + * + * @author system + * @date 2025-01-27 + */ +public interface IZsjyInternshipMonthlyReviewService { + + /** + * 查询待审核的学生月度实习总结分页列表 + * + * @param queryBo 查询条件 + * @param pageQuery 分页参数 + * @return 待审核月度总结分页结果 + */ + TableDataInfo queryPendingPageList(ZsjyInternshipMonthlyReviewQueryBo queryBo, PageQuery pageQuery); + + /** + * 查询所有审核记录分页列表 (包含已审核和待审核) + * + * @param queryBo 查询条件 + * @param pageQuery 分页参数 + * @return 审核记录分页结果 + */ + TableDataInfo queryReviewPageList(ZsjyInternshipMonthlyReviewQueryBo queryBo, PageQuery pageQuery); + + /** + * 查询审核记录列表 + * + * @param queryBo 查询条件 + * @return 审核记录集合 + */ + List queryReviewList(ZsjyInternshipMonthlyReviewQueryBo queryBo); + + /** + * 查询学生月度实习总结审核详情 + * + * @param monthlyId 月度总结ID + * @return 月度总结审核详情 + */ + ZsjyInternshipMonthlyVo queryReviewDetail(Long monthlyId); + + /** + * 单个审核学生月度实习总结 + * + * @param reviewBo 审核参数 + * @return 审核结果 + */ + Boolean approveMonthly(ZsjyInternshipMonthlyReviewBo reviewBo); + + /** + * 批量审核学生月度实习总结 + * + * @param batchReviewBo 批量审核参数 + * @return 批量审核结果 + */ + Map batchApproveMonthly(ZsjyInternshipMonthlyBatchReviewBo batchReviewBo); + + /** + * 获取审核统计信息 + * + * @param queryBo 查询条件 + * @return 统计信息 + */ + Map getReviewStatistics(ZsjyInternshipMonthlyReviewQueryBo queryBo); + + /** + * 查询审核历史记录分页列表 + * + * @param queryBo 查询条件 + * @param pageQuery 分页参数 + * @return 审核历史分页结果 + */ + TableDataInfo queryHistoryPageList(ZsjyInternshipMonthlyReviewQueryBo queryBo, PageQuery pageQuery); + + /** + * 检查月度总结是否可以审核 + * + * @param monthlyId 月度总结ID + * @return 是否可以审核 + */ + Boolean checkCanReview(Long monthlyId); + + /** + * 获取班主任管理的班级学生ID列表 + * + * @return 学生ID集合 + */ + List getClassTeacherStudentIds(); + +} diff --git a/backend/ruoyi-modules/ruoyi-zsjy/src/main/java/org/dromara/zsjy/service/IZsjyInternshipMonthlyService.java b/backend/ruoyi-modules/ruoyi-zsjy/src/main/java/org/dromara/zsjy/service/IZsjyInternshipMonthlyService.java index 2e167002..d1927aa5 100644 --- a/backend/ruoyi-modules/ruoyi-zsjy/src/main/java/org/dromara/zsjy/service/IZsjyInternshipMonthlyService.java +++ b/backend/ruoyi-modules/ruoyi-zsjy/src/main/java/org/dromara/zsjy/service/IZsjyInternshipMonthlyService.java @@ -135,3 +135,4 @@ public interface IZsjyInternshipMonthlyService { Map getCurrentInternshipInfo(); } + \ No newline at end of file diff --git a/backend/ruoyi-modules/ruoyi-zsjy/src/main/java/org/dromara/zsjy/service/impl/ZsjyInternshipMonthlyReviewServiceImpl.java b/backend/ruoyi-modules/ruoyi-zsjy/src/main/java/org/dromara/zsjy/service/impl/ZsjyInternshipMonthlyReviewServiceImpl.java new file mode 100644 index 00000000..0c9f7f22 --- /dev/null +++ b/backend/ruoyi-modules/ruoyi-zsjy/src/main/java/org/dromara/zsjy/service/impl/ZsjyInternshipMonthlyReviewServiceImpl.java @@ -0,0 +1,269 @@ +package org.dromara.zsjy.service.impl; + +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.dromara.common.core.exception.ServiceException; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.satoken.utils.LoginHelper; +import org.dromara.zsjy.domain.ZsjyInternshipMonthly; +import org.dromara.zsjy.domain.bo.ZsjyInternshipMonthlyBatchReviewBo; +import org.dromara.zsjy.domain.bo.ZsjyInternshipMonthlyReviewBo; +import org.dromara.zsjy.domain.bo.ZsjyInternshipMonthlyReviewQueryBo; +import org.dromara.zsjy.domain.vo.ZsjyInternshipMonthlyVo; +import org.dromara.zsjy.mapper.ZsjyInternshipMonthlyMapper; +import org.dromara.zsjy.service.IZsjyInternshipMonthlyReviewService; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.*; + +/** + * 学生月度实习总结审核Service业务层处理 + * + * @author system + * @date 2025-01-27 + */ +@Slf4j +@RequiredArgsConstructor +@Service +public class ZsjyInternshipMonthlyReviewServiceImpl implements IZsjyInternshipMonthlyReviewService { + + private final ZsjyInternshipMonthlyMapper baseMapper; + + /** + * 查询待审核的学生月度实习总结分页列表 + */ + @Override + public TableDataInfo queryPendingPageList(ZsjyInternshipMonthlyReviewQueryBo queryBo, PageQuery pageQuery) { + log.info("=== Service层调试 ==="); + log.info("查询待审核列表,参数: {}", queryBo); + + // 设置查询条件:只查询待审核状态(0) + queryBo.setReviewStatus(0); + + // 获取班主任管理的学生ID列表 + List studentIds = getClassTeacherStudentIds(); + if (studentIds.isEmpty()) { + log.warn("当前用户不是班主任或没有管理的学生"); + return TableDataInfo.build(new Page<>()); + } + + Page result = baseMapper.selectReviewPage(pageQuery.build(), queryBo, studentIds); + return TableDataInfo.build(result); + } + + /** + * 查询所有审核记录分页列表 (包含已审核和待审核) + */ + @Override + public TableDataInfo queryReviewPageList(ZsjyInternshipMonthlyReviewQueryBo queryBo, PageQuery pageQuery) { + log.info("=== Service层调试 ==="); + log.info("查询所有审核记录,参数: {}", queryBo); + + // 获取班主任管理的学生ID列表 + List studentIds = getClassTeacherStudentIds(); + if (studentIds.isEmpty()) { + log.warn("当前用户不是班主任或没有管理的学生"); + return TableDataInfo.build(new Page<>()); + } + + Page result = baseMapper.selectReviewPage(pageQuery.build(), queryBo, studentIds); + return TableDataInfo.build(result); + } + + /** + * 查询审核记录列表 + */ + @Override + public List queryReviewList(ZsjyInternshipMonthlyReviewQueryBo queryBo) { + // 获取班主任管理的学生ID列表 + List studentIds = getClassTeacherStudentIds(); + if (studentIds.isEmpty()) { + return new ArrayList<>(); + } + + return baseMapper.selectReviewList(queryBo, studentIds); + } + + /** + * 查询学生月度实习总结审核详情 + */ + @Override + public ZsjyInternshipMonthlyVo queryReviewDetail(Long monthlyId) { + ZsjyInternshipMonthlyVo vo = baseMapper.selectVoById(monthlyId); + if (ObjectUtil.isNull(vo)) { + throw new ServiceException("月度总结不存在"); + } + + // 检查是否有权限查看 + List studentIds = getClassTeacherStudentIds(); + if (!studentIds.contains(vo.getStudentId())) { + throw new ServiceException("无权查看该学生的总结"); + } + + return vo; + } + + /** + * 单个审核学生月度实习总结 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public Boolean approveMonthly(ZsjyInternshipMonthlyReviewBo reviewBo) { + log.info("=== 单个审核Service层调试 ==="); + log.info("审核参数: {}", reviewBo); + + // 检查月度总结是否存在且可以审核 + if (!checkCanReview(reviewBo.getMonthlyId())) { + throw new ServiceException("该月度总结不存在或不可审核"); + } + + // 构建更新条件 + LambdaUpdateWrapper updateWrapper = new LambdaUpdateWrapper<>(); + updateWrapper.eq(ZsjyInternshipMonthly::getId, reviewBo.getMonthlyId()) + .set(ZsjyInternshipMonthly::getReviewStatus, reviewBo.getReviewStatus()) + .set(ZsjyInternshipMonthly::getReviewScore, reviewBo.getReviewScore()) + .set(ZsjyInternshipMonthly::getReviewComment, reviewBo.getReviewComment()) + .set(ZsjyInternshipMonthly::getReviewSuggestions, reviewBo.getReviewSuggestions()) + .set(ZsjyInternshipMonthly::getReviewBy, LoginHelper.getUserId()) + .set(ZsjyInternshipMonthly::getReviewTime, new Date()); + + int result = baseMapper.update(null, updateWrapper); + log.info("审核更新结果: {}", result); + + return result > 0; + } + + /** + * 批量审核学生月度实习总结 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public Map batchApproveMonthly(ZsjyInternshipMonthlyBatchReviewBo batchReviewBo) { + log.info("=== 批量审核Service层调试 ==="); + log.info("批量审核参数: {}", batchReviewBo); + + Map result = new HashMap<>(); + int successCount = 0; + int failCount = 0; + List errorMessages = new ArrayList<>(); + + for (ZsjyInternshipMonthlyBatchReviewBo.BatchReviewItem item : batchReviewBo.getReviewItems()) { + try { + // 检查是否可以审核 + if (!checkCanReview(item.getMonthlyId())) { + failCount++; + errorMessages.add("ID:" + item.getMonthlyId() + " 不存在或不可审核"); + continue; + } + + // 构建更新条件 + LambdaUpdateWrapper updateWrapper = new LambdaUpdateWrapper<>(); + updateWrapper.eq(ZsjyInternshipMonthly::getId, item.getMonthlyId()) + .set(ZsjyInternshipMonthly::getReviewStatus, item.getReviewStatus()) + .set(ZsjyInternshipMonthly::getReviewScore, item.getReviewScore()) + .set(ZsjyInternshipMonthly::getReviewComment, item.getReviewComment()) + .set(ZsjyInternshipMonthly::getReviewSuggestions, item.getReviewSuggestions()) + .set(ZsjyInternshipMonthly::getReviewBy, LoginHelper.getUserId()) + .set(ZsjyInternshipMonthly::getReviewTime, new Date()); + + int updateResult = baseMapper.update(null, updateWrapper); + if (updateResult > 0) { + successCount++; + } else { + failCount++; + errorMessages.add("ID:" + item.getMonthlyId() + " 更新失败"); + } + + } catch (Exception e) { + failCount++; + errorMessages.add("ID:" + item.getMonthlyId() + " 审核异常: " + e.getMessage()); + log.error("批量审核异常,月度总结ID: {}", item.getMonthlyId(), e); + } + } + + result.put("successCount", successCount); + result.put("failCount", failCount); + result.put("total", batchReviewBo.getReviewItems().size()); + result.put("errorMessages", errorMessages); + + log.info("批量审核结果: {}", result); + return result; + } + + /** + * 获取审核统计信息 + */ + @Override + public Map getReviewStatistics(ZsjyInternshipMonthlyReviewQueryBo queryBo) { + // 获取班主任管理的学生ID列表 + List studentIds = getClassTeacherStudentIds(); + if (studentIds.isEmpty()) { + return new HashMap<>(); + } + + return baseMapper.selectReviewStatistics(queryBo, studentIds); + } + + /** + * 查询审核历史记录分页列表 + */ + @Override + public TableDataInfo queryHistoryPageList(ZsjyInternshipMonthlyReviewQueryBo queryBo, PageQuery pageQuery) { + // 设置查询条件:只查询已审核状态(1已通过/2已拒绝) + if (ObjectUtil.isNull(queryBo.getReviewStatus())) { + // 如果没有指定状态,则查询所有已审核的记录 + // 这里可以通过修改Mapper查询条件来实现,暂时不设置具体状态 + } + + // 获取班主任管理的学生ID列表 + List studentIds = getClassTeacherStudentIds(); + if (studentIds.isEmpty()) { + return TableDataInfo.build(new Page<>()); + } + + Page result = baseMapper.selectHistoryPage(pageQuery.build(), queryBo, studentIds); + return TableDataInfo.build(result); + } + + /** + * 检查月度总结是否可以审核 + */ + @Override + public Boolean checkCanReview(Long monthlyId) { + ZsjyInternshipMonthlyVo vo = baseMapper.selectVoById(monthlyId); + if (ObjectUtil.isNull(vo)) { + return false; + } + + // 检查是否有权限审核(是否是班主任管理的学生) + List studentIds = getClassTeacherStudentIds(); + if (!studentIds.contains(vo.getStudentId())) { + return false; + } + + // 检查状态是否为待审核(0) + return Integer.valueOf(0).equals(vo.getReviewStatus()); + } + + /** + * 获取班主任管理的班级学生ID列表 + * TODO: 这里需要根据实际的班主任-学生关系表来实现 + * 暂时返回空列表,需要补充具体的业务逻辑 + */ + @Override + public List getClassTeacherStudentIds() { + Long currentUserId = LoginHelper.getUserId(); + log.info("当前登录用户ID: {}", currentUserId); + + // TODO: 这里需要查询班主任管理的学生ID列表 + // 可能需要关联班级表、学生表等 + // 暂时返回示例数据,实际需要根据业务补充 + return baseMapper.selectStudentIdsByClassTeacher(currentUserId); + } + +} diff --git a/backend/ruoyi-modules/ruoyi-zsjy/src/main/resources/mapper/ZsjyInternshipMonthlyMapper.xml b/backend/ruoyi-modules/ruoyi-zsjy/src/main/resources/mapper/ZsjyInternshipMonthlyMapper.xml index be52f67b..092e5fce 100644 --- a/backend/ruoyi-modules/ruoyi-zsjy/src/main/resources/mapper/ZsjyInternshipMonthlyMapper.xml +++ b/backend/ruoyi-modules/ruoyi-zsjy/src/main/resources/mapper/ZsjyInternshipMonthlyMapper.xml @@ -26,7 +26,8 @@ - + + @@ -45,6 +46,8 @@ + + @@ -64,7 +67,8 @@ - + + @@ -86,6 +90,8 @@ m.student_id, u.nick_name as student_name, ui.student_no as student_number, + xsm.class_name, + xsm.major_name, m.summary_month, m.month_number, m.work_content, @@ -111,7 +117,8 @@ r.nick_name as reviewer_name, m.review_time, m.review_score, - m.review_comment as review_comments, + m.review_comment, + m.review_suggestions, m.submit_time, m.word_count, m.is_overdue, @@ -128,6 +135,7 @@ LEFT JOIN sys_user u ON u.user_id = m.student_id LEFT JOIN zsjy_internship_info ui ON ui.internship_id = m.internship_id AND ui.student_id = m.student_id LEFT JOIN sys_user r ON r.user_id = m.review_by + LEFT JOIN xg_student_msg xsm ON xsm.student_no = ui.student_no WHERE m.deleted = 0 @@ -237,4 +245,149 @@ ORDER BY review_status + + + + + + + + + + + + + + + diff --git a/web/src/api/zsjy/internshipMonthly.ts b/web/src/api/zsjy/internshipMonthly.ts index 5bff7dcf..dbb3085a 100644 --- a/web/src/api/zsjy/internshipMonthly.ts +++ b/web/src/api/zsjy/internshipMonthly.ts @@ -100,3 +100,4 @@ export function getCurrentInternshipInfo() { method: 'get' }) } + \ No newline at end of file diff --git a/web/src/api/zsjy/internshipMonthlyReview.ts b/web/src/api/zsjy/internshipMonthlyReview.ts new file mode 100644 index 00000000..4fa52a32 --- /dev/null +++ b/web/src/api/zsjy/internshipMonthlyReview.ts @@ -0,0 +1,154 @@ +import request from '@/utils/request'; + +// 审核查询参数接口 +export interface MonthlyReviewQueryParams { + summaryMonth?: string; + studentName?: string; + reviewStatus?: number; + studentNumber?: string; + startDate?: string; + endDate?: string; +} + +// 单个审核参数接口 +export interface MonthlyReviewParams { + monthlyId: number; + reviewStatus: number; // 1:通过 2:拒绝 + reviewScore?: number; // 0-100分 + reviewComment: string; + reviewSuggestions?: string; +} + +// 批量审核项目接口 +export interface BatchReviewItem { + monthlyId: number; + reviewStatus: number; + reviewScore?: number; + reviewComment: string; + reviewSuggestions?: string; +} + +// 批量审核参数接口 +export interface BatchReviewParams { + reviewItems: BatchReviewItem[]; +} + +// 审核统计信息接口 +export interface ReviewStatistics { + totalCount: number; + pendingCount: number; + approvedCount: number; + rejectedCount: number; + averageScore: number; + completionRate: number; +} + +/** + * 查询待审核的月度总结列表 + */ +export function getPendingReviewList(params: MonthlyReviewQueryParams) { + return request({ + url: '/zsjy/internship/monthly/review/pending', + method: 'get', + params + }); +} + +/** + * 查询所有审核记录列表 + */ +export function getReviewList(params: MonthlyReviewQueryParams) { + return request({ + url: '/zsjy/internship/monthly/review/list', + method: 'get', + params + }); +} + +/** + * 查询审核详情 + */ +export function getReviewDetail(monthlyId: number) { + return request({ + url: `/zsjy/internship/monthly/review/${monthlyId}`, + method: 'get' + }); +} + +/** + * 单个审核月度总结 + */ +export function approveMonthly(data: MonthlyReviewParams) { + return request({ + url: '/zsjy/internship/monthly/review/approve', + method: 'post', + data + }); +} + +/** + * 单个审核月度总结 (别名) + */ +export function reviewInternshipMonthly(data: MonthlyReviewParams) { + return request({ + url: '/zsjy/internship/monthly/review/approve', + method: 'post', + data + }); +} + +/** + * 批量审核月度总结 + */ +export function batchApproveMonthly(data: BatchReviewParams) { + return request({ + url: '/zsjy/internship/monthly/review/batch', + method: 'post', + data + }); +} + +/** + * 批量审核月度总结 (别名) + */ +export function batchReviewInternshipMonthly(data: BatchReviewParams) { + return request({ + url: '/zsjy/internship/monthly/review/batch', + method: 'post', + data + }); +} + +/** + * 获取审核统计信息 + */ +export function getReviewStatistics(params?: MonthlyReviewQueryParams) { + return request({ + url: '/zsjy/internship/monthly/review/statistics', + method: 'get', + params + }); +} + +/** + * 查询审核历史记录 + */ +export function getReviewHistory(params: MonthlyReviewQueryParams) { + return request({ + url: '/zsjy/internship/monthly/review/history', + method: 'get', + params + }); +} + +/** + * 导出审核记录 + */ +export function exportReviewData(params: MonthlyReviewQueryParams) { + return request({ + url: '/zsjy/internship/monthly/review/export', + method: 'post', + data: params, + responseType: 'blob' + }); +} diff --git a/web/src/api/zsjy/types.ts b/web/src/api/zsjy/types.ts index d18c8f3c..c6884487 100644 --- a/web/src/api/zsjy/types.ts +++ b/web/src/api/zsjy/types.ts @@ -1551,3 +1551,198 @@ export interface InternshipVisitEditBO extends InternshipVisitAddBO { */ visitId?: string | number; } + +/** + * 实习月度总结 VO + */ +export interface InternshipMonthlyVO { + /** + * 月度总结ID + */ + id?: string | number; + + /** + * 学生ID + */ + studentId?: string | number; + + /** + * 学生姓名 + */ + studentName?: string; + + /** + * 学号 + */ + studentNumber?: string; + + /** + * 班级名称 + */ + className?: string; + + /** + * 专业名称 + */ + majorName?: string; + + /** + * 学院名称 + */ + collegeName?: string; + + /** + * 总结月份 + */ + summaryMonth?: string; + + /** + * 工作内容 + */ + workContent?: string; + + /** + * 学习收获 + */ + learningGains?: string; + + /** + * 问题与困难 + */ + problemsEncountered?: string; + + /** + * 改进计划 + */ + improvementPlan?: string; + + /** + * 下月计划 + */ + nextMonthPlan?: string; + + /** + * 专业技能评分 (1-10分) + */ + professionalSkills?: number; + + /** + * 沟通能力评分 (1-10分) + */ + communicationSkills?: number; + + /** + * 团队协作评分 (1-10分) + */ + teamworkAbility?: number; + + /** + * 学习能力评分 (1-10分) + */ + learningAbility?: number; + + /** + * 工作态度评分 (1-10分) + */ + workAttitude?: number; + + /** + * 字数统计 + */ + wordCount?: number; + + /** + * 审核状态 (0-待审核 1-已通过 2-已拒绝 3-草稿) + */ + reviewStatus?: number; + + /** + * 审核人ID + */ + reviewerId?: string | number; + + /** + * 审核人姓名 + */ + reviewerName?: string; + + /** + * 审核评分 (0-100分) + */ + reviewScore?: number; + + /** + * 审核意见 + */ + reviewComment?: string; + + /** + * 改进建议 + */ + reviewSuggestions?: string; + + /** + * 审核时间 + */ + reviewTime?: string; + + /** + * 是否逾期 + */ + isOverdue?: boolean; + + /** + * 创建时间 + */ + createTime?: string; + + /** + * 创建者 + */ + createBy?: number; + + /** + * 更新时间 + */ + updateTime?: string; + + /** + * 更新者 + */ + updateBy?: number; +} + +/** + * 实习月度总结审核统计 VO + */ +export interface InternshipMonthlyReviewStatisticsVO { + /** + * 总记录数 + */ + totalCount?: number; + + /** + * 待审核数量 + */ + pendingCount?: number; + + /** + * 已通过数量 + */ + approvedCount?: number; + + /** + * 已拒绝数量 + */ + rejectedCount?: number; + + /** + * 平均评分 + */ + averageScore?: number; + + /** + * 完成率(百分比) + */ + completionRate?: number; +} diff --git a/web/src/views/zsjy/internship/pmonthly/detail.vue b/web/src/views/zsjy/internship/pmonthly/detail.vue index 307b9a97..60eb7a4d 100644 --- a/web/src/views/zsjy/internship/pmonthly/detail.vue +++ b/web/src/views/zsjy/internship/pmonthly/detail.vue @@ -316,3 +316,4 @@ defineExpose({ white-space: pre-wrap; } + \ No newline at end of file diff --git a/web/src/views/zsjy/internship/pmonthly/review.vue b/web/src/views/zsjy/internship/pmonthly/review.vue new file mode 100644 index 00000000..8faa99a1 --- /dev/null +++ b/web/src/views/zsjy/internship/pmonthly/review.vue @@ -0,0 +1,546 @@ + + + + + \ No newline at end of file diff --git a/web/src/views/zsjy/internship/pmonthreview/components/BatchReviewForm.vue b/web/src/views/zsjy/internship/pmonthreview/components/BatchReviewForm.vue new file mode 100644 index 00000000..26c65166 --- /dev/null +++ b/web/src/views/zsjy/internship/pmonthreview/components/BatchReviewForm.vue @@ -0,0 +1,395 @@ + + + + + diff --git a/web/src/views/zsjy/internship/pmonthreview/components/ReviewDetail.vue b/web/src/views/zsjy/internship/pmonthreview/components/ReviewDetail.vue new file mode 100644 index 00000000..93f14841 --- /dev/null +++ b/web/src/views/zsjy/internship/pmonthreview/components/ReviewDetail.vue @@ -0,0 +1,330 @@ + + + + + diff --git a/web/src/views/zsjy/internship/pmonthreview/components/ReviewForm.vue b/web/src/views/zsjy/internship/pmonthreview/components/ReviewForm.vue new file mode 100644 index 00000000..fec016de --- /dev/null +++ b/web/src/views/zsjy/internship/pmonthreview/components/ReviewForm.vue @@ -0,0 +1,383 @@ + + + + + diff --git a/web/src/views/zsjy/internship/pmonthreview/index.vue b/web/src/views/zsjy/internship/pmonthreview/index.vue new file mode 100644 index 00000000..ea5ffd62 --- /dev/null +++ b/web/src/views/zsjy/internship/pmonthreview/index.vue @@ -0,0 +1,589 @@ + + + + +