123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163 |
- 'use strict';
- const fs = require('fs');
- const path = require('path');
- var util = require('util');
- var logPath = path.join(`${process.argv[1]}.log`);
- var logFile = fs.createWriteStream(logPath, { flags: 'a' });
- console.log = function() {
- logFile.write(util.format.apply(null, arguments) + '\n');
- process.stdout.write(util.format.apply(null, arguments) + '\n');
- };
- const mysql = require('mysql');
- const config = process.argv[2];
- if (['local', 'uat', 'default'].indexOf(config) < 0) throw `参数错误: ${config}`;
- const options = require(`../config/config.${config}`)({ baseDir: __dirname + '/app', root: __dirname, name: 'calc' });
- const pool = mysql.createPool(options.mysql.client);
- const querySql = async function(sql, sqlParam) {
- return new Promise(function(resolve, reject) {
- pool.getConnection(function(err, conn) {
- if (err) {
- if (err) console.log(err);
- reject(err);
- } else {
- conn.query(sql, sqlParam, function(err, rows, fields) {
- if (err) console.log(err);
- // 释放连接
- conn.release();
- // 传递Promise回调对象
- resolve(rows);
- });
- }
- });
- });
- };
- const timesLen = 100;
- const filterLastestData = function (data, keyFields, timesField = 'times', orderField = 'order') {
- const dataIndex = {};
- for (const d of data) {
- let key = 'd';
- for (const kf of keyFields) {
- key = key + '.' + (d[kf] || '');
- }
- const di = dataIndex[key];
- if (di) {
- if ((di[timesField] * timesLen + di[orderField]) < (d[timesField] * timesLen + d[orderField])) dataIndex[key] = d;
- } else {
- dataIndex[key] = d;
- }
- }
- const result = [];
- for (const prop in dataIndex) {
- result.push(dataIndex[prop]);
- }
- return result;
- };
- const zeroRange = 0.0000000001;
- const bc = require('../app/lib/base_calc.js');
- const Decimal = require('decimal.js');
- Decimal.set({ precision: 50, defaults: true });
- const ZhCalc = {
- // 加减乘除方法,为方便调用,兼容num为空的情况
- // 加减法使用base_calc,乘除法使用Decimal(原因详见demo/calc_test)
- /**
- * 加法 num1 + num2
- * @param num1
- * @param num2
- * @return {number}
- */
- add(num1, num2) {
- return bc.add(num1 ? num1 : 0, num2 ? num2 : 0);
- },
- /**
- * 减法 num1 - num2
- * @param num1
- * @param num2
- * @return {number}
- */
- sub(num1, num2) {
- return bc.sub(num1 ? num1 : 0, num2 ? num2 : 0);
- },
- /**
- * 乘法 num1 * num2
- * @param num1
- * @param num2
- * @return {*}
- */
- mul(num1, num2, digit = 6) {
- if (num1 === '' || num1 === null || num2 === '' || num2 === null) {
- return 0;
- }
- return Decimal.mul(num1 ? num1 : 0, num2 ? num2 : 0).toDecimalPlaces(digit).toNumber();
- },
- /**
- * 除法 num1 / num2
- * @param num1 - 被除数
- * @param num2 - 除数
- * @return {*}
- */
- div(num1, num2, digit = 6) {
- if (num2 && !this.checkZero(num2)) {
- return Decimal.div(num1 ? num1 : 0, num2).toDecimalPlaces(digit).toNumber();
- }
- return null;
- },
- /**
- * 四舍五入(统一,方便以后万一需要置换)
- * @param {Number} value - 舍入的数字
- * @param {Number} decimal - 要保留的小数位数
- * @return {*}
- */
- round(value, decimal) {
- return value ? new Decimal(value.toString()).toDecimalPlaces(decimal).toNumber() : 0;
- },
- /**
- * 汇总
- * @param array
- * @return {number}
- */
- sum(array) {
- let result = 0;
- for (const a of array) {
- result = this.add(result, a);
- }
- return result;
- },
- /**
- * 检查数字是否为0
- * @param {Number} value
- * @return {boolean}
- */
- checkZero(value) {
- return value === undefined || value === null || (this._.isNumber(value) && Math.abs(value) < zeroRange);
- },
- /**
- * 检查数字是否相等
- * @param {Number} value1
- * @param {Number} value2
- * @return {boolean}
- */
- numEqual(value1, value2) {
- if (value1 && value2) {
- return Math.abs(value2 - value1) < zeroRange;
- }
- return (!value1 && !value2);
- },
- };
- module.exports = {
- querySql,
- filterLastestData,
- closePool: function () {
- pool.end();
- },
- ZhCalc,
- };
|