/** * Created by CSL on 2017-08-03. * 计算程序管理。 */ let calcProgramManage = { datas: [], mainSpread: null, detailSpread: null, mainSetting: { header:[ // {headerName:"ID",headerWidth:80,dataCode:"ID", hAlign: "center"}, {headerName:"名称",headerWidth:200,dataCode:"name", dataType: "String"} ], view:{ comboBox:[], lockColumns:[0,1], colHeaderHeight: CP_Col_Width.colHeader, rowHeaderWidth: CP_Col_Width.rowHeader } }, detailSetting: { header:[ // {headerName:"ID",headerWidth:80,dataCode:"ID", hAlign: "center"}, {headerName:"费用代号",headerWidth:CP_Col_Width.code, dataCode:"code", dataType: "String"}, {headerName:"费用名称",headerWidth:CP_Col_Width.name, dataCode:"name", dataType: "String"}, {headerName:"计算基数",headerWidth:CP_Col_Width.dispExprUser, dataCode:"dispExprUser", dataType: "String"}, {headerName:"费率",headerWidth:CP_Col_Width.feeRate, dataCode:"feeRate", dataType: "Number",hAlign: "right",decimalField:"feeRate"}, {headerName:"费用类别",headerWidth:CP_Col_Width.displayFieldName, dataCode:"displayFieldName", dataType: "String", hAlign: "center"}, {headerName:"基数说明",headerWidth:CP_Col_Width.statement, dataCode:"statement", dataType: "String"}, {headerName:"备注",headerWidth:CP_Col_Width.memo, dataCode:"memo", dataType: "String"} ], view:{ comboBox:[], lockColumns:[0,1,2,5,6], colHeaderHeight: CP_Col_Width.colHeader, rowHeaderWidth: CP_Col_Width.rowHeader } }, buildSheet: function (){ let me = this; me.datas = projectObj.project.calcProgram.datas.templates; if (me.mainSpread) { me.mainSpread.destroy(); me.mainSpread = null; }; if (me.detailSpread) { me.detailSpread.destroy(); me.detailSpread = null; }; me.mainSpread = sheetCommonObj.buildSheet($('#mainSpread')[0], me.mainSetting, me.datas.length); me.detailSpread = sheetCommonObj.buildSheet($('#detailSpread')[0], me.detailSetting, me.datas[0].calcItems.length); let arr = projectObj.project.calcProgram.compiledFeeTypeNames.slice(); arr.splice(arr.findIndex(function (e){return e == '暂估费'}), 1); let fieldName = new GC.Spread.Sheets.CellTypes.ComboBox(); fieldName.items(arr); me.detailSpread.getSheet(0).getRange(-1, 4, -1, 1).cellType(fieldName); me.mainSpread.getSheet(0).bind(GC.Spread.Sheets.Events.EnterCell, me.onMainEnterCell); me.detailSpread.getSheet(0).bind(GC.Spread.Sheets.Events.CellChanged, me.onDetailCellChanged); me.detailSpread.getSheet(0).bind(GC.Spread.Sheets.Events.EditEnded, me.onDetailEditEnded); me.detailSpread.getSheet(0).bind(GC.Spread.Sheets.Events.EnterCell, me.onEnterCell); let mSheet = me.mainSpread.getSheet(0); sheetCommonObj.showData(mSheet, me.mainSetting, me.datas); let dSheet = me.detailSpread.getSheet(0); dSheet.name('calc_detail'); feeRateObject.setFeeRateCellCol(dSheet,_.findIndex(me.detailSetting.header,{'dataCode':'feeRate'})); dSheet.getRange(-1, _.findIndex(me.detailSetting.header, {'dataCode': 'dispExprUser'}), -1, 1).cellType(calcBaseView.getCalcBaseCellType('ration')); sheetCommonObj.showData(dSheet, me.detailSetting, me.datas[0].calcItems); me.loadMainContextMenu(); me.loadDetailContextMenu(); }, onMainEnterCell: function(sender, args) { var me = calcProgramManage; var row = args.sheet.getActiveRowIndex(); me.detailSpread.suspendPaint(); var dSheet = me.detailSpread.getSheet(0); var dData = me.datas[row].calcItems; dSheet.setRowCount(dData.length, GC.Spread.Sheets.SheetArea.viewport); sheetCommonObj.showData(dSheet, me.detailSetting, dData); me.detailSpread.resumePaint(); }, onDetailEditEnded: function(sender, args) { $.bootstrapLoading.start(); let me = calcProgramManage; let editInfo= me.getSelectionInfo(); if (me.detailSetting.header[args.col].dataCode == 'feeRate') { projectObj.project.FeeRate.updateFeeRateFromCalc(args.editingText,editInfo); } else { if (me.detailSetting.header[args.col].dataCode == 'displayFieldName') { if (editInfo.calcItem.displayFieldName == args.editingText) { $.bootstrapLoading.end(); return; } editInfo.calcItem.fieldName = projectObj.project.calcProgram.compiledFeeTypeMaps[args.editingText]; editInfo.calcItem.displayFieldName = args.editingText; // 这句不入库,仅用于切换后再切换回来时界面正确显示 } else if (me.detailSetting.header[args.col].dataCode == 'dispExprUser'){ // 除非直接改单元格,弹窗不会走这里 alert(editInfo.calcItem.dispExprUser); }; let data = { 'projectID': projectObj.project.ID(), 'templatesID': editInfo.template.ID, 'calcItem': editInfo.calcItem }; me.saveCalcItem(data, function (rst) { if (rst){ projectObj.project.calcProgram.calcAllNodesAndSave(); } }); } }, onEnterCell: function (sender, args) { let t = calcProgramManage.getSelectionInfo().template; let c = calcProgramManage.getSelectionInfo().calcItem; let lc = analyzer.calcItemLabourCoe(c); c.dispExpr = analyzer.getDispExpr(c.expression, t); c.dispExprUser = analyzer.getDispExprUser(c.dispExpr, lc); c.compiledExpr = analyzer.getCompiledExpr(c.expression, lc); let e = c.expression + ' ' + c.dispExpr + ' ' + c.dispExprUser + ' ' + c.compiledExpr; projectObj.testDisplay('', e); }, loadMainContextMenu: function () { $.contextMenu({ selector: '#mainSpread', build: function ($trigger, e) { SheetDataHelper.safeRightClickSelection($trigger, e, calcProgramManage.mainSpread); }, items: { "copyTemplate": { name: "另存为...", icon: 'fa-sign-in', disabled: function () { return false; }, visible: function(key, opt){ return true; }, callback: function (key, opt) { // doCopy } }, "spr1": '--------', "deleteTemplate": { name: '删除', icon: 'fa-remove', disabled: function () { return false; }, visible: function(key, opt){ return true; }, callback: function () { // doDelete } } } }); }, loadDetailContextMenu: function () { $.contextMenu({ selector: '#detailSpread', build: function ($triggerElement, event) { SheetDataHelper.safeRightClickSelection($triggerElement, event, calcProgramManage.detailSpread); }, items: { "newCalcItem": { name: "插入行", icon: 'fa-sign-in', callback: function () { let template = calcProgramManage.getSelectionInfo().template; var idx = calcProgramManage.detailSpread.getActiveSheet().getActiveRowIndex(); let newItem = {}; newItem.ID = analyzer.calcItemMaxID(template) + 1; newItem.memo = '用户自定义'; newItem.expression = '0'; template.calcItems.splice(idx + 1, 0, newItem); projectObj.project.calcProgram.compileTemplate(template); calcProgramManage.refreshDetailSheet(); calcProgramManage.detailSpread.getActiveSheet().setSelection(idx + 1, 0, 1, 1); } }, "deleteCalcItem": { name: '删除行', icon: 'fa-remove', callback: function () { let template = calcProgramManage.getSelectionInfo().template; var idx = calcProgramManage.detailSpread.getActiveSheet().getActiveRowIndex(); let item = template.calcItems[idx]; if (analyzer.calcItemIsUsed(template, item)){ alert(`第 ${idx + 1} 行“${item.name}”已被第 ${item.tempUsed + 1} 行引用,不允许删除!`); delete item.tempUsed; } else{ template.calcItems.splice(idx, 1); projectObj.project.calcProgram.compileTemplate(template); calcProgramManage.refreshDetailSheet(); } } } } }); }, saveCalcItem: function (data,callback) {//data let me = this; $.ajax({ type: 'POST', url: '/calcProgram/saveCalcItem', data: {'data':JSON.stringify(data)}, dataType: 'json', success: function (result) { if(!result.error){ if(callback){ callback(result); return; } } else{ alert('失败:' + result.message); } $.bootstrapLoading.end(); } }) }, getSelectionInfo:function () { var templateIndex = this.mainSpread.getActiveSheet().getActiveRowIndex(); var dIndex = this.detailSpread.getActiveSheet().getActiveRowIndex(); var info = { template:this.datas[templateIndex], calcItem:this.datas[templateIndex].calcItems[dIndex] } return info; }, refreshDetailSheet:function () { var me = this; if(me.mainSpread && me.detailSpread){ let mainRowIdx = me.mainSpread.getActiveSheet().getActiveRowIndex(); let calcItems = me.datas[mainRowIdx].calcItems; let detailSheet = me.detailSpread.getActiveSheet(); detailSheet.setRowCount(calcItems.length); sheetCommonObj.showData(detailSheet, me.detailSetting, calcItems); } } }; $(document).ready(function(){ $('#tab_calc_program_manage').on('shown.bs.tab', function (e) { $(e.relatedTarget.hash).removeClass('active'); calcProgramManage.buildSheet(); }); });