// 62进制列表,按序对应10进制的0~61 let list62 = [ '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z' ]; // 62进制转10进制的map let map1 = {}; // 10进制转62进制的map let map2 = {}; for (let i = 0; i < list62.length; i++) { const v = list62[i]; map1[v] = i; map2[i] = v; } let orderRandNum = 0; module.exports = { // 新建32位订单 newOrderId32 (uid, gid, channelId) { let date = new Date(); let time = Math.floor(date.getTime() / 1000); let num = this._newOrderRandNum() % 10; // 订单末尾是 _1,用于表示是H5的订单。旧的APP是以_0结尾的 // 10+1 + 1+3 + 1+9 +1+4 +2 = 32位 let timeStr = this._numberPadding(time, 10); let channelStr = this._numberPadding(channelId, 3); let uidStr = this._numberPadding(uid, 9); let gidStr = this._numberPadding(gid, 4); let orderId = cc.js.formatStr('%s%d_%s_%s_%s_1', timeStr, num, channelStr, uidStr, gidStr); return orderId; }, // 新增11位订单(百度专用) newOrderId11 (uid, gid) { let num = this._newOrderRandNum() % 1000; let orderId = this._encodeOrderId11(uid, gid, num); return orderId; }, // 获取新的去重数 _newOrderRandNum () { orderRandNum = orderRandNum + 1; return orderRandNum; }, /* 编码11位订单id uid: 账号 gid: 商品id randomIndex: 随机序号(3位数) */ _encodeOrderId11 (uid, gid, randomIndex) { let orderNumber = this._numberPadding(uid, 9) + this._numberPadding(randomIndex, 3) + this._numberPadding(gid, 4); let orderId = this._orderNumberToId(orderNumber); return orderId; }, /* 解码11位订单id 返回: uid: 账号 gid: 商品id */ _decodeOrderId11 (orderId) { let orderNumber = this._orderIdToNumber(orderId); let uidStr = orderNumber.substring(0, 9); let gidStr = orderNumber.substring(12, 16); let ret = { uid: parseInt(uidStr), gid: parseInt(gidStr) }; return ret; }, // 给数字前补“0” _numberPadding (num, length, char = '0') { for (let len = (num + '').length; len < length; len++) { num = char + num; } return num; }, // 10进制字符串转62进制字符串 _num10To62 (num10) { let ret = ''; let num = parseInt(num10); while (num != 0) { let m = num % 62; let c = map2[m]; ret = c + ret; num = (num - m) / 62; } return ret; }, // 62进制字符串转10进制字符串 _num62To10 (num62) { let ret = 0; let j = 1; for (let i = num62.length - 1; i >= 0; i--) { let c = num62.substring(i, i + 1); let n = map1[c]; ret = ret + n * j; j = j * 62; } return ret; }, // 将订单编码转成订单id _orderNumberToId (orderNumber) { // 1~9位是9位的10进制,转成5位的62进制。不足5位时,补0凑够5位 let str1 = orderNumber.substring(0, 9); let s1 = this._num10To62(str1); for (let i = 0; i < 5 - s1.length; i++) { s1 = '0' + s1; } // 10~16位是7位的10进制,转成4位的62进制。不足4位时,补0凑够4位 let str2 = orderNumber.substring(9, 16); let s2 = this._num10To62(str2); for (let i = 0; i < 4 - s2.length; i++) { s2 = '0' + s2; } // 上面2段拼起来,再加SS前缀 let orderId = 'SS' + s1 + s2; return orderId; }, // 将订单id转成订单编码 _orderIdToNumber (orderId) { // 3~7位是5位的62进制,转成9位的10进制 let str1 = orderId.substring(2, 7); let num1 = this._num62To10(str1); // 8~11位是4位的62进制,转成7位的10进制 let str2 = orderId.substring(7, 11); let num2 = this._num62To10(str2); // 不足位时,补0凑够位 let ret = this._numberPadding(num1, 9) + this._numberPadding(num2, 7); return ret; }, // 测试用例 test () { let uid = 787654321; let gid = 9999; let randomIndex = 2; let orderId11 = this._encodeOrderId11(uid, gid, randomIndex); let tbl = this._decodeOrderId11(orderId11); console.log('source:', uid, gid, randomIndex); console.log('result:', orderId11); console.log('unresult:', tbl.uid, tbl.gid); let orderId22 = 'SSRiURX07NR'; let tbl22 = this._decodeOrderId11(orderId22); console.log('SSRiURX07NR', tbl22.uid, tbl22.gid); } };