14 Commits

Author SHA1 Message Date
074f82e34a 退伍复学-电子签名-文件下载联表 2026-03-31 17:44:45 +08:00
d0f2b71585 refactor(vo): 移除请假申请中电话信息敏感信息脱敏注解
移除StuLeaveApplicationDetailsVo中phoneNumber和fatherRelation字段的@Sensitive注解
2026-03-31 11:10:56 +08:00
33e630ddef feat(辅导员KPI填报): 辅导员业绩考核-添加加分项佐证材料支持
在SysTeacherKpiFilling类中新增kpiFillingBonusPointsMaterialsList字段,并在mapper中实现相关查询功能,以支持辅导员KPI填报时加分项佐证材料的存储和查询
2026-03-31 09:57:44 +08:00
fb7d17f6d6 Merge remote-tracking branch 'origin/main'
# Conflicts:
#	srs-admin/src/main/resources/application.yml
2026-03-30 11:08:50 +08:00
7d51f1ddd4 文件上传配置文件路径修复 2026-03-30 11:06:32 +08:00
d24c3cf269 辅导员管理,更改业务需求 2026-03-26 17:18:54 +08:00
ce18d4ca1f 修改pom.xml的文件中maven版本为17 2026-03-25 17:18:18 +08:00
2b4f56753f 修改上传文件路径 2026-03-25 16:48:09 +08:00
ac3e002ce1 辅导员管理-业绩考核-负面清单修改功能代码调整 2026-03-24 16:53:17 +08:00
cda670bcd8 chore(deps): 更新项目依赖版本和Java版本
- 将Spring Boot版本从2.1.1.RELEASE升级到2.5.14
- 将Java版本从1.8升级到17
- 将Maven编译插件版本从3.1升级到3.11.0
- 为Lombok添加注解处理器路径配置
- 格式化maven-compiler-plugin配置使其更清晰
- 移除重复的mybatis-plus-core依赖项
- 更新Lombok版本到1.18.32
2026-03-24 11:29:51 +08:00
44e2938f71 入伍保留学籍-批量插入(辅导员批量申请) 2026-03-20 15:22:09 +08:00
1b9ffef757 入伍保留学籍-批量插入(辅导员批量申请) 2026-03-20 15:20:24 +08:00
2c591aa557 Merge remote-tracking branch 'origin/main' 2026-03-20 11:49:15 +08:00
f99b4621d2 日常事务-处分管理 添加印章图片签名验证功能
- 实现了图片签名工具类ImageSignUtils,支持生成和验证带时间戳的签名URL
- 配置SecurityConfig允许匿名访问签名的印章图片URL,但Base64接口需认证
- 创建StampController提供受保护的印章图片访问接口
- 将应用默认文件路径配置改为Windows环境路径
- 支持通过签名URL安全访问印章图片资源
2026-03-20 11:48:37 +08:00
24 changed files with 1077 additions and 29 deletions

11
pom.xml
View File

@@ -15,7 +15,7 @@
<srs.version>3.8.5</srs.version> <srs.version>3.8.5</srs.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version> <java.version>17</java.version>
<maven-jar-plugin.version>3.1.1</maven-jar-plugin.version> <maven-jar-plugin.version>3.1.1</maven-jar-plugin.version>
<druid.version>1.2.16</druid.version> <druid.version>1.2.16</druid.version>
<bitwalker.version>1.21</bitwalker.version> <bitwalker.version>1.21</bitwalker.version>
@@ -234,11 +234,18 @@
<plugin> <plugin>
<groupId>org.apache.maven.plugins</groupId> <groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId> <artifactId>maven-compiler-plugin</artifactId>
<version>3.1</version> <version>3.11.0</version>
<configuration> <configuration>
<source>${java.version}</source> <source>${java.version}</source>
<target>${java.version}</target> <target>${java.version}</target>
<encoding>${project.build.sourceEncoding}</encoding> <encoding>${project.build.sourceEncoding}</encoding>
<annotationProcessorPaths>
<path>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.32</version>
</path>
</annotationProcessorPaths>
</configuration> </configuration>
</plugin> </plugin>
</plugins> </plugins>

View File

@@ -195,7 +195,7 @@
<plugin> <plugin>
<groupId>org.springframework.boot</groupId> <groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId> <artifactId>spring-boot-maven-plugin</artifactId>
<version>2.1.1.RELEASE</version> <version>2.5.14</version>
<configuration> <configuration>
<fork>true</fork> <!-- 如果没有该配置devtools不会生效 --> <fork>true</fork> <!-- 如果没有该配置devtools不会生效 -->
</configuration> </configuration>
@@ -215,7 +215,15 @@
<failOnMissingWebXml>false</failOnMissingWebXml> <failOnMissingWebXml>false</failOnMissingWebXml>
<warName>${project.artifactId}</warName> <warName>${project.artifactId}</warName>
</configuration> </configuration>
</plugin><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><configuration><source>14</source><target>14</target></configuration></plugin> </plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>17</source>
<target>17</target>
</configuration>
</plugin>
</plugins> </plugins>
<finalName>${project.artifactId}</finalName> <finalName>${project.artifactId}</finalName>
</build> </build>

View File

@@ -0,0 +1,74 @@
package com.srs.web.controller.common;
import com.srs.common.config.SrsConfig;
import com.srs.common.core.controller.BaseController;
import com.srs.common.core.domain.AjaxResult;
import com.srs.common.utils.sign.ImageSignUtils;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletRequest;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.Base64;
/**
* 受保护图片接口
* 提供签名URL的图片访问
*/
@RestController
@RequestMapping("/common/stamp")
@Api(value = "受保护图片管理", tags = "受保护图片管理")
public class StampController extends BaseController {
/**
* 获取印章图片的Base64编码需要登录验证
*/
@GetMapping("/base64")
@ApiOperation("获取印章图片Base64编码")
public AjaxResult getStampBase64() {
String stampPath = SrsConfig.getProfile() + "/stamp/stamp.jpg";
File file = new File(stampPath);
if (!file.exists()) {
return error("印章图片不存在");
}
try (FileInputStream fis = new FileInputStream(file)) {
byte[] bytes = new byte[(int) file.length()];
fis.read(bytes);
String base64 = Base64.getEncoder().encodeToString(bytes);
String dataUrl = "data:image/jpeg;base64," + base64;
return success(dataUrl);
} catch (IOException e) {
return error("读取印章图片失败");
}
}
/**
* 获取印章图片的Base64编码指定文件名
*/
@GetMapping("/base64/{fileName}")
@ApiOperation("获取印章图片Base64编码")
public AjaxResult getStampBase64ByName(@PathVariable String fileName) {
String stampPath = SrsConfig.getProfile() + "/stamp/" + fileName;
File file = new File(stampPath);
if (!file.exists()) {
return error("印章图片不存在");
}
try (FileInputStream fis = new FileInputStream(file)) {
byte[] bytes = new byte[(int) file.length()];
fis.read(bytes);
String base64 = Base64.getEncoder().encodeToString(bytes);
String mimeType = fileName.toLowerCase().endsWith(".png") ? "image/png" : "image/jpeg";
String dataUrl = "data:" + mimeType + ";base64," + base64;
return success(dataUrl);
} catch (IOException e) {
return error("读取印章图片失败");
}
}
}

View File

@@ -156,6 +156,34 @@ public class RtEnlistmentReserveController extends BaseController {
return success(rtEnlistmentReserveService.insertRtEnlistmentReserve(rtEnlistmentReserve)); return success(rtEnlistmentReserveService.insertRtEnlistmentReserve(rtEnlistmentReserve));
} }
/**
* 批量插入应征入伍预约信息
* @param list 预约信息列表
* @return 插入结果
*/
@PreAuthorize("@ss.hasPermi('routine:enlistmentReserve:add')")
@Log(title = "应征入伍保留学籍申请", businessType = BusinessType.INSERT)
@PostMapping("/batchInsert")
@ApiOperation("新增应征入伍保留学籍申请")
public AjaxResult batchInsert(@RequestBody List<RtEnlistmentReserve> list) {
try {
// 调用批量插入方法
int insertCount = rtEnlistmentReserveService.batchInsertRtEnlistmentReserve(list);
// 若依框架成功返回(带数据)
return AjaxResult.success("批量插入成功,共插入" + insertCount + "条数据", insertCount);
} catch (IllegalArgumentException e) {
// 入参无效异常(如姓名/学号为空)
return AjaxResult.error(e.getMessage());
} catch (RuntimeException e) {
// 重复数据异常
return AjaxResult.error(e.getMessage());
} catch (Exception e) {
// 其他未知异常(若依框架建议记录日志)
logger.error("批量插入应征入伍预约信息失败", e); // 继承BaseController自带logger
return AjaxResult.error("批量插入失败:" + e.getMessage());
}
}
/** /**
* 修改应征入伍保留学籍申请 * 修改应征入伍保留学籍申请
*/ */

