UNPKG

apis-scf-nodejs

Version:

Apis Serverless Compute Function NodeJS Package

1,536 lines (1,400 loc) 144 kB
// const Apis = require( 'apis-core-nodejs' ); // const { Sequelize, DataTypes } = require( 'sequelize' ); // const sequelize = require( './connection' ); // class ModelCore extends Sequelize.Model { /** * 获取配置 * @returns {*} */ static getConfig() { return { base : { //模型名 model_name : '', //模型介绍 model_comment : '' }, logic : { //类型;正常(横表)base,上下级(递归表)infinite,属性(竖表)attribute type : '', base : {}, infinite : { infinite_parent_field : '',//上级id字段名,默认为0 infinite_status_field : '',//状态字段名,0停止,1正常 infinite_sort_field : '',//排序字段名,默认为1 virtual_tree_text_field : '',//树型结构text字段用对应的真实字段 virtual_tree_value_field : '',//树型结构value字段对应的真实字段 }, attribute : { object_type_field : '',//绑定对象类型(固定)字段名 object_value_field : '',//绑定对象数据(固定)字段名 target_type_field : '',//绑定目标类型(固定)字段名 target_value_field : '',//绑定目标数据(固定)字段名 is_exclude_field : '',//绑定目标数据是否过滤(固定)字段名 } }, dao : { //表名 table_name : '', //表字段 table_fields : [], //主键 primary_key : '', //插入 insert : { //必须插入的字段 input_data_field : [] }, //更新 update : { //允许作为where条件的字段 input_where_field : [], //可以更新的字段 input_data_field : [] }, //删除 delete : { //软删除,false真删除;true假删除 soft_delete : true, //允许作为where条件的字段 input_where_field : [] }, //读取 read : { //允许作为where条件的字段 input_where_field : [], //输出需要隐藏的字段 output_hidden_field : [] }, //查询 search : { //允许作为where条件的字段 input_where_field : {}, //输出需要隐藏的字段 output_hidden_field : [] }, //时间戳 timestamp : [], //唯一值 unique : [] } } } /** * ============================================================== * helper * ============================================================== */ /** * 日志 * @param data * @param title * @param level * @private */ static _log( data, title = '', level = 'info' ) { // 是否开启日志 if( CONFIG[ 'Base' ].log.enable === true ) { Apis.Utils.Base.log( data, title, level ); } } /** * 生成唯一参数 * @param uniqueData * @returns {{_field_name: *}} */ static _buildUniqueParameter( uniqueData = '' ) { //**********************************************************/ //变量 //**********************************************************/ //结果 let _result = {}; //字段名 let _field_name; //主键 let _pk = this.getConfig().dao.primary_key; if( Apis.Utils.Base.check( 'unique', uniqueData ) ) { //unique if( _pk === 'id' ) { //id 转 number _field_name = _pk.replace( 'id', 'number' ); } else { //user_idaa_id 转 user_idaa_number _field_name = _pk.substring( 0, _pk.lastIndexOf( '_id' ) ) + '_number'; } } else if( Apis.Utils.Base.check( 'id', uniqueData ) ) { //id _field_name = _pk; } else if( Apis.Utils.Base.check( 'uuid', uniqueData ) ) { //uuid if( _pk === 'id' ) { //id 转 uuid _field_name = _pk.replace( 'id', 'uuid' ); } else { //user_idaa_id 转 user_idaa_uuid _field_name = _pk.substring( 0, _pk.lastIndexOf( '_id' ) ) + '_uuid'; } } else { this._log( uniqueData, '生成唯一值条件错误', 'error' ); throw new Error( '生成唯一值条件错误' ); } //赋值 _result[ _field_name ] = uniqueData; return _result; }; /** * 时间戳字段转换 * @param name * @param data * @returns {Promise<*>} * @private */ static async _timestampFieldsFormat( name, data ) { //时间戳字段 let _timestamp_field = this.getConfig().dao.timestamp; //不是时间戳字段,原样返回数据 if( _timestamp_field.indexOf( name ) === -1 ) { return data; } //如果是时间戳,直接返回 let _rule = /\d{10}/; if( _rule.test( data ) ) { return data; } //格式['2012-07-12','2013-08-19'] if( typeof (data) === 'object' ) { data[ 0 ] = Apis.Utils.Time.toTimestamp( data[ 0 ] ); data[ 1 ] = Apis.Utils.Time.toTimestamp( data[ 1 ] ); } // if( typeof (data) === 'string' ) { //格式'2012-07-12'|'2013-08-19' if( data.indexOf( '|' ) !== -1 ) { //1、字符串转数组,11111|22222 转 [11111,22222] let _temp_array = data.split( '|' ); this._log( _temp_array, '参数转时间戳-1' ); //2、数组值转时间戳 let _time_array = {}; for( let i = 0; i < _temp_array.length; i++ ) { _time_array.push( Apis.Utils.Time.toTimestamp( _temp_array[ i ] ) ); } this._log( _time_array, '参数转时间戳-2' ); //3、数组转字符串,[11111,22222] 转 11111|22222 data = _time_array.join( '|' ); this._log( data, '参数转时间戳-3' ); } else { //转时间戳 data = Apis.Utils.Time.toTimestamp( data ); this._log( '参数转时间戳-4(' + data + ')' ); } } else { //转时间戳 data = Apis.Utils.Time.toTimestamp( data ); this._log( '参数转时间戳-5(' + data + ')' ); } return data; } /** * 时间戳转日期时间 * @param dataObject * @param format * @returns {Promise<void>} * @private */ static async _timestampFieldsToDateTime( dataObject = {}, format = 'YYYY-MM-DD HH:mm:ss' ) { //时间戳字段 let _timestamp_field = this.getConfig().dao.timestamp; let _result = {}; for( let key in dataObject ) { if( !dataObject.hasOwnProperty( key ) ) { continue; } if( _timestamp_field.indexOf( key ) !== -1 && Number( dataObject[ key ] ) > 0 ) { _result[ key ] = Apis.Utils.Time.format( format, dataObject[ key ] ); } else { _result[ key ] = dataObject[ key ]; } } return _result; }; /** * 参数格式化成标准格式 * @param dataObject * @returns {*} * { aaa:['in',['123','456']], bbb:['between','2018-01-01|2018-12-30'], ccc:['between',['2018-01-01','2018-12-30']], ddd:['=','dsdsds'], eee:999, or:{ aaa:['in',['123','456']], bbb:['between','2018-01-01|2018-12-30'], ccc:['between',['2018-01-01','2018-12-30']], ddd:['=','dsdsds'], eee:999, } } */ static async _parameterFormat( dataObject = {} ) { //判断是否为空 if( Object.keys( dataObject ).length === 0 ) { return dataObject; } for( let key in dataObject ) { if( !dataObject.hasOwnProperty( key ) ) { continue; } if( Object.prototype.toString.call( dataObject[ key ] ) === '[object Object]' ) { //递归并把key换成运算符 dataObject[ [ Sequelize.Op[ key ] ] ] = await this._parameterFormat( dataObject[ key ] ); } else { //转换 dataObject[ key ] = await this._parameterFormatOnce( key, dataObject[ key ] ); } } //this._log( dataObject, '参数转换结果' ); return dataObject; } /** * 参数格式化成标准格式 * 入格式: * id,['=',['123','456']] * id,['=','dsdsds'] * id,999 * 出格式: * { OP.gt: 10 } * @param name * @param data */ static async _parameterFormatOnce( name, data ) { //**********************************************************/ //变量 //**********************************************************/ let _result = {}; let _name = name; let _value; let _condition; //定义条件和值 if( Object.prototype.toString.call( data ) === '[object Array]' ) { _condition = data[ 0 ]; _value = data[ 1 ]; } else { _condition = '='; _value = data; } //转时间戳 _value = await this._timestampFieldsFormat( _name, _value ); //某些时候值转数组 if( _condition === 'between' || _condition === 'notBetween' || _condition === 'in' || _condition === 'notIn' ) { if( typeof (_value) === 'string' ) { //字符串转数组 if( _value.indexOf( '|' ) !== -1 ) { _value = _value.split( '|' ); } // if( _value.indexOf( ',' ) !== -1 ) { _value = _value.split( ',' ); } } } switch( _condition ) { case '>': _result = { [ Sequelize.Op.gt ] : Apis.Utils.String.trim( _value ) }; break; case '>=': _result = { [ Sequelize.Op.gte ] : Apis.Utils.String.trim( _value ) }; break; case '<': _result = { [ Sequelize.Op.lt ] : Apis.Utils.String.trim( _value ) }; break; case '<=': _result = { [ Sequelize.Op.lte ] : Apis.Utils.String.trim( _value ) }; break; case '<>': _result = { [ Sequelize.Op.ne ] : Apis.Utils.String.trim( _value ) }; break; case '=': _result = { [ Sequelize.Op.eq ] : Apis.Utils.String.trim( _value ) }; break; case 'like': _result = { [ Sequelize.Op.like ] : '%' + Apis.Utils.String.trim( _value ) + '%' }; break; case 'rightLike': _result = { [ Sequelize.Op.like ] : Apis.Utils.String.trim( _value ) + '%' }; break; case 'leftLike': _result = { [ Sequelize.Op.like ] : '%' + Apis.Utils.String.trim( _value ) }; break; case 'notLike': _result = { [ Sequelize.Op.notLike ] : '%' + Apis.Utils.String.trim( _value ) + '%' }; break; case 'between': _result = { [ Sequelize.Op.between ] : _value }; break; case 'notBetween': _result = { [ Sequelize.Op.notBetween ] : _value }; break; case 'in': _result = { [ Sequelize.Op.in ] : _value }; break; case 'notIn': _result = { [ Sequelize.Op.notIn ] : _value }; break; default: this._log( _condition, '发现不明条件,拒绝查询', 'error' ); throw new Error( '发现不明条件,拒绝查询' ); } return _result; } /** * 根据场景过滤数据 * @param dataObject * @param scene * @returns {Promise<*>} */ static async _filterFields( dataObject = {}, scene = 'pass' ) { //**********************************************************/ //变量 //**********************************************************/ //场景 let _scene = scene; //场景字段 let _scene_fields; //**********************************************************/ //排除非数据库字段 //**********************************************************/ let _table_fields = this.getConfig().dao.table_fields; for( let key in dataObject ) { if( !dataObject.hasOwnProperty( key ) ) { continue; } if( _table_fields.indexOf( key ) === -1 ) { this._log( '发现非数据库字段(' + key + '),场景(' + _scene + '),方案(排除)' ); //删除 delete dataObject[ key ]; } } //**********************************************************/ //场景处理 //**********************************************************/ switch( _scene ) { case 'insert': _scene_fields = this.getConfig().dao.insert.input_data_field; //判断场景字段是否为空 if( _scene_fields.length === 0 ) { this._log( '没有允许的字段参与创建' ); throw new Error( '没有允许的字段参与创建' ); } //过滤场景未指定的字段 dataObject = Apis.Utils.ArrayObject.reserveObjectAttribute( dataObject, _scene_fields ); //检测必须字段是否存在 for( let i = 0; i < _scene_fields.length; i++ ) { if( !dataObject.hasOwnProperty( _scene_fields[ i ] ) ) { this._log( '插入数据(' + _scene_fields[ i ] + ')不存在,场景(' + _scene + '),方案(抛出异常)' ); throw new Error( '插入数据(' + _scene_fields[ i ] + ')不存在' ); } } break; case 'update.where': _scene_fields = this.getConfig().dao.update.input_where_field; //判断场景字段是否为空 if( _scene_fields.length === 0 ) { this._log( '没有允许的条件参与更新' ); throw new Error( '没有允许的条件参与更新' ); } //过滤场景未指定的字段 dataObject = Apis.Utils.ArrayObject.reserveObjectAttribute( dataObject, _scene_fields ); break; case 'update.data': _scene_fields = this.getConfig().dao.update.input_data_field; //判断场景字段是否为空 if( _scene_fields.length === 0 ) { this._log( '没有允许的字段参与更新' ); throw new Error( '没有允许的字段参与更新' ); } //过滤场景未指定的字段 dataObject = Apis.Utils.ArrayObject.reserveObjectAttribute( dataObject, _scene_fields ); break; case 'read': _scene_fields = this.getConfig().dao.read.input_where_field; //判断场景字段是否为空 if( _scene_fields.length === 0 ) { this._log( '没有允许的字段参与读取' ); throw new Error( '没有允许的字段参与读取' ); } //过滤场景未指定的字段 dataObject = Apis.Utils.ArrayObject.reserveObjectAttribute( dataObject, _scene_fields ); break; case 'delete': _scene_fields = this.getConfig().dao.delete.input_where_field; //判断场景字段是否为空 if( _scene_fields.length === 0 ) { this._log( '没有允许的字段参与删除' ); throw new Error( '没有允许的字段参与删除' ); } //保留场景指定的字段 dataObject = Apis.Utils.ArrayObject.reserveObjectAttribute( dataObject, _scene_fields ); break; case 'search': _scene_fields = Object.keys( this.getConfig().dao.search.input_where_field ); //判断场景字段是否为空 if( _scene_fields.length === 0 ) { this._log( '没有允许的字段参与查询' ); throw new Error( '没有允许的字段参与查询' ); } for( let key in dataObject ) { if( !dataObject.hasOwnProperty( key ) ) { continue; } //过滤场景未指定的字段 if( _scene_fields.indexOf( key ) === -1 ) { //不存在,删除 delete dataObject[ key ]; } else { //存在,转换格式 dataObject[ key ] = [ this.getConfig().dao.search.input_where_field[ key ].condition, dataObject[ key ] ]; this._log( dataObject[ key ], 'search参数绑定条件' ); } } break; default: break; } //判断过滤后是否为空(排除search) if( 'search' !== _scene && Object.keys( dataObject ).length === 0 ) { this._log( '过滤字段后数据对象为空,场景(' + _scene + '),方案(抛出异常)' ); throw new Error( '过滤字段后数据对象为空' ); } return dataObject; }; /** * 检查唯一值是否存在 * @param dataObject * @returns {Promise<boolean>} * @private */ static async _checkUniqueExist( dataObject = {} ) { //判断是否为空 if( Object.keys( dataObject ).length === 0 ) { return false; } //**********************************************************/ //变量 //**********************************************************/ //data let _data = dataObject; //唯一值字段 let _unique_field = this.getConfig().dao.unique; for( let key in _data ) { if( !_data.hasOwnProperty( key ) ) { continue; } //判断字段是否是唯一值 if( _unique_field.indexOf( key ) !== -1 ) { let _temp_where = {}; _temp_where[ key ] = _data[ key ]; let _temp_result = await this.checkData( _temp_where ); if( Apis.Utils.Base.checkSuccess( _temp_result ) ) { return true; } } } return false; } /** * ============================================================== * DAO * ============================================================== */ /** * add * @param dataObject * @param options * @returns {Promise<{result: {}, message: string, status: boolean}>} */ static async addData( dataObject = {}, options = {} ) { //判断是否为空 if( Object.keys( dataObject ).length === 0 ) { this._log( '插入操作,数据不能为空' ); throw new Error( '插入操作,数据不能为空' ); } //**********************************************************/ //变量 //**********************************************************/ //结果 let _result = { status : false, message : '新增数据完成', result : {} }; //data let _data = dataObject; //配置 let _options = options; //**********************************************************/ //data //**********************************************************/ //转换时间字段 for( let key in _data ) { if( !_data.hasOwnProperty( key ) ) { continue; } _data[ key ] = await this._timestampFieldsFormat( key, _data[ key ] ); } //追加赋值(时间戳) _data.create_time = Apis.Utils.Time.getTimestamp(); _data.update_time = 0; _data.delete_time = 0; //检测唯一值 let _check_unique = await this._checkUniqueExist( _data ); if( Apis.Utils.Base.checkSuccess( _check_unique ) ) { this._log( '插入操作,唯一值不能重复' ); throw new Error( '插入操作,唯一值不能重复' ); } //**********************************************************/ //操作 //**********************************************************/ this._log( _data, '插入数据' ); await this.create( _data, _options ) .then( res => { if( res === null ) { _result.message = '新增数据失败'; } else { _result.status = true; _result.result = res.get( { plain : true } );//通过设置plain:true来直接获取文档数据 _result.message = '新增数据完成'; } } ) .catch( err => { this._log( err, 'addData操作错误', 'error' ); throw new Error( err.message ); } ); //**********************************************************/ //返回 //**********************************************************/ return _result; }; /** * add multiple * @param dataArray * @param options * @returns {Promise<{result: number, message: string, status: boolean}>} */ static async addMultipleData( dataArray = [], options = {} ) { //判断是否为空 if( dataArray.length === 0 ) { this._log( '批量插入操作,数据不能为空' ); throw new Error( '批量插入操作,数据不能为空' ); } //**********************************************************/ //变量 //**********************************************************/ let _result = { status : false, message : '批量新增数据完成', result : 0 }; //data let _data = dataArray; //配置 let _options = options; //**********************************************************/ //data //**********************************************************/ let _temp_data = []; for( let i = 0; i < _data.length; i++ ) { let _temp_item = _data[ i ]; //转换时间字段 for( let key in _temp_item ) { if( !_temp_item.hasOwnProperty( key ) ) { continue; } _temp_item[ key ] = await this._timestampFieldsFormat( key, _temp_item[ key ] ); } //检测唯一值 let _check_unique = await this._checkUniqueExist( _temp_item ); if( Apis.Utils.Base.checkSuccess( _check_unique ) ) { this._log( _temp_item, '批量插入数据,数据唯一值重复,方案(跳过)' ); } else { //追加赋值(时间戳) _temp_item.create_time = Apis.Utils.Time.getTimestamp(); _temp_item.update_time = 0; _temp_item.delete_time = 0; //通过唯一值检测在追加到数据 _temp_data.push( _temp_item ); } } //再次覆盖赋值 _data = _temp_data; //**********************************************************/ //操作 //**********************************************************/ this._log( _data, '批量插入数据' ); await this.bulkCreate( _data, _options ) .then( res => { if( Number( res.length ) >= 1 ) { _result.status = true; _result.result = Number( res.length ); _result.message = '批量新增数据完成'; } else { _result.message = '批量新增数据失败'; } } ) .catch( err => { this._log( err, 'addMultipleData操作错误', 'error' ); throw new Error( err.message ); } ); //**********************************************************/ //返回 //**********************************************************/ return _result; }; /** * edit * @param whereObject * @param dataObject * @param options * @returns {Promise<{result: number, message: string, status: boolean}>} */ static async editData( whereObject = {}, dataObject = {}, options = {} ) { //判断是否为空 if( Object.keys( whereObject ).length === 0 ) { throw new Error( '插入操作,条件不能为空' ); } //判断是否为空 if( Object.keys( dataObject ).length === 0 ) { throw new Error( '插入操作,数据不能为空' ); } //**********************************************************/ //变量 //**********************************************************/ //结果 let _result = { status : false, message : '更新数据完成', result : 0 }; //where let _where = whereObject; //data let _data = dataObject; //配置 let _options = options; //**********************************************************/ //where //**********************************************************/ //转换成标准格式 _where = await this._parameterFormat( _where ); //**********************************************************/ //data //**********************************************************/ //转换时间字段 for( let key in _data ) { if( !_data.hasOwnProperty( key ) ) { continue; } _data[ key ] = await this._timestampFieldsFormat( key, _data[ key ] ); } //追加赋值(时间戳) _data.update_time = Apis.Utils.Time.getTimestamp(); //检测唯一值 let _check_unique = await this._checkUniqueExist( _data ); if( Apis.Utils.Base.checkSuccess( _check_unique ) ) { throw new Error( '更新操作,唯一值不能重复' ); } //**********************************************************/ //配置 //**********************************************************/ //where _options.where = _where; // _options.individualHooks = true; //**********************************************************/ //操作 //**********************************************************/ this._log( _data, '更新数据' ); await this.update( _data, _options ) .then( res => { /* [ 1, [ {"bbb_ccc":"南京南京南京444444-1[41]","id":41,"create_time":1580823530} ] ] */ if( res.length >= 1 && res[ 0 ] >= 1 ) { //结果赋值 _result.status = true; _result.result = Number( res[ 0 ] );//影响的数量 _result.message = '更新数据完成'; } else { _result.message = '更新数据失败'; } } ) .catch( err => { this._log( err, 'editData操作错误', 'error' ); throw new Error( err.message ); } ); //**********************************************************/ //返回 //**********************************************************/ return _result; }; /** * delete * @param whereObject * @param options * @returns {Promise<{result, message, status}|*>} */ static async deleteData( whereObject = {}, options = {} ) { //判断是否为空 if( Object.keys( whereObject ).length === 0 ) { throw new Error( '删除操作,条件不能为空' ); } //软删除 if( this.getConfig().dao.delete.soft_delete ) { //软删除 return await this._softDeleteData( whereObject, options ); } else { //真删除 return await this._realDeleteData( whereObject, options ); } }; static async _realDeleteData( whereObject = {}, options = {} ) { //**********************************************************/ //变量 //**********************************************************/ //结果 let _result = { status : false, message : '删除数据完成', result : 0 }; //where let _where = whereObject; //配置 let _options = options; //**********************************************************/ //where //**********************************************************/ //转换成标准格式 _where = await this._parameterFormat( _where ); //**********************************************************/ //options //**********************************************************/ //where _options.where = _where; //强制删除 _options.force = false; //**********************************************************/ //操作 //**********************************************************/ this._log( _options.where, '删除条件' ); await this.destroy( _options ) .then( res => { if( Number( res ) >= 1 ) { _result.status = true; _result.result = Number( res );//影响的数量 _result.message = '删除数据完成'; } else { _result.message = '删除数据失败'; } } ) .catch( err => { this._log( err, '_realDeleteData操作错误', 'error' ); throw new Error( err.message ); } ); //**********************************************************/ //返回 //**********************************************************/ return _result; }; static async _softDeleteData( whereObject = {}, options = {} ) { //**********************************************************/ //变量 //**********************************************************/ let _where = whereObject; let _options = options; //**********************************************************/ //data //**********************************************************/ let _data = { delete_time : Apis.Utils.Time.getTimestamp() }; //**********************************************************/ //操作 //**********************************************************/ return await this.editData( _where, _data, _options ); }; /** * read * @param whereObject * @param options * @returns {Promise<{result: {}, message: string, status: boolean}>} */ static async readData( whereObject = {}, options = {} ) { //判断是否为空 if( Object.keys( whereObject ).length === 0 ) { throw new Error( '读取操作,条件不能为空' ); } //**********************************************************/ //变量 //**********************************************************/ //结果 let _result = { status : false, message : '读取数据完成', result : {} }; //where let _where = whereObject; //配置 let _options = options; //主键 let _pk = this.getConfig().dao.primary_key; //**********************************************************/ //where //**********************************************************/ //转换成标准格式 _where = await this._parameterFormat( _where ); //**********************************************************/ //options //**********************************************************/ //where _options.where = _where; //排序 if( !_options.hasOwnProperty( 'order' ) ) { _options.order = [ [ _pk, 'DESC' ] ] } //**********************************************************/ //操作 //**********************************************************/ this._log( _options.where, '读取条件' ); await this.findOne( _options ) .then( res => { if( res === null ) { _result.message = '读取数据失败'; } else { _result.status = true; _result.message = '读取数据完成'; _result.result = res.get( { plain : true } );//通过设置plain:true来直接获取文档数据 } } ) .catch( err => { this._log( err, 'readData操作错误', 'error' ); throw new Error( err.message ); } ); //**********************************************************/ //返回 //**********************************************************/ return _result; }; /** * rand * @param whereObject * @param limit * @param options * @returns {Promise<{result: {}, message: string, status: boolean}>} */ static async randData( whereObject = {}, limit = 1, options = {} ) { //判断是否为空 if( Object.keys( whereObject ).length === 0 ) { throw new Error( '随机操作,条件不能为空' ); } //**********************************************************/ //变量 //**********************************************************/ //结果 let _result = { status : false, message : '随机数据完成', result : {} }; //where let _where = whereObject; //数量 let _limit = Number( limit ); //配置 let _options = options; //**********************************************************/ //where //**********************************************************/ //转换成标准格式 _where = await this._parameterFormat( _where ); //**********************************************************/ //options //**********************************************************/ //where _options.where = _where; //排序 _options.order = [ [ Sequelize.literal( 'rand()' ) ] ]; //数量 _options.limit = _limit; //**********************************************************/ //操作 //**********************************************************/ this._log( _options.where, 'rand读取条件' ); await this.findAll( _options ) .then( res => { _result.status = true; _result.result = res; } ) .catch( err => { this._log( err, 'randData操作错误', 'error' ); throw new Error( err.message ); } ); //**********************************************************/ //返回 //**********************************************************/ return _result; }; /** * count * @param whereObject * @param options * @returns {Promise<{result: number, message: string, status: boolean}>} */ static async countData( whereObject = {}, options = {} ) { //判断是否为空 if( Object.keys( whereObject ).length === 0 ) { throw new Error( '统计操作,条件不能为空' ); } //**********************************************************/ //变量 //**********************************************************/ //结果 let _result = { status : false, message : '统计数据完成', result : 0 }; //where let _where = whereObject; //配置 let _options = options; //**********************************************************/ //where //**********************************************************/ //转换成标准格式 _where = await this._parameterFormat( _where ); //**********************************************************/ //options //**********************************************************/ //where _options.where = _where; //**********************************************************/ //操作 //**********************************************************/ this._log( _options.where, '统计条件' ); await this.count( _options ) .then( res => { _result.status = true; _result.result = Number( res ); } ) .catch( err => { this._log( err, 'countData操作错误', 'error' ); throw new Error( err.message ); } ); //**********************************************************/ //返回 //**********************************************************/ return _result; }; /** * check * @param whereObject * @param options * @returns {Promise<{result: number, message: string, status: boolean}>} */ static async checkData( whereObject = {}, options = {} ) { //判断是否为空 if( Object.keys( whereObject ).length === 0 ) { throw new Error( '检测操作,条件不能为空' ); } //**********************************************************/ //变量 //**********************************************************/ //结果 let _result = { status : false, message : '检测数据完成', result : 0 }; // let _action = await this.countData( whereObject, options ); if( Apis.Utils.Base.checkSuccess( _action ) && Number( _action.result ) >= 1 ) { _result.status = true; _result.result = Number( _action.result ); } return _result; }; /** * sum * @param field * @param whereObject * @param options * @returns {Promise<{result: number, message: string, status: boolean}>} */ static async sumData( field, whereObject = {}, options = {} ) { //判断是否为空 if( Object.keys( whereObject ).length === 0 ) { throw new Error( '求和操作,条件不能为空' ); } //**********************************************************/ //变量 //**********************************************************/ //结果 let _result = { status : false, message : '求和数据完成', result : 0 }; //where let _where = whereObject; //配置 let _options = options; //**********************************************************/ //where //**********************************************************/ //转换成标准格式 _where = await this._parameterFormat( _where ); //**********************************************************/ //options //**********************************************************/ //where _options.where = _where; //**********************************************************/ //操作 //**********************************************************/ this._log( _options.where, '求和条件' ); await this.sum( field, _options ) .then( res => { _result.status = true; _result.result = Number( res ); } ) .catch( err => { this._log( err, 'sumData操作错误', 'error' ); throw new Error( err.message ); } ); //**********************************************************/ //返回 //**********************************************************/ return _result; }; /** * max * @param field * @param whereObject * @param options * @returns {Promise<{result: number, message: string, status: boolean}>} */ static async maxData( field, whereObject = {}, options = {} ) { //判断是否为空 if( Object.keys( whereObject ).length === 0 ) { throw new Error( '最大值操作,条件不能为空' ); } //**********************************************************/ //变量 //**********************************************************/ //结果 let _result = { status : false, message : '获取数据MAX完成', result : 0 }; //where let _where = whereObject; //配置 let _options = options; //**********************************************************/ //where //**********************************************************/ //转换成标准格式 _where = await this._parameterFormat( _where ); //**********************************************************/ //options //**********************************************************/ //where _options.where = _where; //**********************************************************/ //操作 //**********************************************************/ this._log( _options.where, '取max条件' ); await this.max( field, _options ) .then( res => { _result.status = true; _result.result = Number( res ); } ) .catch( err => { this._log( err, 'maxData操作错误', 'error' ); throw new Error( err.message ); } ); //**********************************************************/ //返回 //**********************************************************/ return _result; }; /** * min * @param field * @param whereObject * @param options * @returns {Promise<{result: number, message: string, status: boolean}>} */ static async minData( field, whereObject = {}, options = {} ) { //判断是否为空 if( Object.keys( whereObject ).length === 0 ) { throw new Error( '最小值操作,条件不能为空' ); } //**********************************************************/ //变量 //**********************************************************/ //结果 let _result = { status : false, message : '获取数据MIN完成', result : 0 }; //where let _where = whereObject; //配置 let _options = options; //**********************************************************/ //where //**********************************************************/ //转换成标准格式 _where = await this._parameterFormat( _where ); //**********************************************************/ //options //**********************************************************/ //where _options.where = _where; //**********************************************************/ //操作 //**********************************************************/ this._log( _options.where, '取min条件' ); await this.min( field, _options ) .then( res => { _result.status = true; _result.result = Number( res ); } ) .catch( err => { this._log( err, 'minData操作错误', 'error' ); throw new Error( err.message ); } ); //**********************************************************/ //返回 //**********************************************************/ return _result; }; /** * search * @param dataObject * @param scope * @param options * @returns {Promise<{result: {total: number, data: [], page_limit: number, total_page: number, current_page: number}, message: string, status: boolean}>} */ static async searchData( dataObject = {}, scope = null, options = {} ) { //**********************************************************/ //变量 //**********************************************************/ //结果 let _result = { status : false, message : '查询数据完成', result : { data : [], total : 0, total_page : 1, current_page : 1, page_limit : 20 } }; //主键 let _pk = this.getConfig().dao.primary_key; //数据总数 let _total_data = 0; //页面总数 let _total_page = 1; //where let _where = (dataObject.hasOwnProperty( 'where' )) ? dataObject.where : {}; //每页数量 let _limit = (dataObject.hasOwnProperty( 'limit' )) ? Number( dataObject.limit ) : 20; //当前页数 let _page = (dataObject.hasOwnProperty( 'page' )) ? Number( dataObject.page ) : 1; //排序字段 let _sort_by = (dataObject.hasOwnProperty( 'sort_by' ))