260 lines
16 KiB
JavaScript
260 lines
16 KiB
JavaScript
/* eslint-disable no-undef */
|
||
const mysqlService =require('../Service/MysqlService')
|
||
|
||
class DataHandler {
|
||
//map用来绑定sceneid和blockid
|
||
static map=new Map()
|
||
//主逻辑
|
||
static Scenedata(data){
|
||
for (const scene in data){
|
||
//找出位于头部的blockJSON数据存入parent,每个JSON数据代表scratch中一个场景
|
||
const parent=[]
|
||
const sceneJSON=data[scene]
|
||
for (const blockId in sceneJSON){
|
||
if (sceneJSON[blockId].topLevel){
|
||
parent.push(sceneJSON[blockId])
|
||
}
|
||
}
|
||
//遍历parent,判断头部block下一个条件积木类型
|
||
parent.forEach(function (item){
|
||
let sceneName, dev_operationId
|
||
const judge_blockId=item.next
|
||
const judge_opcode=sceneJSON[judge_blockId].opcode
|
||
const condition_blockId=sceneJSON[judge_blockId].inputs.CONDITION[1]
|
||
const condition_opcode=sceneJSON[condition_blockId].opcode
|
||
//如果为if型条件,只需往scene表中插入一个场景;否则为if-else型条件,需要往表中插入两个场景,第二个插入的场景触发条件与第一个相反
|
||
if (judge_opcode == "control_if"){
|
||
sceneName=item.inputs.NAME[1][1]
|
||
DataHandler.map.set(judge_blockId,++scene_id)
|
||
DataHandler.fillSceneAndTriggerForm(judge_blockId,sceneName,condition_opcode,condition_blockId,sceneJSON)
|
||
dev_operationId=sceneJSON[judge_blockId].inputs.SUBSTACK[1]
|
||
DataHandler.findNextOperationBlock(judge_blockId,dev_operationId,sceneJSON)
|
||
}else {
|
||
DataHandler.map.set(judge_blockId,++scene_id)
|
||
DataHandler.map.set(judge_blockId+'1',++scene_id)
|
||
|
||
sceneName=item.inputs.NAME[1][1]
|
||
DataHandler.fillSceneAndTriggerForm(judge_blockId,sceneName,condition_opcode,condition_blockId,sceneJSON)
|
||
dev_operationId=sceneJSON[judge_blockId].inputs.SUBSTACK[1]
|
||
DataHandler.findNextOperationBlock(judge_blockId,dev_operationId,sceneJSON)
|
||
|
||
const elseSceneName='else_'+item.inputs.NAME[1][1]
|
||
DataHandler.fillSceneAndTriggerForm_else(judge_blockId+'1',elseSceneName,condition_opcode,condition_blockId,sceneJSON)
|
||
const dev_operationId_else=sceneJSON[judge_blockId].inputs.SUBSTACK2[1]
|
||
DataHandler.findNextOperationBlock(judge_blockId+'1',dev_operationId_else,sceneJSON)
|
||
}
|
||
})
|
||
}
|
||
console.log("data",parent)
|
||
}
|
||
//递归寻找是否有下一个执行功能积木,每找到一个就插入operation表
|
||
static findNextOperationBlock(judge_blockId,blockId,sceneJson){
|
||
// const blockId=blockId
|
||
// const sceneJson=sceneJson
|
||
// const judge_blockId=judge_blockId
|
||
if (sceneJson[blockId].next != null){
|
||
const dev_operationJson=sceneJson[blockId]
|
||
const dev_operationOpcode = dev_operationJson.opcode.split('_')
|
||
const dev_productDevId=dev_operationOpcode[dev_operationOpcode.length-3]
|
||
const dev_operationDevId=dev_operationOpcode[dev_operationOpcode.length-2]
|
||
const dev_operationFuncId=dev_operationOpcode[dev_operationOpcode.length-1]
|
||
const dev_operationFuncMenuId=dev_operationJson.inputs.BTN[1]
|
||
const dev_operationFunFields=sceneJson[dev_operationFuncMenuId].fields
|
||
let dev_operationFuncValue
|
||
for (let key in dev_operationFunFields){
|
||
dev_operationFuncValue=dev_operationFunFields[key][0]
|
||
}
|
||
mysqlService.insertIntoSceneOperation(DataHandler.map.get(judge_blockId),dev_operationDevId,dev_operationFuncId,dev_operationFuncValue,dev_productDevId)
|
||
DataHandler.findNextOperationBlock(judge_blockId,sceneJson[blockId].next,sceneJson)
|
||
}else {
|
||
const dev_operationJson=sceneJson[blockId]
|
||
const dev_operationOpcode=dev_operationJson.opcode.split('_')
|
||
const dev_productDevId=dev_operationOpcode[dev_operationOpcode.length-3]
|
||
const dev_operationDevId=dev_operationOpcode[dev_operationOpcode.length-2]
|
||
const dev_operationFuncId=dev_operationOpcode[dev_operationOpcode.length-1]
|
||
const dev_operationFuncMenuId=dev_operationJson.inputs.BTN[1]
|
||
const dev_operationFunFields=sceneJson[dev_operationFuncMenuId].fields
|
||
let dev_operationFuncValue
|
||
for (const key in dev_operationFunFields){
|
||
dev_operationFuncValue=dev_operationFunFields[key][0]
|
||
}
|
||
mysqlService.insertIntoSceneOperation(DataHandler.map.get(judge_blockId),dev_operationDevId,dev_operationFuncId,dev_operationFuncValue,dev_productDevId)
|
||
}
|
||
}
|
||
//递归寻找条件判断积木中的条件积木,如果类型为’与‘或者‘或’就继续寻找里面的条件直到条件类型为=、<、>并插入trigger表
|
||
static findNextConditionBlock(judge_blockId,blockId,sceneJson){
|
||
const conditionBlockOpcode=sceneJson[blockId].opcode
|
||
let nextLiftBlockId,nextRightBlockId,TriggerFormData,Value
|
||
switch (conditionBlockOpcode) {
|
||
case 'operator_and':
|
||
nextLiftBlockId=sceneJson[blockId].inputs.OPERAND1[1]
|
||
DataHandler.findNextConditionBlock(judge_blockId,nextLiftBlockId,sceneJson)
|
||
nextRightBlockId=sceneJson[blockId].inputs.OPERAND2[1]
|
||
DataHandler.findNextConditionBlock(judge_blockId,nextRightBlockId,sceneJson)
|
||
break;
|
||
case 'operator_or':
|
||
nextLiftBlockId=sceneJson[blockId].inputs.OPERAND1[1]
|
||
DataHandler.findNextConditionBlock(judge_blockId,nextLiftBlockId,sceneJson)
|
||
nextRightBlockId=sceneJson[blockId].inputs.OPERAND2[1]
|
||
DataHandler.findNextConditionBlock(judge_blockId,nextRightBlockId,sceneJson)
|
||
break;
|
||
case 'operator_equals':
|
||
TriggerFormData=DataHandler.getTriggerFormData(blockId,sceneJson)
|
||
if (TriggerFormData[2] == "开"){
|
||
Value=1
|
||
}else if (TriggerFormData[2] == "关"){
|
||
Value=0
|
||
}else {
|
||
Value=TriggerFormData[2]
|
||
}
|
||
mysqlService.insertIntoSceneTrigger(DataHandler.map.get(judge_blockId),TriggerFormData[0],TriggerFormData[1],Value,0,TriggerFormData[3])
|
||
break;
|
||
case 'operator_gt':
|
||
TriggerFormData=DataHandler.getTriggerFormData(blockId,sceneJson)
|
||
mysqlService.insertIntoSceneTrigger(DataHandler.map.get(judge_blockId),TriggerFormData[0],TriggerFormData[1],TriggerFormData[2],2,TriggerFormData[3])
|
||
break;
|
||
case 'operator_lt':
|
||
TriggerFormData=DataHandler.getTriggerFormData(blockId,sceneJson)
|
||
mysqlService.insertIntoSceneTrigger(DataHandler.map.get(judge_blockId),TriggerFormData[0],TriggerFormData[1],TriggerFormData[2],1,TriggerFormData[3])
|
||
break;
|
||
}
|
||
}
|
||
//用于if-else判断积木中的else条件情况,具体逻辑与findNextConditionBlock一样,只是在最后插入trigger表时一些数据需要取反
|
||
static findNextConditionBlock_else(judge_blockId,blockId,sceneJson){
|
||
const conditionBlockOpcode=sceneJson[blockId].opcode
|
||
let nextLiftBlockId,nextRightBlockId,TriggerFormData,Value
|
||
switch (conditionBlockOpcode) {
|
||
case 'operator_and':
|
||
nextLiftBlockId=sceneJson[blockId].inputs.OPERAND1[1]
|
||
DataHandler.findNextConditionBlock_else(judge_blockId,nextLiftBlockId,sceneJson)
|
||
nextRightBlockId=sceneJson[blockId].inputs.OPERAND2[1]
|
||
DataHandler.findNextConditionBlock_else(judge_blockId,nextRightBlockId,sceneJson)
|
||
break;
|
||
case 'operator_or':
|
||
nextLiftBlockId=sceneJson[blockId].inputs.OPERAND1[1]
|
||
DataHandler.findNextConditionBlock_else(judge_blockId,nextLiftBlockId,sceneJson)
|
||
nextRightBlockId=sceneJson[blockId].inputs.OPERAND2[1]
|
||
DataHandler.findNextConditionBlock_else(judge_blockId,nextRightBlockId,sceneJson)
|
||
break;
|
||
case 'operator_equals':
|
||
TriggerFormData=DataHandler.getTriggerFormData(blockId,sceneJson)
|
||
if (TriggerFormData[2] == "开"){
|
||
Value=0
|
||
mysqlService.insertIntoSceneTrigger(DataHandler.map.get(judge_blockId),TriggerFormData[0],TriggerFormData[1],Value,0,TriggerFormData[3])
|
||
}else if (TriggerFormData[2] == "关"){
|
||
Value=1
|
||
mysqlService.insertIntoSceneTrigger(DataHandler.map.get(judge_blockId),TriggerFormData[0],TriggerFormData[1],Value,0,TriggerFormData[3])
|
||
}else {
|
||
Value=TriggerFormData[2]
|
||
mysqlService.insertIntoSceneTrigger(DataHandler.map.get(judge_blockId),TriggerFormData[0],TriggerFormData[1],Value,1,TriggerFormData[3])
|
||
mysqlService.insertIntoSceneTrigger(DataHandler.map.get(judge_blockId),TriggerFormData[0],TriggerFormData[1],Value,2,TriggerFormData[3])
|
||
}
|
||
break;
|
||
case 'operator_gt':
|
||
TriggerFormData=DataHandler.getTriggerFormData(blockId,sceneJson)
|
||
mysqlService.insertIntoSceneTrigger(DataHandler.map.get(judge_blockId),TriggerFormData[0],TriggerFormData[1],TriggerFormData[2],1,TriggerFormData[3])
|
||
break;
|
||
case 'operator_lt':
|
||
TriggerFormData=DataHandler.getTriggerFormData(blockId,sceneJson)
|
||
mysqlService.insertIntoSceneTrigger(DataHandler.map.get(judge_blockId),TriggerFormData[0],TriggerFormData[1],TriggerFormData[2],2,TriggerFormData[3])
|
||
break;
|
||
}
|
||
}
|
||
//判断条件积木的类型并往scene表插入数据,如果条件积木类型为’与‘或者‘或’就调用findNextConditionBlock直到类型为=、<、>,否则直接往trigger表插入数据
|
||
static fillSceneAndTriggerForm(judge_blockId,sceneName,condition_opcode,condition_blockId,sceneJSON){
|
||
switch (condition_opcode) {
|
||
case "operator_and":
|
||
mysqlService.insertIntoScene(DataHandler.map.get(judge_blockId),sceneName,1)
|
||
DataHandler.findNextConditionBlock(judge_blockId,condition_blockId,sceneJSON)
|
||
break;
|
||
case "operator_or":
|
||
mysqlService.insertIntoScene(DataHandler.map.get(judge_blockId),sceneName,0)
|
||
DataHandler.findNextConditionBlock(judge_blockId,condition_blockId,sceneJSON)
|
||
break;
|
||
default:
|
||
if (condition_opcode=="operator_equals"){
|
||
mysqlService.insertIntoScene(DataHandler.map.get(judge_blockId),sceneName,0)
|
||
const TriggerFormData=DataHandler.getTriggerFormData(condition_blockId,sceneJSON)
|
||
let Value
|
||
if (TriggerFormData[2] == "开"){
|
||
Value=1
|
||
}else if (TriggerFormData[2] == "关"){
|
||
Value=0
|
||
}else {
|
||
Value=TriggerFormData[2]
|
||
}
|
||
mysqlService.insertIntoSceneTrigger(DataHandler.map.get(judge_blockId),TriggerFormData[0],TriggerFormData[1],Value,0,TriggerFormData[3])
|
||
}else if (condition_opcode=="operator_gt"){
|
||
mysqlService.insertIntoScene(DataHandler.map.get(judge_blockId),sceneName,0)
|
||
const TriggerFormData=DataHandler.getTriggerFormData(condition_blockId,sceneJSON)
|
||
mysqlService.insertIntoSceneTrigger(DataHandler.map.get(judge_blockId),TriggerFormData[0],TriggerFormData[1],TriggerFormData[2],2,TriggerFormData[3])
|
||
}else {
|
||
mysqlService.insertIntoScene(DataHandler.map.get(judge_blockId),sceneName,0)
|
||
const TriggerFormData=DataHandler.getTriggerFormData(condition_blockId,sceneJSON)
|
||
mysqlService.insertIntoSceneTrigger(DataHandler.map.get(judge_blockId),TriggerFormData[0],TriggerFormData[1],TriggerFormData[2],1,TriggerFormData[3])
|
||
}
|
||
break;
|
||
}
|
||
|
||
}
|
||
//用于if-else判断积木中的else条件情况,具体逻辑与fillSceneAndTriggerForm一样,只是在向scene和trigger表中插入数据时一些数据需要取反
|
||
static fillSceneAndTriggerForm_else(judge_blockId,sceneName,condition_opcode,condition_blockId,sceneJSON){
|
||
switch (condition_opcode) {
|
||
case "operator_and":
|
||
mysqlService.insertIntoScene(DataHandler.map.get(judge_blockId),sceneName,0)
|
||
DataHandler.findNextConditionBlock_else(judge_blockId,condition_blockId,sceneJSON)
|
||
break;
|
||
case "operator_or":
|
||
mysqlService.insertIntoScene(DataHandler.map.get(judge_blockId),sceneName,1)
|
||
DataHandler.findNextConditionBlock_else(judge_blockId,condition_blockId,sceneJSON)
|
||
break;
|
||
default:
|
||
if (condition_opcode=="operator_equals"){
|
||
mysqlService.insertIntoScene(DataHandler.map.get(judge_blockId),sceneName,0)
|
||
const TriggerFormData=DataHandler.getTriggerFormData(condition_blockId,sceneJSON)
|
||
let Value
|
||
if (TriggerFormData[2] == "开"){
|
||
Value=0
|
||
mysqlService.insertIntoSceneTrigger(DataHandler.map.get(judge_blockId),TriggerFormData[0],TriggerFormData[1],Value,0,TriggerFormData[3])
|
||
}else if (TriggerFormData[2] == "关"){
|
||
Value=1
|
||
mysqlService.insertIntoSceneTrigger(DataHandler.map.get(judge_blockId),TriggerFormData[0],TriggerFormData[1],Value,0,TriggerFormData[3])
|
||
}else {
|
||
Value=TriggerFormData[2]
|
||
mysqlService.insertIntoSceneTrigger(DataHandler.map.get(judge_blockId),TriggerFormData[0],TriggerFormData[1],Value,1,TriggerFormData[3])
|
||
mysqlService.insertIntoSceneTrigger(DataHandler.map.get(judge_blockId),TriggerFormData[0],TriggerFormData[1],Value,2,TriggerFormData[3])
|
||
}
|
||
}else if (condition_opcode=="operator_gt"){
|
||
mysqlService.insertIntoScene(DataHandler.map.get(judge_blockId),sceneName,0)
|
||
const TriggerFormData=DataHandler.getTriggerFormData(condition_blockId,sceneJSON)
|
||
mysqlService.insertIntoSceneTrigger(DataHandler.map.get(judge_blockId),TriggerFormData[0],TriggerFormData[1],TriggerFormData[2],1,TriggerFormData[3])
|
||
}else {
|
||
mysqlService.insertIntoScene(DataHandler.map.get(judge_blockId),sceneName,0)
|
||
const TriggerFormData=DataHandler.getTriggerFormData(condition_blockId,sceneJSON)
|
||
mysqlService.insertIntoSceneTrigger(DataHandler.map.get(judge_blockId),TriggerFormData[0],TriggerFormData[1],TriggerFormData[2],2,TriggerFormData[3])
|
||
}
|
||
break;
|
||
}
|
||
|
||
}
|
||
//获取插入trigger表的数据
|
||
static getTriggerFormData(condition_blockId,sceneJSON){
|
||
const dev_blockId=sceneJSON[condition_blockId].inputs.OPERAND1[1]
|
||
const dev_blockOpcode=sceneJSON[dev_blockId].opcode.split('_')
|
||
const dev_productId=dev_blockOpcode[dev_blockOpcode.length-3]
|
||
const dev_Id=dev_blockOpcode[dev_blockOpcode.length-2]
|
||
const dev_FuncId=dev_blockOpcode[dev_blockOpcode.length-1]
|
||
const dev_FuncValue=sceneJSON[condition_blockId].inputs.OPERAND2[1][1]
|
||
const TriggerFormData=[]
|
||
TriggerFormData.push(dev_Id)
|
||
TriggerFormData.push(dev_FuncId)
|
||
TriggerFormData.push(dev_FuncValue)
|
||
TriggerFormData.push(dev_productId)
|
||
return TriggerFormData
|
||
}
|
||
}
|
||
|
||
module.exports =DataHandler
|
||
|
||
|