|
@@ -0,0 +1,402 @@
|
|
|
+'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();
|
|
|
+ });
|
|
|
+});
|