| 
					
				 | 
			
			
				@@ -0,0 +1,409 @@ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+/** 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * 进度台账相关js 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * @author Ellisran 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * @date 2020/11/6 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * @version 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+function getTenderId() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    return window.location.pathname.split('/')[2]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+$(function () { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    autoFlashHeight(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    if (monthList.length === 0 && selectedLedgerList.length !== 0) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        $('#second').modal('show'); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    // 初始化台账 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    const ledgerSpread = SpreadJsObj.createNewSpread($('#ledger-spread')[0]); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    const treeSetting = { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        id: 'ledger_id', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        pid: 'ledger_pid', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        order: 'order', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        level: 'level', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        rootId: -1, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        fullPath: 'full_path', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        //treeCacheKey: 'ledger_bills_fold' + '_' + getTenderId(), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        // markFoldKey: 'bills-fold', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        // markFoldSubKey: window.location.pathname.split('/')[2], 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    }; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    const ledgerTree = createNewPathTree('filter', treeSetting); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    const static_cols = [ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        {title: '编号', colSpan: '1', rowSpan: '2', field: 'code', hAlign: 0, width: 145, formatter: '@', readOnly: true, cellType: 'tree'}, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        {title: '名称', colSpan: '1', rowSpan: '2', field: 'name', hAlign: 0, width: 185, formatter: '@', readOnly: true}, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        {title: '单位', colSpan: '1', rowSpan: '2', field: 'unit', hAlign: 1, width: 50, formatter: '@', readOnly: true}, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        {title: '经济指标', colSpan: '1', rowSpan: '2', field: 'dgn_price', hAlign: 2, width: 60, type: 'Number', readOnly: true}, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        {title: '总设计|工程量', colSpan: '2|1', rowSpan: '1|1', field: 'dgn_qty1', hAlign: 2, width: 70, type: 'Number', readOnly: true}, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        {title: '|金额(万元)', colSpan: '|1', rowSpan: '|1', field: 'total_price', hAlign: 2, width: 70, type: 'Number', readOnly: true}, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        {title: '自开工至本月计划完成|工程量', colSpan: '2|1', rowSpan: '1|1', field: 'dgn_qty1', hAlign: 2, width: 70, type: 'Number', readOnly: true}, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        {title: '|金额(万元)', colSpan: '|1', rowSpan: '|1', field: 'total_price', hAlign: 2, width: 70, type: 'Number', readOnly: true}, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        {title: '截止本期完成计量|工程量', colSpan: '2|1', rowSpan: '1|1', field: 'dgn_qty1', hAlign: 2, width: 70, type: 'Number', readOnly: true}, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        {title: '|金额(万元)', colSpan: '|1', rowSpan: '|1', field: 'total_price', hAlign: 2, width: 70, type: 'Number', readOnly: true}, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        {title: '本年计划完成|工程量', colSpan: '2|1', rowSpan: '1|1', field: 'dgn_qty1', hAlign: 2, width: 70, type: 'Number', readOnly: true}, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        {title: '|金额(万元)', colSpan: '|1', rowSpan: '|1', field: 'total_price', hAlign: 2, width: 70, type: 'Number', readOnly: true}, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        {title: '本年累计完成|工程量', colSpan: '2|1', rowSpan: '1|1', field: 'dgn_qty1', hAlign: 2, width: 70, type: 'Number', readOnly: true}, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        {title: '|金额(万元)', colSpan: '|1', rowSpan: '|1', field: 'total_price', hAlign: 2, width: 70, type: 'Number', readOnly: true}, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        {title: '本月计划完成|工程量', colSpan: '2|1', rowSpan: '1|1', field: 'dgn_qty1', hAlign: 2, width: 70, type: 'Number', readOnly: true}, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        {title: '|金额(万元)', colSpan: '|1', rowSpan: '|1', field: 'total_price', hAlign: 2, width: 70, type: 'Number', readOnly: true}, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        {title: '本期完成计量|工程量', colSpan: '2|1', rowSpan: '1|1', field: 'dgn_qty1', hAlign: 2, width: 70, type: 'Number', readOnly: true}, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        {title: '|金额(万元)', colSpan: '|1', rowSpan: '|1', field: 'total_price', hAlign: 2, width: 70, type: 'Number', readOnly: true}, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        {title: '下月计划|工程量', colSpan: '2|1', rowSpan: '1|1', field: 'dgn_qty1', hAlign: 2, width: 70, type: 'Number', readOnly: true}, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        {title: '|金额(万元)', colSpan: '|1', rowSpan: '|1', field: 'total_price', hAlign: 2, width: 70, type: 'Number', readOnly: true}, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    ]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    const ledgerSpreadSetting = { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        emptyRows: 0, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        headRows: 2, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        headRowHeight: [25, 25], 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        defaultRowHeight: 21, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        headerFont: '12px 微软雅黑', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        font: '12px 微软雅黑', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        // readOnly: true, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        localCache: { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            key: 'ledger-bills', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            colWidth: true, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    }; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    ledgerSpreadSetting.cols = static_cols; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    sjsSettingObj.setFxTreeStyle(ledgerSpreadSetting, sjsSettingObj.FxTreeStyle.jz); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    if (thousandth) sjsSettingObj.setTpThousandthFormat(ledgerSpreadSetting); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    SpreadJsObj.initSheet(ledgerSpread.getActiveSheet(), ledgerSpreadSetting); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    SpreadJsObj.selChangedRefreshBackColor(ledgerSpread.getActiveSheet()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    postData('/tender/' + getTenderId() + '/schedule/ledger/load', {}, function (data) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        // let treeData = []; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        // for(const sl of selectedLedgerList) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        //     const one = _.find(data, { 'ledger_id' : sl }); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        //     treeData.push(one); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        // } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        // treeData = setLeafData(treeData); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        // console.log(treeData); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        // let treeData = data; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        const calcList = ['total_price']; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        const showList = ['ledger_id', 'ledger_pid', 'order', 'level', 'tender_id', 'full_path', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            'code', 'name', 'unit', 'dgn_qty1', 'dgn_qty2', 'dgn_price', 'quantity', 'total_price']; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        for (const m of scheduleMonth) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            if (m.stage_used === 1) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                showList.push(m.yearmonth + '_plan_tp'); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                showList.push(m.yearmonth + '_plan_gcl'); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                showList.push(m.yearmonth + '_sj_tp'); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                showList.push(m.yearmonth + '_sj_gcl'); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            // calcList.push(m + '_tp'); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            // calcList.push(m + '_gcl'); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        const baseLedgerTree = createNewPathTree('base', { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            id: 'ledger_id', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            pid: 'ledger_pid', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            order: 'order', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            level: 'level', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            rootId: -1, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            fullPath: 'full_path', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            calcFields: calcList, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            calcFun: function (node) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                node.dgn_price = ZhCalc.round(ZhCalc.div(node.total_price, node.dgn_qty1), 2); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        }); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        const newLedgerList = setMonthToLedger(data.bills, data.slm); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        baseLedgerTree.loadDatas(newLedgerList); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        treeCalc.calculateAll(baseLedgerTree); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        console.log(baseLedgerTree); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        for (const d of baseLedgerTree.nodes) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            if (!d.b_code) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                const one = _.find(selectedLedgerList, function (item) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    return item === d.ledger_id; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                }); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                if(one) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    ledgerTree.addData(d, showList); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        console.log(ledgerTree); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        ledgerTree.sortTreeNode(true); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        // console.log(ledgerTree); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        SpreadJsObj.loadSheetData(ledgerSpread.getActiveSheet(), SpreadJsObj.DataType.Tree, ledgerTree); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    }, null, true); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    const ledgerSpreadObj = { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        refreshTree: function (sheet, data) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            SpreadJsObj.massOperationSheet(sheet, function () { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                const tree = sheet.zh_tree; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                // 处理删除 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                if (data.delete) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    data.delete.sort(function (x, y) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        return y.deleteIndex - x.deleteIndex; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    }); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    for (const d of data.delete) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        sheet.deleteRows(d.deleteIndex, 1); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                // 处理新增 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                if (data.create) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    const newNodes = data.create; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    if (newNodes) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        newNodes.sort(function (a, b) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                            return a.index - b.index; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        }); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        for (const node of newNodes) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                            sheet.addRows(node.index, 1); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                            SpreadJsObj.reLoadRowData(sheet, tree.nodes.indexOf(node), 1); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                // 处理更新 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                if (data.update) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    const rows = []; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    for (const u of data.update) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        rows.push(tree.nodes.indexOf(u)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    SpreadJsObj.reLoadRowsData(sheet, rows); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                // 处理展开 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                if (data.expand) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    const expanded = []; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    for (const e of data.expand) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        if (expanded.indexOf(e) === -1) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                            const posterity = tree.getPosterity(e); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                            for (const p of posterity) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                sheet.setRowVisible(tree.nodes.indexOf(p), p.visible); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                expanded.push(p); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            }); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        }, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        editEnded: function (e, info) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            if (info.sheet.zh_setting) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                const select = SpreadJsObj.getSelectObject(info.sheet); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                const col = info.sheet.zh_setting.cols[info.col]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                const validText = is_numeric(info.editingText) ? parseFloat(info.editingText) : (info.editingText ? trimInvalidChar(info.editingText) : null); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                const orgValue = select[col.field]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                if (orgValue == validText || ((!orgValue || orgValue === '') && (validText === ''))) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    SpreadJsObj.reLoadRowData(info.sheet, info.row); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    return; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                if (isNaN(validText)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    toastr.error('不能输入其它非数字类型字符'); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    SpreadJsObj.reLoadRowData(info.sheet, info.row); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    return; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                const yearmonth = col.field.split('_')[0]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                // 判断输入位数,提示 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                const reg = new RegExp('^([-]?)\\d+(\\.\\d{0,'+ parseInt(tenderInfo.decimal.up) +'})?$'); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                if (validText !== null && (!reg.test(validText))) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    toastr.error('输入工程量小数位数不能大于' + tenderInfo.decimal.up + '位'); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    SpreadJsObj.reLoadRowData(info.sheet, info.row); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    return; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                const sj_gcl = validText; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                const sj_tp = select.dgn_price && select.dgn_price !== 0 ? ZhCalc.round(ZhCalc.mul(validText, select.dgn_price), tenderInfo.decimal.tp) : 0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                select[col.field] = validText; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                const updateData = { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    lid: select.ledger_id, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    yearmonth, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    sj_gcl, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    sj_tp, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                }; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                console.log(updateData); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                postData(window.location.pathname + '/save', {type: 'ledger_edit', postData: updateData}, function (result) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    select[yearmonth + '_sj_tp'] = sj_tp; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    SpreadJsObj.reLoadRowData(info.sheet, info.row); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                },function () { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    select[col.field] = orgValue; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    SpreadJsObj.reLoadRowData(info.sheet, info.row); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                }) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        }, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        deletePress: function (sheet) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            return; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        }, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        clipboardPasted(e, info) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            const hint = { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                cellError: {type: 'error', msg: '粘贴内容超出了表格范围'}, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                numberExpr: {type: 'error', msg: '不能粘贴其它非数字类型字符'}, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                numberCan: {type: 'error', msg: '请粘贴大于0并且小于3位小数的浮点数'}, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            }; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            const range = info.cellRange; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            const sortData = info.sheet.zh_data || []; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            if (info.cellRange.row + info.cellRange.rowCount > sortData.length) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                toastMessageUniq(hint.cellError); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                SpreadJsObj.reLoadSheetHeader(materialMonthSpread.getActiveSheet()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                SpreadJsObj.reLoadSheetData(materialMonthSpread.getActiveSheet()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                return; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            if (sortData.length > 0 && range.col + range.colCount > 4 + months.length) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                toastMessageUniq(hint.cellError); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                SpreadJsObj.reLoadSheetHeader(materialMonthSpread.getActiveSheet()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                SpreadJsObj.reLoadSheetData(materialMonthSpread.getActiveSheet()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                return; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            const data = []; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            for (let iRow = 0; iRow < range.rowCount; iRow++) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                let bPaste = true; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                const curRow = range.row + iRow; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                const materialMonthData = sortData[curRow]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                const hintRow = range.rowCount > 1 ? curRow : ''; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                let sameCol = 0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                for (let iCol = 0; iCol < range.colCount; iCol++) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    const curCol = range.col + iCol; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    const colSetting = info.sheet.zh_setting.cols[curCol]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    if (!colSetting) continue; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    let validText = info.sheet.getText(curRow, curCol); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    validText = is_numeric(validText) ? parseFloat(validText) : (validText ? trimInvalidChar(validText) : null); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    const orgValue = sortData[curRow][colSetting.field]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    if (orgValue == validText || ((!orgValue || orgValue === '') && (validText === ''))) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        sameCol++; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        if (range.colCount === sameCol)  { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                            bPaste = false; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        continue; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    const num = parseFloat(validText); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    if (isNaN(validText)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        toastMessageUniq(getPasteHint(hint.numberExpr, hintRow)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        bPaste = false; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        continue; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    if (validText !== null && (num < 0 || !/^\d+(\.\d{1,3})?$/.test(num))) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        toastMessageUniq(getPasteHint(hint.numberCan, hintRow)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        bPaste = false; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        continue; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    materialMonthData[colSetting.field] = validText; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    sortData[curRow][colSetting.field] = validText; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                if (bPaste) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    data.push(materialMonthData); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                } else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    SpreadJsObj.reLoadRowData(info.sheet, curRow); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            if (data.length === 0) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                SpreadJsObj.reLoadRowData(info.sheet, info.cellRange.row, info.cellRange.rowCount); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                return; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            // // 更新至服务器 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            // postData(window.location.pathname + '/month/save', { type:'paste', updateData: data }, function (result) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            //     SpreadJsObj.reLoadSheetData(materialMonthSpread.getActiveSheet()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            //     materialBillsData = result.materialBillsData; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            //     SpreadJsObj.loadSheetData(materialSpread.getActiveSheet(), SpreadJsObj.DataType.Data, materialBillsData); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            //     m_tp = result.m_tp; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            //     resetTpTable(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            // }, function () { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            //     SpreadJsObj.reLoadRowData(info.sheet, info.cellRange.row, info.cellRange.rowCount); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            //     return; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            // }); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        }, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    }; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    ledgerSpread.bind(spreadNS.Events.EditEnded, ledgerSpreadObj.editEnded); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    SpreadJsObj.addDeleteBind(ledgerSpread, ledgerSpreadObj.deletePress); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    // 月份添加 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    $('#add-month').click(function () { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        const id = parseInt($('#month-select').val()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        if(id === 0) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            toastr.error('请选择计划进度月'); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            return; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        const _self = $(this); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        postData(window.location.pathname + '/save', {type: 'add_stage', postData: { id: id }}, function (result) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            _self.addClass('disabled').attr('disabled', true); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            toastr.success('创建成功'); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            setTimeout(function () { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                window.location.reload(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            }, 500) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        }) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    }); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    $('#month-table input[type="checkbox"]').click(function () { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        const selectedMonth = []; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        $('#month-table input:checkbox:checked').each(function () { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            selectedMonth.push('「' + $(this).parents('td').siblings('td').text() + '」'); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        }); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        if(selectedMonth.length > 0) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            $('#del-month-list').text(selectedMonth.join('')); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            $('#del-month-list').parent().show(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            $('#del-month').removeAttr('disabled'); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            $('#del-month-list').parent().hide(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            $('#del-month').attr('disabled', true); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    }); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    $('#del-month').click(function () { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        const selectedMonth = []; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        $('#month-table input:checkbox:checked').each(function () { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            selectedMonth.push($(this).parents('td').siblings().text()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        }); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        if (selectedMonth.length === 0) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            toastr.error('请选择删除的计划周期'); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            return; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        const _self = $(this); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        postData(window.location.pathname + '/save', {type: 'del_stage', postData: selectedMonth}, function (result) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            _self.addClass('disabled').attr('disabled', true); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            toastr.success('删除成功'); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            setTimeout(function () { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                window.location.reload(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            }, 500) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        }) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    }); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    $.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'); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            ledgerSpread.refresh(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            autoFlashHeight(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    }); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+}); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+function setLeafData(tree) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    const newtree = []; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    for (const t of tree) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        const child = _.find(tree, { 'ledger_pid': t.ledger_id }); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        if (!child && !t.is_leaf) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            t.is_leaf = true; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        newtree.push(t); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    return newtree; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+function setMonthToLedger(ledgerList, slm) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    if (slm.length > 0) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        for(const s of slm) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            const index = _.findIndex(ledgerList, { 'ledger_id': s.lid }); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            const canCalc = _.find(scheduleMonth, { 'yearmonth': s.yearmonth, 'stage_used': 1}); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            if (index && index !== -1 && canCalc) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                ledgerList[index][s.yearmonth + '_plan_tp'] = s.plan_tp; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                ledgerList[index][s.yearmonth + '_plan_gcl'] = s.plan_gcl; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                ledgerList[index][s.yearmonth + '_sj_tp'] = s.sj_tp; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                ledgerList[index][s.yearmonth + '_sj_gcl'] = s.sj_gcl; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    return ledgerList; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+const is_numeric = (value) => { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    if (typeof(value) === 'object') { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        return false; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        return !Number.isNaN(Number(value)) && value.toString().trim() !== ''; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+}; 
			 |