View File

@@ -0,0 +1,90 @@
package com.srs.web.controller.teacher;
import java.util.List;
import javax.servlet.http.HttpServletResponse;
import com.srs.common.annotation.Log;
import com.srs.common.annotation.RepeatSubmit;
import com.srs.common.core.controller.BaseController;
import com.srs.common.core.domain.AjaxResult;
import com.srs.common.core.page.TableDataInfo;
import com.srs.common.enums.BusinessType;
import com.srs.common.utils.poi.ExcelUtil;
import com.srs.teacher.domain.SysTeacherKpiFillingBonusPointsMaterials;
import com.srs.teacher.service.ISysTeacherKpiFillingBonusPointsMaterialsService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
/**
* 业绩考核-个人填报-加分项佐证材料Controller
*
* @author Codex
* @date 2026-03-26
*/
@RestController
@RequestMapping("/teacher/kpiFillingBonusPointsMaterials")
@Api(value = "业绩考核-个人填报-加分项佐证材料管理", tags = "业绩考核-个人填报-加分项佐证材料管理")
public class SysTeacherKpiFillingBonusPointsMaterialsController extends BaseController {
@Autowired
private ISysTeacherKpiFillingBonusPointsMaterialsService materialsService;
@GetMapping("/list")
@ApiOperation("查询业绩考核-个人填报-加分项佐证材料列表")
public TableDataInfo list(SysTeacherKpiFillingBonusPointsMaterials materials) {
startPage();
List<SysTeacherKpiFillingBonusPointsMaterials> list = materialsService.selectSysTeacherKpiFillingBonusPointsMaterialsList(materials);
return getDataTable(list);
}
@GetMapping("/getByFdyNameAndYearAndMonth")
@ApiOperation("根据辅导员姓名、年月查询加分项佐证材料列表")
public TableDataInfo getByFdyNameAndYearAndMonth(@RequestParam String fdyName,
@RequestParam String fillingYear,
@RequestParam String fillingMonth,
@RequestParam(required = false) String classType,
@RequestParam(required = false) String bonusType) {
startPage();
List<SysTeacherKpiFillingBonusPointsMaterials> list = materialsService.selectSysTeacherKpiFillingBonusPointsMaterialsByFdyName(fdyName, fillingYear, fillingMonth, classType, bonusType);
return getDataTable(list);
}
@PostMapping("/export")
@Log(title = "业绩考核-个人填报-加分项佐证材料", businessType = BusinessType.EXPORT)
@ApiOperation("导出业绩考核-个人填报-加分项佐证材料列表")
public void export(HttpServletResponse response, SysTeacherKpiFillingBonusPointsMaterials materials) {
List<SysTeacherKpiFillingBonusPointsMaterials> list = materialsService.selectSysTeacherKpiFillingBonusPointsMaterialsList(materials);
ExcelUtil<SysTeacherKpiFillingBonusPointsMaterials> util = new ExcelUtil<>(SysTeacherKpiFillingBonusPointsMaterials.class);
util.exportExcel(response, list, "业绩考核-个人填报-加分项佐证材料数据");
}
@GetMapping(value = "/{id}")
@ApiOperation("获取业绩考核-个人填报-加分项佐证材料详情")
public AjaxResult getInfo(@PathVariable("id") Long id) {
return success(materialsService.selectSysTeacherKpiFillingBonusPointsMaterialsById(id));
}
@PostMapping("/add")
@Log(title = "业绩考核-个人填报-加分项佐证材料", businessType = BusinessType.INSERT)
@ApiOperation("新增业绩考核-个人填报-加分项佐证材料")
@RepeatSubmit(interval = 1000, message = "请求过于频繁")
public AjaxResult add(@RequestBody SysTeacherKpiFillingBonusPointsMaterials materials) {
return toAjax(materialsService.insertSysTeacherKpiFillingBonusPointsMaterials(materials));
}
@PostMapping("/update")
@Log(title = "业绩考核-个人填报-加分项佐证材料", businessType = BusinessType.UPDATE)
@ApiOperation("修改业绩考核-个人填报-加分项佐证材料")
@RepeatSubmit(interval = 1000, message = "请求过于频繁")
public AjaxResult edit(@RequestBody SysTeacherKpiFillingBonusPointsMaterials materials) {
return toAjax(materialsService.updateSysTeacherKpiFillingBonusPointsMaterials(materials));
}
@PostMapping("/{ids}")
@Log(title = "业绩考核-个人填报-加分项佐证材料", businessType = BusinessType.DELETE)
@ApiOperation("删除业绩考核-个人填报-加分项佐证材料")
public AjaxResult remove(@PathVariable Long[] ids) {
return toAjax(materialsService.deleteSysTeacherKpiFillingBonusPointsMaterialsByIds(ids));
}
}

View File

@@ -9,7 +9,8 @@ srs:
# 实例演示开关 # 实例演示开关
demoEnabled: true demoEnabled: true
# 文件路径 示例( Windows配置D:/srs/uploadPath,Linux配置 /home/srs/uploadPath)#D:/srs/uploadPath # 文件路径 示例( Windows配置D:/srs/uploadPath,Linux配置 /home/srs/uploadPath)#D:/srs/uploadPath
profile: /usr/local/java/srs/uploadPath #/usr/local/java/srs/uploadPath # 后续发布代码,这里路径不能变
profile: /usr/local/java/srs/uploadPath
#profile: D:/srs/uploadPath #/srs/uploadPath #profile: D:/srs/uploadPath #/srs/uploadPath
# 获取ip地址开关 # 获取ip地址开关
addressEnabled: false addressEnabled: false

View File

@@ -0,0 +1,100 @@
package com.srs.common.utils.sign;
import javax.servlet.http.HttpServletRequest;
import java.nio.charset.StandardCharsets;
import java.security.MessageDigest;
import java.util.Base64;
/**
* 图片签名工具类
* 用于生成和验证图片访问签名URL
*/
public class ImageSignUtils {
private static final String SECRET_KEY = "srs-stamp-secret-key-2024";
private static final long DEFAULT_EXPIRE_TIME = 3 * 60_000; // 3分钟
/**
* 生成签名
*/
public static String generateSign(String fileName, long expireTime) {
String raw = fileName + "-" + expireTime + "-" + SECRET_KEY;
return md5(raw);
}
/**
* 生成带签名的URL
*/
public static String generateSignedUrl(String fileName) {
long expireTime = System.currentTimeMillis() + DEFAULT_EXPIRE_TIME;
String sign = generateSign(fileName, expireTime);
return String.format("/common/stamp/%s?expire=%d&sign=%s",
encodeFileName(fileName), expireTime, sign);
}
/**
* 验证签名是否有效
*/
public static boolean validateSign(String fileName, long expireTime, String sign) {
if (System.currentTimeMillis() > expireTime) {
return false; // 已过期
}
String expectedSign = generateSign(fileName, expireTime);
return expectedSign.equals(sign);
}
/**
* 从请求中提取文件名
*/
public static String extractFileName(HttpServletRequest request) {
String uri = request.getRequestURI();
String fileName = uri.substring(uri.lastIndexOf("/common/stamp/") + 14);
int paramIndex = fileName.indexOf("?");
if (paramIndex > 0) {
fileName = fileName.substring(0, paramIndex);
}
return decodeFileName(fileName);
}
/**
* 验证请求签名
*/
public static boolean validateRequest(HttpServletRequest request) {
String fileName = extractFileName(request);
String expireStr = request.getParameter("expire");
String sign = request.getParameter("sign");
if (fileName == null || expireStr == null || sign == null) {
return false;
}
try {
long expireTime = Long.parseLong(expireStr);
return validateSign(fileName, expireTime, sign);
} catch (NumberFormatException e) {
return false;
}
}
private static String encodeFileName(String fileName) {
return Base64.getUrlEncoder().encodeToString(fileName.getBytes(StandardCharsets.UTF_8));
}
private static String decodeFileName(String encoded) {
return new String(Base64.getUrlDecoder().decode(encoded), StandardCharsets.UTF_8);
}
private static String md5(String input) {
try {
MessageDigest md = MessageDigest.getInstance("MD5");
byte[] digest = md.digest(input.getBytes(StandardCharsets.UTF_8));
StringBuilder sb = new StringBuilder();
for (byte b : digest) {
sb.append(String.format("%02x", b));
}
return sb.toString();
} catch (Exception e) {
throw new RuntimeException("MD5 calculation failed", e);
}
}
}

View File

