obcon-scada / app /include /model.js
chanmin0723's picture
Initial obcon SCADA deploy
e4bf523
Raw
History Blame Contribute Delete
7.69 kB
'use strict'
/**
* Copyright (c) 2017~2021, OBCon Inc.
* All rights reserved.
*/
/**
* @file
* @copyright 2017~2021, OBCon Inc.
* @author gye hyun james kim [pnuskgh@gmail.com]
*/
//--- https://sequelize.org/docs/v6/, 6.12.2
//--- http://docs.sequelizejs.com/
//--- https://zetawiki.com/wiki/MySQL_컬럼_추가
//--- ALTER TABLE `employee` ADD `comments` VARCHAR(200) NOT NULL;
let Sequelize = require('sequelize');
//--- MySQL의 필드 타입
//--- 전체 레코드의 최대 크기 : 64KB (65,535 bytes)
//--- https://goodgid.github.io/JS-char-vs-varchar/
//--- varchar : 64KB. 동일한 공간에 저장. 인덱스 생성 가능
//--- text : 64KB. 별도 공간에 저장. Full text 검색 가능
//--- mediumtext (16MB), longtext (4GB)
//--- blob : 바이너리 데이터를 저장. text와 유사
class Model {
constructor() {
this._use = true; //--- true. 사용하는 모듈
this._title = '';
this._database = null;
this._tableName = null;
this._table = null;
this._define = config.databases.scada.define;
this._timestamps = true;
}
get title() {
return this._title;
}
set title(value) {
this._title = value;
}
get database() {
return this._database;
}
set database(value) {
this._database = value;
}
get tableName() {
return this._tableName;
}
set tableName(value) {
this._tableName = value;
}
get table() {
if (this._table == null) {
this._table = this.define;
}
return this._table;
}
set table(value) {
this._table = value;
}
get fieldNames() {
return Object.getOwnPropertyNames(this.fields);
}
//--- 필드 정의
get fieldDesc() {
return {
name: {
type: 'string', len: 72,
allowNull: false,
defaultValue: '',
validate: {},
title: '이름',
strType: 'string'
},
description: {
type: 'text',
allowNull: true,
defaultValue: '',
validate: {},
title: '상세 설명',
strType: 'text'
},
assignedUserId: {
type: 'integer', len: 11,
allowNull: false,
defaultValue: 1,
validate: {
min: 1
},
title: '담당자 ID',
strType: 'integer'
},
assignedUserName: {
type: 'string', len: 72,
allowNull: true,
defaultValue: '',
validate: {},
title: '담당자',
strType: 'string'
},
createdBy: {
type: 'integer', len: 11,
allowNull: false,
defaultValue: 1,
validate: {
min: 1
},
title: '생성자',
strType: 'integer'
},
updatedBy: {
type: 'integer', len: 11,
allowNull: false,
defaultValue: 1,
validate: {
min: 1
},
title: '수정자',
strType: 'integer'
},
deleted: {
type: 'boolean',
allowNull: false,
defaultValue: false,
validate: {},
title: '삭제',
strType: 'boolean'
}
};
}
//--- Sequelize.DataTypes : https://sequelize.org/docs/v6/moved/data-types/
//--- 문자열 : STRING, STRING(${len}), STRING.BINARY, TEXT, TEXT('tiny')
//--- 숫자 : INTEGER, BIGINT, BIGINT(${len})
//--- FLOAT, FLOAT(~), FLOAT(~, ~) / DOUBLE, DOUBLE(~), DOUBLE(~, ~) / DECIMAL, DECIMAL(~, ~)
//--- 날자 : DATE, DATEONLY
//--- DATE : moment(), moment.utc().format('YYYY-MM-DD HH:mm:ss'), 'YYYY-MM-DDTHH:MM:SSZ', "2016-01-01 00:00:00+00:00"
//--- DATEONLY : 'YYYY-MM-DD'
//--- 논리 : BOOLEAN
desc2field(desc) {
let field = {};
switch (desc.type) {
case 'string':
field.type = Sequelize.STRING(desc.len);
break;
case 'text':
field.type = Sequelize.TEXT;
break;
case 'integer':
field.type = Sequelize.INTEGER(desc.len);
break;
case 'bigint':
field.type = Sequelize.BIGINT(desc.len);
break;
case 'float':
field.type = Sequelize.FLOAT;
break;
case 'decimal':
field.type = Sequelize.DECIMAL(desc.len, desc.lenSub);
break;
case 'date':
field.type = Sequelize.DATE;
break;
case 'dateonly':
field.type = Sequelize.DATEONLY;
break;
case 'boolean':
field.type = Sequelize.BOOLEAN;
break;
default:
field.type = Sequelize.STRING(desc.len);
break;
}
for (let name of ['allowNull', 'defaultValue', 'validate', 'title', 'strType', 'enum']) {
if (typeof(desc[name]) != 'undefined') {
field[name] = desc[name];
}
}
return field;
}
get fields() {
const rtFields = {};
for (let key in this.fieldDesc) {
rtFields[key] = this.desc2field(this.fieldDesc[key]);
}
return rtFields;
}
getTypeEnum() {
const typeEnum = [
['1', '정류기'], ['2', '원격 TB'], ['3', '배관링크'], ['4', '수위센서'], ['5', '관말압력'],
['6', '특정정압기'], ['7', '수신감도']
];
if ((config.service.name == 'service_scada_caprotec') || (config.service.name == 'service_scada_ursc')) {
typeEnum.push(['8', '범용장치1']);
typeEnum.push(['A', '두께측정장치']);
} else {
typeEnum.push(['8', '범용장비1']);
typeEnum.push(['A', '두께측정장비']);
}
typeEnum.push(['B', '정압기 압력 자동 조절 장치']);
return typeEnum;
}
//--- Database 정의
//--- id : auto_increment
//--- createdAt, updatedAt
//--- http://docs.sequelizejs.com/manual/tutorial/models-definition.html#validations
get define() {
if (this._timestamps) {
this._define.timestamps = true;
return this.database.define(this.tableName, this.fields, this._define);
} else {
this._define.timestamps = false;
return this.database.define(this.tableName, this.fields, this._define);
}
}
//--- 데이터 초기화
init() {
if (this.define != null) {
this.table.sync(); //--- Table이 없는 경우 생성
// new Sequelize().define().sync().then();
// new Sequelize().define().findAll()
// new Sequelize().define().update
}
}
}
module.exports = Model;