diff --git a/src/main/java/com/sztzjy/forex/trading_trading/controller/GradeWeightController.java b/src/main/java/com/sztzjy/forex/trading_trading/controller/GradeWeightController.java index 1bb123a..8f3d032 100644 --- a/src/main/java/com/sztzjy/forex/trading_trading/controller/GradeWeightController.java +++ b/src/main/java/com/sztzjy/forex/trading_trading/controller/GradeWeightController.java @@ -35,7 +35,7 @@ public class GradeWeightController { public ResultEntity add(@RequestBody GradeWeightBO bo) { Assert.notNull(bo, "参数错误"); JwtUser user = TokenProvider.getJWTUser(request); - gradeWeightService.insert(bo,user); + gradeWeightService.insert(bo, user); return new ResultEntity(HttpStatus.OK); } @@ -46,6 +46,9 @@ public class GradeWeightController { public ResultEntity> findCurrentWeight() { JwtUser currentUser = TokenProvider.getJWTUser(request); List gradeWeights = gradeWeightService.findWeightBySchoolId(currentUser.getSchoolId()); + if (gradeWeights == null || gradeWeights.size() == 0) { + gradeWeights = gradeWeightService.createDefaultWeights(currentUser); + } return new ResultEntity>(gradeWeights); } diff --git a/src/main/java/com/sztzjy/forex/trading_trading/controller/IndexController.java b/src/main/java/com/sztzjy/forex/trading_trading/controller/IndexController.java index c990e51..233197d 100644 --- a/src/main/java/com/sztzjy/forex/trading_trading/controller/IndexController.java +++ b/src/main/java/com/sztzjy/forex/trading_trading/controller/IndexController.java @@ -42,14 +42,13 @@ public class IndexController { public ResultEntity> findAll(@ApiParam("分页索引:{0}为第一页") Integer index, @ApiParam("页量") @RequestParam Integer size, @ApiParam("班级") @RequestParam(required = false) String classGrade, - @ApiParam("学号") @RequestParam(required = false) String studentNumber, @ApiParam("姓名") @RequestParam(required = false) String name, @ApiParam("日期") @RequestParam(required = false) @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") Date startTime, @ApiParam("实训任务名字") @RequestParam(required = false) String trainingName ) { JwtUser currentUser = TokenProvider.getJWTUser(request); int schoolId = currentUser.getSchoolId(); - PageInfo byConditions = indexService.findByConditions(index, size, classGrade, studentNumber, name, startTime, trainingName, schoolId); + PageInfo byConditions = indexService.findByConditions(index, size, classGrade, name, startTime, trainingName, schoolId); return new ResultEntity<>(byConditions); } diff --git a/src/main/java/com/sztzjy/forex/trading_trading/controller/MemberController.java b/src/main/java/com/sztzjy/forex/trading_trading/controller/MemberController.java index 817d94a..c129200 100644 --- a/src/main/java/com/sztzjy/forex/trading_trading/controller/MemberController.java +++ b/src/main/java/com/sztzjy/forex/trading_trading/controller/MemberController.java @@ -20,16 +20,25 @@ import com.sztzjy.forex.trading_trading.service.TrainingService; import com.sztzjy.forex.trading_trading.util.BigDecimalUtils; import com.sztzjy.forex.trading_trading.util.ForexMarketDateUtil; import com.sztzjy.forex.trading_trading.util.ResultEntity; +import com.sztzjy.forex.trading_trading.util.excel.ExcelData; +import com.sztzjy.forex.trading_trading.util.excel.ExcelProvider; +import com.sztzjy.forex.trading_trading.util.file.IFileUtil; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiParam; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; +import org.springframework.util.Assert; import org.springframework.web.bind.annotation.*; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.FileNotFoundException; +import java.io.FileOutputStream; +import java.text.DecimalFormat; +import java.text.NumberFormat; +import java.util.ArrayList; +import java.util.Arrays; import java.util.List; @@ -60,6 +69,9 @@ public class MemberController { @Autowired ForexMarketDateUtil forexMarketDateUtil; + @Autowired + IFileUtil fileUtil; + @AnonymousAccess @PostMapping("getMemberById") public ResultEntity getMember(@RequestBody String memberId) { @@ -128,12 +140,13 @@ public class MemberController { @ApiParam("页量") @RequestParam(required = false) Integer size) { JwtUser jwtUser = TokenProvider.getJWTUser(request); - PageInfo pageInfo = memberService.pagedListMembers(className, trainingName, markStatus, keyword, jwtUser.getSchoolId(),index, size); + PageInfo pageInfo = memberService.pagedListMembers(className, trainingName, markStatus, keyword, jwtUser,index, size); if (!pageInfo.getList().isEmpty()) { for (MemberVO vo : pageInfo.getList()) { Training training = trainingService.findById(vo.getTrainingId()); if (vo.getYield() == null || training == null) continue; vo.setTradeTrainingScore(gradeWeightService.findWeightByWeightIdAndYield(training.getWeightId(), vo.getYield()).getActualScore()); + vo.setTotalScore(vo.getTradeTrainingScore() + (vo.getReportScore()==null?0:vo.getReportScore())); } } return new ResultEntity>(pageInfo); @@ -148,20 +161,45 @@ public class MemberController { @ApiParam("查询关键字:学号或学生名称") String keyword, String TOKEN, HttpServletResponse response) throws FileNotFoundException { - TokenProvider.getJWTUser(TOKEN); - memberService.exportMembers(className, trainingName, markStatus, keyword, response); + JwtUser jwtUser = TokenProvider.getJWTUser(TOKEN); + + + List members = memberService.exportMembers(className, trainingName, markStatus, keyword, jwtUser, response); + Assert.notNull(members, "没有可导出数据"); + List titles = Arrays.asList("实训任务名称", "班级", "学号", "姓名", "排名", "累计盈亏", "收益率", "模拟交易实训成绩", "实训报告成绩", "总成绩"); + ExcelData excelData = ExcelData.create(titles); + for (MemberVO member : members) { + List rows = new ArrayList<>(); + rows.add(member.getTrainingName()); + rows.add(member.getClassGrade()); + rows.add(member.getStudentNumber()); + rows.add(member.getName()); + rows.add(member.getStuRank()); + rows.add(member.getCumulativeProfitLoss()); + rows.add(member.getYield()); + rows.add(member.getTradeTrainingScore()); + rows.add(member.getReportScore()); + rows.add(member.getTotalScore()); + excelData.addRow(rows); + } + String fileName = "学生排行榜数据.xlsx"; + String file = fileUtil.getFullPath(fileName); + FileOutputStream fileOut = new FileOutputStream(file); + ExcelProvider.SimpleExcelExport(excelData, fileOut); + fileUtil.download(response, fileName); + fileUtil.remove(file); } @Permission(codes = PermissionType.TRAINING_MANAGEMENT_SEARCH) @ApiOperation("根据实训任务id获取成员列表") @GetMapping("listMembersByTrainingId") - public ResultEntity> listMembersByTrainingId(@RequestParam String trainingId, + public ResultEntity> listMembersByTrainingId(@RequestParam String trainingId, @ApiParam("班级id") Integer classId, @ApiParam("查询关键字:学号和姓名")String keyword, @RequestParam Integer index, @RequestParam Integer size) { - PageInfo members = memberService.pageListMemberByTrainingId(trainingId, classId,keyword,index, size); - return new ResultEntity>(members); + PageInfo members = memberService.pageListMemberByTrainingId(trainingId, classId,keyword,index, size); + return new ResultEntity>(members); } diff --git a/src/main/java/com/sztzjy/forex/trading_trading/controller/UserController.java b/src/main/java/com/sztzjy/forex/trading_trading/controller/UserController.java index 475a74d..6ed51ac 100644 --- a/src/main/java/com/sztzjy/forex/trading_trading/controller/UserController.java +++ b/src/main/java/com/sztzjy/forex/trading_trading/controller/UserController.java @@ -50,18 +50,33 @@ public class UserController { @OperateLog(description = "用户登录") @ApiOperation(value = "用户登录", httpMethod = "POST") @PostMapping("login") - public ResultEntity login(@ApiParam("用户名") @RequestParam String username, - @ApiParam("加密后的密文") @RequestParam String passwordEncode) { + public ResultEntity login(@ApiParam("用户名") String username, + @ApiParam("加密后的密文") String passwordEncode, + @ApiParam("智云携带的token") String TOKEN) { String password; - try { - password = RsaUtil.decryptByPrivateKey(passwordEncode); - } catch (Exception e) { - throw new IllegalArgumentException("密码错误"); + JwtUser jwtUser; + if (!StringUtils.hasText(username) && !StringUtils.hasText(passwordEncode) && !StringUtils.hasText(TOKEN)) { + throw new IllegalArgumentException("请提供登录凭据"); + } + if (StringUtils.hasText(TOKEN)) { + jwtUser = TokenProvider.getJWTUserByZhiYun(TOKEN); + if (jwtUser == null) { + throw new IllegalArgumentException("token无效"); + } + } else { + try { + password = RsaUtil.decryptByPrivateKey(passwordEncode); + } catch (Exception e) { + throw new IllegalArgumentException("密码错误"); + } + String md5Pwd = RsaUtil.calculateMD5(password); + String hashPwd = RsaUtil.formatHash(md5Pwd); + jwtUser = TzApi.foreignExchangeTradingLogin(username, hashPwd); + if (jwtUser == null) { + throw new IllegalArgumentException("用户名或密码错误"); + } } - String md5Pwd = RsaUtil.calculateMD5(password); - String hashPwd = RsaUtil.formatHash(md5Pwd); - JwtUser jwtUser = TzApi.foreignExchangeTradingLogin(username, hashPwd); jwtUser.setAuthorityCodes(roleAuthorityService.getAuthorityByRoleId(jwtUser.getRoleId())); Authentication authentication = new UsernamePasswordAuthenticationToken(jwtUser, null, jwtUser.getAuthorities()); SecurityContextHolder.getContext().setAuthentication(authentication); @@ -84,7 +99,6 @@ public class UserController { } - @ApiOperation(value = "注销登录", httpMethod = "POST") @PostMapping("/logout") public ResultEntity logout(HttpServletRequest request) { @@ -100,8 +114,7 @@ public class UserController { } - -// @Permission() + // @Permission() @AnonymousAccess @ApiOperation("获取当前在线用户") @GetMapping("online-users") diff --git a/src/main/java/com/sztzjy/forex/trading_trading/dto/MemberVO.java b/src/main/java/com/sztzjy/forex/trading_trading/dto/MemberVO.java index bad93a0..44211b2 100644 --- a/src/main/java/com/sztzjy/forex/trading_trading/dto/MemberVO.java +++ b/src/main/java/com/sztzjy/forex/trading_trading/dto/MemberVO.java @@ -9,6 +9,8 @@ import lombok.Data; import lombok.Getter; import lombok.Setter; +import java.text.DecimalFormat; +import java.text.NumberFormat; import java.util.ArrayList; import java.util.List; @@ -33,7 +35,7 @@ public class MemberVO { @ApiModelProperty("交易实训成绩") public Double tradeTrainingScore; @ApiModelProperty("实训报告成绩") - public Double trainingReportScore; + public Double reportScore; @ApiModelProperty("总成绩") public Double totalScore; @ApiModelProperty("排名") @@ -42,7 +44,20 @@ public class MemberVO { public String memberId; @ApiModelProperty("实训id") public String trainingId; - + @ApiModelProperty("实训状态") + public String trainingStatus; + @ApiModelProperty("收益率百分比") + public String strYield; + @ApiModelProperty("总资产") + public Double totalAssets; + @ApiModelProperty("期初资金") + public Double initialCapital; + @ApiModelProperty("可用资金") + public Double availableFunds; + @ApiModelProperty("开仓次数") + public Integer openingTrades; + @ApiModelProperty("平仓次数") + public Integer closingTrades; public static MemberVO create(MemberVO vo, List gradeWeights) { for (GradeWeight weight : gradeWeights) { @@ -61,4 +76,12 @@ public class MemberVO { }); return result; } + + public String getStrYield() { + NumberFormat percentFormat = new DecimalFormat("#0.00%"); + this.yield = yield == null ? 0 : yield; + String formattedYield = percentFormat.format(this.yield); + return formattedYield; + + } } 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 c6c7eac..26079ba 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 @@ -1,5 +1,6 @@ package com.sztzjy.forex.trading_trading.mappers; +import com.sztzjy.forex.trading_trading.config.security.JwtUser; import com.sztzjy.forex.trading_trading.dto.MemberVO; import com.sztzjy.forex.trading_trading.entity.Member; import com.sztzjy.forex.trading_trading.entity.MemberExample; @@ -7,10 +8,8 @@ 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; +import org.apache.ibatis.annotations.*; +import org.apache.ibatis.type.JdbcType; @Mapper public interface MemberMapper { @@ -65,8 +64,50 @@ public interface MemberMapper { */ List selectByExample(MemberExample example); - - List pagedListMembers(MemberExample example); + List selectByCondition(MemberExample example); + + @Select("") + @Results(id = "memberVO", value = { + @Result(column = "member_id", property = "memberId", jdbcType = JdbcType.VARCHAR, id = true), + @Result(column = "training_id", property = "trainingId", jdbcType = JdbcType.VARCHAR), + @Result(column = "name", property = "name", jdbcType = JdbcType.VARCHAR), + @Result(column = "student_number",property = "studentNumber", jdbcType = JdbcType.VARCHAR), + @Result(column = "class_grade",property = "classGrade", jdbcType = JdbcType.VARCHAR), + @Result(column = "stu_rank",property = "stuRank", jdbcType = JdbcType.INTEGER), + @Result(column = "cumulative_profit_loss",property = "cumulativeProfitLoss", jdbcType = JdbcType.DECIMAL), + @Result(column = "report_score",property = "reportScore", jdbcType = JdbcType.DECIMAL), + @Result(column = "yield",property = "yield", jdbcType = JdbcType.DECIMAL), + @Result(column = "training_name",property = "trainingName", jdbcType = JdbcType.VARCHAR), + }) + List pagedListMembers(@Param("className") String className, + @Param("trainingName") String trainingName, + @Param("markStatus") Integer markStatus, + @Param("keyword") String keyword, + @Param("schoolId") Integer schoolId); /** * This method was generated by MyBatis Generator. @@ -155,4 +196,25 @@ public interface MemberMapper { " #{item} " + " ") void deleteMembersByTrainingIdNotInStudentInfos(@Param("trainingId") String trainingId, @Param("list") List list); + + List selectMemberByNameAndNumber( + @Param("schoolId") Integer schoolId, + @Param("name") String name + ); + + List selectMembers( + @Param("schoolId") Integer schoolId, + @Param("name") String name, + @Param("classGrade") String classGrade, + @Param("trainingId") String trainingId + ); + @Update("UPDATE sys_member AS m " + + "JOIN ( " + + " SELECT member_id, training_id, ROW_NUMBER() OVER (PARTITION BY training_id ORDER BY yield DESC,report_score DESC) AS stu_rank " + + " FROM sys_member WHERE training_id <> '999999999' " + + ") AS ranked " + + "ON m.member_id = ranked.member_id " + + "JOIN sys_training AS T on m.training_id = T.training_id " + + "SET m.stu_rank = ranked.stu_rank WHERE T.status = 'ONGOING'") + void updateStuRank(); } \ 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 3a380f4..1ff9f42 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 @@ -37,8 +37,8 @@ public class GradeWeightService { public GradeWeight createDefaultWeight(JwtUser user) { GradeWeightBO bo = new GradeWeightBO(); - bo.setSimulationTradingProfitScore(50); - bo.setExperimentalReportScore(50); + bo.setSimulationTradingProfitScore(60); + bo.setExperimentalReportScore(40); List details = new ArrayList<>(); //以原型来看,当收益率30%以上时得分为100或者收益率0%以下得分50,现给个默认值1000或-1000方便数据库区间查询 details.add(new GradeWeightDetailBO(1000, 30, 100, 1)); @@ -51,6 +51,22 @@ public class GradeWeightService { return gradeWeights.get(0); } + public List createDefaultWeights(JwtUser user) { + GradeWeightBO bo = new GradeWeightBO(); + bo.setSimulationTradingProfitScore(60); + bo.setExperimentalReportScore(40); + List details = new ArrayList<>(); + //以原型来看,当收益率30%以上时得分为100或者收益率0%以下得分50,现给个默认值1000或-1000方便数据库区间查询 + details.add(new GradeWeightDetailBO(1000, 30, 100, 1)); + details.add(new GradeWeightDetailBO(30, 10, 80, 2)); + details.add(new GradeWeightDetailBO(10, 0, 60, 3)); + details.add(new GradeWeightDetailBO(0, -1000, 50, 4)); + bo.setDetail(details); + List gradeWeights = GradeWeight.buildGradeWeights(bo, user); + gradeWeights.forEach(gradeWeightMapper::insertSelective); + return gradeWeights; + } + public List findWeightByWeightId(String weightId) { GradeWeightExample example = new GradeWeightExample(); GradeWeightExample.Criteria criteria = example.createCriteria(); diff --git a/src/main/java/com/sztzjy/forex/trading_trading/service/IndexService.java b/src/main/java/com/sztzjy/forex/trading_trading/service/IndexService.java index 7fede8d..d4c8689 100644 --- a/src/main/java/com/sztzjy/forex/trading_trading/service/IndexService.java +++ b/src/main/java/com/sztzjy/forex/trading_trading/service/IndexService.java @@ -22,14 +22,12 @@ public class IndexService { private final MemberMapper memberMapper; private final TrainingMapper trainingMapper; - //TODO 实训任务结束后系统自动显示模拟交易实训成绩,教师评分之后显示实验报告成绩。 - // 首页分页 排序 模糊查询 - public PageInfo findByConditions(Integer index, Integer size, String classGrade, String studentNumber, String name, Date startTime, String trainingName, Integer schoolId) { + public PageInfo findByConditions(Integer index, Integer size, String classGrade, String name, Date startTime, String trainingName, Integer schoolId) { TrainingExample trainingExample = new TrainingExample(); PageHelper.startPage(index, size); // 跳转到首页 没有参数 显示所有 - if (classGrade == null && studentNumber == null && name == null && startTime == null && trainingName == null) { + if (classGrade == null && name == null && startTime == null && trainingName == null) { MemberExample memberExample = new MemberExample(); MemberExample.Criteria criteria = memberExample.createCriteria(); if (schoolId != null) { @@ -52,35 +50,25 @@ public class IndexService { if (StringUtils.isNotEmpty(trainingName)) { criteria.andTrainingNameEqualTo(trainingName); } - if (startTime!=null) { + if (startTime != null) { criteria.andStartTimeEqualTo(startTime); } List trainings = null; - if (StringUtils.isNotEmpty(trainingName) || startTime!=null) { + if (StringUtils.isNotEmpty(trainingName) || startTime != null) { trainings = trainingMapper.selectByExample(trainingExample); } List members = new ArrayList<>(); + if (trainings == null || trainings.isEmpty()) { + if (classGrade == null && name == null) { + return null; + } + } if (trainings != null && !trainings.isEmpty()) { //根据trainingName查到了对象 for (Training training : trainings) { - MemberExample memberExample = new MemberExample(); - MemberExample.Criteria criteria1 = memberExample.createCriteria(); String trainingId = training.getTrainingId(); - if (trainingId != null) { - criteria1.andTrainingIdEqualTo(trainingId); - } - if (StringUtils.isNotEmpty(classGrade)) { - criteria1.andClassGradeLike("%" + classGrade + "%"); - } - if (StringUtils.isNotEmpty(studentNumber)) { - criteria1.andStudentNumberLike("%" + studentNumber + "%"); - } - if (StringUtils.isNotEmpty(name)) { - criteria1.andNameLike("%" + name + "%"); - } - memberExample.setOrderByClause("yield DESC"); - List membersForTraining = memberMapper.selectByExample(memberExample); + List membersForTraining = memberMapper.selectMembers(schoolId, name, classGrade, trainingId); // for (int i = 1; i <= membersForTraining.size(); i++) { for (Member member : membersForTraining) { member.setStuRank(i); @@ -88,33 +76,17 @@ public class IndexService { } } members.addAll(membersForTraining); + return new PageInfo<>(members); } - return new PageInfo<>(members); - } - //没有传training表中两个参数时,直接查member表 - MemberExample memberExample = new MemberExample(); - MemberExample.Criteria criteria1 = memberExample.createCriteria(); - if (schoolId != null) { - criteria1.andSchoolIdEqualTo(schoolId); - } - if (StringUtils.isNotEmpty(classGrade)) { - criteria1.andClassGradeLike("%" + classGrade + "%"); - } - if (StringUtils.isNotEmpty(studentNumber)) { - criteria1.andStudentNumberLike("%" + studentNumber + "%"); - } - if (StringUtils.isNotEmpty(name)) { - criteria1.andNameLike("%" + name + "%"); } - memberExample.setOrderByClause("yield DESC"); PageHelper.startPage(index, size); - List membersForTraining = memberMapper.selectByExample(memberExample); - for (int i = 1; i <= membersForTraining.size(); i++) { - for (Member member : membersForTraining) { - member.setStuRank(i); + List resultMembers = memberMapper.selectMemberByNameAndNumber(schoolId, name); + for (int i = 1; i <= resultMembers.size(); i++) { + for (Member resultMember : resultMembers) { + resultMember.setStuRank(i); i++; } } - return new PageInfo<>(membersForTraining); + return new PageInfo<>(resultMembers); } } 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 45b5372..4c55f13 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 @@ -5,10 +5,7 @@ import com.github.pagehelper.PageInfo; import com.sztzjy.forex.trading_trading.config.Constant; import com.sztzjy.forex.trading_trading.config.security.JwtUser; import com.sztzjy.forex.trading_trading.dto.MemberVO; -import com.sztzjy.forex.trading_trading.entity.ForexMarketData; -import com.sztzjy.forex.trading_trading.entity.Member; -import com.sztzjy.forex.trading_trading.entity.MemberExample; -import com.sztzjy.forex.trading_trading.entity.TakeStash; +import com.sztzjy.forex.trading_trading.entity.*; import com.sztzjy.forex.trading_trading.mappers.MemberMapper; import com.sztzjy.forex.trading_trading.util.BigDecimalUtils; import com.sztzjy.forex.trading_trading.util.ForexMarketDateUtil; @@ -28,6 +25,7 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.Map; +import java.util.stream.Collectors; @Service public class MemberService { @@ -90,39 +88,39 @@ public class MemberService { String trainingName, Integer markStatus, String keyword, - Integer schoolId, + JwtUser user, Integer page, Integer size) { - MemberExample example = new MemberExample(); - MemberExample.Criteria criteria = example.createCriteria(); - criteria.andSchoolIdEqualTo(schoolId); - if (StringUtils.hasText(className)) { - criteria.andClassGradeEqualTo(className); - } - if (StringUtils.hasText(trainingName)) { - criteria.andTrainingNameEqualTo(trainingName); - } - if (markStatus != null) { - //未评分 - if (markStatus == 0) { - criteria.andReportScoreIsNull(); - } else { - //已评分 - criteria.andReportScoreIsNotNull(); - } - } - if (StringUtils.hasText(keyword)) { - criteria.andNameLike("%" + keyword + "%"); - MemberExample.Criteria orCriteria = example.createCriteria(); - orCriteria.andStudentNumberEqualTo("%" + keyword + "%"); - example.or(orCriteria); - } +// MemberExample example = new MemberExample(); +// MemberExample.Criteria criteria = example.createCriteria(); +// criteria.andSchoolIdEqualTo(user.getSchoolId()); +// if (StringUtils.hasText(className)) { +// criteria.andClassGradeEqualTo(className); +// } +// if (StringUtils.hasText(trainingName)) { +// criteria.andTrainingNameEqualTo(trainingName); +// } +// if (markStatus != null) { +// //未评分 +// if (markStatus == 0) { +// criteria.andReportScoreIsNull(); +// } else { +// //已评分 +// criteria.andReportScoreIsNotNull(); +// } +// } +// if (StringUtils.hasText(keyword)) { +// criteria.andNameLike("%" + keyword + "%"); +// MemberExample.Criteria orCriteria = example.createCriteria(); +// orCriteria.andStudentNumberEqualTo("%" + keyword + "%"); +// example.or(orCriteria); +// } PageHelper.startPage(page, size); - return new PageInfo<>(memberMapper.pagedListMembers(example)); + return new PageInfo<>(memberMapper.pagedListMembers(className, trainingName, markStatus, keyword, user.getSchoolId())); } - public PageInfo pageListMemberByTrainingId(String trainingId, + public PageInfo pageListMemberByTrainingId(String trainingId, Integer classId, String keyword, Integer index, @@ -130,25 +128,26 @@ public class MemberService { MemberExample example = new MemberExample(); MemberExample.Criteria criteria = example.createCriteria(); criteria.andTrainingIdEqualTo(trainingId); - if (classId!=null&&classId>0) { - criteria.andClassIdEqualTo(classId); + if (classId != null && classId > 0) { + criteria.andClassIdEqualTo(classId); } - if(StringUtils.hasText(keyword)){ - criteria.andNameLike("%"+keyword+"%"); + if (StringUtils.hasText(keyword)) { + criteria.andNameLike("%" + keyword + "%"); MemberExample.Criteria orCriteria = example.createCriteria(); - orCriteria.andStudentNumberEqualTo("%"+keyword+"%"); + orCriteria.andStudentNumberEqualTo("%" + keyword + "%"); example.or(orCriteria); } example.setOrderByClause("stu_rank ASC"); PageHelper.startPage(index, size); - return new PageInfo<>(memberMapper.selectByExample(example)); + return new PageInfo<>(memberMapper.selectByCondition(example)); } - public void exportMembers(String className, + public List exportMembers(String className, String trainingName, Integer markStatus, String keyword, + JwtUser user, HttpServletResponse response) throws FileNotFoundException { MemberExample example = new MemberExample(); MemberExample.Criteria criteria = example.createCriteria(); @@ -173,30 +172,8 @@ public class MemberService { orCriteria.andStudentNumberEqualTo("%" + keyword + "%"); example.or(orCriteria); } - List members = memberMapper.pagedListMembers(example); - Assert.notNull(members, "没有可导出数据"); - List titles = Arrays.asList("实训任务名称", "班级", "学号", "姓名", "排名", "累计盈亏", "收益率", "模拟交易实训成绩", "实训报告成绩", "总成绩"); - ExcelData excelData = ExcelData.create(titles); - for (MemberVO member : members) { - List rows = new ArrayList<>(); - rows.add(member.getTrainingName()); - rows.add(member.getClassGrade()); - rows.add(member.getStudentNumber()); - rows.add(member.getName()); - rows.add(member.getStuRank()); - rows.add(member.getCumulativeProfitLoss()); - rows.add(member.getYield()); - rows.add(member.getTradeTrainingScore()); - rows.add(member.getTrainingReportScore()); - rows.add(member.getTotalScore()); - excelData.addRow(rows); - } - String fileName = "学生排行榜数据.xlsx"; - String file = fileUtil.getFullPath(fileName); - FileOutputStream fileOut = new FileOutputStream(file); - ExcelProvider.SimpleExcelExport(excelData, fileOut); - fileUtil.download(response, fileName); - fileUtil.remove(file); + List members = memberMapper.pagedListMembers(className, trainingName, markStatus, keyword, user.getSchoolId()); + return members; } public List> classScoreTrend(Integer schoolId) { @@ -223,17 +200,17 @@ public class MemberService { return memberMapper.selectAllTrainingList(schoolId); } - public List findByTrainingId(String trainingId){ + public List findByTrainingId(String trainingId) { MemberExample example = new MemberExample(); example.createCriteria().andTrainingIdEqualTo(trainingId); return memberMapper.selectByExample(example); } - public Member findByTrainingIdAndStudentNumber(String trainingId,String studentNumber){ + 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; + return members.size() > 0 ? members.get(0) : null; } // 分批处理删除业务,防止当studentNumbers过多时生成的SQL语句可能会超过数据库支持的最大长度限制,从而导致SQL执行失败 @@ -255,21 +232,21 @@ public class MemberService { } //获取可用资金 - public Double getAvailableFunds(Member member){ + public Double getAvailableFunds(Member member) { Double positionProfitLoss = flashTotalPositionProfitLoss(member.getMemberId()); - if (positionProfitLoss==null){ - positionProfitLoss=0.0; + if (positionProfitLoss == null) { + positionProfitLoss = 0.0; } Double initialCapital = member.getInitialCapital();//初始资金 - Double totalAssets = initialCapital+positionProfitLoss; + Double totalAssets = initialCapital + positionProfitLoss; Double netValue = bigDecimalUtils.add(totalAssets, positionProfitLoss); Double cumulativeProfitLoss = member.getCumulativeProfitLoss(); //累计盈亏 - if(cumulativeProfitLoss==null){ + if (cumulativeProfitLoss == null) { member.setCumulativeProfitLoss(0.0); } Double marginUsed = member.getMarginUsed(); //获取已用保证金 - if (marginUsed==null){ - marginUsed=0.0; + if (marginUsed == null) { + marginUsed = 0.0; } return bigDecimalUtils.sub(netValue, marginUsed); } @@ -297,7 +274,7 @@ public class MemberService { if (Constant.BUY_BUYSELLTYPE.equals(buySellType)) { //买 profitAndLoss = (nowSellPic - priceTransaction) * volumeTransaction * Constant.PEACEQUANTITY; } else { //卖 - profitAndLoss = (priceTransaction-nowBuyPic) * volumeTransaction * Constant.PEACEQUANTITY; + profitAndLoss = (priceTransaction - nowBuyPic) * volumeTransaction * Constant.PEACEQUANTITY; } } totalProfitAndLoss = totalProfitAndLoss + profitAndLoss; @@ -305,4 +282,8 @@ public class MemberService { } return totalProfitAndLoss; } + + public void updateStuRank(){ + memberMapper.updateStuRank(); + } } 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 ca5fd29..947e5f6 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 @@ -161,7 +161,9 @@ public class ReportService { Assert.isTrue(member != null && member.getTrainingId() != null, "数据异常"); Training training = trainingService.findById(member.getTrainingId()); Assert.isTrue(training != null && training.getWeightId() != null, "数据异常"); - member.setReportScore(gradeWeightService.findReportScore(training.getWeightId(), score)); + + Double reportScore = gradeWeightService.findReportScore(training.getWeightId(), score); + member.setReportScore(reportScore); memberMapper.updateByPrimaryKeySelective(member); } diff --git a/src/main/java/com/sztzjy/forex/trading_trading/service/ScheduledTask.java b/src/main/java/com/sztzjy/forex/trading_trading/service/ScheduledTask.java index b333436..632c34a 100644 --- a/src/main/java/com/sztzjy/forex/trading_trading/service/ScheduledTask.java +++ b/src/main/java/com/sztzjy/forex/trading_trading/service/ScheduledTask.java @@ -345,4 +345,9 @@ public class ScheduledTask { } } + @Scheduled(cron = "0 */5 * * * ?") + public void updateStuRank() { + memberService.updateStuRank(); + } + } diff --git a/src/main/java/com/sztzjy/forex/trading_trading/service/TrainingService.java b/src/main/java/com/sztzjy/forex/trading_trading/service/TrainingService.java index e955638..a24328a 100644 --- a/src/main/java/com/sztzjy/forex/trading_trading/service/TrainingService.java +++ b/src/main/java/com/sztzjy/forex/trading_trading/service/TrainingService.java @@ -18,10 +18,7 @@ import org.springframework.util.StringUtils; import java.time.LocalDateTime; import java.time.ZoneId; -import java.util.ArrayList; -import java.util.Date; -import java.util.List; -import java.util.Map; +import java.util.*; @Service public class TrainingService { @@ -100,6 +97,7 @@ public class TrainingService { TrainingExample example = new TrainingExample(); TrainingExample.Criteria criteria = example.createCriteria(); criteria.andSchoolIdEqualTo(schoolId); + example.setOrderByClause("create_time desc"); PageHelper.startPage(pageNo, pageSize); return new PageInfo<>(trainingMapper.selectByExample(example)); } @@ -125,8 +123,12 @@ public class TrainingService { for (Member member : members) { String trainingId = member.getTrainingId(); Training training = trainingMapper.selectByPrimaryKey(trainingId); - trainingList.add(training); + if (training != null) { + trainingList.add(training); + } } + List statusOrder = Arrays.asList("ONGOING", "NOT_STARTED", "FINISHED"); + trainingList.sort(Comparator.comparingInt(training -> statusOrder.indexOf(training.getStatus()))); return new PageInfo<>(trainingList); } return new PageInfo<>(); diff --git a/src/main/resources/mappers/MemberMapper.xml b/src/main/resources/mappers/MemberMapper.xml index 935582b..078f09e 100644 --- a/src/main/resources/mappers/MemberMapper.xml +++ b/src/main/resources/mappers/MemberMapper.xml @@ -1,258 +1,260 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - and ${criterion.condition} - - - and ${criterion.condition} #{criterion.value} - - - and ${criterion.condition} #{criterion.value} and #{criterion.secondValue} - - - and ${criterion.condition} - - #{listItem} - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + and ${criterion.condition} + + + and ${criterion.condition} #{criterion.value} + + + and ${criterion.condition} #{criterion.value} and #{criterion.secondValue} + + + and ${criterion.condition} + + #{listItem} + + + + + + - - - - - + + - - - member_id, training_id, name, student_number, major, class_grade, stu_rank, initial_capital, - total_assets, net_value, margin_used, available_funds, margin_level, position_profit_loss, - cumulative_profit_loss, yield, opening_trades, closing_trades, school_id, create_school, - training_name, report_score, class_id - - - - - delete from sys_member - where member_id = #{memberId,jdbcType=VARCHAR} - - - - delete from sys_member - - - - - - - insert into sys_member (member_id, training_id, name, - student_number, major, class_grade, - stu_rank, initial_capital, total_assets, - net_value, margin_used, available_funds, - margin_level, position_profit_loss, cumulative_profit_loss, - yield, opening_trades, closing_trades, - school_id, create_school, training_name, - report_score, class_id) - values (#{memberId,jdbcType=VARCHAR}, #{trainingId,jdbcType=VARCHAR}, #{name,jdbcType=VARCHAR}, - #{studentNumber,jdbcType=VARCHAR}, #{major,jdbcType=VARCHAR}, #{classGrade,jdbcType=VARCHAR}, - #{stuRank,jdbcType=INTEGER}, #{initialCapital,jdbcType=DOUBLE}, #{totalAssets,jdbcType=DOUBLE}, - #{netValue,jdbcType=DOUBLE}, #{marginUsed,jdbcType=DOUBLE}, #{availableFunds,jdbcType=DOUBLE}, - #{marginLevel,jdbcType=DOUBLE}, #{positionProfitLoss,jdbcType=DOUBLE}, #{cumulativeProfitLoss,jdbcType=DOUBLE}, - #{yield,jdbcType=DOUBLE}, #{openingTrades,jdbcType=INTEGER}, #{closingTrades,jdbcType=INTEGER}, - #{schoolId,jdbcType=INTEGER}, #{createSchool,jdbcType=VARCHAR}, #{trainingName,jdbcType=VARCHAR}, - #{reportScore,jdbcType=INTEGER}, #{classId,jdbcType=INTEGER}) - - - - - update sys_member - set member_id = #{record.memberId,jdbcType=VARCHAR}, - training_id = #{record.trainingId,jdbcType=VARCHAR}, - name = #{record.name,jdbcType=VARCHAR}, - student_number = #{record.studentNumber,jdbcType=VARCHAR}, - major = #{record.major,jdbcType=VARCHAR}, - class_grade = #{record.classGrade,jdbcType=VARCHAR}, - stu_rank = #{record.stuRank,jdbcType=INTEGER}, - initial_capital = #{record.initialCapital,jdbcType=DOUBLE}, - total_assets = #{record.totalAssets,jdbcType=DOUBLE}, - net_value = #{record.netValue,jdbcType=DOUBLE}, - margin_used = #{record.marginUsed,jdbcType=DOUBLE}, - available_funds = #{record.availableFunds,jdbcType=DOUBLE}, - margin_level = #{record.marginLevel,jdbcType=DOUBLE}, - position_profit_loss = #{record.positionProfitLoss,jdbcType=DOUBLE}, - cumulative_profit_loss = #{record.cumulativeProfitLoss,jdbcType=DOUBLE}, - yield = #{record.yield,jdbcType=DOUBLE}, - opening_trades = #{record.openingTrades,jdbcType=INTEGER}, - closing_trades = #{record.closingTrades,jdbcType=INTEGER}, - school_id = #{record.schoolId,jdbcType=INTEGER}, - create_school = #{record.createSchool,jdbcType=VARCHAR}, - training_name = #{record.trainingName,jdbcType=VARCHAR}, - report_score = #{record.reportScore,jdbcType=INTEGER}, - class_id = #{record.classId,jdbcType=INTEGER} - - - - - - - update sys_member - - - training_id = #{trainingId,jdbcType=VARCHAR}, - - - name = #{name,jdbcType=VARCHAR}, - - - student_number = #{studentNumber,jdbcType=VARCHAR}, - - - major = #{major,jdbcType=VARCHAR}, - - - class_grade = #{classGrade,jdbcType=VARCHAR}, - - - stu_rank = #{stuRank,jdbcType=INTEGER}, - - - initial_capital = #{initialCapital,jdbcType=DOUBLE}, - - - total_assets = #{totalAssets,jdbcType=DOUBLE}, - - - net_value = #{netValue,jdbcType=DOUBLE}, - - - margin_used = #{marginUsed,jdbcType=DOUBLE}, - - - available_funds = #{availableFunds,jdbcType=DOUBLE}, - - - margin_level = #{marginLevel,jdbcType=DOUBLE}, - - - position_profit_loss = #{positionProfitLoss,jdbcType=DOUBLE}, - - - cumulative_profit_loss = #{cumulativeProfitLoss,jdbcType=DOUBLE}, - - - yield = #{yield,jdbcType=DOUBLE}, - - - opening_trades = #{openingTrades,jdbcType=INTEGER}, - - - closing_trades = #{closingTrades,jdbcType=INTEGER}, - - - school_id = #{schoolId,jdbcType=INTEGER}, - - - create_school = #{createSchool,jdbcType=VARCHAR}, - - - training_name = #{trainingName,jdbcType=VARCHAR}, - - - report_score = #{reportScore,jdbcType=INTEGER}, - - - class_id = #{classId,jdbcType=INTEGER}, - - - where member_id = #{memberId,jdbcType=VARCHAR} - + + + member_id, training_id, name, student_number, major, class_grade, stu_rank, initial_capital, + total_assets, net_value, margin_used, available_funds, margin_level, position_profit_loss, + cumulative_profit_loss, yield, opening_trades, closing_trades, school_id, create_school, + training_name, report_score, class_id + + + + + delete from sys_member + where member_id = #{memberId,jdbcType=VARCHAR} + + + + delete from sys_member + + + + + + + insert into sys_member (member_id, training_id, name, + student_number, major, class_grade, + stu_rank, initial_capital, total_assets, + net_value, margin_used, available_funds, + margin_level, position_profit_loss, cumulative_profit_loss, + yield, opening_trades, closing_trades, + school_id, create_school, training_name, + report_score, class_id) + values (#{memberId,jdbcType=VARCHAR}, #{trainingId,jdbcType=VARCHAR}, #{name,jdbcType=VARCHAR}, + #{studentNumber,jdbcType=VARCHAR}, #{major,jdbcType=VARCHAR}, #{classGrade,jdbcType=VARCHAR}, + #{stuRank,jdbcType=INTEGER}, #{initialCapital,jdbcType=DOUBLE}, #{totalAssets,jdbcType=DOUBLE}, + #{netValue,jdbcType=DOUBLE}, #{marginUsed,jdbcType=DOUBLE}, #{availableFunds,jdbcType=DOUBLE}, + #{marginLevel,jdbcType=DOUBLE}, #{positionProfitLoss,jdbcType=DOUBLE}, #{cumulativeProfitLoss,jdbcType=DOUBLE}, + #{yield,jdbcType=DOUBLE}, #{openingTrades,jdbcType=INTEGER}, #{closingTrades,jdbcType=INTEGER}, + #{schoolId,jdbcType=INTEGER}, #{createSchool,jdbcType=VARCHAR}, #{trainingName,jdbcType=VARCHAR}, + #{reportScore,jdbcType=INTEGER}, #{classId,jdbcType=INTEGER}) + + + + + update sys_member + set member_id = #{record.memberId,jdbcType=VARCHAR}, + training_id = #{record.trainingId,jdbcType=VARCHAR}, + name = #{record.name,jdbcType=VARCHAR}, + student_number = #{record.studentNumber,jdbcType=VARCHAR}, + major = #{record.major,jdbcType=VARCHAR}, + class_grade = #{record.classGrade,jdbcType=VARCHAR}, + stu_rank = #{record.stuRank,jdbcType=INTEGER}, + initial_capital = #{record.initialCapital,jdbcType=DOUBLE}, + total_assets = #{record.totalAssets,jdbcType=DOUBLE}, + net_value = #{record.netValue,jdbcType=DOUBLE}, + margin_used = #{record.marginUsed,jdbcType=DOUBLE}, + available_funds = #{record.availableFunds,jdbcType=DOUBLE}, + margin_level = #{record.marginLevel,jdbcType=DOUBLE}, + position_profit_loss = #{record.positionProfitLoss,jdbcType=DOUBLE}, + cumulative_profit_loss = #{record.cumulativeProfitLoss,jdbcType=DOUBLE}, + yield = #{record.yield,jdbcType=DOUBLE}, + opening_trades = #{record.openingTrades,jdbcType=INTEGER}, + closing_trades = #{record.closingTrades,jdbcType=INTEGER}, + school_id = #{record.schoolId,jdbcType=INTEGER}, + create_school = #{record.createSchool,jdbcType=VARCHAR}, + training_name = #{record.trainingName,jdbcType=VARCHAR}, + report_score = #{record.reportScore,jdbcType=INTEGER}, + class_id = #{record.classId,jdbcType=INTEGER} + + + + + + + update sys_member + + + training_id = #{trainingId,jdbcType=VARCHAR}, + + + name = #{name,jdbcType=VARCHAR}, + + + student_number = #{studentNumber,jdbcType=VARCHAR}, + + + major = #{major,jdbcType=VARCHAR}, + + + class_grade = #{classGrade,jdbcType=VARCHAR}, + + + stu_rank = #{stuRank,jdbcType=INTEGER}, + + + initial_capital = #{initialCapital,jdbcType=DOUBLE}, + + + total_assets = #{totalAssets,jdbcType=DOUBLE}, + + + net_value = #{netValue,jdbcType=DOUBLE}, + + + margin_used = #{marginUsed,jdbcType=DOUBLE}, + + + available_funds = #{availableFunds,jdbcType=DOUBLE}, + + + margin_level = #{marginLevel,jdbcType=DOUBLE}, + + + position_profit_loss = #{positionProfitLoss,jdbcType=DOUBLE}, + + + cumulative_profit_loss = #{cumulativeProfitLoss,jdbcType=DOUBLE}, + + + yield = #{yield,jdbcType=DOUBLE}, + + + opening_trades = #{openingTrades,jdbcType=INTEGER}, + + + closing_trades = #{closingTrades,jdbcType=INTEGER}, + + + school_id = #{schoolId,jdbcType=INTEGER}, + + + create_school = #{createSchool,jdbcType=VARCHAR}, + + + training_name = #{trainingName,jdbcType=VARCHAR}, + + + report_score = #{reportScore,jdbcType=INTEGER}, + + + class_id = #{classId,jdbcType=INTEGER}, + + + where member_id = #{memberId,jdbcType=VARCHAR} + @@ -263,11 +265,14 @@ + + + + + - - select distinct @@ -343,6 +344,28 @@ order by ${orderByClause} + + + + + + + + + + + + + + + + + + + + + + insert into sys_member (member_id, training_id, name,