/** * Created by zhang on 2018/11/16. */ let locateObject={ bills_setting:{ header:[ {headerName: "编码", headerWidth: 120, dataCode: "code", dataType: "String"}, {headerName: "项目名称", headerWidth: 100, dataCode: "name", dataType: "String"}, {headerName: "单位", headerWidth: 50, dataCode: "unit", dataType: "String",hAlign: "center"}, {headerName: "工程量", headerWidth: 65, dataCode: "quantity", dataType: "Number", hAlign: "right"}, {headerName: "综合单价", headerWidth: 65, dataCode: "unitPrice", dataType: "Number", hAlign: "right"}, {headerName: "综合合价", headerWidth: 65, dataCode: "totalPrice", dataType: "Number", hAlign: "right"} ], view: { lockColumns: [0,1,2,3,4,5], colHeaderHeight:30 } }, ration_setting:{ header:[ {headerName: "定额编码", headerWidth: 100, dataCode: "code", dataType: "String"}, {headerName: "定额名称", headerWidth: 180, dataCode: "name", dataType: "String"}, {headerName: "单位", headerWidth: 50, dataCode: "unit", dataType: "String",hAlign: "center"}, {headerName: "工程量", headerWidth: 65, dataCode: "quantity", dataType: "Number", hAlign: "right",decimalField: "ration.quantity"} ], view: { lockColumns: [0,1,2,3], colHeaderHeight:30 } }, ration_glj_setting:{ header:[ {headerName: "编码", headerWidth: 120, dataCode: "code", dataType: "String"}, {headerName: "名称", headerWidth: 80, dataCode: "name", dataType: "String"}, {headerName: "规格型号", headerWidth: 80, dataCode: "specs", dataType: "String"}, {headerName: "单位", headerWidth: 50, dataCode: "unit", dataType: "String",hAlign: "center"}, {headerName: "市场价", headerWidth: 65, dataCode: "marketPrice", dataType: "Number", hAlign: "right"} ], view: { lockColumns: [0,1,2,3,4], colHeaderHeight:30 } }, datas:[], bookMarkSetting:{ header:[ {headerName: "编码", headerWidth: 120, dataCode: "code", dataType: "String"}, {headerName: "书签名称", headerWidth: 200, dataCode: "name", dataType: "String"}, ], view: { lockColumns: [0,1], colHeaderHeight:30 } }, bookmarkDatas:[], seletedNodeID:null,//右键设置书签时选中的节点ID临时存储 //为了兼容旧项目,这里给个默认值 bookmarkPropertySetting:{ settingList :[ {background:"E2F2C5",describe:""}, {background:"F9E2CF",describe:""}, {background:"F2EFD9",describe:""}, {background:"F5D1DA",describe:""}, {background:"E3E3E3",describe:""}, {background:"B6F3F2",describe:""}, {background:"ECE0F5",describe:""} ], selected:"E2F2C5" }, getDescribeByColor: function (color) { const setting = projectObj.project.property.bookmarkSetting ? projectObj.project.property.bookmarkSetting : locateObject.bookmarkPropertySetting; const item = setting.settingList.find(item => item.background === color); return item && item.describe ? item.describe : '描述'; }, initMainSpread:function(){ if(!this.mainSpread){ this.mainSpread = SheetDataHelper.createNewSpread($("#locate_result")[0],3); sheetCommonObj.spreadDefaultStyle(this.mainSpread); this.initMainSheet(); }else { this.mainSpread.refresh(); } }, initMainSheet:function () { //初始化清单表格 sheetCommonObj.initSheet(this.mainSpread .getSheet(0),this.bills_setting); this.mainSpread .getSheet(0).setRowCount(0); //初始化定额表格 sheetCommonObj.initSheet(this.mainSpread .getSheet(1),this.ration_setting); this.mainSpread .getSheet(1).setRowCount(0); //初始化人材机表格 sheetCommonObj.initSheet(this.mainSpread.getSheet(2),this.ration_glj_setting); this.mainSpread .getSheet(2).setRowCount(0); this.mainSpread.bind(GC.Spread.Sheets.Events.CellDoubleClick,this.onSheetDoubleClick); this.mainSpread .getSheet(2).bind(GC.Spread.Sheets.Events.SelectionChanged,this.gljSelectionChange); }, initSubSpread:function () { if(!this.subSpread){ this.subSpread = SheetDataHelper.createNewSpread($("#locate_sub")[0]); sheetCommonObj.spreadDefaultStyle(this.subSpread); this.initSubSheet(); this.subSpread.bind(GC.Spread.Sheets.Events.CellDoubleClick,this.onSheetDoubleClick); }else { this.subSpread.refresh(); } }, initBookmarkSpread:function(){ if(!this.bookmarkSpread){ this.bookmarkSpread = SheetDataHelper.createNewSpread($("#bookmarkSpread")[0]); sheetCommonObj.spreadDefaultStyle(this.bookmarkSpread); this.initBookmarkSheet(); this.bookmarkSpread.bind(GC.Spread.Sheets.Events.CellDoubleClick,this.onSheetDoubleClick); if(!projectReadOnly) this.initBookmarkRightClick(); }else { this.bookmarkSpread.refresh(); } this.showBookmarkDatas(); }, refreshWorkBook: function () { if (this.mainSpread) this.mainSpread.refresh(); if (this.subSpread) this.subSpread.refresh(); if (this.bookmarkSpread) this.bookmarkSpread.refresh(); }, initSubSheet:function () { this.subSheet = this.subSpread .getSheet(0); sheetCommonObj.initSheet( this.subSheet, this.ration_setting); this.subSheet.setRowCount(0); this.subSheet.name('locate_sub'); }, initBookmarkSheet:function () { this.bookmarkSheet = this.bookmarkSpread .getSheet(0); sheetCommonObj.initSheet( this.bookmarkSheet, this.bookMarkSetting); this.bookmarkSheet.setRowCount(0); this.bookmarkSheet.name('bookmark'); this.bookmarkSheet.bind(GC.Spread.Sheets.Events.SelectionChanged,this.bookmarkSelectionChange); }, initOutstanding:function () { if(!projectObj.project.property.locateSetting) return; let outstd = projectObj.project.property.locateSetting; $("#outstanding").prop("checked",outstd.outstanding); $("#outInp").val(parseFloat(outstd.outInp)); }, initBookmarkSetting:function () { $("#bookmarkSettingList").empty(); let setting = projectObj.project.property.bookmarkSetting?projectObj.project.property.bookmarkSetting:this.bookmarkPropertySetting; for(let s of setting.settingList){ let b = `
    
`; $("#bookmarkSettingList").append(b); $("#"+s.background).bind('focus', bookmarkSelected); } }, showMainData:function (datas,setting) { sheetCommonObj.showData(this.mainSpread.getActiveSheet(),setting,datas); this.mainSpread.getActiveSheet().setRowCount(datas.length); }, showSubRateDatas:function () { this.subRationDatas = this.getSubRationDatas(); sheetCommonObj.showData(this.subSheet,this.ration_setting,this.subRationDatas); this.subSheet.setRowCount(this.subRationDatas.length); }, showBookmarkDatas:function(refresh = false){ let sheet = this.bookmarkSheet; let sel = sheet.getSelections()[0]; let oldData = sel.row 0){ let glj = this.gljDatas[oldSel.row]; if(!glj) return datas; let nodes = projectObj.project.projectGLJ.getImpactRationNodes([glj.reference]); for(let n of nodes){ datas.push(this.getShowRationDatas(n.data)); } } return datas; }, refreshView: function (options, refreshWorkBook) { let me = this; let mainHeight = $(window).height()-$(".header").height()-$(".toolsbar").height()-$("#searchPanel").height(); let subHeight = 0; if(options == "bookmark"){ loadHeight(getBookmarkResize()); }else { $('#locateTopDiv').height(mainHeight); $('#locate_result').height(mainHeight); $('#locateBottomDiv').height(subHeight); $('#locate_sub').height(subHeight - 7); if(options == "ration_glj"){ loadHeight(getLocateLibResize()); } } if (refreshWorkBook) { me.refreshWorkBook(); } function loadHeight(libResize) { SlideResize.loadVerticalHeight(libResize.eleObj.module, libResize.eleObj, libResize.limit, function () { locateObject.refreshWorkBook(); }); } }, init:function () { let me = this; let options = $("input[name='content_type']:checked").val(); let callback = function () { me.refreshView(options, false); me.initMainSpread(); me.initSubSpread(); me.initBookmarkSpread(); }; if(options == 'bookmark'){ $("#aboutLocateDiv").hide(); $("#outstandingOptions").hide(); me.initBookmarkSetting(); $("#aboutBookmarkDiv").show(0,callback); }else { $("#aboutBookmarkDiv").hide(); $("#aboutLocateDiv").show(0,function () { if(options == "bills") me.initOutstanding(); options == "bills"?$("#outstandingOptions").show(0,callback):$("#outstandingOptions").hide(0,callback); }); } }, findRecodes:function () { let options = $("input[name='content_type']:checked").val(); let keyword = $("#locateInput").val(); switch (options){ case "bills": this.billsDatas = this.findBills(keyword); this.showMainData(this.billsDatas,this.bills_setting); break; case "ration": this.rationDatas = this.findRations(keyword); this.showMainData(this.rationDatas,this.ration_setting); break; case "ration_glj": this.gljDatas = this.findGLJs(keyword); this.showMainData(this.gljDatas,this.ration_glj_setting); this.showSubRateDatas(); break; } }, onshow:function () { locateObject.init(); }, matchItem:function (keyword,i) {//true 匹配上,false匹配失败 let match = false; if(keyword && keyword !="") {//如果keyword为空,匹配所有 if (i.code && i.code.indexOf(keyword) != -1) match = true; if (i.name && i.name.indexOf(keyword) != -1) match = true; if(match == false) return false } return true; }, findGLJs:function(keyword){ let datas = []; let gljList = projectObj.project.projectGLJ.datas.gljList; gljList = sortProjectGLJ(gljList); for(let glj of gljList){ // if(glj.quantity == 0 || glj.quantity == '0') continue; 2019-07-01 需求改成消耗量为0也显示 let match = this.matchItem(keyword,glj); if(match == false) continue; let data = getGLJDatas(glj); gljOprObj.setGLJPrice(data,glj); datas.push(data); } return datas; function getGLJDatas(tem) { return{ ID:tem.id, name:tem.name, code:tem.code, unit:tem.unit, specs:tem.specs, reference:tem } } }, findRations:function (keyword) { let datas = []; let items = projectObj.project.mainTree.items; for(let i of items){ if(i.sourceType == ModuleNames.ration){ let match = this.matchItem(keyword,i.data); if(match == false) continue; let bills = this.getShowRationDatas(i.data); datas.push(bills); } } return datas; }, getShowRationDatas:function(data){ return{ ID:data.ID, name:data.name, code:data.code, unit:data.unit, quantity:data.quantity } }, findBills:function(keyword){ let datas = [],priceMap={}; let items = projectObj.project.mainTree.items; for(let i of items){ if(i.sourceType == ModuleNames.bills){ let match = this.matchItem(keyword,i.data); if(match == false) continue; let bills = getBillData(i.data); priceMap = setPriceMap(bills,priceMap); datas.push(bills); } } setBgColour(datas,priceMap); datas = _.sortByAll(datas,['code']); return datas; function setBgColour(bills,map) { let outStd = $("#outstanding").prop("checked"); let outInp = $("#outInp").val(); if(outStd == true && outInp && outInp!=""){ for(let b of bills){ if(b.code && b.code.length >= 9){ let key = b.code.substr(0,9); if(map[key] && map[key].count > 1){ let avg = map[key].total/map[key].count; let unitPrice = b.unitPrice?parseFloat(b.unitPrice):0; if(unitPrice ==0 ) continue; if(Math.abs(unitPrice - avg)/avg * 100 >= parseFloat(outInp)) b.bgColour = "#FFFACD" } } } } } function setPriceMap (bills,map) { if(bills.code && bills.code.length >= 9){ let key = bills.code.substr(0,9); let unitPrice = bills.unitPrice?parseFloat(bills.unitPrice):0; if(map[key]){ map[key].total += unitPrice; map[key].count ++; }else { map[key] = {total:unitPrice,count:1} } } return map; } function getBillData(data) { return{ ID:data.ID, name:data.name, code:data.code, unit:data.unit, quantity:data.quantity, unitPrice:data.feesIndex&&data.feesIndex.common?data.feesIndex.common.unitFee:"", totalPrice:data.feesIndex&&data.feesIndex.common?data.feesIndex.common.totalFee:"", bgColour:"white" } } }, onSheetDoubleClick:function (e,args) { let me = locateObject; let options = $("input[name='content_type']:checked").val(); let sheetName = args.sheet.name() if(options == "ration_glj"&&sheetName != "locate_sub" ) return; let datas = options == "bills"? me.billsDatas:me.rationDatas; if( args.sheet.name() == "locate_sub") datas = me.subRationDatas; if(args.sheet.name() == "bookmark") datas = me.bookmarkDatas; me.locateNode(datas[args.row].ID); }, gljSelectionChange:function (e,args) { let me = locateObject; let newSel = args.newSelections[0]; let oldSel = args.oldSelections?args.oldSelections[0]:{}; if(newSel.row != oldSel.row){ me.showSubRateDatas(); } }, bookmarkSelectionChange:function (e,args) { let me = locateObject; let newSel = args.newSelections[0]; let oldSel = args.oldSelections?args.oldSelections[0]:{}; if(newSel.row != oldSel.row){ me.showAnnotation(newSel.row); } }, showAnnotation:function (row,focus = false) { let me = locateObject; let recode = me.bookmarkDatas[row]; if(recode){ $("#annotationTextarea").val(recode.bookmarkAnnotation); $("#bookmarkNodeID").val(recode.ID); $("#bookmarkNodeType").val(recode.type); if(focus) $("#annotationTextarea").focus(); } else { $("#annotationTextarea").val(''); } }, locateNode:function (ID) { let node = projectObj.project.mainTree.findNode(ID); if(node) projectObj.loadFocusLocation(node.serialNo(),1); }, updateProjectProperty:function(fieldID,property){ let updateData = {type:ModuleNames.project,data:{'ID' : projectObj.project.ID()}};//,'property.locateSetting':outstd updateData.data["property."+fieldID] = property; $.bootstrapLoading.start(); projectObj.project.updateNodes([updateData],function () { $.bootstrapLoading.end(); projectObj.project.property[fieldID] = property; }); }, updateOutStanding:function (outstanding,outInp) { let outstd = {outstanding:outstanding,outInp:outInp}; this.updateProjectProperty('locateSetting',outstd); }, updateBookmarkSetting:function () { let setting = projectObj.project.property.bookmarkSetting?projectObj.project.property.bookmarkSetting:locateObject.bookmarkPropertySetting; for(let s of setting.settingList){ s.describe = $("#"+s.background).val(); } setting.selected = $("#bookmarkSelected").val(); this.updateProjectProperty("bookmarkSetting",setting); }, // background为null则为取消书签批注 setOrCancelBookmark:function(node, background){ $("#bookmark").prop("checked", true); const updateData = {type: node.sourceType, data: {ID: node.data.ID, bookmarkBackground: background}}; if(!background) { updateData.data.bookmarkAnnotation = null; } $.bootstrapLoading.start(); projectObj.project.updateNodes([updateData],function () { $.bootstrapLoading.end(); node.data.bookmarkBackground = background; projectObj.mainController.refreshTreeNode([node]); locateObject.seletedNodeID = node.data.ID; //如果没有打开,自动打开书签批注设置 $('#locate').is(':visible')?locateObject.init():$("#locateTab").click(); }); }, initBookmarkRightClick:function(){ //如果当前行是无组成物的“普通材料”、“绿化苗木”、“外购砼构件”、“商品混凝土”、“商品砂浆”,则右键“添加计算材料”按钮有效。 let me = this; $.contextMenu({ selector: '#bookmarkSpread', build: function ($trigger, e) { me.rightClickTarget = SheetDataHelper.safeRightClickSelection($trigger, e, me.bookmarkSpread); return me.rightClickTarget.hitTestType === GC.Spread.Sheets.SheetArea.viewport || me.rightClickTarget.hitTestType === GC.Spread.Sheets.SheetArea.rowHeader; }, items: { "deleteBookmark": { name: "删除书签批注", icon: 'fa-remove', disabled: function () { return me.bookmarkDatas.length == 0; }, callback: function (key, opt) { me.deleteSelectedBookmark(); } }, "deleteAllBookmarks": { name: "删除所有书签批注", icon: 'fa-remove', disabled: function () { return me.bookmarkDatas.length == 0; }, callback: function (key, opt) { me.deleteBookmarkByDatas(me.bookmarkDatas); } } } }); }, deleteSelectedBookmark:function () { let sel = this.bookmarkSheet.getSelections()[0]; if(sel.row != -1 && this.bookmarkDatas.length>sel.row){ let record = this.bookmarkDatas[sel.row]; this.deleteBookmarkByDatas([record]); } }, deleteBookmarkByDatas:function(datas){ let postDatas = []; for(let d of datas){ let tem = { type:d.type, data:{ 'ID':d.ID, 'bookmarkAnnotation':null, 'bookmarkBackground':null } }; postDatas.push(tem); } this.updateBookmarkNodes(postDatas); }, updateBookmarkNodes:function (postDatas,refreshsNode = true) { $.bootstrapLoading.start(); projectObj.project.updateNodes(postDatas,function () { $.bootstrapLoading.end(); let nodes = []; for(let p of postDatas){ let node = projectObj.project.mainTree.findNode(p.data.ID); if(!node) continue; for(let key in p.data){ if(key == 'ID') continue; node.data[key] = p.data[key]; } nodes.push(node); } locateObject.showBookmarkDatas(); if(refreshsNode) projectObj.mainController.refreshTreeNode(nodes); }); } }; $("#locate_btn").click(function () { locateObject.findRecodes(); }); //回车键搜索 $('#locateInput').bind('keypress', function (event) { if(event.keyCode === 13){ $(this).blur(); locateObject.findRecodes(); } }); $("input[name='content_type']").each(function(){ $(this).click(function(){ let options = $(this).val(); switch (options){ case "bills": locateObject.mainSpread.setActiveSheetIndex(0); break; case "ration": locateObject.mainSpread.setActiveSheetIndex(1); break; case "ration_glj": locateObject.mainSpread.setActiveSheetIndex(2); break; } locateObject.init(); }); }); $('#outInp').change(function(){ let me = locateObject; let process = getDecimal('process'); var newVal = $(this).val(); let outInp = scMathUtil.roundForObj(newVal,process); let outStd = $("#outstanding").prop("checked"); me.updateOutStanding(outStd,outInp); }); $('#outstanding').change(function(){ let me = locateObject; let outInp = $("#outInp").val(); let outStd = $("#outstanding").prop("checked"); me.updateOutStanding(outStd,scMathUtil.roundForObj(outInp,getDecimal('process'))); }); $("#annotationTextarea").change(function(){ let updateData = {type:$("#bookmarkNodeType").val(),data:{'ID' :$("#bookmarkNodeID").val(),'bookmarkAnnotation':$(this).val()}}; let node = projectObj.project.mainTree.findNode($("#bookmarkNodeID").val()); if(!node) return; locateObject.updateBookmarkNodes([updateData],false); }); $('#bookmarkSettingDropdown').on('shown.bs.dropdown', function showDropdown() { locateObject.initBookmarkSetting(); let setting = projectObj.project.property.bookmarkSetting?projectObj.project.property.bookmarkSetting:locateObject.bookmarkPropertySetting; $("#"+setting.selected).focus(); }); $("#bookmarkSettingConfirm").click(function () { locateObject.updateBookmarkSetting(); $("#bookmarkSettingDropdown").click(); }); function bookmarkSelected() { $("#bookmarkSelected").val($(this)[0].id); }