webio-node/route/api/dio.js

184 lines
6.2 KiB
JavaScript

const express = require('express');
const router = express.Router();
const rt = require('../ResTool');
const config = require('../../config.json');
const fs = require('fs');
const mysql = require('../../libs/mysql_pool');
const tool = require('../../includes/apiTool');
const exec = require('child_process').exec;
const so = require('../../includes/storeObject');
const crypt = require('../../libs/crypto');
router
.get('/', (req, res) => {
res.send({ name: 'WebIO DIO Api' });
})
.post('*', async(req,res,n) => {
try{
res.db = await mysql.getConn();
}catch(e){
console.log(`Get DB Connection ERROR ${e}`);
return n('ERR8100');
}
n();
})
.post('/getio', (req, res, n) => {
if (!config.permission.dio) return n('ERR9000');
res.api_res = {
record: [],
rt: {
di: {},
do: {}
}
};
let pdi = new Promise((resolve, reject) => {
let id = 1;
let dis = {};
! function dichk(i) {
if (i > 8) return resolve({ data: dis, key: 'di' });
dis[i] = 0;
exec(`ditchk ${i}`, (err, sout, serr) => {
if (err) return dichk(++i);
dis[i] = sout.replace(/\n/, '');
dichk(++i);
});
}(id)
});
let pdo = new Promise((resolve, reject) => {
let id = 1;
let dos = {};
! function dochk(i) {
if (i > 8) return resolve({ data: dos, key: 'do' });
dos[i] = 0;
exec(`dotchk ${i}`, (err, sout, serr) => {
if (err) return dochk(++i);
dos[i] = sout.replace(/\n/, '');
dochk(++i);
});
}(id)
});
Promise.all([pdi, pdo])
.then(r => {
for (let i in r) {
if (r[i].key == 'di') {
res.api_res.rt.di = r[i].data;
} else if (r[i].key == 'do') {
res.api_res.rt.do = r[i].data;
}
}
return n();
})
.catch(e => n());
})
.post('/dotrun', (req, res, n) => {
if (!config.permission.dio) return n('ERR9000');
let arr = req.body;
if (!arr.data) return n('ERR0000');
if (!arr.data.pin) return n('ERR0001');
if (!('value' in arr.data)) return n('ERR0002');
exec(`dotrun ${arr.data.pin} ${arr.data.value}`, (err, sout, serr) => {
res.api_res = {
record: []
};
let obj = so.get(req.headers['x-auth-token']);
let u = '';
if (obj != null && 'user' in obj && 'account' in obj.user) u = obj.user.account;
let query = "select * from ??.?? where `douid` = ?";
let param = [config.db.db1, 'dolist', arr.data.pin];
res.db.query(query, param, (err, row) => {
if (err || row.length == 0) return n();
let q = "insert into ??.?? (`eventtag`, `iolabel`, `ioname`, `iosetting1`, `iosetting2`, `iosetting3`, `ioevent`, `ioeventtst`) values ";
let p = [config.db.db2, 'jciocert'];
let doStat = sout.replace(/\n/, '') == 1 ? 1 : 0;
let str = `('WEB', 'DO${row[0].douid}', '${row[0].doname}', '${row[0].dologic}', '${doStat}', '${u}', '${doStat}', unix_timestamp())`;
res.db.query(q + str, p, (err, row) => n());
});
});
})
.post('/getdioinfo', (req, res, n) => {
if (!config.permission.dio) return n('ERR9000');
let q = "select * from ??.??";
let pdi = tool.promiseQuery(res, q, [config.db.db1, 'dilist'], 'di');
let pdo = tool.promiseQuery(res, q, [config.db.db1, 'dolist'], 'do');
res.api_res = {
record:[],
rt: {
di: [],
do: []
}
};
Promise.all([pdi,pdo])
.then(r => {
for(let i in r){
if(r[i].key == 'di') res.api_res.rt.di = r[i].data;
else if(r[i].key == 'do') res.api_res.rt.do = r[i].data;
}
return n();
})
.catch(e => rt.err(res,e, n,'ERR8000'));
})
.post('/setdioinfo', (req,res,n) => {
if(!config.permission.dio) return n('ERR9000');
// if(!tool.checkPermission(req)) return n('ERR9000');
let arr = req.body;
if(!arr.data) return n('ERR0000');
if(!arr.data.di || typeof (arr.data.di) != 'object' || Object.keys(arr.data.di).length == 0) return n('ERR0005');
if(!arr.data.do || typeof (arr.data.do) != 'object' || Object.keys(arr.data.do).length == 0) return n('ERR0006');
res.api_res = {
record: []
}
let query = "update ??.?? set ?? = unix_timestamp() , ";
let sub = " ?? = case ?? ";
let dos = [];
let dis = [];
let di_logic = "";
let di_name = "";
let do_logic = "";
let do_name = "";
let where = " where ?? in (?)";
for(let i=1; i<=8; i++){
dos.push(`do${i}`);
dis.push(`di${i}`);
if(arr.data.do[`do${i}`] && 'logic' in arr.data.do[`do${i}`]){
do_logic += ` when 'do${i}' then ${arr.data.do[`do${i}`].logic == 1 ? 1 : 0} `;
}
if(arr.data.do[`do${i}`] && 'name' in arr.data.do[`do${i}`]){
do_name += ` when 'do${i}' then ${res.db.escape(arr.data.do[`do${i}`].name)} `;
}
if(arr.data.di[`di${i}`] && 'logic' in arr.data.di[`di${i}`]){
di_logic += ` when 'di${i}' then ${arr.data.di[`di${i}`].logic == 1 ? 1 : 0} `;
}
if(arr.data.di[`di${i}`] && 'name' in arr.data.di[`di${i}`]){
di_name += ` when 'di${i}' then ${res.db.escape(arr.data.di[`di${i}`].name)} `;
}
}
do_logic += " end ";
do_name += " end ";
di_logic += " end ";
di_name += " end ";
let diq = `${query} ${sub} ${di_logic} , ${sub} ${di_name} ${where}`;
let doq = `${query} ${sub} ${do_logic} , ${sub} ${do_name} ${where}`;
let pdi = tool.promiseQuery(res, diq, [config.db.db1, 'dilist', 'di_modify_date', 'dilogic', 'diid', 'diname', 'diid', 'diid', dis]);
let pdo = tool.promiseQuery(res, doq, [config.db.db1, 'dolist', 'do_modify_date', 'dologic', 'doid', 'doname', 'doid', 'doid', dos]);
Promise.all([pdi, pdo])
.then(r => n())
.catch(e => rt.err(res,e,n,'ERR8002'))
})
.all('*', rt.send);
module.exports = router;