'use strict'; /** * 系统维护数据模型 * * @author CaiAoLin * @date 2017/10/25 * @version */ const maintainConst = require('../const/maintain'); module.exports = app => { class Maintain extends app.BaseService { /** * 构造函数 * * @param {Object} ctx - egg全局变量 * @return {void} */ constructor(ctx) { super(ctx); this.tableName = 'maintain'; } /** * 校验规则 * * @return {Object} - 返回校验规则 */ rule() { return { maintain_time: { type: 'string', required: true, allowEmpty: false }, duration: { type: 'string', required: true, allowEmpty: false, min: 1 }, msg: { type: 'string', required: false, allowEmpty: true }, }; } async stop(id = 1) { const data = {}; data.id = id; data.status = maintainConst.status.notset; data.maintain_time = ''; const operate = await this.db.update(this.tableName, data); return operate.affectedRows > 0; } /** * 保存数据 * * @param {Object} data - post过来的数据 * @param {Number} id - 用于判断修改还是新增的id * @return {boolean} - 操作结果 */ async save(data = {}, id = 1) { delete data._csrf; data.maintain_time = Date.parse(data.maintain_time); let status = maintainConst.status.notset; const thisTime = new Date().getTime(); if (data.maintain_time) { const endtime = data.maintain_time + await this.durationAddTime(data.duration); if (endtime <= thisTime) { throw '维护时间必须大于或等于当前时间'; } else if (data.maintain_time > thisTime) { status = maintainConst.status.unstart; } else if (data.maintain_time <= thisTime && endtime > thisTime) { status = maintainConst.status.ongoing; } } data.id = id; data.status = status; const operate = await this.db.update(this.tableName, data); return operate.affectedRows > 0; } /** * 同步系统设置消息 * @param id * @returns {Promise} */ async syncMaintainData(id = 1) { let result = false; try { const maintainData = await this.getDataById(id); let status = maintainConst.status.notset; const thisTime = new Date().getTime(); if (maintainData.maintain_time !== '') { maintainData.maintain_time = parseFloat(maintainData.maintain_time); if (maintainData.status === maintainConst.status.unstart && maintainData.maintain_time <= thisTime && maintainData.duration === maintainConst.duration.forever) { status = maintainConst.status.ongoing; } else if (maintainData.status !== maintainConst.status.notset && maintainData.duration !== maintainConst.duration.forever) { const mttime = maintainData.maintain_time + await this.durationAddTime(maintainData.duration); if (maintainData.maintain_time > thisTime) { status = maintainConst.status.unstart; } else if (maintainData.maintain_time <= thisTime && mttime > thisTime) { status = maintainConst.status.ongoing; } } } if (maintainData.status === status) { return true; } const data = {}; data.id = id; data.status = status; if (status === maintainConst.status.notset) { data.maintain_time = ''; } const operate = this.db.update(this.tableName, data); result = operate.affectedRows > 0; } catch (error) { console.log(error); result = false; } return result; } async durationAddTime(duration) { const d = parseInt(duration); let time = 0; if (d === maintainConst.duration.min15) { time = 60 * 15 * 1000; } else if (d === maintainConst.duration.min30) { time = 60 * 30 * 1000; } else if (d === maintainConst.duration.hour1) { time = 3600 * 1000; } else if (d === maintainConst.duration.hour2) { time = 3600 * 2 * 1000; } return time; } } return Maintain; };