| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111 | 
							- 'use strict';
 
- /**
 
-  *
 
-  *
 
-  * @author Mai
 
-  * @date
 
-  * @version
 
-  */
 
- const allNumReg = /^[0-9]+$/;
 
- const suffixNumReg = /[0-9]+$/;
 
- const mainReg = /^((GD*)|G)?(\d\d)*\d$/i;
 
- const subReg = /^((GD*)|G)?[A-Z]{2}(\d\d)+$/i;
 
- const gdXmjPartReg = /^((GD*)|G)/;
 
- // 路基、路面、涵洞、、桥梁、隧道、交通安全、隧道机电、绿化、其他、房建、专项评估
 
- const subXmjPrefixReplace = [
 
-     { str: 'LJ', num: '110', },
 
-     { str: 'LM', num: '120', },
 
-     { str: 'HD', num: '130', },
 
-     { str: 'TD', num: '140', },
 
-     { str: 'QL', num: '150', },
 
-     { str: 'SD', num: '160', },
 
-     { str: 'JA', num: '170', },
 
-     { str: 'SJ', num: '180', },
 
-     { str: 'LH', num: '190', },
 
-     { str: 'QT', num: '210', },
 
-     { str: 'FJ', num: '211', },
 
-     { str: 'ZP', num: '212', },
 
- ];
 
- const findSubXmjPrefixNum = function (str) {
 
-     for (const p of subXmjPrefixReplace) {
 
-         if (str.indexOf(p.str) >= 0)
 
-             return p.num;
 
-     }
 
-     return '999';
 
- };
 
- const subXmjToNumStr = function (str) {
 
-     const num = str.match(suffixNumReg);
 
-     return findSubXmjPrefixNum(str) + (num ? num[0] : '') + (gdXmjPartReg.test(str) ? 1 : 0);
 
- };
 
- module.exports = {
 
-     reg: {
 
-         mainXmj: mainReg,
 
-         subXmj: subReg,
 
-         gdXmjPartReg: gdXmjPartReg,
 
-     },
 
-     /**
 
-      * 用于比较1-1类型项目节编号,或者202-1-a/202-2-3类型工程量清单
 
-      *
 
-      * @param str1
 
-      * @param str2
 
-      * @param symbol
 
-      */
 
-     defaultCompareCode: function (str1, str2, symbol = '-') {
 
-         if (!str1) {
 
-             return 1;
 
-         } else if (!str2) {
 
-             return -1;
 
-         }
 
-         function compareSubCode(code1, code2) {
 
-             if (allNumReg.test(code1)) {
 
-                 if (allNumReg.test(code2)) {
 
-                     return parseInt(code1) - parseInt(code2);
 
-                 }
 
-                 return -1;
 
-             }
 
-             if (allNumReg.test(code2)) {
 
-                 return 1;
 
-             }
 
-             return code1 === code2 ? 0 : (code1 < code2 ? -1 : 1); // code1.localeCompare(code2);
 
-         }
 
-         const aCodes = str1.split(symbol),
 
-             bCodes = str2.split(symbol);
 
-         for (let i = 0, iLength = Math.min(aCodes.length, bCodes.length); i < iLength; ++i) {
 
-             const iCompare = compareSubCode(aCodes[i], bCodes[i]);
 
-             if (iCompare !== 0) {
 
-                 return iCompare;
 
-             }
 
-         }
 
-         return aCodes.length - bCodes.length;
 
-     },
 
-     compare18MainXmj(str1, str2) {
 
-         if (str1.length < str2.length) {
 
-             return -1;
 
-         } else if (str1.length > str2.length) {
 
-             return 1;
 
-         } else {
 
-             const num1 = str1.match(suffixNumReg)[0], num2 = str2.match(suffixNumReg)[0];
 
-             return num1.localeCompare(num2);
 
-         }
 
-     },
 
-     compare18SubXmj(str1, str2) {
 
-         const numStr1 = subXmjToNumStr(str1), numStr2 = subXmjToNumStr(str2);
 
-         return numStr1.localeCompare(numStr2);
 
-     },
 
-     compareCode(str1, str2) {
 
-         if (mainReg.test(str1)) {
 
-             return this.compare18MainXmj(str1, str2);
 
-         }
 
-         if (subReg.test(str2)) {
 
-             return this.compare18SubXmj(str1, str2);
 
-         }
 
-         return this.defaultCompareCode(str1, str2);
 
-     }
 
- };
 
 
  |