baseUtils.js 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163
  1. 'use strict';
  2. const fs = require('fs');
  3. const path = require('path');
  4. var util = require('util');
  5. var logPath = path.join(`${process.argv[1]}.log`);
  6. var logFile = fs.createWriteStream(logPath, { flags: 'a' });
  7. console.log = function() {
  8. logFile.write(util.format.apply(null, arguments) + '\n');
  9. process.stdout.write(util.format.apply(null, arguments) + '\n');
  10. };
  11. const mysql = require('mysql');
  12. const config = process.argv[2];
  13. if (['local', 'uat', 'default'].indexOf(config) < 0) throw `参数错误: ${config}`;
  14. const options = require(`../config/config.${config}`)({ baseDir: __dirname + '/app', root: __dirname, name: 'calc' });
  15. const pool = mysql.createPool(options.mysql.client);
  16. const querySql = async function(sql, sqlParam) {
  17. return new Promise(function(resolve, reject) {
  18. pool.getConnection(function(err, conn) {
  19. if (err) {
  20. if (err) console.log(err);
  21. reject(err);
  22. } else {
  23. conn.query(sql, sqlParam, function(err, rows, fields) {
  24. if (err) console.log(err);
  25. // 释放连接
  26. conn.release();
  27. // 传递Promise回调对象
  28. resolve(rows);
  29. });
  30. }
  31. });
  32. });
  33. };
  34. const timesLen = 100;
  35. const filterLastestData = function (data, keyFields, timesField = 'times', orderField = 'order') {
  36. const dataIndex = {};
  37. for (const d of data) {
  38. let key = 'd';
  39. for (const kf of keyFields) {
  40. key = key + '.' + (d[kf] || '');
  41. }
  42. const di = dataIndex[key];
  43. if (di) {
  44. if ((di[timesField] * timesLen + di[orderField]) < (d[timesField] * timesLen + d[orderField])) dataIndex[key] = d;
  45. } else {
  46. dataIndex[key] = d;
  47. }
  48. }
  49. const result = [];
  50. for (const prop in dataIndex) {
  51. result.push(dataIndex[prop]);
  52. }
  53. return result;
  54. };
  55. const zeroRange = 0.0000000001;
  56. const bc = require('../app/lib/base_calc.js');
  57. const Decimal = require('decimal.js');
  58. Decimal.set({ precision: 50, defaults: true });
  59. const ZhCalc = {
  60. // 加减乘除方法,为方便调用,兼容num为空的情况
  61. // 加减法使用base_calc,乘除法使用Decimal(原因详见demo/calc_test)
  62. /**
  63. * 加法 num1 + num2
  64. * @param num1
  65. * @param num2
  66. * @return {number}
  67. */
  68. add(num1, num2) {
  69. return bc.add(num1 ? num1 : 0, num2 ? num2 : 0);
  70. },
  71. /**
  72. * 减法 num1 - num2
  73. * @param num1
  74. * @param num2
  75. * @return {number}
  76. */
  77. sub(num1, num2) {
  78. return bc.sub(num1 ? num1 : 0, num2 ? num2 : 0);
  79. },
  80. /**
  81. * 乘法 num1 * num2
  82. * @param num1
  83. * @param num2
  84. * @return {*}
  85. */
  86. mul(num1, num2, digit = 6) {
  87. if (num1 === '' || num1 === null || num2 === '' || num2 === null) {
  88. return 0;
  89. }
  90. return Decimal.mul(num1 ? num1 : 0, num2 ? num2 : 0).toDecimalPlaces(digit).toNumber();
  91. },
  92. /**
  93. * 除法 num1 / num2
  94. * @param num1 - 被除数
  95. * @param num2 - 除数
  96. * @return {*}
  97. */
  98. div(num1, num2, digit = 6) {
  99. if (num2 && !this.checkZero(num2)) {
  100. return Decimal.div(num1 ? num1 : 0, num2).toDecimalPlaces(digit).toNumber();
  101. }
  102. return null;
  103. },
  104. /**
  105. * 四舍五入(统一,方便以后万一需要置换)
  106. * @param {Number} value - 舍入的数字
  107. * @param {Number} decimal - 要保留的小数位数
  108. * @return {*}
  109. */
  110. round(value, decimal) {
  111. return value ? new Decimal(value.toString()).toDecimalPlaces(decimal).toNumber() : 0;
  112. },
  113. /**
  114. * 汇总
  115. * @param array
  116. * @return {number}
  117. */
  118. sum(array) {
  119. let result = 0;
  120. for (const a of array) {
  121. result = this.add(result, a);
  122. }
  123. return result;
  124. },
  125. /**
  126. * 检查数字是否为0
  127. * @param {Number} value
  128. * @return {boolean}
  129. */
  130. checkZero(value) {
  131. return value === undefined || value === null || (this._.isNumber(value) && Math.abs(value) < zeroRange);
  132. },
  133. /**
  134. * 检查数字是否相等
  135. * @param {Number} value1
  136. * @param {Number} value2
  137. * @return {boolean}
  138. */
  139. numEqual(value1, value2) {
  140. if (value1 && value2) {
  141. return Math.abs(value2 - value1) < zeroRange;
  142. }
  143. return (!value1 && !value2);
  144. },
  145. };
  146. module.exports = {
  147. querySql,
  148. filterLastestData,
  149. closePool: function () {
  150. pool.end();
  151. },
  152. ZhCalc,
  153. };