123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180 |
- // 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);
- }
- };
|