'use strict'; /** * 台账修订页面js * * @author Mai * @date * @version */ const billsCompareField = [ 'code', 'b_code', 'name', 'unit', 'unit_price', 'dgn_qty1', 'dgn_qty2', 'dgn_price', 'sgfh_qty', 'sgfh_tp', 'sjcl_qty', 'sjcl_tp', 'qtcl_qty', 'qtcl_tp', 'quantity', 'total_price', 'deal_qty', 'deal_tp' ]; const posCompareField = [ 'name', 'position', 'sgfh_qty', 'sjcl_qty', 'qtcl_qty', 'quantity' ]; $(document).ready(() => { let searchLedger; autoFlashHeight(); // 初始化spread const billsSpread = SpreadJsObj.createNewSpread($('#bills-spread')[0]); const billsSheet = billsSpread.getActiveSheet(); sjsSettingObj.setFxTreeStyle(billsSpreadSetting, sjsSettingObj.FxTreeStyle.jz); if (thousandth) { sjsSettingObj.setTpThousandthFormat(billsSpreadSetting); sjsSettingObj.setTpColsThousandthFormat(billsSpreadSetting.extraCols); } billsSpreadSetting.getColor = function (sheet, data, row, col, defaultColor) { // 增 if (data.differ.indexOf('add') >= 0) return '#ffddc5'; // 删 if (data.differ.indexOf('del') >= 0) return '#DCDCDC'; // 结构变动 if (data.differ.indexOf('tree') >= 0) return '#d0f6fd'; // 修改计算或文字 if (data.differ.indexOf('calc') >= 0 || data.differ.indexOf('pos-add') >= 0 || data.differ.indexOf('pos-del') >= 0 || data.differ.indexOf('pos-calc') >= 0) return '#f8d7da'; if (data.differ.indexOf('info') >= 0 || data.differ.indexOf('pos-info') >= 0) return '#d4edda'; // 层次结构 if (data.level === 2) { return '#C4CAFB'; } else if ((!data.b_code || data.b_code === '') && data.level > 2) { return '#DFE8F9'; } else { return defaultColor; } }; SpreadJsObj.initSheet(billsSheet, billsSpreadSetting); const posSpread = SpreadJsObj.createNewSpread($('#pos-spread')[0]); const posSheet = posSpread.getActiveSheet(); sjsSettingObj.setGridSelectStyle(posSpreadSetting); if (thousandth) { sjsSettingObj.setTpThousandthFormat(posSpreadSetting); sjsSettingObj.setTpColsThousandthFormat(posSpreadSetting.extraCols); } posSpreadSetting.getColor = function (sheet, data, row, col, defaultColor) { if (!data || !data.differ) return defaultColor; // 增 if (data.differ.indexOf('add') >= 0) return '#ffddc5'; // 删 if (data.differ.indexOf('del') >= 0) return '#DCDCDC'; // 修改计算或文字 if (data.differ.indexOf('calc') >= 0) return '#f8d7da'; if (data.differ.indexOf('info') >= 0) return '#d4edda'; }; SpreadJsObj.initSheet(posSheet, posSpreadSetting); const posSearch = $.posSearch({selector: '#pos-search', searchSpread: posSpread}); // 初始化 节点树结构 const treeSetting = { id: 'ledger_id', pid: 'ledger_pid', order: 'order', level: 'level', full_path: 'full_path', rootId: -1, keys: ['id', 'tender_id', 'ledger_id'], calcFields: [ 'org_sgfh_tp', 'org_sjcl_tp', 'org_qtcl_tp', 'org_total_price', 'org_deal_tp', 'new_sgfh_tp', 'new_sjcl_tp', 'new_qtcl_tp', 'new_total_price', 'new_deal_tp', 'contract_tp', 'qc_tp', 'pre_contract_tp', 'pre_qc_tp' ], findNode: function (tree, node, parent) { const sameId = tree.datas.find(x => {return x.id === node.id}); if (sameId) { const pid = parent ? parent[tree.setting.id] : tree.setting.rootId; if (sameId[tree.setting.pid] !== pid) { sameId.changeParent = true; sameId.org_parent = parent; } return sameId; } else { const siblings = parent ? parent.children : tree.children; return siblings.find(function (x) { return node.b_code ? x.b_code === node.b_code && x.name === node.name && x.unit === node.unit && x.unit_price === node.unit_price : x.code === node.code && x.name === node.name; }); } }, loadInfo1: function (node, sourceNode, source) { for (const f of billsCompareField) { node['new_' + f] = sourceNode[f]; } node.id = sourceNode.id; node.isNew = true; const posRange = source.pos.getLedgerPos(sourceNode.id); if (posRange && posRange.length > 0) { if (!node.pos) node.pos = []; for (const p of posRange) { let nP = _.find(node.pos, {id: p.id}); if (!nP) { nP = {id: p.id}; node.pos.push(nP); } for (const f of posCompareField) { nP['new_' + f] = p[f]; } nP.isNew = true; } } }, loadInfo2: function (node, sourceNode, source) { for (const f of billsCompareField) { node['org_' + f] = sourceNode[f]; } node.isOrg = true; const posRange = source.pos.getLedgerPos(sourceNode.id); if (posRange && posRange.length > 0) { if (!node.pos) node.pos = []; for (const p of posRange) { let nP = _.find(node.pos, {id: p.id}); if (!nP) { nP = {id: p.id}; node.pos.push(nP); } for (const f of posCompareField) { nP['org_' + f] = p[f]; } nP.isOrg = true; } } }, afterLoad: function (tree) { for (const data of tree.datas) { data.differ = []; data.differ_str = []; for (const p of data.pos) { p.differ = []; p.differ_str = []; if (p.isNew && !p.isOrg) { p.differ.push('add'); if (data.differ.indexOf('pos-add') === -1) data.differ.push('pos-add'); p.differ_str.push('增'); } else if (!p.isNew && p.isOrg) { p.differ.push('del'); if (data.differ.indexOf('pos-del') === -1) data.differ.push('pos-del'); p.differ_str.push('删'); } else { const orgPosCalc = getCompare(p, compareFields.posCalc, 'org_', 0); const newPosCalc = getCompare(p, compareFields.posCalc, 'new_', 0); if (!_.isMatch(orgPosCalc, newPosCalc)) { p.differ.push('calc'); if (data.differ.indexOf('pos-calc') === -1) data.differ.push('pos-calc'); p.differ_str.push('量改'); } const orgPosInfo = getCompare(p, compareFields.posInfo, 'org_', 0); const newPosInfo = getCompare(p, compareFields.posInfo, 'new_', 0); if (!_.isMatch(orgPosInfo, newPosInfo)) { p.differ.push('info'); if (data.differ.indexOf('pos-info') === -1) data.differ.push('pos-info'); p.differ_str.push('文改'); } } } if (data.isNew && !data.isOrg) { data.differ.push('add'); data.differ_str.push('增'); } else if (!data.isNew && data.isOrg) { data.differ.push('del'); data.differ_str.push('删'); } else { if (data.changeParent) data.differ.push('tree'); if (!data.children || data.children.length === 0) { const orgCalc = getCompare(data, compareFields.leafCalc, 'org_', 0); const newCalc = getCompare(data, compareFields.leafCalc, 'new_', 0); if (!_.isMatch(newCalc, orgCalc)) data.differ.push('calc'); } else { const orgCalc = getCompare(data, compareFields.parentCalc, 'org_', 0); const newCalc = getCompare(data, compareFields.parentCalc, 'new_', 0); if (!_.isMatch(newCalc, orgCalc)) data.differ.push('calc'); } const orgInfo = getCompare(data, compareFields.info, 'org_', ''); const newInfo = getCompare(data, compareFields.info, 'new_', ''); if (!_.isMatch(newInfo, orgInfo)) data.differ.push('info'); if (data.differ.length > 0) data.differ_str.push('改'); } } } }; if (!isTz) { treeSetting.calcFields.push('deal_tp'); } treeSetting.calcFun = function (node) { if (!node.children || node.children.length === 0) { // node.gather_qty = ZhCalc.add(node.contract_qty, node.qc_qty); // node.pre_gather_qty = ZhCalc.add(node.pre_contract_qty, node.pre_qc_qty); node.end_contract_qty = ZhCalc.add(node.contract_qty, node.pre_contract_qty); node.end_qc_qty = ZhCalc.add(node.qc_qty, node.pre_qc_qty); // node.end_gather_qty = ZhCalc.add(node.end_contract_qty, node.end_qc_qty); } // node.gather_tp = ZhCalc.add(node.contract_tp, node.qc_tp); // node.pre_gather_tp = ZhCalc.add(node.pre_contract_tp, node.pre_qc_tp); node.end_contract_tp = ZhCalc.add(node.contract_tp, node.pre_contract_tp); node.end_qc_tp = ZhCalc.add(node.qc_tp, node.pre_qc_tp); // node.end_gather_tp = ZhCalc.add(node.end_contract_tp, node.end_qc_tp); node.dgn_price = ZhCalc.round(ZhCalc.div(node.total_price, node.dgn_qty1), 2); }; const billsTree = createNewPathTree('compare', treeSetting); // 清单 相关方法&绑定spreadjs事件 const billsTreeSpreadObj = { selectionChanged: function (e, info) { if (info.newSelections) { if (!info.oldSelections || info.newSelections[0].row !== info.oldSelections[0].row) { posSpreadObj.loadCurPosData(); posSearch.search($('#pos-keyword').val()); } } }, }; billsSpread.bind(spreadNS.Events.SelectionChanged, billsTreeSpreadObj.selectionChanged); // 计量单元 相关方法&绑定spreadjs事件 const posSpreadObj = { /** * 加载计量单元 根据当前台账选择节点 */ loadCurPosData: function () { const node = SpreadJsObj.getSelectObject(billsSheet); if (node) { SpreadJsObj.loadSheetData(posSheet, 'data', node.pos || []); } else { SpreadJsObj.loadSheetData(posSheet, 'data', []); } }, }; // 加载清单&计量单元数据 postData('/tender/' + window.location.pathname.split('/')[2] + '/revise/load', {filter: 'bills;pos;reviseBills;revisePos'}, function (result) { const tenderTreeSetting = { id: 'ledger_id', pid: 'ledger_pid', order: 'order', level: 'level', rootId: -1, keys: ['id', 'tender_id', 'ledger_id'], calcFields: ['deal_tp', 'sgfh_tp', 'sjcl_tp', 'qtcl_tp', 'total_price'], }; const reviseLedger = { billsTree: createNewPathTree('ledger', tenderTreeSetting), pos: new PosData({ id: 'id', ledgerId: 'lid', }), }; reviseLedger.billsTree.loadDatas(result.reviseBills); reviseLedger.pos.loadDatas(result.revisePos); const orgLedger = { billsTree: createNewPathTree('ledger', tenderTreeSetting), pos: new PosData({ id: 'id', ledgerId: 'lid', }), }; orgLedger.billsTree.loadDatas(result.bills); orgLedger.pos.loadDatas(result.pos); billsTree.loadCompareData(reviseLedger, orgLedger); treeCalc.calculateAll(billsTree); SpreadJsObj.loadSheetData(billsSheet, SpreadJsObj.DataType.Tree, billsTree); posSpreadObj.loadCurPosData(); }, null); $.divResizer({ select: '#revise-resize', callback: function () { billsSpread.refresh(); let bcontent = $(".bcontent-wrap") ? $(".bcontent-wrap").height() : 0; $(".sp-wrap").height(bcontent-30); posSpread.refresh(); } }); $.divResizer({ select: '#revise-right-spr', callback: function () { billsSpread.refresh(); if (posSpread) { posSpread.refresh(); } if (searchLedger) { searchLedger.spread.refresh(); } } }); $.subMenu({ menu: '#sub-menu', miniMenu: '#sub-mini-menu', miniMenuList: '#mini-menu-list', toMenu: '#to-menu', toMiniMenu: '#to-mini-menu', key: 'menu.1.0.0', miniHint: '#sub-mini-hint', hintKey: 'menu.hint.1.0.1', callback: function (info) { if (info.mini) { $('.panel-title').addClass('fluid'); $('#sub-menu').removeClass('panel-sidebar'); } else { $('.panel-title').removeClass('fluid'); $('#sub-menu').addClass('panel-sidebar'); } autoFlashHeight(); billsSpread.refresh(); if (posSpread) { posSpread.refresh(); } if (searchLedger) { searchLedger.spread.refresh(); } } }); // 展开收起标准节点 $('a', '#side-menu').bind('click', function (e) { e.preventDefault(); const tab = $(this), tabPanel = $(tab.attr('content')); // 展开工具栏、切换标签 if (!tab.hasClass('active')) { const close = $('.active', '#side-menu').length === 0; $('a', '#side-menu').removeClass('active'); tab.addClass('active'); $('.tab-content .tab-pane').removeClass('active'); tabPanel.addClass('active'); showSideTools(tab.hasClass('active')); if (tab.attr('content') === '#search') { if (!searchLedger) { searchLedger = $.billsSearch({ selector: '#search', searchSpread: billsSpread, resultSpreadSetting: { cols: [ {title: '项目节编号', field: 'code', hAlign: 0, width: 90, formatter: '@', readOnly: true}, {title: '清单编号', field: 'b_code', hAlign: 0, width: 80, formatter: '@', readOnly: true}, {title: '名称', field: 'name', width: 150, hAlign: 0, formatter: '@', readOnly: true}, {title: '单位', field: 'unit', width: 50, hAlign: 1, formatter: '@', readOnly: true}, ], emptyRows: 0, headRows: 1, headRowHeight: [32], headColWidth: [30], defaultRowHeight: 21, headerFont: '12px 微软雅黑', font: '12px 微软雅黑', selectedBackColor: '#fffacd', }, afterLocated: function () { posSpreadObj.loadCurPosData(); } }); } searchLedger.spread.refresh(); } } else {// 收起工具栏 tab.removeClass('active'); tabPanel.removeClass('active'); showSideTools(tab.hasClass('active')); } billsSpread.refresh(); if (posSpread) { posSpread.refresh(); } }); // 显示层次 (function (select, sheet) { $(select).click(function () { if (!sheet.zh_tree) return; const tag = $(this).attr('tag'); const tree = sheet.zh_tree; switch (tag) { case "1": case "2": case "3": case "4": case "5": tree.expandByLevel(parseInt(tag)); SpreadJsObj.refreshTreeRowVisible(sheet); break; case "last": tree.expandByCustom(() => { return true; }); SpreadJsObj.refreshTreeRowVisible(sheet); break; case "leafXmj": tree.expandToLeafXmj(); SpreadJsObj.refreshTreeRowVisible(sheet); break; case "differ": tree.expandByCustom(function (x) { const posterity = tree.getPosterity(x); if (posterity.length === 0) return x.differ.length > 0; for (const p of posterity) { if (p.differ.length > 0) return true; } return false; }); SpreadJsObj.refreshTreeRowVisible(sheet); } }); })('a[name=showLevel]', billsSheet); // 加载计量数据 $('#load-stage-ok').click(function (x) { postData('/tender/' + window.location.pathname.split('/')[2] + '/revise/load', {filter: 'stageBills;stagePos'}, function (result) { const col = billsSpreadSetting.cols.length; billsSpreadSetting.cols = billsSpreadSetting.cols.concat(billsSpreadSetting.extraCols); SpreadJsObj.reinitSheetHeader(billsSheet); for (const b of result.stageBills) { const node = billsTree.nodes.find(x => {return x.id === b.lid}); if (!node) continue; for (const f of ['contract_qty', 'contract_tp', 'qc_qty', 'qc_tp', 'pre_contract_qty', 'pre_contract_tp', 'pre_qc_qty', 'pre_qc_tp']) { node[f] = b[f]; } } treeCalc.calculateAll(billsTree); SpreadJsObj.reloadColData(billsSheet, col, billsSpreadSetting.extraCols.length); posSpreadSetting.cols = posSpreadSetting.cols.concat(posSpreadSetting.extraCols); SpreadJsObj.reinitSheetHeader(posSheet); // todo 加载并计算计量单元期数据 for (const p of result.stagePos) { const node = billsTree.nodes.find(x => {return x.id === p.lid}); if (!node) continue; const pos = node.pos.find(x => {return x.id === p.pid}); if (!pos) continue; pos.contract_qty = p.contract_qty; pos.qc_qty = p.qc_qty; //pos.gather_qty = ZhCalc.add(pos.contract_qty, pos.qc_qty); pos.pre_contract_qty = p.pre_contract_qty; pos.pre_qc_qty = p.pre_qc_qty; //pos.pre_gather_qty = ZhCalc.add(pos.pre_contract_qty, pos.pre_qc_qty); pos.end_contract_qty = ZhCalc.add(pos.contract_qty, pos.pre_contract_qty); pos.end_qc_qty = ZhCalc.add(pos.qc_qty, pos.pre_qc_qty); //pos.end_gather_qty = ZhCalc.add(pos.gather_qty, pos.pre_gather_qty); } posSpreadObj.loadCurPosData(); $('#load-stage-btn').hide(); $('#load-stage').modal('hide'); }); }); });