db2full_code.js 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142
  1. 'use strict';
  2. /**
  3. * 需要 export_excel.js
  4. *
  5. * @author Mai
  6. * @date
  7. * @version
  8. */
  9. const dbFullCode = {
  10. loadSheet: function (rows) {
  11. this.dealBills = [];
  12. let iCode = -1, iName = -1, iUnit = -1, iUp = -1, iQty = -1, iTp = -1, bCheckCol = false;
  13. for (let iRow = 0; iRow < rows.length; iRow++) {
  14. const row = rows[iRow];
  15. if (!bCheckCol) {
  16. for (let iCol = 0; iCol < row.length; iCol++) {
  17. let value = row[iCol];
  18. if (typeof value !== "string") { continue }
  19. value = _.trim(value);
  20. if (value === '子目号' || value === '清单编号') iCode = iCol;
  21. if (value.indexOf('名称') >= 0) iName = iCol;
  22. if (value.indexOf('单位') >= 0) iUnit = iCol;
  23. if (value.indexOf('单价') >= 0) iUp = iCol;
  24. if (value.indexOf('数量') >= 0) iQty = iCol;
  25. if (value.indexOf('金额') >= 0 || value.indexOf('合价') >= 0) iTp = iCol;
  26. }
  27. bCheckCol = (iCode >= 0 && iName >= 0 && iUnit >= 0 && iUp >= 0 && iQty >= 0 && iTp >= 0);
  28. if (!bCheckCol) {
  29. iCode = -1;
  30. iName = -1;
  31. iUnit = -1;
  32. iUp = -1;
  33. iQty = -1;
  34. iTp = -1;
  35. }
  36. } else {
  37. const code = cleanSymbols(_.trim(row[iCode]));
  38. if (!code) continue;
  39. this.dealBills.push({
  40. code: code,
  41. org_code: row[iCode],
  42. name: cleanSymbols(row[iName]),
  43. unit: cleanSymbols(row[iUnit]),
  44. unit_price: row[iUp],
  45. quantity: row[iQty],
  46. total_price: row[iTp],
  47. });
  48. }
  49. }
  50. if (!bCheckCol) {
  51. throw '导入的Excel表头定义有误,请下载示例检查';
  52. }
  53. },
  54. loadXlsx: function () {
  55. const dbfile = $('#db-full-code-file')[0];
  56. xlsxUtils.import(dbfile.files[0], () => {
  57. try {
  58. dbFullCode.loadSheet(xlsxUtils.getSheetByIndex(0, {header: 1}));
  59. document.getElementById('db-full-code-change').disabled = false;
  60. } catch (err) {
  61. console.log(err);
  62. if (err.stack) {
  63. toastr.error('该文件不支持转换,请选择其他文件');
  64. } else {
  65. toastr.warning(err);
  66. }
  67. }
  68. });
  69. },
  70. clear: function () {
  71. const file = document.getElementById('db-full-code-file');
  72. file.outerHTML = file.outerHTML;
  73. document.getElementById('db-full-code-change').disabled = true;
  74. $('#db-full-code-file').change(dbFullCode.loadXlsx);
  75. },
  76. _completeFullCode: function (b, index) {
  77. for (let j = index-1; j >= 0; j--) {
  78. if (this.dealBills[j].tag === -1) continue;
  79. if (this.dealBills[j].tag !== b.tag && this.dealBills[j].level < 4) {
  80. b.full_code = this.dealBills[j].full_code + b.code;
  81. b.level = this.dealBills[j].level + 1;
  82. return;
  83. }
  84. }
  85. },
  86. change: function () {
  87. const regChar = /^-[a-zA-Z]$/, regNum = /^-[0-9]{1,2}$/, regCode = /^[0-9]{3,4}((-[0-9]{1,2})|(-[a-zA-Z]))*$/;
  88. let invalid = 0;
  89. for (const [i, db] of this.dealBills.entries()) {
  90. if (regCode.test(db.code)) {
  91. db.tag = 0;
  92. db.full_code = db.code;
  93. db.level = db.full_code.split('-').length;
  94. } else if (regNum.test(db.code)) {
  95. db.tag = 1;
  96. this._completeFullCode(db, i);
  97. } else if (regChar.test(db.code)) {
  98. db.tag = 2;
  99. this._completeFullCode(db, i);
  100. } else {
  101. db.tag = -1;
  102. db.full_code = '';
  103. invalid += 1;
  104. }
  105. }
  106. if (invalid > 0) toastr.warning(`存在${invalid}条清单编号非法,请仔细对照原编号检查`);
  107. },
  108. save() {
  109. const setting = {
  110. cols: [
  111. {title: '清单编号', colSpan: '1', rowSpan: '1', field: 'full_code', hAlign: 0, width: 100, formatter: '@'},
  112. {title: '原编号', colSpan: '1', rowSpan: '1', field: 'org_code', hAlign: 0, width: 60, formatter: '@'},
  113. {title: '名称', colSpan: '1', rowSpan: '1', field: 'name', hAlign: 0, width: 300, formatter: '@'},
  114. {title: '单位', colSpan: '1', rowSpan: '1', field: 'unit', hAlign: 1, width: 60, formatter: '@'},
  115. {title: '单价', colSpan: '1', rowSpan: '1', field: 'unit_price', hAlign: 2, width: 80, type: 'Number'},
  116. {title: '数量', colSpan: '1', rowSpan: '1', field: 'quantity', hAlign: 2, width: 80, type: 'Number'},
  117. {title: '合价', colSpan: '1', rowSpan: '1', field: 'total_price', hAlign: 2, width: 80, type: 'Number'},
  118. ],
  119. headRows: 1,
  120. headRowHeight: [32],
  121. defaultRowHeight: 21,
  122. headerFont: 'bold 10px 微软雅黑',
  123. font: '10px 微软雅黑'
  124. };
  125. const orgFileName = $('#db-full-code-file')[0].files[0].name;
  126. const pointIndex = orgFileName.lastIndexOf('.');
  127. SpreadExcelObj.exportSimpleXlsxSheet(setting, this.dealBills, orgFileName.substring(0, pointIndex) + "-长编号.xlsx");
  128. },
  129. changeAndSave() {
  130. dbFullCode.change();
  131. dbFullCode.save();
  132. }
  133. };
  134. $(document).ready(() => {
  135. $('#db-full-code').on('show.bs.modal', () => {
  136. dbFullCode.clear();
  137. });
  138. $('#db-full-code-change').click(dbFullCode.changeAndSave);
  139. });