“班主任考核数据”

This commit is contained in:
weizhong committed 2025-08-19 15:27:06 +08:00
1 parent 5c36b47800
commit cefc07d471
80 files changed
+10594

No files matched your search

+7
View File
@@ -148,6 +148,13 @@
<version>${revision}</version>
</dependency>
<!-- 班主任考核管理模块 -->
<dependency>
<groupId>org.dromara</groupId>
<artifactId>ruoyi-bzrkh</artifactId>
<version>${revision}</version>
</dependency>
<!-- 社团管理模块 -->
<!-- <dependency>
<groupId>org.dromara</groupId>
+1
View File
@@ -23,6 +23,7 @@
<module>ruoyi-rs</module>
<module>ruoyi-xljk</module>
<module>ruoyi-jcbt</module>
<module>ruoyi-bzrkh</module>
<!-- <module>ruoyi-stgl</module> -->
</modules>
+109
View File
@@ -0,0 +1,109 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>ruoyi-modules</artifactId>
<groupId>org.dromara</groupId>
<version>${revision}</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>ruoyi-bzrkh</artifactId>
<description>
班主任考核管理模块
</description>
<dependencies>
<!-- 通用工具 -->
<dependency>
<groupId>org.dromara</groupId>
<artifactId>ruoyi-common-core</artifactId>
</dependency>
<dependency>
<groupId>org.dromara</groupId>
<artifactId>ruoyi-common-doc</artifactId>
</dependency>
<dependency>
<groupId>org.dromara</groupId>
<artifactId>ruoyi-common-mybatis</artifactId>
</dependency>
<dependency>
<groupId>org.dromara</groupId>
<artifactId>ruoyi-common-log</artifactId>
</dependency>
<dependency>
<groupId>org.dromara</groupId>
<artifactId>ruoyi-common-security</artifactId>
</dependency>
<dependency>
<groupId>org.dromara</groupId>
<artifactId>ruoyi-common-web</artifactId>
</dependency>
<dependency>
<groupId>org.dromara</groupId>
<artifactId>ruoyi-common-excel</artifactId>
</dependency>
<dependency>
<groupId>org.dromara</groupId>
<artifactId>ruoyi-common-idempotent</artifactId>
</dependency>
<dependency>
<groupId>org.dromara</groupId>
<artifactId>ruoyi-common-tenant</artifactId>
</dependency>
<dependency>
<groupId>org.dromara</groupId>
<artifactId>ruoyi-common-social</artifactId>
</dependency>
<dependency>
<groupId>org.dromara</groupId>
<artifactId>ruoyi-common-ratelimiter</artifactId>
</dependency>
<dependency>
<groupId>org.dromara</groupId>
<artifactId>ruoyi-common-mail</artifactId>
</dependency>
<dependency>
<groupId>org.dromara</groupId>
<artifactId>ruoyi-system</artifactId>
</dependency>
<dependency>
<groupId>org.dromara</groupId>
<artifactId>ruoyi-job</artifactId>
</dependency>
<!-- 代码生成-->
<dependency>
<groupId>org.dromara</groupId>
<artifactId>ruoyi-generator</artifactId>
</dependency>
<!-- demo模块 -->
<dependency>
<groupId>org.dromara</groupId>
<artifactId>ruoyi-demo</artifactId>
</dependency>
<!-- 工作流模块 -->
<dependency>
<groupId>org.dromara</groupId>
<artifactId>ruoyi-workflow</artifactId>
</dependency>
</dependencies>
</project>
@@ -0,0 +1,115 @@
package org.dromara.bzrkh.controller;
import java.util.List;
import lombok.RequiredArgsConstructor;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.validation.constraints.*;
import cn.dev33.satoken.annotation.SaCheckPermission;
import org.springframework.web.bind.annotation.*;
import org.springframework.validation.annotation.Validated;
import org.dromara.common.idempotent.annotation.RepeatSubmit;
import org.dromara.common.log.annotation.Log;
import org.dromara.common.web.core.BaseController;
import org.dromara.common.mybatis.core.page.PageQuery;
import org.dromara.common.core.domain.R;
import org.dromara.common.core.validate.AddGroup;
import org.dromara.common.core.validate.EditGroup;
import org.dromara.common.log.enums.BusinessType;
import org.dromara.common.excel.utils.ExcelUtil;
import org.dromara.bzrkh.domain.vo.BmzrAssessmentIndicatorVo;
import org.dromara.bzrkh.domain.bo.BmzrAssessmentIndicatorBo;
import org.dromara.bzrkh.service.IBmzrAssessmentIndicatorService;
import org.dromara.common.mybatis.core.page.TableDataInfo;
/**
* 班主任考核指标体系
*
* @author ruoyi
* @date 2025-01-08
*/
@Validated
@RequiredArgsConstructor
@RestController
@RequestMapping("/bzrkh/assessmentIndicator")
public class BmzrAssessmentIndicatorController extends BaseController {
private final IBmzrAssessmentIndicatorService bmzrAssessmentIndicatorService;
/**
* 查询班主任考核指标体系列表
*/
@SaCheckPermission("bzrkh:assessmentIndicator:list")
@GetMapping("/list")
public TableDataInfo<BmzrAssessmentIndicatorVo> list(BmzrAssessmentIndicatorBo bo, PageQuery pageQuery) {
return bmzrAssessmentIndicatorService.queryPageList(bo, pageQuery);
}
/**
* 查询班主任考核指标体系树形结构(用于父级选择)
*/
@SaCheckPermission("bzrkh:assessmentIndicator:list")
@GetMapping("/treeselect")
public R<List<BmzrAssessmentIndicatorVo>> treeselect(BmzrAssessmentIndicatorBo bo) {
List<BmzrAssessmentIndicatorVo> list = bmzrAssessmentIndicatorService.queryTreeList(bo);
return R.ok(list);
}
/**
* 导出班主任考核指标体系列表
*/
@SaCheckPermission("bzrkh:assessmentIndicator:export")
@Log(title = "班主任考核指标体系", businessType = BusinessType.EXPORT)
@PostMapping("/export")
public void export(BmzrAssessmentIndicatorBo bo, HttpServletResponse response) {
List<BmzrAssessmentIndicatorVo> list = bmzrAssessmentIndicatorService.queryList(bo);
ExcelUtil.exportExcel(list, "班主任考核指标体系", BmzrAssessmentIndicatorVo.class, response);
}
/**
* 获取班主任考核指标体系详细信息
*
* @param id 主键
*/
@SaCheckPermission("bzrkh:assessmentIndicator:query")
@GetMapping("/{id}")
public R<BmzrAssessmentIndicatorVo> getInfo(@NotNull(message = "主键不能为空")
@PathVariable Long id) {
return R.ok(bmzrAssessmentIndicatorService.queryById(id));
}
/**
* 新增班主任考核指标体系
*/
@SaCheckPermission("bzrkh:assessmentIndicator:add")
@Log(title = "班主任考核指标体系", businessType = BusinessType.INSERT)
@RepeatSubmit()
@PostMapping()
public R<Void> add(@Validated(AddGroup.class) @RequestBody BmzrAssessmentIndicatorBo bo) {
return toAjax(bmzrAssessmentIndicatorService.insertByBo(bo));
}
/**
* 修改班主任考核指标体系
*/
@SaCheckPermission("bzrkh:assessmentIndicator:edit")
@Log(title = "班主任考核指标体系", businessType = BusinessType.UPDATE)
@RepeatSubmit()
@PutMapping()
public R<Void> edit(@Validated(EditGroup.class) @RequestBody BmzrAssessmentIndicatorBo bo) {
return toAjax(bmzrAssessmentIndicatorService.updateByBo(bo));
}
/**
* 删除班主任考核指标体系
*
* @param ids 主键串
*/
@SaCheckPermission("bzrkh:assessmentIndicator:remove")
@Log(title = "班主任考核指标体系", businessType = BusinessType.DELETE)
@DeleteMapping("/{ids}")
public R<Void> remove(@NotEmpty(message = "主键不能为空")
@PathVariable Long[] ids) {
return toAjax(bmzrAssessmentIndicatorService.deleteWithValidByIds(List.of(ids), true));
}
}
@@ -0,0 +1,115 @@
package org.dromara.bzrkh.controller;
import java.util.List;
import lombok.RequiredArgsConstructor;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.validation.constraints.*;
import cn.dev33.satoken.annotation.SaCheckPermission;
import org.springframework.web.bind.annotation.*;
import org.springframework.validation.annotation.Validated;
import org.dromara.common.idempotent.annotation.RepeatSubmit;
import org.dromara.common.log.annotation.Log;
import org.dromara.common.web.core.BaseController;
import org.dromara.common.mybatis.core.page.PageQuery;
import org.dromara.common.core.domain.R;
import org.dromara.common.core.validate.AddGroup;
import org.dromara.common.core.validate.EditGroup;
import org.dromara.common.log.enums.BusinessType;
import org.dromara.common.excel.utils.ExcelUtil;
import org.dromara.bzrkh.domain.vo.BmzrAssessmentIndicatorTypeVo;
import org.dromara.bzrkh.domain.bo.BmzrAssessmentIndicatorTypeBo;
import org.dromara.bzrkh.service.IBmzrAssessmentIndicatorTypeService;
import org.dromara.common.mybatis.core.page.TableDataInfo;
/**
* 班主任考核指标类型
*
* @author ruoyi
* @date 2025-01-08
*/
@Validated
@RequiredArgsConstructor
@RestController
@RequestMapping("/bzrkh/assessmentIndicatorType")
public class BmzrAssessmentIndicatorTypeController extends BaseController {
private final IBmzrAssessmentIndicatorTypeService bmzrAssessmentIndicatorTypeService;
/**
* 查询班主任考核指标类型列表
*/
@SaCheckPermission("bzrkh:assessmentIndicatorType:list")
@GetMapping("/list")
public TableDataInfo<BmzrAssessmentIndicatorTypeVo> list(BmzrAssessmentIndicatorTypeBo bo, PageQuery pageQuery) {
return bmzrAssessmentIndicatorTypeService.queryPageList(bo, pageQuery);
}
/**
* 查询所有班主任考核指标类型列表(包括已逻辑删除的)
*/
@SaCheckPermission("bzrkh:assessmentIndicatorType:list")
@GetMapping("/listAllIncludeDeleted")
public R<List<BmzrAssessmentIndicatorTypeVo>> listAllIncludeDeleted(BmzrAssessmentIndicatorTypeBo bo) {
List<BmzrAssessmentIndicatorTypeVo> list = bmzrAssessmentIndicatorTypeService.queryListWithDeleted(bo);
return R.ok(list);
}
/**
* 导出班主任考核指标类型列表
*/
@SaCheckPermission("bzrkh:assessmentIndicatorType:export")
@Log(title = "班主任考核指标类型", businessType = BusinessType.EXPORT)
@PostMapping("/export")
public void export(BmzrAssessmentIndicatorTypeBo bo, HttpServletResponse response) {
List<BmzrAssessmentIndicatorTypeVo> list = bmzrAssessmentIndicatorTypeService.queryList(bo);
ExcelUtil.exportExcel(list, "班主任考核指标类型", BmzrAssessmentIndicatorTypeVo.class, response);
}
/**
* 获取班主任考核指标类型详细信息
*
* @param id 主键
*/
@SaCheckPermission("bzrkh:assessmentIndicatorType:query")
@GetMapping("/{id}")
public R<BmzrAssessmentIndicatorTypeVo> getInfo(@NotNull(message = "主键不能为空")
@PathVariable Long id) {
return R.ok(bmzrAssessmentIndicatorTypeService.queryById(id));
}
/**
* 新增班主任考核指标类型
*/
@SaCheckPermission("bzrkh:assessmentIndicatorType:add")
@Log(title = "班主任考核指标类型", businessType = BusinessType.INSERT)
@RepeatSubmit()
@PostMapping()
public R<Void> add(@Validated(AddGroup.class) @RequestBody BmzrAssessmentIndicatorTypeBo bo) {
return toAjax(bmzrAssessmentIndicatorTypeService.insertByBo(bo));
}
/**
* 修改班主任考核指标类型
*/
@SaCheckPermission("bzrkh:assessmentIndicatorType:edit")
@Log(title = "班主任考核指标类型", businessType = BusinessType.UPDATE)
@RepeatSubmit()
@PutMapping()
public R<Void> edit(@Validated(EditGroup.class) @RequestBody BmzrAssessmentIndicatorTypeBo bo) {
return toAjax(bmzrAssessmentIndicatorTypeService.updateByBo(bo));
}
/**
* 删除班主任考核指标类型
*
* @param ids 主键串
*/
@SaCheckPermission("bzrkh:assessmentIndicatorType:remove")
@Log(title = "班主任考核指标类型", businessType = BusinessType.DELETE)
@DeleteMapping("/{ids}")
public R<Void> remove(@NotEmpty(message = "主键不能为空")
@PathVariable Long[] ids) {
return toAjax(bmzrAssessmentIndicatorTypeService.deleteWithValidByIds(List.of(ids), true));
}
}
@@ -0,0 +1,120 @@
package org.dromara.bzrkh.controller;
import java.util.List;
import lombok.RequiredArgsConstructor;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.validation.constraints.*;
import cn.dev33.satoken.annotation.SaCheckPermission;
import org.springframework.web.bind.annotation.*;
import org.springframework.validation.annotation.Validated;
import org.dromara.common.idempotent.annotation.RepeatSubmit;
import org.dromara.common.log.annotation.Log;
import org.dromara.common.web.core.BaseController;
import org.dromara.common.mybatis.core.page.PageQuery;
import org.dromara.common.core.domain.R;
import org.dromara.common.core.validate.AddGroup;
import org.dromara.common.core.validate.EditGroup;
import org.dromara.common.log.enums.BusinessType;
import org.dromara.common.excel.utils.ExcelUtil;
import org.dromara.bzrkh.domain.vo.BmzrAssessmentPlanVo;
import org.dromara.bzrkh.domain.bo.BmzrAssessmentPlanBo;
import org.dromara.bzrkh.service.IBmzrAssessmentPlanService;
import org.dromara.common.mybatis.core.page.TableDataInfo;
/**
* 班主任考核计划Controller
*
* @author ruoyi
* @date 2025-01-08
*/
@Validated
@RequiredArgsConstructor
@RestController
@RequestMapping("/bzrkh/assessmentPlan")
public class BmzrAssessmentPlanController extends BaseController {
private final IBmzrAssessmentPlanService bmzrAssessmentPlanService;
/**
* 查询班主任考核计划列表
*/
@SaCheckPermission("bzrkh:assessmentPlan:list")
@GetMapping("/list")
public TableDataInfo<BmzrAssessmentPlanVo> list(BmzrAssessmentPlanBo bo, PageQuery pageQuery) {
return bmzrAssessmentPlanService.queryPageList(bo, pageQuery);
}
/**
* 导出班主任考核计划列表
*/
@SaCheckPermission("bzrkh:assessmentPlan:export")
@Log(title = "班主任考核计划", businessType = BusinessType.EXPORT)
@PostMapping("/export")
public void export(BmzrAssessmentPlanBo bo, HttpServletResponse response) {
List<BmzrAssessmentPlanVo> list = bmzrAssessmentPlanService.queryList(bo);
ExcelUtil.exportExcel(list, "班主任考核计划", BmzrAssessmentPlanVo.class, response);
}
/**
* 获取班主任考核计划详细信息
*/
@SaCheckPermission("bzrkh:assessmentPlan:query")
@GetMapping("/{id}")
public R<BmzrAssessmentPlanVo> getInfo(@NotNull(message = "主键不能为空")
@PathVariable Long id) {
return R.ok(bmzrAssessmentPlanService.queryById(id));
}
/**
* 新增班主任考核计划
*/
@SaCheckPermission("bzrkh:assessmentPlan:add")
@Log(title = "班主任考核计划", businessType = BusinessType.INSERT)
@RepeatSubmit()
@PostMapping()
public R<Void> add(@Validated(AddGroup.class) @RequestBody BmzrAssessmentPlanBo bo) {
return toAjax(bmzrAssessmentPlanService.insertByBo(bo));
}
/**
* 修改班主任考核计划
*/
@SaCheckPermission("bzrkh:assessmentPlan:edit")
@Log(title = "班主任考核计划", businessType = BusinessType.UPDATE)
@RepeatSubmit()
@PutMapping()
public R<Void> edit(@Validated(EditGroup.class) @RequestBody BmzrAssessmentPlanBo bo) {
return toAjax(bmzrAssessmentPlanService.updateByBo(bo));
}
/**
* 删除班主任考核计划
*/
@SaCheckPermission("bzrkh:assessmentPlan:remove")
@Log(title = "班主任考核计划", businessType = BusinessType.DELETE)
@DeleteMapping("/{ids}")
public R<Void> remove(@NotEmpty(message = "主键不能为空")
@PathVariable Long[] ids) {
return toAjax(bmzrAssessmentPlanService.deleteWithValidByIds(List.of(ids), true));
}
/**
* 修改考核计划状态
*/
@SaCheckPermission("bzrkh:assessmentPlan:edit")
@Log(title = "班主任考核计划", businessType = BusinessType.UPDATE)
@PutMapping("/changeStatus")
public R<Void> changeStatus(@RequestBody BmzrAssessmentPlanBo bo) {
return toAjax(bmzrAssessmentPlanService.updatePlanStatus(bo.getId(), bo.getPlanStatus()));
}
/**
* 获取可用的考核方案选项
*/
@SaCheckPermission("bzrkh:assessmentPlan:list")
@GetMapping("/schemes/options")
public R<List<BmzrAssessmentPlanVo>> getAvailableSchemes() {
return R.ok(bmzrAssessmentPlanService.getAvailableSchemes());
}
}
@@ -0,0 +1,103 @@
package org.dromara.bzrkh.controller;
import java.util.List;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.validation.constraints.*;
import cn.dev33.satoken.annotation.SaCheckPermission;
import org.springframework.web.bind.annotation.*;
import org.springframework.validation.annotation.Validated;
import org.dromara.common.idempotent.annotation.RepeatSubmit;
import org.dromara.common.log.annotation.Log;
import org.dromara.common.web.core.BaseController;
import org.dromara.common.mybatis.core.page.PageQuery;
import org.dromara.common.core.domain.R;
import org.dromara.common.core.validate.AddGroup;
import org.dromara.common.core.validate.EditGroup;
import org.dromara.common.log.enums.BusinessType;
import org.dromara.common.excel.utils.ExcelUtil;
import org.dromara.bzrkh.domain.vo.BmzrAssessmentSchemeVo;
import org.dromara.bzrkh.domain.bo.BmzrAssessmentSchemeBo;
import org.dromara.bzrkh.service.IBmzrAssessmentSchemeService;
import org.dromara.common.mybatis.core.page.TableDataInfo;
/**
* 班主任考核方案
*
* @author system
* @date 2025-01-08
*/
@Slf4j
@Validated
@RequiredArgsConstructor
@RestController
@RequestMapping("/bzrkh/assessmentScheme")
public class BmzrAssessmentSchemeController extends BaseController {
private final IBmzrAssessmentSchemeService bmzrAssessmentSchemeService;
/**
* 查询班主任考核方案列表
*/
@SaCheckPermission("bzrkh:assessmentScheme:list")
@GetMapping("/list")
public TableDataInfo<BmzrAssessmentSchemeVo> list(BmzrAssessmentSchemeBo bo, PageQuery pageQuery) {
return bmzrAssessmentSchemeService.queryPageList(bo, pageQuery);
}
/**
* 导出班主任考核方案列表
*/
@SaCheckPermission("bzrkh:assessmentScheme:export")
@Log(title = "班主任考核方案", businessType = BusinessType.EXPORT)
@PostMapping("/export")
public void export(BmzrAssessmentSchemeBo bo, HttpServletResponse response) {
List<BmzrAssessmentSchemeVo> list = bmzrAssessmentSchemeService.queryList(bo);
ExcelUtil.exportExcel(list, "班主任考核方案", BmzrAssessmentSchemeVo.class, response);
}
/**
* 获取班主任考核方案详细信息
*
* @param id 主键
*/
@SaCheckPermission("bzrkh:assessmentScheme:query")
@GetMapping("/{id}")
public R<BmzrAssessmentSchemeVo> getInfo(@NotNull(message = "主键不能为空") @PathVariable Long id) {
return R.ok(bmzrAssessmentSchemeService.queryById(id));
}
/**
* 新增班主任考核方案
*/
@SaCheckPermission("bzrkh:assessmentScheme:add")
@Log(title = "班主任考核方案", businessType = BusinessType.INSERT)
@RepeatSubmit()
@PostMapping
public R<Void> add(@Validated(AddGroup.class) @RequestBody BmzrAssessmentSchemeBo bo) {
return toAjax(bmzrAssessmentSchemeService.insertByBo(bo));
}
/**
* 修改班主任考核方案
*/
@SaCheckPermission("bzrkh:assessmentScheme:edit")
@Log(title = "班主任考核方案", businessType = BusinessType.UPDATE)
@RepeatSubmit()
@PutMapping
public R<Void> edit(@Validated(EditGroup.class) @RequestBody BmzrAssessmentSchemeBo bo) {
return toAjax(bmzrAssessmentSchemeService.updateByBo(bo));
}
/**
* 删除班主任考核方案
*/
@SaCheckPermission("bzrkh:assessmentScheme:remove")
@Log(title = "班主任考核方案", businessType = BusinessType.DELETE)
@DeleteMapping("/{ids}")
public R<Void> remove(@NotEmpty(message = "主键不能为空") @PathVariable Long[] ids) {
return toAjax(bmzrAssessmentSchemeService.deleteWithValidByIds(List.of(ids), true));
}
}
@@ -0,0 +1,130 @@
package org.dromara.bzrkh.controller;
import java.util.List;
import lombok.RequiredArgsConstructor;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.validation.constraints.*;
import cn.dev33.satoken.annotation.SaCheckPermission;
import org.springframework.web.bind.annotation.*;
import org.springframework.validation.annotation.Validated;
import org.dromara.common.idempotent.annotation.RepeatSubmit;
import org.dromara.common.log.annotation.Log;
import org.dromara.common.web.core.BaseController;
import org.dromara.common.mybatis.core.page.PageQuery;
import org.dromara.common.core.domain.R;
import org.dromara.common.core.validate.AddGroup;
import org.dromara.common.core.validate.EditGroup;
import org.dromara.common.log.enums.BusinessType;
import org.dromara.common.excel.utils.ExcelUtil;
import org.dromara.bzrkh.domain.vo.BmzrAssessmentSchemeIndicatorVo;
import org.dromara.bzrkh.domain.bo.BmzrAssessmentSchemeIndicatorBo;
import org.dromara.bzrkh.service.IBmzrAssessmentSchemeIndicatorService;
import org.dromara.common.mybatis.core.page.TableDataInfo;
/**
* 班主任考核方案指标关联
*
* @author ruoyi
* @date 2025-01-08
*/
@Validated
@RequiredArgsConstructor
@RestController
@RequestMapping("/bzrkh/assessmentSchemeIndicator")
public class BmzrAssessmentSchemeIndicatorController extends BaseController {
private final IBmzrAssessmentSchemeIndicatorService bmzrAssessmentSchemeIndicatorService;
/**
* 查询班主任考核方案指标关联列表
*/
@SaCheckPermission("bzrkh:assessmentSchemeIndicator:list")
@GetMapping("/list")
public TableDataInfo<BmzrAssessmentSchemeIndicatorVo> list(BmzrAssessmentSchemeIndicatorBo bo, PageQuery pageQuery) {
return bmzrAssessmentSchemeIndicatorService.queryPageList(bo, pageQuery);
}
/**
* 根据方案ID查询指标关联列表(无分页)
*/
@SaCheckPermission("bzrkh:assessmentSchemeIndicator:list")
@GetMapping("/listBySchemeId/{schemeId}")
public R<List<BmzrAssessmentSchemeIndicatorVo>> listBySchemeId(@PathVariable Long schemeId) {
List<BmzrAssessmentSchemeIndicatorVo> list = bmzrAssessmentSchemeIndicatorService.queryBySchemeId(schemeId);
return R.ok(list);
}
/**
* 导出班主任考核方案指标关联列表
*/
@SaCheckPermission("bzrkh:assessmentSchemeIndicator:export")
@Log(title = "班主任考核方案指标关联", businessType = BusinessType.EXPORT)
@PostMapping("/export")
public void export(BmzrAssessmentSchemeIndicatorBo bo, HttpServletResponse response) {
List<BmzrAssessmentSchemeIndicatorVo> list = bmzrAssessmentSchemeIndicatorService.queryList(bo);
ExcelUtil.exportExcel(list, "班主任考核方案指标关联", BmzrAssessmentSchemeIndicatorVo.class, response);
}
/**
* 获取班主任考核方案指标关联详细信息
*
* @param id 主键
*/
@SaCheckPermission("bzrkh:assessmentSchemeIndicator:query")
@GetMapping("/{id}")
public R<BmzrAssessmentSchemeIndicatorVo> getInfo(@NotNull(message = "主键不能为空")
@PathVariable Long id) {
return R.ok(bmzrAssessmentSchemeIndicatorService.queryById(id));
}
/**
* 新增班主任考核方案指标关联
*/
@SaCheckPermission("bzrkh:assessmentSchemeIndicator:add")
@Log(title = "班主任考核方案指标关联", businessType = BusinessType.INSERT)
@RepeatSubmit()
@PostMapping()
public R<Void> add(@Validated(AddGroup.class) @RequestBody BmzrAssessmentSchemeIndicatorBo bo) {
return toAjax(bmzrAssessmentSchemeIndicatorService.insertByBo(bo));
}
/**
* 修改班主任考核方案指标关联
*/
@SaCheckPermission("bzrkh:assessmentSchemeIndicator:edit")
@Log(title = "班主任考核方案指标关联", businessType = BusinessType.UPDATE)
@RepeatSubmit()
@PutMapping()
public R<Void> edit(@Validated(EditGroup.class) @RequestBody BmzrAssessmentSchemeIndicatorBo bo) {
return toAjax(bmzrAssessmentSchemeIndicatorService.updateByBo(bo));
}
/**
* 删除班主任考核方案指标关联
*
* @param ids 主键串
*/
@SaCheckPermission("bzrkh:assessmentSchemeIndicator:remove")
@Log(title = "班主任考核方案指标关联", businessType = BusinessType.DELETE)
@DeleteMapping("/{ids}")
public R<Void> remove(@NotEmpty(message = "主键不能为空")
@PathVariable Long[] ids) {
return toAjax(bmzrAssessmentSchemeIndicatorService.deleteWithValidByIds(List.of(ids), true));
}
/**
* 批量保存方案指标关联
*
* @param schemeId 方案ID
* @param indicatorList 指标列表
*/
@SaCheckPermission("bzrkh:assessmentSchemeIndicator:edit")
@Log(title = "批量保存方案指标关联", businessType = BusinessType.UPDATE)
@RepeatSubmit()
@PostMapping("/batchSave/{schemeId}")
public R<Void> batchSave(@PathVariable Long schemeId,
@RequestBody List<BmzrAssessmentSchemeIndicatorBo> indicatorList) {
return toAjax(bmzrAssessmentSchemeIndicatorService.batchSaveSchemeIndicators(schemeId, indicatorList));
}
}
@@ -0,0 +1,110 @@
package org.dromara.bzrkh.controller;
import java.util.List;
import lombok.RequiredArgsConstructor;
import jakarta.validation.constraints.*;
import cn.dev33.satoken.annotation.SaCheckPermission;
import org.springframework.web.bind.annotation.*;
import org.springframework.validation.annotation.Validated;
import org.dromara.common.log.annotation.Log;
import org.dromara.common.web.core.BaseController;
import org.dromara.common.mybatis.core.page.PageQuery;
import org.dromara.common.core.domain.R;
import org.dromara.common.log.enums.BusinessType;
import org.dromara.bzrkh.domain.vo.TeacherClassVo;
import org.dromara.bzrkh.domain.vo.BmzrAssessmentPlanVo;
import org.dromara.bzrkh.domain.bo.TeacherAssessmentQueryBo;
import org.dromara.bzrkh.service.ITeacherAssessmentService;
import org.dromara.common.mybatis.core.page.TableDataInfo;
import org.dromara.common.satoken.utils.LoginHelper;
/**
* 班主任考核管理Controller
*
* @author ruoyi
* @date 2025-01-27
*/
@Validated
@RequiredArgsConstructor
@RestController
@RequestMapping("/bzrkh/teacherAssessment")
public class TeacherAssessmentController extends BaseController {
private final ITeacherAssessmentService teacherAssessmentService;
/**
* 查询班主任管理的班级列表
*/
@SaCheckPermission("bzrkh:teacherAssessment:list")
@GetMapping("/classes")
public R<List<TeacherClassVo>> getTeacherClasses(@RequestParam(required = false) Long teacherId) {
// 如果没有传入teacherId,则使用当前登录用户ID
Long currentTeacherId = teacherId != null ? teacherId : LoginHelper.getUserId();
List<TeacherClassVo> list = teacherAssessmentService.queryTeacherClassList(currentTeacherId);
return R.ok(list);
}
/**
* 查询班主任考核计划列表
*/
@SaCheckPermission("bzrkh:teacherAssessment:list")
@GetMapping("/plans")
public TableDataInfo<BmzrAssessmentPlanVo> getTeacherAssessmentPlans(TeacherAssessmentQueryBo bo, PageQuery pageQuery) {
// 如果没有传入teacherId,则使用当前登录用户ID
if (bo.getTeacherId() == null) {
bo.setTeacherId(LoginHelper.getUserId());
}
return teacherAssessmentService.queryTeacherAssessmentPlanPageList(bo, pageQuery);
}
/**
* 提交考核
*/
@SaCheckPermission("bzrkh:teacherAssessment:submit")
@Log(title = "班主任考核管理", businessType = BusinessType.UPDATE)
@PostMapping("/submit")
public R<Void> submitAssessment(@RequestBody TeacherAssessmentSubmitRequest request) {
Long teacherId = LoginHelper.getUserId();
boolean result = teacherAssessmentService.submitAssessment(request.getPlanId(), request.getClassId(), teacherId);
return toAjax(result);
}
/**
* 查看考核详情
*/
@SaCheckPermission("bzrkh:teacherAssessment:detail")
@GetMapping("/detail")
public R<Object> getAssessmentDetail(@RequestParam Long planId, @RequestParam Long classId) {
Long teacherId = LoginHelper.getUserId();
Object detail = teacherAssessmentService.getAssessmentDetail(planId, classId, teacherId);
return R.ok(detail);
}
/**
* 提交考核请求对象
*/
public static class TeacherAssessmentSubmitRequest {
@NotNull(message = "计划ID不能为空")
private Long planId;
@NotNull(message = "班级ID不能为空")
private Long classId;
public Long getPlanId() {
return planId;
}
public void setPlanId(Long planId) {
this.planId = planId;
}
public Long getClassId() {
return classId;
}
public void setClassId(Long classId) {
this.classId = classId;
}
}
}
@@ -0,0 +1,91 @@
package org.dromara.bzrkh.domain;
import org.dromara.common.tenant.core.TenantEntity;
import com.baomidou.mybatisplus.annotation.*;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.io.Serial;
import java.math.BigDecimal;
/**
* 班主任考核指标体系对象 bmzr_assessment_indicator
*
* @author ruoyi
* @date 2025-01-08
*/
@Data
@EqualsAndHashCode(callSuper = true)
@TableName("bmzr_assessment_indicator")
public class BmzrAssessmentIndicator extends TenantEntity {
@Serial
private static final long serialVersionUID = 1L;
/**
* 主键ID
*/
@TableId(value = "id")
private Long id;
/**
* 指标名称
*/
private String indicatorName;
/**
* 指标编码
*/
private String indicatorCode;
/**
* 指标类型
*/
private String indicatorType;
/**
* 父级指标ID
*/
private Long parentId;
/**
* 排序
*/
private Integer sortOrder;
/**
* 权重比例(0-1之间)
*/
private BigDecimal weightRatio;
/**
* 最高分值
*/
private BigDecimal maxScore;
/**
* 分值
*/
private BigDecimal score;
/**
* 允许自评(0=否 1=是)
*/
private String allowSelfEvaluation;
/**
* 允许上级评(0=否 1=是)
*/
private String allowSuperiorEvaluation;
/**
* 状态(0正常 1停用)
*/
private String status;
/**
* 备注
*/
private String remark;
}
@@ -0,0 +1,56 @@
package org.dromara.bzrkh.domain;
import org.dromara.common.tenant.core.TenantEntity;
import com.baomidou.mybatisplus.annotation.*;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.io.Serial;
/**
* 班主任考核指标类型对象 bmzr_assessment_indicator_type
*
* @author ruoyi
* @date 2025-01-08
*/
@Data
@EqualsAndHashCode(callSuper = true)
@TableName("bmzr_assessment_indicator_type")
public class BmzrAssessmentIndicatorType extends TenantEntity {
@Serial
private static final long serialVersionUID = 1L;
/**
* 主键ID
*/
@TableId(value = "id")
private Long id;
/**
* 删除标志(0代表存在 1代表删除)
*/
@TableLogic(value = "0", delval = "1")
private Integer deleted;
/**
* 指标类型名称
*/
private String indicatorTypeName;
/**
* 指标类型编码
*/
private String indicatorTypeCode;
/**
* 状态(0正常 1停用)
*/
private String status;
/**
* 备注
*/
private String remark;
}
@@ -0,0 +1,95 @@
package org.dromara.bzrkh.domain;
import org.dromara.common.tenant.core.TenantEntity;
import com.baomidou.mybatisplus.annotation.*;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.util.Date;
import com.fasterxml.jackson.annotation.JsonFormat;
import java.io.Serial;
/**
* 班主任考核计划对象 bmzr_assessment_plan
*
* @author ruoyi
* @date 2025-01-08
*/
@Data
@EqualsAndHashCode(callSuper = true)
@TableName("bmzr_assessment_plan")
public class BmzrAssessmentPlan extends TenantEntity {
@Serial
private static final long serialVersionUID = 1L;
/**
* 主键ID
*/
@TableId(value = "id")
private Long id;
/**
* 计划名称
*/
private String planName;
/**
* 计划编码
*/
private String planCode;
/**
* 考核方案ID
*/
private Long schemeId;
/**
* 学年
*/
private String academicYear;
/**
* 学期(1=上学期 2=下学期)
*/
private String semester;
/**
* 计划开始时间
*/
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date planStartTime;
/**
* 计划结束时间
*/
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date planEndTime;
/**
* 数据提取开始时间
*/
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date dataExtractStartTime;
/**
* 数据提取结束时间
*/
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date dataExtractEndTime;
/**
* 计划状态(0=禁用 1=启用)
*/
private String planStatus;
/**
* 计划描述
*/
private String description;
/**
* 备注
*/
private String remark;
}
@@ -0,0 +1,82 @@
package org.dromara.bzrkh.domain;
import org.dromara.common.tenant.core.TenantEntity;
import com.baomidou.mybatisplus.annotation.*;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.util.Date;
import com.fasterxml.jackson.annotation.JsonFormat;
import java.io.Serial;
/**
* 班主任考核方案对象 bmzr_assessment_scheme
*
* @author system
* @date 2025-01-08
*/
@Data
@EqualsAndHashCode(callSuper = true)
@TableName("bmzr_assessment_scheme")
public class BmzrAssessmentScheme extends TenantEntity {
@Serial
private static final long serialVersionUID = 1L;
/**
* 主键ID
*/
@TableId(value = "id")
private Long id;
/**
* 删除标志
*/
@TableLogic(value = "0", delval = "1")
private Long deleted;
/**
* 方案名称
*/
private String schemeName;
/**
* 方案编码
*/
private String schemeCode;
/**
* 学年
*/
private String academicYear;
/**
* 学期
*/
private String semester;
/**
* 方案描述
*/
private String schemeDescription;
/**
* 是否需要自评
*/
private String selfEvaluationRequired;
/**
* 是否需要上级评
*/
private String superiorEvaluationRequired;
/**
* 状态
*/
private String status;
/**
* 备注
*/
private String remark;
}
@@ -0,0 +1,71 @@
package org.dromara.bzrkh.domain;
import org.dromara.common.mybatis.core.domain.BaseEntity;
import com.baomidou.mybatisplus.annotation.*;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.io.Serial;
import java.math.BigDecimal;
/**
* 班主任考核方案指标关联对象 bmzr_assessment_scheme_indicator
*
* @author ruoyi
* @date 2025-01-08
*/
@Data
@EqualsAndHashCode(callSuper = true)
@TableName("bmzr_assessment_scheme_indicator")
public class BmzrAssessmentSchemeIndicator extends BaseEntity {
@Serial
private static final long serialVersionUID = 1L;
/**
* 主键ID
*/
@TableId(value = "id")
private Long id;
/**
* 租户编号
*/
private String tenantId;
/**
* 考核方案ID
*/
private Long schemeId;
/**
* 考核指标ID
*/
private Long indicatorId;
/**
* 在方案中的权重比例
*/
private BigDecimal weightRatio;
/**
* 自定义最高分值
*/
private BigDecimal customMaxScore;
/**
* 排序
*/
private Integer sortOrder;
/**
* 备注
*/
private String remark;
/**
* 删除标志(0代表存在 1代表删除)
*/
@TableLogic
private Integer deleted;
}
@@ -0,0 +1,106 @@
package org.dromara.bzrkh.domain.bo;
import org.dromara.bzrkh.domain.BmzrAssessmentIndicator;
import org.dromara.common.mybatis.core.domain.BaseEntity;
import org.dromara.common.core.validate.AddGroup;
import org.dromara.common.core.validate.EditGroup;
import io.github.linpeilie.annotations.AutoMapper;
import lombok.Data;
import lombok.EqualsAndHashCode;
import jakarta.validation.constraints.*;
import java.math.BigDecimal;
/**
* 班主任考核指标体系业务对象 bmzr_assessment_indicator
*
* @author ruoyi
* @date 2025-01-08
*/
@Data
@EqualsAndHashCode(callSuper = true)
@AutoMapper(target = BmzrAssessmentIndicator.class, reverseConvertGenerate = false)
public class BmzrAssessmentIndicatorBo extends BaseEntity {
/**
* 主键ID
*/
@NotNull(message = "主键ID不能为空", groups = { EditGroup.class })
private Long id;
/**
* 指标名称
*/
@NotBlank(message = "指标名称不能为空", groups = { AddGroup.class, EditGroup.class })
private String indicatorName;
/**
* 指标编码
*/
@NotBlank(message = "指标编码不能为空", groups = { AddGroup.class, EditGroup.class })
private String indicatorCode;
/**
* 指标类型
*/
@NotBlank(message = "指标类型不能为空", groups = { AddGroup.class, EditGroup.class })
private String indicatorType;
/**
* 父级指标ID
*/
private Long parentId;
/**
* 排序
*/
@NotNull(message = "排序不能为空", groups = { AddGroup.class, EditGroup.class })
@Min(value = 1, message = "排序必须大于等于1")
private Integer sortOrder;
/**
* 权重比例(0-1之间)
*/
@NotNull(message = "权重比例不能为空", groups = { AddGroup.class, EditGroup.class })
@DecimalMin(value = "0", message = "权重比例必须大于等于0")
@DecimalMax(value = "1", message = "权重比例必须小于等于1")
private BigDecimal weightRatio;
/**
* 最高分值
*/
@NotNull(message = "最高分值不能为空", groups = { AddGroup.class, EditGroup.class })
@DecimalMin(value = "0", message = "最高分值必须大于等于0")
private BigDecimal maxScore;
/**
* 分值
*/
@NotNull(message = "分值不能为空", groups = { AddGroup.class, EditGroup.class })
@DecimalMin(value = "0", message = "分值必须大于等于0")
private BigDecimal score;
/**
* 允许自评(0=否 1=是)
*/
@NotBlank(message = "允许自评不能为空", groups = { AddGroup.class, EditGroup.class })
private String allowSelfEvaluation;
/**
* 允许上级评(0=否 1=是)
*/
@NotBlank(message = "允许上级评不能为空", groups = { AddGroup.class, EditGroup.class })
private String allowSuperiorEvaluation;
/**
* 状态(0正常 1停用)
*/
@NotBlank(message = "状态不能为空", groups = { AddGroup.class, EditGroup.class })
private String status;
/**
* 备注
*/
private String remark;
}
@@ -0,0 +1,59 @@
package org.dromara.bzrkh.domain.bo;
import org.dromara.bzrkh.domain.BmzrAssessmentIndicatorType;
import org.dromara.common.mybatis.core.domain.BaseEntity;
import org.dromara.common.core.validate.AddGroup;
import org.dromara.common.core.validate.EditGroup;
import io.github.linpeilie.annotations.AutoMapper;
import lombok.Data;
import lombok.EqualsAndHashCode;
import jakarta.validation.constraints.*;
/**
* 班主任考核指标类型业务对象 bmzr_assessment_indicator_type
*
* @author ruoyi
* @date 2025-01-08
*/
@Data
@EqualsAndHashCode(callSuper = true)
@AutoMapper(target = BmzrAssessmentIndicatorType.class, reverseConvertGenerate = false)
public class BmzrAssessmentIndicatorTypeBo extends BaseEntity {
/**
* 主键ID
*/
@NotNull(message = "主键ID不能为空", groups = { EditGroup.class })
private Long id;
/**
* 删除标志
*/
private Integer deleted;
/**
* 指标类型名称
*/
@NotBlank(message = "指标类型名称不能为空", groups = { AddGroup.class, EditGroup.class })
@Size(max = 100, message = "指标类型名称长度不能超过100个字符")
private String indicatorTypeName;
/**
* 指标类型编码
*/
@NotBlank(message = "指标类型编码不能为空", groups = { AddGroup.class, EditGroup.class })
@Size(max = 50, message = "指标类型编码长度不能超过50个字符")
private String indicatorTypeCode;
/**
* 状态
*/
private String status;
/**
* 备注
*/
@Size(max = 500, message = "备注长度不能超过500个字符")
private String remark;
}
@@ -0,0 +1,109 @@
package org.dromara.bzrkh.domain.bo;
import org.dromara.bzrkh.domain.BmzrAssessmentPlan;
import org.dromara.common.mybatis.core.domain.BaseEntity;
import org.dromara.common.core.validate.AddGroup;
import org.dromara.common.core.validate.EditGroup;
import io.github.linpeilie.annotations.AutoMapper;
import lombok.Data;
import lombok.EqualsAndHashCode;
import jakarta.validation.constraints.*;
import java.util.Date;
/**
* 班主任考核计划业务对象 bmzr_assessment_plan
*
* @author ruoyi
* @date 2025-01-08
*/
@Data
@EqualsAndHashCode(callSuper = true)
@AutoMapper(target = BmzrAssessmentPlan.class, reverseConvertGenerate = false)
public class BmzrAssessmentPlanBo extends BaseEntity {
/**
* 主键ID
*/
@NotNull(message = "主键ID不能为空", groups = { EditGroup.class })
private Long id;
/**
* 租户编号
*/
private String tenantId;
/**
* 计划名称
*/
@NotBlank(message = "计划名称不能为空", groups = { AddGroup.class, EditGroup.class })
@Size(max = 100, message = "计划名称长度不能超过100个字符")
private String planName;
/**
* 计划编码
*/
@NotBlank(message = "计划编码不能为空", groups = { AddGroup.class, EditGroup.class })
@Size(max = 50, message = "计划编码长度不能超过50个字符")
private String planCode;
/**
* 考核方案ID
*/
@NotNull(message = "考核方案ID不能为空", groups = { AddGroup.class, EditGroup.class })
private Long schemeId;
/**
* 学年
*/
@NotBlank(message = "学年不能为空", groups = { AddGroup.class, EditGroup.class })
@Size(max = 10, message = "学年长度不能超过10个字符")
private String academicYear;
/**
* 学期(1=上学期 2=下学期)
*/
@NotBlank(message = "学期不能为空", groups = { AddGroup.class, EditGroup.class })
@Pattern(regexp = "^[12]$", message = "学期只能是1或2")
private String semester;
/**
* 计划开始时间
*/
@NotNull(message = "计划开始时间不能为空", groups = { AddGroup.class, EditGroup.class })
private Date planStartTime;
/**
* 计划结束时间
*/
@NotNull(message = "计划结束时间不能为空", groups = { AddGroup.class, EditGroup.class })
private Date planEndTime;
/**
* 数据提取开始时间
*/
private Date dataExtractStartTime;
/**
* 数据提取结束时间
*/
private Date dataExtractEndTime;
/**
* 计划状态(0=禁用 1=启用)
*/
@Pattern(regexp = "^[01]$", message = "计划状态只能是0或1")
private String planStatus;
/**
* 计划描述
*/
@Size(max = 500, message = "计划描述长度不能超过500个字符")
private String description;
/**
* 备注
*/
@Size(max = 500, message = "备注长度不能超过500个字符")
private String remark;
}
@@ -0,0 +1,89 @@
package org.dromara.bzrkh.domain.bo;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.github.linpeilie.annotations.AutoMapper;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.dromara.common.core.validate.AddGroup;
import org.dromara.common.core.validate.EditGroup;
import org.dromara.common.mybatis.core.domain.BaseEntity;
import org.dromara.bzrkh.domain.BmzrAssessmentScheme;
import java.util.Date;
/**
* 班主任考核方案业务对象 bmzr_assessment_scheme
*
* @author system
* @date 2025-01-08
*/
@Data
@EqualsAndHashCode(callSuper = true)
@AutoMapper(target = BmzrAssessmentScheme.class, reverseConvertGenerate = false)
public class BmzrAssessmentSchemeBo extends BaseEntity {
/**
* 主键ID
*/
@NotNull(message = "主键ID不能为空", groups = { EditGroup.class })
private Long id;
/**
* 删除标志
*/
private Long deleted;
/**
* 方案名称
*/
@NotBlank(message = "方案名称不能为空", groups = { AddGroup.class, EditGroup.class })
private String schemeName;
/**
* 方案编码
*/
@NotBlank(message = "方案编码不能为空", groups = { AddGroup.class, EditGroup.class })
private String schemeCode;
/**
* 学年
*/
@NotBlank(message = "学年不能为空", groups = { AddGroup.class, EditGroup.class })
private String academicYear;
/**
* 学期
*/
@NotBlank(message = "学期不能为空", groups = { AddGroup.class, EditGroup.class })
private String semester;
/**
* 方案描述
*/
private String schemeDescription;
/**
* 是否需要自评
*/
@NotBlank(message = "是否需要自评不能为空", groups = { AddGroup.class, EditGroup.class })
private String selfEvaluationRequired;
/**
* 是否需要上级评
*/
@NotBlank(message = "是否需要上级评不能为空", groups = { AddGroup.class, EditGroup.class })
private String superiorEvaluationRequired;
/**
* 状态
*/
@NotBlank(message = "状态不能为空", groups = { AddGroup.class, EditGroup.class })
private String status;
/**
* 备注
*/
private String remark;
}
@@ -0,0 +1,77 @@
package org.dromara.bzrkh.domain.bo;
import org.dromara.bzrkh.domain.BmzrAssessmentSchemeIndicator;
import org.dromara.common.mybatis.core.domain.BaseEntity;
import org.dromara.common.core.validate.AddGroup;
import org.dromara.common.core.validate.EditGroup;
import io.github.linpeilie.annotations.AutoMapper;
import lombok.Data;
import lombok.EqualsAndHashCode;
import jakarta.validation.constraints.*;
import java.math.BigDecimal;
/**
* 班主任考核方案指标关联业务对象 bmzr_assessment_scheme_indicator
*
* @author ruoyi
* @date 2025-01-08
*/
@Data
@EqualsAndHashCode(callSuper = true)
@AutoMapper(target = BmzrAssessmentSchemeIndicator.class, reverseConvertGenerate = false)
public class BmzrAssessmentSchemeIndicatorBo extends BaseEntity {
/**
* 主键ID
*/
@NotNull(message = "主键ID不能为空", groups = { EditGroup.class })
private Long id;
/**
* 考核方案ID
*/
@NotNull(message = "考核方案ID不能为空", groups = { AddGroup.class, EditGroup.class })
private Long schemeId;
/**
* 考核指标ID
*/
@NotNull(message = "考核指标ID不能为空", groups = { AddGroup.class, EditGroup.class })
private Long indicatorId;
/**
* 在方案中的权重比例
*/
@DecimalMin(value = "0", message = "权重比例必须大于等于0")
@DecimalMax(value = "1", message = "权重比例必须小于等于1")
private BigDecimal weightRatio;
/**
* 自定义最高分值
*/
@DecimalMin(value = "0", message = "自定义最高分值必须大于等于0")
private BigDecimal customMaxScore;
/**
* 指标分值(用于前端传递,保存时映射到customMaxScore)
*/
@DecimalMin(value = "0", message = "指标分值必须大于等于0")
private BigDecimal score;
/**
* 排序
*/
@Min(value = 1, message = "排序必须大于等于1")
private Integer sortOrder;
/**
* 备注
*/
private String remark;
/**
* 指标名称(用于查询条件)
*/
private String indicatorName;
}
@@ -0,0 +1,46 @@
package org.dromara.bzrkh.domain.bo;
import org.dromara.common.mybatis.core.domain.BaseEntity;
import lombok.Data;
import lombok.EqualsAndHashCode;
/**
* 班主任考核查询业务对象
*
* @author ruoyi
* @date 2025-01-27
*/
@Data
@EqualsAndHashCode(callSuper = true)
public class TeacherAssessmentQueryBo extends BaseEntity {
/**
* 计划名称
*/
private String planName;
/**
* 班级ID
*/
private Long classId;
/**
* 班主任ID
*/
private Long teacherId;
/**
* 学年
*/
private String academicYear;
/**
* 学期(1=上学期 2=下学期)
*/
private String semester;
/**
* 计划状态(0=禁用 1=启用)
*/
private String planStatus;
}
@@ -0,0 +1,90 @@
package org.dromara.bzrkh.domain.vo;
import org.dromara.bzrkh.domain.BmzrAssessmentIndicatorType;
import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
import cn.idev.excel.annotation.ExcelProperty;
import org.dromara.common.excel.annotation.ExcelDictFormat;
import org.dromara.common.excel.convert.ExcelDictConvert;
import io.github.linpeilie.annotations.AutoMapper;
import lombok.Data;
import com.fasterxml.jackson.annotation.JsonFormat;
import java.io.Serial;
import java.io.Serializable;
import java.util.Date;
/**
* 班主任考核指标类型视图对象 bmzr_assessment_indicator_type
*
* @author ruoyi
* @date 2025-01-08
*/
@Data
@ExcelIgnoreUnannotated
@AutoMapper(target = BmzrAssessmentIndicatorType.class)
public class BmzrAssessmentIndicatorTypeVo implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
/**
* 主键ID
*/
@ExcelProperty(value = "主键ID")
private Long id;
/**
* 删除标志
*/
@ExcelProperty(value = "删除标志", converter = ExcelDictConvert.class)
@ExcelDictFormat(dictType = "sys_item_delete")
private Integer deleted;
/**
* 指标类型名称
*/
@ExcelProperty(value = "指标类型名称")
private String indicatorTypeName;
/**
* 指标类型编码
*/
@ExcelProperty(value = "指标类型编码")
private String indicatorTypeCode;
/**
* 状态
*/
@ExcelProperty(value = "状态", converter = ExcelDictConvert.class)
@ExcelDictFormat(dictType = "sys_item_enable")
private String status;
/**
* 备注
*/
@ExcelProperty(value = "备注")
private String remark;
/**
* 创建者
*/
private Long createBy;
/**
* 创建时间
*/
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date createTime;
/**
* 更新者
*/
private Long updateBy;
/**
* 更新时间
*/
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date updateTime;
}
@@ -0,0 +1,157 @@
package org.dromara.bzrkh.domain.vo;
import org.dromara.bzrkh.domain.BmzrAssessmentIndicator;
import org.dromara.bzrkh.domain.BmzrAssessmentIndicatorType;
import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
import cn.idev.excel.annotation.ExcelProperty;
import org.dromara.common.excel.annotation.ExcelDictFormat;
import org.dromara.common.excel.convert.ExcelDictConvert;
import io.github.linpeilie.annotations.AutoMapper;
import lombok.Data;
import com.fasterxml.jackson.annotation.JsonFormat;
import java.io.Serial;
import java.io.Serializable;
import java.util.Date;
import java.math.BigDecimal;
import java.util.List;
/**
* 班主任考核指标体系视图对象 bmzr_assessment_indicator
*
* @author ruoyi
* @date 2025-01-08
*/
@Data
@ExcelIgnoreUnannotated
@AutoMapper(target = BmzrAssessmentIndicator.class)
public class BmzrAssessmentIndicatorVo implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
/**
* 主键ID
*/
@ExcelProperty(value = "主键ID")
private Long id;
/**
* 租户编号
*/
@ExcelProperty(value = "租户编号")
private String tenantId;
/**
* 指标名称
*/
@ExcelProperty(value = "指标名称")
private String indicatorName;
/**
* 指标编码
*/
@ExcelProperty(value = "指标编码")
private String indicatorCode;
/**
* 指标类型
*/
@ExcelProperty(value = "指标类型")
private String indicatorType;
/**
* 父级指标ID
*/
@ExcelProperty(value = "父级指标ID")
private Long parentId;
/**
* 排序
*/
@ExcelProperty(value = "排序")
private Integer sortOrder;
/**
* 权重比例(0-1之间)
*/
@ExcelProperty(value = "权重比例")
private BigDecimal weightRatio;
/**
* 最高分值
*/
@ExcelProperty(value = "最高分值")
private BigDecimal maxScore;
/**
* 分值
*/
@ExcelProperty(value = "分值")
private BigDecimal score;
/**
* 允许自评(0=否 1=是)
*/
@ExcelProperty(value = "允许自评", converter = ExcelDictConvert.class)
@ExcelDictFormat(dictType = "sys_yes_no")
private String allowSelfEvaluation;
/**
* 允许上级评(0=否 1=是)
*/
@ExcelProperty(value = "允许上级评", converter = ExcelDictConvert.class)
@ExcelDictFormat(dictType = "sys_yes_no")
private String allowSuperiorEvaluation;
/**
* 状态(0正常 1停用)
*/
@ExcelProperty(value = "状态", converter = ExcelDictConvert.class)
@ExcelDictFormat(dictType = "sys_item_enable")
private String status;
/**
* 备注
*/
@ExcelProperty(value = "备注")
private String remark;
/**
* 创建部门
*/
private Long createDept;
/**
* 创建者
*/
private Long createBy;
/**
* 创建时间
*/
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date createTime;
/**
* 更新者
*/
private Long updateBy;
/**
* 更新时间
*/
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date updateTime;
/**
* 删除标志(0代表存在 1代表删除)
*/
private Integer deleted;
/**
* 子节点列表(用于树形结构)
*/
private List<BmzrAssessmentIndicatorVo> children;
}
@@ -0,0 +1,153 @@
package org.dromara.bzrkh.domain.vo;
import org.dromara.bzrkh.domain.BmzrAssessmentPlan;
import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
import cn.idev.excel.annotation.ExcelProperty;
import org.dromara.common.excel.annotation.ExcelDictFormat;
import org.dromara.common.excel.convert.ExcelDictConvert;
import io.github.linpeilie.annotations.AutoMapper;
import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
import java.util.Date;
/**
* 班主任考核计划视图对象 bmzr_assessment_plan
*
* @author ruoyi
* @date 2025-01-08
*/
@Data
@ExcelIgnoreUnannotated
@AutoMapper(target = BmzrAssessmentPlan.class)
public class BmzrAssessmentPlanVo implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
/**
* 主键ID
*/
@ExcelProperty(value = "主键ID")
private Long id;
/**
* 租户编号
*/
@ExcelProperty(value = "租户编号")
private String tenantId;
/**
* 计划名称
*/
@ExcelProperty(value = "计划名称")
private String planName;
/**
* 计划编码
*/
@ExcelProperty(value = "计划编码")
private String planCode;
/**
* 考核方案ID
*/
@ExcelProperty(value = "考核方案ID")
private Long schemeId;
/**
* 考核方案名称
*/
@ExcelProperty(value = "考核方案名称")
private String schemeName;
/**
* 学年
*/
@ExcelProperty(value = "学年")
private String academicYear;
/**
* 学期(1=上学期 2=下学期)
*/
@ExcelProperty(value = "学期", converter = ExcelDictConvert.class)
@ExcelDictFormat(dictType = "sys_semester")
private String semester;
/**
* 计划开始时间
*/
@ExcelProperty(value = "计划开始时间")
private Date planStartTime;
/**
* 计划结束时间
*/
@ExcelProperty(value = "计划结束时间")
private Date planEndTime;
/**
* 数据提取开始时间
*/
@ExcelProperty(value = "数据提取开始时间")
private Date dataExtractStartTime;
/**
* 数据提取结束时间
*/
@ExcelProperty(value = "数据提取结束时间")
private Date dataExtractEndTime;
/**
* 计划状态(0=禁用 1=启用)
*/
@ExcelProperty(value = "计划状态", converter = ExcelDictConvert.class)
@ExcelDictFormat(dictType = "sys_normal_disable")
private String planStatus;
/**
* 计划描述
*/
@ExcelProperty(value = "计划描述")
private String description;
/**
* 备注
*/
@ExcelProperty(value = "备注")
private String remark;
/**
* 创建部门
*/
@ExcelProperty(value = "创建部门")
private Long createDept;
/**
* 创建者
*/
private Long createBy;
/**
* 创建时间
*/
@ExcelProperty(value = "创建时间")
private Date createTime;
/**
* 更新者
*/
private Long updateBy;
/**
* 更新时间
*/
@ExcelProperty(value = "更新时间")
private Date updateTime;
/**
* 删除标志(0代表存在 1代表删除)
*/
private String deleted;
}
@@ -0,0 +1,126 @@
package org.dromara.bzrkh.domain.vo;
import org.dromara.bzrkh.domain.BmzrAssessmentSchemeIndicator;
import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
import cn.idev.excel.annotation.ExcelProperty;
import io.github.linpeilie.annotations.AutoMapper;
import lombok.Data;
import com.fasterxml.jackson.annotation.JsonFormat;
import java.io.Serial;
import java.io.Serializable;
import java.util.Date;
import java.math.BigDecimal;
/**
* 班主任考核方案指标关联视图对象 bmzr_assessment_scheme_indicator
*
* @author ruoyi
* @date 2025-01-08
*/
@Data
@ExcelIgnoreUnannotated
@AutoMapper(target = BmzrAssessmentSchemeIndicator.class)
public class BmzrAssessmentSchemeIndicatorVo implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
/**
* 主键ID
*/
@ExcelProperty(value = "主键ID")
private Long id;
/**
* 租户编号
*/
@ExcelProperty(value = "租户编号")
private String tenantId;
/**
* 考核方案ID
*/
@ExcelProperty(value = "考核方案ID")
private Long schemeId;
/**
* 考核指标ID
*/
@ExcelProperty(value = "考核指标ID")
private Long indicatorId;
/**
* 指标名称
*/
@ExcelProperty(value = "指标名称")
private String indicatorName;
/**
* 指标编码
*/
@ExcelProperty(value = "指标编码")
private String indicatorCode;
/**
* 在方案中的权重比例
*/
@ExcelProperty(value = "权重比例")
private BigDecimal weightRatio;
/**
* 自定义最高分值
*/
@ExcelProperty(value = "自定义最高分值")
private BigDecimal customMaxScore;
/**
* 分值
*/
@ExcelProperty(value = "分值")
private BigDecimal score;
/**
* 排序
*/
@ExcelProperty(value = "排序")
private Integer sortOrder;
/**
* 备注
*/
@ExcelProperty(value = "备注")
private String remark;
/**
* 创建部门
*/
private Long createDept;
/**
* 创建者
*/
private Long createBy;
/**
* 创建时间
*/
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date createTime;
/**
* 更新者
*/
private Long updateBy;
/**
* 更新时间
*/
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date updateTime;
/**
* 删除标志(0代表存在 1代表删除)
*/
private Integer deleted;
}
@@ -0,0 +1,131 @@
package org.dromara.bzrkh.domain.vo;
import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
import cn.idev.excel.annotation.ExcelProperty;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.github.linpeilie.annotations.AutoMapper;
import lombok.Data;
import org.dromara.bzrkh.domain.BmzrAssessmentScheme;
import java.io.Serial;
import java.io.Serializable;
import java.util.Date;
/**
* 班主任考核方案视图对象 bmzr_assessment_scheme
*
* @author system
* @date 2025-01-08
*/
@Data
@ExcelIgnoreUnannotated
@AutoMapper(target = BmzrAssessmentScheme.class)
public class BmzrAssessmentSchemeVo implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
/**
* 主键ID
*/
@ExcelProperty(value = "主键ID")
private Long id;
/**
* 租户编号
*/
@ExcelProperty(value = "租户编号")
private String tenantId;
/**
* 删除标志
*/
@ExcelProperty(value = "删除标志")
private Long deleted;
/**
* 方案名称
*/
@ExcelProperty(value = "方案名称")
private String schemeName;
/**
* 方案编码
*/
@ExcelProperty(value = "方案编码")
private String schemeCode;
/**
* 学年
*/
@ExcelProperty(value = "学年")
private String academicYear;
/**
* 学期
*/
@ExcelProperty(value = "学期")
private String semester;
/**
* 方案描述
*/
@ExcelProperty(value = "方案描述")
private String schemeDescription;
/**
* 是否需要自评
*/
@ExcelProperty(value = "是否需要自评")
private String selfEvaluationRequired;
/**
* 是否需要上级评
*/
@ExcelProperty(value = "是否需要上级评")
private String superiorEvaluationRequired;
/**
* 状态
*/
@ExcelProperty(value = "状态")
private String status;
/**
* 备注
*/
@ExcelProperty(value = "备注")
private String remark;
/**
* 创建部门
*/
@ExcelProperty(value = "创建部门")
private Long createDept;
/**
* 创建者
*/
@ExcelProperty(value = "创建者")
private Long createBy;
/**
* 创建时间
*/
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@ExcelProperty(value = "创建时间")
private Date createTime;
/**
* 更新者
*/
@ExcelProperty(value = "更新者")
private Long updateBy;
/**
* 更新时间
*/
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@ExcelProperty(value = "更新时间")
private Date updateTime;
}
@@ -0,0 +1,117 @@
package org.dromara.bzrkh.domain.vo;
import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
import cn.idev.excel.annotation.ExcelProperty;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
/**
* 班主任班级信息视图对象
*
* @author ruoyi
* @date 2025-01-27
*/
@Data
@ExcelIgnoreUnannotated
public class TeacherClassVo implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
/**
* 班级ID
*/
@ExcelProperty(value = "班级ID")
private Long id;
/**
* 班级代码
*/
@ExcelProperty(value = "班级代码")
private String classCode;
/**
* 班级名称
*/
@ExcelProperty(value = "班级名称")
private String className;
/**
* 班主任ID
*/
@ExcelProperty(value = "班主任ID")
private Long classTeacherId;
/**
* 班主任姓名
*/
@ExcelProperty(value = "班主任姓名")
private String classTeacherName;
/**
* 年级
*/
@ExcelProperty(value = "年级")
private String grade;
/**
* 学院ID
*/
@ExcelProperty(value = "学院ID")
private Long collegeId;
/**
* 学院名称
*/
@ExcelProperty(value = "学院名称")
private String collegeName;
/**
* 专业ID
*/
@ExcelProperty(value = "专业ID")
private Long majorId;
/**
* 专业名称
*/
@ExcelProperty(value = "专业名称")
private String majorName;
/**
* 班级状态:1-正常,2-暂停,3-毕业,4-解散
*/
@ExcelProperty(value = "班级状态")
private String classStatus;
/**
* 当前学生人数
*/
@ExcelProperty(value = "当前学生人数")
private Integer currentStudentCount;
/**
* 创建者
*/
private Long createBy;
/**
* 创建时间
*/
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private java.util.Date createTime;
/**
* 更新者
*/
private Long updateBy;
/**
* 更新时间
*/
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private java.util.Date updateTime;
}
@@ -0,0 +1,15 @@
package org.dromara.bzrkh.mapper;
import org.dromara.bzrkh.domain.BmzrAssessmentIndicator;
import org.dromara.bzrkh.domain.vo.BmzrAssessmentIndicatorVo;
import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
/**
* 班主任考核指标体系Mapper接口
*
* @author ruoyi
* @date 2025-01-08
*/
public interface BmzrAssessmentIndicatorMapper extends BaseMapperPlus<BmzrAssessmentIndicator, BmzrAssessmentIndicatorVo> {
}
@@ -0,0 +1,15 @@
package org.dromara.bzrkh.mapper;
import org.dromara.bzrkh.domain.BmzrAssessmentIndicatorType;
import org.dromara.bzrkh.domain.vo.BmzrAssessmentIndicatorTypeVo;
import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
/**
* 班主任考核指标类型Mapper接口
*
* @author ruoyi
* @date 2025-01-08
*/
public interface BmzrAssessmentIndicatorTypeMapper extends BaseMapperPlus<BmzrAssessmentIndicatorType, BmzrAssessmentIndicatorTypeVo> {
}
@@ -0,0 +1,30 @@
package org.dromara.bzrkh.mapper;
import org.dromara.bzrkh.domain.BmzrAssessmentPlan;
import org.dromara.bzrkh.domain.vo.BmzrAssessmentPlanVo;
import org.dromara.bzrkh.domain.bo.BmzrAssessmentPlanBo;
import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
import org.dromara.common.mybatis.core.page.PageQuery;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import java.util.List;
/**
* 班主任考核计划Mapper接口
*
* @author ruoyi
* @date 2025-01-08
*/
public interface BmzrAssessmentPlanMapper extends BaseMapperPlus<BmzrAssessmentPlan, BmzrAssessmentPlanVo> {
/**
* 查询班主任考核计划列表(包含方案名称)
*/
List<BmzrAssessmentPlanVo> selectAssessmentPlanListWithScheme(BmzrAssessmentPlanBo bo);
/**
* 分页查询班主任考核计划列表(包含方案名称)
*/
IPage<BmzrAssessmentPlanVo> selectAssessmentPlanPageWithScheme(Page<BmzrAssessmentPlanVo> page, BmzrAssessmentPlanBo bo);
}
@@ -0,0 +1,27 @@
package org.dromara.bzrkh.mapper;
import org.dromara.bzrkh.domain.BmzrAssessmentSchemeIndicator;
import org.dromara.bzrkh.domain.vo.BmzrAssessmentSchemeIndicatorVo;
import org.dromara.bzrkh.domain.bo.BmzrAssessmentSchemeIndicatorBo;
import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
import org.apache.ibatis.annotations.Param;
import java.util.List;
/**
* 班主任考核方案指标关联Mapper接口
*
* @author ruoyi
* @date 2025-01-08
*/
public interface BmzrAssessmentSchemeIndicatorMapper extends BaseMapperPlus<BmzrAssessmentSchemeIndicator, BmzrAssessmentSchemeIndicatorVo> {
/**
* 查询班主任考核方案指标关联列表(使用自定义SQL,包含score字段映射)
*
* @param bo 查询条件
* @return 班主任考核方案指标关联列表
*/
List<BmzrAssessmentSchemeIndicatorVo> queryList(@Param("bo") BmzrAssessmentSchemeIndicatorBo bo);
}
@@ -0,0 +1,15 @@
package org.dromara.bzrkh.mapper;
import org.dromara.bzrkh.domain.BmzrAssessmentScheme;
import org.dromara.bzrkh.domain.vo.BmzrAssessmentSchemeVo;
import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
/**
* 班主任考核方案Mapper接口
*
* @author system
* @date 2025-01-08
*/
public interface BmzrAssessmentSchemeMapper extends BaseMapperPlus<BmzrAssessmentScheme, BmzrAssessmentSchemeVo> {
}
@@ -0,0 +1,34 @@
package org.dromara.bzrkh.mapper;
import org.dromara.bzrkh.domain.vo.TeacherClassVo;
import org.dromara.bzrkh.domain.vo.BmzrAssessmentPlanVo;
import org.dromara.bzrkh.domain.bo.TeacherAssessmentQueryBo;
import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
import org.apache.ibatis.annotations.Param;
import java.util.List;
/**
* 班主任考核管理Mapper接口
*
* @author ruoyi
* @date 2025-01-27
*/
public interface TeacherAssessmentMapper extends BaseMapperPlus<Object, Object> {
/**
* 查询班主任管理的班级列表
*
* @param teacherId 班主任ID
* @return 班级列表
*/
List<TeacherClassVo> selectTeacherClassList(@Param("teacherId") Long teacherId);
/**
* 查询班主任考核计划列表
*
* @param bo 查询条件
* @return 考核计划列表
*/
List<BmzrAssessmentPlanVo> selectTeacherAssessmentPlanList(TeacherAssessmentQueryBo bo);
}
@@ -0,0 +1,53 @@
package org.dromara.bzrkh.service;
import org.dromara.bzrkh.domain.vo.BmzrAssessmentIndicatorVo;
import org.dromara.bzrkh.domain.bo.BmzrAssessmentIndicatorBo;
import org.dromara.common.mybatis.core.page.TableDataInfo;
import org.dromara.common.mybatis.core.page.PageQuery;
import java.util.Collection;
import java.util.List;
/**
* 班主任考核指标体系Service接口
*
* @author ruoyi
* @date 2025-01-08
*/
public interface IBmzrAssessmentIndicatorService {
/**
* 查询班主任考核指标体系
*/
BmzrAssessmentIndicatorVo queryById(Long id);
/**
* 查询班主任考核指标体系列表
*/
TableDataInfo<BmzrAssessmentIndicatorVo> queryPageList(BmzrAssessmentIndicatorBo bo, PageQuery pageQuery);
/**
* 查询班主任考核指标体系列表
*/
List<BmzrAssessmentIndicatorVo> queryList(BmzrAssessmentIndicatorBo bo);
/**
* 查询班主任考核指标体系树形列表
*/
List<BmzrAssessmentIndicatorVo> queryTreeList(BmzrAssessmentIndicatorBo bo);
/**
* 新增班主任考核指标体系
*/
Boolean insertByBo(BmzrAssessmentIndicatorBo bo);
/**
* 修改班主任考核指标体系
*/
Boolean updateByBo(BmzrAssessmentIndicatorBo bo);
/**
* 校验并批量删除班主任考核指标体系信息
*/
Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
}
@@ -0,0 +1,76 @@
package org.dromara.bzrkh.service;
import org.dromara.bzrkh.domain.vo.BmzrAssessmentIndicatorTypeVo;
import org.dromara.bzrkh.domain.bo.BmzrAssessmentIndicatorTypeBo;
import org.dromara.common.mybatis.core.page.TableDataInfo;
import org.dromara.common.mybatis.core.page.PageQuery;
import java.util.Collection;
import java.util.List;
/**
* 班主任考核指标类型Service接口
*
* @author ruoyi
* @date 2025-01-08
*/
public interface IBmzrAssessmentIndicatorTypeService {
/**
* 查询班主任考核指标类型
*
* @param id 主键
* @return 班主任考核指标类型
*/
BmzrAssessmentIndicatorTypeVo queryById(Long id);
/**
* 分页查询班主任考核指标类型列表
*
* @param bo 查询条件
* @param pageQuery 分页参数
* @return 班主任考核指标类型分页列表
*/
TableDataInfo<BmzrAssessmentIndicatorTypeVo> queryPageList(BmzrAssessmentIndicatorTypeBo bo, PageQuery pageQuery);
/**
* 查询符合条件的班主任考核指标类型列表
*
* @param bo 查询条件
* @return 班主任考核指标类型列表
*/
List<BmzrAssessmentIndicatorTypeVo> queryList(BmzrAssessmentIndicatorTypeBo bo);
/**
* 查询所有班主任考核指标类型列表,包括已逻辑删除的
*
* @param bo 查询条件
* @return 包含已删除记录的班主任考核指标类型列表
*/
List<BmzrAssessmentIndicatorTypeVo> queryListWithDeleted(BmzrAssessmentIndicatorTypeBo bo);
/**
* 新增班主任考核指标类型
*
* @param bo 班主任考核指标类型
* @return 是否新增成功
*/
Boolean insertByBo(BmzrAssessmentIndicatorTypeBo bo);
/**
* 修改班主任考核指标类型
*
* @param bo 班主任考核指标类型
* @return 是否修改成功
*/
Boolean updateByBo(BmzrAssessmentIndicatorTypeBo bo);
/**
* 校验并批量删除班主任考核指标类型信息
*
* @param ids 待删除的主键集合
* @param isValid 是否进行有效性校验
* @return 是否删除成功
*/
Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
}
@@ -0,0 +1,58 @@
package org.dromara.bzrkh.service;
import org.dromara.bzrkh.domain.vo.BmzrAssessmentPlanVo;
import org.dromara.bzrkh.domain.bo.BmzrAssessmentPlanBo;
import org.dromara.common.mybatis.core.page.TableDataInfo;
import org.dromara.common.mybatis.core.page.PageQuery;
import java.util.Collection;
import java.util.List;
/**
* 班主任考核计划Service接口
*
* @author ruoyi
* @date 2025-01-08
*/
public interface IBmzrAssessmentPlanService {
/**
* 查询班主任考核计划
*/
BmzrAssessmentPlanVo queryById(Long id);
/**
* 查询班主任考核计划列表
*/
TableDataInfo<BmzrAssessmentPlanVo> queryPageList(BmzrAssessmentPlanBo bo, PageQuery pageQuery);
/**
* 查询班主任考核计划列表
*/
List<BmzrAssessmentPlanVo> queryList(BmzrAssessmentPlanBo bo);
/**
* 新增班主任考核计划
*/
Boolean insertByBo(BmzrAssessmentPlanBo bo);
/**
* 修改班主任考核计划
*/
Boolean updateByBo(BmzrAssessmentPlanBo bo);
/**
* 校验并批量删除班主任考核计划信息
*/
Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
/**
* 修改考核计划状态
*/
Boolean updatePlanStatus(Long id, String planStatus);
/**
* 获取可用的考核方案选项
*/
List<BmzrAssessmentPlanVo> getAvailableSchemes();
}
@@ -0,0 +1,85 @@
package org.dromara.bzrkh.service;
import org.dromara.bzrkh.domain.vo.BmzrAssessmentSchemeIndicatorVo;
import org.dromara.bzrkh.domain.bo.BmzrAssessmentSchemeIndicatorBo;
import org.dromara.common.mybatis.core.page.TableDataInfo;
import org.dromara.common.mybatis.core.page.PageQuery;
import java.util.Collection;
import java.util.List;
/**
* 班主任考核方案指标关联Service接口
*
* @author ruoyi
* @date 2025-01-08
*/
public interface IBmzrAssessmentSchemeIndicatorService {
/**
* 查询班主任考核方案指标关联
*
* @param id 主键
* @return 班主任考核方案指标关联
*/
BmzrAssessmentSchemeIndicatorVo queryById(Long id);
/**
* 查询班主任考核方案指标关联列表
*
* @param bo 查询条件
* @return 班主任考核方案指标关联集合
*/
List<BmzrAssessmentSchemeIndicatorVo> queryList(BmzrAssessmentSchemeIndicatorBo bo);
/**
* 分页查询班主任考核方案指标关联列表
*
* @param bo 查询条件
* @param pageQuery 分页查询条件
* @return 班主任考核方案指标关联分页列表
*/
TableDataInfo<BmzrAssessmentSchemeIndicatorVo> queryPageList(BmzrAssessmentSchemeIndicatorBo bo, PageQuery pageQuery);
/**
* 新增班主任考核方案指标关联
*
* @param bo 班主任考核方案指标关联
* @return 新增结果
*/
Boolean insertByBo(BmzrAssessmentSchemeIndicatorBo bo);
/**
* 修改班主任考核方案指标关联
*
* @param bo 班主任考核方案指标关联
* @return 修改结果
*/
Boolean updateByBo(BmzrAssessmentSchemeIndicatorBo bo);
/**
* 校验并批量删除班主任考核方案指标关联信息
*
* @param ids 主键集合
* @param isValid 是否校验,true-删除前校验,false-不校验
* @return 删除结果
*/
Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
/**
* 根据方案ID查询指标关联列表
*
* @param schemeId 方案ID
* @return 指标关联列表
*/
List<BmzrAssessmentSchemeIndicatorVo> queryBySchemeId(Long schemeId);
/**
* 批量保存方案指标关联
*
* @param schemeId 方案ID
* @param indicatorList 指标列表
* @return 保存结果
*/
Boolean batchSaveSchemeIndicators(Long schemeId, List<BmzrAssessmentSchemeIndicatorBo> indicatorList);
}
@@ -0,0 +1,48 @@
package org.dromara.bzrkh.service;
import org.dromara.bzrkh.domain.vo.BmzrAssessmentSchemeVo;
import org.dromara.bzrkh.domain.bo.BmzrAssessmentSchemeBo;
import org.dromara.common.mybatis.core.page.TableDataInfo;
import org.dromara.common.mybatis.core.page.PageQuery;
import java.util.Collection;
import java.util.List;
/**
* 班主任考核方案Service接口
*
* @author system
* @date 2025-01-08
*/
public interface IBmzrAssessmentSchemeService {
/**
* 查询班主任考核方案
*/
BmzrAssessmentSchemeVo queryById(Long id);
/**
* 查询班主任考核方案列表
*/
TableDataInfo<BmzrAssessmentSchemeVo> queryPageList(BmzrAssessmentSchemeBo bo, PageQuery pageQuery);
/**
* 查询班主任考核方案列表
*/
List<BmzrAssessmentSchemeVo> queryList(BmzrAssessmentSchemeBo bo);
/**
* 新增班主任考核方案
*/
Boolean insertByBo(BmzrAssessmentSchemeBo bo);
/**
* 修改班主任考核方案
*/
Boolean updateByBo(BmzrAssessmentSchemeBo bo);
/**
* 校验并批量删除班主任考核方案信息
*/
Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
}
@@ -0,0 +1,55 @@
package org.dromara.bzrkh.service;
import org.dromara.bzrkh.domain.vo.TeacherClassVo;
import org.dromara.bzrkh.domain.vo.BmzrAssessmentPlanVo;
import org.dromara.bzrkh.domain.bo.TeacherAssessmentQueryBo;
import org.dromara.common.mybatis.core.page.TableDataInfo;
import org.dromara.common.mybatis.core.page.PageQuery;
import java.util.List;
/**
* 班主任考核管理Service接口
*
* @author ruoyi
* @date 2025-01-27
*/
public interface ITeacherAssessmentService {
/**
* 查询班主任管理的班级列表
*
* @param teacherId 班主任ID
* @return 班级列表
*/
List<TeacherClassVo> queryTeacherClassList(Long teacherId);
/**
* 查询班主任考核计划列表(分页)
*
* @param bo 查询条件
* @param pageQuery 分页参数
* @return 考核计划列表
*/
TableDataInfo<BmzrAssessmentPlanVo> queryTeacherAssessmentPlanPageList(TeacherAssessmentQueryBo bo, PageQuery pageQuery);
/**
* 提交考核
*
* @param planId 计划ID
* @param classId 班级ID
* @param teacherId 班主任ID
* @return 是否成功
*/
boolean submitAssessment(Long planId, Long classId, Long teacherId);
/**
* 查看考核详情
*
* @param planId 计划ID
* @param classId 班级ID
* @param teacherId 班主任ID
* @return 考核详情
*/
Object getAssessmentDetail(Long planId, Long classId, Long teacherId);
}
@@ -0,0 +1,180 @@
package org.dromara.bzrkh.service.impl;
import org.dromara.common.core.utils.MapstructUtils;
import org.dromara.common.core.utils.StringUtils;
import org.dromara.common.mybatis.core.page.TableDataInfo;
import org.dromara.common.mybatis.core.page.PageQuery;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.dromara.bzrkh.domain.bo.BmzrAssessmentIndicatorBo;
import org.dromara.bzrkh.domain.vo.BmzrAssessmentIndicatorVo;
import org.dromara.bzrkh.domain.BmzrAssessmentIndicator;
import org.dromara.bzrkh.mapper.BmzrAssessmentIndicatorMapper;
import org.dromara.bzrkh.service.IBmzrAssessmentIndicatorService;
import java.util.List;
import java.util.Collection;
import java.util.ArrayList;
import java.util.stream.Collectors;
/**
* 班主任考核指标体系Service业务层处理
*
* @author ruoyi
* @date 2025-01-08
*/
@RequiredArgsConstructor
@Service
public class BmzrAssessmentIndicatorServiceImpl implements IBmzrAssessmentIndicatorService {
private final BmzrAssessmentIndicatorMapper baseMapper;
/**
* 查询班主任考核指标体系
*/
@Override
public BmzrAssessmentIndicatorVo queryById(Long id){
return baseMapper.selectVoById(id);
}
/**
* 查询班主任考核指标体系列表
*/
@Override
public TableDataInfo<BmzrAssessmentIndicatorVo> queryPageList(BmzrAssessmentIndicatorBo bo, PageQuery pageQuery) {
LambdaQueryWrapper<BmzrAssessmentIndicator> lqw = buildQueryWrapper(bo);
Page<BmzrAssessmentIndicatorVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
return TableDataInfo.build(result);
}
/**
* 查询班主任考核指标体系列表
*/
@Override
public List<BmzrAssessmentIndicatorVo> queryList(BmzrAssessmentIndicatorBo bo) {
LambdaQueryWrapper<BmzrAssessmentIndicator> lqw = buildQueryWrapper(bo);
return baseMapper.selectVoList(lqw);
}
/**
* 查询班主任考核指标体系树形列表
*/
@Override
public List<BmzrAssessmentIndicatorVo> queryTreeList(BmzrAssessmentIndicatorBo bo) {
LambdaQueryWrapper<BmzrAssessmentIndicator> lqw = buildQueryWrapper(bo);
lqw.orderByAsc(BmzrAssessmentIndicator::getSortOrder);
List<BmzrAssessmentIndicatorVo> list = baseMapper.selectVoList(lqw);
return buildTree(list);
}
private LambdaQueryWrapper<BmzrAssessmentIndicator> buildQueryWrapper(BmzrAssessmentIndicatorBo bo) {
LambdaQueryWrapper<BmzrAssessmentIndicator> lqw = Wrappers.lambdaQuery();
lqw.like(StringUtils.isNotBlank(bo.getIndicatorName()), BmzrAssessmentIndicator::getIndicatorName, bo.getIndicatorName());
lqw.eq(StringUtils.isNotBlank(bo.getIndicatorCode()), BmzrAssessmentIndicator::getIndicatorCode, bo.getIndicatorCode());
lqw.eq(StringUtils.isNotBlank(bo.getIndicatorType()), BmzrAssessmentIndicator::getIndicatorType, bo.getIndicatorType());
lqw.eq(bo.getParentId() != null, BmzrAssessmentIndicator::getParentId, bo.getParentId());
lqw.eq(StringUtils.isNotBlank(bo.getAllowSelfEvaluation()), BmzrAssessmentIndicator::getAllowSelfEvaluation, bo.getAllowSelfEvaluation());
lqw.eq(StringUtils.isNotBlank(bo.getAllowSuperiorEvaluation()), BmzrAssessmentIndicator::getAllowSuperiorEvaluation, bo.getAllowSuperiorEvaluation());
lqw.eq(StringUtils.isNotBlank(bo.getStatus()), BmzrAssessmentIndicator::getStatus, bo.getStatus());
lqw.orderByAsc(BmzrAssessmentIndicator::getSortOrder);
return lqw;
}
/**
* 构建树形结构
*/
private List<BmzrAssessmentIndicatorVo> buildTree(List<BmzrAssessmentIndicatorVo> list) {
List<BmzrAssessmentIndicatorVo> tree = new ArrayList<>();
List<Long> tempList = list.stream().map(BmzrAssessmentIndicatorVo::getId).collect(Collectors.toList());
for (BmzrAssessmentIndicatorVo vo : list) {
// 如果是顶级节点,遍历该父节点的所有子节点
if (vo.getParentId() == null || vo.getParentId() == 0 || !tempList.contains(vo.getParentId())) {
recursionFn(list, vo);
tree.add(vo);
}
}
if (tree.isEmpty()) {
tree = list;
}
return tree;
}
/**
* 递归列表
*/
private void recursionFn(List<BmzrAssessmentIndicatorVo> list, BmzrAssessmentIndicatorVo vo) {
// 得到子节点列表
List<BmzrAssessmentIndicatorVo> childList = getChildList(list, vo);
vo.setChildren(childList);
for (BmzrAssessmentIndicatorVo tChild : childList) {
if (hasChild(list, tChild)) {
recursionFn(list, tChild);
}
}
}
/**
* 得到子节点列表
*/
private List<BmzrAssessmentIndicatorVo> getChildList(List<BmzrAssessmentIndicatorVo> list, BmzrAssessmentIndicatorVo vo) {
List<BmzrAssessmentIndicatorVo> tlist = new ArrayList<>();
for (BmzrAssessmentIndicatorVo n : list) {
if (n.getParentId() != null && n.getParentId().longValue() == vo.getId().longValue()) {
tlist.add(n);
}
}
return tlist;
}
/**
* 判断是否有子节点
*/
private boolean hasChild(List<BmzrAssessmentIndicatorVo> list, BmzrAssessmentIndicatorVo vo) {
return getChildList(list, vo).size() > 0;
}
/**
* 新增班主任考核指标体系
*/
@Override
public Boolean insertByBo(BmzrAssessmentIndicatorBo bo) {
BmzrAssessmentIndicator add = MapstructUtils.convert(bo, BmzrAssessmentIndicator.class);
validEntityBeforeSave(add);
boolean flag = baseMapper.insert(add) > 0;
if (flag) {
bo.setId(add.getId());
}
return flag;
}
/**
* 修改班主任考核指标体系
*/
@Override
public Boolean updateByBo(BmzrAssessmentIndicatorBo bo) {
BmzrAssessmentIndicator update = MapstructUtils.convert(bo, BmzrAssessmentIndicator.class);
validEntityBeforeSave(update);
return baseMapper.updateById(update) > 0;
}
/**
* 保存前的数据校验
*/
private void validEntityBeforeSave(BmzrAssessmentIndicator entity){
//TODO 做一些数据校验,如唯一约束
}
/**
* 批量删除班主任考核指标体系
*/
@Override
public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
if(isValid){
//TODO 做一些业务上的校验,判断是否需要校验
}
return baseMapper.deleteBatchIds(ids) > 0;
}
}
@@ -0,0 +1,168 @@
package org.dromara.bzrkh.service.impl;
import org.dromara.common.core.utils.MapstructUtils;
import org.dromara.common.core.utils.StringUtils;
import org.dromara.common.mybatis.core.page.TableDataInfo;
import org.dromara.common.mybatis.core.page.PageQuery;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.dromara.bzrkh.domain.bo.BmzrAssessmentIndicatorTypeBo;
import org.dromara.bzrkh.domain.vo.BmzrAssessmentIndicatorTypeVo;
import org.dromara.bzrkh.domain.BmzrAssessmentIndicatorType;
import org.dromara.bzrkh.mapper.BmzrAssessmentIndicatorTypeMapper;
import org.dromara.bzrkh.service.IBmzrAssessmentIndicatorTypeService;
import java.util.List;
import java.util.Collection;
/**
* 班主任考核指标类型Service业务层处理
*
* @author ruoyi
* @date 2025-01-08
*/
@Slf4j
@RequiredArgsConstructor
@Service
public class BmzrAssessmentIndicatorTypeServiceImpl implements IBmzrAssessmentIndicatorTypeService {
private final BmzrAssessmentIndicatorTypeMapper baseMapper;
/**
* 查询班主任考核指标类型
*
* @param id 主键
* @return 班主任考核指标类型
*/
@Override
public BmzrAssessmentIndicatorTypeVo queryById(Long id) {
return baseMapper.selectVoById(id);
}
/**
* 分页查询班主任考核指标类型列表
*
* @param bo 查询条件
* @param pageQuery 分页参数
* @return 班主任考核指标类型分页列表
*/
@Override
public TableDataInfo<BmzrAssessmentIndicatorTypeVo> queryPageList(BmzrAssessmentIndicatorTypeBo bo, PageQuery pageQuery) {
LambdaQueryWrapper<BmzrAssessmentIndicatorType> lqw = buildQueryWrapper(bo);
Page<BmzrAssessmentIndicatorTypeVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
return TableDataInfo.build(result);
}
/**
* 查询符合条件的班主任考核指标类型列表
*
* @param bo 查询条件
* @return 班主任考核指标类型列表
*/
@Override
public List<BmzrAssessmentIndicatorTypeVo> queryList(BmzrAssessmentIndicatorTypeBo bo) {
LambdaQueryWrapper<BmzrAssessmentIndicatorType> lqw = buildQueryWrapper(bo);
return baseMapper.selectVoList(lqw);
}
/**
* 查询所有班主任考核指标类型列表,包括已逻辑删除的
*
* @param bo 查询条件
* @return 包含已删除记录的班主任考核指标类型列表
*/
@Override
public List<BmzrAssessmentIndicatorTypeVo> queryListWithDeleted(BmzrAssessmentIndicatorTypeBo bo) {
LambdaQueryWrapper<BmzrAssessmentIndicatorType> lqw = buildQueryWrapperWithDeleted(bo);
return baseMapper.selectVoList(lqw);
}
private LambdaQueryWrapper<BmzrAssessmentIndicatorType> buildQueryWrapper(BmzrAssessmentIndicatorTypeBo bo) {
LambdaQueryWrapper<BmzrAssessmentIndicatorType> lqw = Wrappers.lambdaQuery();
lqw.eq(bo.getDeleted() != null, BmzrAssessmentIndicatorType::getDeleted, bo.getDeleted());
lqw.like(StringUtils.isNotBlank(bo.getIndicatorTypeName()), BmzrAssessmentIndicatorType::getIndicatorTypeName, bo.getIndicatorTypeName());
lqw.eq(StringUtils.isNotBlank(bo.getIndicatorTypeCode()), BmzrAssessmentIndicatorType::getIndicatorTypeCode, bo.getIndicatorTypeCode());
lqw.eq(StringUtils.isNotBlank(bo.getStatus()), BmzrAssessmentIndicatorType::getStatus, bo.getStatus());
lqw.orderByAsc(BmzrAssessmentIndicatorType::getCreateTime);
return lqw;
}
private LambdaQueryWrapper<BmzrAssessmentIndicatorType> buildQueryWrapperWithDeleted(BmzrAssessmentIndicatorTypeBo bo) {
LambdaQueryWrapper<BmzrAssessmentIndicatorType> lqw = Wrappers.lambdaQuery();
// 禁用逻辑删除过滤器,查询包含已删除的记录
lqw.in(BmzrAssessmentIndicatorType::getDeleted, 0, 1);
lqw.like(StringUtils.isNotBlank(bo.getIndicatorTypeName()), BmzrAssessmentIndicatorType::getIndicatorTypeName, bo.getIndicatorTypeName());
lqw.eq(StringUtils.isNotBlank(bo.getIndicatorTypeCode()), BmzrAssessmentIndicatorType::getIndicatorTypeCode, bo.getIndicatorTypeCode());
lqw.eq(StringUtils.isNotBlank(bo.getStatus()), BmzrAssessmentIndicatorType::getStatus, bo.getStatus());
lqw.orderByAsc(BmzrAssessmentIndicatorType::getCreateTime);
return lqw;
}
/**
* 新增班主任考核指标类型
*
* @param bo 班主任考核指标类型
* @return 是否新增成功
*/
@Override
public Boolean insertByBo(BmzrAssessmentIndicatorTypeBo bo) {
BmzrAssessmentIndicatorType add = MapstructUtils.convert(bo, BmzrAssessmentIndicatorType.class);
validEntityBeforeSave(add);
boolean flag = baseMapper.insert(add) > 0;
if (flag) {
bo.setId(add.getId());
}
return flag;
}
/**
* 修改班主任考核指标类型
*
* @param bo 班主任考核指标类型
* @return 是否修改成功
*/
@Override
public Boolean updateByBo(BmzrAssessmentIndicatorTypeBo bo) {
BmzrAssessmentIndicatorType update = MapstructUtils.convert(bo, BmzrAssessmentIndicatorType.class);
validEntityBeforeSave(update);
return baseMapper.updateById(update) > 0;
}
/**
* 保存前的数据校验
*
* @param entity 实体类数据
*/
private void validEntityBeforeSave(BmzrAssessmentIndicatorType entity) {
// TODO 做一些数据校验,如唯一约束
// 检查指标类型编码是否重复
LambdaQueryWrapper<BmzrAssessmentIndicatorType> lqw = Wrappers.lambdaQuery();
lqw.eq(BmzrAssessmentIndicatorType::getIndicatorTypeCode, entity.getIndicatorTypeCode());
if (entity.getId() != null) {
lqw.ne(BmzrAssessmentIndicatorType::getId, entity.getId());
}
boolean exists = baseMapper.exists(lqw);
if (exists) {
throw new RuntimeException("指标类型编码已存在,请修改后重试");
}
}
/**
* 批量删除班主任考核指标类型
*
* @param ids 待删除的主键集合
* @param isValid 是否进行有效性校验
* @return 是否删除成功
*/
@Override
public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
if (isValid) {
// TODO 做一些业务上的校验,判断是否需要校验
}
return baseMapper.deleteByIds(ids) > 0;
}
}
@@ -0,0 +1,147 @@
package org.dromara.bzrkh.service.impl;
import org.dromara.common.core.utils.MapstructUtils;
import org.dromara.common.core.utils.StringUtils;
import org.dromara.common.mybatis.core.page.TableDataInfo;
import org.dromara.common.mybatis.core.page.PageQuery;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.dromara.bzrkh.domain.bo.BmzrAssessmentPlanBo;
import org.dromara.bzrkh.domain.vo.BmzrAssessmentPlanVo;
import org.dromara.bzrkh.domain.BmzrAssessmentPlan;
import org.dromara.bzrkh.mapper.BmzrAssessmentPlanMapper;
import org.dromara.bzrkh.service.IBmzrAssessmentPlanService;
import java.util.List;
import java.util.Map;
import java.util.Collection;
/**
* 班主任考核计划Service业务层处理
*
* @author ruoyi
* @date 2025-01-08
*/
@RequiredArgsConstructor
@Service
public class BmzrAssessmentPlanServiceImpl implements IBmzrAssessmentPlanService {
private final BmzrAssessmentPlanMapper baseMapper;
/**
* 查询班主任考核计划
*/
@Override
public BmzrAssessmentPlanVo queryById(Long id){
return baseMapper.selectVoById(id);
}
/**
* 查询班主任考核计划列表
*/
@Override
public TableDataInfo<BmzrAssessmentPlanVo> queryPageList(BmzrAssessmentPlanBo bo, PageQuery pageQuery) {
IPage<BmzrAssessmentPlanVo> page = baseMapper.selectAssessmentPlanPageWithScheme(pageQuery.build(), bo);
return TableDataInfo.build(page);
}
/**
* 查询班主任考核计划列表
*/
@Override
public List<BmzrAssessmentPlanVo> queryList(BmzrAssessmentPlanBo bo) {
return baseMapper.selectAssessmentPlanListWithScheme(bo);
}
private LambdaQueryWrapper<BmzrAssessmentPlan> buildQueryWrapper(BmzrAssessmentPlanBo bo) {
Map<String, Object> params = bo.getParams();
LambdaQueryWrapper<BmzrAssessmentPlan> lqw = Wrappers.lambdaQuery();
lqw.like(StringUtils.isNotBlank(bo.getPlanName()), BmzrAssessmentPlan::getPlanName, bo.getPlanName());
lqw.eq(StringUtils.isNotBlank(bo.getPlanCode()), BmzrAssessmentPlan::getPlanCode, bo.getPlanCode());
lqw.eq(bo.getSchemeId() != null, BmzrAssessmentPlan::getSchemeId, bo.getSchemeId());
lqw.like(StringUtils.isNotBlank(bo.getAcademicYear()), BmzrAssessmentPlan::getAcademicYear, bo.getAcademicYear());
lqw.eq(StringUtils.isNotBlank(bo.getSemester()), BmzrAssessmentPlan::getSemester, bo.getSemester());
lqw.eq(StringUtils.isNotBlank(bo.getPlanStatus()), BmzrAssessmentPlan::getPlanStatus, bo.getPlanStatus());
lqw.between(params.get("beginCreateTime") != null && params.get("endCreateTime") != null,
BmzrAssessmentPlan::getCreateTime, params.get("beginCreateTime"), params.get("endCreateTime"));
lqw.orderByDesc(BmzrAssessmentPlan::getCreateTime);
return lqw;
}
/**
* 新增班主任考核计划
*/
@Override
public Boolean insertByBo(BmzrAssessmentPlanBo bo) {
BmzrAssessmentPlan add = MapstructUtils.convert(bo, BmzrAssessmentPlan.class);
validEntityBeforeSave(add);
boolean flag = baseMapper.insert(add) > 0;
if (flag) {
bo.setId(add.getId());
}
return flag;
}
/**
* 修改班主任考核计划
*/
@Override
public Boolean updateByBo(BmzrAssessmentPlanBo bo) {
BmzrAssessmentPlan update = MapstructUtils.convert(bo, BmzrAssessmentPlan.class);
validEntityBeforeSave(update);
return baseMapper.updateById(update) > 0;
}
/**
* 保存前的数据校验
*/
private void validEntityBeforeSave(BmzrAssessmentPlan entity){
// 计划编码唯一性校验
LambdaQueryWrapper<BmzrAssessmentPlan> lqw = Wrappers.lambdaQuery();
lqw.eq(BmzrAssessmentPlan::getPlanCode, entity.getPlanCode());
if (entity.getId() != null) {
lqw.ne(BmzrAssessmentPlan::getId, entity.getId());
}
long count = baseMapper.selectCount(lqw);
if (count > 0) {
throw new RuntimeException("计划编码已存在");
}
}
/**
* 批量删除班主任考核计划
*/
@Override
public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
if(isValid){
// 删除前校验
// 这里可以添加删除前的业务校验逻辑
}
return baseMapper.deleteBatchIds(ids) > 0;
}
/**
* 修改考核计划状态
*/
@Override
public Boolean updatePlanStatus(Long id, String planStatus) {
BmzrAssessmentPlan plan = new BmzrAssessmentPlan();
plan.setId(id);
plan.setPlanStatus(planStatus);
return baseMapper.updateById(plan) > 0;
}
/**
* 获取可用的考核方案选项
*/
@Override
public List<BmzrAssessmentPlanVo> getAvailableSchemes() {
// 这里应该查询考核方案表,暂时返回空列表
// 需要根据实际的考核方案表来实现
return List.of();
}
}
@@ -0,0 +1,187 @@
package org.dromara.bzrkh.service.impl;
import org.dromara.common.core.utils.MapstructUtils;
import org.dromara.common.core.utils.StringUtils;
import org.dromara.common.mybatis.core.page.TableDataInfo;
import org.dromara.common.mybatis.core.page.PageQuery;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.dromara.bzrkh.domain.BmzrAssessmentSchemeIndicator;
import org.dromara.bzrkh.domain.vo.BmzrAssessmentSchemeIndicatorVo;
import org.dromara.bzrkh.domain.bo.BmzrAssessmentSchemeIndicatorBo;
import org.dromara.bzrkh.mapper.BmzrAssessmentSchemeIndicatorMapper;
import org.dromara.bzrkh.service.IBmzrAssessmentSchemeIndicatorService;
import java.util.List;
import java.util.Map;
import java.util.Collection;
import java.util.concurrent.atomic.AtomicInteger;
/**
* 班主任考核方案指标关联Service业务层处理
*
* @author ruoyi
* @date 2025-01-08
*/
@RequiredArgsConstructor
@Service
public class BmzrAssessmentSchemeIndicatorServiceImpl implements IBmzrAssessmentSchemeIndicatorService {
private final BmzrAssessmentSchemeIndicatorMapper baseMapper;
/**
* 查询班主任考核方案指标关联
*
* @param id 主键
* @return 班主任考核方案指标关联
*/
@Override
public BmzrAssessmentSchemeIndicatorVo queryById(Long id) {
return baseMapper.selectVoById(id);
}
/**
* 查询班主任考核方案指标关联列表
*
* @param bo 查询条件
* @return 班主任考核方案指标关联
*/
@Override
public List<BmzrAssessmentSchemeIndicatorVo> queryList(BmzrAssessmentSchemeIndicatorBo bo) {
// 使用自定义SQL查询,确保score字段正确映射
return baseMapper.queryList(bo);
}
private LambdaQueryWrapper<BmzrAssessmentSchemeIndicator> buildQueryWrapper(BmzrAssessmentSchemeIndicatorBo bo) {
Map<String, Object> params = bo.getParams();
LambdaQueryWrapper<BmzrAssessmentSchemeIndicator> lqw = Wrappers.lambdaQuery();
lqw.eq(bo.getSchemeId() != null, BmzrAssessmentSchemeIndicator::getSchemeId, bo.getSchemeId());
lqw.eq(bo.getIndicatorId() != null, BmzrAssessmentSchemeIndicator::getIndicatorId, bo.getIndicatorId());
lqw.eq(bo.getSortOrder() != null, BmzrAssessmentSchemeIndicator::getSortOrder, bo.getSortOrder());
lqw.like(StringUtils.isNotBlank(bo.getRemark()), BmzrAssessmentSchemeIndicator::getRemark, bo.getRemark());
lqw.orderByAsc(BmzrAssessmentSchemeIndicator::getSortOrder);
return lqw;
}
/**
* 分页查询班主任考核方案指标关联列表
*
* @param bo 查询条件
* @param pageQuery 分页查询条件
* @return 班主任考核方案指标关联分页列表
*/
@Override
public TableDataInfo<BmzrAssessmentSchemeIndicatorVo> queryPageList(BmzrAssessmentSchemeIndicatorBo bo, PageQuery pageQuery) {
LambdaQueryWrapper<BmzrAssessmentSchemeIndicator> lqw = buildQueryWrapper(bo);
Page<BmzrAssessmentSchemeIndicatorVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
return TableDataInfo.build(result);
}
/**
* 新增班主任考核方案指标关联
*
* @param bo 班主任考核方案指标关联
* @return 新增结果
*/
@Override
public Boolean insertByBo(BmzrAssessmentSchemeIndicatorBo bo) {
BmzrAssessmentSchemeIndicator add = MapstructUtils.convert(bo, BmzrAssessmentSchemeIndicator.class);
validEntityBeforeSave(add);
boolean flag = baseMapper.insert(add) > 0;
if (flag) {
bo.setId(add.getId());
}
return flag;
}
/**
* 修改班主任考核方案指标关联
*
* @param bo 班主任考核方案指标关联
* @return 修改结果
*/
@Override
public Boolean updateByBo(BmzrAssessmentSchemeIndicatorBo bo) {
BmzrAssessmentSchemeIndicator update = MapstructUtils.convert(bo, BmzrAssessmentSchemeIndicator.class);
validEntityBeforeSave(update);
return baseMapper.updateById(update) > 0;
}
/**
* 保存前的数据校验
*
* @param entity 实体类数据
*/
private void validEntityBeforeSave(BmzrAssessmentSchemeIndicator entity) {
// TODO 做一些数据校验,如唯一约束
}
/**
* 校验并批量删除班主任考核方案指标关联信息
*
* @param ids 主键集合
* @param isValid 是否校验,true-删除前校验,false-不校验
* @return 删除结果
*/
@Override
public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
if (isValid) {
// TODO 做一些业务上的校验,判断是否需要校验
}
return baseMapper.deleteBatchIds(ids) > 0;
}
/**
* 根据方案ID查询指标关联列表
*
* @param schemeId 方案ID
* @return 指标关联列表
*/
@Override
public List<BmzrAssessmentSchemeIndicatorVo> queryBySchemeId(Long schemeId) {
BmzrAssessmentSchemeIndicatorBo bo = new BmzrAssessmentSchemeIndicatorBo();
bo.setSchemeId(schemeId);
return queryList(bo);
}
/**
* 批量保存方案指标关联
*
* @param schemeId 方案ID
* @param indicatorList 指标列表
* @return 保存结果
*/
@Override
@Transactional(rollbackFor = Exception.class)
public Boolean batchSaveSchemeIndicators(Long schemeId, List<BmzrAssessmentSchemeIndicatorBo> indicatorList) {
// 先删除原有关联
LambdaQueryWrapper<BmzrAssessmentSchemeIndicator> deleteWrapper = Wrappers.lambdaQuery();
deleteWrapper.eq(BmzrAssessmentSchemeIndicator::getSchemeId, schemeId);
baseMapper.delete(deleteWrapper);
// 批量新增
if (indicatorList != null && !indicatorList.isEmpty()) {
AtomicInteger sortOrder = new AtomicInteger(1);
for (BmzrAssessmentSchemeIndicatorBo bo : indicatorList) {
// 清空ID字段,避免主键冲突
bo.setId(null);
bo.setSchemeId(schemeId);
bo.setSortOrder(sortOrder.getAndIncrement());
// 关键修复:将score字段的值映射到customMaxScore字段
if (bo.getScore() != null) {
bo.setCustomMaxScore(bo.getScore());
}
BmzrAssessmentSchemeIndicator entity = MapstructUtils.convert(bo, BmzrAssessmentSchemeIndicator.class);
baseMapper.insert(entity);
}
}
return true;
}
}
@@ -0,0 +1,141 @@
package org.dromara.bzrkh.service.impl;
import org.dromara.common.core.utils.MapstructUtils;
import org.dromara.common.core.utils.StringUtils;
import org.dromara.common.mybatis.core.page.TableDataInfo;
import org.dromara.common.mybatis.core.page.PageQuery;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import cn.hutool.core.collection.CollUtil;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.dromara.bzrkh.domain.bo.BmzrAssessmentSchemeBo;
import org.dromara.bzrkh.domain.vo.BmzrAssessmentSchemeVo;
import org.dromara.bzrkh.domain.BmzrAssessmentScheme;
import org.dromara.bzrkh.mapper.BmzrAssessmentSchemeMapper;
import org.dromara.bzrkh.service.IBmzrAssessmentSchemeService;
import java.util.List;
import java.util.Collection;
import java.util.Map;
/**
* 班主任考核方案Service业务层处理
*
* @author system
* @date 2025-01-08
*/
@Slf4j
@RequiredArgsConstructor
@Service
public class BmzrAssessmentSchemeServiceImpl implements IBmzrAssessmentSchemeService {
private final BmzrAssessmentSchemeMapper baseMapper;
/**
* 查询班主任考核方案
*
* @param id 主键
* @return 班主任考核方案
*/
@Override
public BmzrAssessmentSchemeVo queryById(Long id) {
return baseMapper.selectVoById(id);
}
/**
* 查询班主任考核方案列表
*
* @param bo 查询条件
* @param pageQuery 分页查询条件
* @return 班主任考核方案分页列表
*/
@Override
public TableDataInfo<BmzrAssessmentSchemeVo> queryPageList(BmzrAssessmentSchemeBo bo, PageQuery pageQuery) {
LambdaQueryWrapper<BmzrAssessmentScheme> lqw = buildQueryWrapper(bo);
Page<BmzrAssessmentSchemeVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
return TableDataInfo.build(result);
}
/**
* 查询班主任考核方案列表
*
* @param bo 查询条件
* @return 班主任考核方案列表
*/
@Override
public List<BmzrAssessmentSchemeVo> queryList(BmzrAssessmentSchemeBo bo) {
LambdaQueryWrapper<BmzrAssessmentScheme> lqw = buildQueryWrapper(bo);
return baseMapper.selectVoList(lqw);
}
private LambdaQueryWrapper<BmzrAssessmentScheme> buildQueryWrapper(BmzrAssessmentSchemeBo bo) {
Map<String, Object> params = bo.getParams();
LambdaQueryWrapper<BmzrAssessmentScheme> lqw = Wrappers.lambdaQuery();
lqw.like(StringUtils.isNotBlank(bo.getSchemeName()), BmzrAssessmentScheme::getSchemeName, bo.getSchemeName());
lqw.eq(StringUtils.isNotBlank(bo.getSchemeCode()), BmzrAssessmentScheme::getSchemeCode, bo.getSchemeCode());
lqw.eq(StringUtils.isNotBlank(bo.getAcademicYear()), BmzrAssessmentScheme::getAcademicYear, bo.getAcademicYear());
lqw.eq(StringUtils.isNotBlank(bo.getSemester()), BmzrAssessmentScheme::getSemester, bo.getSemester());
lqw.eq(StringUtils.isNotBlank(bo.getSelfEvaluationRequired()), BmzrAssessmentScheme::getSelfEvaluationRequired, bo.getSelfEvaluationRequired());
lqw.eq(StringUtils.isNotBlank(bo.getSuperiorEvaluationRequired()), BmzrAssessmentScheme::getSuperiorEvaluationRequired, bo.getSuperiorEvaluationRequired());
lqw.eq(StringUtils.isNotBlank(bo.getStatus()), BmzrAssessmentScheme::getStatus, bo.getStatus());
lqw.orderByDesc(BmzrAssessmentScheme::getCreateTime);
return lqw;
}
/**
* 新增班主任考核方案
*
* @param bo 班主任考核方案
* @return 结果
*/
@Override
public Boolean insertByBo(BmzrAssessmentSchemeBo bo) {
BmzrAssessmentScheme add = MapstructUtils.convert(bo, BmzrAssessmentScheme.class);
validEntityBeforeSave(add);
boolean flag = baseMapper.insert(add) > 0;
if (flag) {
bo.setId(add.getId());
}
return flag;
}
/**
* 修改班主任考核方案
*
* @param bo 班主任考核方案
* @return 结果
*/
@Override
public Boolean updateByBo(BmzrAssessmentSchemeBo bo) {
BmzrAssessmentScheme update = MapstructUtils.convert(bo, BmzrAssessmentScheme.class);
validEntityBeforeSave(update);
return baseMapper.updateById(update) > 0;
}
/**
* 保存前的数据校验
*
* @param entity 实体类数据
*/
private void validEntityBeforeSave(BmzrAssessmentScheme entity) {
// TODO 做一些数据校验,如唯一约束
}
/**
* 批量删除班主任考核方案
*
* @param ids 需要删除的班主任考核方案主键集合
* @param isValid 是否校验,true-删除前校验,false-不校验
* @return 结果
*/
@Override
public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
if (isValid) {
// TODO 做一些业务上的校验,判断是否需要校验
}
return baseMapper.deleteBatchIds(ids) > 0;
}
}
@@ -0,0 +1,99 @@
package org.dromara.bzrkh.service.impl;
import org.dromara.common.mybatis.core.page.TableDataInfo;
import org.dromara.common.mybatis.core.page.PageQuery;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.dromara.bzrkh.domain.vo.TeacherClassVo;
import org.dromara.bzrkh.domain.vo.BmzrAssessmentPlanVo;
import org.dromara.bzrkh.domain.bo.TeacherAssessmentQueryBo;
import org.dromara.bzrkh.mapper.TeacherAssessmentMapper;
import org.dromara.bzrkh.service.ITeacherAssessmentService;
import java.util.List;
/**
* 班主任考核管理Service业务层处理
*
* @author ruoyi
* @date 2025-01-27
*/
@RequiredArgsConstructor
@Service
public class TeacherAssessmentServiceImpl implements ITeacherAssessmentService {
private final TeacherAssessmentMapper teacherAssessmentMapper;
/**
* 查询班主任管理的班级列表
*
* @param teacherId 班主任ID
* @return 班级列表
*/
@Override
public List<TeacherClassVo> queryTeacherClassList(Long teacherId) {
return teacherAssessmentMapper.selectTeacherClassList(teacherId);
}
/**
* 查询班主任考核计划列表(分页)
*
* @param bo 查询条件
* @param pageQuery 分页参数
* @return 考核计划列表
*/
@Override
public TableDataInfo<BmzrAssessmentPlanVo> queryTeacherAssessmentPlanPageList(TeacherAssessmentQueryBo bo, PageQuery pageQuery) {
Page<BmzrAssessmentPlanVo> page = pageQuery.build();
List<BmzrAssessmentPlanVo> list = teacherAssessmentMapper.selectTeacherAssessmentPlanList(bo);
// 手动分页处理
int total = list.size();
int start = (int) ((page.getCurrent() - 1) * page.getSize());
int end = Math.min(start + (int) page.getSize(), total);
List<BmzrAssessmentPlanVo> pageList = list.subList(start, end);
page.setRecords(pageList);
page.setTotal(total);
return TableDataInfo.build(page);
}
/**
* 提交考核
*
* @param planId 计划ID
* @param classId 班级ID
* @param teacherId 班主任ID
* @return 是否成功
*/
@Override
public boolean submitAssessment(Long planId, Long classId, Long teacherId) {
// TODO: 实现提交考核逻辑
// 1. 验证班主任是否有权限提交该班级的考核
// 2. 验证考核计划是否有效
// 3. 创建或更新考核记录
// 4. 更新考核状态
return true;
}
/**
* 查看考核详情
*
* @param planId 计划ID
* @param classId 班级ID
* @param teacherId 班主任ID
* @return 考核详情
*/
@Override
public Object getAssessmentDetail(Long planId, Long classId, Long teacherId) {
// TODO: 实现查看考核详情逻辑
// 1. 验证班主任是否有权限查看该班级的考核
// 2. 获取考核计划详情
// 3. 获取考核指标详情
// 4. 获取考核记录和评分
return null;
}
}
@@ -0,0 +1,30 @@
<?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="org.dromara.bzrkh.mapper.BmzrAssessmentIndicatorMapper">
<resultMap type="org.dromara.bzrkh.domain.BmzrAssessmentIndicator" id="BmzrAssessmentIndicatorResult">
<result property="id" column="id" />
<result property="tenantId" column="tenant_id" />
<result property="indicatorName" column="indicator_name" />
<result property="indicatorCode" column="indicator_code" />
<result property="indicatorType" column="indicator_type" />
<result property="parentId" column="parent_id" />
<result property="sortOrder" column="sort_order" />
<result property="weightRatio" column="weight_ratio" />
<result property="maxScore" column="max_score" />
<result property="score" column="score" />
<result property="allowSelfEvaluation" column="allow_self_evaluation" />
<result property="allowSuperiorEvaluation" column="allow_superior_evaluation" />
<result property="status" column="status" />
<result property="remark" column="remark" />
<result property="createDept" column="create_dept" />
<result property="createBy" column="create_by" />
<result property="createTime" column="create_time" />
<result property="updateBy" column="update_by" />
<result property="updateTime" column="update_time" />
<result property="deleted" column="deleted" />
</resultMap>
</mapper>
@@ -0,0 +1,146 @@
<?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="org.dromara.bzrkh.mapper.BmzrAssessmentPlanMapper">
<!-- 班主任考核计划结果映射(包含方案名称) -->
<resultMap type="org.dromara.bzrkh.domain.vo.BmzrAssessmentPlanVo" id="BmzrAssessmentPlanVoResult">
<result property="id" column="id"/>
<result property="tenantId" column="tenant_id"/>
<result property="planName" column="plan_name"/>
<result property="planCode" column="plan_code"/>
<result property="schemeId" column="scheme_id"/>
<result property="schemeName" column="scheme_name"/>
<result property="academicYear" column="academic_year"/>
<result property="semester" column="semester"/>
<result property="planStartTime" column="plan_start_time"/>
<result property="planEndTime" column="plan_end_time"/>
<result property="dataExtractStartTime" column="data_extract_start_time"/>
<result property="dataExtractEndTime" column="data_extract_end_time"/>
<result property="planStatus" column="plan_status"/>
<result property="description" column="description"/>
<result property="remark" column="remark"/>
<result property="createDept" column="create_dept"/>
<result property="createBy" column="create_by"/>
<result property="createTime" column="create_time"/>
<result property="updateBy" column="update_by"/>
<result property="updateTime" column="update_time"/>
<result property="deleted" column="deleted"/>
</resultMap>
<!-- 查询班主任考核计划列表(包含方案名称) -->
<select id="selectAssessmentPlanListWithScheme" parameterType="org.dromara.bzrkh.domain.bo.BmzrAssessmentPlanBo" resultMap="BmzrAssessmentPlanVoResult">
SELECT
p.id,
p.tenant_id,
p.plan_name,
p.plan_code,
p.scheme_id,
s.scheme_name,
p.academic_year,
p.semester,
p.plan_start_time,
p.plan_end_time,
p.data_extract_start_time,
p.data_extract_end_time,
p.plan_status,
p.description,
p.remark,
p.create_dept,
p.create_by,
p.create_time,
p.update_by,
p.update_time,
p.deleted
FROM bmzr_assessment_plan p
LEFT JOIN bmzr_assessment_scheme s ON p.scheme_id = s.id AND s.deleted = 0
WHERE p.deleted = 0
<if test="planName != null and planName != ''">
AND p.plan_name LIKE CONCAT('%', #{planName}, '%')
</if>
<if test="planCode != null and planCode != ''">
AND p.plan_code LIKE CONCAT('%', #{planCode}, '%')
</if>
<if test="schemeId != null">
AND p.scheme_id = #{schemeId}
</if>
<if test="academicYear != null and academicYear != ''">
AND p.academic_year = #{academicYear}
</if>
<if test="semester != null and semester != ''">
AND p.semester = #{semester}
</if>
<if test="planStatus != null and planStatus != ''">
AND p.plan_status = #{planStatus}
</if>
<if test="planStartTime != null">
AND p.plan_start_time &gt;= #{planStartTime}
</if>
<if test="planEndTime != null">
AND p.plan_end_time &lt;= #{planEndTime}
</if>
<if test="params.beginCreateTime != null and params.endCreateTime != null">
AND p.create_time BETWEEN #{params.beginCreateTime} AND #{params.endCreateTime}
</if>
ORDER BY p.create_time DESC
</select>
<!-- 分页查询班主任考核计划列表(包含方案名称) -->
<select id="selectAssessmentPlanPageWithScheme" parameterType="org.dromara.bzrkh.domain.bo.BmzrAssessmentPlanBo" resultMap="BmzrAssessmentPlanVoResult">
SELECT
p.id,
p.tenant_id,
p.plan_name,
p.plan_code,
p.scheme_id,
s.scheme_name,
p.academic_year,
p.semester,
p.plan_start_time,
p.plan_end_time,
p.data_extract_start_time,
p.data_extract_end_time,
p.plan_status,
p.description,
p.remark,
p.create_dept,
p.create_by,
p.create_time,
p.update_by,
p.update_time,
p.deleted
FROM bmzr_assessment_plan p
LEFT JOIN bmzr_assessment_scheme s ON p.scheme_id = s.id AND s.deleted = 0
WHERE p.deleted = 0
<if test="bo.planName != null and bo.planName != ''">
AND p.plan_name LIKE CONCAT('%', #{bo.planName}, '%')
</if>
<if test="bo.planCode != null and bo.planCode != ''">
AND p.plan_code LIKE CONCAT('%', #{bo.planCode}, '%')
</if>
<if test="bo.schemeId != null">
AND p.scheme_id = #{bo.schemeId}
</if>
<if test="bo.academicYear != null and bo.academicYear != ''">
AND p.academic_year = #{bo.academicYear}
</if>
<if test="bo.semester != null and bo.semester != ''">
AND p.semester = #{bo.semester}
</if>
<if test="bo.planStatus != null and bo.planStatus != ''">
AND p.plan_status = #{bo.planStatus}
</if>
<if test="bo.planStartTime != null">
AND p.plan_start_time &gt;= #{bo.planStartTime}
</if>
<if test="bo.planEndTime != null">
AND p.plan_end_time &lt;= #{bo.planEndTime}
</if>
<if test="bo.params.beginCreateTime != null and bo.params.endCreateTime != null">
AND p.create_time BETWEEN #{bo.params.beginCreateTime} AND #{bo.params.endCreateTime}
</if>
ORDER BY p.create_time DESC
</select>
</mapper>
@@ -0,0 +1,67 @@
<?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="org.dromara.bzrkh.mapper.BmzrAssessmentSchemeIndicatorMapper">
<resultMap type="org.dromara.bzrkh.domain.vo.BmzrAssessmentSchemeIndicatorVo" id="BmzrAssessmentSchemeIndicatorResult">
<result property="id" column="id" />
<result property="tenantId" column="tenant_id" />
<result property="schemeId" column="scheme_id" />
<result property="indicatorId" column="indicator_id" />
<result property="indicatorName" column="indicator_name" />
<result property="indicatorCode" column="indicator_code" />
<result property="weightRatio" column="weight_ratio" />
<result property="customMaxScore" column="custom_max_score" />
<result property="score" column="score" />
<result property="sortOrder" column="sort_order" />
<result property="remark" column="remark" />
<result property="createDept" column="create_dept" />
<result property="createBy" column="create_by" />
<result property="createTime" column="create_time" />
<result property="updateBy" column="update_by" />
<result property="updateTime" column="update_time" />
<result property="deleted" column="deleted" />
</resultMap>
<sql id="selectBmzrAssessmentSchemeIndicatorVo">
select
si.id,
si.tenant_id,
si.scheme_id,
si.indicator_id,
ai.indicator_name,
ai.indicator_code,
si.weight_ratio,
si.custom_max_score,
IFNULL(si.custom_max_score, ai.score) as score,
si.sort_order,
si.remark,
si.create_dept,
si.create_by,
si.create_time,
si.update_by,
si.update_time,
si.deleted
from bmzr_assessment_scheme_indicator si
left join bmzr_assessment_indicator ai on si.indicator_id = ai.id
</sql>
<select id="queryList" parameterType="org.dromara.bzrkh.domain.bo.BmzrAssessmentSchemeIndicatorBo" resultMap="BmzrAssessmentSchemeIndicatorResult">
<include refid="selectBmzrAssessmentSchemeIndicatorVo"/>
<where>
si.deleted = 0
<if test="bo.schemeId != null">
and si.scheme_id = #{bo.schemeId}
</if>
<if test="bo.indicatorId != null">
and si.indicator_id = #{bo.indicatorId}
</if>
<if test="bo.indicatorName != null and bo.indicatorName != ''">
and ai.indicator_name like concat('%', #{bo.indicatorName}, '%')
</if>
</where>
order by si.sort_order asc, si.create_time asc
</select>
</mapper>
@@ -0,0 +1,112 @@
<?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="org.dromara.bzrkh.mapper.TeacherAssessmentMapper">
<!-- 班级信息结果映射 -->
<resultMap type="org.dromara.bzrkh.domain.vo.TeacherClassVo" id="TeacherClassVoResult">
<result property="id" column="id"/>
<result property="classCode" column="class_code"/>
<result property="className" column="class_name"/>
<result property="classTeacherId" column="class_teacher_id"/>
<result property="classTeacherName" column="class_teacher_name"/>
<result property="grade" column="grade"/>
<result property="collegeId" column="college_id"/>
<result property="collegeName" column="college_name"/>
<result property="majorId" column="major_id"/>
<result property="majorName" column="major_name"/>
<result property="classStatus" column="class_status"/>
<result property="currentStudentCount" column="current_student_count"/>
</resultMap>
<!-- 考核计划结果映射 -->
<resultMap type="org.dromara.bzrkh.domain.vo.BmzrAssessmentPlanVo" id="BmzrAssessmentPlanVoResult">
<result property="id" column="id"/>
<result property="tenantId" column="tenant_id"/>
<result property="planName" column="plan_name"/>
<result property="planCode" column="plan_code"/>
<result property="schemeId" column="scheme_id"/>
<result property="schemeName" column="scheme_name"/>
<result property="academicYear" column="academic_year"/>
<result property="semester" column="semester"/>
<result property="planStartTime" column="plan_start_time"/>
<result property="planEndTime" column="plan_end_time"/>
<result property="dataExtractStartTime" column="data_extract_start_time"/>
<result property="dataExtractEndTime" column="data_extract_end_time"/>
<result property="planStatus" column="plan_status"/>
<result property="description" column="description"/>
<result property="remark" column="remark"/>
<result property="createDept" column="create_dept"/>
<result property="createBy" column="create_by"/>
<result property="createTime" column="create_time"/>
<result property="updateBy" column="update_by"/>
<result property="updateTime" column="update_time"/>
<result property="deleted" column="deleted"/>
</resultMap>
<!-- 查询班主任管理的班级列表 -->
<select id="selectTeacherClassList" parameterType="Long" resultMap="TeacherClassVoResult">
SELECT
id,
class_code,
class_name,
class_teacher_id,
class_teacher_name,
grade,
college_id,
college_name,
major_id,
major_name,
class_status,
current_student_count
FROM xg_class_msg
WHERE class_teacher_id = #{teacherId}
AND class_status = '1'
AND deleted = 0
ORDER BY grade DESC, class_name ASC
</select>
<!-- 查询班主任考核计划列表 -->
<select id="selectTeacherAssessmentPlanList" parameterType="org.dromara.bzrkh.domain.bo.TeacherAssessmentQueryBo" resultMap="BmzrAssessmentPlanVoResult">
SELECT
p.id,
p.tenant_id,
p.plan_name,
p.plan_code,
p.scheme_id,
s.scheme_name,
p.academic_year,
p.semester,
p.plan_start_time,
p.plan_end_time,
p.data_extract_start_time,
p.data_extract_end_time,
p.plan_status,
p.description,
p.remark,
p.create_dept,
p.create_by,
p.create_time,
p.update_by,
p.update_time,
p.deleted
FROM bmzr_assessment_plan p
LEFT JOIN bmzr_assessment_scheme s ON p.scheme_id = s.id AND s.deleted = 0
WHERE p.deleted = 0
<if test="planStatus != null and planStatus != ''">
AND p.plan_status = #{planStatus}
</if>
<if test="planName != null and planName != ''">
AND p.plan_name LIKE CONCAT('%', #{planName}, '%')
</if>
<if test="academicYear != null and academicYear != ''">
AND p.academic_year = #{academicYear}
</if>
<if test="semester != null and semester != ''">
AND p.semester = #{semester}
</if>
ORDER BY p.create_time DESC
</select>
</mapper>
@@ -0,0 +1,226 @@
# 班主任考核指标体系管理模块开发文档
## 📋 模块概述
**功能名称**: 班主任考核指标体系管理
**模块路径**: `/bzrkh/assessmentIndicator`
**开发时间**: 2025-01-08
**技术架构**: 前后端分离 (Vue 3 + Spring Boot 3.4.6)
## 🎯 功能说明
该模块用于管理班主任考核的指标体系,支持树形结构的指标管理,包括指标类型、权重配置、评价设置等功能。
### 主要功能
- ✅ 指标体系列表查询(支持分页)
- ✅ 指标体系新增/修改/删除
- ✅ 指标类型关联(下拉选择)
- ✅ 父级指标选择(树形选择器)
- ✅ 权重比例配置(0-1之间)
- ✅ 评价权限设置(自评/上级评)
- ✅ 数据导出功能
- ✅ 树形结构展示
## 📂 文件结构
### 前端文件 (web/)
```
web/src/
├── api/bzrkh/assessmentIndicator/
│ ├── index.ts # API接口定义
│ └── types.ts # TypeScript类型定义
└── views/bzrkh/assessmentIndicator/
└── index.vue # 主界面组件
```
### 后端文件 (backend/ruoyi-modules/ruoyi-bzrkh/)
```
src/main/java/org/dromara/bzrkh/
├── controller/
│ └── BmzrAssessmentIndicatorController.java # 控制器
├── service/
│ ├── IBmzrAssessmentIndicatorService.java # 服务接口
│ └── impl/
│ └── BmzrAssessmentIndicatorServiceImpl.java # 服务实现
├── mapper/
│ └── BmzrAssessmentIndicatorMapper.java # 数据访问层
├── domain/
│ ├── BmzrAssessmentIndicator.java # 实体类
│ ├── bo/
│ │ └── BmzrAssessmentIndicatorBo.java # 业务对象
│ └── vo/
│ └── BmzrAssessmentIndicatorVo.java # 视图对象
└── resources/mapper/bzrkh/
└── BmzrAssessmentIndicatorMapper.xml # MyBatis映射文件
```
### 配置文件
```
backend/ruoyi-modules/ruoyi-bzrkh/
├── 班主任考核指标体系管理权限配置.sql # 权限配置SQL
└── 班主任考核指标体系开发文档.md # 本文档
```
## 🔐 权限配置
### API权限字符
| 功能 | 权限字符 | 说明 |
|------|----------|------|
| 列表查询 | `bzrkh:assessmentIndicator:list` | 查询指标体系列表权限 |
| 详情查询 | `bzrkh:assessmentIndicator:query` | 查询指标体系详情权限 |
| 新增 | `bzrkh:assessmentIndicator:add` | 新增指标体系权限 |
| 修改 | `bzrkh:assessmentIndicator:edit` | 修改指标体系权限 |
| 删除 | `bzrkh:assessmentIndicator:remove` | 删除指标体系权限 |
| 导出 | `bzrkh:assessmentIndicator:export` | 导出指标体系权限 |
### 菜单配置
- **主菜单**: 班主任考核指标体系
- **路由路径**: `assessmentIndicator`
- **组件路径**: `bzrkh/assessmentIndicator/index`
- **图标**: `tree`
## 🌐 API接口
### 前端API方法
| 方法名 | 请求方式 | 路径 | 说明 |
|--------|----------|------|------|
| `listAssessmentIndicator` | GET | `/bzrkh/assessmentIndicator/list` | 查询列表 |
| `getAssessmentIndicator` | GET | `/bzrkh/assessmentIndicator/{id}` | 查询详情 |
| `addAssessmentIndicator` | POST | `/bzrkh/assessmentIndicator` | 新增 |
| `updateAssessmentIndicator` | PUT | `/bzrkh/assessmentIndicator` | 修改 |
| `delAssessmentIndicator` | DELETE | `/bzrkh/assessmentIndicator/{id}` | 删除 |
| `getIndicatorTypeOptions` | GET | `/bzrkh/assessmentIndicatorType/listAllIncludeDeleted` | 指标类型选项 |
| `getParentIndicatorOptions` | GET | `/bzrkh/assessmentIndicator/treeselect` | 父级指标选项 |
### 后端Controller方法
| 方法名 | 注解 | 说明 |
|--------|------|------|
| `list` | `@GetMapping("/list")` | 分页查询列表 |
| `treeselect` | `@GetMapping("/treeselect")` | 树形结构查询 |
| `getInfo` | `@GetMapping("/{id}")` | 详情查询 |
| `add` | `@PostMapping()` | 新增 |
| `edit` | `@PutMapping()` | 修改 |
| `remove` | `@DeleteMapping("/{ids}")` | 删除 |
| `export` | `@PostMapping("/export")` | 导出 |
## 📊 数据模型
### 核心字段
| 字段名 | 类型 | 说明 | 验证规则 |
|--------|------|------|----------|
| `indicatorName` | String | 指标名称 | 必填 |
| `indicatorCode` | String | 指标编码 | 必填,唯一 |
| `indicatorType` | String | 指标类型 | 必填,关联指标类型表 |
| `parentId` | Long | 父级指标ID | 可选,支持树形结构 |
| `weightRatio` | BigDecimal | 权重比例 | 必填,0-1之间 |
| `maxScore` | BigDecimal | 最高分值 | 必填,>=0 |
| `score` | BigDecimal | 分值 | 必填,>=0 |
| `allowSelfEvaluation` | String | 允许自评 | 必填,0=否 1=是 |
| `allowSuperiorEvaluation` | String | 允许上级评 | 必填,0=否 1=是 |
| `sortOrder` | Integer | 排序 | 必填,>=1 |
| `status` | String | 状态 | 必填,0=正常 1=停用 |
## 🎨 界面特性
### 查询条件
- 指标名称(模糊查询)
- 指标编码(精确查询)
- 指标类型(下拉选择)
- 允许自评(是/否)
- 允许上级评(是/否)
- 状态(正常/停用)
### 表格展示
- 指标编码
- 指标名称
- 指标类型(显示类型名称)
- 权重比例(百分比格式)
- 最高分值
- 分值
- 排序
- 允许自评(字典显示)
- 允许上级评(字典显示)
- 状态(字典显示)
- 备注
### 表单字段
- 基本信息:指标编码、指标名称
- 分类信息:指标类型、父级指标
- 分值配置:权重比例、最高分值、分值、排序
- 权限设置:允许自评、允许上级评、状态
- 备注信息
## 🔧 技术要点
### 前端技术
- **Vue 3 + TypeScript**: 组件开发
- **Element Plus**: UI组件库
- **树形选择器**: 父级指标选择
- **数字输入框**: 精确的数值输入
- **字典转换**: 状态和评价权限显示
### 后端技术
- **Spring Boot 3.4.6**: 框架
- **MyBatis-Plus**: ORM框架
- **Sa-Token**: 权限控制
- **Bean Validation**: 参数校验
- **树形结构**: 递归查询和构建
### 数据特性
- **多租户支持**: TenantEntity继承
- **逻辑删除**: 软删除机制
- **审计字段**: 创建时间、更新时间等
- **树形结构**: 支持层级关系
## 📋 部署说明
### 1. 数据库
执行以下SQL文件:
- `docs/设计文档/database/班主任考核管理/bmzr_assessment_tables.sql`
- `docs/设计文档/database/班主任考核管理/bmzr_dict_data_mysql.sql`
- `backend/ruoyi-modules/ruoyi-bzrkh/班主任考核指标体系管理权限配置.sql`
### 2. 后端
- 确保 `ruoyi-bzrkh` 模块已添加到主项目依赖
- 重启后端服务
### 3. 前端
- 前端文件已放置在正确位置
- 重新编译前端项目
### 4. 权限分配
- 管理员登录系统
- 进入权限管理,为相关角色分配权限
- 菜单路径:系统管理 → 权限管理 → 角色管理
## ✅ 测试要点
### 功能测试
- [ ] 指标体系列表查询
- [ ] 指标体系新增(各种场景)
- [ ] 指标体系修改
- [ ] 指标体系删除(单个/批量)
- [ ] 指标类型下拉加载
- [ ] 父级指标树形选择
- [ ] 数据导出
- [ ] 权限控制
### 数据验证
- [ ] 权重比例范围验证(0-1)
- [ ] 分值非负验证
- [ ] 必填字段验证
- [ ] 唯一性验证(指标编码)
## 📝 注意事项
1. **指标类型依赖**: 需要先配置指标类型数据
2. **权重配置**: 权重比例为0-1之间的小数
3. **树形结构**: 支持多级父子关系
4. **逻辑删除**: 删除操作为逻辑删除,可恢复
5. **权限控制**: 严格按照权限字符控制功能访问
---
**开发完成时间**: 2025-01-08
**版本**: V1.0.0
**状态**: ✅ 开发完成
@@ -0,0 +1,49 @@
-- ==========================================
-- 班主任考核指标体系管理权限配置
-- 版本:V1.0.0
-- 功能:班主任考核指标体系管理相关权限
-- 作者:系统设计
-- 时间:2025-01-08
-- 模块:学工管理-班主任考核指标体系管理权限
-- ==========================================
-- 删除已存在的权限数据
DELETE FROM sys_menu WHERE menu_name = '班主任考核指标体系' OR parent_id IN (SELECT id FROM (SELECT id FROM sys_menu WHERE menu_name = '班主任考核指标体系') temp);
-- 1. 班主任考核指标体系管理主菜单
INSERT INTO sys_menu (menu_name, parent_id, order_num, path, component, query_param, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark, tenant_id)
VALUES ('班主任考核指标体系', 2000, 3, 'assessmentIndicator', 'bzrkh/assessmentIndicator/index', '', 1, 0, 'C', '0', '0', 'bzrkh:assessmentIndicator:list', 'tree', 103, 1, NOW(), 1, NOW(), '班主任考核指标体系管理菜单', '000000');
-- 获取刚插入的主菜单ID
SET @menu_id = LAST_INSERT_ID();
-- 2. 班主任考核指标体系查询按钮
INSERT INTO sys_menu (menu_name, parent_id, order_num, path, component, query_param, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark, tenant_id)
VALUES ('班主任考核指标体系查询', @menu_id, 1, '#', '', '', 1, 0, 'F', '0', '0', 'bzrkh:assessmentIndicator:query', '#', 103, 1, NOW(), 1, NOW(), '', '000000');
-- 3. 班主任考核指标体系新增按钮
INSERT INTO sys_menu (menu_name, parent_id, order_num, path, component, query_param, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark, tenant_id)
VALUES ('班主任考核指标体系新增', @menu_id, 2, '#', '', '', 1, 0, 'F', '0', '0', 'bzrkh:assessmentIndicator:add', '#', 103, 1, NOW(), 1, NOW(), '', '000000');
-- 4. 班主任考核指标体系修改按钮
INSERT INTO sys_menu (menu_name, parent_id, order_num, path, component, query_param, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark, tenant_id)
VALUES ('班主任考核指标体系修改', @menu_id, 3, '#', '', '', 1, 0, 'F', '0', '0', 'bzrkh:assessmentIndicator:edit', '#', 103, 1, NOW(), 1, NOW(), '', '000000');
-- 5. 班主任考核指标体系删除按钮
INSERT INTO sys_menu (menu_name, parent_id, order_num, path, component, query_param, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark, tenant_id)
VALUES ('班主任考核指标体系删除', @menu_id, 4, '#', '', '', 1, 0, 'F', '0', '0', 'bzrkh:assessmentIndicator:remove', '#', 103, 1, NOW(), 1, NOW(), '', '000000');
-- 6. 班主任考核指标体系导出按钮
INSERT INTO sys_menu (menu_name, parent_id, order_num, path, component, query_param, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark, tenant_id)
VALUES ('班主任考核指标体系导出', @menu_id, 5, '#', '', '', 1, 0, 'F', '0', '0', 'bzrkh:assessmentIndicator:export', '#', 103, 1, NOW(), 1, NOW(), '', '000000');
-- ==========================================
-- 权限字符说明
-- ==========================================
-- bzrkh:assessmentIndicator:list - 班主任考核指标体系查询权限
-- bzrkh:assessmentIndicator:query - 班主任考核指标体系详情查询权限
-- bzrkh:assessmentIndicator:add - 班主任考核指标体系新增权限
-- bzrkh:assessmentIndicator:edit - 班主任考核指标体系修改权限
-- bzrkh:assessmentIndicator:remove - 班主任考核指标体系删除权限
-- bzrkh:assessmentIndicator:export - 班主任考核指标体系导出权限
-- ==========================================
@@ -0,0 +1,62 @@
# 班主任考核指标类型管理权限配置
## API权限字符配置
以下是班主任考核指标类型管理模块需要配置的权限字符:
### 权限字符列表
1. **查询权限**
- 权限字符:`bzrkh:assessmentIndicatorType:list`
- 权限说明:查询班主任考核指标类型列表权限
2. **详情权限**
- 权限字符:`bzrkh:assessmentIndicatorType:query`
- 权限说明:查询班主任考核指标类型详细信息权限
3. **新增权限**
- 权限字符:`bzrkh:assessmentIndicatorType:add`
- 权限说明:新增班主任考核指标类型权限
4. **修改权限**
- 权限字符:`bzrkh:assessmentIndicatorType:edit`
- 权限说明:修改班主任考核指标类型权限
5. **删除权限**
- 权限字符:`bzrkh:assessmentIndicatorType:remove`
- 权限说明:删除班主任考核指标类型权限
6. **导出权限**
- 权限字符:`bzrkh:assessmentIndicatorType:export`
- 权限说明:导出班主任考核指标类型权限
## 菜单配置SQL
```sql
-- 班主任考核指标类型管理菜单
INSERT INTO sys_menu (tenant_id, menu_name, parent_id, order_num, path, component, query_param, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) VALUES
('000000', '指标类型管理', [班主任考核管理父菜单ID], 1, 'assessmentIndicatorType', 'bzrkh/assessmentIndicatorType/index', '', 1, 0, 'C', '0', '0', 'bzrkh:assessmentIndicatorType:list', 'list', 103, 1, NOW(), 1, NOW(), '班主任考核指标类型管理菜单');
-- 获取刚插入的菜单ID,用于下面的按钮权限配置
SET @menu_id = LAST_INSERT_ID();
-- 班主任考核指标类型管理按钮权限
INSERT INTO sys_menu (tenant_id, menu_name, parent_id, order_num, path, component, query_param, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) VALUES
('000000', '班主任考核指标类型查询', @menu_id, 1, '', '', '', 1, 0, 'F', '0', '0', 'bzrkh:assessmentIndicatorType:query', '#', 103, 1, NOW(), 1, NOW(), ''),
('000000', '班主任考核指标类型新增', @menu_id, 2, '', '', '', 1, 0, 'F', '0', '0', 'bzrkh:assessmentIndicatorType:add', '#', 103, 1, NOW(), 1, NOW(), ''),
('000000', '班主任考核指标类型修改', @menu_id, 3, '', '', '', 1, 0, 'F', '0', '0', 'bzrkh:assessmentIndicatorType:edit', '#', 103, 1, NOW(), 1, NOW(), ''),
('000000', '班主任考核指标类型删除', @menu_id, 4, '', '', '', 1, 0, 'F', '0', '0', 'bzrkh:assessmentIndicatorType:remove', '#', 103, 1, NOW(), 1, NOW(), ''),
('000000', '班主任考核指标类型导出', @menu_id, 5, '', '', '', 1, 0, 'F', '0', '0', 'bzrkh:assessmentIndicatorType:export', '#', 103, 1, NOW(), 1, NOW(), '');
```
## 使用说明
1. **权限配置位置**:在若依管理系统的菜单管理中配置上述权限
2. **角色分配**:将相应权限分配给需要使用该功能的角色
3. **用户权限**:用户通过角色获得相应的功能权限
## 注意事项
1. 请根据实际的父菜单ID替换SQL中的`[班主任考核管理父菜单ID]`
2. 权限字符必须与Controller中的`@SaCheckPermission`注解中的值保持一致
3. 建议按照业务需求控制权限的精细度
@@ -0,0 +1,43 @@
-- ==========================================
-- 班主任考核方案管理权限配置
-- 版本:V1.0.0
-- 功能:班主任考核方案管理菜单及权限配置
-- 作者:系统设计
-- 时间:2025-01-08
-- 模块:学工管理-班主任考核方案管理
-- ==========================================
-- 父菜单:班主任考核管理(如果不存在则创建)
INSERT INTO sys_menu (tenant_id, menu_name, parent_id, order_num, path, component, query_param, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark)
SELECT '000000', '班主任考核管理', 0, 4, 'bzrkh', NULL, NULL, 1, 0, 'M', '0', '0', NULL, 'user-tie', 103, 1, NOW(), NULL, NULL, '班主任考核管理目录'
WHERE NOT EXISTS (SELECT 1 FROM sys_menu WHERE tenant_id = '000000' AND menu_name = '班主任考核管理' AND parent_id = 0);
-- 获取班主任考核管理菜单ID
SET @parent_menu_id = (SELECT menu_id FROM sys_menu WHERE tenant_id = '000000' AND menu_name = '班主任考核管理' AND parent_id = 0 LIMIT 1);
-- 班主任考核方案管理菜单
INSERT INTO sys_menu (tenant_id, menu_name, parent_id, order_num, path, component, query_param, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) VALUES
('000000', '考核方案管理', @parent_menu_id, 1, 'assessmentScheme', 'bzrkh/assessmentScheme/index', NULL, 1, 0, 'C', '0', '0', 'bzrkh:assessmentScheme:list', 'clipboard', 103, 1, NOW(), NULL, NULL, '班主任考核方案管理菜单');
-- 获取考核方案管理菜单ID
SET @scheme_menu_id = (SELECT menu_id FROM sys_menu WHERE tenant_id = '000000' AND menu_name = '考核方案管理' AND parent_id = @parent_menu_id LIMIT 1);
-- 班主任考核方案管理按钮权限
INSERT INTO sys_menu (tenant_id, menu_name, parent_id, order_num, path, component, query_param, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) VALUES
('000000', '考核方案查询', @scheme_menu_id, 1, '#', '', NULL, 1, 0, 'F', '0', '0', 'bzrkh:assessmentScheme:query', '#', 103, 1, NOW(), NULL, NULL, ''),
('000000', '考核方案新增', @scheme_menu_id, 2, '#', '', NULL, 1, 0, 'F', '0', '0', 'bzrkh:assessmentScheme:add', '#', 103, 1, NOW(), NULL, NULL, ''),
('000000', '考核方案修改', @scheme_menu_id, 3, '#', '', NULL, 1, 0, 'F', '0', '0', 'bzrkh:assessmentScheme:edit', '#', 103, 1, NOW(), NULL, NULL, ''),
('000000', '考核方案删除', @scheme_menu_id, 4, '#', '', NULL, 1, 0, 'F', '0', '0', 'bzrkh:assessmentScheme:remove', '#', 103, 1, NOW(), NULL, NULL, ''),
('000000', '考核方案导出', @scheme_menu_id, 5, '#', '', NULL, 1, 0, 'F', '0', '0', 'bzrkh:assessmentScheme:export', '#', 103, 1, NOW(), NULL, NULL, '');
-- ==========================================
-- 权限字符说明
-- ==========================================
-- 主要权限字符:
-- 1. bzrkh:assessmentScheme:list - 考核方案列表查询权限
-- 2. bzrkh:assessmentScheme:query - 考核方案详情查询权限
-- 3. bzrkh:assessmentScheme:add - 考核方案新增权限
-- 4. bzrkh:assessmentScheme:edit - 考核方案修改权限
-- 5. bzrkh:assessmentScheme:remove - 考核方案删除权限
-- 6. bzrkh:assessmentScheme:export - 考核方案导出权限
-- ==========================================
@@ -0,0 +1,45 @@
-- ==========================================
-- 班主任考核管理权限配置SQL
-- 版本:V1.0.0
-- 功能:班主任考核管理相关权限配置
-- 作者:系统设计
-- 时间:2025-01-27
-- 模块:学工管理-班主任考核管理权限配置
-- ==========================================
-- 1. 菜单配置
-- 班主任考核管理菜单
INSERT INTO sys_menu (menu_name, parent_id, order_num, path, component, query_param, route_name, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) VALUES
('班主任考核管理', (SELECT menu_id FROM sys_menu WHERE menu_name = '班主任考核系统' LIMIT 1), 5, 'teacherAssessment', 'bzrkh/teacherAssessment/index', '', '', 1, 0, 'C', '0', '0', 'bzrkh:teacherAssessment:list', 'user', 103, 1, now(), 1, now(), '班主任考核管理菜单');
-- 2. 按钮权限配置
-- 获取刚插入的菜单ID
SET @teacher_assessment_menu_id = LAST_INSERT_ID();
-- 班主任考核管理按钮权限
INSERT INTO sys_menu (menu_name, parent_id, order_num, path, component, query_param, route_name, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) VALUES
('班主任考核查询', @teacher_assessment_menu_id, 1, '', '', '', '', 1, 0, 'F', '0', '0', 'bzrkh:teacherAssessment:list', '#', 103, 1, now(), 1, now(), ''),
('班主任考核详情', @teacher_assessment_menu_id, 2, '', '', '', '', 1, 0, 'F', '0', '0', 'bzrkh:teacherAssessment:detail', '#', 103, 1, now(), 1, now(), ''),
('班主任考核提交', @teacher_assessment_menu_id, 3, '', '', '', '', 1, 0, 'F', '0', '0', 'bzrkh:teacherAssessment:submit', '#', 103, 1, now(), 1, now(), '');
-- ==========================================
-- 权限字符说明
-- ==========================================
/*
权限字符列表:
1. bzrkh:teacherAssessment:list - 班主任考核查询权限(查看班级列表、考核计划列表)
2. bzrkh:teacherAssessment:detail - 班主任考核详情权限(查看考核详情)
3. bzrkh:teacherAssessment:submit - 班主任考核提交权限(提交考核)
使用的API接口及对应权限:
- GET /bzrkh/teacherAssessment/classes - bzrkh:teacherAssessment:list
- GET /bzrkh/teacherAssessment/plans - bzrkh:teacherAssessment:list
- GET /bzrkh/teacherAssessment/detail - bzrkh:teacherAssessment:detail
- POST /bzrkh/teacherAssessment/submit - bzrkh:teacherAssessment:submit
说明:
- 班主任只能查看和管理自己担任班主任的班级的考核计划
- 系统会自动根据当前登录用户ID获取其担任班主任的班级
- 只展示计划状态为启用(0)的考核计划
- 只展示班级状态为正常(1)的班级
*/
@@ -0,0 +1,157 @@
# 班主任考核管理部署说明
## 📋 功能概述
班主任考核管理功能允许班主任查看和管理自己担任班主任的班级的考核指标得分。该功能包含以下特性:
- 根据当前登录班主任自动显示其管理的班级标签页
- 每个班级标签页独立显示该班级的考核计划列表
- 只显示计划状态为启用的考核计划
- 提供考核提交和查看功能(功能框架已实现,业务逻辑待完善)
## 🚀 部署步骤
### 1. 后端部署
#### 1.1 新增文件清单
**Controller层**
- `backend/ruoyi-modules/ruoyi-bzrkh/src/main/java/org/dromara/bzrkh/controller/TeacherAssessmentController.java`
**Service层**
- `backend/ruoyi-modules/ruoyi-bzrkh/src/main/java/org/dromara/bzrkh/service/ITeacherAssessmentService.java`
- `backend/ruoyi-modules/ruoyi-bzrkh/src/main/java/org/dromara/bzrkh/service/impl/TeacherAssessmentServiceImpl.java`
**Mapper层**
- `backend/ruoyi-modules/ruoyi-bzrkh/src/main/java/org/dromara/bzrkh/mapper/TeacherAssessmentMapper.java`
- `backend/ruoyi-modules/ruoyi-bzrkh/src/main/resources/mapper/bzrkh/TeacherAssessmentMapper.xml`
**Domain层**
- `backend/ruoyi-modules/ruoyi-bzrkh/src/main/java/org/dromara/bzrkh/domain/vo/TeacherClassVo.java`
- `backend/ruoyi-modules/ruoyi-bzrkh/src/main/java/org/dromara/bzrkh/domain/bo/TeacherAssessmentQueryBo.java`
#### 1.2 权限配置
执行权限配置SQL文件:
```sql
-- 执行以下SQL文件
backend/ruoyi-modules/ruoyi-bzrkh/班主任考核管理权限配置.sql
```
#### 1.3 重新编译启动
```bash
# 编译项目(在后端根目录执行)
mvn clean compile
# 重启应用服务
# 根据实际部署方式重启
```
### 2. 前端部署
#### 2.1 新增文件清单
**API层**
- `web/src/api/bzrkh/teacherAssessment/types.ts`
- `web/src/api/bzrkh/teacherAssessment/index.ts`
**视图层**
- `web/src/views/bzrkh/teacherAssessment/index.vue`
#### 2.2 重新编译部署
```bash
# 安装依赖(如果需要)
npm install
# 编译前端项目
npm run build:prod
# 部署到nginx
# 根据实际部署方式进行部署
```
## 🔐 权限配置
### 权限字符列表
| 权限字符 | 权限说明 | 对应功能 |
|---------|----------|----------|
| `bzrkh:teacherAssessment:list` | 班主任考核查询权限 | 查看班级列表、考核计划列表 |
| `bzrkh:teacherAssessment:detail` | 班主任考核详情权限 | 查看考核详情 |
| `bzrkh:teacherAssessment:submit` | 班主任考核提交权限 | 提交考核 |
### API接口权限映射
| HTTP方法 | 接口路径 | 权限字符 | 功能说明 |
|---------|----------|----------|----------|
| GET | `/bzrkh/teacherAssessment/classes` | `bzrkh:teacherAssessment:list` | 获取班主任管理的班级列表 |
| GET | `/bzrkh/teacherAssessment/plans` | `bzrkh:teacherAssessment:list` | 获取班主任考核计划列表 |
| GET | `/bzrkh/teacherAssessment/detail` | `bzrkh:teacherAssessment:detail` | 查看考核详情 |
| POST | `/bzrkh/teacherAssessment/submit` | `bzrkh:teacherAssessment:submit` | 提交考核 |
## 📊 数据依赖
### 数据表依赖
- **主要数据表**:
- `bmzr_assessment_plan` - 班主任考核计划表
- `bmzr_assessment_scheme` - 班主任考核方案表
- `xg_class_msg` - 班级信息表
- **查询条件**:
- 班级状态必须为 '1'(正常)
- 考核计划状态必须为 '0'(启用)
- 班主任ID通过当前登录用户自动获取
### 业务规则
1. **权限控制**:班主任只能查看和管理自己担任班主任的班级
2. **数据过滤**:只展示状态正常的班级和启用的考核计划
3. **自动关联**:系统根据登录用户ID自动获取其担任班主任的班级
## 🔄 后续开发
### 待完善功能
1. **提交考核逻辑**(`TeacherAssessmentServiceImpl.submitAssessment`)
- 验证班主任权限
- 验证考核计划有效性
- 创建或更新考核记录
- 更新考核状态
2. **查看考核详情**(`TeacherAssessmentServiceImpl.getAssessmentDetail`)
- 获取考核计划详情
- 获取考核指标详情
- 获取考核记录和评分
- 返回完整的考核详情数据
### 扩展建议
1. **考核评分页面**:为提交考核和查看考核功能创建专门的页面
2. **考核统计**:添加班级考核统计和对比功能
3. **考核报告**:生成班级考核报告导出功能
4. **消息通知**:考核提交后的消息通知机制
## ⚠️ 注意事项
1. **数据库依赖**:确保 `xg_class_msg` 表存在且包含班主任相关字段
2. **权限验证**:所有接口都有权限验证,请确保用户具有相应权限
3. **登录状态**:功能依赖当前登录用户信息,确保用户已正常登录
4. **前端兼容**:使用了 Element Plus 和 Vue 3 相关特性,确保前端环境兼容
## 📞 技术支持
如有部署问题,请检查:
1. **后端日志**:查看应用启动日志和接口调用日志
2. **数据库连接**:确保数据库连接正常且表结构正确
3. **权限配置**:确保菜单和按钮权限配置正确
4. **前端控制台**:查看浏览器控制台错误信息
---
**文档版本**: V1.0.0
**创建时间**: 2025-01-27
**最后更新**: 2025-01-27
@@ -0,0 +1,37 @@
-- ==========================================
-- 班主任考核计划管理权限配置
-- 创建时间:2025-01-08
-- 功能描述:为班主任考核计划管理模块配置菜单和权限
-- ==========================================
-- 删除已存在的菜单
DELETE FROM sys_menu WHERE menu_name = '班主任考核计划管理' AND parent_id IN (
SELECT id FROM (SELECT * FROM sys_menu) t WHERE t.menu_name = '班主任考核管理'
);
-- 插入班主任考核计划管理菜单
INSERT INTO sys_menu (tenant_id, menu_name, parent_id, order_num, path, component, query_param, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, remark)
VALUES ('000000', '班主任考核计划管理',
(SELECT id FROM (SELECT * FROM sys_menu) t WHERE t.menu_name = '班主任考核管理' LIMIT 1),
3, 'assessmentPlan', 'bzrkh/assessmentPlan/index', '', 1, 0, 'C', '0', '0', 'bzrkh:assessmentPlan:list', 'fa fa-calendar-check-o', 103, 1, NOW(), '班主任考核计划管理菜单');
-- 获取刚插入的菜单ID
SET @menu_id = LAST_INSERT_ID();
-- 插入按钮权限
INSERT INTO sys_menu (tenant_id, menu_name, parent_id, order_num, path, component, query_param, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, remark) VALUES
('000000', '班主任考核计划查询', @menu_id, 1, '', '', '', 1, 0, 'F', '0', '0', 'bzrkh:assessmentPlan:query', '#', 103, 1, NOW(), ''),
('000000', '班主任考核计划新增', @menu_id, 2, '', '', '', 1, 0, 'F', '0', '0', 'bzrkh:assessmentPlan:add', '#', 103, 1, NOW(), ''),
('000000', '班主任考核计划修改', @menu_id, 3, '', '', '', 1, 0, 'F', '0', '0', 'bzrkh:assessmentPlan:edit', '#', 103, 1, NOW(), ''),
('000000', '班主任考核计划删除', @menu_id, 4, '', '', '', 1, 0, 'F', '0', '0', 'bzrkh:assessmentPlan:remove', '#', 103, 1, NOW(), ''),
('000000', '班主任考核计划导出', @menu_id, 5, '', '', '', 1, 0, 'F', '0', '0', 'bzrkh:assessmentPlan:export', '#', 103, 1, NOW(), '');
-- ==========================================
-- 权限字符说明:
-- bzrkh:assessmentPlan:list - 考核计划列表查询权限
-- bzrkh:assessmentPlan:query - 考核计划详情查询权限
-- bzrkh:assessmentPlan:add - 考核计划新增权限
-- bzrkh:assessmentPlan:edit - 考核计划修改权限
-- bzrkh:assessmentPlan:remove - 考核计划删除权限
-- bzrkh:assessmentPlan:export - 考核计划导出权限
-- ==========================================
@@ -0,0 +1,184 @@
# 班主任考核计划管理模块部署说明
## 模块概述
班主任考核计划管理模块是班主任考核管理系统的重要组成部分,用于管理考核计划的生命周期,包括计划的创建、修改、删除、查询以及状态管理等功能。
## 技术架构
### 后端技术栈
- **框架**: Spring Boot 3.4.6
- **ORM**: MyBatis-Plus
- **数据库**: MySQL 8.0+
- **权限管理**: Sa-Token
- **数据验证**: Bean Validation
### 前端技术栈
- **框架**: Vue 3.5.13
- **UI组件**: Element Plus
- **类型检查**: TypeScript 5.8.3
- **构建工具**: Vite
## 文件结构
### 后端文件
```
backend/ruoyi-modules/ruoyi-bzrkh/
├── src/main/java/org/dromara/bzrkh/
│ ├── domain/
│ │ ├── BmzrAssessmentPlan.java # 实体类
│ │ ├── bo/BmzrAssessmentPlanBo.java # 业务对象
│ │ └── vo/BmzrAssessmentPlanVo.java # 视图对象
│ ├── mapper/
│ │ └── BmzrAssessmentPlanMapper.java # 数据访问层
│ ├── service/
│ │ ├── IBmzrAssessmentPlanService.java # 服务接口
│ │ └── impl/BmzrAssessmentPlanServiceImpl.java # 服务实现
│ └── controller/
│ └── BmzrAssessmentPlanController.java # 控制器
├── 班主任考核计划管理权限配置.sql # 权限配置SQL
└── 班主任考核计划管理部署说明.md # 部署说明
```
### 前端文件
```
web/src/
├── api/bzrkh/assessmentPlan/
│ ├── types.ts # 类型定义
│ └── index.ts # API接口
└── views/bzrkh/assessmentPlan/
└── index.vue # Vue组件
```
### 文档文件
```
docs/开发文档/API/
└── 班主任考核计划管理API.md # API文档
```
## 部署步骤
### 1. 数据库初始化
**创建数据表**:
执行 `docs/设计文档/database/班主任考核管理/bmzr_assessment_tables.sql` 中的 `bmzr_assessment_plan` 表创建语句。
**配置字典数据**:
执行 `docs/设计文档/database/班主任考核管理/bmzr_dict_data_mysql.sql` 中的相关字典配置。
### 2. 权限配置
执行 `backend/ruoyi-modules/ruoyi-bzrkh/班主任考核计划管理权限配置.sql` 文件,创建菜单和权限配置。
### 3. 后端代码部署
1. 确保 `ruoyi-bzrkh` 模块已在主工程的 `pom.xml` 中引入
2. 确保所有Java文件已正确放置在对应目录
3. 重启后端服务
### 4. 前端代码部署
1. 将前端Vue组件文件放置在正确目录
2. 确保API类型定义和接口文件正确配置
3. 重新构建前端项目
### 5. 功能验证
1. 登录系统,验证菜单显示正常
2. 测试各项功能:新增、修改、删除、查询、导出
3. 验证权限控制正常工作
## 权限配置详情
### 菜单权限
- **主菜单**: 班主任考核计划管理
- **路径**: `/bzrkh/assessmentPlan`
- **组件**: `bzrkh/assessmentPlan/index`
- **图标**: `fa fa-calendar-check-o`
### 功能权限
| 权限字符 | 权限名称 | 说明 |
|---------|---------|------|
| `bzrkh:assessmentPlan:list` | 考核计划列表 | 查询考核计划列表的权限 |
| `bzrkh:assessmentPlan:query` | 考核计划查询 | 查询单个考核计划详情的权限 |
| `bzrkh:assessmentPlan:add` | 考核计划新增 | 新增考核计划的权限 |
| `bzrkh:assessmentPlan:edit` | 考核计划修改 | 修改考核计划信息的权限 |
| `bzrkh:assessmentPlan:remove` | 考核计划删除 | 删除考核计划的权限 |
| `bzrkh:assessmentPlan:export` | 考核计划导出 | 导出考核计划数据的权限 |
## API接口列表
### RESTful接口
| 方法 | 路径 | 说明 | 权限 |
|------|------|------|------|
| GET | `/bzrkh/assessmentPlan/list` | 查询计划列表 | `bzrkh:assessmentPlan:list` |
| GET | `/bzrkh/assessmentPlan/{id}` | 获取计划详情 | `bzrkh:assessmentPlan:query` |
| POST | `/bzrkh/assessmentPlan` | 新增计划 | `bzrkh:assessmentPlan:add` |
| PUT | `/bzrkh/assessmentPlan` | 修改计划 | `bzrkh:assessmentPlan:edit` |
| DELETE | `/bzrkh/assessmentPlan/{ids}` | 删除计划 | `bzrkh:assessmentPlan:remove` |
| POST | `/bzrkh/assessmentPlan/export` | 导出计划 | `bzrkh:assessmentPlan:export` |
| PUT | `/bzrkh/assessmentPlan/changeStatus` | 修改状态 | `bzrkh:assessmentPlan:edit` |
| GET | `/bzrkh/assessmentPlan/schemes/options` | 获取方案选项 | `bzrkh:assessmentPlan:list` |
## 核心功能特性
### 1. 计划管理
- 支持考核计划的完整生命周期管理
- 计划编码唯一性校验
- 时间范围合理性验证
### 2. 状态控制
- 支持计划启用/禁用状态切换
- 状态变更权限控制
### 3. 数据导出
- 支持Excel格式数据导出
- 可根据查询条件导出指定数据
### 4. 权限控制
- 完整的菜单和功能权限控制
- 基于Sa-Token的细粒度权限管理
## 注意事项
### 开发要求
1. 所有API接口必须包含权限注解
2. 参数验证使用Bean Validation
3. 错误处理要规范统一
4. 代码注释要完整清晰
### 业务规则
1. 计划编码在租户内必须唯一
2. 计划的开始时间不能大于结束时间
3. 数据提取时间不能超出计划时间范围
4. 删除计划前需要检查关联数据
### 性能优化
1. 查询接口支持分页
2. 列表查询支持多条件组合查询
3. 大数据量导出采用流式处理
## 故障排查
### 常见问题
1. **权限问题**: 检查菜单权限配置是否正确
2. **接口404**: 检查后端路由配置
3. **前端报错**: 检查API接口定义是否匹配
4. **数据库错误**: 检查表结构和字段是否正确
### 日志查看
- 后端日志位置: `logs/ruoyi-admin.log`
- 前端控制台: 浏览器开发者工具
## 联系方式
如有问题,请联系开发团队或查看相关文档:
- API文档: `docs/开发文档/API/班主任考核计划管理API.md`
- 数据库文档: `docs/设计文档/database/班主任考核管理/`
## 版本信息
- **版本**: v1.0.0
- **创建时间**: 2025-01-08
- **最后更新**: 2025-01-08
- **开发者**: 系统开发团队
@@ -0,0 +1,141 @@
# 班主任考核指标类型管理模块部署说明
## 1. 数据库准备
### 1.1 执行表结构创建脚本
```sql
-- 执行表结构创建脚本
source docs/设计文档/database/班主任考核管理/bmzr_assessment_tables.sql
```
### 1.2 执行字典数据脚本
```sql
-- 执行字典数据脚本
source docs/设计文档/database/班主任考核管理/bmzr_dict_data_mysql.sql
```
## 2. 后端代码部署
### 2.1 已创建的后端文件列表
1. **Domain实体类**
- `backend/ruoyi-modules/ruoyi-bzrkh/src/main/java/org/dromara/bzrkh/domain/BmzrAssessmentIndicatorType.java`
2. **VO类**
- `backend/ruoyi-modules/ruoyi-bzrkh/src/main/java/org/dromara/bzrkh/domain/vo/BmzrAssessmentIndicatorTypeVo.java`
3. **BO类**
- `backend/ruoyi-modules/ruoyi-bzrkh/src/main/java/org/dromara/bzrkh/domain/bo/BmzrAssessmentIndicatorTypeBo.java`
4. **Mapper接口**
- `backend/ruoyi-modules/ruoyi-bzrkh/src/main/java/org/dromara/bzrkh/mapper/BmzrAssessmentIndicatorTypeMapper.java`
5. **Service接口**
- `backend/ruoyi-modules/ruoyi-bzrkh/src/main/java/org/dromara/bzrkh/service/IBmzrAssessmentIndicatorTypeService.java`
6. **Service实现类**
- `backend/ruoyi-modules/ruoyi-bzrkh/src/main/java/org/dromara/bzrkh/service/impl/BmzrAssessmentIndicatorTypeServiceImpl.java`
7. **Controller**
- `backend/ruoyi-modules/ruoyi-bzrkh/src/main/java/org/dromara/bzrkh/controller/BmzrAssessmentIndicatorTypeController.java`
### 2.2 后端配置说明
确保 `ruoyi-bzrkh` 模块已正确配置并加载:
1. 检查 `backend/ruoyi-modules/pom.xml` 中是否包含 `ruoyi-bzrkh` 模块
2. 确保 Spring Boot 能够扫描到 `org.dromara.bzrkh` 包下的组件
## 3. 前端代码部署
### 3.1 已创建的前端文件列表
1. **API类型定义**
- `web/src/api/bzrkh/assessmentIndicatorType/types.ts`
2. **API调用文件**
- `web/src/api/bzrkh/assessmentIndicatorType/index.ts`
3. **Vue页面**
- `web/src/views/bzrkh/assessmentIndicatorType/index.vue`
### 3.2 前端配置说明
1. 确保路由配置正确,能够访问到创建的Vue页面
2. 检查API请求路径是否正确配置
## 4. 权限配置
### 4.1 权限字符列表
- `bzrkh:assessmentIndicatorType:list` - 查询权限
- `bzrkh:assessmentIndicatorType:query` - 详情权限
- `bzrkh:assessmentIndicatorType:add` - 新增权限
- `bzrkh:assessmentIndicatorType:edit` - 修改权限
- `bzrkh:assessmentIndicatorType:remove` - 删除权限
- `bzrkh:assessmentIndicatorType:export` - 导出权限
### 4.2 菜单配置
请参考 `班主任考核指标类型管理权限配置.md` 文件中的SQL脚本进行菜单和权限配置。
## 5. 字典配置说明
该模块使用以下字典:
1. **sys_item_enable** - 状态字典(启用/停用)
2. **bmzr_indicator_type** - 指标类型字典(已通过脚本创建)
## 6. 功能特性
### 6.1 实现的功能
- ✅ 指标类型列表查询(支持分页、条件筛选)
- ✅ 指标类型详情查看
- ✅ 新增指标类型
- ✅ 修改指标类型
- ✅ 删除指标类型(逻辑删除)
- ✅ 批量删除
- ✅ 数据导出
- ✅ 权限控制
### 6.2 数据校验
- 指标类型编码唯一性校验
- 必填字段验证
- 字段长度限制
### 6.3 界面特性
- 响应式设计
- 搜索条件折叠/展开
- 友好的删除确认提示
- 完整的CRUD操作界面
## 7. 注意事项
1. **权限配置**:请确保在系统菜单管理中正确配置权限
2. **字典数据**:确保相关字典数据已正确导入
3. **表结构**:确保数据库表结构与代码实体类保持一致
4. **多租户**:该模块支持多租户,请注意租户隔离
5. **逻辑删除**:删除操作为逻辑删除,数据不会物理删除
## 8. 测试建议
1. 测试CRUD基本功能
2. 测试权限控制是否生效
3. 测试数据校验规则
4. 测试批量操作
5. 测试搜索和分页功能
6. 测试导出功能
## 9. 扩展说明
该模块为班主任考核管理系统的基础模块,后续可基于此模块扩展:
- 考核指标管理
- 考核方案管理
- 考核计划管理
- 考核评分管理
所有扩展模块都可以引用指标类型进行关联设计。
@@ -0,0 +1,312 @@
# 班主任考核方案管理API文档
## 📋 基本信息
- **模块名称**: 班主任考核方案管理
- **模块编码**: bzrkh-assessment-scheme
- **API前缀**: `/bzrkh/assessmentScheme`
- **创建时间**: 2025-01-08
- **文档版本**: V1.0.0
## 🔐 权限配置
### 权限字符列表
| 权限字符 | 权限名称 | 说明 |
|---------|---------|------|
| `bzrkh:assessmentScheme:list` | 考核方案列表查询权限 | 查看考核方案列表 |
| `bzrkh:assessmentScheme:query` | 考核方案详情查询权限 | 查看考核方案详情 |
| `bzrkh:assessmentScheme:add` | 考核方案新增权限 | 创建新的考核方案 |
| `bzrkh:assessmentScheme:edit` | 考核方案修改权限 | 编辑考核方案信息 |
| `bzrkh:assessmentScheme:remove` | 考核方案删除权限 | 删除考核方案 |
| `bzrkh:assessmentScheme:export` | 考核方案导出权限 | 导出考核方案数据 |
### 菜单配置
- **父级菜单**: 班主任考核管理
- **菜单路径**: `/bzrkh/assessmentScheme`
- **组件路径**: `bzrkh/assessmentScheme/index`
- **菜单图标**: `clipboard`
## 📊 数据字典
### 学期字典
| 字典值 | 字典标签 | 说明 |
|-------|---------|------|
| `1` | 上学期 | 学年上学期 |
| `2` | 下学期 | 学年下学期 |
### 是否字典 (sys_yes_no)
| 字典值 | 字典标签 | 说明 |
|-------|---------|------|
| `0` | 否 | 不需要 |
| `1` | 是 | 需要 |
### 状态字典 (sys_normal_disable)
| 字典值 | 字典标签 | 说明 |
|-------|---------|------|
| `0` | 正常 | 启用状态 |
| `1` | 停用 | 禁用状态 |
## 🗄️ 数据模型
### 考核方案实体 (BmzrAssessmentScheme)
| 字段名 | 类型 | 长度 | 必填 | 说明 |
|-------|------|------|------|------|
| id | bigint | 20 | ✅ | 主键ID |
| tenant_id | varchar | 20 | ✅ | 租户编号 |
| scheme_name | varchar | 100 | ✅ | 方案名称 |
| scheme_code | varchar | 50 | ✅ | 方案编码 |
| academic_year | varchar | 10 | ✅ | 学年 |
| semester | char | 1 | ✅ | 学期(1=上学期 2=下学期) |
| scheme_description | text | - | ❌ | 方案描述 |
| self_evaluation_required | char | 1 | ✅ | 是否需要自评(0=否 1=是) |
| superior_evaluation_required | char | 1 | ✅ | 是否需要上级评(0=否 1=是) |
| status | char | 1 | ✅ | 状态(0正常 1停用) |
| remark | varchar | 500 | ❌ | 备注 |
| create_dept | bigint | 20 | ❌ | 创建部门 |
| create_by | bigint | 20 | ❌ | 创建者 |
| create_time | datetime | - | ❌ | 创建时间 |
| update_by | bigint | 20 | ❌ | 更新者 |
| update_time | datetime | - | ❌ | 更新时间 |
| deleted | int | 1 | ✅ | 删除标志(0代表存在 1代表删除) |
## 🔌 API接口列表
### 1. 查询考核方案列表
**接口地址**: `GET /bzrkh/assessmentScheme/list`
**权限要求**: `bzrkh:assessmentScheme:list`
**请求参数**:
```typescript
interface BmzrAssessmentSchemeQuery extends PageQuery {
schemeName?: string; // 方案名称(模糊查询)
schemeCode?: string; // 方案编码(精确查询)
academicYear?: string; // 学年(精确查询)
semester?: string; // 学期(精确查询)
status?: string; // 状态(精确查询)
selfEvaluationRequired?: string; // 是否需要自评
superiorEvaluationRequired?: string; // 是否需要上级评
}
```
**响应数据**:
```json
{
"code": 200,
"msg": "查询成功",
"rows": [
{
"id": 1744234567890123456,
"tenantId": "000000",
"schemeName": "2024-2025学年上学期班主任考核方案",
"schemeCode": "BMZR_2024_1",
"academicYear": "2024-2025",
"semester": "1",
"schemeDescription": "2024-2025学年上学期班主任考核方案",
"selfEvaluationRequired": "1",
"superiorEvaluationRequired": "1",
"status": "0",
"remark": "",
"createTime": "2025-01-08 10:00:00",
"updateTime": "2025-01-08 10:00:00"
}
],
"total": 1
}
```
### 2. 查询考核方案详情
**接口地址**: `GET /bzrkh/assessmentScheme/{id}`
**权限要求**: `bzrkh:assessmentScheme:query`
**路径参数**:
- `id`: 考核方案ID (必填)
**响应数据**:
```json
{
"code": 200,
"msg": "查询成功",
"data": {
"id": 1744234567890123456,
"tenantId": "000000",
"schemeName": "2024-2025学年上学期班主任考核方案",
"schemeCode": "BMZR_2024_1",
"academicYear": "2024-2025",
"semester": "1",
"schemeDescription": "2024-2025学年上学期班主任考核方案",
"selfEvaluationRequired": "1",
"superiorEvaluationRequired": "1",
"status": "0",
"remark": "",
"createTime": "2025-01-08 10:00:00",
"updateTime": "2025-01-08 10:00:00"
}
}
```
### 3. 新增考核方案
**接口地址**: `POST /bzrkh/assessmentScheme`
**权限要求**: `bzrkh:assessmentScheme:add`
**请求体**:
```json
{
"schemeName": "2024-2025学年上学期班主任考核方案",
"schemeCode": "BMZR_2024_1",
"academicYear": "2024-2025",
"semester": "1",
"schemeDescription": "2024-2025学年上学期班主任考核方案详细描述",
"selfEvaluationRequired": "1",
"superiorEvaluationRequired": "1",
"status": "0",
"remark": "备注信息"
}
```
**校验规则**:
- `schemeName`: 必填,方案名称不能为空
- `schemeCode`: 必填,方案编码不能为空,且在同租户下唯一
- `academicYear`: 必填,学年不能为空
- `semester`: 必填,学期不能为空,值为 1 或 2
- `selfEvaluationRequired`: 必填,是否需要自评,值为 0 或 1
- `superiorEvaluationRequired`: 必填,是否需要上级评,值为 0 或 1
- `status`: 必填,状态不能为空,值为 0 或 1
**响应数据**:
```json
{
"code": 200,
"msg": "操作成功"
}
```
### 4. 修改考核方案
**接口地址**: `PUT /bzrkh/assessmentScheme`
**权限要求**: `bzrkh:assessmentScheme:edit`
**请求体**:
```json
{
"id": 1744234567890123456,
"schemeName": "2024-2025学年上学期班主任考核方案(修改)",
"schemeCode": "BMZR_2024_1",
"academicYear": "2024-2025",
"semester": "1",
"schemeDescription": "修改后的方案描述",
"selfEvaluationRequired": "1",
"superiorEvaluationRequired": "1",
"status": "0",
"remark": "修改备注"
}
```
**校验规则**: 与新增接口相同,额外需要 `id` 字段
**响应数据**:
```json
{
"code": 200,
"msg": "操作成功"
}
```
### 5. 删除考核方案
**接口地址**: `DELETE /bzrkh/assessmentScheme/{ids}`
**权限要求**: `bzrkh:assessmentScheme:remove`
**路径参数**:
- `ids`: 考核方案ID数组,多个ID用逗号分隔
**响应数据**:
```json
{
"code": 200,
"msg": "操作成功"
}
```
### 6. 导出考核方案
**接口地址**: `POST /bzrkh/assessmentScheme/export`
**权限要求**: `bzrkh:assessmentScheme:export`
**请求体**: 与查询列表接口参数相同
**响应**: Excel文件下载
## 🎯 业务规则
### 数据唯一性约束
1. 同一租户下,`schemeCode`(方案编码)必须唯一
2. 建议同一租户、学年、学期下只有一个启用的考核方案
### 状态管理
1. 新建方案默认状态为"正常"(0)
2. 停用的方案不影响已关联的考核计划
3. 删除方案时需要检查是否被考核计划引用
### 权限控制
1. 普通用户只能查看考核方案
2. 管理员可以进行增删改操作
3. 超级管理员拥有所有权限
## 🔧 技术实现
### 后端技术栈
- **框架**: Spring Boot 3.4.6
- **数据库**: MySQL 8.0+
- **ORM**: MyBatis-Plus
- **权限**: Sa-Token
### 前端技术栈
- **框架**: Vue 3.5.13 + TypeScript 5.8.3
- **UI组件**: Element Plus
- **HTTP客户端**: Axios
### 数据库表
- **主表**: `bmzr_assessment_scheme` (班主任考核方案表)
## 🧪 测试用例
### 功能测试
1. ✅ 考核方案列表查询(支持分页、筛选)
2. ✅ 考核方案详情查询
3. ✅ 考核方案新增(包含表单验证)
4. ✅ 考核方案修改(包含表单验证)
5. ✅ 考核方案删除(支持批量删除)
6. ✅ 考核方案导出(Excel格式)
### 权限测试
1. ✅ 无权限用户访问受限
2. ✅ 不同角色权限差异化控制
### 数据验证测试
1. ✅ 必填字段验证
2. ✅ 数据格式验证
3. ✅ 唯一性约束验证
## 📝 更新日志
### V1.0.0 (2025-01-08)
- ✅ 基础CRUD功能实现
- ✅ 权限配置完成
- ✅ 前后端代码生成
- ✅ API文档编写
## 🔗 相关文档
- **数据库设计**: `docs/设计文档/database/班主任考核管理/bmzr_assessment_tables.sql`
- **字典配置**: `docs/设计文档/database/班主任考核管理/bmzr_dict_data_mysql.sql`
- **权限配置**: `backend/ruoyi-modules/ruoyi-bzrkh/班主任考核方案权限配置.sql`
@@ -0,0 +1,380 @@
# 班主任考核计划管理API文档
## 概述
班主任考核计划管理模块用于管理班主任考核的各类计划,包括计划的创建、修改、删除、查询以及状态管理等功能。
## 基本信息
- **模块名称**: 班主任考核计划管理
- **模块编码**: bzrkh
- **API前缀**: `/bzrkh/assessmentPlan`
- **创建时间**: 2025-01-08
- **版本**: v1.0.0
## 权限配置
### 菜单权限配置
以下是班主任考核计划管理模块所需的权限配置SQL:
```sql
-- ==========================================
-- 班主任考核计划管理权限配置
-- ==========================================
-- 删除已存在的菜单
DELETE FROM sys_menu WHERE menu_name = '班主任考核计划管理' AND parent_id IN (
SELECT id FROM (SELECT * FROM sys_menu) t WHERE t.menu_name = '班主任考核管理'
);
-- 插入班主任考核计划管理菜单
INSERT INTO sys_menu (tenant_id, menu_name, parent_id, order_num, path, component, query_param, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, remark)
VALUES ('000000', '班主任考核计划管理',
(SELECT id FROM (SELECT * FROM sys_menu) t WHERE t.menu_name = '班主任考核管理' LIMIT 1),
3, 'assessmentPlan', 'bzrkh/assessmentPlan/index', '', 1, 0, 'C', '0', '0', 'bzrkh:assessmentPlan:list', 'fa fa-calendar-check-o', 103, 1, NOW(), '班主任考核计划管理菜单');
-- 获取刚插入的菜单ID
SET @menu_id = LAST_INSERT_ID();
-- 插入按钮权限
INSERT INTO sys_menu (tenant_id, menu_name, parent_id, order_num, path, component, query_param, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, remark) VALUES
('000000', '班主任考核计划查询', @menu_id, 1, '', '', '', 1, 0, 'F', '0', '0', 'bzrkh:assessmentPlan:query', '#', 103, 1, NOW(), ''),
('000000', '班主任考核计划新增', @menu_id, 2, '', '', '', 1, 0, 'F', '0', '0', 'bzrkh:assessmentPlan:add', '#', 103, 1, NOW(), ''),
('000000', '班主任考核计划修改', @menu_id, 3, '', '', '', 1, 0, 'F', '0', '0', 'bzrkh:assessmentPlan:edit', '#', 103, 1, NOW(), ''),
('000000', '班主任考核计划删除', @menu_id, 4, '', '', '', 1, 0, 'F', '0', '0', 'bzrkh:assessmentPlan:remove', '#', 103, 1, NOW(), ''),
('000000', '班主任考核计划导出', @menu_id, 5, '', '', '', 1, 0, 'F', '0', '0', 'bzrkh:assessmentPlan:export', '#', 103, 1, NOW(), '');
```
### 权限字符说明
| 权限字符 | 权限名称 | 说明 |
|---------|---------|------|
| `bzrkh:assessmentPlan:list` | 考核计划列表 | 查询考核计划列表的权限 |
| `bzrkh:assessmentPlan:query` | 考核计划查询 | 查询单个考核计划详情的权限 |
| `bzrkh:assessmentPlan:add` | 考核计划新增 | 新增考核计划的权限 |
| `bzrkh:assessmentPlan:edit` | 考核计划修改 | 修改考核计划信息的权限 |
| `bzrkh:assessmentPlan:remove` | 考核计划删除 | 删除考核计划的权限 |
| `bzrkh:assessmentPlan:export` | 考核计划导出 | 导出考核计划数据的权限 |
## API接口列表
### 1. 查询考核计划列表
**接口地址**: `GET /bzrkh/assessmentPlan/list`
**接口描述**: 分页查询班主任考核计划列表
**权限要求**: `bzrkh:assessmentPlan:list`
**请求参数**:
| 参数名 | 类型 | 必填 | 说明 |
|--------|------|------|------|
| pageNum | integer | 否 | 页码,默认1 |
| pageSize | integer | 否 | 每页数量,默认10 |
| planName | string | 否 | 计划名称(模糊查询) |
| planCode | string | 否 | 计划编码(精确查询) |
| schemeId | integer | 否 | 考核方案ID |
| academicYear | string | 否 | 学年(模糊查询) |
| semester | string | 否 | 学期(1=上学期 2=下学期) |
| planStatus | string | 否 | 计划状态(0=禁用 1=启用) |
| beginCreateTime | string | 否 | 创建开始时间 |
| endCreateTime | string | 否 | 创建结束时间 |
**响应示例**:
```json
{
"code": 200,
"msg": "操作成功",
"rows": [
{
"id": 1,
"tenantId": "000000",
"planName": "2024年上学期班主任考核计划",
"planCode": "PLAN202401",
"schemeId": 1,
"schemeName": "标准考核方案",
"academicYear": "2023-2024",
"semester": "1",
"planStartTime": "2024-01-01 00:00:00",
"planEndTime": "2024-06-30 23:59:59",
"dataExtractStartTime": "2024-01-01 00:00:00",
"dataExtractEndTime": "2024-06-30 23:59:59",
"planStatus": "1",
"description": "2024年上学期班主任考核计划",
"remark": "测试计划",
"createTime": "2025-01-08 10:00:00"
}
],
"total": 1
}
```
### 2. 获取考核计划详情
**接口地址**: `GET /bzrkh/assessmentPlan/{id}`
**接口描述**: 根据ID获取班主任考核计划详细信息
**权限要求**: `bzrkh:assessmentPlan:query`
**路径参数**:
| 参数名 | 类型 | 必填 | 说明 |
|--------|------|------|------|
| id | integer | 是 | 考核计划ID |
**响应示例**:
```json
{
"code": 200,
"msg": "操作成功",
"data": {
"id": 1,
"tenantId": "000000",
"planName": "2024年上学期班主任考核计划",
"planCode": "PLAN202401",
"schemeId": 1,
"academicYear": "2023-2024",
"semester": "1",
"planStartTime": "2024-01-01 00:00:00",
"planEndTime": "2024-06-30 23:59:59",
"dataExtractStartTime": "2024-01-01 00:00:00",
"dataExtractEndTime": "2024-06-30 23:59:59",
"planStatus": "1",
"description": "2024年上学期班主任考核计划",
"remark": "测试计划",
"createTime": "2025-01-08 10:00:00"
}
}
```
### 3. 新增考核计划
**接口地址**: `POST /bzrkh/assessmentPlan`
**接口描述**: 新增班主任考核计划
**权限要求**: `bzrkh:assessmentPlan:add`
**请求体**:
```json
{
"planName": "2024年下学期班主任考核计划",
"planCode": "PLAN202402",
"schemeId": 1,
"academicYear": "2023-2024",
"semester": "2",
"planStartTime": "2024-07-01 00:00:00",
"planEndTime": "2024-12-31 23:59:59",
"dataExtractStartTime": "2024-07-01 00:00:00",
"dataExtractEndTime": "2024-12-31 23:59:59",
"planStatus": "1",
"description": "2024年下学期班主任考核计划",
"remark": "新学期计划"
}
```
**字段验证规则**:
| 字段名 | 验证规则 | 说明 |
|--------|----------|------|
| planName | 必填,长度不超过100 | 计划名称 |
| planCode | 必填,长度不超过50 | 计划编码,系统内唯一 |
| schemeId | 必填 | 考核方案ID |
| academicYear | 必填,长度不超过10 | 学年 |
| semester | 必填,只能是1或2 | 学期 |
| planStartTime | 必填 | 计划开始时间 |
| planEndTime | 必填 | 计划结束时间 |
| planStatus | 只能是0或1 | 计划状态 |
| description | 长度不超过500 | 计划描述 |
| remark | 长度不超过500 | 备注 |
**响应示例**:
```json
{
"code": 200,
"msg": "操作成功"
}
```
### 4. 修改考核计划
**接口地址**: `PUT /bzrkh/assessmentPlan`
**接口描述**: 修改班主任考核计划
**权限要求**: `bzrkh:assessmentPlan:edit`
**请求体**:
```json
{
"id": 1,
"planName": "2024年上学期班主任考核计划(修改)",
"planCode": "PLAN202401",
"schemeId": 1,
"academicYear": "2023-2024",
"semester": "1",
"planStartTime": "2024-01-01 00:00:00",
"planEndTime": "2024-06-30 23:59:59",
"dataExtractStartTime": "2024-01-01 00:00:00",
"dataExtractEndTime": "2024-06-30 23:59:59",
"planStatus": "1",
"description": "修改后的计划描述",
"remark": "修改后的备注"
}
```
**响应示例**:
```json
{
"code": 200,
"msg": "操作成功"
}
```
### 5. 删除考核计划
**接口地址**: `DELETE /bzrkh/assessmentPlan/{ids}`
**接口描述**: 批量删除班主任考核计划
**权限要求**: `bzrkh:assessmentPlan:remove`
**路径参数**:
| 参数名 | 类型 | 必填 | 说明 |
|--------|------|------|------|
| ids | string | 是 | 考核计划ID数组,多个用逗号分隔 |
**响应示例**:
```json
{
"code": 200,
"msg": "操作成功"
}
```
### 6. 修改考核计划状态
**接口地址**: `PUT /bzrkh/assessmentPlan/changeStatus`
**接口描述**: 修改班主任考核计划的启用/禁用状态
**权限要求**: `bzrkh:assessmentPlan:edit`
**请求体**:
```json
{
"id": 1,
"planStatus": "0"
}
```
**响应示例**:
```json
{
"code": 200,
"msg": "操作成功"
}
```
### 7. 导出考核计划
**接口地址**: `POST /bzrkh/assessmentPlan/export`
**接口描述**: 导出班主任考核计划数据
**权限要求**: `bzrkh:assessmentPlan:export`
**请求体**: 与查询列表接口相同的查询条件
**响应**: Excel文件下载
### 8. 获取可用考核方案选项
**接口地址**: `GET /bzrkh/assessmentPlan/schemes/options`
**接口描述**: 获取可用的考核方案选项列表
**权限要求**: `bzrkh:assessmentPlan:list`
**响应示例**:
```json
{
"code": 200,
"msg": "操作成功",
"data": [
{
"id": 1,
"schemeName": "标准考核方案",
"schemeCode": "SCHEME001",
"academicYear": "2023-2024",
"semester": "1",
"status": "0"
}
]
}
```
## 错误码说明
| 错误码 | 错误信息 | 说明 |
|--------|----------|------|
| 400 | 计划编码已存在 | 计划编码在系统中已存在 |
| 400 | 计划名称不能为空 | 必填字段校验失败 |
| 400 | 学期只能是1或2 | 学期字段值不合法 |
| 403 | 无访问权限 | 用户没有对应的操作权限 |
| 404 | 数据不存在 | 指定的考核计划不存在 |
## 数据字典
### 学期字典 (sys_semester)
| 字典值 | 字典标签 | 说明 |
|--------|----------|------|
| 1 | 上学期 | 第一学期 |
| 2 | 下学期 | 第二学期 |
### 计划状态字典 (plan_status)
| 字典值 | 字典标签 | 说明 |
|--------|----------|------|
| 0 | 禁用 | 禁用状态 |
| 1 | 启用 | 启用状态 |
**注意**: 此模块使用自定义状态字典,与系统默认的 `sys_normal_disable` 字典定义相反,严格按照数据库字段设计:`plan_status` char(1) NOT NULL DEFAULT '1' COMMENT '计划状态(0=禁用 1=启用 )'
## 测试用例
### 1. 正常流程测试
1. 新增考核计划
2. 查询考核计划列表
3. 查看考核计划详情
4. 修改考核计划信息
5. 修改考核计划状态
6. 导出考核计划数据
7. 删除考核计划
### 2. 异常场景测试
1. 使用重复的计划编码新增计划
2. 使用无效的学期值
3. 删除不存在的计划
4. 无权限用户访问接口
## 注意事项
1. 计划编码在租户内必须唯一
2. 计划的开始时间不能大于结束时间
3. 数据提取时间不能超出计划时间范围
4. 删除计划前需要检查是否有关联的考核数据
5. 状态为禁用的计划不能执行考核操作
## 版本更新记录
| 版本 | 更新时间 | 更新内容 |
|------|----------|----------|
| v1.0.0 | 2025-01-08 | 初始版本,实现基本的CRUD功能 |
@@ -0,0 +1,288 @@
# 班主任考核管理数据库设计说明
## 📋 文档说明
**版本**: v1.0.0
**制定时间**: 2025-01-08
**模块**: 学工管理-班主任考核管理 (bmzr_)
**数据库**: MySQL 5.7.36+
---
## 🎯 设计概述
班主任考核管理系统支持多维度、多层级的班主任工作考核评价,实现了考核方案管理、指标体系设计、多角色评价、问卷调查、审批流程等完整功能,为学校班主任管理提供数据化支撑。
### 核心功能
- **考核方案管理**: 支持多类型考核方案设计和版本管理
- **指标体系管理**: 多级指标体系构建,支持权重配置和授权评价
- **多角色评价**: 自评、同行评、学生评、上级评四个维度
- **问卷调查**: 学生对班主任工作满意度调查
- **自动计算**: 系统根据权重自动计算综合得分
- **审批流程**: 支持自评提交和最终结果的审批管理
- **统计分析**: 多维度数据统计和图表展示
- **移动端支持**: 全面支持移动端评价和查询
---
## 📊 表结构设计
### 1. 核心配置模块 (3张表)
#### 1.1 bmzr_assessment_scheme - 班主任考核方案表
**功能**: 管理考核方案的基本信息和配置规则
**关键字段**:
- `scheme_type`: 方案类型(annual=年度 semester=学期 monthly=月度 special=专项)
- `*_evaluation_required`: 各类评价是否必需(自评、同行评、学生评、上级评)
- `auto_calculation`: 是否自动计算得分
- `publish_results`: 是否公布考核结果
#### 1.2 bmzr_assessment_indicator - 班主任考核指标体系表
**功能**: 定义多级指标体系和评价标准
**关键字段**:
- `indicator_type`: 指标类型(班级管理、学生教育、学业指导等)
- `parent_id`: 父级指标ID,支持多级树形结构
- `weight_ratio`: 权重比例配置
- `authorized_evaluators`: 授权评价人群(JSON格式)
- `allow_*_evaluation`: 各类评价权限控制
- `evaluation_criteria`: 评价标准和方法
#### 1.3 bmzr_assessment_scheme_indicator - 班主任考核方案指标关联表
**功能**: 关联考核方案和指标体系,支持个性化权重
**关键字段**:
- `scheme_id`: 考核方案ID
- `indicator_id`: 考核指标ID
- `weight_ratio`: 在方案中的权重比例
- `custom_max_score`/`custom_min_score`: 自定义分值范围
### 2. 执行管理模块 (1张表)
#### 2.1 bmzr_assessment_plan - 班主任考核计划表
**功能**: 管理具体的考核计划执行和时间安排
**关键字段**:
- `target_scope`: 考核范围(JSON格式存储年级、学院、班级等)
- `participants`: 参与人员信息(JSON格式)
- `*_assess_*_time`: 各阶段评价时间窗口(自评、同行评、学生评、上级评)
- `completion_rate`: 完成率统计
- `plan_status`: 计划状态(1=待开始 2=进行中 3=已结束 4=已暂停)
- `auto_start`/`auto_end`: 自动开始/结束控制
### 3. 评价数据模块 (4张表)
#### 3.1 bmzr_assessment_score - 班主任考核得分表
**功能**: 存储各维度评分数据和最终得分计算
**关键字段**:
- `evaluated_user_id`: 被评价班主任ID
- `self_*`: 自评数据(分数、意见、附件、提交时间)
- `peer_*`: 同行评数据(分数、意见、评价人数、提交时间)
- `student_*`: 学生评数据(分数、意见、评价人数、提交时间)
- `superior_*`: 上级评数据(分数、意见、评价人ID、提交时间)
- `final_score`/`weight_score`: 最终得分和加权得分
- `score_calculation`: 得分计算过程(JSON格式)
- `score_status`: 评分状态流转
#### 3.2 bmzr_assessment_survey - 班主任考核问卷调查表
**功能**: 管理学生对班主任的问卷调查数据
**关键字段**:
- `evaluated_user_id`: 被评价班主任ID
- `evaluator_user_id`: 评价学生ID
- `evaluator_class_*`: 评价学生班级信息
- `survey_data`: 问卷数据(JSON格式存储完整答案)
- `satisfaction_level`: 满意度等级
- `suggestions`: 意见建议
- `anonymous`: 是否匿名评价
#### 3.3 bmzr_assessment_evaluation - 班主任考核评价记录表
**功能**: 记录每一次具体的评价操作和数据
**关键字段**:
- `evaluator_type`: 评价人类型(self/peer/student/superior)
- `evaluation_score`: 评价分数
- `evaluation_comment`: 评价意见
- `evaluation_level`: 评价等级
- `weight_ratio`/`weight_score`: 权重比例和加权得分
- `device_type`: 设备类型(支持移动端统计)
#### 3.4 bmzr_assessment_approval - 班主任考核审批表
**功能**: 管理考核过程中的审批流程
**关键字段**:
- `approval_type`: 审批类型(self_submit=自评提交 final_result=最终结果)
- `current_step`/`total_steps`: 当前步骤和总步骤
- `approval_status`: 审批状态(1=待审批 2=审批中 3=审批通过 4=审批驳回)
- `approval_flow`: 审批流程(JSON格式存储完整流程)
- `timeout_hours`: 超时控制
- `reminder_count`: 提醒次数统计
---
## 🔑 关键特性
### 数据库规范遵循
- ✅ **雪花ID主键**: 所有表使用`bigint(20)`主键
- ✅ **多租户支持**: `tenant_id`字段实现数据隔离
- ✅ **逻辑删除**: `deleted`字段,禁止物理删除
- ✅ **审计追踪**: 完整的创建和更新信息记录
- ✅ **MySQL优化**: 合理的索引设计和数据类型选择
### 业务特性
- 🌳 **多级指标体系**: 支持无限级指标树形结构
- 🎯 **权重配置**: 灵活的权重分配和自定义分值
- 👥 **多角色评价**: 自评、同行评、学生评、上级评四个维度
- 📊 **自动计算**: 系统根据权重自动计算综合得分
- 🔄 **状态流转**: 完整的评分状态和审批状态管理
- 📱 **移动端支持**: 全面支持移动端评价和查询
- 🔍 **授权控制**: 指标级别的评价授权管理
- 📈 **统计分析**: 支持多维度数据统计和图表展示
---
## 🔗 关联关系
### 主要外键关联
```
bmzr_assessment_scheme_indicator
├── scheme_id → bmzr_assessment_scheme.id
└── indicator_id → bmzr_assessment_indicator.id
bmzr_assessment_plan
└── scheme_id → bmzr_assessment_scheme.id
bmzr_assessment_score
├── plan_id → bmzr_assessment_plan.id
├── scheme_id → bmzr_assessment_scheme.id
└── indicator_id → bmzr_assessment_indicator.id
bmzr_assessment_survey
└── plan_id → bmzr_assessment_plan.id
bmzr_assessment_evaluation
├── plan_id → bmzr_assessment_plan.id
├── scheme_id → bmzr_assessment_scheme.id
└── indicator_id → bmzr_assessment_indicator.id
bmzr_assessment_approval
└── plan_id → bmzr_assessment_plan.id
```
### 业务关联逻辑
```
考核方案 → 指标体系关联 → 考核计划 → 多维度评价 → 得分汇总 → 审批确认
↓ ↓ ↓ ↓ ↓ ↓
方案配置 → 权重设置 → 执行计划 → 评价记录 → 自动计算 → 结果发布
```
---
## 🎯 业务流程
### 1. 考核方案设计流程
```
1. 创建考核方案 → 设置基本信息和适用范围
2. 设计指标体系 → 构建多级指标树形结构
3. 关联方案指标 → 设置权重比例和评价权限
4. 方案审核发布 → 生效并可创建考核计划
```
### 2. 考核计划执行流程
```
1. 创建考核计划 → 选择方案和参与人员
2. 设置时间安排 → 配置各阶段评价时间窗口
3. 启动考核计划 → 自动或手动开始考核
4. 多维度评价 → 按时间顺序进行各类评价
5. 自动计算得分 → 系统根据权重计算最终得分
6. 审批确认 → 审批最终结果并发布
```
### 3. 评价操作流程
```
班主任自评 → 同行评价 → 学生问卷调查 → 上级评价 → 系统汇总计算
↓ ↓ ↓ ↓ ↓
提交自评 → 互相评价 → 匿名问卷 → 领导评价 → 最终得分
```
---
## 📊 字典数据说明
### 主要字典类型
- `bmzr_scheme_type`: 考核方案类型(年度/学期/月度/专项)
- `bmzr_indicator_type`: 指标类型(班级管理/学生教育/学业指导等)
- `bmzr_evaluator_type`: 评价人类型(自评/同行评/学生评/上级评)
- `bmzr_approval_status`: 审批状态(待审批/审批中/审批通过/审批驳回)
- `bmzr_plan_status`: 计划状态(待开始/进行中/已结束/已暂停)
- `bmzr_score_status`: 评分状态(待自评/待同行评/待学生评/待上级评/已完成)
- `bmzr_evaluation_level`: 评价等级(优秀/良好/合格/基本合格/不合格)
- `bmzr_satisfaction_level`: 满意度等级(非常满意/比较满意/一般/不太满意/非常不满意)
- `bmzr_semester`: 学期(上学期/下学期)
- `bmzr_device_type`: 设备类型(PC/Mobile/Tablet/WeChat)
---
## 📁 文件清单
### SQL文件
```
docs/设计文档/database/班主任考核管理/
├── bmzr_assessment_tables.sql # 表结构定义(8张表)
├── bmzr_dict_data_mysql.sql # 字典数据(MySQL版)
└── README.md # 本说明文档
```
### 执行顺序
1. **表结构创建**: 先执行`bmzr_assessment_tables.sql`
2. **字典数据导入**: 再执行`bmzr_dict_data_mysql.sql`
---
## 🚀 使用指南
### 1. 数据库初始化
```sql
-- 1. 创建表结构
SOURCE bmzr_assessment_tables.sql;
-- 2. 导入字典数据
SOURCE bmzr_dict_data_mysql.sql;
```
### 2. 基本数据准备
1. **设计指标体系**: 在`bmzr_assessment_indicator`表中创建多级指标结构
2. **创建考核方案**: 在`bmzr_assessment_scheme`表中定义方案基本信息
3. **关联方案指标**: 在`bmzr_assessment_scheme_indicator`表中建立关联并设置权重
4. **配置评价权限**: 在指标表中设置`authorized_evaluators`字段
### 3. 考核流程操作
1. **创建考核计划**: 选择方案、设置时间、确定参与人员
2. **启动考核**: 手动或自动开始考核计划
3. **多维度评价**: 按时间顺序完成各类评价
4. **系统计算**: 自动计算加权得分和等级
5. **审批发布**: 审批确认后发布最终结果
### 4. 移动端支持
- 支持班主任移动端自评和查询历史结果
- 支持学生移动端问卷调查和满意度评价
- 支持同行和上级移动端评价操作
- 所有操作都会记录设备类型便于统计分析
### 5. 数据统计分析
- 支持按时间、部门、班级等维度进行统计
- 支持评价结果的明细查询和汇总统计
- 支持图形化展示和数据导出
- 支持评价过程的进度跟踪和完成率统计
### 6. 注意事项
- 指标体系支持多级结构,建议不超过4级
- 权重设置需确保同级指标权重之和为1
- 时间窗口设置需合理,避免时间冲突
- 问卷数据以JSON格式存储,便于灵活扩展
- 审批流程支持多步骤,可根据需要配置
---
## 📞 技术支持
如有问题请参考:
- 数据库设计规范: `docs/设计文档/database/mysql-database-standard.md`
- 后端开发规范: `.cursor/cursorrules-backend.md`
- API开发规范: `docs/开发文档/API/`
**最后更新**: 2025-01-08
@@ -0,0 +1,203 @@
-- ==========================================
-- 班主任考核管理系统表结构(MySQL版)
-- 版本:V1.0.0
-- 功能:班主任考核管理相关表结构
-- 作者:系统设计
-- 时间:2025-01-08
-- 模块:学工管理-班主任考核管理表结构
-- ==========================================
-- 创建指标类型表
DROP TABLE IF EXISTS `bmzr_assessment_indicator_type`;
CREATE TABLE `bmzr_assessment_indicator_type` (
`id` bigint(20) NOT NULL COMMENT '主键ID',
`tenant_id` varchar(20) NOT NULL DEFAULT '000000' COMMENT '租户编号',
`indicator_type_name` varchar(100) NOT NULL COMMENT '指标类型名称',
`indicator_type_code` varchar(50) NOT NULL COMMENT '指标类型编码',
`status` char(1) NOT NULL DEFAULT '0' COMMENT '状态(0正常 1停用)',
`remark` varchar(500) COMMENT '备注',
`create_dept` bigint(20) COMMENT '创建部门',
`create_by` bigint(20) COMMENT '创建者',
`create_time` datetime COMMENT '创建时间',
`update_by` bigint(20) COMMENT '更新者',
`update_time` datetime COMMENT '更新时间',
`deleted` int(1) NOT NULL DEFAULT 0 COMMENT '删除标志(0代表存在 1代表删除)',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_tenant_indicator_type_code` (`tenant_id`, `indicator_type_code`),
KEY `idx_create_time` (`create_time`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='班主任考核指标类型表';
-- ==========================================
-- 2. 班主任考核指标体系表
-- ==========================================
DROP TABLE IF EXISTS `bmzr_assessment_indicator`;
CREATE TABLE `bmzr_assessment_indicator` (
`id` bigint(20) NOT NULL COMMENT '主键ID',
`tenant_id` varchar(20) NOT NULL DEFAULT '000000' COMMENT '租户编号',
`indicator_name` varchar(100) NOT NULL COMMENT '指标名称',
`indicator_code` varchar(50) NOT NULL COMMENT '指标编码',
`indicator_type` varchar(20) NOT NULL COMMENT '指标类型',
`parent_id` bigint(20) NOT NULL DEFAULT 0 COMMENT '父级指标ID',
`sort_order` int(4) NOT NULL DEFAULT 1 COMMENT '排序',
`weight_ratio` decimal(5,4) NOT NULL DEFAULT 0.0000 COMMENT '权重比例(0-1之间)',
`max_score` decimal(5,2) NOT NULL DEFAULT 100.00 COMMENT '最高分值',
`score` decimal(5,2) NOT NULL DEFAULT 0.00 COMMENT '分值',
`allow_self_evaluation` char(1) NOT NULL DEFAULT '1' COMMENT '允许自评(0=否 1=是)',
`allow_superior_evaluation` char(1) NOT NULL DEFAULT '1' COMMENT '允许上级评(0=否 1=是)',
`status` char(1) NOT NULL DEFAULT '0' COMMENT '状态(0正常 1停用)',
`remark` varchar(500) COMMENT '备注',
`create_dept` bigint(20) COMMENT '创建部门',
`create_by` bigint(20) COMMENT '创建者',
`create_time` datetime COMMENT '创建时间',
`update_by` bigint(20) COMMENT '更新者',
`update_time` datetime COMMENT '更新时间',
`deleted` int(1) NOT NULL DEFAULT 0 COMMENT '删除标志(0代表存在 1代表删除)',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_tenant_indicator_code` (`tenant_id`, `indicator_code`),
KEY `idx_parent_id` (`parent_id`),
KEY `idx_indicator_type` (`indicator_type`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='班主任考核指标体系表';
-- ==========================================
-- 1. 班主任考核方案表
-- ==========================================
DROP TABLE IF EXISTS `bmzr_assessment_scheme`;
CREATE TABLE `bmzr_assessment_scheme` (
`id` bigint(20) NOT NULL COMMENT '主键ID',
`tenant_id` varchar(20) NOT NULL DEFAULT '000000' COMMENT '租户编号',
`scheme_name` varchar(100) NOT NULL COMMENT '方案名称',
`scheme_code` varchar(50) NOT NULL COMMENT '方案编码',
`academic_year` varchar(10) NOT NULL COMMENT '学年',
`semester` char(1) NOT NULL COMMENT '学期(1=上学期 2=下学期)',
`scheme_description` text COMMENT '方案描述',
`self_evaluation_required` char(1) NOT NULL DEFAULT '1' COMMENT '是否需要自评(0=否 1=是)',
`superior_evaluation_required` char(1) NOT NULL DEFAULT '1' COMMENT '是否需要上级评(0=否 1=是)',
`status` char(1) NOT NULL DEFAULT '0' COMMENT '状态(0正常 1停用)',
`remark` varchar(500) COMMENT '备注',
`create_dept` bigint(20) COMMENT '创建部门',
`create_by` bigint(20) COMMENT '创建者',
`create_time` datetime COMMENT '创建时间',
`update_by` bigint(20) COMMENT '更新者',
`update_time` datetime COMMENT '更新时间',
`deleted` int(1) NOT NULL DEFAULT 0 COMMENT '删除标志(0代表存在 1代表删除)',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_tenant_scheme_code` (`tenant_id`, `scheme_code`),
KEY `idx_academic_year_semester` (`academic_year`, `semester`),
KEY `idx_create_time` (`create_time`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='班主任考核方案表';
-- ==========================================
-- 3. 班主任考核方案指标关联表
-- ==========================================
DROP TABLE IF EXISTS `bmzr_assessment_scheme_indicator`;
CREATE TABLE `bmzr_assessment_scheme_indicator` (
`id` bigint(20) NOT NULL COMMENT '主键ID',
`tenant_id` varchar(20) NOT NULL DEFAULT '000000' COMMENT '租户编号',
`scheme_id` bigint(20) NOT NULL COMMENT '考核方案ID',
`indicator_id` bigint(20) NOT NULL COMMENT '考核指标ID',
`weight_ratio` decimal(5,4) NOT NULL DEFAULT 0.0000 COMMENT '在方案中的权重比例',
`custom_max_score` decimal(5,2) COMMENT '自定义最高分值',
`sort_order` int(4) NOT NULL DEFAULT 1 COMMENT '排序',
`remark` varchar(500) COMMENT '备注',
`create_dept` bigint(20) COMMENT '创建部门',
`create_by` bigint(20) COMMENT '创建者',
`create_time` datetime COMMENT '创建时间',
`update_by` bigint(20) COMMENT '更新者',
`update_time` datetime COMMENT '更新时间',
`deleted` int(1) NOT NULL DEFAULT 0 COMMENT '删除标志(0代表存在 1代表删除)',
PRIMARY KEY (`id`),
KEY `uk_scheme_indicator` (`scheme_id`, `indicator_id`),
KEY `idx_scheme_id` (`scheme_id`),
KEY `idx_indicator_id` (`indicator_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='班主任考核方案指标关联表';
-- ==========================================
-- 4. 班主任考核计划表
-- ==========================================
DROP TABLE IF EXISTS `bmzr_assessment_plan`;
CREATE TABLE `bmzr_assessment_plan` (
`id` bigint(20) NOT NULL COMMENT '主键ID',
`tenant_id` varchar(20) NOT NULL DEFAULT '000000' COMMENT '租户编号',
`plan_name` varchar(100) NOT NULL COMMENT '计划名称',
`plan_code` varchar(50) NOT NULL COMMENT '计划编码',
`scheme_id` bigint(20) NOT NULL COMMENT '考核方案ID',
`academic_year` varchar(10) NOT NULL COMMENT '学年',
`semester` char(1) NOT NULL COMMENT '学期(1=上学期 2=下学期)',
`plan_start_time` datetime NOT NULL COMMENT '计划开始时间',
`plan_end_time` datetime NOT NULL COMMENT '计划结束时间',
`data_extract_start_time` datetime COMMENT '数据提取开始时间',
`data_extract_end_time` datetime COMMENT '数据提取结束时间',
`plan_status` char(1) NOT NULL DEFAULT '1' COMMENT '计划状态(0=禁用 1=启用 )',
`description` text COMMENT '计划描述',
`remark` varchar(500) COMMENT '备注',
`create_dept` bigint(20) COMMENT '创建部门',
`create_by` bigint(20) COMMENT '创建者',
`create_time` datetime COMMENT '创建时间',
`update_by` bigint(20) COMMENT '更新者',
`update_time` datetime COMMENT '更新时间',
`deleted` int(1) NOT NULL DEFAULT 0 COMMENT '删除标志(0代表存在 1代表删除)',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_tenant_plan_code` (`tenant_id`, `plan_code`),
KEY `idx_scheme_id` (`scheme_id`),
KEY `idx_academic_year_semester` (`academic_year`, `semester`),
KEY `idx_plan_status` (`plan_status`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='班主任考核计划表';
-- ==========================================
-- 5. 班主任考核得分表
-- ==========================================
DROP TABLE IF EXISTS `bmzr_assessment_score`;
CREATE TABLE `bmzr_assessment_score` (
`id` bigint(20) NOT NULL COMMENT '主键ID',
`tenant_id` varchar(20) NOT NULL DEFAULT '000000' COMMENT '租户编号',
`plan_id` bigint(20) NOT NULL COMMENT '考核计划ID',
`scheme_id` bigint(20) NOT NULL COMMENT '考核方案ID',
`indicator_id` bigint(20) NOT NULL COMMENT '考核指标ID',
`evaluated_user_id` bigint(20) NOT NULL COMMENT '被评价用户ID',
`evaluated_user_name` varchar(50) NOT NULL COMMENT '被评价用户姓名',
`evaluated_dept_id` bigint(20) COMMENT '被评价用户部门ID',
`self_score` decimal(5,2) COMMENT '自评分数',
`self_comment` text COMMENT '自评意见',
`self_submit_time` datetime COMMENT '自评提交时间',
`superior_score` decimal(5,2) COMMENT '上级评分数',
`superior_comment` text COMMENT '上级评意见',
`superior_evaluator_id` bigint(20) COMMENT '上级评价人ID',
`superior_submit_time` datetime COMMENT '上级评提交时间',
`evaluation_level` varchar(20) COMMENT '评价等级 dict_type = bmzr_evaluation_level',
`audit_status` char(1) NOT NULL DEFAULT '0' COMMENT '审核状态(0=待审核 1=审核通过 2=审核不通过)',
`final_score` decimal(5,2) COMMENT '最终得分',
`submit_time` datetime COMMENT '提交时间',
`remark` varchar(500) COMMENT '备注',
`create_dept` bigint(20) COMMENT '创建部门',
`create_by` bigint(20) COMMENT '创建者',
`create_time` datetime COMMENT '创建时间',
`update_by` bigint(20) COMMENT '更新者',
`update_time` datetime COMMENT '更新时间',
`deleted` int(1) NOT NULL DEFAULT 0 COMMENT '删除标志(0代表存在 1代表删除)',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_plan_indicator_user` (`plan_id`, `indicator_id`, `evaluated_user_id`),
KEY `idx_plan_id` (`plan_id`),
KEY `idx_scheme_id` (`scheme_id`),
KEY `idx_indicator_id` (`indicator_id`),
KEY `idx_evaluated_user_id` (`evaluated_user_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='班主任考核得分表';
-- ==========================================
-- 6. 班主任考核指标与违纪处分奖励关联关系表
-- ==========================================
DROP TABLE IF EXISTS `bmzr_assessment_indicator_discipline_reward`;
CREATE TABLE `bmzr_assessment_indicator_discipline_reward` (
`id` bigint(20) NOT NULL COMMENT '主键ID',
`tenant_id` varchar(20) NOT NULL DEFAULT '000000' COMMENT '租户编号',
`indicator_id` bigint(20) NOT NULL COMMENT '考核指标ID',
`discipline_type_ids` varchar(500) NOT NULL COMMENT '违纪处分类型ID,逗号分隔',
`reward_type_ids` varchar(500) NOT NULL COMMENT '奖励类型ID,逗号分隔',
`remark` varchar(500) COMMENT '备注',
`create_dept` bigint(20) COMMENT '创建部门',
`create_by` bigint(20) COMMENT '创建者',
`create_time` datetime COMMENT '创建时间',
`update_by` bigint(20) COMMENT '更新者',
`update_time` datetime COMMENT '更新时间',
`deleted` int(1) NOT NULL DEFAULT 0 COMMENT '删除标志(0代表存在 1代表删除)',
PRIMARY KEY (`id`),
KEY `idx_indicator_id` (`indicator_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='班主任考核指标与违纪处分奖励关联关系表';
@@ -0,0 +1,54 @@
-- ==========================================
-- 班主任考核管理系统字典数据(MySQL版)
-- 版本:V1.0.0
-- 功能:班主任考核管理相关字典数据
-- 作者:系统设计
-- 时间:2025-01-08
-- 模块:学工管理-班主任考核管理字典数据
-- ==========================================
-- ==========================================
-- ==========================================
-- 2. 指标类型字典
-- ==========================================
-- 删除已存在的字典类型
DELETE FROM sys_dict_type WHERE dict_type = 'bmzr_indicator_type';
-- 插入字典类型
INSERT INTO sys_dict_type (tenant_id, dict_name, dict_type, status, create_dept, create_by, create_time, remark)
VALUES ('000000', '考核指标类型', 'bmzr_indicator_type', '0', 103, 1, NOW(), '班主任考核-指标类型');
-- 删除已存在的字典数据
DELETE FROM sys_dict_data WHERE dict_type = 'bmzr_indicator_type';
-- 插入字典数据
INSERT INTO sys_dict_data (tenant_id, dict_sort, dict_label, dict_value, dict_type, css_class, list_class, is_default, status, create_dept, create_by, create_time, remark) VALUES
('000000', 1, '班级管理', '班级管理', 'bmzr_indicator_type', '', 'primary', 'Y', '0', 103, 1, NOW(), '班级日常管理工作'),
('000000', 2, '学生教育', '学生教育', 'bmzr_indicator_type', '', 'success', 'N', '0', 103, 1, NOW(), '学生思想教育工作'),
('000000', 3, '学业指导', '学业指导', 'bmzr_indicator_type', '', 'info', 'N', '0', 103, 1, NOW(), '学生学业指导工作'),
('000000', 4, '心理健康', '心理健康', 'bmzr_indicator_type', '', 'warning', 'N', '0', 103, 1, NOW(), '学生心理健康工作'),
('000000', 5, '安全管理', '安全管理', 'bmzr_indicator_type', '', 'danger', 'N', '0', 103, 1, NOW(), '班级安全管理工作'),
('000000', 6, '家校沟通', '家校沟通', 'bmzr_indicator_type', '', 'primary', 'N', '0', 103, 1, NOW(), '家校联系沟通工作'),
('000000', 7, '活动组织', '活动组织', 'bmzr_indicator_type', '', 'info', 'N', '0', 103, 1, NOW(), '班级活动组织工作'),
('000000', 8, '班级建设', '班级建设', 'bmzr_indicator_type', '', 'success', 'N', '0', 103, 1, NOW(), '班级文化建设工作');
-- ==========================================
-- 7. 评价等级字典
-- ==========================================
-- 删除已存在的字典类型
DELETE FROM sys_dict_type WHERE dict_type = 'bmzr_evaluation_level';
-- 插入字典类型
INSERT INTO sys_dict_type (tenant_id, dict_name, dict_type, status, create_dept, create_by, create_time, remark)
VALUES ('000000', '评价等级', 'bmzr_evaluation_level', '0', 103, 1, NOW(), '班主任考核-评价等级');
-- 删除已存在的字典数据
DELETE FROM sys_dict_data WHERE dict_type = 'bmzr_evaluation_level';
-- 插入字典数据
INSERT INTO sys_dict_data (tenant_id, dict_sort, dict_label, dict_value, dict_type, css_class, list_class, is_default, status, create_dept, create_by, create_time, remark) VALUES
('000000', 1, '优秀', 'excellent', 'bmzr_evaluation_level', '', 'success', 'Y', '0', 103, 1, NOW(), '优秀等级(90-100分)'),
('000000', 2, '良好', 'good', 'bmzr_evaluation_level', '', 'primary', 'N', '0', 103, 1, NOW(), '良好等级(80-89分)'),
('000000', 3, '合格', 'qualified', 'bmzr_evaluation_level', '', 'info', 'N', '0', 103, 1, NOW(), '合格等级(70-79分)'),
('000000', 4, '基本合格', 'basic', 'bmzr_evaluation_level', '', 'warning', 'N', '0', 103, 1, NOW(), '基本合格等级(60-69分)'),
('000000', 5, '不合格', 'unqualified', 'bmzr_evaluation_level', '', 'danger', 'N', '0', 103, 1, NOW(), '不合格等级(60分以下)');
-- ==========================================
@@ -0,0 +1,87 @@
import request from '@/utils/request';
import { AssessmentIndicatorVO, AssessmentIndicatorQuery, AssessmentIndicatorForm } from './types';
/**
* 查询班主任考核指标体系列表
* @param query 查询条件
* @returns
*/
export function listBmzrAssessmentIndicator(query?: AssessmentIndicatorQuery) {
return request({
url: '/bzrkh/assessmentIndicator/list',
method: 'get',
params: query
});
}
/**
* 查询班主任考核指标体系详细
* @param id 主键
* @returns
*/
export function getBmzrAssessmentIndicator(id: string | number) {
return request({
url: `/bzrkh/assessmentIndicator/${id}`,
method: 'get'
});
}
/**
* 新增班主任考核指标体系
* @param data 表单数据
* @returns
*/
export function addBmzrAssessmentIndicator(data: AssessmentIndicatorForm) {
return request({
url: '/bzrkh/assessmentIndicator',
method: 'post',
data: data
});
}
/**
* 修改班主任考核指标体系
* @param data 表单数据
* @returns
*/
export function updateBmzrAssessmentIndicator(data: AssessmentIndicatorForm) {
return request({
url: '/bzrkh/assessmentIndicator',
method: 'put',
data: data
});
}
/**
* 删除班主任考核指标体系
* @param ids 主键串
* @returns
*/
export function delBmzrAssessmentIndicator(ids: string | number | Array<string | number>) {
return request({
url: `/bzrkh/assessmentIndicator/${ids}`,
method: 'delete'
});
}
/**
* 获取指标类型选项
* @returns
*/
export function getIndicatorTypeOptions() {
return request({
url: '/bzrkh/assessmentIndicator/indicatorTypes/options',
method: 'get'
});
}
/**
* 获取父级指标选项
* @returns
*/
export function getParentIndicatorOptions() {
return request({
url: '/bzrkh/assessmentIndicator/parentIndicators/options',
method: 'get'
});
}
@@ -0,0 +1,237 @@
export interface AssessmentIndicatorVO {
/**
* 主键ID
*/
id: string | number;
/**
* 租户编号
*/
tenantId?: string;
/**
* 指标名称
*/
indicatorName?: string;
/**
* 指标编码
*/
indicatorCode?: string;
/**
* 指标类型
*/
indicatorType?: string;
/**
* 父级指标ID
*/
parentId?: string | number;
/**
* 排序
*/
sortOrder?: number;
/**
* 权重比例(0-1之间)
*/
weightRatio?: number;
/**
* 最高分值
*/
maxScore?: number;
/**
* 分值
*/
score?: number;
/**
* 允许自评(0=否 1=是)
*/
allowSelfEvaluation?: string;
/**
* 允许上级评(0=否 1=是)
*/
allowSuperiorEvaluation?: string;
/**
* 状态(0正常 1停用)
*/
status?: string;
/**
* 备注
*/
remark?: string;
/**
* 创建部门
*/
createDept?: string | number;
/**
* 创建者
*/
createBy?: string | number;
/**
* 创建时间
*/
createTime?: string;
/**
* 更新者
*/
updateBy?: string | number;
/**
* 更新时间
*/
updateTime?: string;
/**
* 删除标志(0代表存在 1代表删除)
*/
deleted?: number;
}
export interface AssessmentIndicatorForm {
/**
* 主键ID
*/
id?: string | number;
/**
* 租户编号
*/
tenantId?: string;
/**
* 指标名称
*/
indicatorName?: string;
/**
* 指标编码
*/
indicatorCode?: string;
/**
* 指标类型
*/
indicatorType?: string;
/**
* 父级指标ID
*/
parentId?: string | number;
/**
* 排序
*/
sortOrder?: number;
/**
* 权重比例(0-1之间)
*/
weightRatio?: number;
/**
* 最高分值
*/
maxScore?: number;
/**
* 分值
*/
score?: number;
/**
* 允许自评(0=否 1=是)
*/
allowSelfEvaluation?: string;
/**
* 允许上级评(0=否 1=是)
*/
allowSuperiorEvaluation?: string;
/**
* 状态(0正常 1停用)
*/
status?: string;
/**
* 备注
*/
remark?: string;
}
export interface AssessmentIndicatorQuery extends PageQuery {
/**
* 指标名称
*/
indicatorName?: string;
/**
* 指标编码
*/
indicatorCode?: string;
/**
* 指标类型
*/
indicatorType?: string;
/**
* 父级指标ID
*/
parentId?: string | number;
/**
* 允许自评(0=否 1=是)
*/
allowSelfEvaluation?: string;
/**
* 允许上级评(0=否 1=是)
*/
allowSuperiorEvaluation?: string;
/**
* 状态(0正常 1停用)
*/
status?: string;
/**
* 日期范围参数
*/
params?: any;
}
export interface AssessmentIndicatorTypeOption {
/**
* 主键ID
*/
id: string | number;
/**
* 指标类型名称
*/
indicatorTypeName: string;
/**
* 指标类型编码
*/
indicatorTypeCode: string;
/**
* 状态(0正常 1停用)
*/
status?: string;
}
@@ -0,0 +1,75 @@
import request from '@/utils/request';
import { AxiosPromise } from 'axios';
import { AssessmentIndicatorTypeVO, AssessmentIndicatorTypeForm, AssessmentIndicatorTypeQuery } from '@/api/bzrkh/assessmentIndicatorType/types';
/**
* 查询班主任考核指标类型列表
* @param query
* @returns {*}
*/
export const listAssessmentIndicatorType = (query?: AssessmentIndicatorTypeQuery): AxiosPromise<AssessmentIndicatorTypeVO[]> => {
return request({
url: '/bzrkh/assessmentIndicatorType/list',
method: 'get',
params: query
});
};
/**
* 查询所有班主任考核指标类型列表(包括已逻辑删除的)
* @param query
* @returns {*}
*/
export const listAllAssessmentIndicatorType = (query?: AssessmentIndicatorTypeQuery): AxiosPromise<AssessmentIndicatorTypeVO[]> => {
return request({
url: '/bzrkh/assessmentIndicatorType/listAllIncludeDeleted',
method: 'get',
params: query
});
};
/**
* 查询班主任考核指标类型详细
* @param id
*/
export const getAssessmentIndicatorType = (id: string | number): AxiosPromise<AssessmentIndicatorTypeVO> => {
return request({
url: '/bzrkh/assessmentIndicatorType/' + id,
method: 'get'
});
};
/**
* 新增班主任考核指标类型
* @param data
*/
export const addAssessmentIndicatorType = (data: AssessmentIndicatorTypeForm) => {
return request({
url: '/bzrkh/assessmentIndicatorType',
method: 'post',
data: data
});
};
/**
* 修改班主任考核指标类型
* @param data
*/
export const updateAssessmentIndicatorType = (data: AssessmentIndicatorTypeForm) => {
return request({
url: '/bzrkh/assessmentIndicatorType',
method: 'put',
data: data
});
};
/**
* 删除班主任考核指标类型
* @param id
*/
export const delAssessmentIndicatorType = (id: string | number | Array<string | number>) => {
return request({
url: '/bzrkh/assessmentIndicatorType/' + id,
method: 'delete'
});
};
@@ -0,0 +1,110 @@
export interface AssessmentIndicatorTypeVO {
/**
* 主键ID
*/
id: string | number;
/**
* 删除标志
*/
deleted: number;
/**
* 指标类型名称
*/
indicatorTypeName: string;
/**
* 指标类型编码
*/
indicatorTypeCode: string;
/**
* 状态
*/
status: string;
/**
* 备注
*/
remark: string;
/**
* 创建者
*/
createBy: number;
/**
* 创建时间
*/
createTime: string;
/**
* 更新者
*/
updateBy: number;
/**
* 更新时间
*/
updateTime: string;
}
export interface AssessmentIndicatorTypeForm extends BaseEntity {
/**
* 主键ID
*/
id?: string | number;
/**
* 删除标志
*/
deleted?: number;
/**
* 指标类型名称
*/
indicatorTypeName?: string;
/**
* 指标类型编码
*/
indicatorTypeCode?: string;
/**
* 状态
*/
status?: string;
/**
* 备注
*/
remark?: string;
}
export interface AssessmentIndicatorTypeQuery extends PageQuery {
/**
* 删除标志
*/
deleted?: number;
/**
* 指标类型名称
*/
indicatorTypeName?: string;
/**
* 指标类型编码
*/
indicatorTypeCode?: string;
/**
* 状态
*/
status?: string;
/**
* 日期范围参数
*/
params?: any;
}
+100
View File
@@ -0,0 +1,100 @@
import request from '@/utils/request';
import { AxiosPromise } from 'axios';
import { AssessmentPlanVO, AssessmentPlanForm, AssessmentPlanQuery, AssessmentSchemeOption } from './types';
/**
* 查询班主任考核计划列表
* @param query
* @returns {*}
*/
export const listAssessmentPlan = (query?: AssessmentPlanQuery): AxiosPromise<AssessmentPlanVO[]> => {
return request({
url: '/bzrkh/assessmentPlan/list',
method: 'get',
params: query
});
};
/**
* 查询班主任考核计划详细
* @param id
*/
export const getAssessmentPlan = (id: string | number): AxiosPromise<AssessmentPlanVO> => {
return request({
url: '/bzrkh/assessmentPlan/' + id,
method: 'get'
});
};
/**
* 新增班主任考核计划
* @param data
*/
export const addAssessmentPlan = (data: AssessmentPlanForm) => {
return request({
url: '/bzrkh/assessmentPlan',
method: 'post',
data: data
});
};
/**
* 修改班主任考核计划
* @param data
*/
export const updateAssessmentPlan = (data: AssessmentPlanForm) => {
return request({
url: '/bzrkh/assessmentPlan',
method: 'put',
data: data
});
};
/**
* 删除班主任考核计划
* @param id
*/
export const delAssessmentPlan = (id: string | number | Array<string | number>) => {
return request({
url: '/bzrkh/assessmentPlan/' + id,
method: 'delete'
});
};
/**
* 导出班主任考核计划
* @param query
*/
export const exportAssessmentPlan = (query?: AssessmentPlanQuery) => {
return request({
url: '/bzrkh/assessmentPlan/export',
method: 'post',
data: query
});
};
/**
* 获取可用的考核方案选项
*/
export const getAvailableSchemes = (): AxiosPromise<AssessmentSchemeOption[]> => {
return request({
url: '/bzrkh/assessmentPlan/schemes/options',
method: 'get'
});
};
/**
* 启用/禁用考核计划
* @param id
* @param status
*/
export const changeAssessmentPlanStatus = (id: string | number, status: string) => {
return request({
url: '/bzrkh/assessmentPlan/changeStatus',
method: 'put',
data: {
id,
planStatus: status
}
});
};
+240
View File
@@ -0,0 +1,240 @@
export interface AssessmentPlanVO {
/**
* 主键ID
*/
id?: string | number;
/**
* 租户编号
*/
tenantId?: string;
/**
* 计划名称
*/
planName?: string;
/**
* 计划编码
*/
planCode?: string;
/**
* 考核方案ID
*/
schemeId?: string | number;
/**
* 考核方案名称
*/
schemeName?: string;
/**
* 学年
*/
academicYear?: string;
/**
* 学期(1=上学期 2=下学期)
*/
semester?: string;
/**
* 计划开始时间
*/
planStartTime?: string;
/**
* 计划结束时间
*/
planEndTime?: string;
/**
* 数据提取开始时间
*/
dataExtractStartTime?: string;
/**
* 数据提取结束时间
*/
dataExtractEndTime?: string;
/**
* 计划状态(0=禁用 1=启用)
*/
planStatus?: string;
/**
* 计划描述
*/
description?: string;
/**
* 备注
*/
remark?: string;
/**
* 创建部门
*/
createDept?: string | number;
/**
* 创建者
*/
createBy?: string | number;
/**
* 创建时间
*/
createTime?: string;
/**
* 更新者
*/
updateBy?: string | number;
/**
* 更新时间
*/
updateTime?: string;
}
export interface AssessmentPlanForm {
/**
* 主键ID
*/
id?: string | number;
/**
* 计划名称
*/
planName?: string;
/**
* 计划编码
*/
planCode?: string;
/**
* 考核方案ID
*/
schemeId?: string | number;
/**
* 学年
*/
academicYear?: string;
/**
* 学期(1=上学期 2=下学期)
*/
semester?: string;
/**
* 计划开始时间
*/
planStartTime?: string;
/**
* 计划结束时间
*/
planEndTime?: string;
/**
* 数据提取开始时间
*/
dataExtractStartTime?: string;
/**
* 数据提取结束时间
*/
dataExtractEndTime?: string;
/**
* 计划状态(0=禁用 1=启用)
*/
planStatus?: string;
/**
* 计划描述
*/
description?: string;
/**
* 备注
*/
remark?: string;
}
export interface AssessmentPlanQuery extends PageQuery {
/**
* 计划名称
*/
planName?: string;
/**
* 计划编码
*/
planCode?: string;
/**
* 考核方案ID
*/
schemeId?: string | number;
/**
* 学年
*/
academicYear?: string;
/**
* 学期(1=上学期 2=下学期)
*/
semester?: string;
/**
* 计划状态(0=禁用 1=启用)
*/
planStatus?: string;
/**
* 创建时间范围
*/
params?: {
'beginCreateTime'?: string;
'endCreateTime'?: string;
};
}
export interface AssessmentSchemeOption {
/**
* 方案ID
*/
id?: string | number;
/**
* 方案名称
*/
schemeName?: string;
/**
* 方案编码
*/
schemeCode?: string;
/**
* 学年
*/
academicYear?: string;
/**
* 学期
*/
semester?: string;
/**
* 状态
*/
status?: string;
}
@@ -0,0 +1,74 @@
import request from '@/utils/request';
import { AxiosPromise } from 'axios';
import { BmzrAssessmentSchemeVO, BmzrAssessmentSchemeForm, BmzrAssessmentSchemeQuery } from '@/api/bzrkh/assessmentScheme/types';
/**
* 查询班主任考核方案列表
* @param query
* @returns {*}
*/
export const listBmzrAssessmentScheme = (query?: BmzrAssessmentSchemeQuery) => {
return request({
url: '/bzrkh/assessmentScheme/list',
method: 'get',
params: query
});
};
/**
* 查询班主任考核方案详细
* @param id
*/
export const getBmzrAssessmentScheme = (id: string | number): AxiosPromise<BmzrAssessmentSchemeVO> => {
return request({
url: '/bzrkh/assessmentScheme/' + id,
method: 'get'
});
};
/**
* 新增班主任考核方案
* @param data
*/
export const addBmzrAssessmentScheme = (data: BmzrAssessmentSchemeForm) => {
return request({
url: '/bzrkh/assessmentScheme',
method: 'post',
data: data
});
};
/**
* 修改班主任考核方案
* @param data
*/
export const updateBmzrAssessmentScheme = (data: BmzrAssessmentSchemeForm) => {
return request({
url: '/bzrkh/assessmentScheme',
method: 'put',
data: data
});
};
/**
* 删除班主任考核方案
* @param id
*/
export const delBmzrAssessmentScheme = (id: string | number | Array<string | number>) => {
return request({
url: '/bzrkh/assessmentScheme/' + id,
method: 'delete'
});
};
/**
* 导出班主任考核方案
* @param query
*/
export const exportBmzrAssessmentScheme = (query?: BmzrAssessmentSchemeQuery): AxiosPromise<any> => {
return request({
url: '/bzrkh/assessmentScheme/export',
method: 'post',
data: query
});
};
+185
View File
@@ -0,0 +1,185 @@
export interface BmzrAssessmentSchemeVO {
/**
* 主键ID
*/
id: string | number;
/**
* 租户编号
*/
tenantId: string;
/**
* 方案名称
*/
schemeName: string;
/**
* 方案编码
*/
schemeCode: string;
/**
* 学年
*/
academicYear: string;
/**
* 学期
*/
semester: string;
/**
* 方案描述
*/
schemeDescription: string;
/**
* 是否需要自评
*/
selfEvaluationRequired: string;
/**
* 是否需要上级评
*/
superiorEvaluationRequired: string;
/**
* 状态
*/
status: string;
/**
* 备注
*/
remark: string;
/**
* 创建部门
*/
createDept: number;
/**
* 创建者
*/
createBy: number;
/**
* 创建时间
*/
createTime: string;
/**
* 更新者
*/
updateBy: number;
/**
* 更新时间
*/
updateTime: string;
/**
* 删除标志
*/
deleted: number;
}
export interface BmzrAssessmentSchemeForm {
/**
* 主键ID
*/
id?: string | number;
/**
* 租户编号
*/
tenantId?: string;
/**
* 方案名称
*/
schemeName?: string;
/**
* 方案编码
*/
schemeCode?: string;
/**
* 学年
*/
academicYear?: string;
/**
* 学期
*/
semester?: string;
/**
* 方案描述
*/
schemeDescription?: string;
/**
* 是否需要自评
*/
selfEvaluationRequired?: string;
/**
* 是否需要上级评
*/
superiorEvaluationRequired?: string;
/**
* 状态
*/
status?: string;
/**
* 备注
*/
remark?: string;
}
export interface BmzrAssessmentSchemeQuery extends PageQuery {
/**
* 方案名称
*/
schemeName?: string;
/**
* 方案编码
*/
schemeCode?: string;
/**
* 学年
*/
academicYear?: string;
/**
* 学期
*/
semester?: string;
/**
* 状态
*/
status?: string;
/**
* 是否需要自评
*/
selfEvaluationRequired?: string;
/**
* 是否需要上级评
*/
superiorEvaluationRequired?: string;
/**
* 参数
*/
params?: any;
}
@@ -0,0 +1,91 @@
import request from '@/utils/request';
import { BmzrAssessmentSchemeIndicatorVO, BmzrAssessmentSchemeIndicatorQuery, BmzrAssessmentSchemeIndicatorForm } from './types';
/**
* 查询班主任考核方案指标关联列表
* @param query 查询条件
* @returns
*/
export function listBmzrAssessmentSchemeIndicator(query?: BmzrAssessmentSchemeIndicatorQuery) {
return request({
url: '/bzrkh/assessmentSchemeIndicator/list',
method: 'get',
params: query
});
}
/**
* 根据方案ID查询指标关联列表
* @param schemeId 方案ID
* @returns
*/
export function listBySchemeId(schemeId: string | number) {
return request({
url: `/bzrkh/assessmentSchemeIndicator/listBySchemeId/${schemeId}`,
method: 'get'
});
}
/**
* 查询班主任考核方案指标关联详细
* @param id 主键
* @returns
*/
export function getBmzrAssessmentSchemeIndicator(id: string | number) {
return request({
url: `/bzrkh/assessmentSchemeIndicator/${id}`,
method: 'get'
});
}
/**
* 新增班主任考核方案指标关联
* @param data 表单数据
* @returns
*/
export function addBmzrAssessmentSchemeIndicator(data: BmzrAssessmentSchemeIndicatorForm) {
return request({
url: '/bzrkh/assessmentSchemeIndicator',
method: 'post',
data: data
});
}
/**
* 修改班主任考核方案指标关联
* @param data 表单数据
* @returns
*/
export function updateBmzrAssessmentSchemeIndicator(data: BmzrAssessmentSchemeIndicatorForm) {
return request({
url: '/bzrkh/assessmentSchemeIndicator',
method: 'put',
data: data
});
}
/**
* 删除班主任考核方案指标关联
* @param ids 主键串
* @returns
*/
export function delBmzrAssessmentSchemeIndicator(ids: string | number | Array<string | number>) {
return request({
url: `/bzrkh/assessmentSchemeIndicator/${ids}`,
method: 'delete'
});
}
/**
* 批量保存方案指标关联
* @param schemeId 方案ID
* @param indicatorList 指标列表
* @returns
*/
export function batchSaveSchemeIndicators(schemeId: string | number, indicatorList: BmzrAssessmentSchemeIndicatorForm[]) {
return request({
url: `/bzrkh/assessmentSchemeIndicator/batchSave/${schemeId}`,
method: 'post',
data: indicatorList
});
}
@@ -0,0 +1,150 @@
export interface BmzrAssessmentSchemeIndicatorVO {
/**
* 主键ID
*/
id: string | number;
/**
* 租户编号
*/
tenantId: string;
/**
* 考核方案ID
*/
schemeId: string | number;
/**
* 考核指标ID
*/
indicatorId: string | number;
/**
* 指标名称
*/
indicatorName: string;
/**
* 指标编码
*/
indicatorCode: string;
/**
* 在方案中的权重比例
*/
weightRatio: number;
/**
* 自定义最高分值
*/
customMaxScore: number;
/**
* 分值
*/
score: number;
/**
* 排序
*/
sortOrder: number;
/**
* 备注
*/
remark: string;
/**
* 创建者
*/
createBy: number;
/**
* 创建时间
*/
createTime: string;
/**
* 更新者
*/
updateBy: number;
/**
* 更新时间
*/
updateTime: string;
/**
* 删除标志
*/
deleted: number;
}
export interface BmzrAssessmentSchemeIndicatorForm {
/**
* 主键ID
*/
id?: string | number;
/**
* 考核方案ID
*/
schemeId?: string | number;
/**
* 考核指标ID
*/
indicatorId?: string | number;
/**
* 在方案中的权重比例
*/
weightRatio?: number;
/**
* 自定义最高分值
*/
customMaxScore?: number;
/**
* 分值
*/
score?: number;
/**
* 排序
*/
sortOrder?: number;
/**
* 备注
*/
remark?: string;
}
export interface BmzrAssessmentSchemeIndicatorQuery extends PageQuery {
/**
* 考核方案ID
*/
schemeId?: string | number;
/**
* 考核指标ID
*/
indicatorId?: string | number;
/**
* 指标名称
*/
indicatorName?: string;
/**
* 排序
*/
sortOrder?: number;
/**
* 参数
*/
params?: any;
}
@@ -0,0 +1,61 @@
import request from '@/utils/request';
import { AxiosPromise } from 'axios';
import { TeacherClassVO, TeacherAssessmentPlanVO, TeacherAssessmentPlanQuery, TeacherClassQuery } from './types';
/**
* 查询班主任管理的班级列表
* @param query
* @returns {*}
*/
export const listTeacherClasses = (query?: TeacherClassQuery): AxiosPromise<TeacherClassVO[]> => {
return request({
url: '/bzrkh/teacherAssessment/classes',
method: 'get',
params: query
});
};
/**
* 查询班主任考核计划列表(按班级)
* @param query
* @returns {*}
*/
export const listTeacherAssessmentPlans = (query?: TeacherAssessmentPlanQuery): AxiosPromise<TeacherAssessmentPlanVO[]> => {
return request({
url: '/bzrkh/assessmentPlan/list',
method: 'get',
params: query
});
};
/**
* 提交考核
* @param planId 计划ID
* @param classId 班级ID
*/
export const submitAssessment = (planId: string | number, classId: string | number): AxiosPromise<void> => {
return request({
url: '/bzrkh/teacherAssessment/submit',
method: 'post',
data: {
planId,
classId
}
});
};
/**
* 查看考核详情
* @param planId 计划ID
* @param classId 班级ID
*/
export const getAssessmentDetail = (planId: string | number, classId: string | number): AxiosPromise<any> => {
return request({
url: '/bzrkh/teacherAssessment/detail',
method: 'get',
params: {
planId,
classId
}
});
};
@@ -0,0 +1,207 @@
export interface TeacherClassVO {
/**
* 班级ID
*/
id?: string | number;
/**
* 班级代码
*/
classCode?: string;
/**
* 班级名称
*/
className?: string;
/**
* 班主任ID
*/
classTeacherId?: string | number;
/**
* 班主任姓名
*/
classTeacherName?: string;
/**
* 年级
*/
grade?: string;
/**
* 学院ID
*/
collegeId?: string | number;
/**
* 学院名称
*/
collegeName?: string;
/**
* 专业ID
*/
majorId?: string | number;
/**
* 专业名称
*/
majorName?: string;
/**
* 班级状态:1-正常,2-暂停,3-毕业,4-解散
*/
classStatus?: string;
/**
* 当前学生人数
*/
currentStudentCount?: number;
}
export interface TeacherAssessmentPlanVO {
/**
* 主键ID
*/
id?: string | number;
/**
* 计划名称
*/
planName?: string;
/**
* 计划编码
*/
planCode?: string;
/**
* 考核方案ID
*/
schemeId?: string | number;
/**
* 考核方案名称
*/
schemeName?: string;
/**
* 学年
*/
academicYear?: string;
/**
* 学期(1=上学期 2=下学期)
*/
semester?: string;
/**
* 计划开始时间
*/
planStartTime?: string;
/**
* 计划结束时间
*/
planEndTime?: string;
/**
* 数据提取开始时间
*/
dataExtractStartTime?: string;
/**
* 数据提取结束时间
*/
dataExtractEndTime?: string;
/**
* 计划状态(0=禁用 1=启用)
*/
planStatus?: string;
/**
* 计划描述
*/
description?: string;
/**
* 创建时间
*/
createTime?: string;
/**
* 备注
*/
remark?: string;
}
export interface TeacherAssessmentPlanQuery {
/**
* 计划名称
*/
planName?: string;
/**
* 班级ID
*/
classId?: string | number;
/**
* 班主任ID
*/
teacherId?: string | number;
/**
* 学年
*/
academicYear?: string;
/**
* 学期(1=上学期 2=下学期)
*/
semester?: string;
/**
* 计划状态(0=禁用 1=启用)
*/
planStatus?: string;
/**
* 页码
*/
pageNum?: number;
/**
* 每页大小
*/
pageSize?: number;
/**
* 排序字段
*/
orderByColumn?: string;
/**
* 排序方向
*/
isAsc?: string;
/**
* 其他参数
*/
params?: Record<string, any>;
}
export interface TeacherClassQuery {
/**
* 班主任ID
*/
teacherId?: string | number;
/**
* 班级状态:1-正常,2-暂停,3-毕业,4-解散
*/
classStatus?: string;
}
@@ -0,0 +1,403 @@
<template>
<div class="p-2 page-container">
<transition :enter-active-class="proxy?.animate.searchAnimate.enter" :leave-active-class="proxy?.animate.searchAnimate.leave">
<div v-show="showSearch" class="mb-[10px]">
<el-card shadow="hover">
<el-form ref="queryFormRef" :model="queryParams" label-width="100px">
<el-row :gutter="20">
<el-col :lg="6" :md="12" :sm="24">
<el-form-item label="指标名称" prop="indicatorName">
<el-input v-model="queryParams.indicatorName" placeholder="请输入指标名称" clearable @keyup.enter="handleQuery" />
</el-form-item>
</el-col>
<el-col :lg="6" :md="12" :sm="24">
<el-form-item label="指标编码" prop="indicatorCode">
<el-input v-model="queryParams.indicatorCode" placeholder="请输入指标编码" clearable @keyup.enter="handleQuery" />
</el-form-item>
</el-col>
<el-col :lg="6" :md="12" :sm="24">
<el-form-item label="指标类型" prop="indicatorType">
<el-select v-model="queryParams.indicatorType" placeholder="请选择指标类型" clearable style="width: 100%">
<el-option v-for="item in indicatorTypeOptions" :key="item.id" :label="item.indicatorTypeName" :value="item.indicatorTypeCode" />
</el-select>
</el-form-item>
</el-col>
<el-col :lg="6" :md="24" :sm="24">
<el-form-item>
<el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
<el-button icon="Refresh" @click="resetQuery">重置</el-button>
</el-form-item>
</el-col>
</el-row>
</el-form>
</el-card>
</div>
</transition>
<el-card shadow="never" class="button-card table-card">
<template #header>
<el-row :gutter="10" class="mb8">
<el-col :span="1.5">
<el-button type="primary" icon="Plus" @click="handleAdd" v-hasPermi="['bzrkh:assessmentIndicator:add']">新增</el-button>
</el-col>
<el-col :span="1.5">
<el-button
icon="Edit"
:disabled="single"
@click="handleUpdate()"
v-hasPermi="['bzrkh:assessmentIndicator:edit']"
>
修改
</el-button>
</el-col>
<el-col :span="1.5">
<el-button
icon="Delete"
:disabled="multiple"
@click="handleDelete()"
v-hasPermi="['bzrkh:assessmentIndicator:remove']"
>
删除
</el-button>
</el-col>
<right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
</el-row>
</template>
<div class="table-container">
<el-table
v-loading="loading"
border
:data="assessmentIndicatorList"
@selection-change="handleSelectionChange"
>
<el-table-column type="selection" width="55" align="center" />
<el-table-column label="指标编码" align="center" prop="indicatorCode" width="140" show-overflow-tooltip />
<el-table-column label="指标名称" align="center" prop="indicatorName" min-width="180" show-overflow-tooltip />
<el-table-column label="指标类型" align="center" prop="indicatorType" width="120">
<template #default="scope">
{{ getIndicatorTypeName(scope.row.indicatorType) }}
</template>
</el-table-column>
<el-table-column label="最高分值" align="center" prop="maxScore" width="100" />
<el-table-column label="分值" align="center" prop="score" width="80" />
<el-table-column label="排序" align="center" prop="sortOrder" width="80" />
<el-table-column label="状态" align="center" prop="status" width="80">
<template #default="scope">
<dict-tag :options="sys_item_enable" :value="scope.row.status" />
</template>
</el-table-column>
<el-table-column label="操作" align="center" width="120" class-name="small-padding fixed-width">
<template #default="scope">
<el-tooltip content="修改" placement="top">
<el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['bzrkh:assessmentIndicator:edit']"></el-button>
</el-tooltip>
<el-tooltip content="删除" placement="top">
<el-button link type="danger" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['bzrkh:assessmentIndicator:remove']"></el-button>
</el-tooltip>
</template>
</el-table-column>
</el-table>
</div>
<div class="pagination-container">
<pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" @pagination="getList" />
</div>
</el-card>
<!-- 添加或修改班主任考核指标体系对话框 -->
<el-dialog :title="dialog.title" v-model="dialog.visible" width="600px" append-to-body>
<el-form ref="assessmentIndicatorFormRef" :model="form" :rules="rules" label-width="120px">
<el-row>
<el-col :span="12">
<el-form-item label="指标编码" prop="indicatorCode">
<el-input v-model="form.indicatorCode" placeholder="请输入指标编码" style="width: 100%" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="指标名称" prop="indicatorName">
<el-input v-model="form.indicatorName" placeholder="请输入指标名称" style="width: 100%" />
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<el-form-item label="指标类型" prop="indicatorType">
<el-select v-model="form.indicatorType" placeholder="请选择指标类型" style="width: 100%">
<el-option v-for="item in indicatorTypeOptions" :key="item.id" :label="item.indicatorTypeName" :value="item.indicatorTypeCode" />
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="状态" prop="status">
<el-select v-model="form.status" placeholder="请选择状态" style="width: 100%">
<el-option v-for="dict in sys_item_enable" :key="dict.value" :label="dict.label" :value="dict.value" />
</el-select>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<el-form-item label="最高分值" prop="maxScore">
<el-input v-model="form.maxScore" placeholder="请输入最高分值" style="width: 100%" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="分值" prop="score">
<el-input v-model="form.score" placeholder="请输入分值" style="width: 100%" />
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<el-form-item label="排序" prop="sortOrder">
<el-input v-model="form.sortOrder" placeholder="请输入排序" style="width: 100%" />
</el-form-item>
</el-col>
</el-row>
<el-form-item label="备注" prop="remark">
<el-input v-model="form.remark" type="textarea" resize="none" :autosize="{ minRows: 3, maxRows: 6 }" placeholder="请输入内容" />
</el-form-item>
</el-form>
<template #footer>
<div class="dialog-footer">
<el-button :loading="buttonLoading" type="primary" @click="submitForm">确 定</el-button>
<el-button @click="cancel">取 消</el-button>
</div>
</template>
</el-dialog>
</div>
</template>
<script setup name="AssessmentIndicator" lang="ts">
import { listBmzrAssessmentIndicator, getBmzrAssessmentIndicator, delBmzrAssessmentIndicator, addBmzrAssessmentIndicator, updateBmzrAssessmentIndicator, getIndicatorTypeOptions, getParentIndicatorOptions } from '@/api/bzrkh/assessmentIndicator';
import { AssessmentIndicatorVO, AssessmentIndicatorQuery, AssessmentIndicatorForm, AssessmentIndicatorTypeOption } from '@/api/bzrkh/assessmentIndicator/types';
const { proxy } = getCurrentInstance() as ComponentInternalInstance;
const { sys_item_enable, sys_yes_no } = toRefs<any>(proxy?.useDict('sys_item_enable', 'sys_yes_no'));
const assessmentIndicatorList = ref<AssessmentIndicatorVO[]>([]);
const buttonLoading = ref(false);
const loading = ref(true);
const showSearch = ref(true);
const ids = ref<Array<string | number>>([]);
const single = ref(true);
const multiple = ref(true);
const total = ref(0);
const indicatorTypeOptions = ref<AssessmentIndicatorTypeOption[]>([]);
const parentIndicatorOptions = ref<any[]>([]);
const queryFormRef = ref<ElFormInstance>();
const assessmentIndicatorFormRef = ref<ElFormInstance>();
const dialog = reactive<DialogOption>({
visible: false,
title: ''
});
const initFormData: AssessmentIndicatorForm = {
id: undefined,
indicatorName: undefined,
indicatorCode: undefined,
indicatorType: undefined,
parentId: 0,
sortOrder: 1,
weightRatio: 0,
maxScore: 100,
score: 0,
allowSelfEvaluation: '1',
allowSuperiorEvaluation: '1',
status: '0',
remark: undefined
};
const data = reactive<PageData<AssessmentIndicatorForm, AssessmentIndicatorQuery>>({
form: { ...initFormData },
queryParams: {
pageNum: 1,
pageSize: 10,
indicatorName: undefined,
indicatorCode: undefined,
indicatorType: undefined,
parentId: undefined,
params: {}
},
rules: {
indicatorName: [{ required: true, message: '指标名称不能为空', trigger: 'blur' }],
indicatorCode: [{ required: true, message: '指标编码不能为空', trigger: 'blur' }],
indicatorType: [{ required: true, message: '指标类型不能为空', trigger: 'change' }],
status: [{ required: true, message: '状态不能为空', trigger: 'change' }]
}
});
const { queryParams, form, rules } = toRefs(data);
/** 获取指标类型名称 */
const getIndicatorTypeName = (code: string) => {
const option = indicatorTypeOptions.value.find(item => item.indicatorTypeCode === code);
return option ? option.indicatorTypeName : code;
};
/** 查询班主任考核指标体系列表 */
const getList = async () => {
loading.value = true;
const res = await listBmzrAssessmentIndicator(queryParams.value);
assessmentIndicatorList.value = res.rows;
total.value = res.total;
loading.value = false;
};
/** 查询指标类型选项 */
const getIndicatorTypeOptionsList = async () => {
try {
const res = await getIndicatorTypeOptions();
indicatorTypeOptions.value = res.data.filter((item: any) => item.status === '0');
} catch (error) {
console.error('获取指标类型选项失败:', error);
}
};
/** 查询父级指标选项 */
const getParentIndicatorOptionsList = async () => {
try {
const res = await getParentIndicatorOptions();
parentIndicatorOptions.value = res.data || [];
} catch (error) {
console.error('获取父级指标选项失败:', error);
}
};
/** 取消按钮 */
const cancel = () => {
reset();
dialog.visible = false;
};
/** 表单重置 */
const reset = () => {
form.value = { ...initFormData };
assessmentIndicatorFormRef.value?.resetFields();
};
/** 搜索按钮操作 */
const handleQuery = () => {
queryParams.value.pageNum = 1;
getList();
};
/** 重置按钮操作 */
const resetQuery = () => {
queryFormRef.value?.resetFields();
handleQuery();
};
/** 多选框选中数据 */
const handleSelectionChange = (selection: AssessmentIndicatorVO[]) => {
ids.value = selection.map((item) => item.id);
single.value = selection.length != 1;
multiple.value = !selection.length;
};
/** 新增按钮操作 */
const handleAdd = () => {
reset();
getParentIndicatorOptionsList();
dialog.visible = true;
dialog.title = '添加班主任考核指标体系';
};
/** 修改按钮操作 */
const handleUpdate = async (row?: AssessmentIndicatorVO) => {
reset();
await getParentIndicatorOptionsList();
const _id = row?.id || ids.value[0];
const res = await getBmzrAssessmentIndicator(_id);
Object.assign(form.value, res.data);
dialog.visible = true;
dialog.title = '修改班主任考核指标体系';
};
/** 提交按钮 */
const submitForm = () => {
assessmentIndicatorFormRef.value?.validate(async (valid: boolean) => {
if (valid) {
buttonLoading.value = true;
if (form.value.id) {
await updateBmzrAssessmentIndicator(form.value).finally(() => (buttonLoading.value = false));
} else {
await addBmzrAssessmentIndicator(form.value).finally(() => (buttonLoading.value = false));
}
proxy?.$modal.msgSuccess('操作成功');
dialog.visible = false;
await getList();
}
});
};
/** 删除按钮操作 */
const handleDelete = async (row?: AssessmentIndicatorVO) => {
const _ids = row?.id || ids.value;
let confirmMessage = '';
if (row) {
// 单个删除
confirmMessage = `是否确认删除班主任考核指标体系\"${row.indicatorName}(${row.indicatorCode})\"的数据项?\n\n【提示】本操作为逻辑删除,数据不会被物理移除,可在后台恢复。`;
} else {
// 批量删除
const selectedRows = assessmentIndicatorList.value.filter((item) => ids.value.includes(item.id));
if (selectedRows.length === 1) {
confirmMessage = `是否确认删除班主任考核指标体系\"${selectedRows[0].indicatorName}(${selectedRows[0].indicatorCode})\"的数据项?\n\n【提示】本操作为逻辑删除,数据不会被物理移除,可在后台恢复。`;
} else {
const indicatorNames = selectedRows.map((item) => `${item.indicatorName}(${item.indicatorCode})`).join('、');
confirmMessage = `是否确认删除班主任考核指标体系\"${indicatorNames}\"的数据项?\n\n【提示】本操作为逻辑删除,数据不会被物理移除,可在后台恢复。`;
}
}
await proxy?.$modal.confirm(confirmMessage).finally(() => (loading.value = false));
await delBmzrAssessmentIndicator(_ids);
proxy?.$modal.msgSuccess('已逻辑删除');
await getList();
};
onMounted(() => {
getList();
getIndicatorTypeOptionsList();
});
</script>
<style scoped>
/* 页面容器样式 */
.page-container {
padding: 8px;
}
/* 表格卡片布局 */
.table-card {
margin-top: 0;
}
.table-card :deep(.el-card__body) {
padding: 0px 20px 20px 20px !important;
}
/* 表格主体 */
.table-container {
margin-bottom: 0;
}
/* 移除按钮栏底部边框 */
.button-card :deep(.el-card__header) {
border-bottom: none !important;
}
/* 分页容器样式 */
.pagination-container {
display: flex;
justify-content: flex-end;
padding: 16px 20px 0 0 !important;
background-color: #fff;
margin-top: 0px !important;
}
</style>
@@ -0,0 +1,303 @@
<template>
<div class="p-2 page-container">
<transition :enter-active-class="proxy?.animate.searchAnimate.enter" :leave-active-class="proxy?.animate.searchAnimate.leave">
<div v-show="showSearch" class="mb-[10px]">
<el-card shadow="hover">
<el-form ref="queryFormRef" :model="queryParams" label-width="100px">
<el-row :gutter="20">
<el-col :lg="6" :md="12" :sm="24">
<el-form-item label="指标类型编码" prop="indicatorTypeCode">
<el-input v-model="queryParams.indicatorTypeCode" placeholder="请输入指标类型编码" clearable @keyup.enter="handleQuery" />
</el-form-item>
</el-col>
<el-col :lg="6" :md="12" :sm="24">
<el-form-item label="指标类型名称" prop="indicatorTypeName">
<el-input v-model="queryParams.indicatorTypeName" placeholder="请输入指标类型名称" clearable @keyup.enter="handleQuery" />
</el-form-item>
</el-col>
<el-col :lg="6" :md="12" :sm="24">
<el-form-item label="状态" prop="status">
<el-select v-model="queryParams.status" placeholder="请选择状态" clearable style="width: 100%">
<el-option v-for="dict in sys_item_enable" :key="dict.value" :label="dict.label" :value="dict.value" />
</el-select>
</el-form-item>
</el-col>
<el-col :lg="6" :md="24" :sm="24">
<el-form-item>
<el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
<el-button icon="Refresh" @click="resetQuery">重置</el-button>
</el-form-item>
</el-col>
</el-row>
</el-form>
</el-card>
</div>
</transition>
<el-card shadow="never" class="button-card table-card">
<template #header>
<el-row :gutter="10" class="mb8">
<el-col :span="1.5">
<el-button type="primary" plain icon="Plus" @click="handleAdd" v-hasPermi="['bzrkh:assessmentIndicatorType:add']">新增</el-button>
</el-col>
<el-col :span="1.5">
<el-button icon="Edit" :disabled="single" @click="handleUpdate()" v-hasPermi="['bzrkh:assessmentIndicatorType:edit']">修改</el-button>
</el-col>
<el-col :span="1.5">
<el-button icon="Delete" :disabled="multiple" @click="handleDelete()" v-hasPermi="['bzrkh:assessmentIndicatorType:remove']">删除</el-button>
</el-col>
<right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
</el-row>
</template>
<div class="table-container">
<el-table v-loading="loading" border :data="assessmentIndicatorTypeList" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" align="center" />
<el-table-column label="指标类型编码" align="center" prop="indicatorTypeCode" />
<el-table-column label="指标类型名称" align="center" prop="indicatorTypeName" />
<el-table-column label="状态" align="center" prop="status">
<template #default="scope">
<dict-tag :options="sys_item_enable" :value="scope.row.status" />
</template>
</el-table-column>
<el-table-column label="备注" align="center" prop="remark" show-overflow-tooltip />
<el-table-column label="创建时间" align="center" prop="createTime" width="180">
<template #default="scope">
<span>{{ parseTime(scope.row.createTime, '{y}-{m}-{d} {h}:{i}:{s}') }}</span>
</template>
</el-table-column>
<el-table-column label="操作" align="center" class-name="small-padding fixed-width">
<template #default="scope">
<el-tooltip content="修改" placement="top">
<el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['bzrkh:assessmentIndicatorType:edit']"></el-button>
</el-tooltip>
<el-tooltip content="删除" placement="top">
<el-button link type="danger" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['bzrkh:assessmentIndicatorType:remove']"></el-button>
</el-tooltip>
</template>
</el-table-column>
</el-table>
</div>
<div class="pagination-container">
<pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" @pagination="getList" />
</div>
</el-card>
<!-- 添加或修改班主任考核指标类型对话框 -->
<el-dialog :title="dialog.title" v-model="dialog.visible" width="500px" append-to-body>
<el-form ref="assessmentIndicatorTypeFormRef" :model="form" :rules="rules" label-width="120px">
<el-form-item label="指标类型编码" prop="indicatorTypeCode">
<el-input v-model="form.indicatorTypeCode" placeholder="请输入指标类型编码" />
</el-form-item>
<el-form-item label="指标类型名称" prop="indicatorTypeName">
<el-input v-model="form.indicatorTypeName" placeholder="请输入指标类型名称" />
</el-form-item>
<el-form-item label="状态" prop="status">
<el-select v-model="form.status" placeholder="请选择状态" style="width: 100%">
<el-option v-for="dict in sys_item_enable" :key="dict.value" :label="dict.label" :value="dict.value"></el-option>
</el-select>
</el-form-item>
<el-form-item label="备注" prop="remark">
<el-input v-model="form.remark" type="textarea" resize="none" :autosize="false" :rows="4" placeholder="请输入内容" />
</el-form-item>
</el-form>
<template #footer>
<div class="dialog-footer">
<el-button :loading="buttonLoading" type="primary" @click="submitForm">确 定</el-button>
<el-button @click="cancel">取 消</el-button>
</div>
</template>
</el-dialog>
</div>
</template>
<script setup name="AssessmentIndicatorType" lang="ts">
import { listAssessmentIndicatorType, getAssessmentIndicatorType, delAssessmentIndicatorType, addAssessmentIndicatorType, updateAssessmentIndicatorType } from '@/api/bzrkh/assessmentIndicatorType';
import { AssessmentIndicatorTypeVO, AssessmentIndicatorTypeQuery, AssessmentIndicatorTypeForm } from '@/api/bzrkh/assessmentIndicatorType/types';
const { proxy } = getCurrentInstance() as ComponentInternalInstance;
const { sys_item_enable, sys_item_delete } = toRefs<any>(proxy?.useDict('sys_item_enable', 'sys_item_delete'));
const assessmentIndicatorTypeList = ref<AssessmentIndicatorTypeVO[]>([]);
const buttonLoading = ref(false);
const loading = ref(true);
const showSearch = ref(true);
const ids = ref<Array<string | number>>([]);
const single = ref(true);
const multiple = ref(true);
const total = ref(0);
const queryFormRef = ref<ElFormInstance>();
const assessmentIndicatorTypeFormRef = ref<ElFormInstance>();
const dialog = reactive<DialogOption>({
visible: false,
title: ''
});
const initFormData: AssessmentIndicatorTypeForm = {
id: undefined,
deleted: undefined,
indicatorTypeCode: undefined,
indicatorTypeName: undefined,
status: '0',
remark: undefined
};
const data = reactive<PageData<AssessmentIndicatorTypeForm, AssessmentIndicatorTypeQuery>>({
form: { ...initFormData },
queryParams: {
pageNum: 1,
pageSize: 10,
deleted: undefined,
indicatorTypeCode: undefined,
indicatorTypeName: undefined,
status: undefined,
params: {}
},
rules: {
id: [{ required: true, message: '主键ID不能为空', trigger: 'blur' }],
indicatorTypeCode: [{ required: true, message: '指标类型编码不能为空', trigger: 'blur' }],
indicatorTypeName: [{ required: true, message: '指标类型名称不能为空', trigger: 'blur' }]
}
});
const { queryParams, form, rules } = toRefs(data);
/** 查询班主任考核指标类型列表 */
const getList = async () => {
loading.value = true;
const res = await listAssessmentIndicatorType(queryParams.value);
assessmentIndicatorTypeList.value = res.rows;
total.value = res.total;
loading.value = false;
};
/** 取消按钮 */
const cancel = () => {
reset();
dialog.visible = false;
};
/** 表单重置 */
const reset = () => {
form.value = { ...initFormData };
assessmentIndicatorTypeFormRef.value?.resetFields();
};
/** 搜索按钮操作 */
const handleQuery = () => {
queryParams.value.pageNum = 1;
getList();
};
/** 重置按钮操作 */
const resetQuery = () => {
queryFormRef.value?.resetFields();
handleQuery();
};
/** 多选框选中数据 */
const handleSelectionChange = (selection: AssessmentIndicatorTypeVO[]) => {
ids.value = selection.map((item) => item.id);
single.value = selection.length != 1;
multiple.value = !selection.length;
};
/** 新增按钮操作 */
const handleAdd = () => {
reset();
dialog.visible = true;
dialog.title = '添加班主任考核指标类型';
};
/** 修改按钮操作 */
const handleUpdate = async (row?: AssessmentIndicatorTypeVO) => {
reset();
const _id = row?.id || ids.value[0];
const res = await getAssessmentIndicatorType(_id);
Object.assign(form.value, res.data);
dialog.visible = true;
dialog.title = '修改班主任考核指标类型';
};
/** 提交按钮 */
const submitForm = () => {
assessmentIndicatorTypeFormRef.value?.validate(async (valid: boolean) => {
if (valid) {
buttonLoading.value = true;
if (form.value.id) {
await updateAssessmentIndicatorType(form.value).finally(() => (buttonLoading.value = false));
} else {
await addAssessmentIndicatorType(form.value).finally(() => (buttonLoading.value = false));
}
proxy?.$modal.msgSuccess('操作成功');
dialog.visible = false;
await getList();
}
});
};
/** 删除按钮操作 */
const handleDelete = async (row?: AssessmentIndicatorTypeVO) => {
const _ids = row?.id || ids.value;
let confirmMessage = '';
if (row) {
// 单个删除
confirmMessage = `是否确认删除班主任考核指标类型\"${row.indicatorTypeName}(${row.indicatorTypeCode})\"的数据项?\n\n【提示】本操作为逻辑删除,数据不会被物理移除,可在后台恢复。`;
} else {
// 批量删除
const selectedRows = assessmentIndicatorTypeList.value.filter((item) => ids.value.includes(item.id));
if (selectedRows.length === 1) {
confirmMessage = `是否确认删除班主任考核指标类型\"${selectedRows[0].indicatorTypeName}(${selectedRows[0].indicatorTypeCode})\"的数据项?\n\n【提示】本操作为逻辑删除,数据不会被物理移除,可在后台恢复。`;
} else {
const typeNames = selectedRows.map((item) => `${item.indicatorTypeName}(${item.indicatorTypeCode})`).join('、');
confirmMessage = `是否确认删除班主任考核指标类型\"${typeNames}\"的数据项?\n\n【提示】本操作为逻辑删除,数据不会被物理移除,可在后台恢复。`;
}
}
await proxy?.$modal.confirm(confirmMessage).finally(() => (loading.value = false));
await delAssessmentIndicatorType(_ids);
proxy?.$modal.msgSuccess('已逻辑删除');
await getList();
};
onMounted(() => {
getList();
});
</script>
<style scoped>
/* 页面容器样式 */
.page-container {
padding: 8px;
}
/* 表格卡片布局 */
.table-card {
margin-top: 0;
}
.table-card :deep(.el-card__body) {
padding: 0px 20px 20px 20px !important;
}
/* 表格主体 */
.table-container {
margin-bottom: 0;
}
/* 移除按钮栏底部边框 */
.button-card :deep(.el-card__header) {
border-bottom: none !important;
}
/* 分页容器样式 */
.pagination-container {
display: flex;
justify-content: flex-end;
padding: 16px 20px 0 0 !important;
background-color: #fff;
margin-top: 0px !important;
}
</style>
@@ -0,0 +1,535 @@
<template>
<div class="p-2 page-container">
<transition :enter-active-class="proxy?.animate.searchAnimate.enter" :leave-active-class="proxy?.animate.searchAnimate.leave">
<div v-show="showSearch" class="mb-[10px]">
<el-card shadow="hover">
<el-form :model="queryParams" ref="queryFormRef" label-width="100px">
<el-row :gutter="20">
<el-col :lg="6" :md="12" :sm="24">
<el-form-item label="计划名称" prop="planName">
<el-input v-model="queryParams.planName" placeholder="请输入计划名称" clearable @keyup.enter="handleQuery" />
</el-form-item>
</el-col>
<el-col :lg="6" :md="12" :sm="24">
<el-form-item label="计划编码" prop="planCode">
<el-input v-model="queryParams.planCode" placeholder="请输入计划编码" clearable @keyup.enter="handleQuery" />
</el-form-item>
</el-col>
<el-col :lg="6" :md="12" :sm="24">
<el-form-item label="考核方案" prop="schemeId">
<el-select v-model="queryParams.schemeId" placeholder="请选择考核方案" clearable style="width: 100%">
<el-option v-for="item in schemeOptions" :key="item.id" :label="item.schemeName" :value="item.id" />
</el-select>
</el-form-item>
</el-col>
<el-col :lg="6" :md="12" :sm="24">
<el-form-item label="学年" prop="academicYear">
<el-input v-model="queryParams.academicYear" placeholder="请输入学年" clearable @keyup.enter="handleQuery" />
</el-form-item>
</el-col>
<el-col :lg="6" :md="12" :sm="24">
<el-form-item label="学期" prop="semester">
<el-select v-model="queryParams.semester" placeholder="请选择学期" clearable style="width: 100%">
<el-option label="上学期" value="1" />
<el-option label="下学期" value="2" />
</el-select>
</el-form-item>
</el-col>
<el-col :lg="6" :md="12" :sm="24">
<el-form-item label="计划状态" prop="planStatus">
<el-select v-model="queryParams.planStatus" placeholder="请选择计划状态" clearable style="width: 100%">
<el-option v-for="option in planStatusOptions" :key="option.value" :label="option.label" :value="option.value" />
</el-select>
</el-form-item>
</el-col>
<el-col :lg="12" :md="24" :sm="24">
<el-form-item label="创建时间">
<el-date-picker
v-model="dateRange"
value-format="YYYY-MM-DD"
type="daterange"
range-separator="-"
start-placeholder="开始日期"
end-placeholder="结束日期"
style="width: 100%"
@change="handleQuery"
></el-date-picker>
</el-form-item>
</el-col>
<el-col :lg="6" :md="24" :sm="24">
<el-form-item>
<el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
<el-button icon="Refresh" @click="resetQuery">重置</el-button>
</el-form-item>
</el-col>
</el-row>
</el-form>
</el-card>
</div>
</transition>
<el-card shadow="never" class="button-card table-card">
<template #header>
<el-row :gutter="10" class="mb8">
<el-col :span="1.5">
<el-button type="primary" plain icon="Plus" @click="handleAdd" v-hasPermi="['bzrkh:assessmentPlan:add']">新增</el-button>
</el-col>
<el-col :span="1.5">
<el-button icon="Edit" :disabled="single" @click="handleUpdate()" v-hasPermi="['bzrkh:assessmentPlan:edit']">修改</el-button>
</el-col>
<el-col :span="1.5">
<el-button icon="Delete" :disabled="multiple" @click="handleDelete()" v-hasPermi="['bzrkh:assessmentPlan:remove']">删除</el-button>
</el-col>
<right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
</el-row>
</template>
<div class="table-container">
<el-table v-loading="loading" border :data="assessmentPlanList" @selection-change="handleSelectionChange" @sort-change="sortChange">
<el-table-column type="selection" width="55" align="center" />
<el-table-column label="计划名称" align="center" prop="planName" :show-overflow-tooltip="true" />
<el-table-column label="计划编码" align="center" prop="planCode" :show-overflow-tooltip="true" />
<el-table-column label="考核方案" align="center" :show-overflow-tooltip="true">
<template #default="scope">
<span>{{ schemeOptions.find(item => item.id === scope.row.schemeId)?.schemeName || '' }}</span>
</template>
</el-table-column>
<el-table-column label="学年学期" align="center" width="120">
<template #default="scope">
<span>{{ scope.row.academicYear }}{{ scope.row.semester === '1' ? '上' : '下' }}学期</span>
</template>
</el-table-column>
<el-table-column label="计划时间" align="center" width="180">
<template #default="scope">
<span>{{ parseTime(scope.row.planStartTime, '{y}-{m}-{d}') }} 至 {{ parseTime(scope.row.planEndTime, '{y}-{m}-{d}') }}</span>
</template>
</el-table-column>
<el-table-column label="数据提取时间" align="center" width="180">
<template #default="scope">
<span v-if="scope.row.dataExtractStartTime && scope.row.dataExtractEndTime">
{{ parseTime(scope.row.dataExtractStartTime, '{y}-{m}-{d}') }} 至 {{ parseTime(scope.row.dataExtractEndTime, '{y}-{m}-{d}') }}
</span>
<span v-else class="text-gray-400">未设置</span>
</template>
</el-table-column>
<el-table-column label="计划状态" align="center" width="100">
<template #default="scope">
<el-switch
v-model="scope.row.planStatus"
active-value="1"
inactive-value="0"
@change="handleStatusChange(scope.row)"
v-hasPermi="['bzrkh:assessmentPlan:edit']"
></el-switch>
</template>
</el-table-column>
<el-table-column label="创建时间" align="center" prop="createTime" width="180">
<template #default="scope">
<span>{{ parseTime(scope.row.createTime, '{y}-{m}-{d} {h}:{i}:{s}') }}</span>
</template>
</el-table-column>
<el-table-column label="操作" align="center" class-name="small-padding fixed-width">
<template #default="scope">
<el-tooltip content="修改" placement="top">
<el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['bzrkh:assessmentPlan:edit']"></el-button>
</el-tooltip>
<el-tooltip content="删除" placement="top">
<el-button link type="danger" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['bzrkh:assessmentPlan:remove']"></el-button>
</el-tooltip>
</template>
</el-table-column>
</el-table>
</div>
<div class="pagination-container">
<pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" @pagination="getList" />
</div>
</el-card>
<!-- 添加或修改考核计划对话框 -->
<el-dialog :title="dialog.title" v-model="dialog.visible" width="800px" append-to-body>
<el-form ref="assessmentPlanFormRef" :model="form" :rules="rules" label-width="120px">
<el-row>
<el-col :span="12">
<el-form-item label="计划名称" prop="planName">
<el-input v-model="form.planName" placeholder="请输入计划名称" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="计划编码" prop="planCode">
<el-input v-model="form.planCode" placeholder="请输入计划编码" />
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="24">
<el-form-item label="考核方案" prop="schemeId">
<el-select v-model="form.schemeId" placeholder="请选择考核方案" style="width: 100%">
<el-option v-for="item in schemeOptions" :key="item.id" :label="`${item.schemeName}(${item.academicYear}${item.semester === '1' ? '上' : '下'}学期)`" :value="item.id" />
</el-select>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<el-form-item label="学年" prop="academicYear">
<el-input v-model="form.academicYear" placeholder="请输入学年,如2023-2024" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="学期" prop="semester">
<el-select v-model="form.semester" placeholder="请选择学期" style="width: 100%">
<el-option label="上学期" value="1" />
<el-option label="下学期" value="2" />
</el-select>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<el-form-item label="开始时间" prop="planStartTime">
<el-date-picker
v-model="form.planStartTime"
type="datetime"
placeholder="选择开始时间"
value-format="YYYY-MM-DD HH:mm:ss"
style="width: 100%"
></el-date-picker>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="结束时间" prop="planEndTime">
<el-date-picker
v-model="form.planEndTime"
type="datetime"
placeholder="选择结束时间"
value-format="YYYY-MM-DD HH:mm:ss"
style="width: 100%"
></el-date-picker>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<el-form-item label="数据提取开始" prop="dataExtractStartTime">
<el-date-picker
v-model="form.dataExtractStartTime"
type="datetime"
placeholder="选择数据提取开始时间"
value-format="YYYY-MM-DD HH:mm:ss"
style="width: 100%"
></el-date-picker>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="数据提取结束" prop="dataExtractEndTime">
<el-date-picker
v-model="form.dataExtractEndTime"
type="datetime"
placeholder="选择数据提取结束时间"
value-format="YYYY-MM-DD HH:mm:ss"
style="width: 100%"
></el-date-picker>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<el-form-item label="计划状态" prop="planStatus">
<el-radio-group v-model="form.planStatus">
<el-radio v-for="option in planStatusOptions" :key="option.value" :value="option.value">{{ option.label }}</el-radio>
</el-radio-group>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="24">
<el-form-item label="计划描述" prop="description">
<el-input v-model="form.description" type="textarea" placeholder="请输入计划描述" :rows="3" />
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="24">
<el-form-item label="备注" prop="remark">
<el-input v-model="form.remark" type="textarea" placeholder="请输入备注" :rows="2" />
</el-form-item>
</el-col>
</el-row>
</el-form>
<template #footer>
<div class="dialog-footer">
<el-button :loading="buttonLoading" type="primary" @click="submitForm">确 定</el-button>
<el-button @click="cancel">取 消</el-button>
</div>
</template>
</el-dialog>
</div>
</template>
<script setup name="AssessmentPlan" lang="ts">
import {
listAssessmentPlan,
getAssessmentPlan,
delAssessmentPlan,
addAssessmentPlan,
updateAssessmentPlan,
changeAssessmentPlanStatus
} from '@/api/bzrkh/assessmentPlan';
import { listBmzrAssessmentScheme } from '@/api/bzrkh/assessmentScheme';
import {
AssessmentPlanVO,
AssessmentPlanQuery,
AssessmentPlanForm
} from '@/api/bzrkh/assessmentPlan/types';
import { BmzrAssessmentSchemeVO } from '@/api/bzrkh/assessmentScheme/types';
const { proxy } = getCurrentInstance() as ComponentInternalInstance;
// 自定义计划状态选项(符合数据库设计:0=禁用 1=启用)
const planStatusOptions = ref([
{ value: '1', label: '启用' },
{ value: '0', label: '禁用' }
]);
const assessmentPlanList = ref<AssessmentPlanVO[]>([]);
const buttonLoading = ref(false);
const loading = ref(true);
const showSearch = ref(true);
const ids = ref<Array<string | number>>([]);
const single = ref(true);
const multiple = ref(true);
const total = ref(0);
const dateRange = ref<[DateModelType, DateModelType]>(['', '']);
const schemeOptions = ref<BmzrAssessmentSchemeVO[]>([]);
const queryFormRef = ref<ElFormInstance>();
const assessmentPlanFormRef = ref<ElFormInstance>();
const dialog = reactive<DialogOption>({
visible: false,
title: ''
});
const initFormData: AssessmentPlanForm = {
id: undefined,
planName: undefined,
planCode: undefined,
schemeId: undefined,
academicYear: undefined,
semester: undefined,
planStartTime: undefined,
planEndTime: undefined,
dataExtractStartTime: undefined,
dataExtractEndTime: undefined,
planStatus: '1',
description: undefined,
remark: undefined
};
const data = reactive<PageData<AssessmentPlanForm, AssessmentPlanQuery>>({
form: { ...initFormData },
queryParams: {
pageNum: 1,
pageSize: 10,
planName: undefined,
planCode: undefined,
schemeId: undefined,
academicYear: undefined,
semester: undefined,
planStatus: undefined,
params: {}
},
rules: {
planName: [{ required: true, message: '计划名称不能为空', trigger: 'blur' }],
planCode: [{ required: true, message: '计划编码不能为空', trigger: 'blur' }],
schemeId: [{ required: true, message: '考核方案不能为空', trigger: 'change' }],
academicYear: [{ required: true, message: '学年不能为空', trigger: 'blur' }],
semester: [{ required: true, message: '学期不能为空', trigger: 'change' }],
planStartTime: [{ required: true, message: '计划开始时间不能为空', trigger: 'blur' }],
planEndTime: [{ required: true, message: '计划结束时间不能为空', trigger: 'blur' }],
dataExtractStartTime: [{ required: true, message: '数据提取开始时间不能为空', trigger: 'blur' }],
dataExtractEndTime: [{ required: true, message: '数据提取结束时间不能为空', trigger: 'blur' }]
}
});
const { queryParams, form, rules } = toRefs(data);
/** 查询考核计划列表 */
const getList = async () => {
loading.value = true;
queryParams.value.params = {};
if (dateRange.value && dateRange.value.length === 2 && dateRange.value[0] && dateRange.value[1]) {
queryParams.value.params['beginCreateTime'] = dateRange.value[0] as string;
queryParams.value.params['endCreateTime'] = dateRange.value[1] as string;
}
const res = await listAssessmentPlan(queryParams.value);
assessmentPlanList.value = res.rows;
total.value = res.total;
loading.value = false;
};
/** 获取考核方案选项 */
const getSchemeOptions = async () => {
const res = await listBmzrAssessmentScheme({
status: '0', // 只获取正常状态的方案
pageNum: 1,
pageSize: 1000 // 设置较大的pageSize以获取所有可用方案
});
schemeOptions.value = res.rows || [];
};
/** 取消按钮 */
const cancel = () => {
reset();
dialog.visible = false;
};
/** 表单重置 */
const reset = () => {
form.value = { ...initFormData };
assessmentPlanFormRef.value?.resetFields();
};
/** 搜索按钮操作 */
const handleQuery = () => {
queryParams.value.pageNum = 1;
getList();
};
/** 重置按钮操作 */
const resetQuery = () => {
dateRange.value = ['', ''];
queryFormRef.value?.resetFields();
handleQuery();
};
/** 多选框选中数据 */
const handleSelectionChange = (selection: AssessmentPlanVO[]) => {
ids.value = selection.map((item) => item.id);
single.value = selection.length != 1;
multiple.value = !selection.length;
};
/** 排序触发事件 */
const sortChange = (column: any) => {
const { prop, order } = column;
if (prop === 'createTime') {
queryParams.value.orderByColumn = prop;
queryParams.value.isAsc = order === 'ascending' ? 'asc' : 'desc';
getList();
}
};
/** 新增按钮操作 */
const handleAdd = () => {
reset();
dialog.visible = true;
dialog.title = '添加考核计划';
};
/** 修改按钮操作 */
const handleUpdate = async (row?: AssessmentPlanVO) => {
reset();
const _id = row?.id || ids.value[0];
const res = await getAssessmentPlan(_id);
Object.assign(form.value, res.data);
dialog.visible = true;
dialog.title = '修改考核计划';
};
/** 提交按钮 */
const submitForm = () => {
assessmentPlanFormRef.value?.validate(async (valid: boolean) => {
if (valid) {
buttonLoading.value = true;
if (form.value.id) {
await updateAssessmentPlan(form.value)
.then(() => {
proxy?.$modal.msgSuccess('修改成功');
dialog.visible = false;
getList();
})
.finally(() => {
buttonLoading.value = false;
});
} else {
await addAssessmentPlan(form.value)
.then(() => {
proxy?.$modal.msgSuccess('新增成功');
dialog.visible = false;
getList();
})
.finally(() => {
buttonLoading.value = false;
});
}
}
});
};
/** 删除按钮操作 */
const handleDelete = async (row?: AssessmentPlanVO) => {
const _ids = row?.id || ids.value;
await proxy?.$modal.confirm('是否确认删除考核计划编号为"' + _ids + '"的数据项?').then(async () => {
await delAssessmentPlan(_ids).then(() => {
getList();
proxy?.$modal.msgSuccess('删除成功');
});
});
};
/** 状态修改 */
const handleStatusChange = async (row: AssessmentPlanVO) => {
const text = row.planStatus === '1' ? '启用' : '禁用';
await proxy?.$modal.confirm('确认要"' + text + '""' + row.planName + '"考核计划吗?').then(async () => {
await changeAssessmentPlanStatus(row.id!, row.planStatus!).then(() => {
proxy?.$modal.msgSuccess(text + '成功');
});
}).catch(() => {
row.planStatus = row.planStatus === '1' ? '0' : '1';
});
};
onMounted(() => {
getList();
getSchemeOptions();
});
</script>
<style scoped>
/* 页面容器样式 */
.page-container {
padding: 8px;
}
/* 表格卡片布局 */
.table-card {
margin-top: 0;
}
.table-card :deep(.el-card__body) {
padding: 0px 20px 20px 20px !important;
}
/* 表格主体 */
.table-container {
margin-bottom: 0;
}
/* 移除按钮栏底部边框 */
.button-card :deep(.el-card__header) {
border-bottom: none !important;
}
/* 分页容器样式 */
.pagination-container {
display: flex;
justify-content: flex-end;
padding: 16px 20px 0 0 !important;
background-color: #fff;
margin-top: 0px !important;
}
</style>
@@ -0,0 +1,478 @@
<template>
<el-dialog
title="指标体系管理"
v-model="dialogVisible"
width="1200px"
append-to-body
:close-on-click-modal="false"
@close="handleClose"
>
<div class="indicator-management-container">
<!-- 检索区域 -->
<div class="search-container">
<el-card shadow="hover">
<el-form ref="searchFormRef" :model="searchParams" label-width="100px">
<el-row :gutter="20">
<el-col :lg="8" :md="12" :sm="24">
<el-form-item label="指标名称" prop="indicatorName">
<el-input
v-model="searchParams.indicatorName"
placeholder="请输入指标名称"
clearable
@keyup.enter="handleSearchIndicators"
/>
</el-form-item>
</el-col>
<el-col :lg="16" :md="12" :sm="24">
<el-form-item>
<el-button type="primary" icon="Search" @click="handleSearchIndicators">搜索</el-button>
<el-button icon="Refresh" @click="resetSearch">重置</el-button>
</el-form-item>
</el-col>
</el-row>
</el-form>
<!-- 搜索结果提示 -->
<div v-if="searchResultInfo" class="search-result-info">
<el-alert
:title="searchResultInfo"
type="info"
:closable="false"
show-icon
/>
</div>
</el-card>
</div>
<!-- 内容区域 -->
<div class="content-container">
<el-card shadow="never">
<!-- 没有关联指标时显示新增按钮 -->
<div v-if="indicatorList.length === 0" class="empty-state">
<el-button type="primary" icon="Plus" @click="handleAddIndicator">新增指标</el-button>
</div>
<!-- 没有搜索结果时显示提示 -->
<div v-else-if="filteredIndicatorList.length === 0" class="empty-state">
<div style="text-align: center; color: #909399;">
<el-icon size="48" style="margin-bottom: 16px;"><Search /></el-icon>
<p>未找到匹配"{{ searchParams.indicatorName }}"的指标</p>
<el-button type="text" @click="resetSearch">清除搜索条件</el-button>
</div>
</div>
<!-- 指标列表 -->
<div v-else class="indicator-list">
<div v-for="(item, index) in filteredIndicatorList" :key="`filtered_${item.indicatorId}_${index}`" class="indicator-row">
<div class="row-content">
<div class="row-item">
<span class="label">序号:</span>
<span class="value">{{ index + 1 }}</span>
</div>
<div class="row-item">
<span class="label">指标名称:</span>
<el-select
v-model="item.indicatorId"
placeholder="请选择指标名称"
style="width: 250px"
@change="handleIndicatorChange(item, getOriginalIndex(item))"
filterable
>
<el-option
v-for="indicator in availableIndicators"
:key="indicator.id"
:label="indicator.indicatorName"
:value="indicator.id"
/>
</el-select>
</div>
<div class="row-item">
<span class="label">指标描述:</span>
<span class="value">{{ item.remark || '-' }}</span>
</div>
<div class="row-item">
<span class="label">指标分值:</span>
<span class="value">{{ item.score || '-' }}</span>
</div>
<div class="row-item">
<el-button type="danger" icon="Delete" size="small" @click="handleDeleteIndicator(getOriginalIndex(item))">删除</el-button>
</div>
</div>
</div>
<!-- 新增按钮 -->
<div class="add-row">
<el-button type="primary" icon="Plus" @click="handleAddIndicator">新增指标</el-button>
</div>
</div>
</el-card>
</div>
</div>
<template #footer>
<div class="dialog-footer">
<el-button :loading="buttonLoading" type="primary" @click="handleSave">保存</el-button>
<el-button @click="handleClose">取消</el-button>
</div>
</template>
</el-dialog>
</template>
<script setup name="IndicatorManagement" lang="ts">
import { Search } from '@element-plus/icons-vue';
import { listBmzrAssessmentIndicator } from '@/api/bzrkh/assessmentIndicator';
import { listBySchemeId, batchSaveSchemeIndicators } from '@/api/bzrkh/assessmentSchemeIndicator';
import { AssessmentIndicatorVO } from '@/api/bzrkh/assessmentIndicator/types';
import { BmzrAssessmentSchemeIndicatorForm } from '@/api/bzrkh/assessmentSchemeIndicator/types';
const { proxy } = getCurrentInstance() as ComponentInternalInstance;
// 组件状态
const dialogVisible = ref(false);
const buttonLoading = ref(false);
const schemeId = ref<string | number>('');
// 搜索参数
const searchFormRef = ref<ElFormInstance>();
const searchParams = ref({
indicatorName: ''
});
// 搜索结果信息
const searchResultInfo = ref('');
// 可选指标列表
const availableIndicators = ref<AssessmentIndicatorVO[]>([]);
// 当前方案的指标列表
const indicatorList = ref<BmzrAssessmentSchemeIndicatorForm[]>([]);
// 根据搜索条件过滤显示的指标列表
const filteredIndicatorList = computed(() => {
const keyword = searchParams.value.indicatorName?.trim();
if (!keyword) {
// 没有搜索条件时,显示所有指标
return indicatorList.value;
}
// 有搜索条件时,只显示匹配的指标
return indicatorList.value.filter(item => {
// 根据indicatorId查找对应的指标名称
const indicator = availableIndicators.value.find(ind => ind.id == item.indicatorId);
const indicatorName = indicator?.indicatorName || '';
// 检查指标名称是否包含搜索关键词(不区分大小写)
return indicatorName.toLowerCase().includes(keyword.toLowerCase());
});
});
// 获取指标在原始列表中的索引
const getOriginalIndex = (item: BmzrAssessmentSchemeIndicatorForm) => {
return indicatorList.value.findIndex(originalItem =>
originalItem === item ||
(originalItem.id && originalItem.id === item.id) ||
(originalItem.indicatorId && originalItem.indicatorId === item.indicatorId && originalItem.sortOrder === item.sortOrder)
);
};
// 打开弹窗
const open = async (id: string | number) => {
schemeId.value = id;
dialogVisible.value = true;
// 加载可选指标
await loadAvailableIndicators();
// 加载当前方案的指标
await loadSchemeIndicators();
};
// 加载可选指标列表
const loadAvailableIndicators = async () => {
try {
const queryParams: any = {
status: '0', // 只加载正常状态的指标
pageNum: 1,
pageSize: 1000 // 加载所有指标
};
// 如果有搜索条件,添加到查询参数中
const hasSearchCondition = !!(searchParams.value.indicatorName && searchParams.value.indicatorName.trim());
if (hasSearchCondition) {
queryParams.indicatorName = searchParams.value.indicatorName.trim();
}
const res = await listBmzrAssessmentIndicator(queryParams);
availableIndicators.value = res.rows || [];
// 调试日志
console.log('loadAvailableIndicators完成:', {
queryParams,
hasSearchCondition,
resultCount: availableIndicators.value.length,
indicatorNames: availableIndicators.value.map(i => i.indicatorName)
});
// 更新搜索结果信息
updateSearchResultInfo(hasSearchCondition, availableIndicators.value.length);
} catch (error) {
console.error('加载可选指标失败:', error);
proxy?.$modal.msgError('加载可选指标失败');
searchResultInfo.value = '';
}
};
// 加载方案指标列表
const loadSchemeIndicators = async () => {
try {
const res = await listBySchemeId(schemeId.value);
indicatorList.value = res.data?.map((item: any) => ({
id: item.id,
schemeId: item.schemeId,
indicatorId: item.indicatorId,
// 优先使用score字段,如果为空则使用customMaxScore字段(兜底方案)
score: item.score || item.customMaxScore,
remark: item.remark || getIndicatorRemark(item.indicatorId),
sortOrder: item.sortOrder
})) || [];
} catch (error) {
console.error('加载方案指标失败:', error);
proxy?.$modal.msgError('加载方案指标失败');
}
};
// 根据指标ID获取指标描述
const getIndicatorRemark = (indicatorId: string | number) => {
const indicator = availableIndicators.value.find(item => item.id == indicatorId);
return indicator?.remark || '';
};
// 更新搜索结果信息
const updateSearchResultInfo = (hasSearchCondition: boolean, resultCount: number) => {
if (hasSearchCondition) {
const keyword = searchParams.value.indicatorName.trim();
const filteredCount = filteredIndicatorList.value.length;
searchResultInfo.value = `搜索关键词:"${keyword}" 在可选指标中找到 ${resultCount} 个,在当前方案中匹配 ${filteredCount} 个`;
} else {
searchResultInfo.value = '';
}
};
// 获取可用指标列表(允许重复选择)
const getAvailableIndicators = (currentIndex: number) => {
// 搜索功能:直接返回后端搜索结果,允许重复选择同一指标
// 这样用户可以在不同位置选择相同的指标
// 调试日志
console.log('getAvailableIndicators调用:', {
currentIndex,
totalAvailable: availableIndicators.value.length,
searchKeyword: searchParams.value.indicatorName,
availableIndicatorIds: availableIndicators.value.map(i => i.id),
availableIndicatorNames: availableIndicators.value.map(i => i.indicatorName),
currentSelectedIndicatorId: indicatorList.value[currentIndex]?.indicatorId
});
return availableIndicators.value;
};
// 指标选择变化
const handleIndicatorChange = (item: BmzrAssessmentSchemeIndicatorForm, index: number) => {
const selectedIndicator = availableIndicators.value.find(indicator => indicator.id == item.indicatorId);
if (selectedIndicator) {
item.score = selectedIndicator.score;
item.remark = selectedIndicator.remark;
}
};
// 新增指标
const handleAddIndicator = () => {
indicatorList.value.push({
schemeId: schemeId.value,
indicatorId: undefined,
score: undefined,
remark: undefined,
sortOrder: indicatorList.value.length + 1
});
};
// 删除指标
const handleDeleteIndicator = (index: number) => {
indicatorList.value.splice(index, 1);
// 重新调整排序
indicatorList.value.forEach((item, idx) => {
item.sortOrder = idx + 1;
});
};
// 搜索指标
const handleSearchIndicators = async () => {
const keyword = searchParams.value.indicatorName?.trim();
if (!keyword) {
proxy?.$modal.msgWarning('请输入搜索关键词');
return;
}
try {
await loadAvailableIndicators();
proxy?.$modal.msgSuccess('搜索完成');
} catch (error) {
console.error('搜索失败:', error);
proxy?.$modal.msgError('搜索失败,请重试');
}
};
// 重置搜索
const resetSearch = async () => {
searchFormRef.value?.resetFields();
searchResultInfo.value = '';
try {
// 重新加载所有可用指标
await loadAvailableIndicators();
proxy?.$modal.msgSuccess('已重置搜索条件');
} catch (error) {
console.error('重置失败:', error);
}
};
// 保存
const handleSave = async () => {
// 验证必填项
const invalidItems = indicatorList.value.filter(item => !item.indicatorId);
if (invalidItems.length > 0) {
proxy?.$modal.msgError('请选择所有指标名称');
return;
}
buttonLoading.value = true;
try {
// 准备保存数据 - 区分新增和修改
const saveData = indicatorList.value.map((item, index) => ({
id: item.id, // 有id表示修改,无id表示新增
schemeId: schemeId.value,
indicatorId: item.indicatorId,
score: item.score,
remark: item.remark,
sortOrder: index + 1 // 重新排序
}));
// 调用批量保存API - 后端会根据id字段判断新增还是修改
// 修改数据:先逻辑删除原始关联数据,再插入新的关联数据
// 新增数据:直接插入指标方案与指标体系的关联数据
await batchSaveSchemeIndicators(schemeId.value, saveData);
proxy?.$modal.msgSuccess('保存成功');
handleClose();
} catch (error) {
console.error('保存失败:', error);
proxy?.$modal.msgError('保存失败');
} finally {
buttonLoading.value = false;
}
};
// 关闭弹窗
const handleClose = () => {
dialogVisible.value = false;
schemeId.value = '';
indicatorList.value = [];
searchParams.value.indicatorName = '';
searchResultInfo.value = '';
};
// 暴露方法
defineExpose({
open
});
</script>
<style scoped>
.indicator-management-container {
padding: 0;
}
.search-container {
margin-bottom: 16px;
}
.search-result-info {
margin-top: 12px;
}
.content-container {
min-height: 400px;
}
.empty-state {
display: flex;
justify-content: center;
align-items: center;
height: 200px;
border: 2px dashed #e4e7ed;
border-radius: 6px;
background-color: #fafafa;
}
.indicator-list {
padding: 16px 0;
}
.indicator-row {
border: 1px solid #e4e7ed;
border-radius: 6px;
margin-bottom: 12px;
padding: 16px;
background-color: #fff;
}
.row-content {
display: flex;
align-items: center;
gap: 24px;
flex-wrap: wrap;
}
.row-item {
display: flex;
align-items: center;
gap: 8px;
min-width: 120px;
}
.label {
font-weight: 500;
color: #606266;
white-space: nowrap;
}
.value {
color: #303133;
}
.add-row {
display: flex;
justify-content: center;
padding: 16px;
border: 2px dashed #e4e7ed;
border-radius: 6px;
background-color: #fafafa;
}
.dialog-footer {
display: flex;
justify-content: flex-end;
gap: 12px;
}
/* 响应式设计 */
@media (max-width: 768px) {
.row-content {
flex-direction: column;
align-items: flex-start;
gap: 12px;
}
.row-item {
width: 100%;
justify-content: space-between;
}
}
</style>
@@ -0,0 +1,516 @@
<template>
<div class="p-2 page-container">
<transition :enter-active-class="proxy?.animate.searchAnimate.enter" :leave-active-class="proxy?.animate.searchAnimate.leave">
<div ref="searchRef" v-show="showSearch" class="mb-[10px]">
<el-card shadow="hover">
<el-form ref="queryFormRef" :model="queryParams" label-width="100px">
<el-row :gutter="20">
<el-col :lg="6" :md="12" :sm="24">
<el-form-item label="方案名称" prop="schemeName">
<el-input v-model="queryParams.schemeName" placeholder="请输入方案名称" clearable @keyup.enter="handleQuery" />
</el-form-item>
</el-col>
<el-col :lg="6" :md="12" :sm="24">
<el-form-item label="方案编码" prop="schemeCode">
<el-input v-model="queryParams.schemeCode" placeholder="请输入方案编码" clearable @keyup.enter="handleQuery" />
</el-form-item>
</el-col>
<el-col :lg="6" :md="12" :sm="24">
<el-form-item label="学年" prop="academicYear">
<el-input v-model="queryParams.academicYear" placeholder="请输入学年" clearable @keyup.enter="handleQuery" />
</el-form-item>
</el-col>
<el-col :lg="6" :md="12" :sm="24">
<el-form-item label="学期" prop="semester">
<el-select v-model="queryParams.semester" placeholder="请选择学期" clearable style="width: 100%">
<el-option label="上学期" value="1" />
<el-option label="下学期" value="2" />
</el-select>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :lg="6" :md="12" :sm="24">
<el-form-item label="状态" prop="status">
<el-select v-model="queryParams.status" placeholder="请选择状态" clearable style="width: 100%">
<el-option v-for="dict in sys_normal_disable" :key="dict.value" :label="dict.label" :value="dict.value" />
</el-select>
</el-form-item>
</el-col>
<el-col :lg="18" :md="12" :sm="24">
<el-form-item>
<el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
<el-button icon="Refresh" @click="resetQuery">重置</el-button>
</el-form-item>
</el-col>
</el-row>
</el-form>
</el-card>
</div>
</transition>
<el-card shadow="never" class="button-card table-card">
<template #header>
<el-row ref="toolbarRef" :gutter="10" class="mb8">
<el-col :span="1.5">
<el-button type="primary" plain icon="Plus" @click="handleAdd" v-hasPermi="['bzrkh:assessmentScheme:add']">新增</el-button>
</el-col>
<el-col :span="1.5">
<el-button icon="Edit" :disabled="single" @click="handleUpdate()" v-hasPermi="['bzrkh:assessmentScheme:edit']">修改</el-button>
</el-col>
<el-col :span="1.5">
<el-button icon="Delete" :disabled="multiple" @click="handleDelete()" v-hasPermi="['bzrkh:assessmentScheme:remove']">删除</el-button>
</el-col>
<right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
</el-row>
</template>
<div class="table-container">
<el-table
v-loading="loading"
border
:data="schemeList"
@selection-change="handleSelectionChange"
style="width: 100%"
:scroll-x="true"
class="scroll-table"
>
<el-table-column type="selection" width="55" align="center" fixed="left" />
<el-table-column label="方案名称" align="center" prop="schemeName" min-width="160" show-overflow-tooltip />
<el-table-column label="方案编码" align="center" prop="schemeCode" width="120" show-overflow-tooltip />
<el-table-column label="学年" align="center" prop="academicYear" width="100" />
<el-table-column label="学期" align="center" prop="semester" width="80">
<template #default="scope">
<el-tag v-if="scope.row.semester === '1'" type="primary">上学期</el-tag>
<el-tag v-else-if="scope.row.semester === '2'" type="success">下学期</el-tag>
</template>
</el-table-column>
<el-table-column label="自评" align="center" prop="selfEvaluationRequired" width="70">
<template #default="scope">
<dict-tag :options="sys_yesno" :value="scope.row.selfEvaluationRequired" />
</template>
</el-table-column>
<el-table-column label="上级评" align="center" prop="superiorEvaluationRequired" width="70">
<template #default="scope">
<dict-tag :options="sys_yesno" :value="scope.row.superiorEvaluationRequired" />
</template>
</el-table-column>
<el-table-column label="状态" align="center" prop="status" width="80">
<template #default="scope">
<dict-tag :options="sys_normal_disable" :value="scope.row.status" />
</template>
</el-table-column>
<el-table-column label="方案描述" align="center" prop="schemeDescription" min-width="180" show-overflow-tooltip />
<el-table-column label="创建时间" align="center" prop="createTime" width="160">
<template #default="scope">
<span>{{ parseTime(scope.row.createTime, '{y}-{m}-{d} {h}:{i}:{s}') }}</span>
</template>
</el-table-column>
<el-table-column label="备注" align="center" prop="remark" min-width="120" show-overflow-tooltip />
<el-table-column label="操作" align="center" width="160" class-name="small-padding fixed-width">
<template #default="scope">
<el-tooltip content="修改" placement="top">
<el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['bzrkh:assessmentScheme:edit']"></el-button>
</el-tooltip>
<el-tooltip content="指标体系管理" placement="top">
<el-button link type="success" icon="Management" @click="handleIndicatorManagement(scope.row)" v-hasPermi="['bzrkh:assessmentSchemeIndicator:list']"></el-button>
</el-tooltip>
<el-tooltip content="删除" placement="top">
<el-button link type="danger" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['bzrkh:assessmentScheme:remove']"></el-button>
</el-tooltip>
</template>
</el-table-column>
</el-table>
</div>
<div class="pagination-container">
<pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" @pagination="getList" />
</div>
</el-card>
<!-- 添加或修改考核方案对话框 -->
<el-dialog :title="dialog.title" v-model="dialog.visible" width="800px" append-to-body>
<el-form ref="schemeFormRef" :model="form" :rules="rules" label-width="120px" class="scheme-form">
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="方案名称" prop="schemeName">
<el-input v-model="form.schemeName" placeholder="请输入方案名称" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="方案编码" prop="schemeCode">
<el-input v-model="form.schemeCode" placeholder="请输入方案编码" />
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="学年" prop="academicYear">
<el-input v-model="form.academicYear" placeholder="请输入学年,如:2024-2025" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="学期" prop="semester">
<el-select v-model="form.semester" placeholder="请选择学期" style="width: 100%">
<el-option label="上学期" value="1" />
<el-option label="下学期" value="2" />
</el-select>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="是否需要自评" prop="selfEvaluationRequired">
<el-select v-model="form.selfEvaluationRequired" placeholder="请选择是否需要自评" style="width: 100%">
<el-option v-for="dict in sys_yesno" :key="dict.value" :label="dict.label" :value="dict.value" />
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="是否需要上级评" prop="superiorEvaluationRequired">
<el-select v-model="form.superiorEvaluationRequired" placeholder="请选择是否需要上级评" style="width: 100%">
<el-option v-for="dict in sys_yesno" :key="dict.value" :label="dict.label" :value="dict.value" />
</el-select>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="状态" prop="status">
<el-select v-model="form.status" placeholder="请选择状态" style="width: 100%">
<el-option v-for="dict in sys_normal_disable" :key="dict.value" :label="dict.label" :value="dict.value" />
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
<!-- 空列,保持布局对称 -->
</el-col>
</el-row>
<el-form-item label="方案描述" prop="schemeDescription">
<el-input v-model="form.schemeDescription" type="textarea" :rows="4" placeholder="请输入方案描述" />
</el-form-item>
<el-form-item label="备注" prop="remark">
<el-input v-model="form.remark" type="textarea" :rows="3" placeholder="请输入备注" />
</el-form-item>
</el-form>
<template #footer>
<div class="dialog-footer">
<el-button :loading="buttonLoading" type="primary" @click="submitForm">确 定</el-button>
<el-button @click="cancel">取 消</el-button>
</div>
</template>
</el-dialog>
<!-- 指标体系管理弹窗 -->
<IndicatorManagement ref="indicatorManagementRef" />
</div>
</template>
<script setup name="BmzrAssessmentScheme" lang="ts">
import {
listBmzrAssessmentScheme,
getBmzrAssessmentScheme,
delBmzrAssessmentScheme,
addBmzrAssessmentScheme,
updateBmzrAssessmentScheme
} from '@/api/bzrkh/assessmentScheme';
import { BmzrAssessmentSchemeVO, BmzrAssessmentSchemeQuery, BmzrAssessmentSchemeForm } from '@/api/bzrkh/assessmentScheme/types';
import IndicatorManagement from './IndicatorManagement.vue';
const { proxy } = getCurrentInstance() as ComponentInternalInstance;
const { sys_normal_disable, sys_yesno } = toRefs<any>(
proxy?.useDict('sys_normal_disable', 'sys_yesno')
);
const schemeList = ref<BmzrAssessmentSchemeVO[]>([]);
const buttonLoading = ref(false);
const loading = ref(true);
const showSearch = ref(true);
const ids = ref<Array<string | number>>([]);
const single = ref(true);
const multiple = ref(true);
const total = ref(0);
const queryFormRef = ref<ElFormInstance>();
const schemeFormRef = ref<ElFormInstance>();
const indicatorManagementRef = ref();
const dialog = reactive<DialogOption>({
visible: false,
title: ''
});
const initFormData: BmzrAssessmentSchemeForm = {
id: undefined,
tenantId: undefined,
schemeName: undefined,
schemeCode: undefined,
academicYear: undefined,
semester: undefined,
schemeDescription: undefined,
selfEvaluationRequired: '1',
superiorEvaluationRequired: '1',
status: '0',
remark: undefined
};
const data = reactive<PageData<BmzrAssessmentSchemeForm, BmzrAssessmentSchemeQuery>>({
form: { ...initFormData },
queryParams: {
pageNum: 1,
pageSize: 10,
schemeName: undefined,
schemeCode: undefined,
academicYear: undefined,
semester: undefined,
status: undefined,
selfEvaluationRequired: undefined,
superiorEvaluationRequired: undefined,
params: {}
},
rules: {
schemeName: [{ required: true, message: '方案名称不能为空', trigger: 'blur' }],
schemeCode: [{ required: true, message: '方案编码不能为空', trigger: 'blur' }],
academicYear: [{ required: true, message: '学年不能为空', trigger: 'blur' }],
semester: [{ required: true, message: '学期不能为空', trigger: 'change' }],
selfEvaluationRequired: [{ required: true, message: '是否需要自评不能为空', trigger: 'change' }],
superiorEvaluationRequired: [{ required: true, message: '是否需要上级评不能为空', trigger: 'change' }],
status: [{ required: true, message: '状态不能为空', trigger: 'change' }]
}
});
const { queryParams, form, rules } = toRefs(data);
/** 查询考核方案列表 */
const getList = async () => {
loading.value = true;
try {
const res = await listBmzrAssessmentScheme(queryParams.value);
schemeList.value = res.rows;
total.value = res.total;
} catch (error) {
console.error('获取考核方案列表失败:', error);
} finally {
loading.value = false;
}
};
/** 取消按钮 */
const cancel = () => {
reset();
dialog.visible = false;
};
/** 表单重置 */
const reset = () => {
form.value = { ...initFormData };
schemeFormRef.value?.resetFields();
};
/** 搜索按钮操作 */
const handleQuery = () => {
queryParams.value.pageNum = 1;
getList();
};
/** 重置按钮操作 */
const resetQuery = () => {
queryFormRef.value?.resetFields();
handleQuery();
};
/** 多选框选中数据 */
const handleSelectionChange = (selection: BmzrAssessmentSchemeVO[]) => {
ids.value = selection.map((item) => item.id);
single.value = selection.length != 1;
multiple.value = !selection.length;
};
/** 新增按钮操作 */
const handleAdd = () => {
reset();
dialog.visible = true;
dialog.title = '添加考核方案';
};
/** 修改按钮操作 */
const handleUpdate = async (row?: BmzrAssessmentSchemeVO) => {
reset();
const _id = row?.id || ids.value[0];
const res = await getBmzrAssessmentScheme(_id);
Object.assign(form.value, res.data);
dialog.visible = true;
dialog.title = '修改考核方案';
};
/** 提交按钮 */
const submitForm = () => {
schemeFormRef.value?.validate(async (valid: boolean) => {
if (valid) {
buttonLoading.value = true;
try {
if (form.value.id) {
await updateBmzrAssessmentScheme(form.value);
} else {
await addBmzrAssessmentScheme(form.value);
}
proxy?.$modal.msgSuccess('操作成功');
dialog.visible = false;
await getList();
} catch (error) {
proxy?.$modal.msgError('操作失败');
} finally {
buttonLoading.value = false;
}
}
});
};
/** 删除按钮操作 */
const handleDelete = async (row?: BmzrAssessmentSchemeVO) => {
const _ids = row?.id || ids.value;
try {
await proxy?.$modal.confirm('是否确认删除考核方案编号为"' + _ids + '"的数据项?');
await delBmzrAssessmentScheme(_ids);
proxy?.$modal.msgSuccess('删除成功');
await getList();
} catch (error) {
if (error !== 'cancel') {
proxy?.$modal.msgError('删除失败');
}
}
};
/** 指标体系管理按钮操作 */
const handleIndicatorManagement = (row: BmzrAssessmentSchemeVO) => {
indicatorManagementRef.value?.open(row.id);
};
onMounted(() => {
getList();
});
</script>
<style scoped>
/* 页面容器样式 */
.page-container {
padding: 8px;
}
/* 表格卡片布局 */
.table-card {
margin-top: 0;
}
.table-card :deep(.el-card__body) {
padding: 0px 20px 20px 20px !important;
}
/* 表格容器 - 支持横向滚动 */
.table-container {
width: 100%;
margin-bottom: 0;
}
/* 横向滚动表格样式 */
.scroll-table {
width: 100%;
}
/* 表格横向滚动条样式优化 */
.scroll-table :deep(.el-table__body-wrapper) {
overflow-x: auto !important;
overflow-y: auto;
}
.scroll-table :deep(.el-table__header-wrapper) {
overflow-x: hidden;
}
/* 强制显示表格横向滚动条 - 适用于所有浏览器 */
.scroll-table :deep(.el-table__body-wrapper) {
scrollbar-width: thin;
scrollbar-color: #409eff #f0f0f0;
}
/* Webkit 浏览器的横向滚动条样式 */
.scroll-table :deep(.el-table__body-wrapper)::-webkit-scrollbar {
height: 12px !important;
width: 12px !important;
}
.scroll-table :deep(.el-table__body-wrapper)::-webkit-scrollbar-track {
background: #f0f0f0 !important;
border-radius: 6px !important;
border: 1px solid #e4e7ed !important;
}
.scroll-table :deep(.el-table__body-wrapper)::-webkit-scrollbar-thumb {
background: #409eff !important;
border-radius: 6px !important;
border: 2px solid #f0f0f0 !important;
min-height: 20px !important;
}
.scroll-table :deep(.el-table__body-wrapper)::-webkit-scrollbar-thumb:hover {
background: #337ecc !important;
}
.scroll-table :deep(.el-table__body-wrapper)::-webkit-scrollbar-thumb:active {
background: #2b6cb0 !important;
}
/* 确保滚动条始终可见的额外设置 */
.scroll-table :deep(.el-table__body-wrapper)::-webkit-scrollbar-corner {
background: #f0f0f0;
}
/* 分页容器样式 */
.pagination-container {
display: flex;
justify-content: flex-end;
padding: 16px 20px 0 0 !important;
background-color: #fff;
margin-top: 0px !important;
}
/* 移除按钮栏底部边框 */
.button-card :deep(.el-card__header) {
border-bottom: none !important;
}
/* 表单样式 */
.scheme-form {
padding: 20px;
}
.scheme-form .el-form-item {
margin-bottom: 18px;
}
.scheme-form .el-input,
.scheme-form .el-select {
width: 100%;
}
.scheme-form .el-textarea {
width: 100%;
}
/* Dialog footer样式 */
.dialog-footer {
display: flex;
justify-content: flex-end;
gap: 12px;
}
</style>
@@ -0,0 +1,308 @@
<template>
<div class="p-2 page-container">
<!-- 班级标签页 -->
<el-card shadow="never" class="tab-card" v-if="teacherClasses.length > 0">
<el-tabs v-model="activeTab" @tab-click="handleTabClick">
<el-tab-pane
v-for="classItem in teacherClasses"
:key="classItem.id"
:label="classItem.className"
:name="classItem.id?.toString()"
>
<!-- 搜索区域 -->
<transition :enter-active-class="proxy?.animate.searchAnimate.enter" :leave-active-class="proxy?.animate.searchAnimate.leave">
<div v-show="showSearch" class="mb-[10px]">
<el-card shadow="hover">
<el-form :model="queryParams" ref="queryFormRef" label-width="100px">
<el-row :gutter="20">
<el-col :lg="6" :md="12" :sm="24">
<el-form-item label="计划名称" prop="planName">
<el-input v-model="queryParams.planName" placeholder="请输入计划名称" clearable @keyup.enter="handleQuery" />
</el-form-item>
</el-col>
<el-col :lg="6" :md="24" :sm="24">
<el-form-item>
<el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
<el-button icon="Refresh" @click="resetQuery">重置</el-button>
</el-form-item>
</el-col>
</el-row>
</el-form>
</el-card>
</div>
</transition>
<!-- 表格区域 -->
<el-card shadow="never" class="button-card table-card">
<template #header>
<el-row :gutter="10" class="mb8">
<el-col :span="1.5">
<el-button type="primary" plain icon="Edit" @click="() => handleSubmitAssessment()" :disabled="!hasSelectedPlan">提交考核</el-button>
</el-col>
<el-col :span="1.5">
<el-button type="success" plain icon="View" @click="() => handleViewAssessment()" :disabled="!hasSelectedPlan">查看考核</el-button>
</el-col>
<right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
</el-row>
</template>
<div class="table-container">
<el-table v-loading="loading" border :data="assessmentPlanList" @selection-change="handleSelectionChange" @sort-change="sortChange">
<el-table-column type="selection" width="55" align="center" />
<el-table-column label="计划名称" align="center" prop="planName" :show-overflow-tooltip="true" />
<el-table-column label="计划编码" align="center" prop="planCode" :show-overflow-tooltip="true" />
<el-table-column label="考核方案" align="center" prop="schemeName" :show-overflow-tooltip="true" />
<el-table-column label="学年学期" align="center" width="120">
<template #default="scope">
<span>{{ scope.row.academicYear }}{{ scope.row.semester === '1' ? '上' : '下' }}学期</span>
</template>
</el-table-column>
<el-table-column label="计划时间" align="center" width="180">
<template #default="scope">
<span>{{ parseTime(scope.row.planStartTime, '{y}-{m}-{d}') }} 至 {{ parseTime(scope.row.planEndTime, '{y}-{m}-{d}') }}</span>
</template>
</el-table-column>
<el-table-column label="数据提取时间" align="center" width="180">
<template #default="scope">
<span v-if="scope.row.dataExtractStartTime && scope.row.dataExtractEndTime">
{{ parseTime(scope.row.dataExtractStartTime, '{y}-{m}-{d}') }} 至 {{ parseTime(scope.row.dataExtractEndTime, '{y}-{m}-{d}') }}
</span>
<span v-else class="text-gray-400">未设置</span>
</template>
</el-table-column>
<el-table-column label="创建时间" align="center" prop="createTime" width="180">
<template #default="scope">
<span>{{ parseTime(scope.row.createTime, '{y}-{m}-{d} {h}:{i}:{s}') }}</span>
</template>
</el-table-column>
<el-table-column label="操作" align="center" class-name="small-padding fixed-width">
<template #default="scope">
<el-tooltip content="提交考核" placement="top">
<el-button link type="primary" icon="Edit" @click="handleSubmitAssessment(scope.row)">提交考核</el-button>
</el-tooltip>
<el-tooltip content="查看考核" placement="top">
<el-button link type="success" icon="View" @click="handleViewAssessment(scope.row)">查看考核</el-button>
</el-tooltip>
</template>
</el-table-column>
</el-table>
</div>
<div class="pagination-container">
<pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" @pagination="getList" />
</div>
</el-card>
</el-tab-pane>
</el-tabs>
</el-card>
<!-- 无班级提示 -->
<el-card shadow="never" v-else-if="!loading && teacherClasses.length === 0">
<el-empty description="您暂时没有担任班主任的班级" />
</el-card>
</div>
</template>
<script setup name="TeacherAssessment" lang="ts">
import {
listTeacherClasses,
listTeacherAssessmentPlans,
submitAssessment,
getAssessmentDetail
} from '@/api/bzrkh/teacherAssessment';
import {
TeacherClassVO,
TeacherAssessmentPlanVO,
TeacherAssessmentPlanQuery
} from '@/api/bzrkh/teacherAssessment/types';
import { useUserStore } from '@/store/modules/user';
const { proxy } = getCurrentInstance() as ComponentInternalInstance;
const userStore = useUserStore();
const teacherClasses = ref<TeacherClassVO[]>([]);
const assessmentPlanList = ref<TeacherAssessmentPlanVO[]>([]);
const loading = ref(true);
const showSearch = ref(true);
const activeTab = ref<string>('');
const selectedPlans = ref<TeacherAssessmentPlanVO[]>([]);
const hasSelectedPlan = ref(false);
const total = ref(0);
const queryFormRef = ref<ElFormInstance>();
const data = reactive<PageData<any, TeacherAssessmentPlanQuery>>({
form: {},
queryParams: {
pageNum: 1,
pageSize: 10,
planName: undefined,
planStatus: '1' // 只查询启用状态的计划
},
rules: {}
});
const { queryParams } = toRefs(data);
/** 获取班主任管理的班级列表 */
const getTeacherClasses = async () => {
loading.value = true;
try {
const res = await listTeacherClasses({
teacherId: userStore.userId,
classStatus: '1' // 只获取正常状态的班级
});
teacherClasses.value = res.data || [];
if (teacherClasses.value.length > 0) {
// 默认选中第一个班级
activeTab.value = teacherClasses.value[0].id?.toString() || '';
await getList();
}
} catch (error) {
console.error('获取班级列表失败:', error);
} finally {
loading.value = false;
}
};
/** 查询考核计划列表 */
const getList = async () => {
loading.value = true;
try {
const res = await listTeacherAssessmentPlans(queryParams.value);
assessmentPlanList.value = res.rows || [];
total.value = res.total || 0;
} catch (error) {
console.error('获取考核计划列表失败:', error);
} finally {
loading.value = false;
}
};
/** 标签页切换 */
const handleTabClick = (tab: any) => {
queryParams.value.pageNum = 1;
getList();
};
/** 搜索按钮操作 */
const handleQuery = () => {
queryParams.value.pageNum = 1;
getList();
};
/** 重置按钮操作 */
const resetQuery = () => {
queryFormRef.value?.resetFields();
handleQuery();
};
/** 多选框选中数据 */
const handleSelectionChange = (selection: TeacherAssessmentPlanVO[]) => {
selectedPlans.value = selection;
hasSelectedPlan.value = selection.length > 0;
};
/** 排序触发事件 */
const sortChange = (column: any) => {
const { prop, order } = column;
if (prop === 'createTime') {
queryParams.value.orderByColumn = prop;
queryParams.value.isAsc = order === 'ascending' ? 'asc' : 'desc';
getList();
}
};
/** 提交考核 */
const handleSubmitAssessment = async (row?: TeacherAssessmentPlanVO) => {
const plans = row ? [row] : selectedPlans.value;
if (plans.length === 0) {
proxy?.$modal.msgWarning('请选择要提交考核的计划');
return;
}
const planNames = plans.map(p => p.planName).join('、');
const currentClass = teacherClasses.value.find(c => c.id?.toString() === activeTab.value);
await proxy?.$modal.confirm(`确认要提交班级"${currentClass?.className}"的考核计划"${planNames}"吗?`).then(async () => {
// TODO: 实现提交考核逻辑
proxy?.$modal.msg('提交考核功能待实现');
});
};
/** 查看考核 */
const handleViewAssessment = async (row?: TeacherAssessmentPlanVO) => {
const plans = row ? [row] : selectedPlans.value;
if (plans.length === 0) {
proxy?.$modal.msgWarning('请选择要查看考核的计划');
return;
}
// TODO: 实现查看考核逻辑
proxy?.$modal.msg('查看考核功能待实现');
};
onMounted(() => {
getTeacherClasses();
});
</script>
<style scoped>
/* 页面容器样式 */
.page-container {
padding: 8px;
}
/* 标签页卡片 */
.tab-card {
margin-bottom: 0;
}
.tab-card :deep(.el-card__body) {
padding: 20px;
}
/* 表格卡片布局 */
.table-card {
margin-top: 0;
}
.table-card :deep(.el-card__body) {
padding: 0px 20px 20px 20px !important;
}
/* 表格主体 */
.table-container {
margin-bottom: 0;
}
/* 移除按钮栏底部边框 */
.button-card :deep(.el-card__header) {
border-bottom: none !important;
}
/* 分页容器样式 */
.pagination-container {
display: flex;
justify-content: flex-end;
padding: 16px 20px 0 0 !important;
background-color: #fff;
margin-top: 0px !important;
}
/* 标签页样式优化 */
:deep(.el-tabs__header) {
margin-bottom: 20px;
}
:deep(.el-tabs__nav-wrap) {
padding: 0 20px;
background-color: #f5f7fa;
border-radius: 6px;
}
:deep(.el-tabs__item) {
font-weight: 500;
}
</style>