From 89d0aaed29f344ff46c6fbc9b6e6e92b2922a0d7 Mon Sep 17 00:00:00 2001
From: Tevin <tingquanren@163.com>
Date: Thu, 27 Feb 2025 11:59:58 +0800
Subject: [PATCH] 知识库文档,新增项目规范

---
 common/Tools.js |  161 ++++++++++++++++++++++++++++++++++++++++++-----------
 1 files changed, 128 insertions(+), 33 deletions(-)

diff --git a/common/Tools.js b/common/Tools.js
index 624297d..2f0635d 100644
--- a/common/Tools.js
+++ b/common/Tools.js
@@ -6,6 +6,8 @@
 import moment from 'moment';
 import Taro from '@tarojs/taro';
 
+moment.locale('zh-cn');
+
 export class Tools {
     /**
      * 显示消息
@@ -47,7 +49,7 @@
      * @return {string}
      */
     static createGUID() {
-        return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {
+        return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) {
             let r = (Math.random() * 16) | 0,
                 v = c === 'x' ? r : (r & 0x3) | 0x8;
             return v.toString(16);
@@ -436,16 +438,88 @@
     /**
      * 数值转换为金钱格式
      * @param {Number|String} number
+     * @param {String} [forRead=''] 便于阅读财务金额模式
      * @return {string}
      */
-    static moneyFormat(number) {
+    static moneyFormat(number, forRead = '') {
         if (!number && typeof number !== 'number' && typeof number !== 'string') {
             return '';
         }
         if (typeof number === 'string') {
             number = Number(number) || 0;
         }
-        return number.toFixed(2);
+        if (forRead === 'forRead') {
+            return number.toLocaleString('zh-cn', {
+                minimumFractionDigits: 2,
+                maximumFractionDigits: 2,
+            });
+        } else {
+            return number.toFixed(2);
+        }
+    }
+
+    /**
+     * 数值转换为千分位格式
+     * @param {Number|String} number - 传入的值
+     * @param {String} decimalFormat - 处理小数的方式  - notRetain(不保留小数,有小数时也会去掉小数位),keepTwo(保留两位小数),keepThree(保留三位小数)
+     * @return {string}
+     */
+    static thousandFormat(number, decimalFormat = 'keepTwo') {
+        if (!number && typeof number !== 'number' && typeof number !== 'string') {
+            return '';
+        }
+        // 原始数据
+        let num = number.toString();
+        // 需要进千分位的数,小数点前的数才需要进行千分位计算,即整数位
+        let needThousand = '';
+        // 小数位
+        let decimals = '';
+        // 没有小数位
+        if (!(num.indexOf('.') > -1)) {
+            needThousand = num.toString();
+            if (decimalFormat === 'keepTwo') {
+                decimals = '00';
+            } else if (decimalFormat === 'keepThree') {
+                decimals = '000';
+            }
+        }
+        // 存在小数位时
+        else if (num.indexOf('.') > -1) {
+            needThousand = num.split('.')[0].toString();
+            if (decimalFormat === 'keepTwo') {
+                decimals = Number(num).toFixed(2).split('.')[1] || '';
+            } else if (decimalFormat === 'keepThree') {
+                decimals = Number(num).toFixed(3).split('.')[1] || '';
+            }
+        }
+        // 计算整数位长度
+        let len = needThousand.length;
+        // 如果整数位小于3,直接返回
+        if (len <= 3) {
+            return decimals ? needThousand + '.' + decimals : needThousand;
+        }
+        // 整数位大于3
+        else {
+            // 小数位后的值
+            let temp = '';
+            // 对整数取余
+            let remainder = len % 3;
+            if (decimals) {
+                temp = '.' + decimals;
+            }
+            if (remainder > 0) {
+                // 不是3的整数倍
+                return (
+                    needThousand.slice(0, remainder) +
+                    ',' +
+                    needThousand.slice(remainder, len).match(/\d{3}/g)?.join(',') +
+                    temp
+                );
+            } else {
+                // 3的整数倍
+                return needThousand.slice(0, len).match(/\d{3}/g)?.join(',') + temp;
+            }
+        }
     }
 
     /**
@@ -526,13 +600,12 @@
      * @return {String}
      */
     static transWeekIndexToDate(year, week, weekDay) {
-        const yearStart = moment([year, 0, 1]);
-        const dayLong = 24 * 60 * 60 * 1000;
-        const firstWeekLong = (7 - yearStart.day()) * dayLong;
-        const weeksLong = (week - 1) * 7 * dayLong;
-        const weekDayLong = weekDay * dayLong;
-        const dayTimestamp = yearStart.valueOf() + firstWeekLong + weeksLong + weekDayLong;
-        return moment(dayTimestamp).format('YYYY-MM-DD');
+        if (weekDay < 1 && weekDay > 7) {
+            return '';
+        }
+        const weekDate = moment(year + '-' + week, 'YYYY-WW');
+        const firstDay = weekDate.startOf('week');
+        return firstDay.add(weekDay - 1, 'day').format('YYYY-MM-DD');
     }
 
     /**
@@ -542,44 +615,68 @@
      * @param {Function} fnc
      * @param {Number} wait
      * @returns {Function}
+     * @tutorial Tools.debounce(<fnc>, <wait>)(<DebounceKey>)
      */
     static debounce(fnc, wait = 200) {
-        let timeout = null;
-        return function() {
-            const context = this;
-            const args = arguments;
-            if (timeout) {
-                clearTimeout(timeout);
+        return key => {
+            if (!key || !Tools.isString(key)) {
+                throw 'Debounce function need a key!';
             }
-            const callNow = !timeout;
-            timeout = setTimeout(() => {
-                timeout = null;
-            }, wait);
-            if (callNow) {
-                fnc.apply(context, args);
+            const timer = Tools.debounce['dKey-' + key];
+            if (timer) {
+                clearTimeout(timer);
             }
+            Tools.debounce['dKey-' + key] = setTimeout(fnc, wait);
         };
     }
 
     /**
-     * 节流函数(一段时间周期内,仅执行第一次回调)
+     * 节流函数(本段时间内,仅执行第一次回调)
      *  在一定时间内只能触发一次函数执行
      *  如果这个时间内再次触发,则忽略,直到下一个时间段再次触发
      * @param {Function} fnc
      * @param {Number} wait
-     * @returns {Function}
+     * @returns {function(key):void}
+     * @tutorial Tools.throttle(<fnc>, <wait>)(<ThrottleKey>)
      */
     static throttle(fnc, wait = 200) {
-        let previous = 0;
-        return function() {
-            const context = this;
-            const args = arguments;
-            const now = new Date();
+        return key => {
+            if (!key || !Tools.isString(key)) {
+                throw 'Throttle function need a key!';
+            }
+            const previous = Tools.throttle['tKey-' + key] || 0;
+            const now = Date.now();
             if (now - previous > wait) {
-                fnc.apply(context, args);
-                previous = now;
+                Tools.throttle['tKey-' + key] = now;
+                fnc();
             }
         };
+    }
+    /**
+     * 精确保留小数点几位数, 自动补零, 四舍五入
+     *  修复 toFixed 四舍六入五讨论的问题
+     * @param {Number|String} num 数值
+     * @param {Number} [digit=0] 小数点后位数
+     * @returns {String|NaN}
+     */
+    static accFixed(num, digit = 0) {
+        const number = parseFloat(num);
+        if (isNaN(number)) {
+            return NaN;
+        }
+        if (number >= 0) {
+            return (
+                Math.round((number + Number.EPSILON) * Math.pow(10, digit)) / Math.pow(10, digit)
+            ).toFixed(digit);
+        } else {
+            return (
+                '-' +
+                (
+                    Math.round((Math.abs(number) + Number.EPSILON) * Math.pow(10, digit)) /
+                    Math.pow(10, digit)
+                ).toFixed(digit)
+            );
+        }
     }
 }
 
@@ -599,5 +696,3 @@
         console.info(Math.round(px) + 'px');
     };
 }
-
-global.Tools = Tools;

--
Gitblit v1.9.1