'use strict'; /** * 需要 export_excel.js * * @author Mai * @date * @version */ const dbFullCode = { loadSheet: function (rows) { this.dealBills = []; let iCode = -1, iName = -1, iUnit = -1, iUp = -1, iQty = -1, iTp = -1, bCheckCol = false; for (let iRow = 0; iRow < rows.length; iRow++) { const row = rows[iRow]; if (!bCheckCol) { for (let iCol = 0; iCol < row.length; iCol++) { let value = row[iCol]; if (typeof value !== "string") { continue } value = _.trim(value); if (value === '子目号' || value === '清单编号') iCode = iCol; if (value.indexOf('名称') >= 0) iName = iCol; if (value.indexOf('单位') >= 0) iUnit = iCol; if (value.indexOf('单价') >= 0) iUp = iCol; if (value.indexOf('数量') >= 0) iQty = iCol; if (value.indexOf('金额') >= 0 || value.indexOf('合价') >= 0) iTp = iCol; } bCheckCol = (iCode >= 0 && iName >= 0 && iUnit >= 0 && iUp >= 0 && iQty >= 0 && iTp >= 0); if (!bCheckCol) { iCode = -1; iName = -1; iUnit = -1; iUp = -1; iQty = -1; iTp = -1; } } else { const code = cleanSymbols(_.trim(row[iCode])); if (!code) continue; this.dealBills.push({ code: code, org_code: row[iCode], name: cleanSymbols(row[iName]), unit: cleanSymbols(row[iUnit]), unit_price: row[iUp], quantity: row[iQty], total_price: row[iTp], }); } } if (!bCheckCol) { throw '导入的Excel表头定义有误,请下载示例检查'; } }, loadXlsx: function () { const dbfile = $('#db-full-code-file')[0]; xlsxUtils.import(dbfile.files[0], () => { try { dbFullCode.loadSheet(xlsxUtils.getSheetByIndex(0, {header: 1})); document.getElementById('db-full-code-change').disabled = false; } catch (err) { console.log(err); if (err.stack) { toastr.error('该文件不支持转换,请选择其他文件'); } else { toastr.warning(err); } } }); }, clear: function () { const file = document.getElementById('db-full-code-file'); file.outerHTML = file.outerHTML; document.getElementById('db-full-code-change').disabled = true; $('#db-full-code-file').change(dbFullCode.loadXlsx); }, _completeFullCode: function (b, index) { for (let j = index-1; j >= 0; j--) { if (this.dealBills[j].tag === -1) continue; if (this.dealBills[j].tag !== b.tag && this.dealBills[j].level < 4) { b.full_code = this.dealBills[j].full_code + b.code; b.level = this.dealBills[j].level + 1; return; } } }, change: function () { const regChar = /^-[a-zA-Z]$/, regNum = /^-[0-9]{1,2}$/, regCode = /^[0-9]{3,4}((-[0-9]{1,2})|(-[a-zA-Z]))*$/; let invalid = 0; for (const [i, db] of this.dealBills.entries()) { if (regCode.test(db.code)) { db.tag = 0; db.full_code = db.code; db.level = db.full_code.split('-').length; } else if (regNum.test(db.code)) { db.tag = 1; this._completeFullCode(db, i); } else if (regChar.test(db.code)) { db.tag = 2; this._completeFullCode(db, i); } else { db.tag = -1; db.full_code = ''; invalid += 1; } } if (invalid > 0) toastr.warning(`存在${invalid}条清单编号非法,请仔细对照原编号检查`); }, save() { const setting = { cols: [ {title: '清单编号', colSpan: '1', rowSpan: '1', field: 'full_code', hAlign: 0, width: 100, formatter: '@'}, {title: '原编号', colSpan: '1', rowSpan: '1', field: 'org_code', hAlign: 0, width: 60, formatter: '@'}, {title: '名称', colSpan: '1', rowSpan: '1', field: 'name', hAlign: 0, width: 300, formatter: '@'}, {title: '单位', colSpan: '1', rowSpan: '1', field: 'unit', hAlign: 1, width: 60, formatter: '@'}, {title: '单价', colSpan: '1', rowSpan: '1', field: 'unit_price', hAlign: 2, width: 80, type: 'Number'}, {title: '数量', colSpan: '1', rowSpan: '1', field: 'quantity', hAlign: 2, width: 80, type: 'Number'}, {title: '合价', colSpan: '1', rowSpan: '1', field: 'total_price', hAlign: 2, width: 80, type: 'Number'}, ], headRows: 1, headRowHeight: [32], defaultRowHeight: 21, headerFont: 'bold 10px 微软雅黑', font: '10px 微软雅黑' }; const orgFileName = $('#db-full-code-file')[0].files[0].name; const pointIndex = orgFileName.lastIndexOf('.'); SpreadExcelObj.exportSimpleXlsxSheet(setting, this.dealBills, orgFileName.substring(0, pointIndex) + "-长编号.xlsx"); }, changeAndSave() { dbFullCode.change(); dbFullCode.save(); } }; $(document).ready(() => { $('#db-full-code').on('show.bs.modal', () => { dbFullCode.clear(); }); $('#db-full-code-change').click(dbFullCode.changeAndSave); });