jh-common-dataaccess
Version:
common-dataaccess
225 lines (223 loc) • 6.78 kB
JavaScript
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);
}
};