webOs-backend/util/dataHandler.js
2023-02-23 13:50:16 +08:00

260 lines
16 KiB
JavaScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/* 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