Merge remote-tracking branch 'origin/master'

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

@ -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<List<GradeWeight>> findCurrentWeight() {
JwtUser currentUser = TokenProvider.getJWTUser(request);
List<GradeWeight> gradeWeights = gradeWeightService.findWeightBySchoolId(currentUser.getSchoolId());
if (gradeWeights == null || gradeWeights.size() == 0) {
gradeWeights = gradeWeightService.createDefaultWeights(currentUser);
}
return new ResultEntity<List<GradeWeight>>(gradeWeights);
}

@ -42,14 +42,13 @@ public class IndexController {
public ResultEntity<PageInfo<Member>> 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<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);
}

@ -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<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()) {
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<MemberVO>>(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<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)
@ApiOperation("根据实训任务id获取成员列表")
@GetMapping("listMembersByTrainingId")
public ResultEntity<PageInfo<Member>> listMembersByTrainingId(@RequestParam String trainingId,
public ResultEntity<PageInfo<MemberVO>> listMembersByTrainingId(@RequestParam String trainingId,
@ApiParam("班级id") Integer classId,
@ApiParam("查询关键字:学号和姓名")String keyword,
@RequestParam Integer index,
@RequestParam Integer size) {
PageInfo<Member> members = memberService.pageListMemberByTrainingId(trainingId, classId,keyword,index, size);
return new ResultEntity<PageInfo<Member>>(members);
PageInfo<MemberVO> members = memberService.pageListMemberByTrainingId(trainingId, classId,keyword,index, size);
return new ResultEntity<PageInfo<MemberVO>>(members);
}

@ -50,10 +50,21 @@ public class UserController {
@OperateLog(description = "用户登录")
@ApiOperation(value = "用户登录", httpMethod = "POST")
@PostMapping("login")
public ResultEntity<LoginResult> login(@ApiParam("用户名") @RequestParam String username,
@ApiParam("加密后的密文") @RequestParam String passwordEncode) {
public ResultEntity<LoginResult> login(@ApiParam("用户名") String username,
@ApiParam("加密后的密文") String passwordEncode,
@ApiParam("智云携带的token") String TOKEN) {
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 {
password = RsaUtil.decryptByPrivateKey(passwordEncode);
} catch (Exception e) {
@ -61,7 +72,11 @@ public class UserController {
}
String md5Pwd = RsaUtil.calculateMD5(password);
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()));
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")

@ -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<GradeWeight> 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;
}
}

@ -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<Member> selectByExample(MemberExample example);
List<MemberVO> pagedListMembers(MemberExample example);
List<MemberVO> selectByCondition(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.
@ -155,4 +196,25 @@ public interface MemberMapper {
" #{item} " +
" </foreach> ")
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) {
GradeWeightBO bo = new GradeWeightBO();
bo.setSimulationTradingProfitScore(50);
bo.setExperimentalReportScore(50);
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));
@ -51,6 +51,22 @@ public class GradeWeightService {
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) {
GradeWeightExample example = new GradeWeightExample();
GradeWeightExample.Criteria criteria = example.createCriteria();

@ -22,14 +22,12 @@ public class IndexService {
private final MemberMapper memberMapper;
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();
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<Training> trainings = null;
if (StringUtils.isNotEmpty(trainingName) || startTime!=null) {
if (StringUtils.isNotEmpty(trainingName) || startTime != null) {
trainings = trainingMapper.selectByExample(trainingExample);
}
List<Member> 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<Member> membersForTraining = memberMapper.selectByExample(memberExample);
List<Member> 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);
}
//没有传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<Member> membersForTraining = memberMapper.selectByExample(memberExample);
for (int i = 1; i <= membersForTraining.size(); i++) {
for (Member member : membersForTraining) {
member.setStuRank(i);
List<Member> 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);
}
}

@ -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<Member> pageListMemberByTrainingId(String trainingId,
public PageInfo<MemberVO> 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) {
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<MemberVO> 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<MemberVO> members = memberMapper.pagedListMembers(example);
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.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<MemberVO> members = memberMapper.pagedListMembers(className, trainingName, markStatus, keyword, user.getSchoolId());
return members;
}
public List<Map<String, Object>> classScoreTrend(Integer schoolId) {
@ -223,17 +200,17 @@ public class MemberService {
return memberMapper.selectAllTrainingList(schoolId);
}
public List<Member> findByTrainingId(String trainingId){
public List<Member> 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<Member> 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();
}
}

@ -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);
}

