bills_utils.js 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. 'use strict';
  2. /**
  3. *
  4. *
  5. * @author Mai
  6. * @date
  7. * @version
  8. */
  9. const allNumReg = /^[0-9]+$/;
  10. const suffixNumReg = /[0-9]+$/;
  11. const mainReg = /^((GD*)|G)?(\d\d)*\d$/i;
  12. const subReg = /^((GD*)|G)?[A-Z]{2}(\d\d)+$/i;
  13. const gdXmjPartReg = /^((GD*)|G)/;
  14. // 路基、路面、涵洞、、桥梁、隧道、交通安全、隧道机电、绿化、其他、房建、专项评估
  15. const subXmjPrefixReplace = [
  16. { str: 'LJ', num: '110', },
  17. { str: 'LM', num: '120', },
  18. { str: 'HD', num: '130', },
  19. { str: 'TD', num: '140', },
  20. { str: 'QL', num: '150', },
  21. { str: 'SD', num: '160', },
  22. { str: 'JA', num: '170', },
  23. { str: 'SJ', num: '180', },
  24. { str: 'LH', num: '190', },
  25. { str: 'QT', num: '210', },
  26. { str: 'FJ', num: '211', },
  27. { str: 'ZP', num: '212', },
  28. ];
  29. const findSubXmjPrefixNum = function (str) {
  30. for (const p of subXmjPrefixReplace) {
  31. if (str.indexOf(p.str) >= 0)
  32. return p.num;
  33. }
  34. return '999';
  35. };
  36. const subXmjToNumStr = function (str) {
  37. const num = str.match(suffixNumReg);
  38. return findSubXmjPrefixNum(str) + (num ? num[0] : '') + (gdXmjPartReg.test(str) ? 1 : 0);
  39. };
  40. module.exports = {
  41. reg: {
  42. mainXmj: mainReg,
  43. subXmj: subReg,
  44. gdXmjPartReg: gdXmjPartReg,
  45. },
  46. /**
  47. * 用于比较1-1类型项目节编号,或者202-1-a/202-2-3类型工程量清单
  48. *
  49. * @param str1
  50. * @param str2
  51. * @param symbol
  52. */
  53. defaultCompareCode: function (str1, str2, symbol = '-') {
  54. if (!str1) {
  55. return 1;
  56. } else if (!str2) {
  57. return -1;
  58. }
  59. function compareSubCode(code1, code2) {
  60. if (allNumReg.test(code1)) {
  61. if (allNumReg.test(code2)) {
  62. return parseInt(code1) - parseInt(code2);
  63. }
  64. return -1;
  65. }
  66. if (allNumReg.test(code2)) {
  67. return 1;
  68. }
  69. return code1 === code2 ? 0 : (code1 < code2 ? -1 : 1); // code1.localeCompare(code2);
  70. }
  71. const aCodes = str1.split(symbol),
  72. bCodes = str2.split(symbol);
  73. for (let i = 0, iLength = Math.min(aCodes.length, bCodes.length); i < iLength; ++i) {
  74. const iCompare = compareSubCode(aCodes[i], bCodes[i]);
  75. if (iCompare !== 0) {
  76. return iCompare;
  77. }
  78. }
  79. return aCodes.length - bCodes.length;
  80. },
  81. compare18MainXmj(str1, str2) {
  82. if (str1.length < str2.length) {
  83. return -1;
  84. } else if (str1.length > str2.length) {
  85. return 1;
  86. } else {
  87. const num1 = str1.match(suffixNumReg)[0], num2 = str2.match(suffixNumReg)[0];
  88. return num1.localeCompare(num2);
  89. }
  90. },
  91. compare18SubXmj(str1, str2) {
  92. const numStr1 = subXmjToNumStr(str1), numStr2 = subXmjToNumStr(str2);
  93. return numStr1.localeCompare(numStr2);
  94. },
  95. compareCode(str1, str2) {
  96. if (mainReg.test(str1)) {
  97. return this.compare18MainXmj(str1, str2);
  98. }
  99. if (subReg.test(str2)) {
  100. return this.compare18SubXmj(str1, str2);
  101. }
  102. return this.defaultCompareCode(str1, str2);
  103. }
  104. };