@@ -140,6 +140,10 @@ public class SecurityConfig extends WebSecurityConfigurerAdapter {
// 静态资源,可匿名访问 // 静态资源,可匿名访问
.antMatchers(HttpMethod.GET, "/", "/*.html", "/**/*.html", "/**/*.css", "/**/*.js", "/profile/**").permitAll() .antMatchers(HttpMethod.GET, "/", "/*.html", "/**/*.html", "/**/*.css", "/**/*.js", "/profile/**").permitAll()
.antMatchers("/swagger-ui.html", "doc.html", "/swagger-resources/**", "/webjars/**", "/*/api-docs", "/druid/**").permitAll() .antMatchers("/swagger-ui.html", "doc.html", "/swagger-resources/**", "/webjars/**", "/*/api-docs", "/druid/**").permitAll()
// 签名的印章图片URL可匿名访问签名验证
.antMatchers(HttpMethod.GET, "/common/stamp/**").permitAll()
// Base64接口需要认证
.antMatchers(HttpMethod.GET, "/common/stamp/base64/**").authenticated()
// 除上面外的所有请求全部需要鉴权认证 // 除上面外的所有请求全部需要鉴权认证
.anyRequest().authenticated() .anyRequest().authenticated()
.and() .and()
@@ -172,6 +176,10 @@ public class SecurityConfig extends WebSecurityConfigurerAdapter {
// 静态资源,可匿名访问 // 静态资源,可匿名访问
.antMatchers(HttpMethod.GET, "/*.html", "/**/*.html", "/**/*.css", "/**/*.js", "/profile/**").permitAll() .antMatchers(HttpMethod.GET, "/*.html", "/**/*.html", "/**/*.css", "/**/*.js", "/profile/**").permitAll()
.antMatchers("/swagger-ui.html", "doc.html", "/swagger-resources/**", "/webjars/**", "/*/api-docs", "/druid/**").permitAll() .antMatchers("/swagger-ui.html", "doc.html", "/swagger-resources/**", "/webjars/**", "/*/api-docs", "/druid/**").permitAll()
// 签名的印章图片URL可匿名访问签名验证
.antMatchers(HttpMethod.GET, "/common/stamp/**").permitAll()
// Base64接口需要认证
.antMatchers(HttpMethod.GET, "/common/stamp/base64/**").authenticated()
// 除上面外的所有请求全部需要鉴权认证 // 除上面外的所有请求全部需要鉴权认证
.anyRequest().authenticated() .anyRequest().authenticated()
.and() .and()

View File

@@ -2,6 +2,7 @@ package com.srs.routine.domain;
import com.srs.common.annotation.Excel; import com.srs.common.annotation.Excel;
import com.baomidou.mybatisplus.annotation.*; import com.baomidou.mybatisplus.annotation.*;
import com.srs.comprehensive.domain.SrsStudent;
import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty; import io.swagger.annotations.ApiModelProperty;
import lombok.*; import lombok.*;
@@ -393,6 +394,54 @@ private static final long serialVersionUID=1L;
@Excel(name = "保留字段2") @Excel(name = "保留字段2")
private String testTest; private String testTest;
/**
* 招就处电子签名
*/
@ApiModelProperty("招就处电子签名")
@TableField("zs_qmd")
@Excel(name = "招就处电子签名")
private String zsQmd;
/**
* 辅导员电子签名
*/
@ApiModelProperty("辅导员电子签名")
@TableField("fd_qmd")
@Excel(name = "辅导员电子签名")
private String fdQmd;
/**
* 学务电子签名
*/
@ApiModelProperty("学务电子签名")
@TableField("xw_qmd")
@Excel(name = "学务电子签名")
private String xwQmd;
/**
* 二级学院电子签名
*/
@ApiModelProperty("二级学院电子签名")
@TableField("rj_qmd")
@Excel(name = "二级学院电子签名")
private String rjQmd;
/**
* 学籍管理电子签名
*/
@ApiModelProperty("学籍管理电子签名")
@TableField("xj_qmd")
@Excel(name = "学籍管理电子签名")
private String xjQmd;
/**
* 教务处电子签名
*/
@ApiModelProperty("教务处电子签名")
@TableField("jwc_qmd")
@Excel(name = "教务处电子签名")
private String jwcQmd;
/** /**
* 退伍复学-填报材料 * 退伍复学-填报材料
*/ */
@@ -400,4 +449,11 @@ private static final long serialVersionUID=1L;
@Excel(name = "退伍复学-填报材料") @Excel(name = "退伍复学-填报材料")
private List<SysDisMate> MaList; private List<SysDisMate> MaList;
/**
* 退伍复学-填报材料
*/
@ApiModelProperty(value = "退伍复学-填报材料", hidden = true)
@Excel(name = "退伍复学-填报材料")
private List<SrsStudent> StuList;
} }

View File

