/** * 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:[2,5], 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.ValueChanged, me.onDetailValueChanged); me.detailSpread.getSheet(0).bind(GC.Spread.Sheets.Events.EnterCell, me.onDetailEnterCell); 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(); }, onDetailValueChanged: function(sender, args) { $.bootstrapLoading.start(); let me = calcProgramManage; let editInfo= me.getSelectionInfo(); let curCalcItem = editInfo.calcItem; let dataCode = me.detailSetting.header[args.col].dataCode; if (dataCode == 'feeRate') { projectObj.project.FeeRate.updateFeeRateFromCalc(args.editingText,editInfo); $.bootstrapLoading.end(); return; }; if (dataCode == 'displayFieldName') { if (curCalcItem.displayFieldName == args.newValue) { $.bootstrapLoading.end(); return; }; if (analyzer.fieldNameIsUsed(me.getSelectionInfo().template, args.newValue)){ let sheet = me.detailSpread.getActiveSheet(); sheet.suspendEvent(); sheet.setValue(args.row, args.col, args.oldValue); sheet.resumeEvent(); $.bootstrapLoading.end(); alert(`“${args.newValue}” 已被其它行使用,不允许重复选择!`); return; }; curCalcItem.fieldName = projectObj.project.calcProgram.compiledFeeTypeMaps[args.newValue]; } else if (dataCode == 'dispExprUser'){ // 除非直接改单元格,弹窗不会走这里 alert('用户修改dispExprUser值,触发onDetailEditEnded事件。'); }; curCalcItem[dataCode] = args.newValue; let data = { 'projectID': projectObj.project.ID(), 'templatesID': editInfo.template.ID, 'calcItem': curCalcItem }; me.saveCalcItem(data, function (rst) { if (rst){ projectObj.project.calcProgram.calcAllNodesAndSave(); } }); $.bootstrapLoading.end(); }, onDetailEnterCell: 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 = `ID:${c.ID} ${c.expression} ${c.dispExpr} ${c.dispExprUser} ${c.compiledExpr} ${c.custom}`; // projectObj.testDisplay('', e); }, loadMainContextMenu: function () { $.contextMenu({ selector: '#mainSpread', build: function ($trigger, e) { SheetDataHelper.safeRightClickSelection($trigger, e, calcProgramManage.mainSpread); }, items: { "copyTemplate": { name: "另存为", icon: 'copy', callback: function (key, opt) { $.bootstrapLoading.start(); let template = calcProgramManage.getSelectionInfo().template; let idx = calcProgramManage.mainSpread.getActiveSheet().getActiveRowIndex(); let newTemplate = {}; newTemplate.ID = analyzer.templateMaxID() + 1; newTemplate.name = analyzer.templateNewName(template.name); newTemplate.custom = true; newTemplate.calcItems = []; $.extend(true, newTemplate.calcItems, template.calcItems); let data = { 'projectID': projectObj.project.ID(), 'ID': newTemplate.ID, 'name': newTemplate.name, 'custom': newTemplate.custom, 'calcItems': template.calcItems }; calcProgramManage.addTemplate(data, function (rst) { if (rst){ let ts = projectObj.project.calcProgram.templates; ts.push(newTemplate); projectObj.project.calcProgram.compileTemplate(newTemplate); calcProgramManage.buildSheet(); calcProgramManage.mainSpread.getActiveSheet().setSelection(ts.length - 1, 0, 1, 1); calcProgramManage.refreshDetailSheet(); } }); $.bootstrapLoading.end(); } }, "reNameTemplate": { name: "重命名...", icon: 'edit', disabled: function () { let custom = calcProgramManage.getSelectionInfo().template.custom; let canReName = custom ? custom : false; return !canReName; }, callback: function (key, opt) { $.bootstrapLoading.start(); let template = calcProgramManage.getSelectionInfo().template; let idx = calcProgramManage.mainSpread.getActiveSheet().getActiveRowIndex(); let newName = prompt("请输入新的模板名称:", template.name); if (!newName || (newName && newName == template.name)) { $.bootstrapLoading.end(); return; }; while (analyzer.templateNameIsExist(newName)){ alert(`“${newName}”已存在,请重新输入!`); newName = prompt("请输入新的模板名称:", template.name); }; if (!newName || (newName && newName == template.name)) { $.bootstrapLoading.end(); return; }; template.name = newName; let data = { 'projectID': projectObj.project.ID(), 'ID': template.ID, 'name': template.name }; calcProgramManage.updateTemplate(data, function (rst) { if (rst){ projectObj.project.calcProgram.compileTemplate(template); sheetCommonObj.showData(calcProgramManage.mainSpread.getSheet(0), calcProgramManage.mainSetting, calcProgramManage.datas); } }); $.bootstrapLoading.end(); } }, "spr1": '--------', "deleteTemplate": { name: '删除', icon: 'fa-remove', disabled: function () { let custom = calcProgramManage.getSelectionInfo().template.custom; let canDelete = custom ? custom : false; return !canDelete; }, callback: function () { $.bootstrapLoading.start(); let template = calcProgramManage.getSelectionInfo().template; if (analyzer.templateIsUsed(template.ID)) { $.bootstrapLoading.end(); alert(`计算模板“${template.name}”已被使用,不允许删除!`); return; } let data = { 'projectID': projectObj.project.ID(), 'ID': template.ID }; calcProgramManage.deleteTemplate(data, function (rst) { if (rst){ let idx = calcProgramManage.mainSpread.getActiveSheet().getActiveRowIndex(); projectObj.project.calcProgram.templates.splice(idx, 1); projectObj.project.calcProgram.compileAllTemps(); calcProgramManage.buildSheet(); calcProgramManage.mainSpread.getActiveSheet().setSelection(idx - 1, 0, 1, 1); calcProgramManage.refreshDetailSheet(); } }); $.bootstrapLoading.end(); } } } }); }, loadDetailContextMenu: function () { $.contextMenu({ selector: '#detailSpread', build: function ($triggerElement, event) { SheetDataHelper.safeRightClickSelection($triggerElement, event, calcProgramManage.detailSpread); }, items: { "newCalcItem": { name: "插入行", icon: 'fa-sign-in', callback: function () { $.bootstrapLoading.start(); let template = calcProgramManage.getSelectionInfo().template; let idx = calcProgramManage.detailSpread.getActiveSheet().getActiveRowIndex(); let newItem = {}; newItem.ID = analyzer.calcItemMaxID(template) + 1; // newItem.name = '新建'; newItem.memo = '自定义'; newItem.custom = true; newItem.expression = '0'; // 这里必须得有值,否则程序内部公式解析会出现诸多问题 template.calcItems.splice(idx + 1, 0, newItem); let data = { 'projectID': projectObj.project.ID(), 'ID': template.ID, 'calcItems': template.calcItems }; calcProgramManage.updateTemplate(data, function (rst) { if (rst){ projectObj.project.calcProgram.compileTemplate(template); calcProgramManage.refreshDetailSheet(); calcProgramManage.detailSpread.getActiveSheet().setSelection(idx + 1, 0, 1, 1); projectObj.project.calcProgram.calcAllNodesAndSave(); } }); $.bootstrapLoading.end(); } }, "spr1": '--------', "deleteCalcItem": { name: '删除行', icon: 'fa-remove', callback: function () { $.bootstrapLoading.start(); let template = calcProgramManage.getSelectionInfo().template; let idx = calcProgramManage.detailSpread.getActiveSheet().getActiveRowIndex(); let item = template.calcItems[idx]; if (item.fieldName == 'common'){ $.bootstrapLoading.end(); alert(`费用类别为“工程造价”的行不允许删除!`); return; }; if (analyzer.calcItemIsUsed(template, item)){ $.bootstrapLoading.end(); alert(`第 ${idx + 1} 行“${item.name}”已被第 ${item.tempUsed + 1} 行引用,不允许删除!`); delete item.tempUsed; return; }; template.calcItems.splice(idx, 1); let data = { 'projectID': projectObj.project.ID(), 'ID': template.ID, 'calcItems': template.calcItems }; calcProgramManage.updateTemplate(data, function (rst) { if (rst){ projectObj.project.calcProgram.compileTemplate(template); calcProgramManage.refreshDetailSheet(); projectObj.project.calcProgram.calcAllNodesAndSave(); } }); $.bootstrapLoading.end(); } } } }); }, saveCalcItem: function (data, callback) {//data CommonAjax.post('/calcProgram/saveCalcItem', data, function (result) { if(callback){ callback(result); } } ); }, updateTemplate: function (data, callback) { CommonAjax.post('/calcProgram/updateTemplate', data, function (result) { if(callback){ callback(result); } } ); }, addTemplate: function (data, callback) { CommonAjax.post('/calcProgram/addTemplate', data, function (result) { if(callback){ callback(result); } } ); }, deleteTemplate: function (data, callback) { CommonAjax.post('/calcProgram/deleteTemplate', data, function (result) { if(callback){ callback(result); } } ); }, 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(); }); });