@ -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.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);
if (training != null) {
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<>();

@ -7,29 +7,29 @@
This element is automatically generated by MyBatis Generator, do not modify.
This element was generated on Wed Jul 19 15:55:18 CST 2023.
-->
<id column="member_id" jdbcType="VARCHAR" property="memberId" />
<result column="training_id" jdbcType="VARCHAR" property="trainingId" />
<result column="name" jdbcType="VARCHAR" property="name" />
<result column="student_number" jdbcType="VARCHAR" property="studentNumber" />
<result column="major" jdbcType="VARCHAR" property="major" />
<result column="class_grade" jdbcType="VARCHAR" property="classGrade" />
<result column="stu_rank" jdbcType="INTEGER" property="stuRank" />
<result column="initial_capital" jdbcType="DOUBLE" property="initialCapital" />
<result column="total_assets" jdbcType="DOUBLE" property="totalAssets" />
<result column="net_value" jdbcType="DOUBLE" property="netValue" />
<result column="margin_used" jdbcType="DOUBLE" property="marginUsed" />
<result column="available_funds" jdbcType="DOUBLE" property="availableFunds" />
<result column="margin_level" jdbcType="DOUBLE" property="marginLevel" />
<result column="position_profit_loss" jdbcType="DOUBLE" property="positionProfitLoss" />
<result column="cumulative_profit_loss" jdbcType="DOUBLE" property="cumulativeProfitLoss" />
<result column="yield" jdbcType="DOUBLE" property="yield" />
<result column="opening_trades" jdbcType="INTEGER" property="openingTrades" />
<result column="closing_trades" jdbcType="INTEGER" property="closingTrades" />
<result column="school_id" jdbcType="INTEGER" property="schoolId" />
<result column="create_school" jdbcType="VARCHAR" property="createSchool" />
<result column="training_name" jdbcType="VARCHAR" property="trainingName" />
<result column="report_score" jdbcType="INTEGER" property="reportScore" />
<result column="class_id" jdbcType="INTEGER" property="classId" />
<id column="member_id" jdbcType="VARCHAR" property="memberId"/>
<result column="training_id" jdbcType="VARCHAR" property="trainingId"/>
<result column="name" jdbcType="VARCHAR" property="name"/>
<result column="student_number" jdbcType="VARCHAR" property="studentNumber"/>
<result column="major" jdbcType="VARCHAR" property="major"/>
<result column="class_grade" jdbcType="VARCHAR" property="classGrade"/>
<result column="stu_rank" jdbcType="INTEGER" property="stuRank"/>
<result column="initial_capital" jdbcType="DOUBLE" property="initialCapital"/>
<result column="total_assets" jdbcType="DOUBLE" property="totalAssets"/>
<result column="net_value" jdbcType="DOUBLE" property="netValue"/>
<result column="margin_used" jdbcType="DOUBLE" property="marginUsed"/>
<result column="available_funds" jdbcType="DOUBLE" property="availableFunds"/>
<result column="margin_level" jdbcType="DOUBLE" property="marginLevel"/>
<result column="position_profit_loss" jdbcType="DOUBLE" property="positionProfitLoss"/>
<result column="cumulative_profit_loss" jdbcType="DOUBLE" property="cumulativeProfitLoss"/>
<result column="yield" jdbcType="DOUBLE" property="yield"/>
<result column="opening_trades" jdbcType="INTEGER" property="openingTrades"/>
<result column="closing_trades" jdbcType="INTEGER" property="closingTrades"/>
<result column="school_id" jdbcType="INTEGER" property="schoolId"/>
<result column="create_school" jdbcType="VARCHAR" property="createSchool"/>
<result column="training_name" jdbcType="VARCHAR" property="trainingName"/>
<result column="report_score" jdbcType="INTEGER" property="reportScore"/>
<result column="class_id" jdbcType="INTEGER" property="classId"/>
</resultMap>
<sql id="Example_Where_Clause">
<!--
@ -54,7 +54,8 @@
</when>
<when test="criterion.listValue">
and ${criterion.condition}
<foreach close=")" collection="criterion.value" item="listItem" open="(" separator=",">
<foreach close=")" collection="criterion.value" item="listItem" open="("
separator=",">
#{listItem}
</foreach>
</when>
@ -84,7 +85,7 @@
This element was generated on Wed Jul 19 15:55:18 CST 2023.
-->
select
<include refid="Base_Column_List" />
<include refid="Base_Column_List"/>
from sys_member
where member_id = #{memberId,jdbcType=VARCHAR}
</select>
@ -105,7 +106,7 @@
-->
delete from sys_member
<if test="_parameter != null">
<include refid="Example_Where_Clause" />
<include refid="Example_Where_Clause"/>
</if>
</delete>
<insert id="insert" parameterType="com.sztzjy.forex.trading_trading.entity.Member">
@ -131,7 +132,8 @@
#{schoolId,jdbcType=INTEGER}, #{createSchool,jdbcType=VARCHAR}, #{trainingName,jdbcType=VARCHAR},
#{reportScore,jdbcType=INTEGER}, #{classId,jdbcType=INTEGER})
</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
This element is automatically generated by MyBatis Generator, do not modify.
@ -139,7 +141,7 @@
-->
select count(*) from sys_member
<if test="_parameter != null">
<include refid="Example_Where_Clause" />
<include refid="Example_Where_Clause"/>
</if>
</select>
<update id="updateByExampleSelective" parameterType="map">
@ -173,7 +175,7 @@
report_score = #{record.reportScore,jdbcType=INTEGER},
class_id = #{record.classId,jdbcType=INTEGER}
<if test="_parameter != null">
<include refid="Update_By_Example_Where_Clause" />
<include refid="Update_By_Example_Where_Clause"/>
</if>
</update>
<update id="updateByPrimaryKeySelective" parameterType="com.sztzjy.forex.trading_trading.entity.Member">
@ -263,11 +265,14 @@
<result column="cumulative_profit_loss" jdbcType="DOUBLE" property="cumulativeProfitLoss"/>
<result column="yield" jdbcType="DOUBLE" property="yield"/>
<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>
<sql id="Update_By_Example_Where_Clause">
<!--
WARNING - @mbg.generated
@ -323,13 +328,9 @@
order by ${orderByClause}
</if>
</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">
<!--
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
<if test="distinct">
distinct
@ -343,6 +344,28 @@
order by ${orderByClause}
</if>
</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 into sys_member (member_id, training_id, name,

Loading…
Cancel
Save