@@ -37,14 +37,12 @@ public class StuLeaveApplicationDetailsVo implements Serializable {
private String className; private String className;
@ApiModelProperty("联系电话") @ApiModelProperty("联系电话")
@Sensitive(desensitizedType = DesensitizedType.PHONE)
private String phoneNumber; private String phoneNumber;
@ApiModelProperty("父亲姓名") @ApiModelProperty("父亲姓名")
private String fatherName; private String fatherName;
@ApiModelProperty("父亲联系电话") @ApiModelProperty("父亲联系电话")
@Sensitive(desensitizedType = DesensitizedType.PHONE)
private String fatherRelation; private String fatherRelation;
@ApiModelProperty("请假事由") @ApiModelProperty("请假事由")

View File

@@ -63,6 +63,20 @@ public interface RtEnlistmentReserveMapper extends BaseMapper<RtEnlistmentReserv
@Options(useGeneratedKeys = true, keyProperty = "id", keyColumn = "id") @Options(useGeneratedKeys = true, keyProperty = "id", keyColumn = "id")
int insertRtEnlistmentReserve(RtEnlistmentReserve rtEnlistmentReserve); int insertRtEnlistmentReserve(RtEnlistmentReserve rtEnlistmentReserve);
/**
* 批量插入应征入伍预约信息
* @param list 应征入伍预约信息列表
* @return 插入成功的记录数
*/
int batchInsertRtEnlistmentReserve(List<RtEnlistmentReserve> list);
/**
* 查询数据库中已存在的学生(姓名+学号拼接)
* @param list 待插入的学生列表
* @return 已存在的学生标识格式姓名_学号
*/
List<String> selectExistStudents(List<RtEnlistmentReserve> list);
/** /**
* Mapper接口方法统计指定年份的保留学籍记录数 * Mapper接口方法统计指定年份的保留学籍记录数
* @param year 年份如2026 * @param year 年份如2026

View File

@@ -45,6 +45,13 @@ public interface IRtEnlistmentReserveService extends IService<RtEnlistmentReserv
*/ */
RtEnlistmentReserve insertRtEnlistmentReserve(RtEnlistmentReserve rtEnlistmentReserve); RtEnlistmentReserve insertRtEnlistmentReserve(RtEnlistmentReserve rtEnlistmentReserve);
/**
* 批量插入应征入伍预约信息
* @param list 应征入伍预约信息列表
* @return 插入成功的记录数
*/
int batchInsertRtEnlistmentReserve(List<RtEnlistmentReserve> list);
/** /**
* 修改应征入伍保留学籍申请 * 修改应征入伍保留学籍申请
* *

View File

@@ -1,11 +1,10 @@
package com.srs.routine.service.impl; package com.srs.routine.service.impl;
import java.text.SimpleDateFormat; import java.text.SimpleDateFormat;
import java.util.Date; import java.util.*;
import java.util.HashMap; import java.util.stream.Collectors;
import java.util.List;
import java.util.Map;
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import com.srs.common.core.domain.AjaxResult; import com.srs.common.core.domain.AjaxResult;
import com.srs.common.core.domain.entity.SysUser; import com.srs.common.core.domain.entity.SysUser;
import com.srs.common.doman.dto.ProcessResultDto; import com.srs.common.doman.dto.ProcessResultDto;
@@ -177,6 +176,101 @@ public class RtEnlistmentReserveServiceImpl extends ServiceImpl<RtEnlistmentRese
return rtEnlistmentReserve; return rtEnlistmentReserve;
} }
@Override
public int batchInsertRtEnlistmentReserve(List<RtEnlistmentReserve> list) {
// 1. 校验入参是否为空
if (CollectionUtils.isEmpty(list)) {
return 0;
}
// 2. 过滤掉姓名或学号为空的数据(避免拼接异常)
List<RtEnlistmentReserve> validList = list.stream()
.filter(item -> item.getStudentName() != null && !item.getStudentName().isEmpty()
&& item.getStudentNo() != null && !item.getStudentNo().isEmpty())
.collect(Collectors.toList());
if (CollectionUtils.isEmpty(validList)) {
throw new IllegalArgumentException("待插入数据中无有效学生信息(姓名/学号为空)");
}
// 3. 查询数据库中已存在的学生姓名_学号
List<String> existStudentKeys = rtEnlistmentReserveMapper.selectExistStudents(validList);
Set<String> existStudentKeySet = new HashSet<>(existStudentKeys);
// 4. 拆分重复数据和待插入数据
List<RtEnlistmentReserve> duplicateList = validList.stream()
.filter(item -> existStudentKeySet.contains(item.getStudentName() + "_" + item.getStudentNo()))
.collect(Collectors.toList());
List<RtEnlistmentReserve> insertList = validList.stream()
.filter(item -> !existStudentKeySet.contains(item.getStudentName() + "_" + item.getStudentNo()))
.collect(Collectors.toList());
// 5. 存在重复数据则抛出异常提示
if (!CollectionUtils.isEmpty(duplicateList)) {
String duplicateMsg = duplicateList.stream()
.map(item -> "学生姓名:" + item.getStudentName() + ",学号:" + item.getStudentNo())
.collect(Collectors.joining(""));
throw new RuntimeException("提交申请失败,以下学生已提交申请:" + duplicateMsg);
}
// 6. 无重复数据时为每条待插入数据生成唯一的reserveNo核心新增逻辑
if (!CollectionUtils.isEmpty(insertList)) {
// ========== 生成保留学籍编号(适配批量场景) ==========
// 6.1 获取当前系统年份(用于编号和序号重置判断)
SimpleDateFormat yearSdf = new SimpleDateFormat("yyyy");
String currentYear = yearSdf.format(new Date()); // 如2026
// 6.2 查询「当前年份」的记录总数(按年份分组统计,实现每年序号重置)
// 统计rt_enlistment_reserve表中reserve_no以"BLXJ("+currentYear+")"开头的记录数
int yearTotal = rtEnlistmentReserveMapper.countByYear(currentYear);
// ========== 保留学籍开始和结束日期生成核心逻辑 ==========
Calendar calendar = Calendar.getInstance();
int currentMonth = calendar.get(Calendar.MONTH) + 1; // 月份从0开始+1转为实际月份1-12
// 6.3 为批量数据逐个生成递增的reserveNo
for (int i = 0; i < insertList.size(); i++) {
RtEnlistmentReserve item = insertList.get(i);
// 计算当前条目的序号(年份总数 + 1 + 循环索引,保证批量递增)
int seq = yearTotal + 1 + i;
// 补零为4位0001、0002...9999
String seqStr = String.format("%04d", seq);
// 拼接最终编号BLXJ(年份)序号
String reserveNo = "BLXJ(" + currentYear + ")" + seqStr;
// 设置到当前实体对象中
item.setReserveNo(reserveNo);
// ========== 保留学籍开始和结束日期生成核心逻辑 ==========
// --- 生成reserveStartDate按学期判断 ---
// 重置Calendar为当前年份的起始
calendar.clear();
calendar.set(Calendar.YEAR, Integer.parseInt(currentYear));
// 判断学期春季1-6月→3月1日秋季7-12月→9月1日
if (currentMonth >= 1 && currentMonth <= 6) {
calendar.set(Calendar.MONTH, Calendar.MARCH); // 3月Calendar中3月是2这里直接用常量更清晰
} else {
calendar.set(Calendar.MONTH, Calendar.SEPTEMBER); // 9月
}
calendar.set(Calendar.DAY_OF_MONTH, 1); // 1日
Date reserveStartDate = calendar.getTime();
item.setReserveStartDate(reserveStartDate);
// --- 生成reserveEndDatestartDate加2年 ---
Calendar endCalendar = (Calendar) calendar.clone(); // 克隆避免影响原日期
endCalendar.add(Calendar.YEAR, 2); // 加2年
Date reserveEndDate = endCalendar.getTime();
item.setReserveEndDate(reserveEndDate);
}
}
// 7. 执行批量插入
if (CollectionUtils.isEmpty(insertList)) {
return 0;
}
return rtEnlistmentReserveMapper.batchInsertRtEnlistmentReserve(insertList);
}
/** /**
* 修改应征入伍保留学籍申请 * 修改应征入伍保留学籍申请
* *
@@ -250,7 +344,7 @@ public class RtEnlistmentReserveServiceImpl extends ServiceImpl<RtEnlistmentRese
Long applyStatus = rtEnlistmentReserve.getApplyStatus(); Long applyStatus = rtEnlistmentReserve.getApplyStatus();
if (1L == applyStatus) { if (1L == applyStatus) {
// 绑定当前学生ID启动流程 // 绑定当前学生ID启动流程
rtEnlistmentReserve.setStudentId(SecurityUtils.getUserId()); // rtEnlistmentReserve.setStudentId(SecurityUtils.getUserId());
ProcessResultDto processResultDto = startEnlistmentReserveProcess(rtEnlistmentReserve); ProcessResultDto processResultDto = startEnlistmentReserveProcess(rtEnlistmentReserve);
if (processResultDto == null || StringUtils.isBlank(processResultDto.getProcessInstanceId())) { if (processResultDto == null || StringUtils.isBlank(processResultDto.getProcessInstanceId())) {
throw new ServiceException("流程启动失败,请重试", 500); throw new ServiceException("流程启动失败,请重试", 500);

View File

@@ -216,6 +216,16 @@
WHERE a.stu_no = #{stuNo} WHERE a.stu_no = #{stuNo}
</select> </select>
<!-- 查询数据库中已存在的学生(按姓名+学号) -->
<select id="selectExistStudents" parameterType="java.util.List" resultType="java.lang.String">
SELECT CONCAT(student_name, '_', student_no)
FROM rt_enlistment_reserve
WHERE CONCAT(student_name, '_', student_no) IN
<foreach collection="list" item="item" open="(" separator="," close=")">
CONCAT(#{item.studentName}, '_', #{item.studentNo})
</foreach>
</select>
<insert id="insertRtEnlistmentReserve" parameterType="RtEnlistmentReserve" useGeneratedKeys="true" keyProperty="id"> <insert id="insertRtEnlistmentReserve" parameterType="RtEnlistmentReserve" useGeneratedKeys="true" keyProperty="id">
insert into rt_enlistment_reserve insert into rt_enlistment_reserve
<trim prefix="(" suffix=")" suffixOverrides=","> <trim prefix="(" suffix=")" suffixOverrides=",">
@@ -272,6 +282,68 @@
</trim> </trim>
</insert> </insert>
<!-- 批量插入 -->
<insert id="batchInsertRtEnlistmentReserve" parameterType="java.util.List" useGeneratedKeys="true" keyProperty="id">
insert into rt_enlistment_reserve
<trim prefix="(" suffix=")" suffixOverrides=",">
<if test="list != null and list.size() > 0">
<if test="list[0].applyNo != null and list[0].applyNo != ''">apply_no,</if>
<if test="list[0].studentId != null">student_id,</if>
<if test="list[0].teacherName != null and list[0].teacherName != ''">teacher_name,</if>
<if test="list[0].studentName != null and list[0].studentName != ''">student_name,</if>
<if test="list[0].gender != null and list[0].gender != ''">gender,</if>
<if test="list[0].nation != null and list[0].nation != ''">nation,</if>
<if test="list[0].grade != null and list[0].grade != ''">grade,</if>
<if test="list[0].studentNo != null and list[0].studentNo != ''">student_no,</if>
<if test="list[0].className != null and list[0].className != ''">class_name,</if>
<if test="list[0].major != null and list[0].major != ''">major,</if>
<if test="list[0].familyAddress != null and list[0].familyAddress != ''">family_address,</if>
<if test="list[0].parentPhone != null and list[0].parentPhone != ''">parent_phone,</if>
<if test="list[0].applyReason != null and list[0].applyReason != ''">apply_reason,</if>
<if test="list[0].applyStatus != null">apply_status,</if>
<if test="list[0].processInstanceId != null">process_instance_id,</if>
<if test="list[0].reserveNo != null">reserve_no,</if>
<if test="list[0].reserveStartDate != null">reserve_start_date,</if>
<if test="list[0].reserveEndDate != null">reserve_end_date,</if>
<if test="list[0].approvalNo != null">approval_no,</if>
<if test="list[0].createTime != null">create_time,</if>
<if test="list[0].updateTime != null">update_time,</if>
<if test="list[0].affixId != null">affix_id,</if>
<if test="list[0].deployId != null">deploy_id,</if>
<if test="list[0].deptName != null">dept_name,</if>
</if>
</trim>
values
<foreach collection="list" item="item" separator=",">
<trim prefix="(" suffix=")" suffixOverrides=",">
<if test="item.applyNo != null and item.applyNo != ''">#{item.applyNo},</if>
<if test="item.studentId != null">#{item.studentId},</if>
<if test="item.teacherName != null and item.teacherName != ''">#{item.teacherName},</if>
<if test="item.studentName != null and item.studentName != ''">#{item.studentName},</if>
<if test="item.gender != null and item.gender != ''">#{item.gender},</if>
<if test="item.nation != null and item.nation != ''">#{item.nation},</if>
<if test="item.grade != null and item.grade != ''">#{item.grade},</if>
<if test="item.studentNo != null and item.studentNo != ''">#{item.studentNo},</if>
<if test="item.className != null and item.className != ''">#{item.className},</if>
<if test="item.major != null and item.major != ''">#{item.major},</if>
<if test="item.familyAddress != null and item.familyAddress != ''">#{item.familyAddress},</if>
<if test="item.parentPhone != null and item.parentPhone != ''">#{item.parentPhone},</if>
<if test="item.applyReason != null and item.applyReason != ''">#{item.applyReason},</if>
<if test="item.applyStatus != null">#{item.applyStatus},</if>
<if test="item.processInstanceId != null">#{item.processInstanceId},</if>
<if test="item.reserveNo != null">#{item.reserveNo},</if>
<if test="item.reserveStartDate != null">#{item.reserveStartDate},</if>
<if test="item.reserveEndDate != null">#{item.reserveEndDate},</if>
<if test="item.approvalNo != null">#{item.approvalNo},</if>
<if test="item.createTime != null">#{item.createTime},</if>
<if test="item.updateTime != null">#{item.updateTime},</if>
<if test="item.affixId != null">#{item.affixId},</if>
<if test="item.deployId != null">#{item.deployId},</if>
<if test="item.deptName != null">#{item.deptName},</if>
</trim>
</foreach>
</insert>
<update id="updateRtEnlistmentReserve" parameterType="RtEnlistmentReserve"> <update id="updateRtEnlistmentReserve" parameterType="RtEnlistmentReserve">
update rt_enlistment_reserve update rt_enlistment_reserve
<trim prefix="SET" suffixOverrides=","> <trim prefix="SET" suffixOverrides=",">

View File

@@ -51,11 +51,107 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<result property="studentId" column="student_id" /> <result property="studentId" column="student_id" />
<result property="testData" column="test_data" /> <result property="testData" column="test_data" />
<result property="testTest" column="test_test" /> <result property="testTest" column="test_test" />
<result property="zsQmd" column="zs_qmd" />
<result property="fdQmd" column="fd_qmd" />
<result property="xwQmd" column="xw_qmd" />
<result property="rjQmd" column="rj_qmd" />
<result property="xjQmd" column="xj_qmd" />
<result property="jwcQmd" column="jwc_qmd" />
<!--填报退伍材料--> <!--填报退伍材料-->
<collection property="MaList" column="{stId = st_id}" javaType="java.util.ArrayList" select="selectMateById"/> <collection property="MaList" column="{stId = st_id}" javaType="java.util.ArrayList" select="selectMateById"/>
<!--学生表-->
<collection property="StuList" column="{stuNo = st_id}" javaType="java.util.ArrayList" select="selectSrsStudentByStuNo"/>
</resultMap> </resultMap>
<!-- 学生表关联-->
<resultMap type="SrsStudent" id="SrsStudentResult">
<result property="stuId" column="stu_id"/>
<result property="name" column="name"/>
<result property="stuNo" column="stu_no"/>
<result property="gender" column="gender"/>
<result property="birthday" column="birthday"/>
<result property="idCard" column="id_card"/>
<result property="deptId" column="dept_id"/>
<result property="majorId" column="major_id"/>
<result property="classId" column="class_id"/>
<result property="phone" column="phone"/>
<result property="address" column="address"/>
<result property="status" column="status"/>
<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="delFlag" column="del_flag"/>
<result property="xhk" column="xhk"/>
<result property="bankAddr" column="bank_addr"/>
<result property="teacherId" column="teacher_id"/>
<result property="cphName" column="cphName"/>
<result property="gradeName" column="grade_name"/>
<result property="status2" column="status2"/>
<result property="deptName" column="dept_name" />
<association property="dept" column="dept_id" javaType="SysDept" resultMap="deptResult"/>
<association property="srsMajors" column="major_id" javaType="srsMajors" resultMap="SrsMajorsResult"/>
<association property="srsClass" column="class_id" javaType="srsClass" resultMap="SrsClassResult"/>
<association property="cphTeacher" column="teacher_id" javaType="cphTeacher" resultMap="CphTeacherResult"/>
<association property="cphStuExtraInfo" column="stu_no" javaType="cphStuExtraInfo"
resultMap="CphStuExtraInfoResult"/>
</resultMap>
<!-- 学生表关联表-->
<resultMap id="CphStuExtraInfoResult" type="CphStuExtraInfo">
<result property="stuNo" column="stu_no"/>
<result property="mz" column="mz"/>
<result property="zzmm" column="zzmm"/>
<result property="jg" column="jg"/>
<result property="xx" column="xx"/>
</resultMap>
<resultMap id="CphTeacherResult" type="CphTeacher">
<result property="teacherId" column="teacher_id"/>
<result property="name" column="name"/>
</resultMap>
<resultMap type="SrsGrade" id="SrsGradeResult">
<result property="gradeId" column="grade_id"/>
<result property="gradeName" column="grade_name"/>
</resultMap>
<resultMap type="SrsClass" id="SrsClassResult">
<result property="classId" column="class_id"/>
<result property="majorId" column="major_id"/>
<result property="className" column="class_name"/>
</resultMap>
<resultMap type="SrsMajors" id="SrsMajorsResult">
<result property="majorId" column="major_id"/>
<result property="majorName" column="major_name"/>
<result property="collegeId" column="college_id"/>
<result property="majorDescription" column="major_description"/>
</resultMap>
<resultMap id="deptResult" type="SysDept">
<id property="deptId" column="dept_id"/>
<result property="parentId" column="parent_id"/>
<result property="deptName" column="dept_name"/>
<result property="ancestors" column="ancestors"/>
<result property="orderNum" column="order_num"/>
<result property="leader" column="leader"/>
<result property="status" column="dept_status"/>
</resultMap>
<resultMap id="studentName" type="CascaderEntity">
<id property="value" column="stu_id"/>
<result property="label" column="name"/>
</resultMap>
<!-- 学生表通过学号关联-->
<select id="selectSrsStudentByStuNo" resultMap="SrsStudentResult">
select *
from srs_student
<where>
<if test="stuNo != null and stuNo != ''">
and stu_no = #{stuNo}
</if>
</where>
</select>
<!-- 联表 材料上传--> <!-- 联表 材料上传-->
<resultMap type="SysDisMate" id="SysDisMateResult"> <resultMap type="SysDisMate" id="SysDisMateResult">
<result property="id" column="id" /> <result property="id" column="id" />
@@ -89,6 +185,9 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
</where> </where>
</select> </select>
<!--查询是否插入过记录--> <!--查询是否插入过记录-->
<select id="selectSysDisBasicByStId" parameterType="String" resultMap="SysDisBasicResult"> <select id="selectSysDisBasicByStId" parameterType="String" resultMap="SysDisBasicResult">
<include refid="selectSysDisBasicVo"/> <include refid="selectSysDisBasicVo"/>
@@ -128,9 +227,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
</select> </select>
<sql id="selectSysDisBasicVo"> <sql id="selectSysDisBasicVo">
select id, fx_id, fx_time, st_id, st_name, fd_name, sex, nations, fd_qm, xw_qm, er_qm, xj_qm, jw_qm, st_class, majors, grade, college, reasons, fd_idea, two_idea, xw_idea, xj_idea, jw_idea, zs_idea, zs_status, times, fd_status, xw_status, two_status, xjgl_status, jw_status, rw_time, zs_time, fd_time, xw_time, two_time, xj_time, jw_time, datab, dataa, conversion, process_id, deploy_id, student_id, test_data, test_test from sys_dis_basic select id, fx_id, fx_time, st_id, st_name, fd_name, sex, nations, fd_qm, xw_qm, er_qm, xj_qm, jw_qm, st_class, majors, grade, college, reasons, fd_idea, two_idea, xw_idea, xj_idea, jw_idea, zs_idea, zs_status, times, fd_status, xw_status, two_status, xjgl_status, jw_status, rw_time, zs_time, fd_time, xw_time, two_time, xj_time, jw_time, datab, dataa, conversion, process_id, deploy_id, student_id, test_data, test_test, zs_qmd, fd_qmd, xw_qmd, rj_qmd, xj_qmd, jwc_qmd from sys_dis_basic
</sql> </sql>
<select id="selectSysDisBasicList" parameterType="SysDisBasic" resultMap="SysDisBasicResult"> <select id="selectSysDisBasicList" parameterType="SysDisBasic" resultMap="SysDisBasicResult">
@@ -181,6 +279,12 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<if test="studentId != null "> and student_id = #{studentId}</if> <if test="studentId != null "> and student_id = #{studentId}</if>
<if test="testData != null and testData != ''"> and test_data = #{testData}</if> <if test="testData != null and testData != ''"> and test_data = #{testData}</if>
<if test="testTest != null and testTest != ''"> and test_test = #{testTest}</if> <if test="testTest != null and testTest != ''"> and test_test = #{testTest}</if>
<if test="zsQmd != null and zsQmd != ''"> and zs_qmd = #{zsQmd}</if>
<if test="fdQmd != null and fdQmd != ''"> and fd_qmd = #{fdQmd}</if>
<if test="xwQmd != null and xwQmd != ''"> and xw_qmd = #{xwQmd}</if>
<if test="rjQmd != null and rjQmd != ''"> and rj_qmd = #{rjQmd}</if>
<if test="xjQmd != null and xjQmd != ''"> and xj_qmd = #{xjQmd}</if>
<if test="jwcQmd != null and jwcQmd != ''"> and jwc_qmd = #{jwcQmd}</if>
</where> </where>
</select> </select>
@@ -237,6 +341,12 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<if test="studentId != null">student_id,</if> <if test="studentId != null">student_id,</if>
<if test="testData != null">test_data,</if> <if test="testData != null">test_data,</if>
<if test="testTest != null">test_test,</if> <if test="testTest != null">test_test,</if>
<if test="zsQmd != null">zs_qmd,</if>
<if test="fdQmd != null">fd_qmd,</if>
<if test="xwQmd != null">xw_qmd,</if>
<if test="rjQmd != null">rj_qmd,</if>
<if test="xjQmd != null">xj_qmd,</if>
<if test="jwcQmd != null">jwc_qmd,</if>
</trim> </trim>
<trim prefix="values (" suffix=")" suffixOverrides=","> <trim prefix="values (" suffix=")" suffixOverrides=",">
<if test="fxId != null">#{fxId},</if> <if test="fxId != null">#{fxId},</if>
@@ -284,6 +394,12 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<if test="studentId != null">#{studentId},</if> <if test="studentId != null">#{studentId},</if>
<if test="testData != null">#{testData},</if> <if test="testData != null">#{testData},</if>
<if test="testTest != null">#{testTest},</if> <if test="testTest != null">#{testTest},</if>
<if test="zsQmd != null">#{zsQmd},</if>
<if test="fdQmd != null">#{fdQmd},</if>
<if test="xwQmd != null">#{xwQmd},</if>
<if test="rjQmd != null">#{rjQmd},</if>
<if test="xjQmd != null">#{xjQmd},</if>
<if test="jwcQmd != null">#{jwcQmd},</if>
</trim> </trim>
</insert> </insert>
@@ -335,6 +451,12 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<if test="studentId != null">student_id = #{studentId},</if> <if test="studentId != null">student_id = #{studentId},</if>
<if test="testData != null">test_data = #{testData},</if> <if test="testData != null">test_data = #{testData},</if>
<if test="testTest != null">test_test = #{testTest},</if> <if test="testTest != null">test_test = #{testTest},</if>
<if test="zsQmd != null">zs_qmd = #{zsQmd},</if>
<if test="fdQmd != null">fd_qmd = #{fdQmd},</if>
<if test="xwQmd != null">xw_qmd = #{xwQmd},</if>
<if test="rjQmd != null">rj_qmd = #{rjQmd},</if>
<if test="xjQmd != null">xj_qmd = #{xjQmd},</if>
<if test="jwcQmd != null">jwc_qmd = #{jwcQmd},</if>
</trim> </trim>
where id = #{id} where id = #{id}
</update> </update>

View File

@@ -39,15 +39,10 @@
<version>3.5.3.1</version> <version>3.5.3.1</version>
<scope>compile</scope> <scope>compile</scope>
</dependency> </dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-core</artifactId>
<version>3.5.3.1</version>
<scope>compile</scope>
</dependency>
<dependency> <dependency>
<groupId>org.projectlombok</groupId> <groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId> <artifactId>lombok</artifactId>
<version>1.18.32</version>
</dependency> </dependency>
<dependency> <dependency>
<groupId>com.baomidou</groupId> <groupId>com.baomidou</groupId>
@@ -55,12 +50,6 @@
<version>3.5.3.1</version> <version>3.5.3.1</version>
<scope>compile</scope> <scope>compile</scope>
</dependency> </dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-extension</artifactId>
<version>3.3.0</version>
<scope>compile</scope>
</dependency>
</dependencies> </dependencies>

View File

@@ -226,6 +226,13 @@ public class SysTeacherKpiFilling extends BaseEntity {
@Excel(name = "个人填报-加分项") @Excel(name = "个人填报-加分项")
private List<SysTeacherKpiFillingBonusPoints> kpiFillingBonusPointsList; private List<SysTeacherKpiFillingBonusPoints> kpiFillingBonusPointsList;
/**
* 个人填报-加分项佐证材料
*/
@ApiModelProperty(value = "个人填报-加分项佐证材料", hidden = true)
@Excel(name = "个人填报-加分项佐证材料")
private List<SysTeacherKpiFillingBonusPointsMaterials> kpiFillingBonusPointsMaterialsList;
/** /**
* 个人填报-就业指导工作 * 个人填报-就业指导工作
*/ */

View File

@@ -0,0 +1,81 @@
package com.srs.teacher.domain;
import java.util.Date;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.srs.common.annotation.Excel;
import com.baomidou.mybatisplus.annotation.*;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.*;
import com.srs.common.core.domain.BaseEntity;
import javax.validation.constraints.NotNull;
/**
* 业绩考核-个人填报-加分项佐证材料对象 sys_teacher_kpi_filling_bonus_points_materials
*
* @author Codex
* @date 2026-03-26
*/
@Data
@EqualsAndHashCode(callSuper = true)
@NoArgsConstructor
@AllArgsConstructor
@Builder
@ApiModel(value = "SysTeacherKpiFillingBonusPointsMaterials对象", description = "业绩考核-个人填报-加分项佐证材料")
@TableName("sys_teacher_kpi_filling_bonus_points_materials")
public class SysTeacherKpiFillingBonusPointsMaterials extends BaseEntity {
private static final long serialVersionUID = 1L;
@ApiModelProperty("id")
@TableId(value = "id", type = IdType.AUTO)
private Long id;
@ApiModelProperty("加分项类型")
@TableField("bonus_type")
@Excel(name = "加分项类型")
private String bonusType;
@ApiModelProperty("加分分值")
@TableField("bonus_scoring")
@Excel(name = "加分分值")
private Integer bonusScoring;
@ApiModelProperty("佐证说明")
@TableField("main_content")
@Excel(name = "佐证说明")
private String mainContent;
@ApiModelProperty("发生时间")
@TableField("development_time")
@JsonFormat(pattern = "yyyy-MM-dd")
@Excel(name = "发生时间", width = 30, dateFormat = "yyyy-MM-dd")
private Date developmentTime;
@ApiModelProperty("佐证图片")
@TableField("photo")
@Excel(name = "佐证图片")
private String photo;
@ApiModelProperty(value = "辅导员姓名", required = true)
@TableField("fdy_name")
@Excel(name = "辅导员姓名")
private String fdyName;
@ApiModelProperty(value = "填报年份", required = true)
@TableField("filling_year")
@Excel(name = "填报年份")
private String fillingYear;
@ApiModelProperty(value = "填报月份", required = true)
@TableField("filling_month")
@Excel(name = "填报月份")
@NotNull(message = "填报月份不能为空")
private String fillingMonth;
@ApiModelProperty("班级类型 graduate-毕业班 ungraduate-非毕业班")
@TableField("class_type")
@Excel(name = "班级类型")
private String classType;
}

View File

@@ -0,0 +1,34 @@
package com.srs.teacher.mapper;
import java.util.List;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.srs.teacher.domain.SysTeacherKpiFillingBonusPointsMaterials;
import org.apache.ibatis.annotations.Param;
/**
* 业绩考核-个人填报-加分项佐证材料Mapper接口
*
* @author Codex
* @date 2026-03-26
*/
public interface SysTeacherKpiFillingBonusPointsMaterialsMapper extends BaseMapper<SysTeacherKpiFillingBonusPointsMaterials> {
SysTeacherKpiFillingBonusPointsMaterials selectSysTeacherKpiFillingBonusPointsMaterialsById(Long id);
List<SysTeacherKpiFillingBonusPointsMaterials> selectSysTeacherKpiFillingBonusPointsMaterialsList(SysTeacherKpiFillingBonusPointsMaterials materials);
List<SysTeacherKpiFillingBonusPointsMaterials> selectSysTeacherKpiFillingBonusPointsMaterialsByFdyName(
@Param("fdyName") String fdyName,
@Param("fillingYear") String fillingYear,
@Param("fillingMonth") String fillingMonth,
@Param("classType") String classType,
@Param("bonusType") String bonusType);
int insertSysTeacherKpiFillingBonusPointsMaterials(SysTeacherKpiFillingBonusPointsMaterials materials);
int updateSysTeacherKpiFillingBonusPointsMaterials(SysTeacherKpiFillingBonusPointsMaterials materials);
int deleteSysTeacherKpiFillingBonusPointsMaterialsById(Long id);
int deleteSysTeacherKpiFillingBonusPointsMaterialsByIds(Long[] ids);
}

View File

@@ -0,0 +1,34 @@
package com.srs.teacher.service;
import java.util.List;
import com.baomidou.mybatisplus.extension.service.IService;
import com.srs.teacher.domain.SysTeacherKpiFillingBonusPointsMaterials;
import org.apache.ibatis.annotations.Param;
/**
* 业绩考核-个人填报-加分项佐证材料Service接口
*
* @author Codex
* @date 2026-03-26
*/
public interface ISysTeacherKpiFillingBonusPointsMaterialsService extends IService<SysTeacherKpiFillingBonusPointsMaterials> {
SysTeacherKpiFillingBonusPointsMaterials selectSysTeacherKpiFillingBonusPointsMaterialsById(Long id);
List<SysTeacherKpiFillingBonusPointsMaterials> selectSysTeacherKpiFillingBonusPointsMaterialsList(SysTeacherKpiFillingBonusPointsMaterials materials);
List<SysTeacherKpiFillingBonusPointsMaterials> selectSysTeacherKpiFillingBonusPointsMaterialsByFdyName(
@Param("fdyName") String fdyName,
@Param("fillingYear") String fillingYear,
@Param("fillingMonth") String fillingMonth,
@Param("classType") String classType,
@Param("bonusType") String bonusType);
int insertSysTeacherKpiFillingBonusPointsMaterials(SysTeacherKpiFillingBonusPointsMaterials materials);
int updateSysTeacherKpiFillingBonusPointsMaterials(SysTeacherKpiFillingBonusPointsMaterials materials);
int deleteSysTeacherKpiFillingBonusPointsMaterialsByIds(Long[] ids);
int deleteSysTeacherKpiFillingBonusPointsMaterialsById(Long id);
}

View File

@@ -0,0 +1,61 @@
package com.srs.teacher.service.impl;
import java.util.List;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.srs.common.utils.SecurityUtils;
import com.srs.teacher.domain.SysTeacherKpiFillingBonusPointsMaterials;
import com.srs.teacher.mapper.SysTeacherKpiFillingBonusPointsMaterialsMapper;
import com.srs.teacher.service.ISysTeacherKpiFillingBonusPointsMaterialsService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
/**
* 业绩考核-个人填报-加分项佐证材料Service业务层处理
*
* @author Codex
* @date 2026-03-26
*/
@Service
public class SysTeacherKpiFillingBonusPointsMaterialsServiceImpl extends ServiceImpl<SysTeacherKpiFillingBonusPointsMaterialsMapper, SysTeacherKpiFillingBonusPointsMaterials> implements ISysTeacherKpiFillingBonusPointsMaterialsService {
@Autowired
private SysTeacherKpiFillingBonusPointsMaterialsMapper materialsMapper;
@Override
public SysTeacherKpiFillingBonusPointsMaterials selectSysTeacherKpiFillingBonusPointsMaterialsById(Long id) {
return materialsMapper.selectSysTeacherKpiFillingBonusPointsMaterialsById(id);
}
@Override
public List<SysTeacherKpiFillingBonusPointsMaterials> selectSysTeacherKpiFillingBonusPointsMaterialsList(SysTeacherKpiFillingBonusPointsMaterials materials) {
materials.setFdyName(SecurityUtils.getLoginUser().getUser().getNickName());
return materialsMapper.selectSysTeacherKpiFillingBonusPointsMaterialsList(materials);
}
@Override
public List<SysTeacherKpiFillingBonusPointsMaterials> selectSysTeacherKpiFillingBonusPointsMaterialsByFdyName(String fdyName, String fillingYear, String fillingMonth, String classType, String bonusType) {
return materialsMapper.selectSysTeacherKpiFillingBonusPointsMaterialsByFdyName(fdyName, fillingYear, fillingMonth, classType, bonusType);
}
@Override
public int insertSysTeacherKpiFillingBonusPointsMaterials(SysTeacherKpiFillingBonusPointsMaterials materials) {
materials.setFdyName(SecurityUtils.getLoginUser().getUser().getNickName());
return materialsMapper.insertSysTeacherKpiFillingBonusPointsMaterials(materials);
}
@Override
public int updateSysTeacherKpiFillingBonusPointsMaterials(SysTeacherKpiFillingBonusPointsMaterials materials) {
materials.setFdyName(SecurityUtils.getLoginUser().getUser().getNickName());
return materialsMapper.updateSysTeacherKpiFillingBonusPointsMaterials(materials);
}
@Override
public int deleteSysTeacherKpiFillingBonusPointsMaterialsByIds(Long[] ids) {
return materialsMapper.deleteSysTeacherKpiFillingBonusPointsMaterialsByIds(ids);
}
@Override
public int deleteSysTeacherKpiFillingBonusPointsMaterialsById(Long id) {
return materialsMapper.deleteSysTeacherKpiFillingBonusPointsMaterialsById(id);
}
}

View File

@@ -77,10 +77,10 @@ public class SysTeacherKpiFillingNegativeListServiceImpl extends ServiceImpl<Sys
@Override @Override
public int updateSysTeacherKpiFillingNegativeList(SysTeacherKpiFillingNegativeList sysTeacherKpiFillingNegativeList) { public int updateSysTeacherKpiFillingNegativeList(SysTeacherKpiFillingNegativeList sysTeacherKpiFillingNegativeList) {
// 判断填报记录是否填报 // 判断填报记录是否填报
List<SysTeacherKpiFillingNegativeList> sysTeacherKpiFillingNegativeLists = sysTeacherKpiFillingNegativeListMapper.selectSysTeacherKpiFillingNegativeListByFdyName(sysTeacherKpiFillingNegativeList.getFdyName(), sysTeacherKpiFillingNegativeList.getFillingYear(), sysTeacherKpiFillingNegativeList.getFillingMonth(), sysTeacherKpiFillingNegativeList.getClassType()); /*List<SysTeacherKpiFillingNegativeList> sysTeacherKpiFillingNegativeLists = sysTeacherKpiFillingNegativeListMapper.selectSysTeacherKpiFillingNegativeListByFdyName(sysTeacherKpiFillingNegativeList.getFdyName(), sysTeacherKpiFillingNegativeList.getFillingYear(), sysTeacherKpiFillingNegativeList.getFillingMonth(), sysTeacherKpiFillingNegativeList.getClassType());
if (sysTeacherKpiFillingNegativeLists != null && !sysTeacherKpiFillingNegativeLists.isEmpty()) { if (sysTeacherKpiFillingNegativeLists != null && !sysTeacherKpiFillingNegativeLists.isEmpty()) {
throw new ServiceException("已提交,请勿重复提交", 500); throw new ServiceException("已提交,请勿重复提交", 500);
} }*/
return sysTeacherKpiFillingNegativeListMapper.updateSysTeacherKpiFillingNegativeList(sysTeacherKpiFillingNegativeList); return sysTeacherKpiFillingNegativeListMapper.updateSysTeacherKpiFillingNegativeList(sysTeacherKpiFillingNegativeList);
} }

View File

@@ -0,0 +1,125 @@
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.srs.teacher.mapper.SysTeacherKpiFillingBonusPointsMaterialsMapper">
<resultMap type="SysTeacherKpiFillingBonusPointsMaterials" id="SysTeacherKpiFillingBonusPointsMaterialsResult">
<result property="id" column="id"/>
<result property="bonusType" column="bonus_type"/>
<result property="bonusScoring" column="bonus_scoring"/>
<result property="mainContent" column="main_content"/>
<result property="developmentTime" column="development_time"/>
<result property="photo" column="photo"/>
<result property="fdyName" column="fdy_name"/>
<result property="fillingYear" column="filling_year"/>
<result property="fillingMonth" column="filling_month"/>
<result property="classType" column="class_type"/>
</resultMap>
<sql id="selectSysTeacherKpiFillingBonusPointsMaterialsVo">
select id, bonus_type, bonus_scoring, main_content, development_time, photo, fdy_name, filling_year, filling_month, class_type
from sys_teacher_kpi_filling_bonus_points_materials
</sql>
<select id="selectSysTeacherKpiFillingBonusPointsMaterialsList" parameterType="SysTeacherKpiFillingBonusPointsMaterials"
resultMap="SysTeacherKpiFillingBonusPointsMaterialsResult">
<include refid="selectSysTeacherKpiFillingBonusPointsMaterialsVo"/>
<where>
<if test="bonusType != null and bonusType != ''">and bonus_type = #{bonusType}</if>
<if test="bonusScoring != null">and bonus_scoring = #{bonusScoring}</if>
<if test="mainContent != null and mainContent != ''">and main_content like concat('%', #{mainContent}, '%')</if>
<if test="developmentTime != null">and development_time = #{developmentTime}</if>
<if test="fdyName != null and fdyName != ''">and fdy_name like concat('%', #{fdyName}, '%')</if>
<if test="fillingYear != null and fillingYear != ''">and filling_year = #{fillingYear}</if>
<if test="fillingMonth != null and fillingMonth != ''">and filling_month = #{fillingMonth}</if>
<if test="classType != null and classType != ''">and class_type = #{classType}</if>
</where>
order by id desc
</select>
<select id="selectSysTeacherKpiFillingBonusPointsMaterialsByFdyName" parameterType="String"
resultMap="SysTeacherKpiFillingBonusPointsMaterialsResult">
<include refid="selectSysTeacherKpiFillingBonusPointsMaterialsVo"/>
<where>
<if test="fdyName != null and fdyName != ''">
and fdy_name = #{fdyName}
</if>
<if test="fillingYear != null and fillingYear != ''">
and filling_year = #{fillingYear}
</if>
<if test="fillingMonth != null and fillingMonth != ''">
and filling_month = #{fillingMonth}
</if>
<if test="classType != null and classType != ''">
and class_type = #{classType}
</if>
<if test="bonusType != null and bonusType != ''">
and bonus_type = #{bonusType}
</if>
</where>
order by id desc
</select>
<select id="selectSysTeacherKpiFillingBonusPointsMaterialsById" parameterType="Long"
resultMap="SysTeacherKpiFillingBonusPointsMaterialsResult">
<include refid="selectSysTeacherKpiFillingBonusPointsMaterialsVo"/>
where id = #{id}
</select>
<insert id="insertSysTeacherKpiFillingBonusPointsMaterials" parameterType="SysTeacherKpiFillingBonusPointsMaterials"
useGeneratedKeys="true" keyProperty="id">
insert into sys_teacher_kpi_filling_bonus_points_materials
<trim prefix="(" suffix=")" suffixOverrides=",">
<if test="bonusType != null and bonusType != ''">bonus_type,</if>
<if test="bonusScoring != null">bonus_scoring,</if>
<if test="mainContent != null and mainContent != ''">main_content,</if>
<if test="developmentTime != null">development_time,</if>
<if test="photo != null and photo != ''">photo,</if>
<if test="fdyName != null and fdyName != ''">fdy_name,</if>
<if test="fillingYear != null and fillingYear != ''">filling_year,</if>
<if test="fillingMonth != null and fillingMonth != ''">filling_month,</if>
<if test="classType != null and classType != ''">class_type,</if>
</trim>
<trim prefix="values (" suffix=")" suffixOverrides=",">
<if test="bonusType != null and bonusType != ''">#{bonusType},</if>
<if test="bonusScoring != null">#{bonusScoring},</if>
<if test="mainContent != null and mainContent != ''">#{mainContent},</if>
<if test="developmentTime != null">#{developmentTime},</if>
<if test="photo != null and photo != ''">#{photo},</if>
<if test="fdyName != null and fdyName != ''">#{fdyName},</if>
<if test="fillingYear != null and fillingYear != ''">#{fillingYear},</if>
<if test="fillingMonth != null and fillingMonth != ''">#{fillingMonth},</if>
<if test="classType != null and classType != ''">#{classType},</if>
</trim>
</insert>
<update id="updateSysTeacherKpiFillingBonusPointsMaterials" parameterType="SysTeacherKpiFillingBonusPointsMaterials">
update sys_teacher_kpi_filling_bonus_points_materials
<trim prefix="SET" suffixOverrides=",">
<if test="bonusType != null and bonusType != ''">bonus_type = #{bonusType},</if>
<if test="bonusScoring != null">bonus_scoring = #{bonusScoring},</if>
<if test="mainContent != null and mainContent != ''">main_content = #{mainContent},</if>
<if test="developmentTime != null">development_time = #{developmentTime},</if>
<if test="photo != null">photo = #{photo},</if>
<if test="fdyName != null and fdyName != ''">fdy_name = #{fdyName},</if>
<if test="fillingYear != null and fillingYear != ''">filling_year = #{fillingYear},</if>
<if test="fillingMonth != null and fillingMonth != ''">filling_month = #{fillingMonth},</if>
<if test="classType != null and classType != ''">class_type = #{classType},</if>
</trim>
where id = #{id}
</update>
<delete id="deleteSysTeacherKpiFillingBonusPointsMaterialsById" parameterType="Long">
delete
from sys_teacher_kpi_filling_bonus_points_materials
where id = #{id}
</delete>
<delete id="deleteSysTeacherKpiFillingBonusPointsMaterialsByIds" parameterType="String">
delete from sys_teacher_kpi_filling_bonus_points_materials where id in
<foreach item="id" collection="array" open="(" separator="," close=")">
#{id}
</foreach>
</delete>
</mapper>

View File

@@ -51,6 +51,10 @@
<collection property="kpiFillingBonusPointsList" <collection property="kpiFillingBonusPointsList"
column="{fdyName = fdy_name, fillingYear = filling_year, fillingMonth = filling_month, classType = class_type}" column="{fdyName = fdy_name, fillingYear = filling_year, fillingMonth = filling_month, classType = class_type}"
javaType="java.util.ArrayList" select="selectKpiFillingBonusPointsById"/> javaType="java.util.ArrayList" select="selectKpiFillingBonusPointsById"/>
<!--个人填报-加分项佐证材料子表的集合 -->
<collection property="kpiFillingBonusPointsMaterialsList"
column="{fdyName = fdy_name, fillingYear = filling_year, fillingMonth = filling_month, classType = class_type}"
javaType="java.util.ArrayList" select="selectKpiFillingBonusPointsMaterialsById"/>
<!--个人填报-就业指导工作子表的集合 --> <!--个人填报-就业指导工作子表的集合 -->
<collection property="kpiFillingGraduationGuidanceList" <collection property="kpiFillingGraduationGuidanceList"
column="{fdyName = fdy_name, fillingYear = filling_year, fillingMonth = filling_month, classType = class_type}" column="{fdyName = fdy_name, fillingYear = filling_year, fillingMonth = filling_month, classType = class_type}"
@@ -174,6 +178,20 @@
<result property="fillingMonth" column="filling_month"/> <result property="fillingMonth" column="filling_month"/>
</resultMap> </resultMap>
<!--个人填报-加分项佐证材料子表的映射 -->
<resultMap type="SysTeacherKpiFillingBonusPointsMaterials" id="SysTeacherKpiFillingBonusPointsMaterialsResult">
<result property="id" column="id"/>
<result property="bonusType" column="bonus_type"/>
<result property="bonusScoring" column="bonus_scoring"/>
<result property="mainContent" column="main_content"/>
<result property="developmentTime" column="development_time"/>
<result property="photo" column="photo"/>
<result property="fdyName" column="fdy_name"/>
<result property="fillingYear" column="filling_year"/>
<result property="fillingMonth" column="filling_month"/>
<result property="classType" column="class_type"/>
</resultMap>
<!--个人填报-就业指导工作子表的映射 --> <!--个人填报-就业指导工作子表的映射 -->
<resultMap type="SysTeacherKpiFillingGraduationGuidance" id="SysTeacherKpiFillingGraduationGuidanceResult"> <resultMap type="SysTeacherKpiFillingGraduationGuidance" id="SysTeacherKpiFillingGraduationGuidanceResult">
<result property="id" column="id"/> <result property="id" column="id"/>
@@ -325,6 +343,26 @@
</where> </where>
</select> </select>
<!--个人填报-加分项佐证材料子表的数据-->
<select id="selectKpiFillingBonusPointsMaterialsById" resultMap="SysTeacherKpiFillingBonusPointsMaterialsResult">
select *
from sys_teacher_kpi_filling_bonus_points_materials
<where>
<if test="fdyName != null and fdyName != ''">
and fdy_name = #{fdyName}
</if>
<if test="fillingYear != null and fillingYear != ''">
and filling_year = #{fillingYear}
</if>
<if test="fillingMonth != null and fillingMonth != ''">
and filling_month = #{fillingMonth}
</if>
<if test="classType != null and classType != ''">
and class_type = #{classType}
</if>
</where>
</select>
<!--个人填报-就业指导工作子表的数据--> <!--个人填报-就业指导工作子表的数据-->
<select id="selectKpiFillingGraduationGuidanceById" resultMap="SysTeacherKpiFillingGraduationGuidanceResult"> <select id="selectKpiFillingGraduationGuidanceById" resultMap="SysTeacherKpiFillingGraduationGuidanceResult">
select * select *