Spaces:
Running
Running
| /** | |
| * 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; | |