李勇

新增答题卡接口和答题卡模块

此 diff 太大无法显示。
... ... @@ -27,11 +27,12 @@ import ArrayBufferUtil from 'libs/ArrayBufferUtil';
import Server from "config/Server";
import MediaModule from 'apes/MediaModule';
import MediaSharedApe from 'apes/MediaSharedApe';
import QuestionApe from 'apes/QuestionApe';
import UTF8 from 'utf-8';
let loger = Loger.getLoger('McuClient');
let _sdkInfo = {"version": "v1.31.3.20170609", "author": "www.3mang.com"};
let _sdkInfo = {"version": "v1.31.11.20170612", "author": "www.3mang.com"};
//APE
let _sass;
... ... @@ -45,6 +46,7 @@ let _doc_ape;
let _whiteboard_ape;
let _recordPlayback;
let _mediaShareApe;
let _questionApe;
//MCUClient 外部实例化主类
export default class MessageEntrance extends Emiter {
... ... @@ -135,6 +137,8 @@ export default class MessageEntrance extends Emiter {
_doc_ape.on(MessageTypes.DOC_DELETE, this.docDeleteHandler.bind(this));
_doc_ape.on(DocApe.DOC_JOIN_CHANNEL_SUCCESS, this.docJoinChannelSuccess.bind(this));
_questionApe=new QuestionApe();
//公开外部调用的方法
//class
this.init = this._init.bind(this);
... ... @@ -216,6 +220,7 @@ export default class MessageEntrance extends Emiter {
this.getQuestion=this._getQuestion.bind(this);
this.getQuestionResult=this._getQuestionResult.bind(this);
this.sendAnswer=this._sendAnswer.bind(this);
this.stopQuestion=this._stopQuestion.bind(this);
this.setDeviceInfo = this._setDeviceInfo.bind(this);//设置设备信息(麦克风,摄像头等等.....)
this.setMessageDelay = this._setMessageDelay.bind(this);//设置是否延迟消息
... ... @@ -1741,8 +1746,8 @@ export default class MessageEntrance extends Emiter {
loger.warn(GlobalConfig.getCurrentStatus());
return;
}
if (_confer_ape) {
_confer_ape.creatQuestion(_param);
if (_questionApe) {
_questionApe.creatQuestion(_param);
}
}
_getQuestion(_param){
... ... @@ -1750,8 +1755,8 @@ export default class MessageEntrance extends Emiter {
loger.warn(GlobalConfig.getCurrentStatus());
return;
}
if (_confer_ape) {
_confer_ape.getQuestion(_param);
if (_questionApe) {
_questionApe.getQuestion(_param);
}
}
_getQuestionResult(_param){
... ... @@ -1759,17 +1764,17 @@ export default class MessageEntrance extends Emiter {
loger.warn(GlobalConfig.getCurrentStatus());
return;
}
if (_confer_ape) {
_confer_ape.getQuestionResult(_param);
if (_questionApe) {
_questionApe.getQuestionResult(_param);
}
}
_stopQuestion(){
_stopQuestion(_param){
if (!_mcu.connected) {
loger.warn(GlobalConfig.getCurrentStatus());
return;
}
if (_confer_ape) {
_confer_ape.stopQuestion(_param);
if (_questionApe) {
_questionApe.stopQuestion(_param);
}
}
_sendAnswer(_param){
... ... @@ -1777,8 +1782,8 @@ export default class MessageEntrance extends Emiter {
loger.warn(GlobalConfig.getCurrentStatus());
return;
}
if (_confer_ape) {
_confer_ape.sendAnswer(_param);
if (_questionApe) {
_questionApe.sendAnswer(_param);
}
}
... ...
... ... @@ -88,6 +88,16 @@ MessageTypes.DOC_BROADCAST= "doc_broadcast";//
MessageTypes.MEDIA_SHARED_DELETE="media_shared_delete";//删除媒体文件
MessageTypes.MEDIA_SHARED_UPDATE ="media_shared_update";//更新媒体文件(添加、变更)
//答题卡
MessageTypes.START_ANSWER_QUESTION="start_answer_question";//开始答题
MessageTypes.UPDATE_ANSWER_QUESTION="update_answer_question";//更新答题数据
MessageTypes.STOP_ANSWER_QUESTION="stop_answer_question";//停止答题
//点名
MessageTypes.START_CALL_THE_ROLL="start_call_the_roll";//开始点名
MessageTypes.UPDATE_CALL_THE_ROLL="update_call_the_roll";//更新点名数据
MessageTypes.STOP_CALL_THE_ROLL="stop_call_the_roll";//停止点名
//白板笔记事件定义
MessageTypes.WHITEBOARD_ANNOTATION_UPDATE ="whiteboard_annotation_update";// 'whiteboard.annotation.update';
... ...
... ... @@ -532,8 +532,15 @@ class Sass extends Emiter {
if (ret.code== 0) {
//errorCode int 0 正常 1 没有指定的课堂 4 验证信息错误(authId)
// {"code":0,"id":1}
loger.log('创建答题数据->完成');
this._emit(Sass.SASS_CREAT_QUESTION_SUCCESS, ret);
let question={};
question.questionId=ret.id;
question.type=type;
question.content=content;
question.timeLimit=timeLimit;
question.correct=correct;
question.options=options;
loger.log('创建答题数据->完成->',question);
this._emit(Sass.SASS_CREAT_QUESTION_SUCCESS, question);
} else {
loger.warn('创建答题数据->失败.', ret);
this._emit(Sass.SASS_CREAT_QUESTION_FAILED);
... ... @@ -601,8 +608,9 @@ class Sass extends Emiter {
if (ret.code== 0) {
// 0 正常 1 没有指定的课堂 4 验证信息错误(authId) 5 没有指定的题目 6 题目不属于该课堂
//{"code":0}
let question=_param;
loger.log('保存答题数据->完成');
this._emit(Sass.SASS_SEND_ANSWER_SUCCESS, ret);
this._emit(Sass.SASS_SEND_ANSWER_SUCCESS, question);
} else {
loger.warn('保存答题数据->失败.', ret);
this._emit(Sass.SASS_SEND_ANSWER_FAILED);
... ... @@ -651,9 +659,16 @@ class Sass extends Emiter {
.then(ret => {
if (ret.code== 0) {
//0 正常 5 没有指定的题目
//{"timeLimit":0,"content":"test question","id":11,"code":0,"type":3,"options":"["True", "False"]"}
//{"timeLimit":90,"code":0,"options":"[\"A\",\"B\",\"C\"]","id":22,"type":2,"content":"题目"}
loger.log('查询题目数据->完成');
this._emit(Sass.SASS_GET_QUESTION_SUCCESS, ret);
let question={};
question.questionId=ret.id||questionId;
question.type=ret.type;
question.timeLimit=ret.timeLimit;
question.options=ret.options;
question.content=ret.content;
this._emit(Sass.SASS_GET_QUESTION_SUCCESS, question);
} else {
loger.warn('查询题目数据->失败.', ret);
this._emit(Sass.SASS_GET_QUESTION_FAILED);
... ... @@ -709,7 +724,10 @@ class Sass extends Emiter {
{"timeLimit":0,"content":"test question","id":11,"code":0,"type":3,"options":"["True", "False"]"}*/
loger.log('查询答题结果数据->完成');
this._emit(Sass.SASS_GET_QUESTION_RESULT_SUCCESS, ret);
let result=_param||{};
result.questionId=questionId;
result.list=ret.list;
this._emit(Sass.SASS_GET_QUESTION_RESULT_SUCCESS, result);
} else {
loger.warn('查询答题结果数据->失败.', ret);
this._emit(Sass.SASS_GET_QUESTION_RESULT_FAILED);
... ...
... ... @@ -145,7 +145,7 @@ ApeConsts.WHITEBOARD_SESSION_ID = 18;
ApeConsts.MEDIA_SESSION_ID = 19;
ApeConsts.SCREENSHARING_SESSION_ID = 20;
ApeConsts.POLL_SESSION_ID = 21;
ApeConsts.QUESTION_SESSION_ID = 22;
// defs for common channel id
ApeConsts.BROADCAST_CHANNEL_ID = 0;
ApeConsts.CONFERENCE_CHANNEL_ID = ApeConsts.CONFERENCE_SESSION_ID;
... ... @@ -157,6 +157,9 @@ ApeConsts.WHITEBOARD_CHANNEL_ID = ApeConsts.WHITEBOARD_SESSION_ID;
ApeConsts.MEDIA_CHANNEL_ID = ApeConsts.MEDIA_SESSION_ID;
ApeConsts.SCREENSHARING_CHANNEL_ID = ApeConsts.SCREENSHARING_SESSION_ID;
ApeConsts.QUESTION_CHANNEL_ID = ApeConsts.QUESTION_SESSION_ID;
// defs for common session name
ApeConsts.CONFERENCE_SESSION_NAME = "conference app";
ApeConsts.CHAT_SESSION_NAME = "chat app";
... ... @@ -168,6 +171,8 @@ ApeConsts.DOCSHARING_SESSION_NAME = "doc sharing app";
ApeConsts.WHITEBOARD_SESSION_NAME = "whiteboard app";
ApeConsts.MEDIA_SESSION_NAME = "media sharing app";
ApeConsts.SCREENSHARING_SESSION_NAME = "screen sharing app";
ApeConsts.QUESTION_SESSION_NAME = "question app";
// def for common session tag
ApeConsts.CONFERENCE_SESSION_TAG = "con-tag";
... ... @@ -180,6 +185,8 @@ ApeConsts.DOCSHARING_SESSION_TAG = "doc-tag";
ApeConsts.WHITEBOARD_SESSION_TAG = "wbd-tag";
ApeConsts.MEDIA_SESSION_TAG = "med-tag";
ApeConsts.SCREENSHARING_SESSION_TAG = "scr-tag";
ApeConsts.QUESTION_SESSION_TAG = "qst-tag";
ApeConsts.CONFERENCE_OBJ_ROSTER_ID = ((ApeConsts.CONFERENCE_SESSION_ID << 16) + 1);
ApeConsts.CONFERENCE_OBJ_ROSTER_NAME = "node list";
... ... @@ -200,7 +207,7 @@ ApeConsts.CONFERENCE_OBJ_COUNTER_NAME = "id list";
ApeConsts.CONFERENCE_OBJ_COUNTER_TAG = "id list tag";
//答题卡
ApeConsts.CONFERENCE_OBJ_QUESTION_ID = ((ApeConsts.CONFERENCE_SESSION_ID << 16) + 5);
ApeConsts.CONFERENCE_OBJ_QUESTION_ID = ((ApeConsts.QUESTION_SESSION_ID << 16) + 1);
ApeConsts.CONFERENCE_OBJ_QUESTION_NAME = "question list";
ApeConsts.CONFERENCE_OBJ_QUESTION_TAG = "question list tag";
... ...
// //////////////////////////////////////////////////////////////////////////////
//答题卡模块
// //////////////////////////////////////////////////////////////////////////////
import Ape from './Ape';
import ApeConsts from './ApeConsts';
import ThirdMessage from './ThirdMessage';
import MessageTypes from 'MessageTypes';
import pdu from 'pdus';
import UTF8 from 'utf-8';
import Loger from 'Loger';
import GlobalConfig from 'GlobalConfig';
import EngineUtils from 'EngineUtils';
import TimerCounter from "TimerCounter";
import Sass from 'Sass';
let loger = Loger.getLoger('QuestionApe');
class QuestionApe extends Ape {
constructor() {
super(
ApeConsts.QUESTION_SESSION_ID,
ApeConsts.QUESTION_SESSION_NAME,
ApeConsts.QUESTION_SESSION_TAG
);
this.questionList={};//MCU同步的题目数据
this.questionDataList={};//Sass保存的题目内容数据
//监听Sass事件
this._sass=Sass;
//创建答题卡
this._sass.on(Sass.SASS_CREAT_QUESTION_SUCCESS,this._sassCreatQuestionSuccessHandler.bind(this));
this._sass.on(Sass.SASS_CREAT_QUESTION_FAILED,this._sassCreatQuestionFailedHandler.bind(this));
//获取题目数据
this._sass.on(Sass.SASS_GET_QUESTION_SUCCESS,this._sassGetQuestionSuccessHandler.bind(this));
this._sass.on(Sass.SASS_GET_QUESTION_FAILED,this._sassGetQuestionFailedHandler.bind(this));
//获取答题结果
this._sass.on(Sass.SASS_GET_QUESTION_RESULT_SUCCESS,this._sassGetQuestionResultSuccessHandler.bind(this));
this._sass.on(Sass.SASS_GET_QUESTION_RESULT_FAILED,this._sassGetQuestionResultFailedHandler.bind(this));
//保存答题数据
this._sass.on(Sass.SASS_SEND_ANSWER_SUCCESS,this._sassSendAnswerSuccessHandler.bind(this));
this._sass.on(Sass.SASS_SEND_ANSWER_FAILED,this._sassSendAnswerFailedHandler.bind(this));
// Ape Models
this.registerKey(this._session_id, this._session_name, this._session_tag, new ArrayBuffer);
this.registerObj(pdu.RCPDU_REG_REGISTER_TABLE, ApeConsts.CONFERENCE_OBJ_QUESTION_ID,
ApeConsts.CONFERENCE_OBJ_QUESTION_NAME, ApeConsts.CONFERENCE_OBJ_QUESTION_TAG, 0, new ArrayBuffer);
}
//更新信息
sendUpdaterTable(_param) {
loger.log('答题卡->发送更新信息->');
if (_param == null || EngineUtils.isEmptyObject(_param)) {
loger.log('答题卡->发送更新信息->参数错误');
this._emit(MessageTypes.MCU_ERROR, MessageTypes.ERR_APE_INTERFACE_PARAM_WRONG);
return;
}
let itemIdx = ApeConsts.CONFERENCE_OBJ_QUESTION_ID;
let modelPdu = this.packPdu(_param, itemIdx);
if (modelPdu == null) {
loger.log('答题卡->发送更新信息->参数错误');
this._emit(MessageTypes.MCU_ERROR, MessageTypes.ERR_APE_INTERFACE_PARAM_WRONG);
return;
}
console.log("modelPdu",modelPdu);
let tableItemPdu = new pdu['RCRegistryTableItemPdu'];
tableItemPdu.itemIdx = itemIdx;
tableItemPdu.owner = 0;//收到flash的是这个值,不清楚先写固定
tableItemPdu.registerObjId = ApeConsts.CONFERENCE_OBJ_QUESTION_ID;
loger.log('答题卡->发送更新信息->1aaaaaa');
tableItemPdu.itemData = modelPdu.toArrayBuffer();
//updater
let tableUpdateItem = new pdu['RCRegistryTableUpdateItemPdu'];
//optional RCPduType_E type = 1 [default = RCPDU_REG_TABLE_UPDATE_PDU];
//repeated RCRegistryTableItemPdu items = 2;
tableUpdateItem.type = pdu.RCPDU_REG_TABLE_UPDATE_PDU;//
tableUpdateItem.items.push(tableItemPdu);
let updateObjPdu = new pdu['RCRegistryUpdateObjPdu'];
updateObjPdu.objId = ApeConsts.CONFERENCE_OBJ_QUESTION_ID;
updateObjPdu.subType = tableUpdateItem.type;
updateObjPdu.userData = tableUpdateItem.toArrayBuffer();
//同步
let adapterItemPdu = new pdu['RCAdapterItemPdu'];
adapterItemPdu.type = pdu.RCPDU_REG_UPDATE_OBJ;
adapterItemPdu.itemData = updateObjPdu.toArrayBuffer();
let adapterPdu = new pdu['RCAdapterPdu'];
adapterPdu.type = pdu.RCPDU_REG_ADAPTER;
adapterPdu.item.push(adapterItemPdu);
this.sendUniform(adapterPdu, true);
}
//删除
tableDelete(_param) {
let tableDeleteItemPdu = new pdu['RCRegistryTableDeleteItemPdu'];
tableDeleteItemPdu.type = pdu.RCPDU_REG_TABLE_DELETE_PDU;//
tableDeleteItemPdu.itemIdx = parseInt(_param.itemIdx);//这里需要设置要删除的数据的itemIdx,每条数据的这个id都不一样
let updateObjPdu = new pdu['RCRegistryUpdateObjPdu'];
updateObjPdu.objId = ApeConsts.CONFERENCE_OBJ_QUESTION_ID;//
updateObjPdu.subType = tableDeleteItemPdu.type;
updateObjPdu.userData = tableDeleteItemPdu.toArrayBuffer();
//同步
let adapterItemPdu = new pdu['RCAdapterItemPdu'];
adapterItemPdu.type = pdu.RCPDU_REG_UPDATE_OBJ;
adapterItemPdu.itemData = updateObjPdu.toArrayBuffer();
let adapterPdu = new pdu['RCAdapterPdu'];
adapterPdu.type = pdu.RCPDU_REG_ADAPTER;
adapterPdu.item.push(adapterItemPdu);
loger.log("答题卡删除数据->" + tableDeleteItemPdu.itemIdx);
this.sendUniform(adapterPdu, true);
}
/////收到消息处理/////////////////////////////////////////////////////////////////////////////////
//答题卡更新数据
tableUpdateHandler(owner, itemIdx, itemData) {
try {
let model = this.unPackPdu(owner, itemIdx, itemData);
loger.log('答题卡更新数据->',model);
this.questionList[itemIdx]=model;
console.log('this.questionList',this.questionList);
if(model){
switch (model.type){
case 1:
case 2:
case 3:
//停止答题
loger.log("更新答题数据");
if(GlobalConfig.isHost){
//老师,只统计数据,不答题
this.getQuestionResult(model);
}else if(GlobalConfig.isNormal) {
//学生->如果自己已经提交过答案就不需要再显示
if(model.totalUserList.indexOf(GlobalConfig.userId)>=0){
loger.log("已经提交过答案->userId:"+GlobalConfig.userId);
}else {
//显示答题卡数据
this._emit(MessageTypes.START_ANSWER_QUESTION,model);
}
}
break;
case 4:
//停止点名
loger.log("更新点名数据");
this._emit(MessageTypes.UPDATE_CALL_THE_ROLL,model);
break;
default :
break;
}
}
} catch (err) {
loger.warn('答题卡更新数据->解析失败->err', err.message);
}
}
tableDeleteHandler(object_id, tableDeleteData) {
loger.log('答题卡删除数据->', object_id, tableDeleteData);//["tableDeleteHandler",1179649,{"type":231,"itemIdx":[1486301768]}]
if (tableDeleteData && tableDeleteData.itemIdx) {
let len = tableDeleteData.itemIdx.length;
let itemIdxs = tableDeleteData.itemIdx;
for (let i = 0; i < len; i++) {
if (this.questionList[itemIdxs[i]]) {
loger.log("答题卡删除数据:", itemIdxs[i]);
let itemDataInfo = this.questionList[itemIdxs[i]];
if(itemDataInfo){
switch (itemDataInfo.type){
case 1:
case 2:
case 3:
//停止答题
loger.log("停止答题");
this._emit(MessageTypes.STOP_ANSWER_QUESTION,itemDataInfo);
break;
case 4:
//停止点名
loger.log("停止点名");
this._emit(MessageTypes.STOP_CALL_THE_ROLL,itemDataInfo);
break;
default :
break;
}
}
delete this.questionList[itemIdxs[i]];
}
}
}
}
///////数据的封包和解包/////////////////////////////////////////
packPdu(_param, _itemIdx) {
//验证坐标点集合数组是否合法
if (_param == null || _itemIdx == null) {
loger.log("答题卡->packPdu->参数错误",_itemIdx,_param);
this._emit(MessageTypes.MCU_ERROR, MessageTypes.ERR_APE_INTERFACE_PARAM_WRONG);
return null;
}
/*optional uint32 item_idx=1;
optional uint32 from=2;
optional uint32 owner=3;
optional uint32 type=4;//类型
optional uint32 questionId=5;//题目id
optional uint32 timeLimit=6;//有效时间
optional uint32 timestamp=7;//创建的时间
repeated string totalUserList=8;//参与的人员userId列表*/
let modelPdu = new pdu['RCQuestionDataModelPdu'];
modelPdu.itemIdx = _itemIdx;
modelPdu.from = _param.nodeId||GlobalConfig.nodeId;
modelPdu.owner = _param.owner||GlobalConfig.nodeId;
modelPdu.type = parseInt(_param.type)||0;
modelPdu.questionId= parseInt(_param.questionId)||0;
modelPdu.timeLimit= parseInt(_param.timeLimit)||1;//有效时间
modelPdu.timestamp= parseInt(_param.timestamp)||EngineUtils.creatTimestamp();//创建的时间
modelPdu.content= _param.content||"";//题干
modelPdu.options= _param.options||"";//选项列表
modelPdu.answer= _param.answer||"";//用户选择的选项索引
modelPdu.correct= _param.correct||"";//正确答案索引
modelPdu.totalUserList=_param.totalUserList||[];//参加的人员userId列表
loger.log("答题卡->packPdu",modelPdu);
return modelPdu;
}
unPackPdu(owner, itemIdx, itemData) {
loger.log("答题卡->unPackPdu ");
if (owner == null || itemIdx == null || itemData == null) {
this._emit(MessageTypes.MCU_ERROR, MessageTypes.ERR_APE_INTERFACE_PARAM_WRONG);
return null;
}
try {
let modelPdu = pdu['RCQuestionDataModelPdu'].decode(itemData);
return modelPdu;
} catch (err) {
loger.log("答题卡->Pdu解析错误,itemIdx=" + itemIdx + " err:" + err.message);
}
return null;
}
//答题卡接口-------------------------------------------------------------------
creatQuestion(_param){
if(!_param){
loger.warn("创建答题卡->参数错误",_param);
return;
}
loger.log("创建答题卡->",_param);
if(this._sass){
/*{
"type": 1,//1单选,2多选,3判断,4点名
"content": "题目",//没有就传""
"timeLimit": 88,//有效时间(秒)
"correct": "[]",//正确答案,没有就传[]
"options": [],//选项数组,没有就传[]
"answer": []//学生选择的答案,没有就传[]
}*/
let paramObj=_param;
paramObj.classId=GlobalConfig.classId;
this._sass.creatQuestion(paramObj);
}
}
getQuestion(_param){
if(!_param){
loger.warn("获取答题卡数据->参数错误",_param);
return;
}
loger.log("获取答题卡数据->.",_param);
if(this.questionList[_param.itemIdx]){
this._emit(MessageTypes.START_ANSWER_QUESTION,this.questionList[_param.itemIdx]);
}else {
if(this._sass){
this._sass.getQuestion(_param);
}
}
}
getQuestionResult(_param){
if(!_param){
loger.warn("获取答题卡结果->参数错误",_param);
return;
}
loger.log("获取答题卡结果->",_param);
if(this._sass){
this._sass.getQuestionResult(_param);
}
}
sendAnswer(_param){
if(!_param){
loger.warn("保存答题答案->参数错误",_param);
return;
}
if(this._sass){
if(this.questionList[_param.itemIdx]){
loger.log("保存答题答案->",_param);
let paramObj=_param;
paramObj.classId=GlobalConfig.classId;
paramObj.userId = GlobalConfig.userId;
paramObj.userName = GlobalConfig.userName;
this._sass.sendAnswer(paramObj);
}else {
loger.log("保存答题答案->数据不存在",_param);
console.log("questionList",this.questionList);
}
}
}
stopQuestion(_param){
if(!_param){
loger.warn("停止答题->参数错误",_param);
return;
}
loger.log("停止答题->",_param);
this.tableDelete({itemIdx:ApeConsts.CONFERENCE_OBJ_QUESTION_ID})
}
//Sass 事件监听
_sassCreatQuestionSuccessHandler(_data){
loger.log("创建答题卡成功",_data);
if(_data){
//this.questionDataList[_data.questionId]=_data;//保存题目数据
let questionItem=_data;
questionItem.itemIdx=ApeConsts.CONFERENCE_OBJ_QUESTION_ID;
this.sendUpdaterTable(questionItem);
}
}
_sassCreatQuestionFailedHandler(_data){
loger.log("创建答题卡失败",_data);
}
_sassGetQuestionSuccessHandler(_data){
loger.log("获取答题卡数据成功",_data);
}
_sassGetQuestionFailedHandler(_data){
loger.log("获取答题卡数据失败",_data);
}
_sassGetQuestionResultSuccessHandler(_data){
loger.log("获取答题卡结果成功",_data);
//返回值结构
/* {
"questionId": 11,
"list": [
{
"answer": "",
"userName": "visitor_995083397",
"userId": "0"
},
{
"answer": "0",
"userName": "visitor_995083397",
"userId": "0"
}
]
}*/
if(_data){
let resultObj= this.questionList[_data.itemIdx];
/* {
"type": 1,//1 单选、2多选、3判断、4点名
"questionId": 15,
"content": "题目",
"timeLimit": 88,
"totalUser":5,//当前参与的总人数
"correct": "[]",//正确答案
"options": ["A","B","C"],
//各个选项参与人数的百分比和参与人的名字
"answers":[
{"percent":40,"userNames":"张三、asdas"},
{"percent":40,"userNames":"历史、asdas"},
{"percent":20,"userNames":"bdb"},
]
}*/
if(resultObj){
let list=_data.list||[];
let listLen=list.length;
resultObj.totalUser=listLen;
resultObj.answers=[];
//根据选项的个数,把选项分开
let options=JSON.parse(resultObj.options);
for(let i=0;i<options.length;i++){
let optionObj=new Object();
optionObj.percent=0;//百分比 选择的人数和总参与人数的比
optionObj.userNames=[];
resultObj.answers.push(optionObj)
}
//把list选择的答案和人员分配到各个选项数组
for(let k=0;k<listLen;k++){
let listItem=list[k];
if(listItem){
let answerIndex=parseInt(listItem.answer);
let optionObj=resultObj.answers[answerIndex];
if(optionObj){
optionObj.userNames.push(listItem.userName);
optionObj.percent=parseInt(optionObj.userNames.length/listLen*100);
}
}
}
loger.log("获取答题卡结果统计->",resultObj);
this._emit(MessageTypes.UPDATE_ANSWER_QUESTION,resultObj);
}
}
}
_sassGetQuestionResultFailedHandler(_data){
loger.log("获取答题卡结果失败",_data);
}
_sassSendAnswerSuccessHandler(_data){
loger.log("保存答案成功",_data);
let questionItem=this.questionList[_data.itemIdx];
if(questionItem){
if(questionItem.totalUserList.indexOf(GlobalConfig.userId)<0){
questionItem.totalUserList.push(""+GlobalConfig.userId);
}
this.sendUpdaterTable(questionItem);
}
}
_sassSendAnswerFailedHandler(_data){
loger.log("保存答案失败",_data);
}
}
export default QuestionApe;
... ...
... ... @@ -998,6 +998,20 @@ message RCConferenceRecordRequestPdu {
optional string filename = 4; // 录像文件名称,filename中增加目录部分
}
message RCQuestionDataModelPdu {
optional uint32 item_idx=1;
optional uint32 from=2;
optional uint32 owner=3;
optional uint32 type=4;//类型
optional uint32 questionId=5;//题目id
optional uint32 timeLimit=6;//有效时间
optional string content=7;//题干
optional uint32 timestamp=8;//创建的时间
optional string options=9;//选项列表
optional string answer=10;//用户选择的答案选项索引
optional string correct=11;//正确答案索引
repeated string totalUserList=12;//参与的人员userId列表
}
//end
`;
... ...