/** * @description 链接地址是否为视频 * @param path * @return {boolean} */ const isVideo = (path) => { return /\.(mp4|avi|wmv|mpg|mpeg|mov|rm|ram|swf|flv)/.test(path); } /** * @description 图片预览 * @param url data-url="{url}" */ const previewImage = ({currentTarget: {dataset: { url }}}) => { if (!url) return; if (url.indexOf('http') === -1 || url.indexOf('https') === -1) { url = 'https://oss.flossom.com' + url; } wx.previewImage({ urls: [url] }) }; const formatTime = (date) => { const year = date.getFullYear(); const month = date.getMonth() + 1; const day = date.getDate(); const hour = date.getHours(); const minute = date.getMinutes(); const second = date.getSeconds(); return `${[year, month, day].map(formatNumber).join("/")} ${[ hour, minute, second, ] .map(formatNumber) .join(":")}`; }; const formatNumber = (n) => { n = n.toString(); return n[1] ? n : `0${n}`; }; const setdata = (that, key, value) => { that.setData({ [key]: value, }); }; const filertext = (text) => { return text.replace(/{/g, "").replace(/}/, "").replace(/"/g, ""); }; /** * 处理富文本里的图片宽度自适应 * 1.去掉img标签里的style、width、height属性 * 2.img标签添加style属性:max-width:100%;height:auto * 3.修改所有style里的width属性为max-width:100% * 4.去掉
标签 * @param html * @returns {void|string|*} */ const formatRichText = (html) => { let newContent = html.replace(/]*>/gi, (match) => { match = match.replace(/style="[^"]+"/gi, '') return match; }); newContent = newContent.replace(/style="[^"]+"/gi, (match) => { match = match.replace(/width:[^;]+;/gi, 'max-width:100%!important;') return match; }); newContent = newContent.replace(/\ { const year = new Date().getFullYear(); const month = new Date().getMonth() + 1; const day = new Date().getDate(); return ( year + "-" + String(month).padStart("2", 0) + "-" + String(day).padStart("2", 0) ); }; const getdates = (date) => { date = date.replace(/-/g, '/'); // 部分iphone new Date不兼容[2023-01-01]格式,需要转换 const year = new Date(date).getFullYear(); const month = new Date(date).getMonth() + 1; const day = new Date(date).getDate(); const hour = new Date(date).getHours(); const minute = new Date(date).getMinutes(); const second = new Date(date).getSeconds(); // return `${[year, month, day].map(formatNumber).join('-')} ${[hour, minute, second].map(formatNumber).join(':')}` return `${[year, month, day].map(formatNumber).join("-")}`; }; /** * 获取当前年份的第一天和最后一天 * @returns {string} 例如 2019-01-01~2019-12-31 */ const getYearFirstLastDay = () => { let firstDay = new Date(); firstDay.setDate(1); firstDay.setMonth(0); let lastDay = new Date(); lastDay.setFullYear(lastDay.getFullYear() + 2); lastDay.setDate(0); lastDay.setMonth(-1); firstDay = firstDay.Format("yyyy-MM-dd"); lastDay = lastDay.Format("yyyy-MM-dd"); return lastDay; }; //日期格式化方法Format()方法 // 对Date的扩展,将 Date 转化为指定格式的String // 月(M)、日(d)、小时(h)、分(m)、秒(s)、季度(q) 可以用 1-2 个占位符, // 年(y)可以用 1-4 个占位符,毫秒(S)只能用 1 个占位符(是 1-3 位的数字) // 例子: // (new Date()).Format("yyyy-MM-dd hh:mm:ss.S") ==> 2018-07-02 08:09:04.423 // (new Date()).Format("yyyy-M-d h:m:s.S") ==> 2018-7-2 8:9:4.18 Date.prototype.Format = function (fmt) { var o = { "M+": this.getMonth() + 1, //月份 "d+": this.getDate(), //日 "h+": this.getHours(), //小时 "m+": this.getMinutes(), //分 "s+": this.getSeconds(), //秒 "q+": Math.floor((this.getMonth() + 3) / 3), //季度 S: this.getMilliseconds(), //毫秒 }; if (/(y+)/.test(fmt)) fmt = fmt.replace( RegExp.$1, (this.getFullYear() + "").substr(4 - RegExp.$1.length) ); for (var k in o) if (new RegExp("(" + k + ")").test(fmt)) fmt = fmt.replace( RegExp.$1, RegExp.$1.length == 1 ? o[k] : ("00" + o[k]).substr(("" + o[k]).length) ); return fmt; }; /** * * ArrayBuffer转16进制字符串 */ const ab2hex = (buffer) => { var hexArr = Array.prototype.map.call(new Uint8Array(buffer), function (bit) { return ("00" + bit.toString(16)).slice(-2); }); return hexArr.join(""); }; /** * * */ const hex2int = (hex) => { var len = hex.length, a = new Array(len), code; for (var i = 0; i < len; i++) { code = hex.charCodeAt(i); if (48 <= code && code < 58) { code -= 48; } else { code = (code & 0xdf) - 65 + 10; } a[i] = code; } return a.reduce(function (acc, c) { acc = 16 * acc + c; return acc; }, 0); }; const keywordTofilter = (str) => { let arr = []; for (let i = 0, len = str.length; i < len; i += 2) { arr.push(str.slice(i, i + 2)); } for (let i = 0; i < arr.length; i++) { if (i == 0 || i == arr.length - 1) { continue; } if (arr[i] == "db") { arr[i] = "dccb"; } if (arr[i] == "dc") { arr[i] = "dccc"; } if (arr[i] == "de") { arr[i] = "dcce"; } } return arr.join(""); }; const filterData = (str) => { let data = str .replace(/dccc/g, "dc") .replace(/dccb/g, "db") .replace(/dcce/g, "de"); return data; }; const filterBleData = (str) => { let arr = []; let arr2 = []; let arr3 = []; for (let i = 0, len = str.length; i < len; i += 2) { arr.push(str.slice(i, i + 2)); } let index = 0; arr.map((item, i) => { if (item == "dc") { if (i + 1 !== arr.length - 1) { arr2[index].push("d" + arr[i + 1].substring(1, 2)); } return false; } if (item == "de") { arr2[index] = arr2[index].join(""); index += 1; } else { if (!Array.isArray(arr2[index])) { arr2[index] = []; } if (i !== 0) { if (arr[i - 1] !== "dc") { arr2[index].push(item); } } } }); arr2.map((item) => { // console.log(ccrc8('db'+item.substring(0,item.length-2)) , item.substring(item.length-2,item.length)) if ( ccrc8("db" + item.substring(0, item.length - 2)) == item.substring(item.length - 2, item.length) ) { arr3.push("db" + item + "de"); } }); return arr3; }; const ccrc8 = (str) => { let arr = []; for (let i = 0, len = str.length; i < len; i += 2) { arr.push("0x" + str.slice(i, i + 2)); } const crc8_854_table = [ 0, 94, 188, 226, 97, 63, 221, 131, 194, 156, 126, 32, 163, 253, 31, 65, 157, 195, 33, 127, 252, 162, 64, 30, 95, 1, 227, 189, 62, 96, 130, 220, 35, 125, 159, 193, 66, 28, 254, 160, 225, 191, 93, 3, 128, 222, 60, 98, 190, 224, 2, 92, 223, 129, 99, 61, 124, 34, 192, 158, 29, 67, 161, 255, 70, 24, 250, 164, 39, 121, 155, 197, 132, 218, 56, 102, 229, 187, 89, 7, 219, 133, 103, 57, 186, 228, 6, 88, 25, 71, 165, 251, 120, 38, 196, 154, 101, 59, 217, 135, 4, 90, 184, 230, 167, 249, 27, 69, 198, 152, 122, 36, 248, 166, 68, 26, 153, 199, 37, 123, 58, 100, 134, 216, 91, 5, 231, 185, 140, 210, 48, 110, 237, 179, 81, 15, 78, 16, 242, 172, 47, 113, 147, 205, 17, 79, 173, 243, 112, 46, 204, 146, 211, 141, 111, 49, 178, 236, 14, 80, 175, 241, 19, 77, 206, 144, 114, 44, 109, 51, 209, 143, 12, 82, 176, 238, 50, 108, 142, 208, 83, 13, 239, 177, 240, 174, 76, 18, 145, 207, 45, 115, 202, 148, 118, 40, 171, 245, 23, 73, 8, 86, 180, 234, 105, 55, 213, 139, 87, 9, 235, 181, 54, 104, 138, 212, 149, 203, 41, 119, 244, 170, 72, 22, 233, 183, 85, 11, 136, 214, 52, 106, 43, 117, 151, 201, 74, 20, 246, 168, 116, 42, 200, 150, 21, 75, 169, 247, 182, 232, 10, 84, 215, 137, 107, 53, ]; let crc = new Uint8Array(1); crc = 0; for (let i = 0; i < arr.length; i++) { crc = crc8_854_table[crc ^ (arr[i] & 0xff & 0xff)]; } return (crc & 0xff).toString(16).padStart("2", 0); }; const s_to_hs = (s) => { //计算分钟 //算法:将秒数除以60,然后下舍入,既得到分钟数 var h; h = Math.floor(s / 60); //计算秒 //算法:取得秒%60的余数,既得到秒数 s = s % 60; //将变量转换为字符串 h += ""; s += ""; //如果只有一位数,前面增加一个0 h = h.length == 1 ? "0" + h : h; s = s.length == 1 ? "0" + s : s; return h + ":" + s; }; const s_to_h = (s) => { //计算分钟 //算法:将秒数除以60,然后下舍入,既得到分钟数 var h; h = Math.floor(s / 60); //计算秒 //算法:取得秒%60的余数,既得到秒数 s = s % 60; //将变量转换为字符串 h += ""; s += ""; //如果只有一位数,前面增加一个0 h = h.length == 1 ? "0" + h : h; s = s.length == 1 ? "0" + s : s; return h; }; const s_to_s = (s) => { //计算分钟 //算法:将秒数除以60,然后下舍入,既得到分钟数 var h; h = Math.floor(s / 60); //计算秒 //算法:取得秒%60的余数,既得到秒数 s = s % 60; //将变量转换为字符串 h += ""; s += ""; //如果只有一位数,前面增加一个0 h = h.length == 1 ? "0" + h : h; s = s.length == 1 ? "0" + s : s; return s; }; // 分秒转换成秒 const minSecToS = (minSecStr) => { if (!minSecStr) return 0; let strArr = minSecStr.split(":"); console.info(strArr, 'strArr') return strArr.length ? parseInt(strArr[0]) * 60 + parseInt(strArr[1]) : 0; } // 将字符串转换成ArrayBufer const string2buffer = (str) => { let val = ""; if (!str) return; let length = str.length; let index = 0; let array = []; while (index < length) { array.push(str.substring(index, index + 2)); index = index + 2; } val = array.join(","); // 将16进制转化为ArrayBuffer return new Uint8Array( val.match(/[\da-f]{2}/gi).map(function (h) { return parseInt(h, 16); }) ).buffer; }; const checkEnd = (str) => { let itotal = 0, len = str.length, num = 0; while (num < len) { let s = str.substring(num, num + 2); itotal += parseInt(s, 16); num = num + 2; } let mode = itotal % 256; let shex = mode.toString(16); let iLen = shex.length; if (iLen < 2) { shex = "0" + shex; } return shex.toUpperCase(); }; const getofflineData = () => { //获取近7天的离线记录 let arr = []; for (let i = 0; i <= 6; i++) { let str1 = "dbf0a00201"; let num16 = i.toString(16).padStart("2", 0); let str2 = ccrc8(`${str1}${num16}`); arr.push(`${str1}${num16}${str2}de`); } return arr; }; const getUpgradeData = (info) => { //解析获取升级包更新数据 console.log(info); let arr = []; for (let i = 0, len = info.data.length; i < len; i += 480) { arr.push({ i: info.data.slice(i, i + 480), }); } arr.map((item, index) => { let num = Number(index + 1) .toString(16) .padStart("4", 0); let baohaodiwei = num.substring(2, 4); let baohaogaowei = num.substring(0, 2); let data = `dbf0ab01F7${info.length_low.padStart('2',0)}${info.length_high.padStart('2',0)}${info.bao_low.padStart('2',0)}${ info.bao_high.padStart('2',0) }${baohaodiwei.padStart('2',0)}${baohaogaowei.padStart('2',0)}${ index == arr.length - 1 ? (arr[index].i.length / 2).toString(16).padStart("2", 0) : "F0" }${item.i}`; item.i = `${data}${ccrc8(data)}de`; }); return arr; }; const checkEnd2 = (str) => { const crc8_854_table = [ 0, 94, 188, 226, 97, 63, 221, 131, 194, 156, 126, 32, 163, 253, 31, 65, 157, 195, 33, 127, 252, 162, 64, 30, 95, 1, 227, 189, 62, 96, 130, 220, 35, 125, 159, 193, 66, 28, 254, 160, 225, 191, 93, 3, 128, 222, 60, 98, 190, 224, 2, 92, 223, 129, 99, 61, 124, 34, 192, 158, 29, 67, 161, 255, 70, 24, 250, 164, 39, 121, 155, 197, 132, 218, 56, 102, 229, 187, 89, 7, 219, 133, 103, 57, 186, 228, 6, 88, 25, 71, 165, 251, 120, 38, 196, 154, 101, 59, 217, 135, 4, 90, 184, 230, 167, 249, 27, 69, 198, 152, 122, 36, 248, 166, 68, 26, 153, 199, 37, 123, 58, 100, 134, 216, 91, 5, 231, 185, 140, 210, 48, 110, 237, 179, 81, 15, 78, 16, 242, 172, 47, 113, 147, 205, 17, 79, 173, 243, 112, 46, 204, 146, 211, 141, 111, 49, 178, 236, 14, 80, 175, 241, 19, 77, 206, 144, 114, 44, 109, 51, 209, 143, 12, 82, 176, 238, 50, 108, 142, 208, 83, 13, 239, 177, 240, 174, 76, 18, 145, 207, 45, 115, 202, 148, 118, 40, 171, 245, 23, 73, 8, 86, 180, 234, 105, 55, 213, 139, 87, 9, 235, 181, 54, 104, 138, 212, 149, 203, 41, 119, 244, 170, 72, 22, 233, 183, 85, 11, 136, 214, 52, 106, 43, 117, 151, 201, 74, 20, 246, 168, 116, 42, 200, 150, 21, 75, 169, 247, 182, 232, 10, 84, 215, 137, 107, 53, ]; let crc = new Uint8Array(1); crc = 0; for (let i = 0; i < str.length; i++) { crc = crc8_854_table[crc ^ (str[i] & 0xff & 0xff)]; } return (crc & 0xff).toString(16).toUpperCase().padStart("2", 0); }; const checkEnd3 = (str) => { let arr = []; for (let i = 0, len = str.length; i < len; i += 2) { arr.push("0x" + str.slice(i, i + 2)); } const crc8_854_table = [ 0, 94, 188, 226, 97, 63, 221, 131, 194, 156, 126, 32, 163, 253, 31, 65, 157, 195, 33, 127, 252, 162, 64, 30, 95, 1, 227, 189, 62, 96, 130, 220, 35, 125, 159, 193, 66, 28, 254, 160, 225, 191, 93, 3, 128, 222, 60, 98, 190, 224, 2, 92, 223, 129, 99, 61, 124, 34, 192, 158, 29, 67, 161, 255, 70, 24, 250, 164, 39, 121, 155, 197, 132, 218, 56, 102, 229, 187, 89, 7, 219, 133, 103, 57, 186, 228, 6, 88, 25, 71, 165, 251, 120, 38, 196, 154, 101, 59, 217, 135, 4, 90, 184, 230, 167, 249, 27, 69, 198, 152, 122, 36, 248, 166, 68, 26, 153, 199, 37, 123, 58, 100, 134, 216, 91, 5, 231, 185, 140, 210, 48, 110, 237, 179, 81, 15, 78, 16, 242, 172, 47, 113, 147, 205, 17, 79, 173, 243, 112, 46, 204, 146, 211, 141, 111, 49, 178, 236, 14, 80, 175, 241, 19, 77, 206, 144, 114, 44, 109, 51, 209, 143, 12, 82, 176, 238, 50, 108, 142, 208, 83, 13, 239, 177, 240, 174, 76, 18, 145, 207, 45, 115, 202, 148, 118, 40, 171, 245, 23, 73, 8, 86, 180, 234, 105, 55, 213, 139, 87, 9, 235, 181, 54, 104, 138, 212, 149, 203, 41, 119, 244, 170, 72, 22, 233, 183, 85, 11, 136, 214, 52, 106, 43, 117, 151, 201, 74, 20, 246, 168, 116, 42, 200, 150, 21, 75, 169, 247, 182, 232, 10, 84, 215, 137, 107, 53, ]; let crc = new Uint8Array(1); crc = 0; for (let i = 0; i < arr.length; i++) { crc = crc8_854_table[crc ^ (arr[i] & 0xff & 0xff)]; } return (crc & 0xff).toString(16).toUpperCase().padStart("2", 0); }; const chulidata = (str) => { let data = str .replace(/dccc/g, "dc") .replace(/dccb/g, "db") .replace(/dcce/g, "de"); return data; }; const chulidata2 = (str) => { let data = str .replace(/DCCC/g, "dc") .replace(/DCCB/g, "db") .replace(/DCCE/g, "de"); return data; }; const getimpedanceList = () => { let arr = []; for(let i = 1;i<=10;i++){ arr.push({ num: 0, time: `00:${String(i).padStart('2',0)}` }) } return arr; }; /** * 处理上报数据,转换成对象 */ const getreportData = (str) =>{ let data = {}; data.status = hex2int(str.substring(10,12));//工作状态 data.quantity = hex2int(str.substring(20,22));//电量 data.impedance1 = hex2int(str.substring(24,26));//阻抗低位数据 data.impedance2 = hex2int(str.substring(26,28));//阻抗低位数据 data.jiaoer1 = hex2int(str.substring(28,30));//每秒能量N*10 焦耳(N: 0~25.5 data.mode = hex2int(str.substring(12,14));//模式 data.position = hex2int(str.substring(14,16));//档位 //TOREAD 当模式为水份模式 if(data.mode == 6){ data.waterLevel = hex2int(str.substring(16,18)) data.waterPercent = hex2int(str.substring(18,20)) //模式为水份测试时 档位1~3对应 0x01:测试成功 0x02: 测试中 0x03: 测试错误 const testResultMap = ['TEST_UNKNOW_STATUS','TEST_SUCCESS','TEST_PROCESSING','TEST_FAIL']; data.testResult = testResultMap[data.position]||'TEST_UNKNOW_STATUS' } return data; } /** * height 高位 * low 低位 * 阻抗算法 * 阻抗低位数据 + 阻抗高位数据 * 256 * 如果以上公式 >=701 固定 701 * <=200 1档 * <=280 2挡 * <=360 3档 * <=440 4挡 * <=520 5挡 * <=600 6挡 * <=700 7挡 * >=701 8挡 */ const DYNAMIC_BONES_OFFSETS = (height,low) =>{ let total = Number(low)+Number(height)*256; if(total<=200){ return 1 } if(total<=280){ return 2 } if(total<=360){ return 3 } if(total<=440){ return 4 } if(total<=520){ return 5 } if(total<=600){ return 6 } if(total<=700){ return 7 } if(total>=701){ return 8 } } const getTimeCode = () =>{ let year = new Date().getFullYear(); let month = String(new Date().getMonth() + 1).padStart("2", 0); let day = String(new Date().getDate()).padStart("2", 0); let hour = String(new Date().getHours()).padStart("2", 0); let points = String(new Date().getMinutes()).padStart("2", 0); let seconds = String(new Date().getSeconds()).padStart("2", 0); let value = `dbf0a0010b${Number(String(year).substring(0, 2)).toString(16)}${Number(String(year).substring(2, 4)).toString(16)}${Number(month).toString(16).padStart("2", 0)}${Number(day).toString(16).padStart("2", 0)}${Number(hour).toString(16).padStart("2", 0)}${Number(points).toString(16).padStart("2", 0)}${Number(seconds).toString(16).padStart("2", 0)}00000000`; value = `${value}${ccrc8(value)}de`; return value; } /** * @param currentVersionNo * @param latestVersionNo * @returns needToUpdate */ const isNeedToUpdate = (currentVersionNo,latestVersionNo)=>{ if (!currentVersionNo || !latestVersionNo) return false; let needToUpdate = false; //硬件版本号相同 let sameHardwareNo = latestVersionNo.substring(0, 2) == currentVersionNo.substring(0, 2); //软件版本号当前版本比最新版的旧 let latestValue = parseInt(latestVersionNo.substring(2, 6), 16); let currentValue = parseInt(currentVersionNo.substring(2, 6), 16); let solftwareNoNeedToUpdate = latestValue > currentValue; needToUpdate = sameHardwareNo && solftwareNoNeedToUpdate return needToUpdate } /** * @param compareVersion * @returns result 1:SDKVersion > version 0:SDKVersion == version -1:SDKVersion < version */ const compareVersion = (version)=>{ const systemInfo = wx.getSystemInfoSync(); let SDKVersion = systemInfo.SDKVersion.split('.'); version = version.split('.'); const len = Math.max(SDKVersion.length, version.length) while (SDKVersion.length < len) { SDKVersion.push('0') } while (version.length < len) { version.push('0') } for (let i = 0; i < len; i++) { const num1 = parseInt(SDKVersion[i]) const num2 = parseInt(version[i]) if (num1 > num2) { return 1 } else if (num1 < num2) { return -1 } } return 0 } /** * @param checkSameKey * @returns boolean */ const checkSameKey = (array1, array2, key)=>{ for (var i = 0; i < array1.length; i++) { for (var j = 0; j < array2.length; j++) { if (array1[i][key] === array2[j][key]) { return true; } } } return false; } module.exports = { isVideo, previewImage, formatTime, setdata, filertext, formatRichText, date, getdates, getYearFirstLastDay, ab2hex, hex2int, filterData, ccrc8, //crc8校验位 string2buffer, //将字符串转换成ArrayBufer s_to_hs, //秒转换成分秒 checkEnd, //相加和 filterBleData, getofflineData, getUpgradeData, keywordTofilter, checkEnd2, checkEnd3, chulidata, chulidata2, getimpedanceList, DYNAMIC_BONES_OFFSETS, //阻抗获取值 getreportData, //解析上报数据 s_to_h, s_to_s, minSecToS, getTimeCode, //同步时间指令 isNeedToUpdate, compareVersion, checkSameKey };