Merge remote-tracking branch 'origin/master'

pull/1/head
yz 2 years ago
commit 232a9c25e5

@ -46,6 +46,9 @@ public class GradeWeightController {
public ResultEntity<List<GradeWeight>> findCurrentWeight() { public ResultEntity<List<GradeWeight>> findCurrentWeight() {
JwtUser currentUser = TokenProvider.getJWTUser(request); JwtUser currentUser = TokenProvider.getJWTUser(request);
List<GradeWeight> gradeWeights = gradeWeightService.findWeightBySchoolId(currentUser.getSchoolId()); List<GradeWeight> gradeWeights = gradeWeightService.findWeightBySchoolId(currentUser.getSchoolId());
if (gradeWeights == null || gradeWeights.size() == 0) {
gradeWeights = gradeWeightService.createDefaultWeights(currentUser);
}
return new ResultEntity<List<GradeWeight>>(gradeWeights); return new ResultEntity<List<GradeWeight>>(gradeWeights);
} }

@ -42,14 +42,13 @@ public class IndexController {
public ResultEntity<PageInfo<Member>> findAll(@ApiParam("分页索引:{0}为第一页") Integer index, public ResultEntity<PageInfo<Member>> findAll(@ApiParam("分页索引:{0}为第一页") Integer index,
@ApiParam("页量") @RequestParam Integer size, @ApiParam("页量") @RequestParam Integer size,
@ApiParam("班级") @RequestParam(required = false) String classGrade, @ApiParam("班级") @RequestParam(required = false) String classGrade,
@ApiParam("学号") @RequestParam(required = false) String studentNumber,
@ApiParam("姓名") @RequestParam(required = false) String name, @ApiParam("姓名") @RequestParam(required = false) String name,
@ApiParam("日期") @RequestParam(required = false) @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") Date startTime, @ApiParam("日期") @RequestParam(required = false) @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") Date startTime,
@ApiParam("实训任务名字") @RequestParam(required = false) String trainingName @ApiParam("实训任务名字") @RequestParam(required = false) String trainingName
) { ) {
JwtUser currentUser = TokenProvider.getJWTUser(request); JwtUser currentUser = TokenProvider.getJWTUser(request);
int schoolId = currentUser.getSchoolId(); int schoolId = currentUser.getSchoolId();
PageInfo<Member> byConditions = indexService.findByConditions(index, size, classGrade, studentNumber, name, startTime, trainingName, schoolId); PageInfo<Member> byConditions = indexService.findByConditions(index, size, classGrade, name, startTime, trainingName, schoolId);
return new ResultEntity<>(byConditions); return new ResultEntity<>(byConditions);
} }

@ -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.BigDecimalUtils;
import com.sztzjy.forex.trading_trading.util.ForexMarketDateUtil; import com.sztzjy.forex.trading_trading.util.ForexMarketDateUtil;
import com.sztzjy.forex.trading_trading.util.ResultEntity; 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.Api;
import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam; import io.swagger.annotations.ApiParam;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus; import org.springframework.http.HttpStatus;
import org.springframework.util.Assert;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponse;
import java.io.FileNotFoundException; 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; import java.util.List;
@ -60,6 +69,9 @@ public class MemberController {
@Autowired @Autowired
ForexMarketDateUtil forexMarketDateUtil; ForexMarketDateUtil forexMarketDateUtil;
@Autowired
IFileUtil fileUtil;
@AnonymousAccess @AnonymousAccess
@PostMapping("getMemberById") @PostMapping("getMemberById")
public ResultEntity getMember(@RequestBody String memberId) { public ResultEntity getMember(@RequestBody String memberId) {
@ -128,12 +140,13 @@ public class MemberController {
@ApiParam("页量") @RequestParam(required = false) Integer size) { @ApiParam("页量") @RequestParam(required = false) Integer size) {
JwtUser jwtUser = TokenProvider.getJWTUser(request); JwtUser jwtUser = TokenProvider.getJWTUser(request);
PageInfo<MemberVO> pageInfo = memberService.pagedListMembers(className, trainingName, markStatus, keyword, jwtUser.getSchoolId(),index, size); PageInfo<MemberVO> pageInfo = memberService.pagedListMembers(className, trainingName, markStatus, keyword, jwtUser,index, size);
if (!pageInfo.getList().isEmpty()) { if (!pageInfo.getList().isEmpty()) {
for (MemberVO vo : pageInfo.getList()) { for (MemberVO vo : pageInfo.getList()) {
Training training = trainingService.findById(vo.getTrainingId()); Training training = trainingService.findById(vo.getTrainingId());
if (vo.getYield() == null || training == null) continue; if (vo.getYield() == null || training == null) continue;
vo.setTradeTrainingScore(gradeWeightService.findWeightByWeightIdAndYield(training.getWeightId(), vo.getYield()).getActualScore()); vo.setTradeTrainingScore(gradeWeightService.findWeightByWeightIdAndYield(training.getWeightId(), vo.getYield()).getActualScore());
vo.setTotalScore(vo.getTradeTrainingScore() + (vo.getReportScore()==null?0:vo.getReportScore()));
} }
} }
return new ResultEntity<PageInfo<MemberVO>>(pageInfo); return new ResultEntity<PageInfo<MemberVO>>(pageInfo);
@ -148,20 +161,45 @@ public class MemberController {
@ApiParam("查询关键字:学号或学生名称") String keyword, @ApiParam("查询关键字:学号或学生名称") String keyword,
String TOKEN, String TOKEN,
HttpServletResponse response) throws FileNotFoundException { HttpServletResponse response) throws FileNotFoundException {
TokenProvider.getJWTUser(TOKEN); JwtUser jwtUser = TokenProvider.getJWTUser(TOKEN);
memberService.exportMembers(className, trainingName, markStatus, keyword, response);
List<MemberVO> members = memberService.exportMembers(className, trainingName, markStatus, keyword, jwtUser, response);
Assert.notNull(members, "没有可导出数据");
List<String> titles = Arrays.asList("实训任务名称", "班级", "学号", "姓名", "排名", "累计盈亏", "收益率", "模拟交易实训成绩", "实训报告成绩", "总成绩");
ExcelData excelData = ExcelData.create(titles);
for (MemberVO member : members) {
List<Object> 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) @Permission(codes = PermissionType.TRAINING_MANAGEMENT_SEARCH)
@ApiOperation("根据实训任务id获取成员列表") @ApiOperation("根据实训任务id获取成员列表")
@GetMapping("listMembersByTrainingId") @GetMapping("listMembersByTrainingId")
public ResultEntity<PageInfo<Member>> listMembersByTrainingId(@RequestParam String trainingId, public ResultEntity<PageInfo<MemberVO>> listMembersByTrainingId(@RequestParam String trainingId,
@ApiParam("班级id") Integer classId, @ApiParam("班级id") Integer classId,
@ApiParam("查询关键字:学号和姓名")String keyword, @ApiParam("查询关键字:学号和姓名")String keyword,
@RequestParam Integer index, @RequestParam Integer index,
@RequestParam Integer size) { @RequestParam Integer size) {
PageInfo<Member> members = memberService.pageListMemberByTrainingId(trainingId, classId,keyword,index, size); PageInfo<MemberVO> members = memberService.pageListMemberByTrainingId(trainingId, classId,keyword,index, size);
return new ResultEntity<PageInfo<Member>>(members); return new ResultEntity<PageInfo<MemberVO>>(members);
} }

@ -50,10 +50,21 @@ public class UserController {
@OperateLog(description = "用户登录") @OperateLog(description = "用户登录")
@ApiOperation(value = "用户登录", httpMethod = "POST") @ApiOperation(value = "用户登录", httpMethod = "POST")
@PostMapping("login") @PostMapping("login")
public ResultEntity<LoginResult> login(@ApiParam("用户名") @RequestParam String username, public ResultEntity<LoginResult> login(@ApiParam("用户名") String username,
@ApiParam("加密后的密文") @RequestParam String passwordEncode) { @ApiParam("加密后的密文") String passwordEncode,
@ApiParam("智云携带的token") String TOKEN) {
String password; String password;
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 { try {
password = RsaUtil.decryptByPrivateKey(passwordEncode); password = RsaUtil.decryptByPrivateKey(passwordEncode);
} catch (Exception e) { } catch (Exception e) {
@ -61,7 +72,11 @@ public class UserController {
} }
String md5Pwd = RsaUtil.calculateMD5(password); String md5Pwd = RsaUtil.calculateMD5(password);
String hashPwd = RsaUtil.formatHash(md5Pwd); String hashPwd = RsaUtil.formatHash(md5Pwd);
JwtUser jwtUser = TzApi.foreignExchangeTradingLogin(username, hashPwd); jwtUser = TzApi.foreignExchangeTradingLogin(username, hashPwd);
if (jwtUser == null) {
throw new IllegalArgumentException("用户名或密码错误");
}
}
jwtUser.setAuthorityCodes(roleAuthorityService.getAuthorityByRoleId(jwtUser.getRoleId())); jwtUser.setAuthorityCodes(roleAuthorityService.getAuthorityByRoleId(jwtUser.getRoleId()));
Authentication authentication = new UsernamePasswordAuthenticationToken(jwtUser, null, jwtUser.getAuthorities()); Authentication authentication = new UsernamePasswordAuthenticationToken(jwtUser, null, jwtUser.getAuthorities());
SecurityContextHolder.getContext().setAuthentication(authentication); SecurityContextHolder.getContext().setAuthentication(authentication);
@ -84,7 +99,6 @@ public class UserController {
} }
@ApiOperation(value = "注销登录", httpMethod = "POST") @ApiOperation(value = "注销登录", httpMethod = "POST")
@PostMapping("/logout") @PostMapping("/logout")
public ResultEntity logout(HttpServletRequest request) { public ResultEntity logout(HttpServletRequest request) {
@ -100,7 +114,6 @@ public class UserController {
} }
// @Permission() // @Permission()
@AnonymousAccess @AnonymousAccess
@ApiOperation("获取当前在线用户") @ApiOperation("获取当前在线用户")

@ -9,6 +9,8 @@ import lombok.Data;
import lombok.Getter; import lombok.Getter;
import lombok.Setter; import lombok.Setter;
import java.text.DecimalFormat;
import java.text.NumberFormat;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
@ -33,7 +35,7 @@ public class MemberVO {
@ApiModelProperty("交易实训成绩") @ApiModelProperty("交易实训成绩")
public Double tradeTrainingScore; public Double tradeTrainingScore;
@ApiModelProperty("实训报告成绩") @ApiModelProperty("实训报告成绩")
public Double trainingReportScore; public Double reportScore;
@ApiModelProperty("总成绩") @ApiModelProperty("总成绩")
public Double totalScore; public Double totalScore;
@ApiModelProperty("排名") @ApiModelProperty("排名")
@ -42,7 +44,20 @@ public class MemberVO {
public String memberId; public String memberId;
@ApiModelProperty("实训id") @ApiModelProperty("实训id")
public String trainingId; 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<GradeWeight> gradeWeights) { public static MemberVO create(MemberVO vo, List<GradeWeight> gradeWeights) {
for (GradeWeight weight : gradeWeights) { for (GradeWeight weight : gradeWeights) {
@ -61,4 +76,12 @@ public class MemberVO {
}); });
return result; 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;
}
} }

@ -1,5 +1,6 @@
package com.sztzjy.forex.trading_trading.mappers; 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.dto.MemberVO;
import com.sztzjy.forex.trading_trading.entity.Member; import com.sztzjy.forex.trading_trading.entity.Member;
import com.sztzjy.forex.trading_trading.entity.MemberExample; 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.List;
import java.util.Map; import java.util.Map;
import org.apache.ibatis.annotations.Delete; import org.apache.ibatis.annotations.*;
import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.type.JdbcType;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
@Mapper @Mapper
public interface MemberMapper { public interface MemberMapper {
@ -65,8 +64,50 @@ public interface MemberMapper {
*/ */
List<Member> selectByExample(MemberExample example); List<Member> selectByExample(MemberExample example);
List<MemberVO> selectByCondition(MemberExample example);
List<MemberVO> pagedListMembers(MemberExample example);
@Select("<script>" +
"SELECT m.*, t.status AS trainingStatus " +
"FROM sys_member m " +
"LEFT JOIN sys_training t ON m.training_id = t.training_id " +
"WHERE m.school_id = #{schoolId} " +
"AND (t.status = 'FINISHED') " +
"<if test='className != null and className.trim() != \"\"'> " +
"AND m.class_grade = #{className} " +
"</if> " +
"<if test='trainingName != null and trainingName.trim() != \"\"'> " +
"AND t.training_name = #{trainingName} " +
"</if> " +
"<if test='markStatus != null'> " +
"<if test='markStatus == 0'> " +
"AND m.report_score IS NULL " +
"</if> " +
"<if test='markStatus == 1'> " +
"AND m.report_score IS NOT NULL " +
"</if> " +
"</if> " +
"<if test='keyword != null and keyword.trim() != \"\"'> " +
"AND (m.name LIKE CONCAT('%', #{keyword}, '%') OR m.student_number LIKE CONCAT('%', #{keyword}, '%')) " +
"</if>" +
" order by stu_rank " +
"</script>")
@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<MemberVO> 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. * This method was generated by MyBatis Generator.
@ -155,4 +196,25 @@ public interface MemberMapper {
" #{item} " + " #{item} " +
" </foreach> ") " </foreach> ")
void deleteMembersByTrainingIdNotInStudentInfos(@Param("trainingId") String trainingId, @Param("list") List<String> list); void deleteMembersByTrainingIdNotInStudentInfos(@Param("trainingId") String trainingId, @Param("list") List<String> list);
List<Member> selectMemberByNameAndNumber(
@Param("schoolId") Integer schoolId,
@Param("name") String name
);
List<Member> 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();
} }

@ -37,8 +37,8 @@ public class GradeWeightService {
public GradeWeight createDefaultWeight(JwtUser user) { public GradeWeight createDefaultWeight(JwtUser user) {
GradeWeightBO bo = new GradeWeightBO(); GradeWeightBO bo = new GradeWeightBO();
bo.setSimulationTradingProfitScore(50); bo.setSimulationTradingProfitScore(60);
bo.setExperimentalReportScore(50); bo.setExperimentalReportScore(40);
List<GradeWeightDetailBO> details = new ArrayList<>(); List<GradeWeightDetailBO> details = new ArrayList<>();
//以原型来看当收益率30%以上时得分为100或者收益率0%以下得分50现给个默认值1000或-1000方便数据库区间查询 //以原型来看当收益率30%以上时得分为100或者收益率0%以下得分50现给个默认值1000或-1000方便数据库区间查询
details.add(new GradeWeightDetailBO(1000, 30, 100, 1)); details.add(new GradeWeightDetailBO(1000, 30, 100, 1));
@ -51,6 +51,22 @@ public class GradeWeightService {
return gradeWeights.get(0); return gradeWeights.get(0);
} }
public List<GradeWeight> createDefaultWeights(JwtUser user) {
GradeWeightBO bo = new GradeWeightBO();
bo.setSimulationTradingProfitScore(60);
bo.setExperimentalReportScore(40);
List<GradeWeightDetailBO> 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<GradeWeight> gradeWeights = GradeWeight.buildGradeWeights(bo, user);
gradeWeights.forEach(gradeWeightMapper::insertSelective);
return gradeWeights;
}
public List<GradeWeight> findWeightByWeightId(String weightId) { public List<GradeWeight> findWeightByWeightId(String weightId) {
GradeWeightExample example = new GradeWeightExample(); GradeWeightExample example = new GradeWeightExample();
GradeWeightExample.Criteria criteria = example.createCriteria(); GradeWeightExample.Criteria criteria = example.createCriteria();

@ -22,14 +22,12 @@ public class IndexService {
private final MemberMapper memberMapper; private final MemberMapper memberMapper;
private final TrainingMapper trainingMapper; private final TrainingMapper trainingMapper;
//TODO 实训任务结束后系统自动显示模拟交易实训成绩,教师评分之后显示实验报告成绩。
// 首页分页 排序 模糊查询 // 首页分页 排序 模糊查询
public PageInfo<Member> findByConditions(Integer index, Integer size, String classGrade, String studentNumber, String name, Date startTime, String trainingName, Integer schoolId) { public PageInfo<Member> findByConditions(Integer index, Integer size, String classGrade, String name, Date startTime, String trainingName, Integer schoolId) {
TrainingExample trainingExample = new TrainingExample(); TrainingExample trainingExample = new TrainingExample();
PageHelper.startPage(index, size); 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 memberExample = new MemberExample();
MemberExample.Criteria criteria = memberExample.createCriteria(); MemberExample.Criteria criteria = memberExample.createCriteria();
if (schoolId != null) { if (schoolId != null) {
@ -61,26 +59,16 @@ public class IndexService {
trainings = trainingMapper.selectByExample(trainingExample); trainings = trainingMapper.selectByExample(trainingExample);
} }
List<Member> members = new ArrayList<>(); List<Member> members = new ArrayList<>();
if (trainings == null || trainings.isEmpty()) {
if (classGrade == null && name == null) {
return null;
}
}
if (trainings != null && !trainings.isEmpty()) { if (trainings != null && !trainings.isEmpty()) {
//根据trainingName查到了对象 //根据trainingName查到了对象
for (Training training : trainings) { for (Training training : trainings) {
MemberExample memberExample = new MemberExample();
MemberExample.Criteria criteria1 = memberExample.createCriteria();
String trainingId = training.getTrainingId(); String trainingId = training.getTrainingId();
if (trainingId != null) { List<Member> membersForTraining = memberMapper.selectMembers(schoolId, name, classGrade, trainingId); //
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<Member> membersForTraining = memberMapper.selectByExample(memberExample);
for (int i = 1; i <= membersForTraining.size(); i++) { for (int i = 1; i <= membersForTraining.size(); i++) {
for (Member member : membersForTraining) { for (Member member : membersForTraining) {
member.setStuRank(i); member.setStuRank(i);
@ -88,33 +76,17 @@ public class IndexService {
} }
} }
members.addAll(membersForTraining); 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); PageHelper.startPage(index, size);
List<Member> membersForTraining = memberMapper.selectByExample(memberExample); List<Member> resultMembers = memberMapper.selectMemberByNameAndNumber(schoolId, name);
for (int i = 1; i <= membersForTraining.size(); i++) { for (int i = 1; i <= resultMembers.size(); i++) {
for (Member member : membersForTraining) { for (Member resultMember : resultMembers) {
member.setStuRank(i); resultMember.setStuRank(i);
i++; i++;
} }
} }
return new PageInfo<>(membersForTraining); return new PageInfo<>(resultMembers);
} }
} }

@ -5,10 +5,7 @@ import com.github.pagehelper.PageInfo;
import com.sztzjy.forex.trading_trading.config.Constant; import com.sztzjy.forex.trading_trading.config.Constant;
import com.sztzjy.forex.trading_trading.config.security.JwtUser; import com.sztzjy.forex.trading_trading.config.security.JwtUser;
import com.sztzjy.forex.trading_trading.dto.MemberVO; import com.sztzjy.forex.trading_trading.dto.MemberVO;
import com.sztzjy.forex.trading_trading.entity.ForexMarketData; import com.sztzjy.forex.trading_trading.entity.*;
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.mappers.MemberMapper; import com.sztzjy.forex.trading_trading.mappers.MemberMapper;
import com.sztzjy.forex.trading_trading.util.BigDecimalUtils; import com.sztzjy.forex.trading_trading.util.BigDecimalUtils;
import com.sztzjy.forex.trading_trading.util.ForexMarketDateUtil; import com.sztzjy.forex.trading_trading.util.ForexMarketDateUtil;
@ -28,6 +25,7 @@ import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.stream.Collectors;
@Service @Service
public class MemberService { public class MemberService {
@ -90,39 +88,39 @@ public class MemberService {
String trainingName, String trainingName,
Integer markStatus, Integer markStatus,
String keyword, String keyword,
Integer schoolId, JwtUser user,
Integer page, Integer page,
Integer size) { Integer size) {
MemberExample example = new MemberExample(); // MemberExample example = new MemberExample();
MemberExample.Criteria criteria = example.createCriteria(); // MemberExample.Criteria criteria = example.createCriteria();
criteria.andSchoolIdEqualTo(schoolId); // criteria.andSchoolIdEqualTo(user.getSchoolId());
if (StringUtils.hasText(className)) { // if (StringUtils.hasText(className)) {
criteria.andClassGradeEqualTo(className); // criteria.andClassGradeEqualTo(className);
} // }
if (StringUtils.hasText(trainingName)) { // if (StringUtils.hasText(trainingName)) {
criteria.andTrainingNameEqualTo(trainingName); // criteria.andTrainingNameEqualTo(trainingName);
} // }
if (markStatus != null) { // if (markStatus != null) {
//未评分 // //未评分
if (markStatus == 0) { // if (markStatus == 0) {
criteria.andReportScoreIsNull(); // criteria.andReportScoreIsNull();
} else { // } else {
//已评分 // //已评分
criteria.andReportScoreIsNotNull(); // criteria.andReportScoreIsNotNull();
} // }
} // }
if (StringUtils.hasText(keyword)) { // if (StringUtils.hasText(keyword)) {
criteria.andNameLike("%" + keyword + "%"); // criteria.andNameLike("%" + keyword + "%");
MemberExample.Criteria orCriteria = example.createCriteria(); // MemberExample.Criteria orCriteria = example.createCriteria();
orCriteria.andStudentNumberEqualTo("%" + keyword + "%"); // orCriteria.andStudentNumberEqualTo("%" + keyword + "%");
example.or(orCriteria); // example.or(orCriteria);
} // }
PageHelper.startPage(page, size); PageHelper.startPage(page, size);
return new PageInfo<>(memberMapper.pagedListMembers(example)); return new PageInfo<>(memberMapper.pagedListMembers(className, trainingName, markStatus, keyword, user.getSchoolId()));
} }
public PageInfo<Member> pageListMemberByTrainingId(String trainingId, public PageInfo<MemberVO> pageListMemberByTrainingId(String trainingId,
Integer classId, Integer classId,
String keyword, String keyword,
Integer index, Integer index,
@ -141,14 +139,15 @@ public class MemberService {
} }
example.setOrderByClause("stu_rank ASC"); example.setOrderByClause("stu_rank ASC");
PageHelper.startPage(index, size); PageHelper.startPage(index, size);
return new PageInfo<>(memberMapper.selectByExample(example)); return new PageInfo<>(memberMapper.selectByCondition(example));
} }
public void exportMembers(String className, public List<MemberVO> exportMembers(String className,
String trainingName, String trainingName,
Integer markStatus, Integer markStatus,
String keyword, String keyword,
JwtUser user,
HttpServletResponse response) throws FileNotFoundException { HttpServletResponse response) throws FileNotFoundException {
MemberExample example = new MemberExample(); MemberExample example = new MemberExample();
MemberExample.Criteria criteria = example.createCriteria(); MemberExample.Criteria criteria = example.createCriteria();
@ -173,30 +172,8 @@ public class MemberService {
orCriteria.andStudentNumberEqualTo("%" + keyword + "%"); orCriteria.andStudentNumberEqualTo("%" + keyword + "%");
example.or(orCriteria); example.or(orCriteria);
} }
List<MemberVO> members = memberMapper.pagedListMembers(example); List<MemberVO> members = memberMapper.pagedListMembers(className, trainingName, markStatus, keyword, user.getSchoolId());
Assert.notNull(members, "没有可导出数据"); return members;
List<String> titles = Arrays.asList("实训任务名称", "班级", "学号", "姓名", "排名", "累计盈亏", "收益率", "模拟交易实训成绩", "实训报告成绩", "总成绩");
ExcelData excelData = ExcelData.create(titles);
for (MemberVO member : members) {
List<Object> 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);
} }
public List<Map<String, Object>> classScoreTrend(Integer schoolId) { public List<Map<String, Object>> classScoreTrend(Integer schoolId) {
@ -305,4 +282,8 @@ public class MemberService {
} }
return totalProfitAndLoss; return totalProfitAndLoss;
} }
public void updateStuRank(){
memberMapper.updateStuRank();
}
} }

@ -161,7 +161,9 @@ public class ReportService {
Assert.isTrue(member != null && member.getTrainingId() != null, "数据异常"); Assert.isTrue(member != null && member.getTrainingId() != null, "数据异常");
Training training = trainingService.findById(member.getTrainingId()); Training training = trainingService.findById(member.getTrainingId());
Assert.isTrue(training != null && training.getWeightId() != null, "数据异常"); 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); memberMapper.updateByPrimaryKeySelective(member);
} }

@ -345,4 +345,9 @@ public class ScheduledTask {
} }
} }
@Scheduled(cron = "0 */5 * * * ?")
public void updateStuRank() {
memberService.updateStuRank();
}
} }

@ -18,10 +18,7 @@ import org.springframework.util.StringUtils;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.time.ZoneId; import java.time.ZoneId;
import java.util.ArrayList; import java.util.*;
import java.util.Date;
import java.util.List;
import java.util.Map;
@Service @Service
public class TrainingService { public class TrainingService {
@ -100,6 +97,7 @@ public class TrainingService {
TrainingExample example = new TrainingExample(); TrainingExample example = new TrainingExample();
TrainingExample.Criteria criteria = example.createCriteria(); TrainingExample.Criteria criteria = example.createCriteria();
criteria.andSchoolIdEqualTo(schoolId); criteria.andSchoolIdEqualTo(schoolId);
example.setOrderByClause("create_time desc");
PageHelper.startPage(pageNo, pageSize); PageHelper.startPage(pageNo, pageSize);
return new PageInfo<>(trainingMapper.selectByExample(example)); return new PageInfo<>(trainingMapper.selectByExample(example));
} }
@ -125,8 +123,12 @@ public class TrainingService {
for (Member member : members) { for (Member member : members) {
String trainingId = member.getTrainingId(); String trainingId = member.getTrainingId();
Training training = trainingMapper.selectByPrimaryKey(trainingId); Training training = trainingMapper.selectByPrimaryKey(trainingId);
if (training != null) {
trainingList.add(training); trainingList.add(training);
} }
}
List<String> statusOrder = Arrays.asList("ONGOING", "NOT_STARTED", "FINISHED");
trainingList.sort(Comparator.comparingInt(training -> statusOrder.indexOf(training.getStatus())));
return new PageInfo<>(trainingList); return new PageInfo<>(trainingList);
} }
return new PageInfo<>(); return new PageInfo<>();

@ -54,7 +54,8 @@
</when> </when>
<when test="criterion.listValue"> <when test="criterion.listValue">
and ${criterion.condition} and ${criterion.condition}
<foreach close=")" collection="criterion.value" item="listItem" open="(" separator=","> <foreach close=")" collection="criterion.value" item="listItem" open="("
separator=",">
#{listItem} #{listItem}
</foreach> </foreach>
</when> </when>
@ -131,7 +132,8 @@
#{schoolId,jdbcType=INTEGER}, #{createSchool,jdbcType=VARCHAR}, #{trainingName,jdbcType=VARCHAR}, #{schoolId,jdbcType=INTEGER}, #{createSchool,jdbcType=VARCHAR}, #{trainingName,jdbcType=VARCHAR},
#{reportScore,jdbcType=INTEGER}, #{classId,jdbcType=INTEGER}) #{reportScore,jdbcType=INTEGER}, #{classId,jdbcType=INTEGER})
</insert> </insert>
<select id="countByExample" parameterType="com.sztzjy.forex.trading_trading.entity.MemberExample" resultType="java.lang.Long"> <select id="countByExample" parameterType="com.sztzjy.forex.trading_trading.entity.MemberExample"
resultType="java.lang.Long">
<!-- <!--
WARNING - @mbg.generated WARNING - @mbg.generated
This element is automatically generated by MyBatis Generator, do not modify. This element is automatically generated by MyBatis Generator, do not modify.
@ -263,11 +265,14 @@
<result column="cumulative_profit_loss" jdbcType="DOUBLE" property="cumulativeProfitLoss"/> <result column="cumulative_profit_loss" jdbcType="DOUBLE" property="cumulativeProfitLoss"/>
<result column="yield" jdbcType="DOUBLE" property="yield"/> <result column="yield" jdbcType="DOUBLE" property="yield"/>
<result column="training_name" jdbcType="VARCHAR" property="trainingName"/> <result column="training_name" jdbcType="VARCHAR" property="trainingName"/>
<result column="total_assets" jdbcType="DOUBLE" property="totalAssets"/>
<result column="initial_capital" jdbcType="DOUBLE" property="initialCapital"/>
<result column="available_funds" jdbcType="DOUBLE" property="availableFunds"/>
<result column="opening_trades" jdbcType="INTEGER" property="openingTrades"/>
<result column="closing_trades" jdbcType="INTEGER" property="closingTrades"/>
</resultMap> </resultMap>
<sql id="Update_By_Example_Where_Clause"> <sql id="Update_By_Example_Where_Clause">
<!-- <!--
WARNING - @mbg.generated WARNING - @mbg.generated
@ -323,13 +328,9 @@
order by ${orderByClause} order by ${orderByClause}
</if> </if>
</select> </select>
<select id="pagedListMembers" parameterType="com.sztzjy.forex.trading_trading.entity.MemberExample"
<select id="selectByCondition" parameterType="com.sztzjy.forex.trading_trading.entity.MemberExample"
resultMap="BaseResultMapForMemberVO"> resultMap="BaseResultMapForMemberVO">
<!--
WARNING - @mbg.generated
This element is automatically generated by MyBatis Generator, do not modify.
This element was generated on Fri Jun 30 14:15:42 CST 2023.
-->
select select
<if test="distinct"> <if test="distinct">
distinct distinct
@ -343,6 +344,28 @@
order by ${orderByClause} order by ${orderByClause}
</if> </if>
</select> </select>
<!-- <select id="pagedListMembers" parameterType="com.sztzjy.forex.trading_trading.entity.MemberExample"-->
<!-- resultMap="BaseResultMapForMemberVO">-->
<!-- &lt;!&ndash;-->
<!-- WARNING - @mbg.generated-->
<!-- This element is automatically generated by MyBatis Generator, do not modify.-->
<!-- This element was generated on Fri Jun 30 14:15:42 CST 2023.-->
<!-- &ndash;&gt;-->
<!-- select-->
<!-- <if test="distinct">-->
<!-- distinct-->
<!-- </if>-->
<!-- <include refid="Base_Column_List"/>-->
<!-- from sys_member m-->
<!-- LEFT JOIN sys_training t ON m.training_id = t.training_id-->
<!-- <if test="_parameter != null">-->
<!-- <include refid="Example_Where_Clause"/>-->
<!-- </if>-->
<!-- and t.status = 'finished'-->
<!-- <if test="orderByClause != null">-->
<!-- order by ${orderByClause}-->
<!-- </if>-->
<!-- </select>-->
<insert id="insertAll" parameterType="java.util.List"> <insert id="insertAll" parameterType="java.util.List">
insert into sys_member (member_id, training_id, name, insert into sys_member (member_id, training_id, name,

Loading…
Cancel
Save