Toggle navigation
Toggle navigation
此项目
正在载入...
Sign in
李勇
/
McuClient
转到一个项目
Toggle navigation
项目
群组
代码片段
帮助
Toggle navigation pinning
Project
Activity
Repository
Pipelines
Graphs
Issues
0
Merge Requests
0
Wiki
Network
Create a new issue
Builds
Commits
Authored by
李勇
8 years ago
Browse Files
Options
Browse Files
Download
Email Patches
Plain Diff
Commit
c9ba9cf81dc32923b88c6bb0f04632b694415028
c9ba9cf8
1 parent
fdc5383c
新增答题卡接口和答题卡模块
隐藏空白字符变更
内嵌
并排对比
正在显示
7 个修改的文件
包含
502 行增加
和
20 行删除
dist/McuClient.js
src/EngineEntrance.js
src/MessageTypes.js
src/Sass.js
src/apes/ApeConsts.js
src/apes/QuestionApe.js
src/pdus/pro.js
dist/McuClient.js
查看文件 @
c9ba9cf
此 diff 太大无法显示。
src/EngineEntrance.js
查看文件 @
c9ba9cf
...
...
@@ -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
);
}
}
...
...
src/MessageTypes.js
查看文件 @
c9ba9cf
...
...
@@ -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';
...
...
src/Sass.js
查看文件 @
c9ba9cf
...
...
@@ -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
);
...
...
src/apes/ApeConsts.js
查看文件 @
c9ba9cf
...
...
@@ -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"
;
...
...
src/apes/QuestionApe.js
0 → 100644
查看文件 @
c9ba9cf
// //////////////////////////////////////////////////////////////////////////////
//答题卡模块
// //////////////////////////////////////////////////////////////////////////////
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
;
...
...
src/pdus/pro.js
查看文件 @
c9ba9cf
...
...
@@ -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
`
;
...
...
请
注册
或
登录
后发表评论