123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402 |
- 'use strict';
- /**
- *
- *
- * @author Mai
- * @date
- * @version
- */
- $(document).ready(() => {
- const spreadNS = GC.Spread.Sheets;
- const spread = SpreadJsObj.createNewSpread($('.sjs-height-1')[0]);
- const sheet = spread.getActiveSheet();
- const hCenter = spreadNS.HorizontalAlign.center;
- const vCenter = spreadNS.VerticalAlign.center;
- const compareObj = {
- cacheList: [],
- sortNodeData: function (data) {
- data.sort(function (a, b) {
- if (a.code > b.code) {
- return 1;
- } else if (a.code < b.code) {
- return -1;
- } else {
- return 0;
- }
- });
- },
- showCompareData: function () {
- const cols = compareObj.cols, colsName = compareObj.colsName;
- const colCount = colsName.length;
- function loadNode (node, row) {
- sheet.getCell(row, compareObj.cols.code).text(node.code).wordWrap(true).vAlign(vCenter);
- sheet.getCell(row, compareObj.cols.name).text(node.name).wordWrap(true).vAlign(vCenter);
- sheet.getRange(row, 0, 1, colCount).backColor('#dae5ee');
- sheet.autoFitRow(row);
- }
- function loadIndex(index, row) {
- for (const colName of colsName) {
- if (colName === 'averageIndex') {
- const aver = Number((index.sumValue / index.sumCount).toFixed(2));
- sheet.getCell(row, cols[colName]).value(aver).wordWrap(true).vAlign(vCenter);
- } else if (index[colName]) {
- sheet.getCell(row, cols[colName]).value(index[colName]).wordWrap(true).vAlign(vCenter);
- }
- }
- sheet.autoFitRow(row);
- }
- SpreadJsObj.beginMassOperationSheet(sheet);
- let iRow = 2;
- sheet.setRowCount(2);
- console.log(compareObj.showData);
- for (const sd of compareObj.showData) {
- sheet.addRows(iRow, 1);
- loadNode(sd, iRow);
- iRow += 1;
- for (const index of sd.children) {
- sheet.addRows(iRow, 1);
- loadIndex(index, iRow);
- iRow += 1;
- }
- }
- SpreadJsObj.endMassOperationSheet(sheet);
- },
- initXMatchCompareHeader: function (data) {
- const cols = {}, colsName = [];
- const indexColCount = data.selects.length + 1;
- SpreadJsObj.beginMassOperationSheet(sheet);
- const spans = sheet.getSpans();
- for (const span of spans) {
- sheet.removeSpan(span.row, span.col);
- }
- sheet.setColumnCount(6 + indexColCount);
- sheet.setRowCount(2);
- sheet.frozenRowCount(2);
- colsName.push('code');
- cols.code = 0;
- sheet.getCell(0, cols.code).text('指标编号').hAlign(hCenter).vAlign(vCenter);
- sheet.addSpan(0, cols.code, 2, 1);
- sheet.setColumnWidth(cols.code, 80);
- colsName.push('name');
- cols.name = 1;
- sheet.getCell(0, cols.name).text('项目或费用名称').hAlign(hCenter).vAlign(vCenter);
- sheet.addSpan(0, cols.name, 2, 1);
- sheet.setColumnWidth(cols.name, 220);
- colsName.push('unit1');
- cols.unit1 = 2;
- colsName.push('unit2');
- cols.unit2 = 3;
- sheet.getCell(0, cols.unit1).text('指标单位').hAlign(hCenter).vAlign(vCenter);
- sheet.addSpan(0, cols.unit1, 2, 2);
- sheet.setColumnWidth(cols.unit1, 65);
- sheet.setColumnWidth(cols.unit2, 65);
- if (data.selects.length > 0) {
- sheet.getCell(0, cols.unit2+1).text('经济指标').hAlign(hCenter).vAlign(vCenter);
- sheet.addSpan(0, cols.unit2+1, 1, indexColCount - 1);
- for (let i = 0, iLen = indexColCount - 1; i < iLen; i++) {
- const colName = 'bills_xid' + (data.selects[i].id > 0 ? '_' + data.selects[i].id : '');
- colsName.push(colName);
- cols[colName] = 4+i;
- sheet.getCell(1, cols[colName]).text(data.selects[i].id > 0 ? data.selects[i].name : '其他')
- .hAlign(hCenter).vAlign(vCenter).wordWrap(true);
- sheet.setColumnWidth(cols[colName], 150);
- }
- colsName.push('averageIndex');
- cols.averageIndex = 4 + indexColCount - 1;
- sheet.getCell(0, cols.averageIndex).text('平均指标').hAlign(hCenter).vAlign(vCenter);
- sheet.addSpan(0, cols.averageIndex, 2, 1);
- sheet.setColumnWidth(cols.averageIndex, 100);
- }
- colsName.push('rule');
- cols.rule = 4 + indexColCount;
- sheet.getCell(0, cols.rule).text('计算规则').hAlign(hCenter).vAlign(vCenter);
- sheet.addSpan(0, cols.rule, 2, 1);
- sheet.setColumnWidth(cols.rule, 300);
- colsName.push('memo');
- cols.memo = 5 + indexColCount;
- sheet.getCell(0, cols.memo).text('备注').hAlign(hCenter).vAlign(vCenter);
- sheet.addSpan(0, cols.memo, 2, 1);
- sheet.setColumnWidth(cols.memo, 100);
- sheet.autoFitRow(0);
- sheet.autoFitRow(1);
- compareObj.colsName = colsName;
- compareObj.cols = cols;
- SpreadJsObj.endMassOperationSheet(sheet);
- },
- sortXMatchCompareData: function (data) {
- function findNode(data, src, xid) {
- for (const node of data) {
- const field = xid > 0 ? 'bills_xid_' + xid : 'bills_xid';
- if (node.code === src.code && node.name === src.name && node[field] === src[field]) {
- return node;
- }
- }
- return null;
- }
- function findIndex(data, src) {
- for (const index of data) {
- if (index.code === src.code && index.name === src.name) {
- return index;
- }
- }
- return null;
- }
- const result = [];
- for (const select of compareObj.data.selects) {
- const searchData = data.filter(function (x) { return x.bills_xid === select.id});
- for (const sd of searchData) {
- let sortNode = findNode(result, sd, select.id);
- if (!sortNode) {
- sortNode = {
- code: sd.code,
- name: sd.name,
- children: [],
- };
- result.push(sortNode);
- }
- if (select.id > 0) {
- sortNode['bills_xid_' + select.id] = sd.bills_xid;
- } else {
- sortNode['bills_xid'] = sd.bills_xid;
- }
- for (const index of sd.children) {
- let sortIndex = findIndex(sortNode.children, index);
- if (!sortIndex) {
- sortIndex = {
- code: index.code,
- name: index.name,
- unit1: index.unit1,
- unit2: index.unit2,
- sumValue: 0,
- sumCount: 0,
- rule: index.rule,
- memo: index.memo,
- };
- sortNode.children.push(sortIndex)
- }
- if (select.id > 0) {
- sortIndex['bills_xid_' + select.id] = index.value;
- } else {
- sortIndex['bills_xid'] = index.value;
- }
- sortIndex.sumValue += index.value;
- sortIndex.sumCount += 1;
- }
- }
- }
- compareObj.sortNodeData(result);
- return result;
- },
- loadXMatchCompareData(data) {
- compareObj.initXMatchCompareHeader(compareObj.data);
- compareObj.showData = compareObj.sortXMatchCompareData(data);
- compareObj.showCompareData();
- },
- initCommonCompareHeader: function () {
- const cols = {}, colsName = [];
- SpreadJsObj.beginMassOperationSheet(sheet);
- const spans = sheet.getSpans();
- for (const span of spans) {
- sheet.removeSpan(span.row, span.col);
- }
- sheet.setColumnCount(7);
- sheet.setRowCount(2);
- sheet.frozenRowCount(2);
- colsName.push('code');
- cols.code = 0;
- sheet.getCell(0, cols.code).text('指标编号').hAlign(hCenter).vAlign(vCenter);
- sheet.addSpan(0, cols.code, 2, 1);
- sheet.setColumnWidth(cols.code, 80);
- colsName.push('name');
- cols.name = 1;
- sheet.getCell(0, cols.name).text('项目或费用名称').hAlign(hCenter).vAlign(vCenter);
- sheet.addSpan(0, cols.name, 2, 1);
- sheet.setColumnWidth(cols.name, 220);
- colsName.push('unit1');
- cols.unit1 = 2;
- colsName.push('unit2');
- cols.unit2 = 3;
- sheet.getCell(0, cols.unit1).text('指标单位').hAlign(hCenter).vAlign(vCenter);
- sheet.addSpan(0, cols.unit1, 2, 2);
- sheet.setColumnWidth(cols.unit1, 65);
- sheet.setColumnWidth(cols.unit2, 65);
- colsName.push('value');
- cols.name = 4;
- sheet.getCell(0, cols.name).text('经济指标').hAlign(hCenter).vAlign(vCenter);
- sheet.addSpan(0, cols.name, 2, 1);
- sheet.setColumnWidth(cols.name, 220);
- colsName.push('rule');
- cols.rule = 5;
- sheet.getCell(0, cols.rule).text('计算规则').hAlign(hCenter).vAlign(vCenter);
- sheet.addSpan(0, cols.rule, 2, 1);
- sheet.setColumnWidth(cols.rule, 300);
- colsName.push('memo');
- cols.memo = 6;
- sheet.getCell(0, cols.memo).text('备注').hAlign(hCenter).vAlign(vCenter);
- sheet.addSpan(0, cols.memo, 2, 1);
- sheet.setColumnWidth(cols.memo, 100);
- compareObj.colsName = colsName;
- compareObj.cols = cols;
- SpreadJsObj.endMassOperationSheet(sheet);
- },
- loadCommonCompareData(data) {
- compareObj.initCommonCompareHeader();
- compareObj.sortNodeData(data);
- this.showData = data;
- compareObj.showCompareData();
- },
- loadCompareData: function (data) {
- compareObj.resultData = data;
- if (compareObj.data.xMatch) {
- compareObj.loadXMatchCompareData(data);
- } else {
- compareObj.loadCommonCompareData(data);
- }
- },
- load: function () {
- postData(window.location.pathname + '/search', compareObj.data, function (result) {
- compareObj.lastData = compareObj.data;
- $('#select-lib').text(compareObj.data.lib_name + ': ' + compareObj.data.name);
- compareObj.loadCompareData(result);
- if (compareObj.data.xMatch) {
- $('#select-data').modal('hide');
- } else {
- $('#generate-data').modal('hide');
- }
- });
- },
- generateXList: function (arr) {
- $('#select-title').text('选择对比项 —— ' + compareObj.data.lib_name + ': ' + compareObj.data.name);
- const html = [];
- for (const r of arr) {
- html.push('<tr>');
- html.push('<td class="text-center">', "<input x-data='" + JSON.stringify({id: r.bills_xid, name: r.name, code: r.code}) + "' type='checkbox'>", '</td>');
- html.push('<td>', r.code, '</td>');
- html.push('<td>', r.bills_xid === -1 ? '其他' : r.name, '</td>');
- html.push('<td class="text-center">', r.units, '</td>');
- html.push('<td class="text-right">', r.dgn_quantity1, '</td>');
- html.push('<td class="text-right">', r.dgn_quantity2, '</td>');
- html.push('<td class="text-right">', r.dgn_price, '</td>');
- html.push('<td class="text-right">', r.total_price, '</td>');
- html.push('</tr>');
- }
- $('#x-list').html(html.join(''));
- $('#select-data').modal('show');
- $('#generate-data').modal('hide');
- },
- loadParentNode: function () {
- const history = compareObj.cacheList.find(function (l) {
- return l.lib_id === compareObj.data.lib_id && l.className === compareObj.data.className;
- });
- if (!history) {
- postData(window.location.pathname + '/parent', compareObj.data, function (result) {
- compareObj.cacheList.push({lib_id: compareObj.data.lib_id, className: compareObj.data.className, xList: result});
- compareObj.generateXList(result);
- });
- } else {
- compareObj.generateXList(history.xList);
- }
- },
- };
- compareObj.initCommonCompareHeader();
- $('#generate-data').modal('show');
- $('.dropdown-item').click(function () {
- $('#btnGroupDrop1').text($(this).text()).attr('data', $(this).attr('data'));
- if ($('#hint1').attr('hint-type') === 'dy') {
- $('#hint1').hide();
- }
- });
- $('input[type=radio]').bind('click', function () {
- $('input[type=radio]').parent().parent().addClass('table-secondary');
- if (this.checked) {
- $(this).parent().parent().removeClass('table-secondary');
- }
- if ($('#hint1').attr('hint-type') === 'bd') {
- $('#hint1').hide();
- }
- });
- $('#next').click(function () {
- const dy = $('#btnGroupDrop1').attr('data');
- if (!dy) {
- $('#hint1').attr('hint-type', 'dy').html('未选择单元指标类型').show();
- return;
- }
- const bd = $('input[type=radio]:checked')[0];
- if (!bd) {
- $('#hint1').attr('hint-type', 'bd').html('未选择造价文件').show();
- return;
- }
- compareObj.data = JSON.parse(dy);
- const lib_data = JSON.parse(bd.getAttribute('lib-data'));
- compareObj.data.lib_id = lib_data.id;
- compareObj.data.lib_name = lib_data.filename;
- if (compareObj.data.xMatch) {
- compareObj.loadParentNode();
- } else {
- compareObj.load();
- }
- });
- $('#search-x').click(function () {
- const keyword = $('#x-keyword').val();
- if (keyword === '') return;
- const tr = $('tr', '#x-list');
- tr.removeClass('table-warning');
- for (const r of tr) {
- const name = r.children[2].innerText;
- if (name.indexOf(keyword) >= 0) {
- $('#hint2').hide();
- r.classList.add('table-warning');
- return;
- }
- }
- $('#hint2').html('未能搜索到匹配项').show();
- });
- $('#select').click(function () {
- if (compareObj.data.xMatch) {
- if (!compareObj.lastData || compareObj.lastData.lib_id !== compareObj.data.lib_id || compareObj.lastData.name !== compareObj.data.name) {
- compareObj.loadParentNode();
- } else {
- $('#select-data').modal('show');
- }
- }
- });
- $('#select-ok').click(function () {
- const select = $('input[type=checkbox]:checked');
- if (select.length === 0) {
- $('#hint2').html('未选择对比项').show();
- return;
- }
- compareObj.data.selects = [];
- for (const s of select) {
- compareObj.data.selects.push(JSON.parse(s.getAttribute('x-data')));
- }
- compareObj.load();
- });
- });
|