diff --git a/src/main/java/com/sztzjy/forex/trading_trading/config/security/AuthenticationFilter.java b/src/main/java/com/sztzjy/forex/trading_trading/config/security/AuthenticationFilter.java index 6fd8ad1..b7db418 100644 --- a/src/main/java/com/sztzjy/forex/trading_trading/config/security/AuthenticationFilter.java +++ b/src/main/java/com/sztzjy/forex/trading_trading/config/security/AuthenticationFilter.java @@ -64,6 +64,7 @@ public class AuthenticationFilter extends OncePerRequestFilter { JwtUser currentUser; try { currentUser = tokenProvider.getJWTUser(token); + response.setCharacterEncoding("UTF-8"); } catch (ExpiredJwtException e1) { response.setStatus(HttpStatus.UNAUTHORIZED.value()); response.addHeader("Access-Control-Allow-Origin", "*"); @@ -75,6 +76,7 @@ public class AuthenticationFilter extends OncePerRequestFilter { response.getWriter().print("不支持的Token"); return; } catch (MalformedJwtException e3) { + response.setStatus(HttpStatus.UNAUTHORIZED.value()); response.addHeader("Access-Control-Allow-Origin", "*"); response.getWriter().print("无效的Token格式"); diff --git a/src/main/java/com/sztzjy/forex/trading_trading/config/security/TokenProvider.java b/src/main/java/com/sztzjy/forex/trading_trading/config/security/TokenProvider.java index d2cd9af..c1f6ee1 100644 --- a/src/main/java/com/sztzjy/forex/trading_trading/config/security/TokenProvider.java +++ b/src/main/java/com/sztzjy/forex/trading_trading/config/security/TokenProvider.java @@ -4,6 +4,8 @@ import com.sztzjy.forex.trading_trading.config.Constant; import com.sztzjy.forex.trading_trading.config.exception.UnAuthorizedException; import io.jsonwebtoken.*; import io.jsonwebtoken.security.Keys; +import io.jsonwebtoken.security.SignatureException; +import org.springframework.http.HttpStatus; import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; import org.springframework.stereotype.Component; import org.springframework.util.StringUtils; @@ -57,6 +59,14 @@ public class TokenProvider { jwtUser.setUsername(claims.get("username").toString()); jwtUser.setAuthorityCodes((List) claims.get("authorityCodes")); return jwtUser; + } catch (ExpiredJwtException e1) { + throw new ExpiredJwtException(null, null, "token过期"); + } catch (UnsupportedJwtException e2) { + throw new UnsupportedJwtException("不支持的token"); + } catch (MalformedJwtException e3) { + throw new MalformedJwtException("token格式错误"); + } catch (SignatureException e4) { + throw new SignatureException("签名失败"); } catch (Exception e) { throw new UnAuthorizedException("无效token"); } diff --git a/src/main/java/com/sztzjy/forex/trading_trading/controller/TrainingController.java b/src/main/java/com/sztzjy/forex/trading_trading/controller/TrainingController.java index 4ebbeab..5bb3456 100644 --- a/src/main/java/com/sztzjy/forex/trading_trading/controller/TrainingController.java +++ b/src/main/java/com/sztzjy/forex/trading_trading/controller/TrainingController.java @@ -23,6 +23,7 @@ import io.swagger.annotations.ApiParam; import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; +import org.springframework.transaction.annotation.Transactional; import org.springframework.util.Assert; import org.springframework.util.StringUtils; import org.springframework.web.bind.annotation.*; @@ -192,7 +193,7 @@ public class TrainingController { memberService.insert(member); buildPracticeMember(member); }); - trainingService.updatePeopleNum(true,trainingId); + trainingService.updatePeopleNum(true, trainingId); return new ResultEntity(HttpStatus.OK); } @@ -204,7 +205,7 @@ public class TrainingController { Assert.notNull(trainingId, "实训记录不存在"); Assert.notNull(memberId, "参赛用户不存在"); memberService.deleteById(memberId); - trainingService.updatePeopleNum(false,trainingId); + trainingService.updatePeopleNum(false, trainingId); return new ResultEntity(HttpStatus.OK); } @@ -289,4 +290,39 @@ public class TrainingController { } return new ResultEntity<>(HttpStatus.OK, memberService.selectTrainingListByClassId(classId)); } + + @Permission(codes = PermissionType.TRAINING_MANAGEMENT_EDIT) + @Transactional(rollbackFor = Exception.class) + @ApiOperation("更新参赛人员") + @GetMapping("/updateMember") + public ResultEntity updateMember(@ApiParam("实训记录id") @RequestParam String trainingId) { + JwtUser user = TokenProvider.getJWTUser(request); + List> classList = memberService.selectClassListByTrainingId(trainingId); + List insertNames = new ArrayList<>(); + + if (classList == null || classList.size() == 0) { + return new ResultEntity(HttpStatus.OK); + } + List> resultInfos = new ArrayList<>(); + List studentNos = new ArrayList<>(); + String classIdResult = classList.stream() + .map(classMap -> classMap.get("class_id").toString()) + .collect(Collectors.joining(",")); + List> studentInfos = TzApi.GetStudentInfoByClassIdForForeignExchangeTrading(classIdResult, user); + Training training = trainingService.findById(trainingId); + for (Map studentInfo : studentInfos) { + String studentNo = studentInfo.get("studentNo").toString(); + studentNos.add(studentNo); + Member existsInMember = memberService.findByTrainingIdAndStudentNumber(trainingId,studentNo); + if (existsInMember!=null) continue; + insertNames.add(studentInfo.get("name").toString()); + resultInfos.add(studentInfo); + } + if(resultInfos==null||resultInfos.size()==0){ + return new ResultEntity(HttpStatus.OK,new ArrayList<>()); + } + memberService.insertAll(buildMembers(resultInfos, training)); + memberService.deleteMembersByTrainingIdNotInStudentInfos(trainingId,studentNos); + return new ResultEntity(HttpStatus.OK, insertNames); + } } diff --git a/src/main/java/com/sztzjy/forex/trading_trading/mappers/MemberMapper.java b/src/main/java/com/sztzjy/forex/trading_trading/mappers/MemberMapper.java index aa1f983..c6c7eac 100644 --- a/src/main/java/com/sztzjy/forex/trading_trading/mappers/MemberMapper.java +++ b/src/main/java/com/sztzjy/forex/trading_trading/mappers/MemberMapper.java @@ -7,6 +7,7 @@ import com.sztzjy.forex.trading_trading.entity.MemberExample; import java.util.List; import java.util.Map; +import org.apache.ibatis.annotations.Delete; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; import org.apache.ibatis.annotations.Select; @@ -147,4 +148,11 @@ public interface MemberMapper { @Select("select training_id,training_name from sys_member where school_id=#{schoolId} " + "group by training_id,training_name") List> selectAllTrainingList(int schoolId); + + + @Delete("delete from sys_member where training_id=#{trainingId} and student_number not in" + + " " + + " #{item} " + + " ") + void deleteMembersByTrainingIdNotInStudentInfos(@Param("trainingId") String trainingId, @Param("list") List list); } \ No newline at end of file diff --git a/src/main/java/com/sztzjy/forex/trading_trading/service/GradeWeightService.java b/src/main/java/com/sztzjy/forex/trading_trading/service/GradeWeightService.java index fb16280..3a380f4 100644 --- a/src/main/java/com/sztzjy/forex/trading_trading/service/GradeWeightService.java +++ b/src/main/java/com/sztzjy/forex/trading_trading/service/GradeWeightService.java @@ -84,11 +84,14 @@ public class GradeWeightService { } public Double findReportScore(String id,Double score) { - GradeWeight gradeWeight = gradeWeightMapper.selectByPrimaryKey(id); - if (gradeWeight == null) { + GradeWeightExample example = new GradeWeightExample(); + GradeWeightExample.Criteria criteria = example.createCriteria(); + criteria.andWeightIdEqualTo(id); + List gradeWeightList = gradeWeightMapper.selectByExample(example); + if (gradeWeightList == null||gradeWeightList.size()==0) { return null; } - return gradeWeight.getReportScoreScale() * score / 100; + return gradeWeightList.get(0).getReportScoreScale() * score / 100; } } diff --git a/src/main/java/com/sztzjy/forex/trading_trading/service/MemberService.java b/src/main/java/com/sztzjy/forex/trading_trading/service/MemberService.java index 29a0158..9576b97 100644 --- a/src/main/java/com/sztzjy/forex/trading_trading/service/MemberService.java +++ b/src/main/java/com/sztzjy/forex/trading_trading/service/MemberService.java @@ -211,4 +211,35 @@ public class MemberService { public List> selectAllTrainingList(int schoolId) { return memberMapper.selectAllTrainingList(schoolId); } + + public List findByTrainingId(String trainingId){ + MemberExample example = new MemberExample(); + example.createCriteria().andTrainingIdEqualTo(trainingId); + return memberMapper.selectByExample(example); + } + + public Member findByTrainingIdAndStudentNumber(String trainingId,String studentNumber){ + MemberExample example = new MemberExample(); + example.createCriteria().andTrainingIdEqualTo(trainingId).andStudentNumberEqualTo(studentNumber); + List members = memberMapper.selectByExample(example); + return members.size()>0?members.get(0):null; + } + + // 分批处理删除业务,防止当studentNumbers过多时生成的SQL语句可能会超过数据库支持的最大长度限制,从而导致SQL执行失败 + public void deleteMembersByTrainingIdNotInStudentInfos(String trainingId, List studentNumbers) { + int batchSize = 100; // 每个批次的大小 + int totalBatches = (studentNumbers.size() + batchSize - 1) / batchSize; + for (int batch = 0; batch < totalBatches; batch++) { + int fromIndex = batch * batchSize; + int toIndex = Math.min((batch + 1) * batchSize, studentNumbers.size()); + List currentBatch = studentNumbers.subList(fromIndex, toIndex); + deleteBatchByTrainingIdNotInStudentInfos(trainingId, currentBatch); + } + } + + private void deleteBatchByTrainingIdNotInStudentInfos(String trainingId, List studentNumbers) { + MemberExample example = new MemberExample(); + example.createCriteria().andTrainingIdEqualTo(trainingId).andStudentNumberNotIn(studentNumbers); + memberMapper.deleteByExample(example); + } } diff --git a/src/main/java/com/sztzjy/forex/trading_trading/service/ReportService.java b/src/main/java/com/sztzjy/forex/trading_trading/service/ReportService.java index 7b63a64..ca5fd29 100644 --- a/src/main/java/com/sztzjy/forex/trading_trading/service/ReportService.java +++ b/src/main/java/com/sztzjy/forex/trading_trading/service/ReportService.java @@ -162,7 +162,7 @@ public class ReportService { Training training = trainingService.findById(member.getTrainingId()); Assert.isTrue(training != null && training.getWeightId() != null, "数据异常"); member.setReportScore(gradeWeightService.findReportScore(training.getWeightId(), score)); - memberMapper.updateByPrimaryKey(member); + memberMapper.updateByPrimaryKeySelective(member); }