Merge remote-tracking branch 'origin/test-training2' into test-training2
This commit is contained in:
commit
0a817bdb82
@ -7,6 +7,10 @@ ALTER TABLE `rts_paper_user_question`
|
|||||||
ADD COLUMN `sub_type` bigint not NULL COMMENT '规则类型:理论题(1-单选题,2-多选题,3-判断题);实训题(4-单操实训,5-场景实训)' AFTER `type`;
|
ADD COLUMN `sub_type` bigint not NULL COMMENT '规则类型:理论题(1-单选题,2-多选题,3-判断题);实训题(4-单操实训,5-场景实训)' AFTER `type`;
|
||||||
|
|
||||||
|
|
||||||
ALTER TABLE `rts_paper_user_question` MODIFY COLUMN tmp_answer VARCHAR(1000);
|
ALTER TABLE `rts_paper_user_question` MODIFY COLUMN tmp_answer longtext;
|
||||||
|
|
||||||
|
ALTER TABLE `rts_paper_rule` ADD COLUMN scene_detail VARCHAR(1000) COMMENT '场景实训考试的规则';
|
||||||
|
|
||||||
|
|
||||||
|
ALTER TABLE `rts_paper_user_question`
|
||||||
|
ADD COLUMN `scene_cosplay_id` varchar(10) COMMENT '场景实训考试扮演的角色';
|
||||||
|
@ -3,6 +3,8 @@ package club.joylink.rtss.entity.paper;
|
|||||||
import java.io.Serializable;
|
import java.io.Serializable;
|
||||||
import java.time.LocalDateTime;
|
import java.time.LocalDateTime;
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
|
|
||||||
|
import club.joylink.rtss.vo.paper.PaperCompositionState;
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -82,7 +84,8 @@ public class PaperComposition implements Serializable {
|
|||||||
private LocalDateTime updateTime;
|
private LocalDateTime updateTime;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 试卷蓝图状态:1-正在编辑[查询,修改,删除],2-封存(只能查看),3- 失效(只能从封存状态变更,只能查看,当PaperComposition - update_id 为null 说明是同步失效的数据)定于见PaperCompositionState
|
* 试卷蓝图状态:1-正在编辑[查询,修改,删除],2-封存(只能查看),3- 失效(只能从封存状态变更,只能查看,当PaperComposition - update_id 为null 说明是同步失效的数据)
|
||||||
|
* 定于见{@link PaperCompositionState}
|
||||||
*/
|
*/
|
||||||
private Integer state;
|
private Integer state;
|
||||||
|
|
||||||
|
@ -1,6 +1,9 @@
|
|||||||
package club.joylink.rtss.entity.paper;
|
package club.joylink.rtss.entity.paper;
|
||||||
|
|
||||||
import java.io.Serializable;
|
import java.io.Serializable;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import club.joylink.rtss.vo.paper.PaperCompositionWithRuleVo;
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -44,5 +47,12 @@ public class PaperRule implements Serializable {
|
|||||||
*/
|
*/
|
||||||
private Integer score;
|
private Integer score;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 实训考试的规则
|
||||||
|
* {@link List <PaperCompositionWithRuleVo.ScenePagerRuleVO>}
|
||||||
|
*/
|
||||||
|
|
||||||
|
private String sceneDetail;
|
||||||
|
|
||||||
private static final long serialVersionUID = 1L;
|
private static final long serialVersionUID = 1L;
|
||||||
}
|
}
|
@ -553,6 +553,76 @@ public class PaperRuleExample {
|
|||||||
addCriterion("score not between", value1, value2, "score");
|
addCriterion("score not between", value1, value2, "score");
|
||||||
return (Criteria) this;
|
return (Criteria) this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Criteria andSceneDetailIsNull() {
|
||||||
|
addCriterion("scene_detail is null");
|
||||||
|
return (Criteria) this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Criteria andSceneDetailIsNotNull() {
|
||||||
|
addCriterion("scene_detail is not null");
|
||||||
|
return (Criteria) this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Criteria andSceneDetailEqualTo(String value) {
|
||||||
|
addCriterion("scene_detail =", value, "sceneDetail");
|
||||||
|
return (Criteria) this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Criteria andSceneDetailNotEqualTo(String value) {
|
||||||
|
addCriterion("scene_detail <>", value, "sceneDetail");
|
||||||
|
return (Criteria) this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Criteria andSceneDetailGreaterThan(String value) {
|
||||||
|
addCriterion("scene_detail >", value, "sceneDetail");
|
||||||
|
return (Criteria) this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Criteria andSceneDetailGreaterThanOrEqualTo(String value) {
|
||||||
|
addCriterion("scene_detail >=", value, "sceneDetail");
|
||||||
|
return (Criteria) this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Criteria andSceneDetailLessThan(String value) {
|
||||||
|
addCriterion("scene_detail <", value, "sceneDetail");
|
||||||
|
return (Criteria) this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Criteria andSceneDetailLessThanOrEqualTo(String value) {
|
||||||
|
addCriterion("scene_detail <=", value, "sceneDetail");
|
||||||
|
return (Criteria) this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Criteria andSceneDetailLike(String value) {
|
||||||
|
addCriterion("scene_detail like", value, "sceneDetail");
|
||||||
|
return (Criteria) this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Criteria andSceneDetailNotLike(String value) {
|
||||||
|
addCriterion("scene_detail not like", value, "sceneDetail");
|
||||||
|
return (Criteria) this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Criteria andSceneDetailIn(List<String> values) {
|
||||||
|
addCriterion("scene_detail in", values, "sceneDetail");
|
||||||
|
return (Criteria) this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Criteria andSceneDetailNotIn(List<String> values) {
|
||||||
|
addCriterion("scene_detail not in", values, "sceneDetail");
|
||||||
|
return (Criteria) this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Criteria andSceneDetailBetween(String value1, String value2) {
|
||||||
|
addCriterion("scene_detail between", value1, value2, "sceneDetail");
|
||||||
|
return (Criteria) this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Criteria andSceneDetailNotBetween(String value1, String value2) {
|
||||||
|
addCriterion("scene_detail not between", value1, value2, "sceneDetail");
|
||||||
|
return (Criteria) this;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -1,6 +1,8 @@
|
|||||||
package club.joylink.rtss.entity.paper;
|
package club.joylink.rtss.entity.paper;
|
||||||
|
|
||||||
import java.io.Serializable;
|
import java.io.Serializable;
|
||||||
|
|
||||||
|
import club.joylink.rtss.vo.paper.PaperSubmitAnswerReqVo;
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -50,9 +52,16 @@ public class PaperUserQuestion implements Serializable {
|
|||||||
private Integer state;
|
private Integer state;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 答案内容
|
* 答题存储的答案
|
||||||
|
* 理论题 存储的时对应的答案选项
|
||||||
|
* 实训题-单操存储的是 {@link PaperSubmitAnswerReqVo.AnswerDetail}
|
||||||
*/
|
*/
|
||||||
private String tmpAnswer;
|
private String tmpAnswer;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 场景实训考试扮演的角色
|
||||||
|
*/
|
||||||
|
private String sceneCosplayId;
|
||||||
|
|
||||||
private static final long serialVersionUID = 1L;
|
private static final long serialVersionUID = 1L;
|
||||||
}
|
}
|
||||||
|
@ -673,6 +673,76 @@ public class PaperUserQuestionExample {
|
|||||||
addCriterion("tmp_answer not between", value1, value2, "tmpAnswer");
|
addCriterion("tmp_answer not between", value1, value2, "tmpAnswer");
|
||||||
return (Criteria) this;
|
return (Criteria) this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Criteria andSceneCosplayIdIsNull() {
|
||||||
|
addCriterion("scene_cosplay_id is null");
|
||||||
|
return (Criteria) this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Criteria andSceneCosplayIdIsNotNull() {
|
||||||
|
addCriterion("scene_cosplay_id is not null");
|
||||||
|
return (Criteria) this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Criteria andSceneCosplayIdEqualTo(String value) {
|
||||||
|
addCriterion("scene_cosplay_id =", value, "sceneCosplayId");
|
||||||
|
return (Criteria) this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Criteria andSceneCosplayIdNotEqualTo(String value) {
|
||||||
|
addCriterion("scene_cosplay_id <>", value, "sceneCosplayId");
|
||||||
|
return (Criteria) this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Criteria andSceneCosplayIdGreaterThan(String value) {
|
||||||
|
addCriterion("scene_cosplay_id >", value, "sceneCosplayId");
|
||||||
|
return (Criteria) this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Criteria andSceneCosplayIdGreaterThanOrEqualTo(String value) {
|
||||||
|
addCriterion("scene_cosplay_id >=", value, "sceneCosplayId");
|
||||||
|
return (Criteria) this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Criteria andSceneCosplayIdLessThan(String value) {
|
||||||
|
addCriterion("scene_cosplay_id <", value, "sceneCosplayId");
|
||||||
|
return (Criteria) this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Criteria andSceneCosplayIdLessThanOrEqualTo(String value) {
|
||||||
|
addCriterion("scene_cosplay_id <=", value, "sceneCosplayId");
|
||||||
|
return (Criteria) this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Criteria andSceneCosplayIdLike(String value) {
|
||||||
|
addCriterion("scene_cosplay_id like", value, "sceneCosplayId");
|
||||||
|
return (Criteria) this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Criteria andSceneCosplayIdNotLike(String value) {
|
||||||
|
addCriterion("scene_cosplay_id not like", value, "sceneCosplayId");
|
||||||
|
return (Criteria) this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Criteria andSceneCosplayIdIn(List<String> values) {
|
||||||
|
addCriterion("scene_cosplay_id in", values, "sceneCosplayId");
|
||||||
|
return (Criteria) this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Criteria andSceneCosplayIdNotIn(List<String> values) {
|
||||||
|
addCriterion("scene_cosplay_id not in", values, "sceneCosplayId");
|
||||||
|
return (Criteria) this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Criteria andSceneCosplayIdBetween(String value1, String value2) {
|
||||||
|
addCriterion("scene_cosplay_id between", value1, value2, "sceneCosplayId");
|
||||||
|
return (Criteria) this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Criteria andSceneCosplayIdNotBetween(String value1, String value2) {
|
||||||
|
addCriterion("scene_cosplay_id not between", value1, value2, "sceneCosplayId");
|
||||||
|
return (Criteria) this;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -28,6 +28,9 @@ public enum PaperExceptionAssert implements BusinessExceptionAssert {
|
|||||||
PpValid(60020,"请求参数有效"),
|
PpValid(60020,"请求参数有效"),
|
||||||
PdValid(60021,"数据有效"),
|
PdValid(60021,"数据有效"),
|
||||||
PcScore(60022,"试卷定义中分数"),
|
PcScore(60022,"试卷定义中分数"),
|
||||||
|
PcRepeatScene(60023,"重复的场景实训规则"),
|
||||||
|
PcInvalid(60024,"试卷已失效不能作答"),
|
||||||
|
|
||||||
;
|
;
|
||||||
|
|
||||||
int code;
|
int code;
|
||||||
|
@ -50,6 +50,8 @@ public class PaperCompositionService {
|
|||||||
@Transactional(rollbackFor = Exception.class)
|
@Transactional(rollbackFor = Exception.class)
|
||||||
public CreatePaperCompositionRspVo createPaperCompositionWithRule(PaperCompositionWithRuleVo req, AccountVO user) {
|
public CreatePaperCompositionRspVo createPaperCompositionWithRule(PaperCompositionWithRuleVo req, AccountVO user) {
|
||||||
//根据项目和名称来查,如果存在则结束
|
//根据项目和名称来查,如果存在则结束
|
||||||
|
// long sceneCount = req.getRuleList().stream().filter(d->d.getSubtype() == PaperQType.SubType.Scene).count();
|
||||||
|
// PaperExceptionAssert.PcRepeatScene.assertTrue(sceneCount > 1,"场景数据规则只能有一个");
|
||||||
PaperExceptionAssert.PcNotExisted.assertTrue(Objects.nonNull(req.getMapId()), "请选择对应的线路");
|
PaperExceptionAssert.PcNotExisted.assertTrue(Objects.nonNull(req.getMapId()), "请选择对应的线路");
|
||||||
List<PaperComposition> pcList = this.findCompositionByCompanyIdAndName(req.getOrgId(), req.getName());
|
List<PaperComposition> pcList = this.findCompositionByCompanyIdAndName(req.getOrgId(), req.getName());
|
||||||
PaperExceptionAssert.PcNotExisted.assertTrue(CollectionUtils.isEmpty(pcList), "试卷定义已经存在:orgId=" + req.getOrgId() + " name=" + req.getName());
|
PaperExceptionAssert.PcNotExisted.assertTrue(CollectionUtils.isEmpty(pcList), "试卷定义已经存在:orgId=" + req.getOrgId() + " name=" + req.getName());
|
||||||
@ -68,11 +70,11 @@ public class PaperCompositionService {
|
|||||||
newPc.setUpdateTime(LocalDateTime.now());
|
newPc.setUpdateTime(LocalDateTime.now());
|
||||||
newPc.setCreatorId(user.getId());
|
newPc.setCreatorId(user.getId());
|
||||||
newPc.setState(PaperCompositionState.Editing.getValue());
|
newPc.setState(PaperCompositionState.Editing.getValue());
|
||||||
int newRt = compositionDAO.insertSelective(newPc);
|
compositionDAO.insertSelective(newPc);
|
||||||
PaperExceptionAssert.PcStoreSuccess.assertTrue(newRt > 0, "存储试卷定义失败");
|
// PaperExceptionAssert.PcStoreSuccess.assertTrue(newRt > 0, "存储试卷定义失败");
|
||||||
//
|
//
|
||||||
pcList = this.findCompositionByCompanyIdAndName(req.getOrgId(), req.getName());
|
// pcList = this.findCompositionByCompanyIdAndName(req.getOrgId(), req.getName());
|
||||||
newPc = pcList.get(0);
|
// newPc = pcList.get(0);
|
||||||
//
|
//
|
||||||
if (!CollectionUtils.isEmpty(req.getRuleList())) {
|
if (!CollectionUtils.isEmpty(req.getRuleList())) {
|
||||||
final Long pcId = newPc.getId();
|
final Long pcId = newPc.getId();
|
||||||
@ -97,8 +99,7 @@ public class PaperCompositionService {
|
|||||||
private void createPaperCompositionRule(Long pcId, List<PaperCompositionWithRuleVo.PaperRuleVo> reqList) {
|
private void createPaperCompositionRule(Long pcId, List<PaperCompositionWithRuleVo.PaperRuleVo> reqList) {
|
||||||
Map<String,List<PaperCompositionWithRuleVo.PaperRuleVo>> tmpList = reqList.stream().collect(Collectors.groupingBy(k->ruleMapKey(k)));
|
Map<String,List<PaperCompositionWithRuleVo.PaperRuleVo>> tmpList = reqList.stream().collect(Collectors.groupingBy(k->ruleMapKey(k)));
|
||||||
|
|
||||||
|
for (PaperCompositionWithRuleVo.PaperRuleVo req : reqList) {
|
||||||
reqList.forEach(req -> {
|
|
||||||
req.setPcId(pcId);
|
req.setPcId(pcId);
|
||||||
//
|
//
|
||||||
PaperQType.assertPaperSubTypeMatchGroupType(req.getSubtype(), req.getType());
|
PaperQType.assertPaperSubTypeMatchGroupType(req.getSubtype(), req.getType());
|
||||||
@ -117,7 +118,7 @@ public class PaperCompositionService {
|
|||||||
|
|
||||||
//
|
//
|
||||||
ruleDAO.insertSelective(rule);
|
ruleDAO.insertSelective(rule);
|
||||||
});
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -131,9 +132,7 @@ public class PaperCompositionService {
|
|||||||
//
|
//
|
||||||
List<PaperComposition> pcList = this.findCompositionByCompanyIdAndName(req.getOrgId(), req.getName());
|
List<PaperComposition> pcList = this.findCompositionByCompanyIdAndName(req.getOrgId(), req.getName());
|
||||||
if (!CollectionUtils.isEmpty(pcList)) {
|
if (!CollectionUtils.isEmpty(pcList)) {
|
||||||
boolean exist = pcList.stream().anyMatch(c -> {
|
boolean exist = pcList.stream().anyMatch(c ->c.getId().compareTo(curPc.getId()) != 0);
|
||||||
return c.getId().compareTo(curPc.getId()) != 0;
|
|
||||||
});
|
|
||||||
PaperExceptionAssert.PcExisted.assertNotTrue(exist, "试卷定义已经存在:orgId=" + req.getOrgId() + " name=" + req.getName());
|
PaperExceptionAssert.PcExisted.assertNotTrue(exist, "试卷定义已经存在:orgId=" + req.getOrgId() + " name=" + req.getName());
|
||||||
}
|
}
|
||||||
//
|
//
|
||||||
@ -156,7 +155,11 @@ public class PaperCompositionService {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void updateCompositionRule(List<PaperCompositionWithRuleVo.PaperRuleVo> updateRuleList, Long pcId) {
|
private void updateCompositionRule(List<PaperCompositionWithRuleVo.PaperRuleVo> updateRuleList, Long pcId) {
|
||||||
List<PaperRule> oldRuleList = this.findRuleByPcId(pcId);
|
PaperRuleExample ruleExample = new PaperRuleExample();
|
||||||
|
ruleExample.createCriteria().andPcIdEqualTo(pcId);
|
||||||
|
this.ruleDAO.deleteByExample(ruleExample);
|
||||||
|
this.createPaperCompositionRule(pcId,updateRuleList);
|
||||||
|
/* List<PaperRule> oldRuleList = this.findRuleByPcId(pcId);
|
||||||
Set<Long> oldRuleIdSet = new HashSet<>();
|
Set<Long> oldRuleIdSet = new HashSet<>();
|
||||||
if (!CollectionUtils.isEmpty(oldRuleList)) {
|
if (!CollectionUtils.isEmpty(oldRuleList)) {
|
||||||
oldRuleIdSet = oldRuleList.stream().map(PaperRule::getId).collect(Collectors.toSet());
|
oldRuleIdSet = oldRuleList.stream().map(PaperRule::getId).collect(Collectors.toSet());
|
||||||
@ -188,7 +191,7 @@ public class PaperCompositionService {
|
|||||||
neeDelete.forEach(nd -> {
|
neeDelete.forEach(nd -> {
|
||||||
this.ruleDAO.deleteByPrimaryKey(nd);
|
this.ruleDAO.deleteByPrimaryKey(nd);
|
||||||
});
|
});
|
||||||
}
|
}*/
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -420,10 +423,10 @@ public class PaperCompositionService {
|
|||||||
//
|
//
|
||||||
final List<PaperCompositionWithRuleVo> rtList = new ArrayList<>();
|
final List<PaperCompositionWithRuleVo> rtList = new ArrayList<>();
|
||||||
if(!CollectionUtils.isEmpty(sqlPage.getResult())){
|
if(!CollectionUtils.isEmpty(sqlPage.getResult())){
|
||||||
sqlPage.getResult().forEach(pc->{
|
for (PaperComposition pc : sqlPage.getResult()) {
|
||||||
List<PaperRule> prList = this.findRuleByPcId(pc.getId());
|
List<PaperRule> prList = this.findRuleByPcId(pc.getId());
|
||||||
rtList.add(PaperCompositionConvertor.convert(pc, prList));
|
rtList.add(PaperCompositionConvertor.convert(pc, prList));
|
||||||
});
|
}
|
||||||
}
|
}
|
||||||
//
|
//
|
||||||
PageVO<PaperCompositionWithRuleVo> page = PageVO.convert(sqlPage,rtList);
|
PageVO<PaperCompositionWithRuleVo> page = PageVO.convert(sqlPage,rtList);
|
||||||
|
@ -7,6 +7,7 @@ import club.joylink.rtss.entity.paper.question.PaperQuestion;
|
|||||||
import club.joylink.rtss.entity.paper.question.PaperQuestionExample;
|
import club.joylink.rtss.entity.paper.question.PaperQuestionExample;
|
||||||
import club.joylink.rtss.entity.training2.PublishedTraining2;
|
import club.joylink.rtss.entity.training2.PublishedTraining2;
|
||||||
import club.joylink.rtss.entity.training2.PublishedTraining2Example;
|
import club.joylink.rtss.entity.training2.PublishedTraining2Example;
|
||||||
|
import club.joylink.rtss.exception.BusinessExceptionAssertEnum;
|
||||||
import club.joylink.rtss.exception.PaperExceptionAssert;
|
import club.joylink.rtss.exception.PaperExceptionAssert;
|
||||||
import club.joylink.rtss.services.training2.Training2PublishService;
|
import club.joylink.rtss.services.training2.Training2PublishService;
|
||||||
import club.joylink.rtss.util.JsonUtils;
|
import club.joylink.rtss.util.JsonUtils;
|
||||||
@ -92,10 +93,10 @@ public class PaperUserCreateService {
|
|||||||
// 检测是否创建过试卷
|
// 检测是否创建过试卷
|
||||||
// PaperUser oldPu = paperUserService.findByUserIdAndPcId(user.getId(), pcId);
|
// PaperUser oldPu = paperUserService.findByUserIdAndPcId(user.getId(), pcId);
|
||||||
// PaperExceptionAssert.PcNotExisted.assertTrue(null == oldPu, "该用户的试卷已经存在,pcId = " + pcId);
|
// PaperExceptionAssert.PcNotExisted.assertTrue(null == oldPu, "该用户的试卷已经存在,pcId = " + pcId);
|
||||||
this.resetPaperRecord(pcId,user.getId());
|
|
||||||
// 校验试卷蓝图
|
// 校验试卷蓝图
|
||||||
PaperComposition composition = compositionDAO.selectByPrimaryKey(pcId);
|
PaperComposition composition = compositionDAO.selectByPrimaryKey(pcId);
|
||||||
PaperExceptionAssert.PcExisted.assertNotNull(composition, "创建试卷的试卷定义不存在,pcId = " + pcId);
|
PaperExceptionAssert.PcExisted.assertNotNull(composition, "创建试卷的试卷定义不存在,pcId = " + pcId);
|
||||||
|
PaperExceptionAssert.PcInvalid.assertTrue(composition.getState() != PaperCompositionState.Invalid.getValue(), "试卷已失效不能作答,pcId = " + pcId);
|
||||||
PaperExceptionAssert.PcCanCreatePu.assertTrue(!PaperCompositionState.Editing.equals(PaperCompositionState.getItem(composition.getState())), "编辑中的试卷定义无法用于生成用户试卷,pcId = " + pcId);
|
PaperExceptionAssert.PcCanCreatePu.assertTrue(!PaperCompositionState.Editing.equals(PaperCompositionState.getItem(composition.getState())), "编辑中的试卷定义无法用于生成用户试卷,pcId = " + pcId);
|
||||||
LocalDateTime now = LocalDateTime.now();
|
LocalDateTime now = LocalDateTime.now();
|
||||||
if (null != composition.getStartTime() && null != composition.getEndTime()) {
|
if (null != composition.getStartTime() && null != composition.getEndTime()) {
|
||||||
@ -104,6 +105,7 @@ public class PaperUserCreateService {
|
|||||||
// 试卷蓝图规则
|
// 试卷蓝图规则
|
||||||
List<PaperRule> ruleList = compositionService.findRuleByPcId(pcId);
|
List<PaperRule> ruleList = compositionService.findRuleByPcId(pcId);
|
||||||
PaperExceptionAssert.PcHavePr.assertCollectionNotEmpty(ruleList, "试卷定义没有规则定义,无法生成用户试卷,pcId = " + pcId);
|
PaperExceptionAssert.PcHavePr.assertCollectionNotEmpty(ruleList, "试卷定义没有规则定义,无法生成用户试卷,pcId = " + pcId);
|
||||||
|
this.resetPaperRecord(pcId,user.getId());
|
||||||
//
|
//
|
||||||
Long orgId = composition.getOrgId();
|
Long orgId = composition.getOrgId();
|
||||||
// 标记封存的试卷蓝图已使用
|
// 标记封存的试卷蓝图已使用
|
||||||
@ -112,12 +114,13 @@ public class PaperUserCreateService {
|
|||||||
PaperUser paper = new PaperUser();
|
PaperUser paper = new PaperUser();
|
||||||
paper.setUserId(user.getId());
|
paper.setUserId(user.getId());
|
||||||
paper.setPcId(pcId);
|
paper.setPcId(pcId);
|
||||||
|
paper.setOrgId(composition.getOrgId());
|
||||||
// paper.setOrgId(orgId);
|
// paper.setOrgId(orgId);
|
||||||
paper.setCreateTime(LocalDateTime.now());
|
paper.setCreateTime(now);
|
||||||
paper.setStartTime(LocalDateTime.now());
|
paper.setStartTime(now);
|
||||||
// paper.setStatus(true);
|
// paper.setStatus(true);
|
||||||
paperUserDAO.insertSelective(paper);
|
paperUserDAO.insertSelective(paper);
|
||||||
paper = paperUserService.findByUserIdAndPcId(user.getId(), pcId);
|
// paper = paperUserService.findByUserIdAndPcId(user.getId(), pcId);
|
||||||
//
|
//
|
||||||
// this.dispatcherQuestion(paper, composition, ruleList);
|
// this.dispatcherQuestion(paper, composition, ruleList);
|
||||||
this.dispatcherQuestion2(paper, composition, ruleList);
|
this.dispatcherQuestion2(paper, composition, ruleList);
|
||||||
@ -154,17 +157,16 @@ public class PaperUserCreateService {
|
|||||||
List<PaperCompositionWithRuleVo.PaperRuleVo> voList = this.sortPaperRule(rule);
|
List<PaperCompositionWithRuleVo.PaperRuleVo> voList = this.sortPaperRule(rule);
|
||||||
Map<Integer,List<Long>> ruleVOMapList = Maps.newHashMap();
|
Map<Integer,List<Long>> ruleVOMapList = Maps.newHashMap();
|
||||||
for (PaperCompositionWithRuleVo.PaperRuleVo ruleVO : voList) {
|
for (PaperCompositionWithRuleVo.PaperRuleVo ruleVO : voList) {
|
||||||
List<Long> mapIdList = ruleVOMapList.get(ruleVO.getSubtype().getValue());
|
List<Long> mapIdList = ruleVOMapList.computeIfAbsent(ruleVO.getSubtype().getValue(),k-> Lists.newArrayList());
|
||||||
if(Objects.isNull(mapIdList)){
|
|
||||||
mapIdList = Lists.newArrayList();
|
|
||||||
ruleVOMapList.put(ruleVO.getSubtype().getValue(),mapIdList);
|
|
||||||
}
|
|
||||||
List<Long> createQuestionIdList = null;
|
List<Long> createQuestionIdList = null;
|
||||||
if(ruleVO.getType() == PaperQType.GroupType.Common){
|
if(ruleVO.getType() == PaperQType.GroupType.Common){
|
||||||
createQuestionIdList = this.dispatcherCommonQuestion2(pu, pc, ruleVO,mapIdList);
|
createQuestionIdList = this.dispatcherCommonQuestion2(pu, pc, ruleVO,mapIdList);
|
||||||
}else if(ruleVO.getType() == PaperQType.GroupType.Training){
|
}else if(ruleVO.getType() == PaperQType.GroupType.Training){
|
||||||
PaperRule rule2 = PaperRuleConvertor.convert(ruleVO);
|
if(ruleVO.getSubtype() == PaperQType.SubType.Single){
|
||||||
createQuestionIdList = this.dispatcherTrainingQuestion(pu, pc, rule2,mapIdList);
|
createQuestionIdList = this.dispatcherTrainingQuestion(pu, pc, ruleVO,mapIdList);
|
||||||
|
}else{
|
||||||
|
dispatcherTrainScene(pu, ruleVO);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if(!CollectionUtils.isEmpty(createQuestionIdList)){
|
if(!CollectionUtils.isEmpty(createQuestionIdList)){
|
||||||
mapIdList.addAll(createQuestionIdList);
|
mapIdList.addAll(createQuestionIdList);
|
||||||
@ -247,13 +249,13 @@ public class PaperUserCreateService {
|
|||||||
/**
|
/**
|
||||||
* 随机选择实训题目
|
* 随机选择实训题目
|
||||||
*/
|
*/
|
||||||
private List<Long> dispatcherTrainingQuestion(PaperUser pu, PaperComposition pc, PaperRule rule,List<Long> existTrainIds) {
|
private List<Long> dispatcherTrainingQuestion(PaperUser pu, PaperComposition pc, PaperCompositionWithRuleVo.PaperRuleVo rule,List<Long> existTrainIds) {
|
||||||
final int qSum = rule.getAmount();//该类型问题个数
|
final int qSum = rule.getAmount();//该类型问题个数
|
||||||
//
|
//
|
||||||
PublishedTraining2Example questionExample = this.trainingQuestionExample(pu, pc, rule,existTrainIds);
|
PublishedTraining2Example questionExample = this.trainingQuestionExample(pu, pc, rule,existTrainIds);
|
||||||
//符合条件的题目数目
|
//符合条件的题目数目
|
||||||
long count = trainingDAO.countByExample(questionExample);
|
long count = trainingDAO.countByExample(questionExample);
|
||||||
PaperQType.SubType subType = PaperQType.SubType.getItem(rule.getSubtype());
|
PaperQType.SubType subType = PaperQType.SubType.getItem(rule.getSubtype().getValue());
|
||||||
PaperExceptionAssert.PqEnough.assertTrue(count >= qSum, "符合条件的实训题数目过少:pcId = " + pc.getId() + " pcName = " + pc.getName() + " orgId = " + pc.getOrgId() + " ruleType = " + subType.name() + " ruleSum = " + qSum);
|
PaperExceptionAssert.PqEnough.assertTrue(count >= qSum, "符合条件的实训题数目过少:pcId = " + pc.getId() + " pcName = " + pc.getName() + " orgId = " + pc.getOrgId() + " ruleType = " + subType.name() + " ruleSum = " + qSum);
|
||||||
final String orderBy = "rand()";
|
final String orderBy = "rand()";
|
||||||
questionExample.setOrderByClause(String.format("%s limit %s,%s", orderBy, 0, qSum));
|
questionExample.setOrderByClause(String.format("%s limit %s,%s", orderBy, 0, qSum));
|
||||||
@ -268,30 +270,54 @@ public class PaperUserCreateService {
|
|||||||
puq.setPuId(pu.getId());
|
puq.setPuId(pu.getId());
|
||||||
puq.setOrgId(pc.getOrgId());
|
puq.setOrgId(pc.getOrgId());
|
||||||
puq.setRuleId(rule.getId());
|
puq.setRuleId(rule.getId());
|
||||||
puq.setType(PaperQType.GroupType.getItem(rule.getType()).getValue());
|
puq.setType(rule.getType().getValue());
|
||||||
puq.setQuestionId(q.getId());
|
puq.setQuestionId(q.getId());
|
||||||
puq.setSubType(rule.getSubtype());
|
puq.setSubType(rule.getSubtype().getValue());
|
||||||
paperUserQuestionDAO.insertSelective(puq);
|
paperUserQuestionDAO.insertSelective(puq);
|
||||||
});
|
});
|
||||||
return findRand.stream().map(d->d.getId()).collect(Collectors.toList());
|
return findRand.stream().map(d->d.getId()).collect(Collectors.toList());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void dispatcherTrainScene(PaperUser pu, PaperCompositionWithRuleVo.PaperRuleVo rule){
|
||||||
|
|
||||||
|
PaperExceptionAssert.PrNotExisted.assertTrue(!CollectionUtils.isEmpty(rule.getSceneInfo()),"场景实训规则不存在");
|
||||||
|
List<Long> allIds = rule.getSceneInfo().stream().map(PaperCompositionWithRuleVo.ScenePagerRuleVO::getPublishTrainId).collect(Collectors.toList());
|
||||||
|
PublishedTraining2Example example = new PublishedTraining2Example();
|
||||||
|
example.createCriteria().andStateEqualTo(1).andIdIn(allIds);
|
||||||
|
long count = trainingDAO.countByExample(example);
|
||||||
|
PaperExceptionAssert.PqEnough.assertTrue(allIds.size() == count, "没有足够的符合条件的实训题目");
|
||||||
|
rule.getSceneInfo().forEach(q -> {
|
||||||
|
PaperUserQuestion puq = new PaperUserQuestion();
|
||||||
|
puq.setState(PaperQuestionState.Undo.getValue());
|
||||||
|
puq.setPuId(pu.getId());
|
||||||
|
puq.setOrgId(pu.getOrgId());
|
||||||
|
puq.setRuleId(rule.getId());
|
||||||
|
puq.setType(rule.getType().getValue());
|
||||||
|
puq.setQuestionId(q.getPublishTrainId());
|
||||||
|
puq.setSceneCosplayId(q.getCosplayId());
|
||||||
|
puq.setSubType(rule.getSubtype().getValue());
|
||||||
|
paperUserQuestionDAO.insertSelective(puq);
|
||||||
|
});
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 生成根据tag查询的条件
|
* 生成根据tag查询的条件
|
||||||
*/
|
*/
|
||||||
private PublishedTraining2Example trainingQuestionExample(PaperUser pu, PaperComposition pc, PaperRule rule,List<Long> existTrainIds) {
|
private PublishedTraining2Example trainingQuestionExample(PaperUser pu, PaperComposition pc, PaperCompositionWithRuleVo.PaperRuleVo rule,List<Long> existTrainIds) {
|
||||||
String tags = rule.getTags();//规则标签,list json
|
// String tags = rule.getTags();//规则标签,list json
|
||||||
List<String> tagArray = null != tags && tags.length() > 0 ? JsonUtils.readCollection(tags, ArrayList.class, String.class) : null;
|
// List<String> tagArray = null != tags && tags.length() > 0 ? JsonUtils.readCollection(tags, ArrayList.class, String.class) : null;
|
||||||
PaperQType.SubType subType = PaperQType.SubType.getItem(rule.getSubtype());
|
// PaperQType.SubType subType = PaperQType.SubType.getItem(rule.getSubtype());
|
||||||
String subTypeStr = this.paperUserService.getTrainingType(subType);
|
String subTypeStr = this.paperUserService.getTrainingType(rule.getSubtype());
|
||||||
PublishedTraining2Example questionExample = new PublishedTraining2Example();
|
PublishedTraining2Example questionExample = new PublishedTraining2Example();
|
||||||
PublishedTraining2Example.Criteria criteria = questionExample.createCriteria();
|
PublishedTraining2Example.Criteria criteria = questionExample.createCriteria();
|
||||||
if(!CollectionUtils.isEmpty(existTrainIds)){
|
if(!CollectionUtils.isEmpty(existTrainIds)){
|
||||||
criteria.andIdNotIn(existTrainIds);
|
criteria.andIdNotIn(existTrainIds);
|
||||||
}
|
}
|
||||||
this.training2PublishService.basicQueryCriteria(criteria,pc.getMapId(),pc.getOrgId(), StringUtils.hasText(subTypeStr) ? subTypeStr.toUpperCase():null);
|
this.training2PublishService.basicQueryCriteria(criteria,pc.getMapId(),pc.getOrgId(), StringUtils.hasText(subTypeStr) ? subTypeStr.toUpperCase():null);
|
||||||
if(!CollectionUtils.isEmpty(tagArray)){
|
if(!CollectionUtils.isEmpty(rule.getTags())){
|
||||||
for (String tag : tagArray) {
|
for (String tag : rule.getTags()) {
|
||||||
criteria.andLabelJsonLike(String.format("%%%s%%", tag));
|
criteria.andLabelJsonLike(String.format("%%%s%%", tag));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -8,8 +8,10 @@ import club.joylink.rtss.entity.paper.question.PaperQuestion;
|
|||||||
import club.joylink.rtss.entity.paper.question.PaperQuestionExample;
|
import club.joylink.rtss.entity.paper.question.PaperQuestionExample;
|
||||||
import club.joylink.rtss.entity.training2.PublishedTraining2;
|
import club.joylink.rtss.entity.training2.PublishedTraining2;
|
||||||
import club.joylink.rtss.entity.training2.PublishedTraining2Example;
|
import club.joylink.rtss.entity.training2.PublishedTraining2Example;
|
||||||
|
import club.joylink.rtss.exception.BusinessExceptionAssertEnum;
|
||||||
import club.joylink.rtss.exception.PaperExceptionAssert;
|
import club.joylink.rtss.exception.PaperExceptionAssert;
|
||||||
import club.joylink.rtss.services.training2.Training2PublishService;
|
import club.joylink.rtss.services.training2.Training2PublishService;
|
||||||
|
import club.joylink.rtss.util.JsonUtils;
|
||||||
import club.joylink.rtss.vo.AccountVO;
|
import club.joylink.rtss.vo.AccountVO;
|
||||||
import club.joylink.rtss.vo.paper.*;
|
import club.joylink.rtss.vo.paper.*;
|
||||||
import club.joylink.rtss.vo.paper.convertor.PaperCompositionConvertor;
|
import club.joylink.rtss.vo.paper.convertor.PaperCompositionConvertor;
|
||||||
@ -63,6 +65,7 @@ public class PaperUserService {
|
|||||||
if(req.getGroupType() == PaperQType.GroupType.Common){
|
if(req.getGroupType() == PaperQType.GroupType.Common){
|
||||||
return paperQuestionService.findAllLable(req.getOrgId(),req.getSubType().name().toLowerCase());
|
return paperQuestionService.findAllLable(req.getOrgId(),req.getSubType().name().toLowerCase());
|
||||||
}else if(PaperQType.GroupType.Training.equals(req.getGroupType())){
|
}else if(PaperQType.GroupType.Training.equals(req.getGroupType())){
|
||||||
|
// BusinessExceptionAssertEnum.OPERATION_NOT_SUPPORTED.assertNotTrue(req.getSubType() == PaperQType.SubType.Scene,"不支持此操作");
|
||||||
return this.training2PublishService.findAllLabel(req.getMapId(),req.getOrgId(),req.getSubType().name().toUpperCase());
|
return this.training2PublishService.findAllLabel(req.getMapId(),req.getOrgId(),req.getSubType().name().toUpperCase());
|
||||||
}
|
}
|
||||||
return Collections.emptyList();
|
return Collections.emptyList();
|
||||||
@ -81,6 +84,7 @@ public class PaperUserService {
|
|||||||
return paperQuestionService.queryCount(req.getOrgId(),theoryType,tagStr);
|
return paperQuestionService.queryCount(req.getOrgId(),theoryType,tagStr);
|
||||||
}else if(PaperQType.GroupType.Training.equals(req.getGroupType())){
|
}else if(PaperQType.GroupType.Training.equals(req.getGroupType())){
|
||||||
// PaperExceptionAssert.PdValid.assertTrue(!PaperQType.GroupType.Training.equals(groupType),"不支持查询实训题数量");
|
// PaperExceptionAssert.PdValid.assertTrue(!PaperQType.GroupType.Training.equals(groupType),"不支持查询实训题数量");
|
||||||
|
BusinessExceptionAssertEnum.OPERATION_NOT_SUPPORTED.assertNotTrue(req.getSubType() == PaperQType.SubType.Scene,"不支持此操作");
|
||||||
return training2PublishService.queryCountForLabel(req.getMapId(), req.getOrgId(), req.getSubType().name().toUpperCase(),req.getTags());
|
return training2PublishService.queryCountForLabel(req.getMapId(), req.getOrgId(), req.getSubType().name().toUpperCase(),req.getTags());
|
||||||
}
|
}
|
||||||
return 0L;
|
return 0L;
|
||||||
@ -159,11 +163,7 @@ public class PaperUserService {
|
|||||||
//统计最终结果
|
//统计最终结果
|
||||||
PaperComposition composition = compositionDAO.selectByPrimaryKey(paper.getPcId());
|
PaperComposition composition = compositionDAO.selectByPrimaryKey(paper.getPcId());
|
||||||
List<PaperRule> ruleList = compositionService.findRuleByPcId(paper.getPcId());
|
List<PaperRule> ruleList = compositionService.findRuleByPcId(paper.getPcId());
|
||||||
/* Map<PaperQType.SubType, PaperRule> ruleMap = new HashMap<>(ruleList.size());
|
Map<Long, PaperRule> ruleIdMap = ruleList.stream().collect(Collectors.toMap(PaperRule::getId,Function.identity()));
|
||||||
ruleList.forEach(r -> {
|
|
||||||
ruleMap.put(PaperQType.SubType.getItem(r.getSubtype()), r);
|
|
||||||
});*/
|
|
||||||
Map<Long, PaperRule> ruleIdMap = ruleList.stream().collect(Collectors.toMap(d->d.getId(),Function.identity()));
|
|
||||||
|
|
||||||
List<PaperUserQuestion> userQuestionList = findUserSortedQuestions(puId);
|
List<PaperUserQuestion> userQuestionList = findUserSortedQuestions(puId);
|
||||||
int scoreCommon = 0;
|
int scoreCommon = 0;
|
||||||
@ -185,7 +185,7 @@ public class PaperUserService {
|
|||||||
endPaper.setEndTime(now);
|
endPaper.setEndTime(now);
|
||||||
endPaper.setScore(scoreCommon + scoreTraining);
|
endPaper.setScore(scoreCommon + scoreTraining);
|
||||||
paperUserDAO.updateByPrimaryKeySelective(endPaper);
|
paperUserDAO.updateByPrimaryKeySelective(endPaper);
|
||||||
this.deletePaperQuestion(puId);
|
// this.deletePaperQuestion(puId);
|
||||||
//
|
//
|
||||||
PaperSubmitRspVo rsp = new PaperSubmitRspVo();
|
PaperSubmitRspVo rsp = new PaperSubmitRspVo();
|
||||||
rsp.setPuId(puId);
|
rsp.setPuId(puId);
|
||||||
@ -218,15 +218,24 @@ public class PaperUserService {
|
|||||||
* 获取题的最终得分
|
* 获取题的最终得分
|
||||||
*/
|
*/
|
||||||
private int calculateTrainingScore(PaperUserQuestion puq,PaperRule rule) {
|
private int calculateTrainingScore(PaperUserQuestion puq,PaperRule rule) {
|
||||||
// PublishedTraining2Example example = new PublishedTraining2Example();
|
if(Objects.equals(puq.getSubType(), PaperQType.SubType.Single.getValue()) && PaperQuestionState.Right.equals(PaperQuestionState.getItem(puq.getState()))){
|
||||||
// example.createCriteria().andIdEqualTo(puq.getQuestionId());
|
|
||||||
// PublishedTraining2 training = trainingDAO.selectByExample(example).get(0);
|
|
||||||
if (PaperQuestionState.Right.equals(PaperQuestionState.getItem(puq.getState()))) {//题答对时
|
|
||||||
// PaperRule rule = ruleMap.get(this.getTrainingType(training));
|
|
||||||
return rule.getScore();
|
return rule.getScore();
|
||||||
|
}else if(Objects.equals(puq.getSubType(), PaperQType.SubType.Scene.getValue())){
|
||||||
|
if(!StringUtils.hasText(puq.getTmpAnswer())){
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
PaperSubmitAnswerReqVo.AnswerDetail answerDetail = JsonUtils.read(puq.getTmpAnswer(),PaperSubmitAnswerReqVo.AnswerDetail.class);
|
||||||
|
double sumScore = answerDetail.getTrainDetail().stream().mapToDouble(PaperTrainAnswerDetail::getScore).sum();
|
||||||
|
double dd = sumScore / (rule.getScore() * 100);
|
||||||
|
if(dd > 0){
|
||||||
|
return (int)Math.round(dd);
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 获取用户试卷试题(已排序)
|
* 获取用户试卷试题(已排序)
|
||||||
@ -237,8 +246,9 @@ public class PaperUserService {
|
|||||||
public List<PaperUserQuestion> findUserSortedQuestions(Long puId) {
|
public List<PaperUserQuestion> findUserSortedQuestions(Long puId) {
|
||||||
PaperUserQuestionExample example = new PaperUserQuestionExample();
|
PaperUserQuestionExample example = new PaperUserQuestionExample();
|
||||||
example.createCriteria().andPuIdEqualTo(puId);
|
example.createCriteria().andPuIdEqualTo(puId);
|
||||||
|
example.setOrderByClause(" id asc ");
|
||||||
List<PaperUserQuestion> findList = paperUserQuestionDAO.selectByExample(example);
|
List<PaperUserQuestion> findList = paperUserQuestionDAO.selectByExample(example);
|
||||||
List<PaperUserQuestion> commonList = new ArrayList<>();
|
/* List<PaperUserQuestion> commonList = new ArrayList<>();
|
||||||
List<PaperUserQuestion> trainingList = new ArrayList<>();
|
List<PaperUserQuestion> trainingList = new ArrayList<>();
|
||||||
if (!CollectionUtils.isEmpty(findList)) {
|
if (!CollectionUtils.isEmpty(findList)) {
|
||||||
findList.forEach(puq -> {
|
findList.forEach(puq -> {
|
||||||
@ -253,14 +263,15 @@ public class PaperUserService {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
//
|
|
||||||
commonList.sort((puq1, puq2) -> puq1.getId().compareTo(puq2.getId()));
|
commonList.sort(Comparator.comparing(PaperUserQuestion::getId));
|
||||||
trainingList.sort((puq1, puq2) -> puq1.getId().compareTo(puq2.getId()));
|
trainingList.sort(Comparator.comparing(PaperUserQuestion::getId));
|
||||||
//
|
|
||||||
List<PaperUserQuestion> rt = new ArrayList<>(commonList.size() + trainingList.size());
|
List<PaperUserQuestion> rt = new ArrayList<>(commonList.size() + trainingList.size());
|
||||||
rt.addAll(commonList);
|
rt.addAll(commonList);
|
||||||
rt.addAll(trainingList);
|
rt.addAll(trainingList);*/
|
||||||
return rt;
|
findList.sort(Comparator.comparing(PaperUserQuestion::getId));
|
||||||
|
return findList;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -17,10 +17,13 @@ import club.joylink.rtss.exception.PaperExceptionAssert;
|
|||||||
import club.joylink.rtss.services.training2.Training2PublishService;
|
import club.joylink.rtss.services.training2.Training2PublishService;
|
||||||
import club.joylink.rtss.util.JsonUtils;
|
import club.joylink.rtss.util.JsonUtils;
|
||||||
import club.joylink.rtss.vo.AccountVO;
|
import club.joylink.rtss.vo.AccountVO;
|
||||||
|
import club.joylink.rtss.vo.client.training2.ScoringRuleVO;
|
||||||
import club.joylink.rtss.vo.client.training2.Step2VO;
|
import club.joylink.rtss.vo.client.training2.Step2VO;
|
||||||
import club.joylink.rtss.vo.paper.*;
|
import club.joylink.rtss.vo.paper.*;
|
||||||
import club.joylink.rtss.vo.training2.publish.PublishedTraining2DetailRspVo;
|
import club.joylink.rtss.vo.training2.publish.PublishedTraining2DetailRspVo;
|
||||||
|
import com.google.common.base.Joiner;
|
||||||
import com.google.common.base.Strings;
|
import com.google.common.base.Strings;
|
||||||
|
import com.google.common.collect.Lists;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
@ -83,7 +86,7 @@ public class PaperUserSubmitAnswerService {
|
|||||||
break;
|
break;
|
||||||
case Training:{
|
case Training:{
|
||||||
BusinessExceptionAssertEnum.ARGUMENT_ILLEGAL.assertNotTrue((req.getSubType() != PaperQType.SubType.Single && req.getSubType() != PaperQType.SubType.Scene),String.format("未知答题类型[%s]",req.getSubType()));
|
BusinessExceptionAssertEnum.ARGUMENT_ILLEGAL.assertNotTrue((req.getSubType() != PaperQType.SubType.Single && req.getSubType() != PaperQType.SubType.Scene),String.format("未知答题类型[%s]",req.getSubType()));
|
||||||
TrainAnswerVO answerVO = this.submitTrainingAnswer(req);
|
TrainAnswerVO answerVO = this.submitTrainingAnswer(req,puq);
|
||||||
rsp.setResult(answerVO.getState());
|
rsp.setResult(answerVO.getState());
|
||||||
tmpAnswer = JsonUtils.writeValueAsString(answerVO.getDetail());
|
tmpAnswer = JsonUtils.writeValueAsString(answerVO.getDetail());
|
||||||
break;
|
break;
|
||||||
@ -112,49 +115,81 @@ public class PaperUserSubmitAnswerService {
|
|||||||
// PaperExceptionAssert.PuqCanSubmit.assertTrue(PaperQuestionState.Undo.equals(PaperQuestionState.getItem(puq.getState())), "只有未做的题才能提交答案");
|
// PaperExceptionAssert.PuqCanSubmit.assertTrue(PaperQuestionState.Undo.equals(PaperQuestionState.getItem(puq.getState())), "只有未做的题才能提交答案");
|
||||||
}
|
}
|
||||||
|
|
||||||
private TrainAnswerVO submitTrainingAnswer(PaperSubmitAnswerReqVo reqVo){
|
private TrainAnswerVO submitTrainingAnswer(PaperSubmitAnswerReqVo reqVo,PaperUserQuestion puq){
|
||||||
BusinessExceptionAssertEnum.DATA_NOT_EXIST.assertNotTrue(Strings.isNullOrEmpty(reqVo.getCosplayMemberId()),"实训考试没有对应的角色");
|
BusinessExceptionAssertEnum.DATA_NOT_EXIST.assertNotTrue(Strings.isNullOrEmpty(reqVo.getTrainAnswerDetail().getCosplayMemberId()),"实训考试没有对应的角色");
|
||||||
BusinessExceptionAssertEnum.DATA_NOT_EXIST.assertNotTrue(reqVo.getTrainDetail().stream().anyMatch(d->Objects.isNull(d.getStepId())),"实训步骤id不能为空");
|
BusinessExceptionAssertEnum.DATA_NOT_EXIST.assertNotTrue(reqVo.getTrainAnswerDetail().getTrainDetail().stream().anyMatch(d->Objects.isNull(d.getStepId())),"实训步骤id不能为空");
|
||||||
|
|
||||||
PublishedTraining2DetailRspVo detailVO = this.training2PublishService.findTrainingAllInfoById(reqVo.getPqId());
|
PublishedTraining2DetailRspVo detailVO = this.training2PublishService.findTrainingAllInfoById(reqVo.getPqId());
|
||||||
log.debug("查找对应的实训数据 type:[{}],id[{}]",reqVo.getSubType(),reqVo.getPqId());
|
log.debug("查找对应的实训数据 type:[{}],id[{}]",reqVo.getSubType(),reqVo.getPqId());
|
||||||
if(CollectionUtils.isEmpty(reqVo.getTrainDetail())){
|
if(CollectionUtils.isEmpty(reqVo.getTrainAnswerDetail().getTrainDetail())){
|
||||||
return new TrainAnswerVO(PaperQuestionState.Undo, Collections.EMPTY_LIST);
|
return new TrainAnswerVO(PaperQuestionState.Wrong, null);
|
||||||
}
|
}
|
||||||
BusinessExceptionAssertEnum.DATA_NOT_EXIST.assertTrue(Objects.nonNull(detailVO),String.format("未找到对应的实训数据[%s]",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);
|
List<Step2VO> stepList = JsonUtils.readCollection(detailVO.getStepJson(),ArrayList.class, Step2VO.class);
|
||||||
|
|
||||||
Map<Long,PaperTrainAnswerDetail> stepMapper = reqVo.getTrainDetail().stream().collect(Collectors.toMap(d->d.getStepId(), Function.identity(),(v1,v2)->v1));
|
|
||||||
|
|
||||||
stepList = stepList.stream().filter(d->Objects.equals(d.getMemberId(),reqVo.getCosplayMemberId())).collect(Collectors.toList());
|
|
||||||
|
|
||||||
if(stepMapper.values().size() != stepList.size()){
|
|
||||||
return new TrainAnswerVO(PaperQuestionState.Wrong, reqVo.getTrainDetail());
|
|
||||||
}
|
|
||||||
if(reqVo.getSubType() == PaperQType.SubType.Single){
|
if(reqVo.getSubType() == PaperQType.SubType.Single){
|
||||||
return this.submitTrainingAnswerForSingle(reqVo,stepMapper);
|
return this.submitTrainingAnswerForSingle(reqVo,stepList,puq);
|
||||||
}else if(reqVo.getSubType() == PaperQType.SubType.Scene){
|
}else if(reqVo.getSubType() == PaperQType.SubType.Scene){
|
||||||
BusinessExceptionAssertEnum.OPERATION_FAIL.assertTrue(false,String.format("目前不支持场景实训"));
|
return this.submitTrainingAnswerForScene(detailVO,reqVo,puq);
|
||||||
}
|
}
|
||||||
return null;
|
return new TrainAnswerVO(PaperQuestionState.Wrong, null);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 处理实训题答案
|
* 处理实训题答案
|
||||||
* @param req
|
* @param req
|
||||||
* @param stepMapper
|
*
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
private TrainAnswerVO submitTrainingAnswerForSingle(PaperSubmitAnswerReqVo req,Map<Long,PaperTrainAnswerDetail> stepMapper) {
|
private TrainAnswerVO submitTrainingAnswerForSingle(PaperSubmitAnswerReqVo req,List<Step2VO> allStepList,PaperUserQuestion puq) {
|
||||||
if(stepMapper.values().stream().allMatch(d->d.isSuccess())){
|
List<Step2VO> cosplayStepList = allStepList.stream().filter(d->Objects.equals(d.getMemberId(),req.getTrainAnswerDetail().getCosplayMemberId())).collect(Collectors.toList());
|
||||||
return new TrainAnswerVO(PaperQuestionState.Right, req.getTrainDetail());
|
if(req.getTrainAnswerDetail().getTrainDetail().size() != cosplayStepList.size()){
|
||||||
|
return new TrainAnswerVO(PaperQuestionState.Wrong, req.getTrainAnswerDetail());
|
||||||
}
|
}
|
||||||
return new TrainAnswerVO(PaperQuestionState.Wrong, req.getTrainDetail());
|
if(req.getTrainAnswerDetail().getTrainDetail().stream().allMatch(d->d.isSuccess())){
|
||||||
|
return new TrainAnswerVO(PaperQuestionState.Right, req.getTrainAnswerDetail());
|
||||||
|
}
|
||||||
|
return new TrainAnswerVO(PaperQuestionState.Wrong, req.getTrainAnswerDetail());
|
||||||
}
|
}
|
||||||
|
|
||||||
private TrainAnswerVO submitTrainingAnswerForScene(PublishedTraining2DetailRspVo trainVO,PaperSubmitAnswerReqVo req,List<Step2VO> stepList){
|
private TrainAnswerVO submitTrainingAnswerForScene(PublishedTraining2DetailRspVo trainVO,PaperSubmitAnswerReqVo req,PaperUserQuestion puq){
|
||||||
BusinessExceptionAssertEnum.OPERATION_FAIL.assertTrue(false,String.format("目前不支持场景实训"));
|
BusinessExceptionAssertEnum.DATA_ERROR.assertTrue(StringUtils.hasText(trainVO.getScoringRuleJson()),"场景实训没有对应的评分规则");
|
||||||
return null;
|
|
||||||
|
List<ScoringRuleVO> scoreList = JsonUtils.readCollection(trainVO.getScoringRuleJson(),ArrayList.class, ScoringRuleVO.class);
|
||||||
|
BusinessExceptionAssertEnum.DATA_ERROR.assertTrue(!CollectionUtils.isEmpty(scoreList),String.format("场景实训[%s]没有评分规则",req.getPqId()));
|
||||||
|
List<ScoringRuleVO.DetailVO> allDetailVOList = scoreList.stream().filter(d->Objects.equals(d.getMemberId(),req.getTrainAnswerDetail().getCosplayMemberId())).flatMap(d->d.getDetails().stream()).collect(Collectors.toList());
|
||||||
|
List<PaperTrainAnswerDetail> answerDetailList = req.getTrainAnswerDetail().getTrainDetail();
|
||||||
|
answerDetailList = Objects.isNull(answerDetailList) ? Collections.emptyList() : answerDetailList;
|
||||||
|
// BusinessExceptionAssertEnum.DATA_ERROR.assertTrue(allDetailVOList.size() == answerDetailList.size(),String.format("场景实训[%s] 评分规则与提交的答案数量不陪配",puq.getQuestionId()));
|
||||||
|
|
||||||
|
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)){
|
||||||
|
answerDetail.setScore(detailVO.getScore());
|
||||||
|
|
||||||
|
}else{
|
||||||
|
answerDetail = new PaperTrainAnswerDetail();
|
||||||
|
answerDetail.setScore(0F);
|
||||||
|
answerDetail.setNotExistAppend(true);
|
||||||
|
answerDetail.setStepId(Long.parseLong(detailVO.getElementId()));
|
||||||
|
}
|
||||||
|
resultAnswerDetailList.add(answerDetail);
|
||||||
|
}
|
||||||
|
/* answerDetailList = answerDetailList.stream().peek(d->{
|
||||||
|
if(Objects.isNull(d.getScore())){
|
||||||
|
d.setScore(0F);
|
||||||
|
d.setNotExistAppend(true);
|
||||||
|
}
|
||||||
|
}).collect(Collectors.toList());*/
|
||||||
|
req.getTrainAnswerDetail().setTrainDetail(resultAnswerDetailList);
|
||||||
|
return new TrainAnswerVO(PaperQuestionState.SECEN_CUL,req.getTrainAnswerDetail());
|
||||||
|
|
||||||
}
|
}
|
||||||
/**
|
/**
|
||||||
* 处理理论题答案
|
* 处理理论题答案
|
||||||
@ -178,15 +213,16 @@ public class PaperUserSubmitAnswerService {
|
|||||||
for (String an : ans) {
|
for (String an : ans) {
|
||||||
set.add(an.trim());
|
set.add(an.trim());
|
||||||
}
|
}
|
||||||
StringBuilder sb = new StringBuilder();
|
return Joiner.on(",").join(set);
|
||||||
|
/*StringBuilder sb = new StringBuilder();
|
||||||
set.forEach(an -> {
|
set.forEach(an -> {
|
||||||
if (sb.length() <= 0) {
|
if (sb.length() <= 0) {
|
||||||
sb.append(an);
|
sb.append(an);
|
||||||
} else {
|
} else {
|
||||||
sb.append(",").append(an);
|
sb.append(",").append(an);
|
||||||
}
|
}
|
||||||
});
|
});*/
|
||||||
return sb.toString();
|
// return sb.toString();
|
||||||
}
|
}
|
||||||
|
|
||||||
private String getAnswerFromSubmit(PaperSubmitAnswerReqVo req) {
|
private String getAnswerFromSubmit(PaperSubmitAnswerReqVo req) {
|
||||||
@ -194,7 +230,8 @@ public class PaperUserSubmitAnswerService {
|
|||||||
for (String an : req.getAnswer()) {
|
for (String an : req.getAnswer()) {
|
||||||
set.add(an.trim());
|
set.add(an.trim());
|
||||||
}
|
}
|
||||||
StringBuilder sb = new StringBuilder();
|
return Joiner.on(",").join(set);
|
||||||
|
/*StringBuilder sb = new StringBuilder();
|
||||||
set.forEach(an -> {
|
set.forEach(an -> {
|
||||||
if (sb.length() <= 0) {
|
if (sb.length() <= 0) {
|
||||||
sb.append(an);
|
sb.append(an);
|
||||||
@ -202,7 +239,7 @@ public class PaperUserSubmitAnswerService {
|
|||||||
sb.append(",").append(an);
|
sb.append(",").append(an);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
return sb.toString();
|
return sb.toString();*/
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -170,7 +170,18 @@ public class PermissionSubjectService {
|
|||||||
return subjectVOList;
|
return subjectVOList;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// findPermissionWithMapIdAndUserInfo
|
|
||||||
|
/**
|
||||||
|
* 根据mapId,用户id(包括组织,项目)查找对应的权限,并计算剩余权限数量
|
||||||
|
* @param mapId
|
||||||
|
* @param loginUserInfoVO
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
@Deprecated
|
||||||
|
public List<PermissionSubjectVO> findPermissionCalRemains(Long mapId, LoginUserInfoVO loginUserInfoVO){
|
||||||
|
List<PermissionSubjectVO> list = findPermissionWithMapIdAndUserInfo(mapId,loginUserInfoVO);
|
||||||
|
return list;
|
||||||
|
}
|
||||||
|
|
||||||
private void createSystemAbilityVOForProejctOrMap(List<PermissionSubjectVO> subjectVOS,List<SystemAbility> saList){
|
private void createSystemAbilityVOForProejctOrMap(List<PermissionSubjectVO> subjectVOS,List<SystemAbility> saList){
|
||||||
for (PermissionSubjectVO mapVO : subjectVOS) {
|
for (PermissionSubjectVO mapVO : subjectVOS) {
|
||||||
|
@ -621,6 +621,16 @@ public class Operation {
|
|||||||
* 车站处理功能选择
|
* 车站处理功能选择
|
||||||
*/
|
*/
|
||||||
Station_Switch_Route_Set_Model(new Label[]{Label.CLIENT},true),
|
Station_Switch_Route_Set_Model(new Label[]{Label.CLIENT},true),
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 分散自律操作模式转换
|
||||||
|
*/
|
||||||
|
Station_Switch_Control_Operation_Mode(new Label[]{Label.CLIENT},true),
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 分散自律同意转换
|
||||||
|
*/
|
||||||
|
Station_Agree_Operation_Mode(new Label[]{Label.CLIENT},true),
|
||||||
//--------------------------- 列车 ---------------------------
|
//--------------------------- 列车 ---------------------------
|
||||||
/**
|
/**
|
||||||
* 在指定区段加载一辆计划列车(本地开发使用)
|
* 在指定区段加载一辆计划列车(本地开发使用)
|
||||||
|
@ -330,4 +330,20 @@ public class StationOperateHandler {
|
|||||||
public void switchRouteSetModel(Simulation simulation, String stationCode, Station.RouteSetMode routeSetMode, boolean planControl) {
|
public void switchRouteSetModel(Simulation simulation, String stationCode, Station.RouteSetMode routeSetMode, boolean planControl) {
|
||||||
atsStationService.switchRouteSetModel(simulation, stationCode, routeSetMode, planControl);
|
atsStationService.switchRouteSetModel(simulation, stationCode, routeSetMode, planControl);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 车站在分散自律时,操作模式转换
|
||||||
|
*/
|
||||||
|
@OperateHandlerMapping(type = Operation.Type.Station_Switch_Control_Operation_Mode)
|
||||||
|
public void controlOperationModeSwitch(Simulation simulation, SimulationMember fromMember, String stationCode, Station.OperationMode target) {
|
||||||
|
atsStationService.controlOperationModeSwitch(simulation, fromMember, stationCode, target);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 分散自律同意转换模式操作
|
||||||
|
*/
|
||||||
|
@OperateHandlerMapping(type = Operation.Type.Station_Agree_Operation_Mode)
|
||||||
|
public void agreeOperationModel(Simulation simulation, String stationCode) {
|
||||||
|
atsStationService.agreeOperationMode(simulation, stationCode);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -14,6 +14,9 @@ import club.joylink.rtss.simulation.cbtc.data.vo.ControlTransferReplyVO;
|
|||||||
import club.joylink.rtss.simulation.cbtc.exception.SimulationException;
|
import club.joylink.rtss.simulation.cbtc.exception.SimulationException;
|
||||||
import club.joylink.rtss.simulation.cbtc.exception.SimulationExceptionType;
|
import club.joylink.rtss.simulation.cbtc.exception.SimulationExceptionType;
|
||||||
import club.joylink.rtss.simulation.cbtc.member.SimulationMember;
|
import club.joylink.rtss.simulation.cbtc.member.SimulationMember;
|
||||||
|
import club.joylink.rtss.vo.client.SocketMessageVO;
|
||||||
|
import club.joylink.rtss.vo.client.WebSocketMessageType;
|
||||||
|
import club.joylink.rtss.vo.client.factory.SocketMessageFactory;
|
||||||
import club.joylink.rtss.websocket.StompMessageService;
|
import club.joylink.rtss.websocket.StompMessageService;
|
||||||
import lombok.NonNull;
|
import lombok.NonNull;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
@ -580,4 +583,81 @@ public class AtsStationService {
|
|||||||
station.setPlanControl(planControl); // 计划控制
|
station.setPlanControl(planControl); // 计划控制
|
||||||
station.setRouteSetMode(routeSetMode); // 进路排列方式
|
station.setRouteSetMode(routeSetMode); // 进路排列方式
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 车站在分散自律时,操作模式转换
|
||||||
|
* @param simulation 仿真
|
||||||
|
* @param fromMember 操作角色
|
||||||
|
* @param stationCode 车站
|
||||||
|
* @param target 目的操作模式
|
||||||
|
*/
|
||||||
|
public void controlOperationModeSwitch(Simulation simulation, SimulationMember fromMember, String stationCode, Station.OperationMode target) {
|
||||||
|
Station station = getStation(simulation, stationCode);
|
||||||
|
if (Station.ControlMode.Local.equals(station.getControlMode())) {
|
||||||
|
Station.OperationModeApplication applyOperation = new Station.OperationModeApplication(fromMember, station.getOperationMode(), target);
|
||||||
|
if (applyOperation.isNoHandle()) { // 车站操作方式与目的方式相同,直接返回
|
||||||
|
return;
|
||||||
|
} else if (applyOperation.isDirectConversion()) { // 如果可以直接转换
|
||||||
|
doOperationModeSwitch(station);
|
||||||
|
return;
|
||||||
|
} else if (applyOperation.isProhibitConversion()) { // 禁止转换
|
||||||
|
throw new SimulationException(SimulationExceptionType.Operation_Cannot_handed);
|
||||||
|
} else {
|
||||||
|
station.setOperationModeApplication(applyOperation);
|
||||||
|
}
|
||||||
|
} else { // 非分散自律抛出异常
|
||||||
|
throw new SimulationException(SimulationExceptionType.Operation_Handle_FAIL, "车站控制模式不匹配");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 同意分散自律操作模式转换
|
||||||
|
*
|
||||||
|
* @param simulation 仿真
|
||||||
|
* @param stationCode 车站编码
|
||||||
|
*/
|
||||||
|
public void agreeOperationMode(Simulation simulation, String stationCode) {
|
||||||
|
Station station = getStation(simulation, stationCode);
|
||||||
|
if (station.getOperationModeApplication() != null) {
|
||||||
|
doOperationModeSwitch(station);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param simulation
|
||||||
|
* @param station
|
||||||
|
*/
|
||||||
|
public void replyOperationMode(Simulation simulation, Station station) {
|
||||||
|
Station.OperationModeApplication modeApplication = station.getOperationModeApplication();
|
||||||
|
if (modeApplication == null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
SimulationMember simulationMember = null;
|
||||||
|
if (modeApplication.isCenterApplication()) { // 如果中心请求
|
||||||
|
simulationMember = station.getController();
|
||||||
|
} else {
|
||||||
|
simulationMember = simulation.getSimulationMembers().stream()
|
||||||
|
.filter(s -> Objects.equals(s.getType(), SimulationMember.Type.DISPATCHER))
|
||||||
|
.findFirst().orElse(null);
|
||||||
|
}
|
||||||
|
if (simulationMember == null) {
|
||||||
|
return;
|
||||||
|
} else if (simulationMember.isRobot()) {
|
||||||
|
doOperationModeSwitch(station);
|
||||||
|
} else {
|
||||||
|
SocketMessageVO<Station.OperationModeApplication> socketMessageVO =
|
||||||
|
SocketMessageFactory.build(WebSocketMessageType.Simulation_Operation_Mode_Apply, simulation.getId(), modeApplication);
|
||||||
|
stompMessageService.sendToUser(Set.of(simulationMember.getUserId()), socketMessageVO);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 操作模式直接转换
|
||||||
|
*/
|
||||||
|
private void doOperationModeSwitch(Station station) {
|
||||||
|
Station.OperationModeApplication applyOperation = station.getOperationModeApplication();
|
||||||
|
station.setOperationMode(applyOperation.getTarget());
|
||||||
|
station.setOperationModeApplication(null);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -193,6 +193,10 @@ public class CtcRepository {
|
|||||||
for (Station station : simulation.getRepository().getStationList()) {
|
for (Station station : simulation.getRepository().getStationList()) {
|
||||||
stationRegisterMap.put(station.getCode(), new Register());
|
stationRegisterMap.put(station.getCode(), new Register());
|
||||||
}
|
}
|
||||||
|
keyLinkControlInfo.reset();
|
||||||
|
equipmentConstructionInfo.reset();
|
||||||
|
supervisorHandOverInfo.reset();
|
||||||
|
controlFloodSignInfo.reset();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void buildRouteSequence(Simulation simulation) {
|
public void buildRouteSequence(Simulation simulation) {
|
||||||
|
@ -77,6 +77,11 @@ public class ControlFloodSignInfo {
|
|||||||
return allList;
|
return allList;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void reset(){
|
||||||
|
idGenerator.set(0);
|
||||||
|
stationDetailInfoMap.clear();
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 详情信息
|
* 详情信息
|
||||||
*/
|
*/
|
||||||
|
@ -54,6 +54,10 @@ public class EquipmentConstructionInfo {
|
|||||||
return allList;
|
return allList;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void reset(){
|
||||||
|
idGenerator.set(0);
|
||||||
|
stationDetailInfoMap.clear();
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 施工登记信息
|
* 施工登记信息
|
||||||
|
@ -78,6 +78,11 @@ public class KeyLinkControlInfo {
|
|||||||
return allDetailList;
|
return allDetailList;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void reset(){
|
||||||
|
idGenerator.set(0);
|
||||||
|
stationDetailInfoMap.clear();
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 表详情
|
* 表详情
|
||||||
*/
|
*/
|
||||||
|
@ -59,6 +59,11 @@ public class SupervisorHandOverInfo {
|
|||||||
return allList;
|
return allList;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void reset(){
|
||||||
|
idGenerator.set(0);
|
||||||
|
handOverDetailInfoMap.clear();
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 一些公共属性
|
* 一些公共属性
|
||||||
*/
|
*/
|
||||||
|
@ -14,9 +14,7 @@ import club.joylink.rtss.simulation.cbtc.member.SimulationMember;
|
|||||||
import club.joylink.rtss.simulation.cbtc.training2.ecm.anno.ExpConditionMaterialAnno;
|
import club.joylink.rtss.simulation.cbtc.training2.ecm.anno.ExpConditionMaterialAnno;
|
||||||
import club.joylink.rtss.simulation.cbtc.training2.ecm.anno.ExpConditionMaterialSrcAnno;
|
import club.joylink.rtss.simulation.cbtc.training2.ecm.anno.ExpConditionMaterialSrcAnno;
|
||||||
import club.joylink.rtss.simulation.cbtc.training2.ecm.vo.ExpTypeCategory;
|
import club.joylink.rtss.simulation.cbtc.training2.ecm.vo.ExpTypeCategory;
|
||||||
import lombok.Getter;
|
import lombok.*;
|
||||||
import lombok.NonNull;
|
|
||||||
import lombok.Setter;
|
|
||||||
import org.springframework.util.CollectionUtils;
|
import org.springframework.util.CollectionUtils;
|
||||||
|
|
||||||
import java.time.LocalTime;
|
import java.time.LocalTime;
|
||||||
@ -36,6 +34,9 @@ public class Station extends MayOutOfOrderDevice {
|
|||||||
ldStandList = new ArrayList<>();
|
ldStandList = new ArrayList<>();
|
||||||
controlMode = ControlMode.Center;
|
controlMode = ControlMode.Center;
|
||||||
stationDirectionMap = new HashMap<>();
|
stationDirectionMap = new HashMap<>();
|
||||||
|
planControl = true;
|
||||||
|
routeSetMode = RouteSetMode.Plan_Set_Route;
|
||||||
|
operationMode = OperationMode.Center;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -227,6 +228,18 @@ public class Station extends MayOutOfOrderDevice {
|
|||||||
*/
|
*/
|
||||||
private RouteSetMode routeSetMode;
|
private RouteSetMode routeSetMode;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 操作模式
|
||||||
|
* 控制模式分为分散自律、非常站控
|
||||||
|
* 分散自律分为中心操作、车站操作、车站调车
|
||||||
|
*/
|
||||||
|
private OperationMode operationMode;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 操作模式
|
||||||
|
*/
|
||||||
|
private OperationModeApplication operationModeApplication;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void reset() {
|
public void reset() {
|
||||||
super.reset();
|
super.reset();
|
||||||
@ -253,6 +266,9 @@ public class Station extends MayOutOfOrderDevice {
|
|||||||
sGuideMasterLock = false;
|
sGuideMasterLock = false;
|
||||||
xGuideMasterLock = false;
|
xGuideMasterLock = false;
|
||||||
counter = null;
|
counter = null;
|
||||||
|
planControl = true;
|
||||||
|
routeSetMode = RouteSetMode.Plan_Set_Route;
|
||||||
|
operationMode = OperationMode.Center;
|
||||||
}
|
}
|
||||||
|
|
||||||
public List<Stand> getStandOf(boolean right) {
|
public List<Stand> getStandOf(boolean right) {
|
||||||
@ -538,6 +554,97 @@ public class Station extends MayOutOfOrderDevice {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 操作方式
|
||||||
|
*/
|
||||||
|
public enum OperationMode {
|
||||||
|
Center("中心操作"), Station("车站操作"), Station_Shunt("车站调车");
|
||||||
|
|
||||||
|
private String label;
|
||||||
|
|
||||||
|
OperationMode(String label) {
|
||||||
|
this.label = label;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 操作模式申请信息
|
||||||
|
*/
|
||||||
|
@Data
|
||||||
|
@NoArgsConstructor
|
||||||
|
@AllArgsConstructor
|
||||||
|
public static class OperationModeApplication {
|
||||||
|
/**
|
||||||
|
* 是否中心申请
|
||||||
|
*/
|
||||||
|
private boolean centerApplication;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 是否车站申请
|
||||||
|
*/
|
||||||
|
private boolean stationApplication;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 源操作方式
|
||||||
|
*/
|
||||||
|
private OperationMode source;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 目的操作方式
|
||||||
|
*/
|
||||||
|
private OperationMode target;
|
||||||
|
|
||||||
|
public OperationModeApplication(SimulationMember applicantMember, OperationMode source, OperationMode target) {
|
||||||
|
this.centerApplication = Objects.equals(applicantMember.getType(), SimulationMember.Type.DISPATCHER);
|
||||||
|
this.stationApplication = Objects.equals(applicantMember.getType(), SimulationMember.Type.STATION_SUPERVISOR);
|
||||||
|
this.source = source;
|
||||||
|
this.target = target;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 不做处理情况
|
||||||
|
*/
|
||||||
|
public boolean isNoHandle() {
|
||||||
|
return Objects.equals(source, target);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 需要中心同意
|
||||||
|
*/
|
||||||
|
public boolean needCenterApply() {
|
||||||
|
return !this.isNoHandle() && stationApplication && !this.isProhibitConversion();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 需要车站同意
|
||||||
|
*/
|
||||||
|
public boolean needStationApply() {
|
||||||
|
return !this.isNoHandle() && centerApplication && !this.isDirectConversion() ;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 直接转换
|
||||||
|
*/
|
||||||
|
public boolean isDirectConversion() {
|
||||||
|
return centerApplication && centerToShunt();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 禁止转换
|
||||||
|
*/
|
||||||
|
public boolean isProhibitConversion() {
|
||||||
|
return stationApplication && centerToShunt();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 中心与调车相互转换
|
||||||
|
*/
|
||||||
|
private boolean centerToShunt() {
|
||||||
|
return (OperationMode.Center.equals(source) && OperationMode.Station_Shunt.equals(target))
|
||||||
|
|| (OperationMode.Center.equals(target) && OperationMode.Station_Shunt.equals(source));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 是否中控
|
* 是否中控
|
||||||
*/
|
*/
|
||||||
|
@ -25,12 +25,14 @@ public class StorageCtcRegister {
|
|||||||
return storageCtcRegister;
|
return storageCtcRegister;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void recover2Simulation(Register register) {
|
public Register recover2Simulation() {
|
||||||
|
Register register = new Register();
|
||||||
if (this.registerId != null && this.registerId != 0) {
|
if (this.registerId != null && this.registerId != 0) {
|
||||||
register.getIdGenerator().set(this.registerId);
|
register.getIdGenerator().set(this.registerId);
|
||||||
}
|
}
|
||||||
if (this.lines != null) {
|
if (this.lines != null) {
|
||||||
register.getLines().addAll(this.lines);
|
register.getLines().addAll(this.lines);
|
||||||
}
|
}
|
||||||
|
return register;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
package club.joylink.rtss.simulation.cbtc.data.storage.ctc;
|
package club.joylink.rtss.simulation.cbtc.data.storage.ctc;
|
||||||
|
|
||||||
import club.joylink.rtss.simulation.cbtc.CTC.data.CtcRepository;
|
import club.joylink.rtss.simulation.cbtc.CTC.data.CtcRepository;
|
||||||
|
import club.joylink.rtss.simulation.cbtc.CTC.data.Register;
|
||||||
import club.joylink.rtss.simulation.cbtc.CTC.data.Ticket;
|
import club.joylink.rtss.simulation.cbtc.CTC.data.Ticket;
|
||||||
import club.joylink.rtss.simulation.cbtc.CTC.data.book.ControlFloodSignInfo;
|
import club.joylink.rtss.simulation.cbtc.CTC.data.book.ControlFloodSignInfo;
|
||||||
import club.joylink.rtss.simulation.cbtc.CTC.data.book.EquipmentConstructionInfo;
|
import club.joylink.rtss.simulation.cbtc.CTC.data.book.EquipmentConstructionInfo;
|
||||||
@ -16,6 +17,7 @@ import java.util.HashMap;
|
|||||||
import java.util.LinkedList;
|
import java.util.LinkedList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
import java.util.concurrent.ConcurrentHashMap;
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
@Getter
|
@Getter
|
||||||
@ -42,6 +44,11 @@ public class StorageSimulationCtcDataRepository {
|
|||||||
*/
|
*/
|
||||||
private Map<String, StorageCtcRouteSequence> routeSequenceMap;
|
private Map<String, StorageCtcRouteSequence> routeSequenceMap;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 车站-行车簿册
|
||||||
|
*/
|
||||||
|
private Map<String, StorageCtcRegister> stationRegisterMap;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 票据ID
|
* 票据ID
|
||||||
*/
|
*/
|
||||||
@ -141,12 +148,35 @@ public class StorageSimulationCtcDataRepository {
|
|||||||
this.storageDisCmdDb = StorageDisCmdDb.convert2Storage(repository.getDisCmdDb());
|
this.storageDisCmdDb = StorageDisCmdDb.convert2Storage(repository.getDisCmdDb());
|
||||||
// 非正常情况接发列车关键环节控制表
|
// 非正常情况接发列车关键环节控制表
|
||||||
this.keyLinkControlInfo = repository.getKeyLinkControlInfo().getAllDetailInfo();
|
this.keyLinkControlInfo = repository.getKeyLinkControlInfo().getAllDetailInfo();
|
||||||
|
if (CollectionUtils.isEmpty(this.keyLinkControlInfo)) {
|
||||||
|
this.keyLinkControlInfo = null;
|
||||||
|
}
|
||||||
// 行车设备施工登记簿
|
// 行车设备施工登记簿
|
||||||
this.equipmentConstructionInfo = repository.getEquipmentConstructionInfo().getAllDetailInfo();
|
this.equipmentConstructionInfo = repository.getEquipmentConstructionInfo().getAllDetailInfo();
|
||||||
|
if (CollectionUtils.isEmpty(this.equipmentConstructionInfo)) {
|
||||||
|
this.equipmentConstructionInfo = null;
|
||||||
|
}
|
||||||
// 交接班记录登记薄
|
// 交接班记录登记薄
|
||||||
this.supervisorHandOverInfo = repository.getSupervisorHandOverInfo().getAllDetailInfo();
|
this.supervisorHandOverInfo = repository.getSupervisorHandOverInfo().getAllDetailInfo();
|
||||||
|
if (CollectionUtils.isEmpty(this.supervisorHandOverInfo)) {
|
||||||
|
this.supervisorHandOverInfo = null;
|
||||||
|
}
|
||||||
// 防洪安全上岗签到表
|
// 防洪安全上岗签到表
|
||||||
this.controlFloodSignInfo = repository.getControlFloodSignInfo().getAllDetailInfo();
|
this.controlFloodSignInfo = repository.getControlFloodSignInfo().getAllDetailInfo();
|
||||||
|
if (CollectionUtils.isEmpty(this.controlFloodSignInfo)) {
|
||||||
|
this.controlFloodSignInfo = null;
|
||||||
|
}
|
||||||
|
if (!repository.getStationRegisterMap().isEmpty()) {
|
||||||
|
this.stationRegisterMap = new HashMap<>(repository.getStationRegisterMap().size());
|
||||||
|
repository.getStationRegisterMap().forEach((k, v) -> {
|
||||||
|
if (!v.getLines().isEmpty()) {
|
||||||
|
this.stationRegisterMap.put(k, StorageCtcRegister.convert2Storage(v));
|
||||||
|
}
|
||||||
|
});
|
||||||
|
if (this.stationRegisterMap.isEmpty()) {
|
||||||
|
this.stationRegisterMap = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -214,12 +244,17 @@ public class StorageSimulationCtcDataRepository {
|
|||||||
if (!CollectionUtils.isEmpty(this.controlFloodSignInfo)) {
|
if (!CollectionUtils.isEmpty(this.controlFloodSignInfo)) {
|
||||||
this.controlFloodSignInfo.forEach(detailInfo -> repository.getControlFloodSignInfo().saveDetailInfo(detailInfo));
|
this.controlFloodSignInfo.forEach(detailInfo -> repository.getControlFloodSignInfo().saveDetailInfo(detailInfo));
|
||||||
}
|
}
|
||||||
|
if (!CollectionUtils.isEmpty(this.stationRegisterMap)) {
|
||||||
|
this.stationRegisterMap.forEach((k, v) -> repository.getStationRegisterMap().put(k, v.recover2Simulation()));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean isNotEmpty() {
|
public boolean isNotEmpty() {
|
||||||
return this.storageCtcZoneData != null || this.storageCtcEffectData != null || this.runPlanLogList != null
|
return this.storageCtcZoneData != null || this.storageCtcEffectData != null || this.runPlanLogList != null
|
||||||
|| this.routeSequenceMap != null || this.ticketId != null || this.railTicketList != null
|
|| this.routeSequenceMap != null || this.ticketId != null || this.railTicketList != null
|
||||||
|| this.greenLicensesList != null || this.redLicenseList != null || this.dispatchCommandId != null
|
|| this.greenLicensesList != null || this.redLicenseList != null || this.dispatchCommandId != null
|
||||||
|| this.dispatchCommandList != null || this.storageDisCmdDb != null;
|
|| this.dispatchCommandList != null || this.storageDisCmdDb != null || this.stationRegisterMap != null
|
||||||
|
|| !CollectionUtils.isEmpty(this.keyLinkControlInfo) || !CollectionUtils.isEmpty(this.supervisorHandOverInfo)
|
||||||
|
|| !CollectionUtils.isEmpty(this.equipmentConstructionInfo) || !CollectionUtils.isEmpty(this.controlFloodSignInfo);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -70,6 +70,7 @@ public class SimulationRobotService {
|
|||||||
}
|
}
|
||||||
robotReplyControlTransferApplicationLogicLoop(simulation);
|
robotReplyControlTransferApplicationLogicLoop(simulation);
|
||||||
robotStationControlAutoTransfer(simulation);
|
robotStationControlAutoTransfer(simulation);
|
||||||
|
robotStationOperationModel(simulation);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -562,6 +563,16 @@ public class SimulationRobotService {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 机器人执行车站分散自律模式操作方式转换
|
||||||
|
*/
|
||||||
|
private void robotStationOperationModel(Simulation simulation) {
|
||||||
|
if (simulation.getScript() != null && simulation.getScript().isBgSet()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
simulation.getRepository().getStationList().stream().filter(station -> station.getOperationModeApplication() != null)
|
||||||
|
.forEach(station -> atsStationService.replyOperationMode(simulation, station));
|
||||||
|
}
|
||||||
private void doControlBySpeedCurve(Simulation simulation, VirtualRealityTrain train, SpeedCurve speedCurve, float remainDistance) {
|
private void doControlBySpeedCurve(Simulation simulation, VirtualRealityTrain train, SpeedCurve speedCurve, float remainDistance) {
|
||||||
if (speedCurve.equals(SpeedCurve.ZERO)) {
|
if (speedCurve.equals(SpeedCurve.ZERO)) {
|
||||||
this.doBreakMax(simulation, train);
|
this.doBreakMax(simulation, train);
|
||||||
|
@ -163,6 +163,11 @@ public enum WebSocketMessageType {
|
|||||||
*/
|
*/
|
||||||
Simulation_Alarm,
|
Simulation_Alarm,
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 仿真-分散自律-操作模式申请
|
||||||
|
*/
|
||||||
|
Simulation_Operation_Mode_Apply,
|
||||||
|
|
||||||
//------------------ 仿真剧本 ------------------
|
//------------------ 仿真剧本 ------------------
|
||||||
/**
|
/**
|
||||||
* 仿真-剧本已加载
|
* 仿真-剧本已加载
|
||||||
|
@ -5,6 +5,7 @@ import club.joylink.rtss.vo.paper.PaperQType;
|
|||||||
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
|
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
|
||||||
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
|
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
|
import lombok.Getter;
|
||||||
|
|
||||||
import javax.validation.constraints.Email;
|
import javax.validation.constraints.Email;
|
||||||
import javax.validation.constraints.NotNull;
|
import javax.validation.constraints.NotNull;
|
||||||
@ -138,6 +139,10 @@ public class PaperCompositionWithRuleVo {
|
|||||||
*/
|
*/
|
||||||
private List<String> tags;
|
private List<String> tags;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 场景信息
|
||||||
|
*/
|
||||||
|
private List<ScenePagerRuleVO> sceneInfo;
|
||||||
/**
|
/**
|
||||||
* 该类型题目数量
|
* 该类型题目数量
|
||||||
*/
|
*/
|
||||||
@ -148,4 +153,29 @@ public class PaperCompositionWithRuleVo {
|
|||||||
*/
|
*/
|
||||||
private Integer score;
|
private Integer score;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Data
|
||||||
|
public static class ScenePagerRuleVO{
|
||||||
|
/**
|
||||||
|
* 实训id
|
||||||
|
*/
|
||||||
|
private Long publishTrainId;
|
||||||
|
/**
|
||||||
|
* 实训名称
|
||||||
|
*/
|
||||||
|
// private String name;
|
||||||
|
/**
|
||||||
|
* 实训参演角色
|
||||||
|
*/
|
||||||
|
// private String memberList;
|
||||||
|
/**
|
||||||
|
* 可选角色
|
||||||
|
*/
|
||||||
|
// private List<String> selectPlayId;
|
||||||
|
/**
|
||||||
|
* 扮演角色
|
||||||
|
*/
|
||||||
|
private String cosplayId;
|
||||||
|
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -27,9 +27,9 @@ public enum PaperQuestionState {
|
|||||||
*/
|
*/
|
||||||
TimeOut(4),
|
TimeOut(4),
|
||||||
/**
|
/**
|
||||||
* 5-没有全部回答正确(针对实训场景使用)
|
* 5-实训场景交卷时候需要计算
|
||||||
*/
|
*/
|
||||||
Not_All_Right(5),
|
SECEN_CUL(5),
|
||||||
;
|
;
|
||||||
private Integer state;
|
private Integer state;
|
||||||
|
|
||||||
|
@ -46,8 +46,11 @@ public class PaperSubmitAnswerReqVo {
|
|||||||
/**
|
/**
|
||||||
* 实操
|
* 实操
|
||||||
*/
|
*/
|
||||||
private List<PaperTrainAnswerDetail> trainDetail;
|
private AnswerDetail trainAnswerDetail;
|
||||||
|
|
||||||
|
@Data
|
||||||
|
public static class AnswerDetail{
|
||||||
private String cosplayMemberId;
|
private String cosplayMemberId;
|
||||||
|
private List<PaperTrainAnswerDetail> trainDetail;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -19,11 +19,16 @@ public class PaperTrainAnswerDetail {
|
|||||||
*/
|
*/
|
||||||
private boolean success;
|
private boolean success;
|
||||||
|
|
||||||
private Integer score;
|
private Float score;
|
||||||
|
|
||||||
|
|
||||||
|
private boolean notExistAppend;
|
||||||
/**
|
/**
|
||||||
* 客户端操作的实训,对应的id必须要传
|
* 客户端操作的实训,对应的id必须要传
|
||||||
*/
|
*/
|
||||||
private List<TrainOperations> clientOperations;
|
private List<TrainOperations> clientOperations;
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 原有的操作列表
|
* 原有的操作列表
|
||||||
*/
|
*/
|
||||||
|
@ -11,5 +11,5 @@ import java.util.List;
|
|||||||
@NoArgsConstructor
|
@NoArgsConstructor
|
||||||
public class TrainAnswerVO {
|
public class TrainAnswerVO {
|
||||||
private PaperQuestionState state;
|
private PaperQuestionState state;
|
||||||
private List<PaperTrainAnswerDetail> detail;
|
private PaperSubmitAnswerReqVo.AnswerDetail detail;
|
||||||
}
|
}
|
||||||
|
@ -28,7 +28,10 @@ public class PaperRuleConvertor {
|
|||||||
tmpTags = tmpTags.stream().filter(StringUtils::hasText)/*.filter(d-> !Objects.equals(d,"无"))*/.collect(Collectors.toList());
|
tmpTags = tmpTags.stream().filter(StringUtils::hasText)/*.filter(d-> !Objects.equals(d,"无"))*/.collect(Collectors.toList());
|
||||||
to.setTags(tmpTags);
|
to.setTags(tmpTags);
|
||||||
}
|
}
|
||||||
|
if(StringUtils.hasText(from.getSceneDetail())){
|
||||||
|
List<PaperCompositionWithRuleVo.ScenePagerRuleVO> sceneRuleList = JsonUtils.readCollection(from.getSceneDetail(),ArrayList.class, PaperCompositionWithRuleVo.ScenePagerRuleVO.class);
|
||||||
|
to.setSceneInfo(sceneRuleList);
|
||||||
|
}
|
||||||
|
|
||||||
to.setScore(from.getScore());
|
to.setScore(from.getScore());
|
||||||
to.setAmount(from.getAmount());
|
to.setAmount(from.getAmount());
|
||||||
@ -53,6 +56,9 @@ public class PaperRuleConvertor {
|
|||||||
} else {
|
} else {
|
||||||
to.setTags(JsonUtils.writeValueAsString(new ArrayList<String>()));
|
to.setTags(JsonUtils.writeValueAsString(new ArrayList<String>()));
|
||||||
}
|
}
|
||||||
|
if(Objects.nonNull(from.getSceneInfo())){
|
||||||
|
to.setSceneDetail(JsonUtils.writeValueAsString(from.getSceneInfo()));
|
||||||
|
}
|
||||||
to.setScore(from.getScore());
|
to.setScore(from.getScore());
|
||||||
to.setAmount(from.getAmount());
|
to.setAmount(from.getAmount());
|
||||||
return to;
|
return to;
|
||||||
|
@ -118,7 +118,7 @@
|
|||||||
<include refid="Example_Where_Clause" />
|
<include refid="Example_Where_Clause" />
|
||||||
</if>
|
</if>
|
||||||
</delete>
|
</delete>
|
||||||
<insert id="insert" parameterType="club.joylink.rtss.entity.paper.PaperComposition">
|
<insert id="insert" parameterType="club.joylink.rtss.entity.paper.PaperComposition" keyProperty="id" useGeneratedKeys="true" keyColumn="id">
|
||||||
insert into rts_paper_composition (id, `name`, profile,
|
insert into rts_paper_composition (id, `name`, profile,
|
||||||
map_id, org_id, start_time,
|
map_id, org_id, start_time,
|
||||||
end_time, valid_duration, pass_score,
|
end_time, valid_duration, pass_score,
|
||||||
@ -132,7 +132,7 @@
|
|||||||
#{createTime,jdbcType=TIMESTAMP}, #{updateTime,jdbcType=TIMESTAMP}, #{state,jdbcType=INTEGER}
|
#{createTime,jdbcType=TIMESTAMP}, #{updateTime,jdbcType=TIMESTAMP}, #{state,jdbcType=INTEGER}
|
||||||
)
|
)
|
||||||
</insert>
|
</insert>
|
||||||
<insert id="insertSelective" parameterType="club.joylink.rtss.entity.paper.PaperComposition">
|
<insert id="insertSelective" parameterType="club.joylink.rtss.entity.paper.PaperComposition" keyColumn="id" keyProperty="id" useGeneratedKeys="true">
|
||||||
insert into rts_paper_composition
|
insert into rts_paper_composition
|
||||||
<trim prefix="(" suffix=")" suffixOverrides=",">
|
<trim prefix="(" suffix=")" suffixOverrides=",">
|
||||||
<if test="id != null">
|
<if test="id != null">
|
||||||
|
@ -9,6 +9,7 @@
|
|||||||
<result column="tags" jdbcType="VARCHAR" property="tags" />
|
<result column="tags" jdbcType="VARCHAR" property="tags" />
|
||||||
<result column="amount" jdbcType="INTEGER" property="amount" />
|
<result column="amount" jdbcType="INTEGER" property="amount" />
|
||||||
<result column="score" jdbcType="INTEGER" property="score" />
|
<result column="score" jdbcType="INTEGER" property="score" />
|
||||||
|
<result column="scene_detail" jdbcType="VARCHAR" property="sceneDetail" />
|
||||||
</resultMap>
|
</resultMap>
|
||||||
<sql id="Example_Where_Clause">
|
<sql id="Example_Where_Clause">
|
||||||
<where>
|
<where>
|
||||||
@ -69,7 +70,7 @@
|
|||||||
</where>
|
</where>
|
||||||
</sql>
|
</sql>
|
||||||
<sql id="Base_Column_List">
|
<sql id="Base_Column_List">
|
||||||
id, pc_id, `type`, subType, tags, amount, score
|
id, pc_id, `type`, subType, tags, amount, score, scene_detail
|
||||||
</sql>
|
</sql>
|
||||||
<select id="selectByExample" parameterType="club.joylink.rtss.entity.paper.PaperRuleExample" resultMap="BaseResultMap">
|
<select id="selectByExample" parameterType="club.joylink.rtss.entity.paper.PaperRuleExample" resultMap="BaseResultMap">
|
||||||
select
|
select
|
||||||
@ -109,20 +110,17 @@
|
|||||||
<include refid="Example_Where_Clause" />
|
<include refid="Example_Where_Clause" />
|
||||||
</if>
|
</if>
|
||||||
</delete>
|
</delete>
|
||||||
<insert id="insert" parameterType="club.joylink.rtss.entity.paper.PaperRule">
|
<insert id="insert" keyColumn="id" keyProperty="id" parameterType="club.joylink.rtss.entity.paper.PaperRule" useGeneratedKeys="true">
|
||||||
insert into rts_paper_rule (id, pc_id, `type`,
|
insert into rts_paper_rule (pc_id, `type`, subType,
|
||||||
subType, tags, amount,
|
tags, amount, score,
|
||||||
score)
|
scene_detail)
|
||||||
values (#{id,jdbcType=BIGINT}, #{pcId,jdbcType=BIGINT}, #{type,jdbcType=INTEGER},
|
values (#{pcId,jdbcType=BIGINT}, #{type,jdbcType=INTEGER}, #{subtype,jdbcType=INTEGER},
|
||||||
#{subtype,jdbcType=INTEGER}, #{tags,jdbcType=VARCHAR}, #{amount,jdbcType=INTEGER},
|
#{tags,jdbcType=VARCHAR}, #{amount,jdbcType=INTEGER}, #{score,jdbcType=INTEGER},
|
||||||
#{score,jdbcType=INTEGER})
|
#{sceneDetail,jdbcType=VARCHAR})
|
||||||
</insert>
|
</insert>
|
||||||
<insert id="insertSelective" parameterType="club.joylink.rtss.entity.paper.PaperRule">
|
<insert id="insertSelective" keyColumn="id" keyProperty="id" parameterType="club.joylink.rtss.entity.paper.PaperRule" useGeneratedKeys="true">
|
||||||
insert into rts_paper_rule
|
insert into rts_paper_rule
|
||||||
<trim prefix="(" suffix=")" suffixOverrides=",">
|
<trim prefix="(" suffix=")" suffixOverrides=",">
|
||||||
<if test="id != null">
|
|
||||||
id,
|
|
||||||
</if>
|
|
||||||
<if test="pcId != null">
|
<if test="pcId != null">
|
||||||
pc_id,
|
pc_id,
|
||||||
</if>
|
</if>
|
||||||
@ -141,11 +139,11 @@
|
|||||||
<if test="score != null">
|
<if test="score != null">
|
||||||
score,
|
score,
|
||||||
</if>
|
</if>
|
||||||
|
<if test="sceneDetail != null">
|
||||||
|
scene_detail,
|
||||||
|
</if>
|
||||||
</trim>
|
</trim>
|
||||||
<trim prefix="values (" suffix=")" suffixOverrides=",">
|
<trim prefix="values (" suffix=")" suffixOverrides=",">
|
||||||
<if test="id != null">
|
|
||||||
#{id,jdbcType=BIGINT},
|
|
||||||
</if>
|
|
||||||
<if test="pcId != null">
|
<if test="pcId != null">
|
||||||
#{pcId,jdbcType=BIGINT},
|
#{pcId,jdbcType=BIGINT},
|
||||||
</if>
|
</if>
|
||||||
@ -164,6 +162,9 @@
|
|||||||
<if test="score != null">
|
<if test="score != null">
|
||||||
#{score,jdbcType=INTEGER},
|
#{score,jdbcType=INTEGER},
|
||||||
</if>
|
</if>
|
||||||
|
<if test="sceneDetail != null">
|
||||||
|
#{sceneDetail,jdbcType=VARCHAR},
|
||||||
|
</if>
|
||||||
</trim>
|
</trim>
|
||||||
</insert>
|
</insert>
|
||||||
<select id="countByExample" parameterType="club.joylink.rtss.entity.paper.PaperRuleExample" resultType="java.lang.Long">
|
<select id="countByExample" parameterType="club.joylink.rtss.entity.paper.PaperRuleExample" resultType="java.lang.Long">
|
||||||
@ -196,6 +197,9 @@
|
|||||||
<if test="record.score != null">
|
<if test="record.score != null">
|
||||||
score = #{record.score,jdbcType=INTEGER},
|
score = #{record.score,jdbcType=INTEGER},
|
||||||
</if>
|
</if>
|
||||||
|
<if test="record.sceneDetail != null">
|
||||||
|
scene_detail = #{record.sceneDetail,jdbcType=VARCHAR},
|
||||||
|
</if>
|
||||||
</set>
|
</set>
|
||||||
<if test="_parameter != null">
|
<if test="_parameter != null">
|
||||||
<include refid="Update_By_Example_Where_Clause" />
|
<include refid="Update_By_Example_Where_Clause" />
|
||||||
@ -209,7 +213,8 @@
|
|||||||
subType = #{record.subtype,jdbcType=INTEGER},
|
subType = #{record.subtype,jdbcType=INTEGER},
|
||||||
tags = #{record.tags,jdbcType=VARCHAR},
|
tags = #{record.tags,jdbcType=VARCHAR},
|
||||||
amount = #{record.amount,jdbcType=INTEGER},
|
amount = #{record.amount,jdbcType=INTEGER},
|
||||||
score = #{record.score,jdbcType=INTEGER}
|
score = #{record.score,jdbcType=INTEGER},
|
||||||
|
scene_detail = #{record.sceneDetail,jdbcType=VARCHAR}
|
||||||
<if test="_parameter != null">
|
<if test="_parameter != null">
|
||||||
<include refid="Update_By_Example_Where_Clause" />
|
<include refid="Update_By_Example_Where_Clause" />
|
||||||
</if>
|
</if>
|
||||||
@ -235,6 +240,9 @@
|
|||||||
<if test="score != null">
|
<if test="score != null">
|
||||||
score = #{score,jdbcType=INTEGER},
|
score = #{score,jdbcType=INTEGER},
|
||||||
</if>
|
</if>
|
||||||
|
<if test="sceneDetail != null">
|
||||||
|
scene_detail = #{sceneDetail,jdbcType=VARCHAR},
|
||||||
|
</if>
|
||||||
</set>
|
</set>
|
||||||
where id = #{id,jdbcType=BIGINT}
|
where id = #{id,jdbcType=BIGINT}
|
||||||
</update>
|
</update>
|
||||||
@ -245,7 +253,8 @@
|
|||||||
subType = #{subtype,jdbcType=INTEGER},
|
subType = #{subtype,jdbcType=INTEGER},
|
||||||
tags = #{tags,jdbcType=VARCHAR},
|
tags = #{tags,jdbcType=VARCHAR},
|
||||||
amount = #{amount,jdbcType=INTEGER},
|
amount = #{amount,jdbcType=INTEGER},
|
||||||
score = #{score,jdbcType=INTEGER}
|
score = #{score,jdbcType=INTEGER},
|
||||||
|
scene_detail = #{sceneDetail,jdbcType=VARCHAR}
|
||||||
where id = #{id,jdbcType=BIGINT}
|
where id = #{id,jdbcType=BIGINT}
|
||||||
</update>
|
</update>
|
||||||
</mapper>
|
</mapper>
|
@ -11,6 +11,7 @@
|
|||||||
<result column="question_id" jdbcType="BIGINT" property="questionId" />
|
<result column="question_id" jdbcType="BIGINT" property="questionId" />
|
||||||
<result column="state" jdbcType="INTEGER" property="state" />
|
<result column="state" jdbcType="INTEGER" property="state" />
|
||||||
<result column="tmp_answer" jdbcType="VARCHAR" property="tmpAnswer" />
|
<result column="tmp_answer" jdbcType="VARCHAR" property="tmpAnswer" />
|
||||||
|
<result column="scene_cosplay_id" jdbcType="VARCHAR" property="sceneCosplayId" />
|
||||||
</resultMap>
|
</resultMap>
|
||||||
<sql id="Example_Where_Clause">
|
<sql id="Example_Where_Clause">
|
||||||
<where>
|
<where>
|
||||||
@ -71,7 +72,7 @@
|
|||||||
</where>
|
</where>
|
||||||
</sql>
|
</sql>
|
||||||
<sql id="Base_Column_List">
|
<sql id="Base_Column_List">
|
||||||
id, pu_id, rule_id, org_id, `type`, sub_type, question_id, `state`, tmp_answer
|
id, pu_id, rule_id, org_id, `type`, sub_type, question_id, `state`, tmp_answer, scene_cosplay_id
|
||||||
</sql>
|
</sql>
|
||||||
<select id="selectByExample" parameterType="club.joylink.rtss.entity.paper.PaperUserQuestionExample" resultMap="BaseResultMap">
|
<select id="selectByExample" parameterType="club.joylink.rtss.entity.paper.PaperUserQuestionExample" resultMap="BaseResultMap">
|
||||||
select
|
select
|
||||||
@ -114,10 +115,12 @@
|
|||||||
<insert id="insert" keyColumn="id" keyProperty="id" parameterType="club.joylink.rtss.entity.paper.PaperUserQuestion" useGeneratedKeys="true">
|
<insert id="insert" keyColumn="id" keyProperty="id" parameterType="club.joylink.rtss.entity.paper.PaperUserQuestion" useGeneratedKeys="true">
|
||||||
insert into rts_paper_user_question (pu_id, rule_id, org_id,
|
insert into rts_paper_user_question (pu_id, rule_id, org_id,
|
||||||
`type`, sub_type, question_id,
|
`type`, sub_type, question_id,
|
||||||
`state`, tmp_answer)
|
`state`, tmp_answer, scene_cosplay_id
|
||||||
|
)
|
||||||
values (#{puId,jdbcType=BIGINT}, #{ruleId,jdbcType=BIGINT}, #{orgId,jdbcType=BIGINT},
|
values (#{puId,jdbcType=BIGINT}, #{ruleId,jdbcType=BIGINT}, #{orgId,jdbcType=BIGINT},
|
||||||
#{type,jdbcType=INTEGER}, #{subType,jdbcType=INTEGER}, #{questionId,jdbcType=BIGINT},
|
#{type,jdbcType=INTEGER}, #{subType,jdbcType=INTEGER}, #{questionId,jdbcType=BIGINT},
|
||||||
#{state,jdbcType=INTEGER}, #{tmpAnswer,jdbcType=VARCHAR})
|
#{state,jdbcType=INTEGER}, #{tmpAnswer,jdbcType=VARCHAR}, #{sceneCosplayId,jdbcType=VARCHAR}
|
||||||
|
)
|
||||||
</insert>
|
</insert>
|
||||||
<insert id="insertSelective" keyColumn="id" keyProperty="id" parameterType="club.joylink.rtss.entity.paper.PaperUserQuestion" useGeneratedKeys="true">
|
<insert id="insertSelective" keyColumn="id" keyProperty="id" parameterType="club.joylink.rtss.entity.paper.PaperUserQuestion" useGeneratedKeys="true">
|
||||||
insert into rts_paper_user_question
|
insert into rts_paper_user_question
|
||||||
@ -146,6 +149,9 @@
|
|||||||
<if test="tmpAnswer != null">
|
<if test="tmpAnswer != null">
|
||||||
tmp_answer,
|
tmp_answer,
|
||||||
</if>
|
</if>
|
||||||
|
<if test="sceneCosplayId != null">
|
||||||
|
scene_cosplay_id,
|
||||||
|
</if>
|
||||||
</trim>
|
</trim>
|
||||||
<trim prefix="values (" suffix=")" suffixOverrides=",">
|
<trim prefix="values (" suffix=")" suffixOverrides=",">
|
||||||
<if test="puId != null">
|
<if test="puId != null">
|
||||||
@ -172,6 +178,9 @@
|
|||||||
<if test="tmpAnswer != null">
|
<if test="tmpAnswer != null">
|
||||||
#{tmpAnswer,jdbcType=VARCHAR},
|
#{tmpAnswer,jdbcType=VARCHAR},
|
||||||
</if>
|
</if>
|
||||||
|
<if test="sceneCosplayId != null">
|
||||||
|
#{sceneCosplayId,jdbcType=VARCHAR},
|
||||||
|
</if>
|
||||||
</trim>
|
</trim>
|
||||||
</insert>
|
</insert>
|
||||||
<select id="countByExample" parameterType="club.joylink.rtss.entity.paper.PaperUserQuestionExample" resultType="java.lang.Long">
|
<select id="countByExample" parameterType="club.joylink.rtss.entity.paper.PaperUserQuestionExample" resultType="java.lang.Long">
|
||||||
@ -210,6 +219,9 @@
|
|||||||
<if test="record.tmpAnswer != null">
|
<if test="record.tmpAnswer != null">
|
||||||
tmp_answer = #{record.tmpAnswer,jdbcType=VARCHAR},
|
tmp_answer = #{record.tmpAnswer,jdbcType=VARCHAR},
|
||||||
</if>
|
</if>
|
||||||
|
<if test="record.sceneCosplayId != null">
|
||||||
|
scene_cosplay_id = #{record.sceneCosplayId,jdbcType=VARCHAR},
|
||||||
|
</if>
|
||||||
</set>
|
</set>
|
||||||
<if test="_parameter != null">
|
<if test="_parameter != null">
|
||||||
<include refid="Update_By_Example_Where_Clause" />
|
<include refid="Update_By_Example_Where_Clause" />
|
||||||
@ -225,7 +237,8 @@
|
|||||||
sub_type = #{record.subType,jdbcType=INTEGER},
|
sub_type = #{record.subType,jdbcType=INTEGER},
|
||||||
question_id = #{record.questionId,jdbcType=BIGINT},
|
question_id = #{record.questionId,jdbcType=BIGINT},
|
||||||
`state` = #{record.state,jdbcType=INTEGER},
|
`state` = #{record.state,jdbcType=INTEGER},
|
||||||
tmp_answer = #{record.tmpAnswer,jdbcType=VARCHAR}
|
tmp_answer = #{record.tmpAnswer,jdbcType=VARCHAR},
|
||||||
|
scene_cosplay_id = #{record.sceneCosplayId,jdbcType=VARCHAR}
|
||||||
<if test="_parameter != null">
|
<if test="_parameter != null">
|
||||||
<include refid="Update_By_Example_Where_Clause" />
|
<include refid="Update_By_Example_Where_Clause" />
|
||||||
</if>
|
</if>
|
||||||
@ -257,6 +270,9 @@
|
|||||||
<if test="tmpAnswer != null">
|
<if test="tmpAnswer != null">
|
||||||
tmp_answer = #{tmpAnswer,jdbcType=VARCHAR},
|
tmp_answer = #{tmpAnswer,jdbcType=VARCHAR},
|
||||||
</if>
|
</if>
|
||||||
|
<if test="sceneCosplayId != null">
|
||||||
|
scene_cosplay_id = #{sceneCosplayId,jdbcType=VARCHAR},
|
||||||
|
</if>
|
||||||
</set>
|
</set>
|
||||||
where id = #{id,jdbcType=BIGINT}
|
where id = #{id,jdbcType=BIGINT}
|
||||||
</update>
|
</update>
|
||||||
@ -269,7 +285,8 @@
|
|||||||
sub_type = #{subType,jdbcType=INTEGER},
|
sub_type = #{subType,jdbcType=INTEGER},
|
||||||
question_id = #{questionId,jdbcType=BIGINT},
|
question_id = #{questionId,jdbcType=BIGINT},
|
||||||
`state` = #{state,jdbcType=INTEGER},
|
`state` = #{state,jdbcType=INTEGER},
|
||||||
tmp_answer = #{tmpAnswer,jdbcType=VARCHAR}
|
tmp_answer = #{tmpAnswer,jdbcType=VARCHAR},
|
||||||
|
scene_cosplay_id = #{sceneCosplayId,jdbcType=VARCHAR}
|
||||||
where id = #{id,jdbcType=BIGINT}
|
where id = #{id,jdbcType=BIGINT}
|
||||||
</update>
|
</update>
|
||||||
</mapper>
|
</mapper>
|
||||||
|
Loading…
Reference in New Issue
Block a user