Compare commits
10 Commits
b4b2dd078a
...
feature/sc
| Author | SHA1 | Date | |
|---|---|---|---|
| 9b02f55436 | |||
| d24c3cf269 | |||
| ce18d4ca1f | |||
| 2b4f56753f | |||
| ac3e002ce1 | |||
| cda670bcd8 | |||
| 44e2938f71 | |||
| 1b9ffef757 | |||
| 2c591aa557 | |||
| f99b4621d2 |
11
pom.xml
11
pom.xml
@@ -15,7 +15,7 @@
|
||||
<srs.version>3.8.5</srs.version>
|
||||
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
||||
<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>
|
||||
<druid.version>1.2.16</druid.version>
|
||||
<bitwalker.version>1.21</bitwalker.version>
|
||||
@@ -234,11 +234,18 @@
|
||||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-compiler-plugin</artifactId>
|
||||
<version>3.1</version>
|
||||
<version>3.11.0</version>
|
||||
<configuration>
|
||||
<source>${java.version}</source>
|
||||
<target>${java.version}</target>
|
||||
<encoding>${project.build.sourceEncoding}</encoding>
|
||||
<annotationProcessorPaths>
|
||||
<path>
|
||||
<groupId>org.projectlombok</groupId>
|
||||
<artifactId>lombok</artifactId>
|
||||
<version>1.18.32</version>
|
||||
</path>
|
||||
</annotationProcessorPaths>
|
||||
</configuration>
|
||||
</plugin>
|
||||
</plugins>
|
||||
|
||||
@@ -195,7 +195,7 @@
|
||||
<plugin>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-maven-plugin</artifactId>
|
||||
<version>2.1.1.RELEASE</version>
|
||||
<version>2.5.14</version>
|
||||
<configuration>
|
||||
<fork>true</fork> <!-- 如果没有该配置,devtools不会生效 -->
|
||||
</configuration>
|
||||
@@ -215,7 +215,15 @@
|
||||
<failOnMissingWebXml>false</failOnMissingWebXml>
|
||||
<warName>${project.artifactId}</warName>
|
||||
</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>
|
||||
<finalName>${project.artifactId}</finalName>
|
||||
</build>
|
||||
|
||||
@@ -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("读取印章图片失败");
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -36,6 +36,7 @@ import org.springframework.web.bind.annotation.PostMapping;
|
||||
import org.springframework.web.bind.annotation.PathVariable;
|
||||
import org.springframework.web.bind.annotation.RequestBody;
|
||||
import org.springframework.web.bind.annotation.RequestMapping;
|
||||
import org.springframework.web.bind.annotation.RequestParam;
|
||||
import org.springframework.web.bind.annotation.RestController;
|
||||
import io.swagger.annotations.*;
|
||||
import com.srs.comprehensive.domain.CphGoodApply;
|
||||
@@ -729,4 +730,13 @@ public class CphGoodApplyController extends BaseController {
|
||||
return cphGoodApplyService.reApplyYxgb(cphApplyYxgb);
|
||||
}
|
||||
|
||||
@PermitAll
|
||||
@GetMapping("/checkXyjxjEligibility")
|
||||
@ApiOperation("学业奖学金资格检查")
|
||||
public AjaxResult checkXyjxjEligibility(
|
||||
@RequestParam String stuNo,
|
||||
@RequestParam(required = false) String typeCode) {
|
||||
return cphGoodApplyService.checkXyjxjEligibility(stuNo, typeCode);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -156,6 +156,34 @@ public class RtEnlistmentReserveController extends BaseController {
|
||||
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());
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 修改应征入伍保留学籍申请
|
||||
*/
|
||||
|
||||
@@ -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));
|
||||
}
|
||||
}
|
||||
@@ -9,7 +9,8 @@ srs:
|
||||
# 实例演示开关
|
||||
demoEnabled: true
|
||||
# 文件路径 示例( 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
|
||||
# 获取ip地址开关
|
||||
addressEnabled: false
|
||||
@@ -64,8 +65,8 @@ spring:
|
||||
# 国际化资源文件路径
|
||||
basename: i18n/messages
|
||||
profiles:
|
||||
# active: druid #正式环境
|
||||
active: dev #测试环境
|
||||
active: druid #正式环境
|
||||
# active: dev #测试环境
|
||||
# 文件上传
|
||||
servlet:
|
||||
multipart:
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -154,4 +154,12 @@ public interface ICphGoodApplyService extends IService<CphGoodApply> {
|
||||
* @return
|
||||
*/
|
||||
AjaxResult reApplyYxgb(CphApplyYxgb cphApplyYxgb);
|
||||
|
||||
/**
|
||||
* 学业奖学金资格检查
|
||||
* @param stuNo 学号
|
||||
* @param typeCode 奖项类型代码(可选,不传则检查所有等级)
|
||||
* @return 资格检查结果
|
||||
*/
|
||||
AjaxResult checkXyjxjEligibility(String stuNo, String typeCode);
|
||||
}
|
||||
|
||||
@@ -1200,4 +1200,207 @@ public class CphGoodApplyServiceImpl extends ServiceImpl<CphGoodApplyMapper, Cph
|
||||
if (insertAudit <= 0) throw new RuntimeException("添加审核记录失败");
|
||||
return AjaxResult.success();
|
||||
}
|
||||
|
||||
@Override
|
||||
public AjaxResult checkXyjxjEligibility(String stuNo, String typeCode) {
|
||||
try {
|
||||
SrsStudent student = srsStudentMapper.selectSrsStudentByStuNo(stuNo);
|
||||
if (student == null) {
|
||||
return AjaxResult.error("学生不存在");
|
||||
}
|
||||
|
||||
List<CphGoodTypeCode> canTypes = cphGoodApplyMapper.listXyjxjCanType();
|
||||
if (canTypes == null || canTypes.isEmpty()) {
|
||||
return AjaxResult.error("当前无可申请的奖项");
|
||||
}
|
||||
|
||||
CphCoursePassCount passCount = cphGoodApplyMapper.getOwnPassCountByCode(stuNo, canTypes.get(0).getTypeCode());
|
||||
if (passCount == null) {
|
||||
return AjaxResult.error("无法获取课程成绩信息");
|
||||
}
|
||||
|
||||
if (passCount.unpassCount > 0) {
|
||||
Map<String, Object> result = buildBaseResult(stuNo, student.getName(), false);
|
||||
result.put("reason", "您有课程成绩未通过,不能参加评优评先");
|
||||
result.put("details", buildCoursePassDetails(false, passCount.unpassCount));
|
||||
return AjaxResult.success(result);
|
||||
}
|
||||
|
||||
CphSearch searchParam = new CphSearch();
|
||||
searchParam.setStuNo(stuNo);
|
||||
searchParam.setCode(canTypes.get(0).getTypeCode());
|
||||
CphClassRankScore rankData = cphGoodApplyMapper.getOwnRankByCode(searchParam);
|
||||
|
||||
if (rankData == null) {
|
||||
return AjaxResult.error("无法获取排名信息");
|
||||
}
|
||||
|
||||
BigDecimal cphPer = new BigDecimal(rankData.cphClassRank)
|
||||
.divide(new BigDecimal(rankData.classCount), 4, RoundingMode.HALF_UP)
|
||||
.multiply(new BigDecimal(100));
|
||||
|
||||
BigDecimal stuPer = new BigDecimal(rankData.stuClassRank)
|
||||
.divide(new BigDecimal(rankData.classCount), 4, RoundingMode.HALF_UP)
|
||||
.multiply(new BigDecimal(100));
|
||||
|
||||
boolean cphPassed = cphPer.compareTo(new BigDecimal(50)) <= 0;
|
||||
|
||||
if (!cphPassed) {
|
||||
Map<String, Object> result = buildBaseResult(stuNo, student.getName(), false);
|
||||
result.put("reason", "您的综合素质排名不达标,无法申请学业奖学金");
|
||||
result.put("details", buildRankDetails(rankData, cphPer, stuPer, false, false));
|
||||
return AjaxResult.success(result);
|
||||
}
|
||||
|
||||
if (typeCode != null && !typeCode.isEmpty()) {
|
||||
return checkSpecificLevel(stuNo, student.getName(), typeCode, rankData, cphPer, stuPer);
|
||||
} else {
|
||||
return checkAllLevels(stuNo, student.getName(), rankData, cphPer, stuPer, canTypes);
|
||||
}
|
||||
|
||||
} catch (Exception ex) {
|
||||
return AjaxResult.error("资格检查失败:" + ex.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
private AjaxResult checkSpecificLevel(String stuNo, String stuName, String typeCode,
|
||||
CphClassRankScore rankData, BigDecimal cphPer, BigDecimal stuPer) {
|
||||
BigDecimal maxStuPer;
|
||||
String typeName;
|
||||
|
||||
if (typeCode.contains("YDXYJXJ")) {
|
||||
maxStuPer = new BigDecimal(3);
|
||||
typeName = "一等奖学金";
|
||||
} else if (typeCode.contains("EDXYJXJ")) {
|
||||
maxStuPer = new BigDecimal(6);
|
||||
typeName = "二等奖学金";
|
||||
} else if (typeCode.contains("SDXYJXJ")) {
|
||||
maxStuPer = new BigDecimal(9);
|
||||
typeName = "三等奖学金";
|
||||
} else {
|
||||
return AjaxResult.error("无效的奖项类型");
|
||||
}
|
||||
|
||||
boolean stuPassed = stuPer.compareTo(maxStuPer) <= 0;
|
||||
boolean eligible = stuPassed;
|
||||
|
||||
Map<String, Object> result = buildBaseResult(stuNo, stuName, eligible);
|
||||
result.put("typeCode", typeCode);
|
||||
result.put("typeName", typeName);
|
||||
result.put("reason", eligible ?
|
||||
"您符合" + typeName + "申请条件" :
|
||||
"您不符合" + typeName + "申请条件");
|
||||
result.put("details", buildRankDetails(rankData, cphPer, stuPer, true, stuPassed, maxStuPer));
|
||||
|
||||
return AjaxResult.success(result);
|
||||
}
|
||||
|
||||
private AjaxResult checkAllLevels(String stuNo, String stuName, CphClassRankScore rankData,
|
||||
BigDecimal cphPer, BigDecimal stuPer, List<CphGoodTypeCode> canTypes) {
|
||||
List<Map<String, Object>> results = new java.util.ArrayList<>();
|
||||
String highestEligible = null;
|
||||
String highestTypeName = null;
|
||||
|
||||
String[] typeCodes = {"YDXYJXJ", "EDXYJXJ", "SDXYJXJ"};
|
||||
String[] typeNames = {"一等奖学金", "二等奖学金", "三等奖学金"};
|
||||
BigDecimal[] maxStuPers = {new BigDecimal(3), new BigDecimal(6), new BigDecimal(9)};
|
||||
|
||||
for (int i = 0; i < typeCodes.length; i++) {
|
||||
boolean stuPassed = stuPer.compareTo(maxStuPers[i]) <= 0;
|
||||
boolean eligible = stuPassed;
|
||||
|
||||
Map<String, Object> levelResult = new HashMap<>();
|
||||
levelResult.put("typeCode", typeCodes[i]);
|
||||
levelResult.put("typeName", typeNames[i]);
|
||||
levelResult.put("eligible", eligible);
|
||||
levelResult.put("reason", eligible ?
|
||||
"您符合" + typeNames[i] + "申请条件" :
|
||||
"您不符合" + typeNames[i] + "申请条件");
|
||||
|
||||
results.add(levelResult);
|
||||
|
||||
if (eligible && highestEligible == null) {
|
||||
highestEligible = typeCodes[i];
|
||||
highestTypeName = typeNames[i];
|
||||
}
|
||||
}
|
||||
|
||||
boolean overallEligible = highestEligible != null;
|
||||
Map<String, Object> result = buildBaseResult(stuNo, stuName, overallEligible);
|
||||
result.put("highestEligible", highestEligible);
|
||||
result.put("highestTypeName", highestTypeName);
|
||||
result.put("reason", overallEligible ?
|
||||
"您符合" + highestTypeName + "申请条件" :
|
||||
"您不符合学业奖学金申请条件");
|
||||
result.put("results", results);
|
||||
result.put("details", buildRankDetails(rankData, cphPer, stuPer, true, true));
|
||||
|
||||
return AjaxResult.success(result);
|
||||
}
|
||||
|
||||
private Map<String, Object> buildBaseResult(String stuNo, String stuName, boolean eligible) {
|
||||
Map<String, Object> result = new HashMap<>();
|
||||
result.put("stuNo", stuNo);
|
||||
result.put("stuName", stuName);
|
||||
result.put("eligible", eligible);
|
||||
return result;
|
||||
}
|
||||
|
||||
private Map<String, Object> buildCoursePassDetails(boolean passed, int unpassCount) {
|
||||
Map<String, Object> details = new HashMap<>();
|
||||
Map<String, Object> courseCheck = new HashMap<>();
|
||||
courseCheck.put("passed", passed);
|
||||
courseCheck.put("message", passed ? "所有课程均已通过" :
|
||||
"有" + unpassCount + "门课程成绩未通过");
|
||||
details.put("coursePass", courseCheck);
|
||||
return details;
|
||||
}
|
||||
|
||||
private Map<String, Object> buildRankDetails(CphClassRankScore rankData, BigDecimal cphPer,
|
||||
BigDecimal stuPer, boolean cphPassed, boolean stuPassed) {
|
||||
return buildRankDetails(rankData, cphPer, stuPer, cphPassed, stuPassed, null);
|
||||
}
|
||||
|
||||
private Map<String, Object> buildRankDetails(CphClassRankScore rankData, BigDecimal cphPer,
|
||||
BigDecimal stuPer, boolean cphPassed,
|
||||
boolean stuPassed, BigDecimal maxStuPer) {
|
||||
Map<String, Object> details = new HashMap<>();
|
||||
|
||||
Map<String, Object> courseCheck = new HashMap<>();
|
||||
courseCheck.put("passed", true);
|
||||
courseCheck.put("message", "所有课程均已通过");
|
||||
details.put("coursePass", courseCheck);
|
||||
|
||||
Map<String, Object> cphCheck = new HashMap<>();
|
||||
cphCheck.put("passed", cphPassed);
|
||||
cphCheck.put("currentRank", rankData.cphClassRank);
|
||||
cphCheck.put("classCount", rankData.classCount);
|
||||
cphCheck.put("percentage", cphPer);
|
||||
if (maxStuPer != null) {
|
||||
cphCheck.put("requiredPercentage", 50.0);
|
||||
cphCheck.put("message", cphPassed ?
|
||||
"综合素质排名达标(前" + cphPer + "%,要求前50%)" :
|
||||
"综合素质排名不达标(前" + cphPer + "%,要求前50%)");
|
||||
} else {
|
||||
cphCheck.put("message", "综合素质排名前" + cphPer + "%");
|
||||
}
|
||||
details.put("comprehensiveRank", cphCheck);
|
||||
|
||||
Map<String, Object> stuCheck = new HashMap<>();
|
||||
stuCheck.put("passed", stuPassed);
|
||||
stuCheck.put("currentRank", rankData.stuClassRank);
|
||||
stuCheck.put("classCount", rankData.classCount);
|
||||
stuCheck.put("percentage", stuPer);
|
||||
if (maxStuPer != null) {
|
||||
stuCheck.put("requiredPercentage", maxStuPer);
|
||||
stuCheck.put("message", stuPassed ?
|
||||
"平均学分绩排名达标(前" + stuPer + "%,要求前" + maxStuPer + "%)" :
|
||||
"平均学分绩排名不达标(前" + stuPer + "%,要求前" + maxStuPer + "%)");
|
||||
} else {
|
||||
stuCheck.put("message", "平均学分绩排名前" + stuPer + "%");
|
||||
}
|
||||
details.put("scoreRank", stuCheck);
|
||||
|
||||
return details;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -140,6 +140,10 @@ public class SecurityConfig extends WebSecurityConfigurerAdapter {
|
||||
// 静态资源,可匿名访问
|
||||
.antMatchers(HttpMethod.GET, "/", "/*.html", "/**/*.html", "/**/*.css", "/**/*.js", "/profile/**").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()
|
||||
.and()
|
||||
@@ -172,6 +176,10 @@ public class SecurityConfig extends WebSecurityConfigurerAdapter {
|
||||
// 静态资源,可匿名访问
|
||||
.antMatchers(HttpMethod.GET, "/*.html", "/**/*.html", "/**/*.css", "/**/*.js", "/profile/**").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()
|
||||
.and()
|
||||
|
||||
@@ -63,6 +63,20 @@ public interface RtEnlistmentReserveMapper extends BaseMapper<RtEnlistmentReserv
|
||||
@Options(useGeneratedKeys = true, keyProperty = "id", keyColumn = "id")
|
||||
int insertRtEnlistmentReserve(RtEnlistmentReserve rtEnlistmentReserve);
|
||||
|
||||
/**
|
||||
* 批量插入应征入伍预约信息
|
||||
* @param list 应征入伍预约信息列表
|
||||
* @return 插入成功的记录数
|
||||
*/
|
||||
int batchInsertRtEnlistmentReserve(List<RtEnlistmentReserve> list);
|
||||
|
||||
/**
|
||||
* 查询数据库中已存在的学生(姓名+学号拼接)
|
||||
* @param list 待插入的学生列表
|
||||
* @return 已存在的学生标识(格式:姓名_学号)
|
||||
*/
|
||||
List<String> selectExistStudents(List<RtEnlistmentReserve> list);
|
||||
|
||||
/**
|
||||
* Mapper接口方法:统计指定年份的保留学籍记录数
|
||||
* @param year 年份(如2026)
|
||||
|
||||
@@ -45,6 +45,13 @@ public interface IRtEnlistmentReserveService extends IService<RtEnlistmentReserv
|
||||
*/
|
||||
RtEnlistmentReserve insertRtEnlistmentReserve(RtEnlistmentReserve rtEnlistmentReserve);
|
||||
|
||||
/**
|
||||
* 批量插入应征入伍预约信息
|
||||
* @param list 应征入伍预约信息列表
|
||||
* @return 插入成功的记录数
|
||||
*/
|
||||
int batchInsertRtEnlistmentReserve(List<RtEnlistmentReserve> list);
|
||||
|
||||
/**
|
||||
* 修改应征入伍保留学籍申请
|
||||
*
|
||||
|
||||
@@ -1,11 +1,10 @@
|
||||
package com.srs.routine.service.impl;
|
||||
|
||||
import java.text.SimpleDateFormat;
|
||||
import java.util.Date;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.*;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
|
||||
import com.srs.common.core.domain.AjaxResult;
|
||||
import com.srs.common.core.domain.entity.SysUser;
|
||||
import com.srs.common.doman.dto.ProcessResultDto;
|
||||
@@ -177,6 +176,101 @@ public class RtEnlistmentReserveServiceImpl extends ServiceImpl<RtEnlistmentRese
|
||||
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);
|
||||
|
||||
// --- 生成reserveEndDate(startDate加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();
|
||||
if (1L == applyStatus) {
|
||||
// 绑定当前学生ID,启动流程
|
||||
rtEnlistmentReserve.setStudentId(SecurityUtils.getUserId());
|
||||
// rtEnlistmentReserve.setStudentId(SecurityUtils.getUserId());
|
||||
ProcessResultDto processResultDto = startEnlistmentReserveProcess(rtEnlistmentReserve);
|
||||
if (processResultDto == null || StringUtils.isBlank(processResultDto.getProcessInstanceId())) {
|
||||
throw new ServiceException("流程启动失败,请重试", 500);
|
||||
|
||||
@@ -216,6 +216,16 @@
|
||||
WHERE a.stu_no = #{stuNo}
|
||||
</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 into rt_enlistment_reserve
|
||||
<trim prefix="(" suffix=")" suffixOverrides=",">
|
||||
@@ -272,6 +282,68 @@
|
||||
</trim>
|
||||
</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 rt_enlistment_reserve
|
||||
<trim prefix="SET" suffixOverrides=",">
|
||||
|
||||
@@ -39,15 +39,10 @@
|
||||
<version>3.5.3.1</version>
|
||||
<scope>compile</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.baomidou</groupId>
|
||||
<artifactId>mybatis-plus-core</artifactId>
|
||||
<version>3.5.3.1</version>
|
||||
<scope>compile</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.projectlombok</groupId>
|
||||
<artifactId>lombok</artifactId>
|
||||
<version>1.18.32</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.baomidou</groupId>
|
||||
@@ -55,12 +50,6 @@
|
||||
<version>3.5.3.1</version>
|
||||
<scope>compile</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.baomidou</groupId>
|
||||
<artifactId>mybatis-plus-extension</artifactId>
|
||||
<version>3.3.0</version>
|
||||
<scope>compile</scope>
|
||||
</dependency>
|
||||
|
||||
</dependencies>
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
@@ -77,10 +77,10 @@ public class SysTeacherKpiFillingNegativeListServiceImpl extends ServiceImpl<Sys
|
||||
@Override
|
||||
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()) {
|
||||
throw new ServiceException("已提交,请勿重复提交", 500);
|
||||
}
|
||||
}*/
|
||||
return sysTeacherKpiFillingNegativeListMapper.updateSysTeacherKpiFillingNegativeList(sysTeacherKpiFillingNegativeList);
|
||||
}
|
||||
|
||||
|
||||
@@ -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>
|
||||
Reference in New Issue
Block a user