增加文件
This commit is contained in:
parent
5a4f6f5999
commit
3cffd163ad
44
src/scripts/plugin/CommandHandler.js
Normal file
44
src/scripts/plugin/CommandHandler.js
Normal file
@ -0,0 +1,44 @@
|
|||||||
|
import { sendCommand } from '@/api/jmap/training';
|
||||||
|
import router from '@/router';
|
||||||
|
|
||||||
|
class CommandHandle {
|
||||||
|
constructor() {
|
||||||
|
this.data = [];
|
||||||
|
this.instructionMap = {};
|
||||||
|
}
|
||||||
|
|
||||||
|
getInstruction(type) {
|
||||||
|
return this.instructionMap[type] || {};
|
||||||
|
}
|
||||||
|
|
||||||
|
getCommand(operates) {
|
||||||
|
const operate = operates[operates.length - 1];
|
||||||
|
const instruction = this.getInstruction(operate.type);
|
||||||
|
if (operate && operate.send && instruction) {
|
||||||
|
return {
|
||||||
|
type: instruction.type,
|
||||||
|
params: operates
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
execute(command) {
|
||||||
|
return new Promise((resolve, reject) => {
|
||||||
|
const group = router.currentRoute.query.group;
|
||||||
|
if (command) {
|
||||||
|
sendCommand(group, command).then((response) => {
|
||||||
|
resolve(response);
|
||||||
|
}).catch(error => {
|
||||||
|
reject(error);
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
reject();
|
||||||
|
}
|
||||||
|
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export default new CommandHandle();
|
203
src/scripts/plugin/OperateHandler.js
Normal file
203
src/scripts/plugin/OperateHandler.js
Normal file
@ -0,0 +1,203 @@
|
|||||||
|
import store from '@/store';
|
||||||
|
import router from '@/router';
|
||||||
|
import OperateConverter from '@/scripts/plugin/OperateConvert2Command';
|
||||||
|
import CommandHandler from './CommandHandler.js';
|
||||||
|
import { TrainingMode } from '@/scripts/ConstDic';
|
||||||
|
import { getConverter } from '@/scripts/plugin/Converter/manager';
|
||||||
|
import { sendTrainingNextStep } from '@/api/jmap/training';
|
||||||
|
import { Message } from 'element-ui';
|
||||||
|
import { OperationEvent } from '@/scripts/ConstDic';
|
||||||
|
import LangStorage from '@/utils/lang';
|
||||||
|
|
||||||
|
const isNewCmd = true;
|
||||||
|
class OperateHandler {
|
||||||
|
constructor() {
|
||||||
|
this.operates = []; // 操作数据
|
||||||
|
this.command = {}; // 命令对象
|
||||||
|
}
|
||||||
|
|
||||||
|
/** 操作组 */
|
||||||
|
backStep(num) {
|
||||||
|
this.operates = this.operates.slice(0, num);
|
||||||
|
}
|
||||||
|
|
||||||
|
/** 清空操作组 */
|
||||||
|
cleanOperates() {
|
||||||
|
this.operates.splice(0, this.operates.length);
|
||||||
|
}
|
||||||
|
|
||||||
|
/** 判断操作步骤是否正确 */
|
||||||
|
judge (operate) {
|
||||||
|
const steps = this.getSteps();
|
||||||
|
const order = this.getOrder();
|
||||||
|
|
||||||
|
let valid = false;
|
||||||
|
if (order < steps.length) {
|
||||||
|
const standard = steps[order];
|
||||||
|
if (operate && standard && operate.code == standard.code && operate.type == standard.type &&
|
||||||
|
operate.operation == standard.operation &&
|
||||||
|
operate.val == standard.val) {
|
||||||
|
valid = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return valid;
|
||||||
|
}
|
||||||
|
|
||||||
|
getCommand(operate) {
|
||||||
|
let command = null;
|
||||||
|
if (operate.send) {
|
||||||
|
command = CommandHandler.getCommand(this.operates);
|
||||||
|
if (command && command.error) {
|
||||||
|
this.operates.pop();
|
||||||
|
store.dispatch('training/setTempStep', null);
|
||||||
|
command = null;
|
||||||
|
} else if (command && command.over) {
|
||||||
|
OperateHandler.cleanOperates();
|
||||||
|
store.dispatch('menuOperation/setButtonOperation', null);
|
||||||
|
}
|
||||||
|
|
||||||
|
this.command = command;
|
||||||
|
} else {
|
||||||
|
if (operate.operation === OperationEvent.Command.cancel.menu.operation || operate.over) {
|
||||||
|
OperateHandler.cleanOperates();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return command;
|
||||||
|
}
|
||||||
|
|
||||||
|
commandConvert(operate) {
|
||||||
|
const converter = getConverter(this.operates);
|
||||||
|
if (converter && converter.preHandle instanceof Function) {
|
||||||
|
Object.assign(operate, converter.preHandle(this.operates) || {});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/** 步骤前处理*/
|
||||||
|
preProcessor(operate) {
|
||||||
|
// 按钮操作之后,第二步错误操作菜单的情况,需要直接返回
|
||||||
|
if ((this.operates.length && operate.start === true) && (this.operates[0].type === 'mbm')) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 如果是正常的第一步操作,需要清空operates数组
|
||||||
|
if (operate.type === 'mbm' || operate.type === 'bar' || operate.start === true) {
|
||||||
|
this.cleanOperates();
|
||||||
|
}
|
||||||
|
|
||||||
|
// 记录步骤数据
|
||||||
|
this.operates.push(operate);
|
||||||
|
|
||||||
|
// 构造命令
|
||||||
|
if (isNewCmd) {
|
||||||
|
this.command = this.getCommand(operate);
|
||||||
|
} else {
|
||||||
|
this.commandConvert(operate);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/** 步骤后处理*/
|
||||||
|
postProcessor(operate, valid) {
|
||||||
|
const basicInfo = store.getters['training/basicInfo'];
|
||||||
|
if (basicInfo.id && valid) {
|
||||||
|
// 发送记录步骤数据
|
||||||
|
const group = router.currentRoute.query.group;
|
||||||
|
sendTrainingNextStep({ trainingId: basicInfo.id, operate: operate }, group);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!valid) {
|
||||||
|
this.operates.pop();
|
||||||
|
} else {
|
||||||
|
if (operate.cancel === true) {
|
||||||
|
this.cleanOperates();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/** 根据模式验证操作步骤 */
|
||||||
|
validate(operate) {
|
||||||
|
this.preProcessor(operate);
|
||||||
|
|
||||||
|
let valid = true;
|
||||||
|
if (TrainingMode.EDIT === this.getTrainingMode()) {
|
||||||
|
// 编辑制作模式
|
||||||
|
if (this.getOperateBreakStatus()) {
|
||||||
|
valid = false;
|
||||||
|
const tip = LangStorage.getLang() == 'en' ? 'Please enter a hint and click next' : '请输入提示并点击下一步';
|
||||||
|
Message.error(tip);
|
||||||
|
this.operates.pop();
|
||||||
|
return valid;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (this.getTrainingStart()) {
|
||||||
|
store.dispatch('training/setTempStep', operate);
|
||||||
|
}
|
||||||
|
|
||||||
|
} else if (TrainingMode.TEACH === this.getTrainingMode() || TrainingMode.PRACTICE === this.getTrainingMode()) {
|
||||||
|
// 教学模式/练习模式
|
||||||
|
if (this.getTrainingStart()) {
|
||||||
|
valid = this.judge(operate);
|
||||||
|
} else {
|
||||||
|
this.cleanOperates();
|
||||||
|
valid = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
this.postProcessor(operate, valid);
|
||||||
|
|
||||||
|
return valid;
|
||||||
|
}
|
||||||
|
|
||||||
|
handle(operate) {
|
||||||
|
return new Promise((resolve, reject) => {
|
||||||
|
const rtn = { valid: false, response: null };
|
||||||
|
const valid = this.validate(operate);
|
||||||
|
|
||||||
|
rtn.valid = valid;
|
||||||
|
|
||||||
|
if (valid) {
|
||||||
|
if (isNewCmd) {
|
||||||
|
CommandHandler.execute(this.command).then(response => {
|
||||||
|
rtn.response = response;
|
||||||
|
resolve(rtn);
|
||||||
|
}).catch(error => {
|
||||||
|
reject(error);
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
OperateConverter.convertAndSend(operate).then(response => {
|
||||||
|
rtn.response = response;
|
||||||
|
resolve(rtn);
|
||||||
|
}).catch(error => {
|
||||||
|
reject(error);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
} else {
|
||||||
|
resolve(rtn);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
getTrainingMode () {
|
||||||
|
return store.state.training.mode;
|
||||||
|
}
|
||||||
|
|
||||||
|
getSteps() {
|
||||||
|
return store.state.training.steps;
|
||||||
|
}
|
||||||
|
|
||||||
|
getOrder() {
|
||||||
|
return store.state.training.order;
|
||||||
|
}
|
||||||
|
|
||||||
|
getTrainingStart() {
|
||||||
|
return store.state.training.started;
|
||||||
|
}
|
||||||
|
|
||||||
|
getOperateBreakStatus () {
|
||||||
|
return store.state.menuOperation.break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export default new OperateHandler();
|
Loading…
Reference in New Issue
Block a user