chanmin0723's picture
Initial obcon SCADA deploy
e4bf523
Raw
History Blame Contribute Delete
10.5 kB
'use strict'
/**
* Copyright (c) 2017~2020, OBCon Inc.
* All rights reserved.
*/
/**
* @file
* @copyright 2017~2020, OBCon Inc.
* @author gye hyun james kim [pnuskgh@gmail.com]
*/
let moment = require('moment');
let Sequelize = require('sequelize'); //--- http://docs.sequelizejs.com/
let View = utils.getClass('include', 'view.js');
class Devicedata2sView extends View {
constructor() {
super();
this._name = 'devicedata2s';
this._title = '장비데이터 Type 2';
this._model = modules.devicedata2s.model;
this._req = null;
this._hasSite = false;
}
//--- 권한 설정 반환
getRights() {
let rights = super.getRights();
rights.get = {
list : { isLogin: true, isAdmin: true, isGlobalAdmin: true },
detail : { isLogin: true, isAdmin: true, isGlobalAdmin: true },
create : { isLogin: true, isAdmin: true, isGlobalAdmin: true },
update : { isLogin: true, isAdmin: true, isGlobalAdmin: true },
};
rights.ajaxPost = {
create : { isLogin: true, isAdmin: true, isGlobalAdmin: true },
update : { isLogin: true, isAdmin: true, isGlobalAdmin: true },
delete : { isLogin: true, isAdmin: true, isGlobalAdmin: true }
}
rights.ajaxGet.list = { isLogin: true, isAdmin: false, isGlobalAdmin: false };
rights.ajaxGet.list2 = { isLogin: true, isAdmin: false, isGlobalAdmin: false };
return rights;
}
getMenus() {
return {
menu: {
name: this.name, //--- 메뉴 선택 여부를 확인하기 위한 이름
title: this.title, //--- 메뉴 이름
path: this.name, //--- 메뉴 URL path,
isLogin: true, //--- 로그인한 사용자에게만 표시
isAdmin: true, //--- 관리자에게만 표시
isGlobalAdmin: false //--- 글로벌 관리자에게만 표시
},
submenus: [
// { name:'create', title: '생성', action: 'create', isLogin: true, isAdmin: true, isGlobalAdmin: false, target: null },
{ name:'list', title: '목록', action: 'list', isLogin: true, isAdmin: true, isGlobalAdmin: false, target: null }
]
};
}
getRouters() {
let routers = super.getRouters();
routers.ajaxGet.list2 = this.ajaxList2.bind(this);
return routers;
}
getSearchData(req, res, next, action) {
let item = {
site: req.query.site,
type: req.query.type,
deviceKey: req.query.deviceKey,
statusDatetimeFr: req.query.statusDatetimeFr,
statusDatetimeTo: req.query.statusDatetimeTo,
uuid: (req.query.uuid) ? req.query.uuid:null
};
this._req = req;
return item;
}
getSearchQuery(search, query, action) {
query = {
attributes: ['statusDatetime', 'preventPotential', 'batteryVoltage', 'ac', 'sensitivity', 'temperature', 'humidity'],
where: {
siteKey: this._req.session.site.siteKey,
// type: search.type,
deviceKey: search.deviceKey,
statusDatetime: {
[Sequelize.Op.gte]: search.statusDatetimeFr,
[Sequelize.Op.lte]: search.statusDatetimeTo
// '$gte': search.statusDatetimeFr,
// '$lte': search.statusDatetimeTo
}
},
order: [
['statusDatetime', 'ASC']
]
};
if (search.uuid != null) {
query.where.statusDatetime = {
[Sequelize.Op.gte]: search.statusDatetimeFr,
[Sequelize.Op.lt]: search.statusDatetimeTo
};
}
return query;
}
// ajaxList2(req, res, next) {
// let search = this.getSearchData(req, res, next, 'ajaxList');
// let query = { where: { site: req.session.site.id, deleted: false } };
// query = this.getSearchQuery(search, query, 'ajaxList');
// this.model.table.findAll(query)
// .then(function(results) {
// if (results == null) {
// utils.obj.resJson(res, 2, 'Data not found.', {}, {});
// return;
// }
// let data = {
// search: search,
// data: results
// };
// utils.obj.resJson(res, 0, 'ok', data, {});
// }).catch(function(err) {
// utils.obj.resJson(res, 1, utils.obj.getErrorMessage(err), {}, err);
// utils.obj.loggerError(err);
// });
// }
getSearchDataList(req, res, next, action) {
let item = {
siteKey: req.session.site.siteKey,
record: req.query.record || 'none',
statusDatetimeFr: req.query.statusDatetimeFr || moment().format('YYYY-MM-DD'),
statusDatetimeTo: req.query.statusDatetimeTo || moment().format('YYYY-MM-DD')
};
return item;
}
getSearchQueryList(search, query, action) {
query = {
// attributes: ['statusDatetime', 'dcVoltage', 'dcElectric', 'preventPotential', 'acVoltage', 'acElectric'],
where: {
siteKey: search.siteKey,
deviceKey: search.deviceKey,
statusDatetime: {
[Sequelize.Op.gte]: search.statusDatetimeFr.replace(/-/g, ''),
[Sequelize.Op.lte]: search.statusDatetimeTo.replace(/-/g, '') + '999999'
}
},
order: [
['statusDatetime', 'ASC']
]
};
return query;
}
//--- /scada/devicedata2s?action=list&record=1
async list(req, res, next) {
let theme = this.getTheme('list', req, 'list', 'list.ejs');
theme.javascriptFiles.push('/js/datatables.min.js'); //--- dataTables
theme.cssFiles.push('/css/datatables.min.css'); //--- dataTables
let search = this.getSearchDataList(req, res, next, 'list');
let query = { where: { id: search.record, deleted: false } };
let device = await modules.devices.model.table.findOne(query);
if (device != null) {
search.deviceKey = device.deviceKey;
}
query = this.getSearchQueryList(search, query, 'list');
let results = await this.model.table.findAll(query);
let data = {
search: search,
data: results
};
res.render(utils.getTemplateFullPath(theme.serviceInfo.site.id, theme.layout), { theme: theme, baseUrl: req.baseUrl, session: req.session, data: data });
}
updateView(req, res, next) {
let theme = this.getTheme('updateView', req, 'updateView', 'updateView.ejs');
let record = req.query.record;
let query = { where: { id: record } };
this.model.table.findOne(query)
.then(function(results) {
//--- To-Do : 읽은 데이터가 없는 경우 (results == null), 오류 페이지를 표시 한다.
let data = {
item: results,
device: req.query.device
};
res.render(utils.getTemplateFullPath(theme.serviceInfo.site.id, theme.layout), { theme: theme, baseUrl: req.baseUrl, session: req.session, data: data });
}).catch(utils.obj.loggerError);
}
//--- /scada/devicedata2s?action=update&record=1702&device=1
ajaxUpdate(req, res, next) {
let record = req.body.record;
let item = this.getBrowserData(req, res, next, 'update');
let checkErrors = this.checkData('update', item);
if (0 < checkErrors.count) {
//--- To-Do : 입력 데이터에 대한 오류 처리를 한다.
utils.obj.resJson(res, 2, '입력 데이터 오류', {}, {});
return;
}
let myPromise = new Promise(function(resolve, reject) {
let query = { where: { id: record } };
this.model.table.findOne(query)
.then(function(itemOld) {
let params = { itemOld: itemOld };
if (itemOld == null) {
logger.error(`include/view.js :: Error : 수정할 데이터가 없습니다.`);
reject({});
} else {
resolve(params);
}
}.bind(this)).catch();
}.bind(this));
myPromise = myPromise.then(function(params) {
return new Promise(function(resolve, reject) {
this.model.table.update(item, { where: { id: record } })
.then(function(results) {
utils.obj.resJson(res, 0, 'ok', results, {});
}.bind(this)).catch(reject);
}.bind(this));
}.bind(this));
myPromise = myPromise.catch(function(err) { //--- reject() 함수에서 에러 처리를 위해 호출 한다.
utils.obj.loggerError(err);
utils.obj.resJson(res, 3, '수정시 오류 발생', {}, {});
}.bind(this));
}
detail(req, res, next) {
let theme = this.getTheme('detail', req, 'detail', 'detail.ejs');
let record = req.query.record;
let query = { where: { id: record } };
this.model.table.findOne(query)
.then(function(results) {
//--- To-Do : 읽은 데이터가 없는 경우 (results == null), 오류 페이지를 표시 한다.
let data = {
item: results,
device: req.query.device
};
res.render(utils.getTemplateFullPath(theme.serviceInfo.site.id, theme.layout), { theme: theme, baseUrl: req.baseUrl, session: req.session, data: data });
}).catch(utils.obj.loggerError);
}
}
module.exports = Devicedata2sView;