Merge remote-tracking branch 'origin/test-training2' into test-training2

This commit is contained in:
joylink_zhangsai 2023-02-14 17:33:44 +08:00
commit 6d37169068
5 changed files with 80 additions and 74 deletions

View File

@ -22,6 +22,7 @@ import club.joylink.rtss.vo.client.training2.Step2VO;
import club.joylink.rtss.vo.paper.*;
import club.joylink.rtss.vo.training2.publish.PublishedTraining2DetailRspVo;
import com.google.common.base.Joiner;
import com.google.common.base.Splitter;
import com.google.common.base.Strings;
import com.google.common.collect.Lists;
import lombok.extern.slf4j.Slf4j;
@ -79,18 +80,14 @@ public class PaperUserSubmitAnswerService {
rsp.setSubType(req.getSubType());
String tmpAnswer = null;
//处理用户提交的答案
switch (req.getType()) {
case Common:
rsp.setResult(submitCommonAnswer(puq, req));
tmpAnswer = this.getAnswerFromSubmit(req);
break;
case Training:{
BusinessExceptionAssertEnum.ARGUMENT_ILLEGAL.assertNotTrue((req.getSubType() != PaperQType.SubType.Single && req.getSubType() != PaperQType.SubType.Scene),String.format("未知答题类型[%s]",req.getSubType()));
TrainAnswerVO answerVO = this.submitTrainingAnswer(req,puq);
rsp.setResult(answerVO.getState());
tmpAnswer = JsonUtils.writeValueAsString(answerVO.getDetail());
break;
}
if(req.getType() == PaperQType.GroupType.Common){
rsp.setResult(submitCommonAnswer(puq, req));
tmpAnswer = this.getAnswerFromSubmit(req);
}else if(req.getType() == PaperQType.GroupType.Training){
BusinessExceptionAssertEnum.ARGUMENT_ILLEGAL.assertNotTrue((req.getSubType() != PaperQType.SubType.Single && req.getSubType() != PaperQType.SubType.Scene),String.format("未知答题类型[%s]",req.getSubType()));
TrainAnswerVO answerVO = this.submitTrainingAnswer(req,puq);
rsp.setResult(answerVO.getState());
tmpAnswer = JsonUtils.writeValueAsString(answerVO.getDetail());
}
//记录用户答题情况
PaperUserQuestion record = new PaperUserQuestion();
@ -122,15 +119,12 @@ public class PaperUserSubmitAnswerService {
PublishedTraining2DetailRspVo detailVO = this.training2PublishService.findTrainingAllInfoById(reqVo.getPqId());
log.debug("查找对应的实训数据 type:[{}],id[{}]",reqVo.getSubType(),reqVo.getPqId());
BusinessExceptionAssertEnum.DATA_NOT_EXIST.assertTrue(Objects.nonNull(detailVO),String.format("未找到对应的实训数据[%s]",reqVo.getPqId()));
List<Step2VO> stepList = JsonUtils.readCollection(detailVO.getStepJson(),ArrayList.class, Step2VO.class);
if(reqVo.getSubType() == PaperQType.SubType.Single){
return this.submitTrainingAnswerForSingle(reqVo,stepList,puq);
return this.submitTrainingAnswerForSingle(reqVo,detailVO/*,stepList,puq*/);
}else if(reqVo.getSubType() == PaperQType.SubType.Scene){
return this.submitTrainingAnswerForScene(detailVO,reqVo,puq);
return this.submitTrainingAnswerForScene(detailVO,reqVo);
}
return new TrainAnswerVO(PaperQuestionState.Wrong, null);
}
@ -141,18 +135,21 @@ public class PaperUserSubmitAnswerService {
*
* @return
*/
private TrainAnswerVO submitTrainingAnswerForSingle(PaperSubmitAnswerReqVo req,List<Step2VO> allStepList,PaperUserQuestion puq) {
private TrainAnswerVO submitTrainingAnswerForSingle(PaperSubmitAnswerReqVo req,PublishedTraining2DetailRspVo trainDetailVO/*List<Step2VO> allStepList,PaperUserQuestion puq*/) {
BusinessExceptionAssertEnum.DATA_ERROR.assertTrue(StringUtils.hasText(trainDetailVO.getStepJson()),"场景实训没有对应的操作步骤");
List<Step2VO> allStepList = JsonUtils.readCollection(trainDetailVO.getStepJson(),ArrayList.class, Step2VO.class);
List<Step2VO> cosplayStepList = allStepList.stream().filter(d->Objects.equals(d.getMemberId(),req.getTrainAnswerDetail().getCosplayMemberId())).collect(Collectors.toList());
if(req.getTrainAnswerDetail().getTrainDetail().size() != cosplayStepList.size()){
return new TrainAnswerVO(PaperQuestionState.Wrong, req.getTrainAnswerDetail());
}
if(req.getTrainAnswerDetail().getTrainDetail().stream().allMatch(d->d.isSuccess())){
if(req.getTrainAnswerDetail().getTrainDetail().stream().allMatch(PaperTrainAnswerDetail::isSuccess)){
return new TrainAnswerVO(PaperQuestionState.Right, req.getTrainAnswerDetail());
}
return new TrainAnswerVO(PaperQuestionState.Wrong, req.getTrainAnswerDetail());
}
private TrainAnswerVO submitTrainingAnswerForScene(PublishedTraining2DetailRspVo trainVO,PaperSubmitAnswerReqVo req,PaperUserQuestion puq){
private TrainAnswerVO submitTrainingAnswerForScene(PublishedTraining2DetailRspVo trainVO,PaperSubmitAnswerReqVo req/*,PaperUserQuestion puq*/){
BusinessExceptionAssertEnum.DATA_ERROR.assertTrue(StringUtils.hasText(trainVO.getScoringRuleJson()),"场景实训没有对应的评分规则");
List<ScoringRuleVO> scoreList = JsonUtils.readCollection(trainVO.getScoringRuleJson(),ArrayList.class, ScoringRuleVO.class);
BusinessExceptionAssertEnum.DATA_ERROR.assertTrue(!CollectionUtils.isEmpty(scoreList),String.format("场景实训[%s]没有评分规则",req.getPqId()));
@ -166,7 +163,6 @@ public class PaperUserSubmitAnswerService {
Map<String,PaperTrainAnswerDetail> answerDetailMap = answerDetailList.stream().collect(Collectors.toMap(d->d.getStepId().toString(),Function.identity()));
List<PaperTrainAnswerDetail> resultAnswerDetailList = new ArrayList<>(allDetailVOList.size());
for (ScoringRuleVO.DetailVO detailVO : allDetailVOList) {
PaperTrainAnswerDetail answerDetail = answerDetailMap.get(detailVO.getElementId());
if(Objects.nonNull(answerDetail)){
@ -201,38 +197,12 @@ public class PaperUserSubmitAnswerService {
private String getAnswerFromQuestion(PaperQuestion pq) {
String dan = pq.getQuestionAnswer().trim();
String[] ans = dan.split(",");
TreeSet<String> set = new TreeSet<>();
for (String an : ans) {
set.add(an.trim());
}
return Joiner.on(",").join(set);
/*StringBuilder sb = new StringBuilder();
set.forEach(an -> {
if (sb.length() <= 0) {
sb.append(an);
} else {
sb.append(",").append(an);
}
});*/
// return sb.toString();
return Splitter.on(",").trimResults().omitEmptyStrings().splitToList(dan).stream().sorted().collect(Collectors.joining(","));
}
private String getAnswerFromSubmit(PaperSubmitAnswerReqVo req) {
TreeSet<String> set = new TreeSet<>();
for (String an : req.getAnswer()) {
set.add(an.trim());
}
return Joiner.on(",").join(set);
/*StringBuilder sb = new StringBuilder();
set.forEach(an -> {
if (sb.length() <= 0) {
sb.append(an);
} else {
sb.append(",").append(an);
}
});
return sb.toString();*/
}
return req.getAnswer().stream().filter(StringUtils::hasText).peek(String::trim).sorted().collect(Collectors.joining(","));
}
}

View File

@ -30,7 +30,7 @@ public class TrainPositionService {
public void initTrainOrUpdate(String mapName,String json){
TrainPosition tp = JsonUtils.read(json, TrainPosition.class);
tp.setReceiveTime(System.currentTimeMillis());
log.debug(json);
log.info(json);
// SocketMessageVO<TrainPosition> vo = SocketMessageFactory.buildBasic(WebSocketMessageType.YJDDZH_TRAIN_POSITION,tp);
// this.messageService.send(vo);
this.timeOverService.addTrainAccept(mapName,tp);

View File

@ -2,6 +2,7 @@ package club.joylink.rtss.websocket;
import club.joylink.rtss.services.ISysUserService;
import club.joylink.rtss.services.LoginSessionManager;
import club.joylink.rtss.services.project.ProjectService;
import club.joylink.rtss.vo.AccountVO;
import club.joylink.rtss.vo.LoginUserInfoVO;
import club.joylink.rtss.websocket.interceptor.PresenceChannelInterceptor;
@ -38,6 +39,9 @@ public class WebsocketConfig implements WebSocketMessageBrokerConfigurer {
private ISysUserService sysUserService;
@Resource
private PresenceChannelInterceptor presenceChannelInterceptor;
@Autowired
@Lazy
private ProjectService projectService;
@Override
public void configureMessageBroker(MessageBrokerRegistry config) {
ThreadPoolTaskScheduler scheduler = new ThreadPoolTaskScheduler();
@ -75,13 +79,14 @@ public class WebsocketConfig implements WebSocketMessageBrokerConfigurer {
})
.setAllowedOrigins("*");
registry.addEndpoint("/joylink-tbi-websocket")
.addInterceptors(new VSimpleInterceptor(this.sysUserService))
.addInterceptors(new VSimpleInterceptor(this.sysUserService,this.projectService))
.setHandshakeHandler(new DefaultHandshakeHandler() {
@Override
protected Principal determineUser(ServerHttpRequest request, WebSocketHandler wsHandler,
Map<String, Object> attributes) {
return new TrainPositionPrincipal((AccountVO) attributes.get(VSimpleInterceptor.ATT_USER_KEY));
return new MyPrincipal((LoginUserInfoVO) attributes.get(VSimpleInterceptor.ATT_USER_KEY),true);
// return new TrainPositionPrincipal((LoginUserInfoVO) attributes.get(VSimpleInterceptor.ATT_USER_KEY));
}
})
@ -116,11 +121,16 @@ public class WebsocketConfig implements WebSocketMessageBrokerConfigurer {
public class MyPrincipal implements Principal {
private LoginUserInfoVO user;
private boolean yjddzh;
public MyPrincipal(LoginUserInfoVO user) {
Objects.requireNonNull(user, "用户不能为null");
this.user = user;
}
public MyPrincipal(LoginUserInfoVO user,boolean yjddzh) {
this(user);
this.yjddzh = yjddzh;
}
@Override
public String getName() {
@ -139,9 +149,9 @@ public class WebsocketConfig implements WebSocketMessageBrokerConfigurer {
@Getter
public class TrainPositionPrincipal implements Principal {
private AccountVO user;
private LoginUserInfoVO user;
public TrainPositionPrincipal(AccountVO user) {
public TrainPositionPrincipal(LoginUserInfoVO user) {
Objects.requireNonNull(user, "用户不能为null");
this.user = user;
}
@ -149,7 +159,7 @@ public class WebsocketConfig implements WebSocketMessageBrokerConfigurer {
@Override
public String getName() {
return this.user.getMobile();
return this.user.getAccountVO().getMobile();
}
}
}

View File

@ -41,17 +41,21 @@ public class PresenceChannelInterceptor implements ChannelInterceptor {
}
private void register(String wsSessionId, String destination, Principal principal) {
if(Objects.equals(false,principal instanceof WebsocketConfig.TrainPositionPrincipal)){
return;
if(principal instanceof WebsocketConfig.MyPrincipal){
WebsocketConfig.MyPrincipal myPrincipal = (WebsocketConfig.MyPrincipal) principal;
if(myPrincipal.isYjddzh()){
log.info("武汉8号线 创建stmop链接name:{}",principal.getName());
}
}
log.info("武汉8号线 创建stmop链接name:{}",principal.getName());
}
private void unregister(String wsSessionId, String destination, Principal principal) {
if(Objects.equals(false,principal instanceof WebsocketConfig.TrainPositionPrincipal)){
return;
if(principal instanceof WebsocketConfig.MyPrincipal){
WebsocketConfig.MyPrincipal myPrincipal = (WebsocketConfig.MyPrincipal) principal;
if(myPrincipal.isYjddzh()){
log.info("武汉8号线 关闭stmop链接name:{}",principal.getName());
}
}
log.info("武汉8号线 关闭stmop链接name:{}",principal.getName());
}
}

View File

@ -5,7 +5,11 @@ package club.joylink.rtss.websocket.interceptor;
import club.joylink.rtss.entity.project.Project;
import club.joylink.rtss.services.ISysUserService;
import club.joylink.rtss.services.project.ProjectService;
import club.joylink.rtss.vo.AccountVO;
import club.joylink.rtss.vo.LoginUserInfoVO;
import club.joylink.rtss.vo.project.ProjectVO;
import com.google.common.base.Strings;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.server.ServerHttpRequest;
import org.springframework.http.server.ServerHttpResponse;
@ -17,33 +21,51 @@ import java.util.Objects;
@Slf4j
public class VSimpleInterceptor extends BaseInterceptor {
private ISysUserService sysUserService;
public VSimpleInterceptor(ISysUserService sysUserService) {
private ProjectService projectService;
public VSimpleInterceptor(ISysUserService sysUserService,ProjectService projectService) {
this.sysUserService = sysUserService;
this.projectService = projectService;
}
public final static String ATT_USER_KEY = "userVo";
private final static String USER_ACCOUNT = "user_account";
private final static String ACCOUNT_PWD = "account_pwd";
private final static String PROJECT_CODE = "project_code";
@Override
public boolean beforeHandshake(ServerHttpRequest request, ServerHttpResponse serverHttpResponse, WebSocketHandler webSocketHandler, Map<String, Object> attributes) throws Exception {
Map<String, String> map = this.findQueryParams(request);
log.debug(String.format("webSocket handshake query: [%s] uri:[%s]", map,request.getURI().getPath()));
log.error(String.format("webSocket handshake query: [%s] uri:[%s]", map,request.getRemoteAddress()));
String account = map.get(USER_ACCOUNT);
String accountPwd = map.get(ACCOUNT_PWD);
/*String projectCode = map.get(PROJECT_CODE);
if(Strings.isNullOrEmpty(projectCode)){
return false;
}*/
try{
AccountVO vo = this.checkUserInfo(map);
// ProjectVO projectVO = projectService.queryLoginProjectByCode(projectCode);
AccountVO vo = this.checkUserInfo(account,accountPwd);
if(Objects.isNull(vo)){
log.error("未找到对应的用户 account[{}] pwd[{}]",account,accountPwd);
return false;
}
attributes.put(ATT_USER_KEY,vo);
LoginUserInfoVO infoVO = new LoginUserInfoVO();
infoVO.setAccountVO(vo);
// infoVO.setProjectInfo(projectVO);
attributes.put(ATT_USER_KEY,infoVO);
return true;
}catch (Exception e){
log.error("ws 登录失败 msg:" + e.getMessage(),e);
return false;
}
}
private final static String USER_ACCOUNT = "user_account";
private final static String ACCOUNT_PWD = "account_pwd";
private AccountVO checkUserInfo(Map<String,String> dataMap){
AccountVO vo = this.sysUserService.findUserByAccountAndPassword(dataMap.get(USER_ACCOUNT),dataMap.get(ACCOUNT_PWD), Project.DEFAULT_PROJECT_CODE);
private AccountVO checkUserInfo(String account,String accountPwd){
AccountVO vo = this.sysUserService.findUserByAccountAndPassword(account,accountPwd, Project.DEFAULT_PROJECT_CODE);
return vo;
}
}