OrderUtils.js 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180
  1. // 62进制列表,按序对应10进制的0~61
  2. let list62 = [
  3. '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
  4. 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j',
  5. 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't',
  6. 'u', 'v', 'w', 'x', 'y', 'z', 'A', 'B', 'C', 'D',
  7. 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N',
  8. 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X',
  9. 'Y', 'Z'
  10. ];
  11. // 62进制转10进制的map
  12. let map1 = {};
  13. // 10进制转62进制的map
  14. let map2 = {};
  15. for (let i = 0; i < list62.length; i++) {
  16. const v = list62[i];
  17. map1[v] = i;
  18. map2[i] = v;
  19. }
  20. let orderRandNum = 0;
  21. module.exports = {
  22. // 新建32位订单
  23. newOrderId32 (uid, gid, channelId) {
  24. let date = new Date();
  25. let time = Math.floor(date.getTime() / 1000);
  26. let num = this._newOrderRandNum() % 10;
  27. // 订单末尾是 _1,用于表示是H5的订单。旧的APP是以_0结尾的
  28. // 10+1 + 1+3 + 1+9 +1+4 +2 = 32位
  29. let timeStr = this._numberPadding(time, 10);
  30. let channelStr = this._numberPadding(channelId, 3);
  31. let uidStr = this._numberPadding(uid, 9);
  32. let gidStr = this._numberPadding(gid, 4);
  33. let orderId = cc.js.formatStr('%s%d_%s_%s_%s_1', timeStr, num, channelStr, uidStr, gidStr);
  34. return orderId;
  35. },
  36. // 新增11位订单(百度专用)
  37. newOrderId11 (uid, gid) {
  38. let num = this._newOrderRandNum() % 1000;
  39. let orderId = this._encodeOrderId11(uid, gid, num);
  40. return orderId;
  41. },
  42. // 获取新的去重数
  43. _newOrderRandNum () {
  44. orderRandNum = orderRandNum + 1;
  45. return orderRandNum;
  46. },
  47. /* 编码11位订单id
  48. uid: 账号
  49. gid: 商品id
  50. randomIndex: 随机序号(3位数)
  51. */
  52. _encodeOrderId11 (uid, gid, randomIndex) {
  53. let orderNumber = this._numberPadding(uid, 9) +
  54. this._numberPadding(randomIndex, 3) +
  55. this._numberPadding(gid, 4);
  56. let orderId = this._orderNumberToId(orderNumber);
  57. return orderId;
  58. },
  59. /* 解码11位订单id
  60. 返回:
  61. uid: 账号
  62. gid: 商品id
  63. */
  64. _decodeOrderId11 (orderId) {
  65. let orderNumber = this._orderIdToNumber(orderId);
  66. let uidStr = orderNumber.substring(0, 9);
  67. let gidStr = orderNumber.substring(12, 16);
  68. let ret = {
  69. uid: parseInt(uidStr),
  70. gid: parseInt(gidStr)
  71. };
  72. return ret;
  73. },
  74. // 给数字前补“0”
  75. _numberPadding (num, length, char = '0') {
  76. for (let len = (num + '').length; len < length; len++) {
  77. num = char + num;
  78. }
  79. return num;
  80. },
  81. // 10进制字符串转62进制字符串
  82. _num10To62 (num10) {
  83. let ret = '';
  84. let num = parseInt(num10);
  85. while (num != 0) {
  86. let m = num % 62;
  87. let c = map2[m];
  88. ret = c + ret;
  89. num = (num - m) / 62;
  90. }
  91. return ret;
  92. },
  93. // 62进制字符串转10进制字符串
  94. _num62To10 (num62) {
  95. let ret = 0;
  96. let j = 1;
  97. for (let i = num62.length - 1; i >= 0; i--) {
  98. let c = num62.substring(i, i + 1);
  99. let n = map1[c];
  100. ret = ret + n * j;
  101. j = j * 62;
  102. }
  103. return ret;
  104. },
  105. // 将订单编码转成订单id
  106. _orderNumberToId (orderNumber) {
  107. // 1~9位是9位的10进制,转成5位的62进制。不足5位时,补0凑够5位
  108. let str1 = orderNumber.substring(0, 9);
  109. let s1 = this._num10To62(str1);
  110. for (let i = 0; i < 5 - s1.length; i++) {
  111. s1 = '0' + s1;
  112. }
  113. // 10~16位是7位的10进制,转成4位的62进制。不足4位时,补0凑够4位
  114. let str2 = orderNumber.substring(9, 16);
  115. let s2 = this._num10To62(str2);
  116. for (let i = 0; i < 4 - s2.length; i++) {
  117. s2 = '0' + s2;
  118. }
  119. // 上面2段拼起来,再加SS前缀
  120. let orderId = 'SS' + s1 + s2;
  121. return orderId;
  122. },
  123. // 将订单id转成订单编码
  124. _orderIdToNumber (orderId) {
  125. // 3~7位是5位的62进制,转成9位的10进制
  126. let str1 = orderId.substring(2, 7);
  127. let num1 = this._num62To10(str1);
  128. // 8~11位是4位的62进制,转成7位的10进制
  129. let str2 = orderId.substring(7, 11);
  130. let num2 = this._num62To10(str2);
  131. // 不足位时,补0凑够位
  132. let ret = this._numberPadding(num1, 9) + this._numberPadding(num2, 7);
  133. return ret;
  134. },
  135. // 测试用例
  136. test () {
  137. let uid = 787654321;
  138. let gid = 9999;
  139. let randomIndex = 2;
  140. let orderId11 = this._encodeOrderId11(uid, gid, randomIndex);
  141. let tbl = this._decodeOrderId11(orderId11);
  142. console.log('source:', uid, gid, randomIndex);
  143. console.log('result:', orderId11);
  144. console.log('unresult:', tbl.uid, tbl.gid);
  145. let orderId22 = 'SSRiURX07NR';
  146. let tbl22 = this._decodeOrderId11(orderId22);
  147. console.log('SSRiURX07NR', tbl22.uid, tbl22.gid);
  148. }
  149. };