UNPKG

jh-common-dataaccess

Version:
225 lines (223 loc) 6.78 kB
const MType = require('./MType'); const MLogic = require('./MLogic'); const MOperator = require('./MOperator'); const MemoryResult = require('./MemoryResult'); const DataAccess = require('./DataAccess'); module.exports = class Single { constructor(dbconf, tbconf) { this.dbconf = dbconf; this.tbconf = {}; Object.keys(tbconf).forEach(key => { this.tbconf[key] = tbconf[key]; }); this.ds = new DataAccess(this.dbconf); } /** * 通用查询 * @param {String} tablename 表名 * @param {Array} condition 条件 * @param {Number} pagesize 条数 * @param {Number} pageno 页码 * @param {Boolean} isPager 分页 * @param {*} sp 分页 * @param {Boolean} isAll 是否全查 */ query(tablename, condition, pagesize, pageno, isPager, sp, isAll) { tablename = tablename; let logicField = "'0'"; if (this.tbconf[tablename] && this.tbconf[tablename].ld) { logicField = this.tbconf[tablename].ld; } const sqlstr = ` select * from ${this.ds.packCaseLow(tablename)} ${ isAll ? '' : `where ${this.ds.packCaseLow(logicField)} = '0'` } `; return this.querySQL(sqlstr, condition, pagesize, pageno, isPager, sp, Boolean(isAll)); } querySQL(sqlstr, condition, pagesize, pageno, isPager, sp, isAll) { const ms = new MemoryResult(); sqlstr += this.transWhere(condition, isAll); return new Promise((resolve, reject) => { if (isPager) { this.ds .getTable(`select count(1) as sam from (${sqlstr}) as myTemp`) .then(dt => { if (dt.length > 0) { ms.recordcount = Number.parseInt(dt[0].sam, 10); ms.pagecount = Math.floor(ms.recordcount / pagesize); } this.ds .getTable(this.ds.datapager(pageno, pagesize, sqlstr, sp)) .then(dt => { ms.result = dt; resolve(ms); }) .catch(err => { reject(err); }); }) .catch(err => { reject(err); }); } else { this.ds .getTable(sqlstr) .then(dt => { ms.result = dt; resolve(ms); }) .catch(err => { reject(err); }); } }); } transWhere(condition, flag = undefined) { if (!(condition instanceof Array) || condition.length === 0) return ''; const sqlwhereall = []; if (flag === true) { sqlwhereall.push(' where ( '); } else if (flag === false) { sqlwhereall.push(' and ( '); } sqlwhereall.push(' 1=1 '); condition.forEach(mc => { let tvalue = ''; let sqlwhere = ''; const fieldstr = mc.Field; const strs = (mc.value || '').toString().split(','); const splitChar = mc.Type === MType.Mstring ? "'" : ''; const logicstr = mc.Logic === MLogic.And ? 'and' : 'or'; switch (mc.Type) { case MType.Mstring: { if ([null, undefined].includes(mc.value) && mc.Operator !== MOperator.IsNull) { return false; } tvalue = mc.value.toString(); } break; case MType.Mint: { if ([null, undefined].includes(mc.value) && mc.Operator != MOperator.IsNull) { return false; } tvalue = Number.parseInt(mc.value, 10); } break; case MType.Mdouble: { if ([null, undefined].includes(mc.value) && mc.Operator != MOperator.IsNull) { return false; } tvalue = Number.parseFloat(mc.value, 10); } break; case MType.Mdatetime: { if ([null, undefined].includes(mc.value) && mc.Operator != MOperator.IsNull) { return false; } tvalue = DataAccess.parse(new Date(mc.value)); strs.forEach(_item => { _item = DataAccess.parse(new Date(_item)); }); } break; } switch (mc.Operator) { case MOperator.Like: sqlwhere += ` ${logicstr} ${this.ds.packCaseLow( fieldstr )} like ${splitChar}%${tvalue}%${splitChar} `; break; case MOperator.NotLike: sqlwhere += ` ${logicstr} ${this.ds.packCaseLow( fieldstr )} not like ${splitChar}%${tvalue}%${splitChar} `; break; case MOperator.Equal: sqlwhere += ` ${logicstr} ${this.ds.packCaseLow(fieldstr)} = ${splitChar}${tvalue}${splitChar} `; break; case MOperator.NotEqual: sqlwhere += ` ${logicstr} ${this.ds.packCaseLow(fieldstr)} != ${splitChar}${tvalue}${splitChar} `; break; case MOperator.LargeThan: sqlwhere += ` ${logicstr} ${this.ds.packCaseLow(fieldstr)} > ${splitChar}${tvalue}${splitChar} `; break; case MOperator.LargeEqualThan: sqlwhere += ` ${logicstr} ${this.ds.packCaseLow(fieldstr)} >= ${splitChar}${tvalue}${splitChar} `; break; case MOperator.LessThan: sqlwhere += ` ${logicstr} ${this.ds.packCaseLow(fieldstr)} < ${splitChar}${tvalue}${splitChar} `; break; case MOperator.LessEqualThan: sqlwhere += ` ${logicstr} ${this.ds.packCaseLow(fieldstr)} <= ${splitChar}${tvalue}${splitChar} `; break; case MOperator.Between: sqlwhere += ` ${logicstr} ${this.ds.packCaseLow(fieldstr)} between ${splitChar}${ strs[0] }${splitChar} and ${splitChar}${strs[1]}${splitChar} `; break; case MOperator.IsNull: sqlwhere += ` ${logicstr} ${this.ds.packCaseLow(fieldstr)} is null `; break; case MOperator.In: sqlwhere += ` ${logicstr} ${this.ds.packCaseLow(fieldstr)} in ( ${splitChar}${strs.join( `${splitChar},${splitChar}` )}${splitChar} ) `; break; case MOperator.NotIn: sqlwhere += ` ${logicstr} ${this.ds.packCaseLow(fieldstr)} not in ( ${splitChar}${strs.join( `${splitChar},${splitChar}` )}${splitChar} ) `; break; case MOperator.LikeIn: strs.forEach(_item => { _item = ` ${this.ds.packCaseLow(fieldstr)} like ${splitChar}%${_item}%${splitChar} `; }); sqlwhere += ` ${logicstr} ( ${strs.join(' or ')} ) `; break; case MOperator.NotLikeIn: strs.forEach(_item => { sqlwhere += ` ${logicstr} ${this.ds.packCaseLow( fieldstr )} not like ${splitChar}%${_item}%${splitChar} `; }); break; default: break; } if (mc.subCondition) { if (mc.subCondition.l_Condition.length > 0) { sqlwhere += ` ${logicstr} ( ${this.transWhere(mc.subCondition.l_Condition, undefined)} ) `; } } sqlwhereall.push(sqlwhere); }); sqlwhereall.push(' ) '); return sqlwhereall.join(''); } /** * 通过主键快速删除 * @param {*} sqlstr 基础sql语句 * @param {*} ids 主键数组 */ deleteByIds(sqlstr, ids) { if (ids.length === 0) { return Promise.reject('ids is null'); } if (ids instanceof String) { ids = ids.split(','); } const idstrs = []; ids.forEach(id => { if (id instanceof Number) { idstrs.push(id); } else { idstrs.push(this.ds.parse(id)); } }); sqlstr += ` in (${idstrs.join(',')}) `; return this.ds.execute(sqlstr); } };