提交代码修改为准

This commit is contained in:
zlwu committed 2025-07-15 10:12:21 +08:00
1 parent eaad94f10b
commit 9dff23fc68
22 files changed
+373 -299

No files matched your search

+7 -1
View File
@@ -54,7 +54,7 @@
<maven-jar-plugin.version>3.2.2</maven-jar-plugin.version>
<maven-war-plugin.version>3.2.2</maven-war-plugin.version>
<maven-compiler-plugin.version>3.11.0</maven-compiler-plugin.version>
<maven-surefire-plugin.version>3.1.2</maven-surefire-plugin.version>
<maven-surefire-plugin.version>2.22.2</maven-surefire-plugin.version>
<flatten-maven-plugin.version>1.3.0</flatten-maven-plugin.version>
<!-- 打包默认跳过测试 -->
<skipTests>true</skipTests>
@@ -460,6 +460,12 @@
<groups>${profiles.active}</groups>
<!-- 排除标签 -->
<excludedGroups>exclude</excludedGroups>
<parallel>none</parallel> <!-- 彻底禁用并行 -->
<threadCount>1</threadCount> <!-- 单线程 -->
<forkCount>1</forkCount> <!-- 单独 fork 进程 -->
<reuseForks>false</reuseForks> <!-- 不重用 fork -->
<argLine>-Xmx1024m -XX:MaxPermSize=256m</argLine>
<timeout>60000</timeout> <!-- 60秒超时 -->
</configuration>
</plugin>
<!-- 统一版本号管理 -->
+1 -6
View File
@@ -112,12 +112,7 @@
<groupId>org.dromara</groupId>
<artifactId>ruoyi-xg</artifactId>
</dependency>
<!-- 学工管理-学生信息管理模块 -->
<dependency>
<groupId>org.dromara</groupId>
<artifactId>ruoyi-xg-xx</artifactId>
<version>${revision}</version>
</dependency>
<!-- 招生就业管理模块 -->
<dependency>
<groupId>org.dromara</groupId>
@@ -0,0 +1,38 @@
package org.dromara.common.web.config;
import org.springframework.context.annotation.Configuration;
import org.springframework.format.FormatterRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import org.springframework.boot.autoconfigure.AutoConfiguration;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Lazy;
@Configuration
public class DateFormatConfig implements WebMvcConfigurer {
private static final String[] patterns = new String[] {
"yyyy-MM-dd HH:mm:ss",
"yyyy-MM-dd"
// 你可以继续添加其他格式,比如"yyyy/MM/dd"等
};
@Override
public void addFormatters(FormatterRegistry registry) {
registry.addConverter(String.class, Date.class, source -> {
if (source == null || source.trim().isEmpty()) {
return null;
}
for (String pattern : patterns) {
try {
return new SimpleDateFormat(pattern).parse(source.trim());
} catch (ParseException ignored) {
}
}
throw new IllegalArgumentException("日期格式错误:" + source);
});
}
}
@@ -28,9 +28,10 @@ public class HqSatCategory extends TenantEntity {
private Long id;
/**
* 删除标志
* 删除标志(0代表存在 1代表删除)
*/
private Long deleted;
@TableLogic(value = "0", delval = "1")
private Integer deleted;
/**
* 分类编码
@@ -62,5 +63,4 @@ public class HqSatCategory extends TenantEntity {
*/
private String remark;
}
@@ -30,6 +30,7 @@ public class HqSatOption extends TenantEntity {
/**
* 删除标志
*/
@TableLogic(value = "0", delval = "1")
private Long deleted;
/**
@@ -57,5 +58,4 @@ public class HqSatOption extends TenantEntity {
*/
private String remark;
}
@@ -30,6 +30,7 @@ public class HqSatQuestion extends TenantEntity {
/**
* 删除标志
*/
@TableLogic(value = "0", delval = "1")
private Long deleted;
/**
@@ -72,5 +73,4 @@ public class HqSatQuestion extends TenantEntity {
*/
private String remark;
}
@@ -29,7 +29,7 @@ public class HqSatCategoryBo extends BaseEntity {
/**
* 删除标志
*/
private Long deleted;
private Integer deleted;
/**
* 分类编码
@@ -63,5 +63,4 @@ public class HqSatCategoryBo extends BaseEntity {
*/
private String remark;
}
@@ -1,16 +1,18 @@
package org.dromara.hq.domain.bo;
import org.dromara.hq.domain.HqSatSurvey;
import org.dromara.common.mybatis.core.domain.BaseEntity;
import org.dromara.common.core.validate.AddGroup;
import org.dromara.common.core.validate.EditGroup;
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 jakarta.validation.constraints.*;
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.hq.domain.HqSatSurvey;
import java.util.Date;
import java.util.List;
import com.fasterxml.jackson.annotation.JsonFormat;
/**
* 问卷业务对象 hq_sat_survey
@@ -66,14 +68,26 @@ public class HqSatSurveyBo extends BaseEntity {
* 开始时间
*/
@NotNull(message = "开始时间不能为空", groups = { AddGroup.class, EditGroup.class })
@JsonFormat(pattern = "yyyy-MM-dd")
private Date startTime;
/**
* 结束时间
*/
@NotNull(message = "结束时间不能为空", groups = { AddGroup.class, EditGroup.class })
@JsonFormat(pattern = "yyyy-MM-dd")
private Date endTime;
/**
* 开始时间查询参数(字符串格式)
*/
private String startTimeStr;
/**
* 结束时间查询参数(字符串格式)
*/
private String endTimeStr;
/**
* 最大提交次数
*/
@@ -40,7 +40,7 @@ public class HqSatCategoryServiceImpl implements IHqSatCategoryService {
* @return 题目分类
*/
@Override
public HqSatCategoryVo queryById(Long id){
public HqSatCategoryVo queryById(Long id) {
return baseMapper.selectVoById(id);
}
@@ -75,7 +75,7 @@ public class HqSatCategoryServiceImpl implements IHqSatCategoryService {
LambdaQueryWrapper<HqSatCategory> lqw = Wrappers.lambdaQuery();
lqw.orderByAsc(HqSatCategory::getId);
lqw.eq(bo.getDeleted() != null, HqSatCategory::getDeleted, bo.getDeleted());
lqw.eq(StringUtils.isNotBlank(bo.getCategoryCode()), HqSatCategory::getCategoryCode, bo.getCategoryCode());
lqw.like(StringUtils.isNotBlank(bo.getCategoryCode()), HqSatCategory::getCategoryCode, bo.getCategoryCode());
lqw.like(StringUtils.isNotBlank(bo.getCategoryName()), HqSatCategory::getCategoryName, bo.getCategoryName());
lqw.eq(StringUtils.isNotBlank(bo.getCategoryDesc()), HqSatCategory::getCategoryDesc, bo.getCategoryDesc());
lqw.eq(bo.getSortOrder() != null, HqSatCategory::getSortOrder, bo.getSortOrder());
@@ -116,8 +116,8 @@ public class HqSatCategoryServiceImpl implements IHqSatCategoryService {
/**
* 保存前的数据校验
*/
private void validEntityBeforeSave(HqSatCategory entity){
//TODO 做一些数据校验,如唯一约束
private void validEntityBeforeSave(HqSatCategory entity) {
// TODO 做一些数据校验,如唯一约束
}
/**
@@ -129,9 +129,10 @@ public class HqSatCategoryServiceImpl implements IHqSatCategoryService {
*/
@Override
public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
if(isValid){
//TODO 做一些业务上的校验,判断是否需要校验
if (isValid) {
// TODO 做一些业务上的校验,判断是否需要校验
}
// 逻辑删除实现
return baseMapper.deleteByIds(ids) > 0;
}
}
@@ -40,7 +40,7 @@ public class HqSatOptionServiceImpl implements IHqSatOptionService {
* @return 评分选项
*/
@Override
public HqSatOptionVo queryById(Long id){
public HqSatOptionVo queryById(Long id) {
return baseMapper.selectVoById(id);
}
@@ -75,7 +75,7 @@ public class HqSatOptionServiceImpl implements IHqSatOptionService {
LambdaQueryWrapper<HqSatOption> lqw = Wrappers.lambdaQuery();
lqw.orderByAsc(HqSatOption::getId);
lqw.eq(bo.getDeleted() != null, HqSatOption::getDeleted, bo.getDeleted());
lqw.eq(StringUtils.isNotBlank(bo.getOptionText()), HqSatOption::getOptionText, bo.getOptionText());
lqw.like(StringUtils.isNotBlank(bo.getOptionText()), HqSatOption::getOptionText, bo.getOptionText());
lqw.eq(bo.getOptionValue() != null, HqSatOption::getOptionValue, bo.getOptionValue());
lqw.eq(bo.getSortOrder() != null, HqSatOption::getSortOrder, bo.getSortOrder());
lqw.eq(StringUtils.isNotBlank(bo.getStatus()), HqSatOption::getStatus, bo.getStatus());
@@ -115,8 +115,8 @@ public class HqSatOptionServiceImpl implements IHqSatOptionService {
/**
* 保存前的数据校验
*/
private void validEntityBeforeSave(HqSatOption entity){
//TODO 做一些数据校验,如唯一约束
private void validEntityBeforeSave(HqSatOption entity) {
// TODO 做一些数据校验,如唯一约束
}
/**
@@ -128,8 +128,8 @@ public class HqSatOptionServiceImpl implements IHqSatOptionService {
*/
@Override
public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
if(isValid){
//TODO 做一些业务上的校验,判断是否需要校验
if (isValid) {
// TODO 做一些业务上的校验,判断是否需要校验
}
return baseMapper.deleteByIds(ids) > 0;
}
@@ -40,7 +40,7 @@ public class HqSatQuestionServiceImpl implements IHqSatQuestionService {
* @return 题库
*/
@Override
public HqSatQuestionVo queryById(Long id){
public HqSatQuestionVo queryById(Long id) {
return baseMapper.selectVoById(id);
}
@@ -75,8 +75,9 @@ public class HqSatQuestionServiceImpl implements IHqSatQuestionService {
LambdaQueryWrapper<HqSatQuestion> lqw = Wrappers.lambdaQuery();
lqw.orderByAsc(HqSatQuestion::getId);
lqw.eq(bo.getDeleted() != null, HqSatQuestion::getDeleted, bo.getDeleted());
lqw.eq(StringUtils.isNotBlank(bo.getQuestionTitle()), HqSatQuestion::getQuestionTitle, bo.getQuestionTitle());
lqw.eq(StringUtils.isNotBlank(bo.getQuestionContent()), HqSatQuestion::getQuestionContent, bo.getQuestionContent());
lqw.like(StringUtils.isNotBlank(bo.getQuestionTitle()), HqSatQuestion::getQuestionTitle, bo.getQuestionTitle());
lqw.eq(StringUtils.isNotBlank(bo.getQuestionContent()), HqSatQuestion::getQuestionContent,
bo.getQuestionContent());
lqw.eq(bo.getCategoryId() != null, HqSatQuestion::getCategoryId, bo.getCategoryId());
lqw.eq(StringUtils.isNotBlank(bo.getQuestionType()), HqSatQuestion::getQuestionType, bo.getQuestionType());
lqw.eq(bo.getIsRequired() != null, HqSatQuestion::getIsRequired, bo.getIsRequired());
@@ -118,8 +119,8 @@ public class HqSatQuestionServiceImpl implements IHqSatQuestionService {
/**
* 保存前的数据校验
*/
private void validEntityBeforeSave(HqSatQuestion entity){
//TODO 做一些数据校验,如唯一约束
private void validEntityBeforeSave(HqSatQuestion entity) {
// TODO 做一些数据校验,如唯一约束
}
/**
@@ -131,8 +132,8 @@ public class HqSatQuestionServiceImpl implements IHqSatQuestionService {
*/
@Override
public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
if(isValid){
//TODO 做一些业务上的校验,判断是否需要校验
if (isValid) {
// TODO 做一些业务上的校验,判断是否需要校验
}
return baseMapper.deleteByIds(ids) > 0;
}
@@ -40,6 +40,9 @@ import org.dromara.common.core.exception.ServiceException;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import java.text.SimpleDateFormat;
import java.text.ParseException;
/**
* 问卷Service业务层处理
*
@@ -107,8 +110,35 @@ public class HqSatSurveyServiceImpl implements IHqSatSurveyService {
lqw.eq(StringUtils.isNotBlank(bo.getSurveyInstruction()), HqSatSurvey::getSurveyInstruction,
bo.getSurveyInstruction());
lqw.eq(StringUtils.isNotBlank(bo.getTargetGroup()), HqSatSurvey::getTargetGroup, bo.getTargetGroup());
lqw.eq(bo.getStartTime() != null, HqSatSurvey::getStartTime, bo.getStartTime());
lqw.eq(bo.getEndTime() != null, HqSatSurvey::getEndTime, bo.getEndTime());
// 处理时间查询参数:优先使用字符串格式的时间参数
Date startTimeQuery = null;
Date endTimeQuery = null;
// 如果有字符串格式的时间参数,优先使用
if (StringUtils.isNotBlank(bo.getStartTimeStr())) {
startTimeQuery = parseDateTime(bo.getStartTimeStr());
} else if (bo.getStartTime() != null) {
startTimeQuery = bo.getStartTime();
}
if (StringUtils.isNotBlank(bo.getEndTimeStr())) {
endTimeQuery = parseDateTime(bo.getEndTimeStr());
} else if (bo.getEndTime() != null) {
endTimeQuery = bo.getEndTime();
}
// 时间范围查询逻辑:
// 如果用户选择了开始时间,查找预约开始时间 >= 用户选择时间的记录
// 这样查询出的记录的开始时间都会比用户选择的时间晚或相等(用户选择的时间比数据库中的早)
lqw.ge(startTimeQuery != null, HqSatSurvey::getStartTime, startTimeQuery);
// 如果用户选择了结束时间,查找预约结束时间 <= 用户选择时间的记录
// 这样查询出的记录的结束时间都会比用户选择的时间早或相等(用户选择的时间比数据库中的晚)
lqw.le(endTimeQuery != null, HqSatSurvey::getEndTime, endTimeQuery);
// lqw.eq(bo.getStartTime() != null, HqSatSurvey::getStartTime,
// bo.getStartTime());
// lqw.eq(bo.getEndTime() != null, HqSatSurvey::getEndTime, bo.getEndTime());
lqw.eq(bo.getMaxSubmitTimes() != null, HqSatSurvey::getMaxSubmitTimes, bo.getMaxSubmitTimes());
lqw.eq(bo.getIsAnonymous() != null, HqSatSurvey::getIsAnonymous, bo.getIsAnonymous());
lqw.eq(bo.getIsPublished() != null, HqSatSurvey::getIsPublished, bo.getIsPublished());
@@ -123,6 +153,22 @@ public class HqSatSurveyServiceImpl implements IHqSatSurveyService {
return lqw;
}
/**
* 解析日期时间字符串
*/
private Date parseDateTime(String dateTimeStr) {
if (StringUtils.isBlank(dateTimeStr)) {
return null;
}
try {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
return sdf.parse(dateTimeStr);
} catch (ParseException e) {
log.warn("日期格式解析失败: {}", dateTimeStr, e);
return null;
}
}
/**
* 新增问卷
*
@@ -217,6 +217,16 @@
- **权限配置**: `docs/设计文档/database/12-class-cadre-management-menu.sql`
- **开发规范**: `.cursor/cursorrules-backend.md`、`.cursor/cursorrules-frontend.md`
### 2025-07-01 逻辑删除规范完善(by cursor)
- 【后端】HqSatCategory实体类deleted字段添加@TableLogic注解,类型改为Integer,符合MyBatis-Plus逻辑删除规范。
- 【后端】HqSatCategoryBo、HqSatCategoryVo的deleted字段类型统一为Integer。
- 【后端】HqSatCategoryServiceImpl.deleteWithValidByIds方法实现改为逻辑删除(update deleted=1),彻底禁止物理删除。
- 【文档】API文档基础规范.md补充逻辑删除规范说明。
- 【前端】删除按钮提示语优化,明确为逻辑删除。
> 本次调整严格落实项目强制性逻辑删除规范,确保数据安全可恢复,前后端及文档同步更新。
---
**记录完成时间**: 2025-01-08 15:30:00
@@ -539,3 +539,18 @@ public List<${ClassName}VO> queryList(${ClassName}BO bo) {
- 更新人:wuzilong
- 基于实际项目开发经验总结
- 持续补充和优化
## 逻辑删除规范(2025-07-01更新)
- 所有删除操作必须为逻辑删除,禁止物理删除。
- 实体类需使用@TableLogic注解,deleted字段类型为Integer,0代表存在,1代表删除。
- 删除接口实际为将deleted字段置为1,数据不会被物理移除。
- 前端需在删除提示中明确“本操作为逻辑删除,数据不会被物理移除,可在后台恢复”。
- 参考示例:
```java
@TableLogic
private Integer deleted; // 0-存在,1-删除
```
- 适用范围:所有业务表、VO、BO、API接口。
+47 -15
View File
@@ -1,36 +1,68 @@
org.dromara.hq.domain.vo.HqPmRepairProgressVo
org.dromara.system.domain.vo.SysNoticeVo
org.dromara.system.domain.bo.SysDictDataBo
org.dromara.system.domain.bo.SysNoticeBo
org.dromara.system.domain.vo.SysClientVo
org.dromara.hq.domain.vo.HqPmRepairOrderVo
org.dromara.hq.domain.vo.HqSatSurveyQuestionVo
org.dromara.hq.domain.vo.HqPmRepairCategoryVo
org.dromara.hq.domain.bo.HqSatOptionBo
org.dromara.hq.domain.vo.HqSatCategoryVo
org.dromara.system.domain.vo.SysConfigVo
org.dromara.hq.domain.bo.HqPmRepairAttachmentBo
org.dromara.hq.domain.bo.HqHallInfoBo
org.dromara.hq.domain.vo.HqVenueInfoVo
org.dromara.system.domain.vo.SysDeptVo
org.dromara.hq.domain.bo.HqSatSurveyBo
org.dromara.hq.domain.vo.HqVenueReservationVo
org.dromara.system.domain.bo.SysDictTypeBo
org.dromara.system.domain.bo.SysDeptBo
org.dromara.system.domain.vo.SysOssConfigVo
org.dromara.hq.domain.vo.HqSatSurveyVo
org.dromara.hq.domain.vo.HqSatRecordVo
org.dromara.hq.domain.bo.HqHallReservationBo
org.dromara.hq.domain.bo.HqPmServiceEvaluationBo
org.dromara.hq.domain.bo.HqSatRecordBo
org.dromara.workflow.domain.vo.TestLeaveVo
org.dromara.system.domain.bo.SysSocialBo
org.dromara.system.domain.bo.SysTenantPackageBo
org.dromara.test.domain.vo.XgStuMsgVo
org.dromara.system.domain.vo.SysDictTypeVo
org.dromara.hq.domain.bo.HqSatQuestionBo
org.dromara.workflow.domain.bo.TestLeaveBo
org.dromara.hq.domain.bo.HqSatDetailBo
org.dromara.hq.domain.bo.HqVenueInfoBo
org.dromara.hq.domain.bo.HqPmRepairProgressBo
org.dromara.hq.domain.vo.HqPmRepairAttachmentVo
org.dromara.hq.domain.bo.HqPmRepairOrderBo
org.dromara.system.domain.vo.SysTenantPackageVo
org.dromara.system.domain.vo.SysSocialVo
org.dromara.hq.domain.bo.HqSatCategoryBo
org.dromara.hq.domain.vo.HqSatDetailVo
org.dromara.system.domain.vo.SysRoleVo
org.dromara.system.domain.bo.SysPostBo
org.dromara.system.domain.bo.SysClientBo
org.dromara.hq.domain.vo.HqHallInfoVo
org.dromara.system.domain.bo.SysConfigBo
org.dromara.web.domain.vo.TenantListVo
org.dromara.system.domain.bo.SysLogininforBo
org.dromara.hq.domain.vo.HqPmRepairProgressVo
org.dromara.hq.domain.vo.HqPmRepairCategoryVo
org.dromara.hq.domain.bo.HqSatOptionBo
org.dromara.system.domain.bo.SysOssBo
org.dromara.system.domain.vo.SysMenuVo
org.dromara.hq.domain.vo.HqSatCategoryVo
org.dromara.system.domain.vo.SysUserVo
org.dromara.hq.domain.vo.HqVenueInfoVo
org.dromara.system.domain.bo.SysTenantBo
org.dromara.system.domain.bo.SysOssConfigBo
org.dromara.system.domain.bo.SysMenuBo
org.dromara.hq.domain.vo.HqVenueReservationVo
org.dromara.system.domain.vo.SysOperLogVo
org.dromara.system.domain.vo.SysLogininforVo
org.dromara.hq.domain.bo.HqSatDetailBo
org.dromara.test.domain.bo.XgStuMsgBo
org.dromara.hq.domain.bo.HqVenueInfoBo
org.dromara.system.domain.bo.SysUserBo
org.dromara.system.domain.vo.SysOssVo
org.dromara.hq.domain.bo.HqPmRepairCategoryBo
org.dromara.hq.domain.vo.HqPmServiceEvaluationVo
org.dromara.hq.domain.vo.HqSatOptionVo
org.dromara.hq.domain.vo.HqHallReservationVo
org.dromara.workflow.domain.vo.FlowCategoryVo
org.dromara.hq.domain.bo.HqSatCategoryBo
org.dromara.hq.domain.vo.HqSatDetailVo
org.dromara.system.domain.vo.SysTenantVo
org.dromara.hq.domain.vo.HqSatQuestionVo
org.dromara.hq.domain.bo.HqSatSurveyQuestionBo
org.dromara.system.domain.vo.SysDictDataVo
org.dromara.hq.domain.bo.HqVenueReservationBo
org.dromara.workflow.domain.bo.FlowCategoryBo
org.dromara.hq.domain.vo.HqHallInfoVo
org.dromara.system.domain.bo.SysRoleBo
org.dromara.system.domain.vo.SysPostVo
-1
View File
@@ -1 +0,0 @@
org.dromara.system.domain.bo.SysOperLogBo
+2
View File
@@ -0,0 +1,2 @@
org.dromara.web.domain.vo.TenantListVoToSysTenantVoMapper
org.dromara.system.domain.vo.SysTenantVoToTenantListVoMapper
+4 -4
View File
@@ -266,21 +266,21 @@ const handleDelete = async (row?: SatCategoryVO) => {
if (row) {
// 单个删除
confirmMessage = `是否确认删除题目分类"${row.categoryName}(${row.categoryCode})"的数据项?`;
confirmMessage = `是否确认删除题目分类\"${row.categoryName}(${row.categoryCode})\"的数据项?\n\n【提示】本操作为逻辑删除,数据不会被物理移除,可在后台恢复。`;
} else {
// 批量删除
const selectedRows = satCategoryList.value.filter((item) => ids.value.includes(item.id));
if (selectedRows.length === 1) {
confirmMessage = `是否确认删除题目分类"${selectedRows[0].categoryName}(${selectedRows[0].categoryCode})"的数据项?`;
confirmMessage = `是否确认删除题目分类\"${selectedRows[0].categoryName}(${selectedRows[0].categoryCode})\"的数据项?\n\n【提示】本操作为逻辑删除,数据不会被物理移除,可在后台恢复。`;
} else {
const categoryNames = selectedRows.map((item) => `${item.categoryName}(${item.categoryCode})`).join('、');
confirmMessage = `是否确认删除题目分类"${categoryNames}"的数据项?`;
confirmMessage = `是否确认删除题目分类\"${categoryNames}\"的数据项?\n\n【提示】本操作为逻辑删除,数据不会被物理移除,可在后台恢复。`;
}
}
await proxy?.$modal.confirm(confirmMessage).finally(() => (loading.value = false));
await delSatCategory(_ids);
proxy?.$modal.msgSuccess('删除成功');
proxy?.$modal.msgSuccess('已逻辑删除');
await getList();
};
+4 -4
View File
@@ -257,22 +257,22 @@ const handleDelete = async (row?: SatOptionVO) => {
let confirmMessage = '';
if (row) {
// 单项删除
confirmMessage = `是否确认删除评分选项"${row.optionText}(${row.optionValue}分)"?`;
confirmMessage = `是否确认删除评分选项\"${row.optionText}(${row.optionValue}分)\"?\n\n【提示】本操作为逻辑删除,数据不会被物理移除,可在后台恢复。`;
} else {
// 批量删除
const selectedItems = satOptionList.value.filter((item) => ids.value.includes(item.id));
if (selectedItems.length === 1) {
const item = selectedItems[0];
confirmMessage = `是否确认删除评分选项"${item.optionText}(${item.optionValue}分)"?`;
confirmMessage = `是否确认删除评分选项\"${item.optionText}(${item.optionValue}分)\"?\n\n【提示】本操作为逻辑删除,数据不会被物理移除,可在后台恢复。`;
} else {
const itemTexts = selectedItems.map((item) => `${item.optionText}(${item.optionValue}分)`).join('、');
confirmMessage = `是否确认删除以下评分选项:${itemTexts}?`;
confirmMessage = `是否确认删除以下评分选项:${itemTexts}?\n\n【提示】本操作为逻辑删除,数据不会被物理移除,可在后台恢复。`;
}
}
await proxy?.$modal.confirm(confirmMessage).finally(() => (loading.value = false));
await delSatOption(_ids);
proxy?.$modal.msgSuccess('删除成功');
proxy?.$modal.msgSuccess('已逻辑删除');
await getList();
};
+49 -24
View File
@@ -9,36 +9,50 @@
<el-option v-for="dict in sys_item_delete" :key="dict.value" :label="dict.label" :value="dict.value"/>
</el-select>
</el-form-item> -->
<el-form-item label="题目标题" prop="questionTitle">
<el-input v-model="queryParams.questionTitle" placeholder="请输入题目标题" clearable @keyup.enter="handleQuery" />
</el-form-item>
<el-form-item label="所属分类" prop="categoryId">
<el-select v-model="queryParams.categoryId" placeholder="请选择所属分类" clearable @change="handleQuery">
<el-option v-for="category in satCategoryList" :key="category.id" :label="category.categoryName" :value="category.id" />
</el-select>
</el-form-item>
<el-form-item label="题目类型" prop="questionType">
<el-select v-model="queryParams.questionType" placeholder="请选择题目类型" clearable>
<el-option v-for="dict in sys_question_category" :key="dict.value" :label="dict.label" :value="dict.value" />
</el-select>
</el-form-item>
<!-- <el-form-item label="是否必填" prop="isRequired">
<el-row :gutter="20">
<el-col :span="6">
<el-form-item label="题目标题" prop="questionTitle">
<el-input v-model="queryParams.questionTitle" placeholder="请输入题目标题" clearable @keyup.enter="handleQuery" />
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="所属分类" prop="categoryId">
<el-select v-model="queryParams.categoryId" placeholder="请选择所属分类" clearable @change="handleQuery">
<el-option v-for="category in satCategoryList" :key="category.id" :label="category.categoryName" :value="category.id" />
</el-select>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="题目类型" prop="questionType">
<el-select v-model="queryParams.questionType" placeholder="请选择题目类型" clearable>
<el-option v-for="dict in sys_question_category" :key="dict.value" :label="dict.label" :value="dict.value" />
</el-select>
</el-form-item>
</el-col>
<el-col :span="6">
<!-- <el-form-item label="是否必填" prop="isRequired">
<el-select v-model="queryParams.isRequired" placeholder="请选择是否必填" clearable>
<el-option v-for="dict in sys_item_required" :key="dict.value" :label="dict.label" :value="dict.value" />
</el-select>
</el-form-item> -->
<!-- <el-form-item label="排序" prop="sortOrder">
<!-- <el-form-item label="排序" prop="sortOrder">
<el-input v-model="queryParams.sortOrder" placeholder="请输入排序" clearable @keyup.enter="handleQuery" />
</el-form-item> -->
<el-form-item label="状态" prop="status">
<el-select v-model="queryParams.status" placeholder="请选择状态" clearable>
<el-option v-for="dict in sys_item_enable" :key="dict.value" :label="dict.label" :value="dict.value" />
</el-select>
</el-form-item>
<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-form-item label="状态" prop="status">
<el-select v-model="queryParams.status" placeholder="请选择状态" clearable>
<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="24" class="search-btn-container">
<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>
@@ -422,4 +436,15 @@ onMounted(() => {
max-width: 200px;
display: inline-block;
}
/* 搜索按钮容器样式 */
.search-btn-container {
display: flex;
justify-content: flex-end;
margin-top: 10px;
.el-form-item {
margin-bottom: 0 !important;
}
}
</style>
+101 -39
View File
@@ -3,57 +3,95 @@
<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" :inline="true">
<el-form ref="queryFormRef" :model="queryParams" label-width="100px">
<!-- <el-form-item label="删除标志" prop="deleted">
<el-select v-model="queryParams.deleted" placeholder="请选择删除标志" clearable >
<el-option v-for="dict in sys_item_delete" :key="dict.value" :label="dict.label" :value="dict.value"/>
</el-select>
</el-form-item> -->
<el-form-item label="问卷编号" prop="surveyCode">
<el-input v-model="queryParams.surveyCode" placeholder="请输入问卷编号" clearable @keyup.enter="handleQuery" />
</el-form-item>
<el-form-item label="问卷标题" prop="surveyTitle">
<el-input v-model="queryParams.surveyTitle" placeholder="请输入问卷标题" clearable @keyup.enter="handleQuery" />
</el-form-item>
<!-- <el-form-item label="问卷描述" prop="surveyDesc">
<el-row :gutter="20">
<el-col :span="6">
<el-form-item label="问卷编号" prop="surveyCode">
<el-input v-model="queryParams.surveyCode" placeholder="请输入问卷编号" clearable @keyup.enter="handleQuery" />
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="问卷标题" prop="surveyTitle">
<el-input v-model="queryParams.surveyTitle" placeholder="请输入问卷标题" clearable @keyup.enter="handleQuery" />
</el-form-item>
</el-col>
<el-col :span="6">
<!-- <el-form-item label="问卷描述" prop="surveyDesc">
<el-input v-model="queryParams.surveyDesc" placeholder="请输入问卷描述" clearable @keyup.enter="handleQuery" />
</el-form-item>
<el-form-item label="填写说明" prop="surveyInstruction">
<el-input v-model="queryParams.surveyInstruction" placeholder="请输入填写说明" clearable @keyup.enter="handleQuery" />
</el-form-item> -->
<el-form-item label="目标群体" prop="targetGroup">
<el-select v-model="queryParams.targetGroup" placeholder="请选择目标群体" clearable>
<el-option v-for="dict in sys_survey_people" :key="dict.value" :label="dict.label" :value="dict.value" />
</el-select>
</el-form-item>
<el-form-item label="开始时间" prop="startTime">
<el-date-picker clearable v-model="queryParams.startTime" type="date" value-format="YYYY-MM-DD" placeholder="请选择开始时间" />
</el-form-item>
<el-form-item label="结束时间" prop="endTime">
<el-date-picker clearable v-model="queryParams.endTime" type="date" value-format="YYYY-MM-DD" placeholder="请选择结束时间" />
</el-form-item>
<!-- <el-form-item label="最大提交次数" prop="maxSubmitTimes">
<el-form-item label="目标群体" prop="targetGroup">
<el-select v-model="queryParams.targetGroup" placeholder="请选择目标群体" clearable>
<el-option v-for="dict in sys_survey_people" :key="dict.value" :label="dict.label" :value="dict.value" />
</el-select>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="开始时间" prop="startTime">
<el-date-picker
clearable
v-model="queryParams.startTime"
type="date"
value-format="YYYY-MM-DD"
placeholder="请选择开始时间"
style="width: 100%"
/>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="6">
<el-form-item label="结束时间" prop="endTime">
<el-date-picker
clearable
v-model="queryParams.endTime"
type="date"
value-format="YYYY-MM-DD"
placeholder="请选择结束时间"
style="width: 100%"
/>
</el-form-item>
</el-col>
<el-col :span="6">
<!-- <el-form-item label="最大提交次数" prop="maxSubmitTimes">
<el-input v-model="queryParams.maxSubmitTimes" placeholder="请输入最大提交次数" clearable @keyup.enter="handleQuery" />
</el-form-item> -->
<el-form-item label="是否匿名" prop="isAnonymous">
<el-select v-model="queryParams.isAnonymous" placeholder="请选择是否匿名" clearable>
<el-option v-for="dict in sys_yesno" :key="dict.value" :label="dict.label" :value="dict.value" />
</el-select>
</el-form-item>
<el-form-item label="是否发布" prop="isPublished">
<el-select v-model="queryParams.isPublished" placeholder="请选择是否发布" clearable>
<el-option v-for="dict in sys_yesno" :key="dict.value" :label="dict.label" :value="dict.value" />
</el-select>
</el-form-item>
<el-form-item label="状态" prop="status">
<el-select v-model="queryParams.status" placeholder="请选择状态" clearable>
<el-option v-for="dict in sys_survey_status" :key="dict.value" :label="dict.label" :value="dict.value" />
</el-select>
</el-form-item>
<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-form-item label="是否匿名" prop="isAnonymous">
<el-select v-model="queryParams.isAnonymous" placeholder="请选择是否匿名" clearable>
<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="6">
<el-form-item label="是否发布" prop="isPublished">
<el-select v-model="queryParams.isPublished" placeholder="请选择是否发布" clearable>
<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="6">
<el-form-item label="状态" prop="status">
<el-select v-model="queryParams.status" placeholder="请选择状态" clearable>
<el-option v-for="dict in sys_survey_status" :key="dict.value" :label="dict.label" :value="dict.value" />
</el-select>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="24" class="search-btn-container">
<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>
@@ -3325,4 +3363,28 @@ onMounted(() => {
}
}
}
/* 搜索按钮容器样式 */
.search-btn-container {
display: flex;
justify-content: flex-end;
margin-top: 10px;
.el-form-item {
margin-bottom: 0 !important;
}
}
/* 强制el-date-editor及其内部input宽度100% */
:deep(.el-date-editor) {
width: 100% !important;
min-width: 0 !important;
}
:deep(.el-date-editor .el-input__wrapper) {
width: 100% !important;
min-width: 0 !important;
}
:deep(.el-date-editor input) {
width: 100% !important;
min-width: 0 !important;
}
</style>
-171
View File
@@ -1,171 +0,0 @@
1.学工管理
1.1学生信息管理
解决对所有在籍在校学生基本信息的收集,通过已掌握的学生基本信息可进一步统计出有效的数据,作为学校领导开展全校策略、规划工作提供的数据依据等。可解决对于学生基本信息收集流程及审核步骤的信息化服务应用。
需要提供学生处或者二级学院对于班级信息的维护与管理功能。需要支持维护辅导员(预留)、班主任的聘任信息及班干部的任命信息。支持通过数据集成方式,来获取相应业务数据。
需要提供单独的基本信息批次管理功能,与校每学年的学生信息采集工作开展相对应;根据辅导员、班主任、二级学院、学生处等用户组,批量进行不同的权限配置,在开放的业务期内学生可自行核对和编辑个人信息; 提交后需要支持在线跟踪查询审核进度。
班主任或辅导员、二级学院、学生处可以对于学生填写基本信息的采集进行审核,以保证学生基本信息的完整性和准确性; 将必填字段重点罗列显示,同时将修改或变化的内容以不同的颜色标识出来,方便采购人管理人员核对。
需要提供高级搜索、多字段组合查询来快速筛选出符合条件的学生;
管理老师可进行单个学生信息的新增和编辑,也支持学生信息批量导入导出操作。
需要提供对在校学生进行查询与统计,提供包括二级学院统计、年龄统计、专业统计、政治面貌统计、民族统计、生源地统计、性别统计、血型统计、宗教信仰统计、学籍状态统计、培养方式统计、体重统计、身高统计等维度,且应用支持多维度、多条件的组合查询。相关统计结果能够实现在线详情查看和导出。
学生信息中还需要包含银行卡信息
对于学生信息的查询除表格外必须支持卡片式展现,即以学生照片、学号、性别、班级等信息进行直观展现。支持汇总表、统计表、统计图及统计数据透视。
需要支持各种综合信息筛选查询,如按成绩条件、违纪处分条件、困难生条件、奖助条件作为查询条件查询,从而实现 多维度、跨业务域的综合条件筛选查询。
请假流程
需要支持学生通过移动端办理请假手续,请假页面包括请假类型、开始时间、结束时间、是否需要离校、紧急联系人、联系方式、审批人、请假原因、且可在同一页面上传附件;学生在填写请假申请时,可根据管理员后台配置采集学生请假时所在的地理位置信息,请假申请提交后,班主任在审批时可查看学生定位地址,并可打开地图查看具体地点;学生在填写请假申请,以及老师在审批时,可设置请假申请的抄送人(抄送家长),可选择系统内的老师或学生,至少可添加 3 名抄送人员,设置完成后当请假审批流程完成并全部通过后,所选的抄送人将收到提醒,并可查看该请假申请详情信息,请假信息同步到寝室管理人员和学校大门门禁系统,学校给予放行;
班主任可在PC端、移动端上进行审批请假申请。在审批界面具有核实电话、电话详情包括学生电话和紧急联系人电话,可点击号码直接拨号通话,对于需要离开学校的请假申请,在学生回到学校后,需在移动端上进行销假,进门刷脸后自动销假;
需要支持管理人员对请假申请进行详细配置,包含学生销假时是否必须上传照片、学生提交请假/续假申请时、是否必须上传地理位置、请假最大申请时长设置、审批逾期条件设置、以及非离校请假是否必须进行销假等,便于匹配学校相关管理要求;系统支持学校管理人员可自定义设置请假类型,定义请假类型名称并可控制开启或关闭状态,同时针对于单个请假类型,支持对补请假与提前请假分别可控制是否开启,以及补请假与提前请假的时间范围设置,若设置开启后,学生提交请假申请选择对应请假类型后,系统界面中将出现相关时间要求;
需要支持学校管理人员可设置销假逾期提醒,当学生请假时间截止后未及时进行销假操作,可自动通过移动端推送与短信提醒系统审批人员;
需要支持学校管理人员对全校或分学院设置请假审批流程,并可控制学院请假流程配置是否启用;审批流程设置时,支持按照请假类型、请假时长等条件,执行不同的请假审批流程,在审批节点上,允许按系统角色与自定义分组进行审批人员配置,并可以设置请假审批流程执行的优先级与审批人去重。
需要支持大屏通过各种维度展示学生信息数据。
需要支持在学生信息表中增加银行卡信息,包括,户名,开户行,卡号等信息,并支持修改。
学籍异动:当发生休学、复学等流程的时候,由班主任发起流程,需提交附件(纸质表单,家长签字,拍照),学院审批,学生处审批,分管副校长审批。并支持按照学籍进行统计,同时要注意,学籍异动要同步到宿舍管理(退学和休学的学生默认为非住校生);
学生请假:请假流程审批,并且审批流程要和宿管对接,后期还要对接学校大门口的道闸;
学生成长档案:记录学生在校期间的所有记录生成电子版ß
1.2奖惩补贴
需要支持对于满足自动评定规则的情况,设置好相关规则后, 系统对满足条件的学生可进行自动评定,并支持将评定结果导出。
需要支持为学校管理人员提供维护各个奖种之间兼得关系的功能,可根据学校具体奖学金兼得要求进行灵活的设置。
需要支持单独的奖学金评定批次管理功能,与每学年的评奖工作开展相对应;
需要支持二级学院负责人可查看本二级学院分配的奖种名额情况以及可按班级或专业进行二次分配。
需要支持学生在线查看当前学校开放的所有奖学金种类; 提供自动化条件校验的功能,不符合条件的学生无法在线申请相关奖种。申请提交后,学生可查看申请的处理进度。
需要支持学生处设立奖项功能。管理老师对评奖二级学院进行维护管理,可设置二级学院奖项评定负责人,可按奖项给二级学院分配获奖名额等。
需要支持根据学校分配的名额,二级学院可以直接指定符合奖学金申请条件的学生名单。
需要支持符合申请条件的学生可在线提交奖学金申请,并可查看审核处理的进度。
需要支持二级学院有审核权限的管理老师可对学生提交的申请进行审核。提供奖学金发放数据维护的功能,需要支持与校财务系统对接。
需要支持为学生处提供维护各个奖种之间兼得关系的功能,可根据学校具体助学金兼得要求进行灵活的设置;
需要支持为学生处提供维护所有助学金的公共评定条件的功能,可根据学校对于学生助学金申请的条件做统一的设置。"
需要提供单独的助学金评定批次管理功能,与每学年的评奖工作开展相对应;
需要支持学生在线查看当前学校开放的所有助学金种类,须提供自动化条件校验的功能,不符合条件的学生无法在线申请相关助学金。申请提交后,学生可查看申请的处理进度
需要支持在线维护有勤工助学用工需求的部门的信息,可指定学生处的业务负责人维护每个岗位的每月勤工助学款项的发放上限,为二级学院负责老师提供在线申报本单位的勤工助学岗位需求的功能,学生处的业务负责人对二级学院申报的勤工助学岗位进行审核和确认。
需要支持学生针对学校开放的岗位进行申请,学生申请时,受到岗位上设定的条件限制,学生申请后二级学院和学生处可在线进行审核,最终确定学生的上岗信息。二级学院和学生处也可自行终止或添加上岗的学生信息。
需要支持二级学院提供在线申报本部门当月各岗位的报酬发放预算的功能。
对二级学院申报的薪酬发放预算进行审核及调整,并导出审核通过的薪酬发放明细,支持与校财务系统对接,学生可查询个人的报酬发放情况。
需要支持学生在移动端查看开放申请的勤工助学岗位详细信息并进行申请。
需要支持在移动端查看已申请的岗位的申请进度。
1.3宿舍管理
需要支持根据学校宿舍实际布局灵活进行房源的平面图位置设置,可对平面图中的行列进行自由添加删除,并可对平面图中的房源基本信息进行维护,支持楼层的新增和原有楼层平面布局的复制"
需要支持对校内宿舍管理人员进行分配与设置的功能,支持按全校、校区、宿舍区、宿舍楼、二级学院几个维度进行宿舍管理人员的设置。并支持多级向下授权功能
需要支持多级权限的模式,达到分配及时、权限划分清楚明确的目的,授权人员需含校级宿舍人员管理、宿舍校区管理员、宿舍楼人员管理、宿舍二级学院负责人管理。床位细化到二级学院、专业、班级,支持二级学院二级分配,床位可通过图形化界面调整,支持批量导入床位。
需要支持多级分配模式,即校级管理员将房源进行规划并安排给二级学院,二级学院管理员将指定的学生具体分配至指定的宿舍清单内
需要支持自动分配功能,提供分配规则的勾选功能
需要支持学生在校住宿期间住退调业务在线办理功能,可批量给学生做退宿处理及并对宿舍日常管理时的异常情况进行处理,并可查看全校宿舍日常动态的日志信息。
需要支持对学生住宿信息,空房源信息,房源安排信息,未住宿学生信息等进行明细查询和统计数据下钻等操作。"
需要支持管理员自定义学生住调退申办原因,支持入住、退宿、调宿、假期留宿流程配置及时间设置。
需要支持宿舍住调退的在线申请及申请进度查看。
支持上传拍照附件和附件在线预览功能。 支持通过批量导入的方式实现检查结果在应用中的记录。支持宿舍卫生检查结果的统计查询,包括宿舍卫生检查明细表、统计表、分类统计表。提供学生在线查看个人所在宿舍卫生检查记录的通道
需要支持移动端登记宿舍卫生检查情况。
支持以宿舍为单位进行宿舍卫生状况打分,并可针对单个宿舍成员的具体情况进行分值调整。可拍照上传卫生情况照片,作为打分依据。
需要支持移动端查看个人和宿舍整体的卫生检查结果情况。
需要支持校级、校区、楼栋管理人员单个新增、批量导入学生宿舍违纪情况。
需要支持管理人员拍照上传作为违纪佐证,支持图片在线预览的功能。
需要支持移动端查看本人宿舍违纪情况。
申请住宿,换寝,需要提交审批,由班主任发起,并且有纸质的申请单切相关同学签字之后,作为附件
1.4心理健康
学生心里健康测评,由班主任统计好之后提交,班主任针对班级内需要关注的学生进行心理测评打分
增加一个心里咨询预约功能,学生做咨询要先在线进行预约,预约三次不到,一定期限内就不可以再预约,还要支持生成预约情况的报表并且支持导出
1.5社团管理
需要支持根据名称、主办方、承办方、活动状态等筛选,查看用户对活动的评分情况,追踪活动审批流程,支持活动创建、导出、 活动复制功能。
需要支持地理位置签到; 可实现活动报名、活动过程自定义收集材料(格式涵盖文本、 附件、图片),支持多次收集、关闭或恢复材料征集;支持团队报名及其材料查看;可设置多个活动指导老师及指导学时;填写活动其他相关信息包括不限于多个承办方、活动海报等。根据名称、日期等进行筛选,实现添加、导入、删除已办活动等操作,根据添加人或其所在组织划分数据权限,活动详情中可查看基本信息、成员获得成绩情况、 添加或者删除成员。根据名称、活动状态等筛选考勤数据,实现考勤任务新建、停止等操作,完成考勤从任务发起、学生打卡、结束到数据统计导出的一系列操作。
需要支持校园社团、志愿者队伍管理,包括新增、编辑、删除、转让. 支持指导老师可授权不同的人员专门负责社团活动创建和活动审批事项,社团成员管理权限由指导老师平台支持社团上课成员签到与签退,并且班主任有权限能够看到自己班级学生社团参与情况。
需要支持查看社团信息、志愿者队伍,支持单个/批量导入成员
需要支持学生报名社团、志愿者队伍,支持报名审核
1.6学生考核
需要支持新增、编辑、删除、发布违纪的类型和处分的类型
需要支持新增、编辑、删除违纪处分记录,支持导入和导出
需要支持查询所管辖范围内的学生违纪处分
需要支持查看个人违纪处分记录
需要支持个人违纪处分记录发起撤销申请,并查看审核进度.
需要支持审核违纪处分解除申请
需要支持以表格形式展示所有学生违纪处分记录信息,支持按违纪类型、处分类型、违纪时间、处分时间、姓名、二级学院、专业、班级筛选,支持表格展示字段勾选配置;
需要支持以表格形式展示所有学生违纪处分记录并统计出违纪处分种类及人次,支持按违纪类型、处分类型、违纪时间、处分时间、姓名、二级学院、专业、班级筛选,支持表格展示字段勾选配置;
需要支持以柱状图形式展示违纪处分类型的人次,支持以饼状图形式按二级学院、专业维度统计违纪处分记录人次。
需要支持学生在微信小程序查看个人违纪处分信息
需要支持指标体系管理, 包括新增、编辑、删除、启用、禁用操作,指标体系信息包括编码、说明、指标类型、状态(启用、禁用)。
需要支持考核方案管理, 包括新增、编辑、删除、启用、禁用操作.考核方案信息包括编号、名称、说明、状态(启用、禁用). 支持考核方案关联指标体系。
需要支持考核计划管理, 包括新增、编辑、删除、开始、结束操作
需要支持辅导员或班主任审核学生提交的测评评分及附件分信息
需要支持二级学院、学校负责人填写测评指标得分
需要支持学校新增、编辑学生综合测评得分数据
需要支持微信小程序根据指标体系进行自评,并支持学生附加分项目的填写提报及证明材料上传
需要支持查询本人历史或当前学年的综合测评结果
1.7班主任考评
需要支持设定考核方案与指标体系,指标体系可支持多级且可设定权重,各级指标体系可授权给不同人群进行打分
需要支持通过问卷调查对自己所在班级的辅导员或班主任的平时学生工作进行打分并提出打分
需要支持被考核对象根据考核方案中自评要求及指标体系对自身工作进行评价,并可查询历史和当前学年的评价结果,被考核对象可按测评方案要求对其他参评对象进行打分
需要支持按照指标体系对被考核对象进行打分,系统可依据指标体系要求自动计算考核结果,包含总分及各指标体系得分
需要支持考核结果授权给相应人员进行查询
需要支持考核结果信息进行明细查询、表格统计、图形化统计等操作
需要支持移动端对自己所带班辅导员或者班主任按测评要求进行打分
需要支持考核方案规定,被考核对象可通过移动端求对自身工作进行评价,并可查询历史和当前学年的评价结果。
需要支持移动端按测评要求对其他参评对象进行评价打分
需要支持移动端被考核对象进行打分,系统具备能自动计算考核结果的功能"
1.8学工数据大屏
将学工管理相关数据在学工大屏上进行展示,同时做到实时数据同步
1.9晨检报送功能
将晨检相关数据进行自动汇总,并进行同时报送
2.招生就业管理
2.1招生迎新管理
学生报名录取信息
(1)学生扫描二维码,生成报名信息表(按需要条目设计表格),登录系统后均可见(可供多人同时登陆 )
(2)按需按流程分配权限。
学生扫码生成信息表--A老师登录系统后核对学生报名信息,核对无误后点击确认(如有误可在系统上在线修改)--B 老师处可见学生信息情况,并生成缴费情况及录取通知书号码填写的栏目,B老师填写完毕并确认--生成录取信息表--录取信息表最终全部完成后经招就部门领导点击确认后,学生处系统登录后可见新生信息表
(3)信息表可按照专业、录取时间、地域、毕业学校、分数段等进行排列和统计,并能够生成相应的表格和统计数据。( 如:当天各专业的招生数量)
各部门系统联动
(1)学生录取信息经招就部分确认后,学生处系统直接可通过系统查看。
(2)学生录取信息和财务处学生实际缴费情况进行自动匹配,核对学生的缴费情况(按照通校、住校区分 ),如有异常,跳出核对提醒。
数据统计及分析
能够根据当年的录取信息表进行生源地,分数段,男女比例,各专业人数等的分析,并综合上-年度的数据进行比对分析,从而得出线性变化的规律分析。
预报名系统、AI 智能招生咨询和短信平台联通
学生扫描预报名二维码生成预报名信息表,短息平台根据预报名信息上的电话信息,给预报名学生发送换取录取通知书或缴费等通知。在部分学生完成录取,短信平台可以根据未来缴费的学生信息继续发通知短信。
学生或家长可以通过线上 AI智能招生咨询留下信息,然后短信平台根据线上后台的联系信息给学生及家长发送校园开放日通知或预报名通知的短信。
2.2实习就业管理
2.2.1.招聘会企业信息表单收集器
在平台发布表单给企业填写,每家企业填写后能自动生成一页招聘海报,最后能汇总成招聘手册。招就处端可对表单内容进行编辑,可上传单个10MB 以内附件,单个表单附件总大小限制在 2GB 以内。
2.2.2.学生实习信息收集
班主任端可维护学生实习信息,包括二级学院、班级、姓名、性别、电话、实习单位、地址、单位联系人、联系人电话、岗位、实习津贴、住宿地址等,招就处端可对表头进行编辑。班主任填写后可按班级或二级学院生成汇总表。
2.2.3.毕业生信息收集器
在平台发布表单给毕业生填写,收集完成后可导出原始数据,可进行数据分析,列出图表。
2.2.4.实习学生日常管理
学生每日可在客户端定位打卡,班主任可查看,考勤有异常自动推送至班主任端。班主任下厂巡回指导时可定位打卡,并填写相关信息(走访的企业、学生等)招就处端可查看班主任打卡数据,并生成统计表。
2.2.5.学生实习月度小结填写
学生可通过客户端填写月度实习小结,企业端(若有)可填写学生实习评语,班主任可填写学期实习评语。
3.人事管理
需要支持发布招聘公告以及具体的招聘职位需求。应聘人员可注册账号,申请岗位,然后填写简历并提交职位申请,并能持续跟踪职位申请的审核情况。
需要支持手机和邮箱两种注册方式。
需要支持支持账号密码、手机验证码两种登录方式,若忘记密码,应聘者可通过邮箱或手机号重设密码。
需要支持填写简历,包括基本信息和学习经历、工作经历等子集;支持附件上传;简历必填内容的设置和检查,必须填写完整后才能申请职位。
需要支持简历导出并打印。
实现教师参加培训记录的登记和查询,可登记教师培训时间、获得学时、培训类别等信息。可实现教师培训申请与审核流程管理。 审批流程支持在线手写签字及打印。
需要支持进行培训申请,选择培训课程、培训时间、培训课时等信息,可在线打印培训申请表。
需要支持对教职工的培训申请进行审核,审批完成购进行公示。
需要支持查询培训信息,上传培训证书附件。可查看在培训记录。
需要支持进行出国申请,选择出国地点、出国时间、出国原因等信息,需要支持对出国申请进行审核,审批流程支持在线手写签字及打印。
需要支持查询出国信息。
4.财务管理
需要支持项目预算审批,支持审批流程配置
需要支持在线填报项目申请信息,包括项目申请信息及时间等,支持导出各个部门项目申请及批复信息,需要支持excel导出。
需要相关部门在线查看项目预算执行情况,支持预算执行数据excel格式导出
需要相关部门在线填报年度项目绩效监控(1-6月份)和项目绩效自评(1-12月份),并支持word导出
需要支持在线查看项目申请情况,并支持word导出。
需要支持学生或家长的银行卡账户信息录入,支持excel批量导入导出。
5.安全保卫管理
需要支持每日到校人数在可视化大屏上进行展示
在网络联通的前提下,可以通过大屏查看校内所有监控实时画面需要接入保卫处访客系
cd backend
mvn clean
rm -rf */target/
mvn clean compile