/** * 项目管理相关js * * @author CaiAoLin * @date 2017/8/22 * @version */ let Tree = null;// let movetoZTree = null; let copytoZTree = null; let engineering = []; let feeRateData = []; let isSaving = false; let projectProperty = []; let fileDelObj = null; let projectType = { folder: 'Folder', tender: 'Tender', project: 'Project', engineering: 'Engineering' }; let fileType = { unitPriceFile: 'UnitPriceFile', feeRateFile: 'FeeRateFile' }; const projTreeObj = { tree: null, workBook: null, preSelected: null, preSelection: null, setting: { tree: { id: 'ID', pid: 'ParentID', nid: 'NextSiblingID', rootId: -1, autoUpdate: false }, header: [ {name: '工程列表', dataCode: 'name', width: 800, vAlign: 'center', hAlign: 'left'}, {name: '工程造价', dataCode: 'engineeringCost', width: 170, vAlign: 'center', hAlign: 'right'}, {name: '单价文件', dataCode: 'unitPriceFile', width: 250, vAlign: 'center', hAlign: 'left'}, {name: '费率文件', dataCode: 'feeRateFile', width: 250, vAlign: 'center', hAlign: 'left'}, {name: '创建日期', dataCode: 'createDateTime', width: 170, vAlign: 'center', hAlign: 'left'} ], //选中行颜色 style: { defalutBackColor: 'White', selectedColor: '#BBFFFF' }, options: { tabStripVisible: false, allowCopyPasteExcelStyle : false, allowExtendPasteRange: false, allowUserDragDrop : false, allowUserDragFill: false, scrollbarMaxAlign : true } }, renderSheetFuc: function (sheet, fuc) { sheet.suspendPaint(); sheet.suspendEvent(); fuc(); sheet.resumePaint(); sheet.resumeEvent(); }, setOptions: function (workbook, opts) { for(let opt in opts){ workbook.options[opt] = opts[opt]; } }, bindEvent: function (workBook) { const _events = GC.Spread.Sheets.Events; let sheet = workBook.getActiveSheet(); //改变选中节点set selected sheet.bind(_events.SelectionChanging, this.onSelectionChanging); }, buildHeader: function (sheet, headers) { let me = this; let fuc = function () { sheet.options.isProtected = true; sheet.options.protectionOptions = { allowResizeRows: true, allowResizeColumns: true }; sheet.setColumnCount(headers.length); sheet.setRowHeight(0, 40, GC.Spread.Sheets.SheetArea.colHeader); for(let i = 0, len = headers.length; i < len; i++){ sheet.setValue(0, i, headers[i].name, GC.Spread.Sheets.SheetArea.colHeader); sheet.setColumnWidth(i, headers[i].width, GC.Spread.Sheets.SheetArea.colHeader); } }; me.renderSheetFuc(sheet, fuc); }, buildSheet: function () { if(!this.workBook){ this.workBook = new GC.Spread.Sheets.Workbook($('#projSpread')[0], {sheetCount: 1}); this.setOptions(this.workBook, this.setting.options); this.buildHeader(this.workBook.getActiveSheet(), this.setting.header); this.bindEvent(this.workBook); } }, getSelStyle: function (backColor) { let style = new GC.Spread.Sheets.Style(); style.backColor = backColor; style.borderLeft = new GC.Spread.Sheets.LineBorder("#D4D4D4", GC.Spread.Sheets.LineStyle.thin); style.borderTop = new GC.Spread.Sheets.LineBorder("#D4D4D4", GC.Spread.Sheets.LineStyle.thin); style.borderRight = new GC.Spread.Sheets.LineBorder("#D4D4D4", GC.Spread.Sheets.LineStyle.thin); style.borderBottom = new GC.Spread.Sheets.LineBorder("#D4D4D4", GC.Spread.Sheets.LineStyle.thin); return style; }, //设置选中行底色 setSelStyle: function (sel, backColor) { let me = this; let sheet = me.workBook.getSheet(0); me.renderSheetFuc(sheet, function () { let style = me.getSelStyle(backColor); /*sel.row = sel.row === -1 ? 0 : sel.row;*/ for(let i = 0; i < sel.rowCount; i++){ let row = i + sel.row; sheet.setStyle(row, -1, style); } }); }, initSelection: function (newSel, oldSel = null) { let me = this; let node = me.tree.items[newSel.row]; //恢复底色 if(oldSel){ me.setSelStyle(oldSel, me.setting.style.defalutBackColor); } //设置选中行底色 if(newSel){ me.setSelStyle(newSel, me.setting.style.selectedColor); } me.tree.selected = node; me.preSelected = node; $(".tools-btn > a").not(".disabled").addClass("disabled"); $("#add-engineering-btn").addClass("disabled"); $('#add-tender-btn').removeClass('disabled'); if(node){ switch(node.data.projType) { case projectType.project: $("#del-btn").removeClass("disabled"); $("#add-engineering-btn").removeClass("disabled"); break; case projectType.folder: if(!node.children || node.children.length === 0){ $("#del-btn").removeClass("disabled"); } break; case projectType.engineering: $("#del-btn").removeClass("disabled"); $("#add-engineering-btn").removeClass("disabled"); break; case projectType.tender: $("#add-engineering-btn").removeClass("disabled"); $("#move-to-btn").removeClass("disabled"); $("#copy-to-btn").removeClass("disabled"); $("#share-btn").removeClass("disabled"); $("#cooperate-btn").removeClass("disabled"); $("#del-btn").removeClass("disabled"); break; } $("#rename-btn").removeClass("disabled"); } }, onSelectionChanging: function (sender, args) { let me = projTreeObj; me.initSelection(args.newSelections[0], args.oldSelections[0]); }, getShowData: function (datas) { for(let data of datas){ data.name = data.name ? data.name : ''; if(data.projType !== projectType.tender){ data.engineeringCost = ''; data.unitPriceFile = ''; data.feeRateFile = ''; data.createDateTime = ''; } else{ data.engineeringCost = data.engineeringCost ? data.engineeringCost : 0; data.unitPriceFile = data.property && data.property.unitPriceFile && data.property.unitPriceFile.name ? data.property.unitPriceFile.name : ''; data.feeRateFile = data.property && data.property.feeFile && data.property.feeFile.name ? data.property.feeFile.name : ''; data.createDateTime = data.createDateTime ? new Date(data.createDateTime).Format('yyyy-MM-dd') : ''; } } }, getTreeNodeCell: function (tree) { let indent = 20; let levelIndent = -5; let halfBoxLength = 5; let halfExpandLength = 3; let imgWidth = 18; let imgHeight = 14; let TreeNodeCellType = function () { }; TreeNodeCellType.prototype = new GC.Spread.Sheets.CellTypes.Text(); TreeNodeCellType.prototype.paint = function (ctx, value, x, y, w, h, style, options) { if (style.backColor) { ctx.save(); ctx.fillStyle = style.backColor; ctx.fillRect(x, y, w, h); ctx.restore(); } else { ctx.clearRect(x, y, w, h); } let drawLine = function (canvas, x1, y1, x2, y2, color) { ctx.save(); ctx.translate(0.5, 0.5); ctx.beginPath(); ctx.moveTo(x1, y1); ctx.lineTo(x2, y2); ctx.strokeStyle = color; ctx.stroke(); ctx.restore(); }; let drawExpandBox = function (ctx, x, y, w, h, centerX, centerY, expanded) { let rect = {}, h1, h2, offset = 1; rect.top = centerY - halfBoxLength; rect.bottom = centerY + halfBoxLength; rect.left = centerX - halfBoxLength; rect.right = centerX + halfBoxLength; if (rect.left < x + w) { rect.right = Math.min(rect.right, x + w); ctx.save(); ctx.translate(0.5, 0.5); ctx.strokeStyle = 'black'; ctx.beginPath(); ctx.moveTo(rect.left, rect.top); ctx.lineTo(rect.left, rect.bottom); ctx.lineTo(rect.right, rect.bottom); ctx.lineTo(rect.right, rect.top); ctx.lineTo(rect.left, rect.top); ctx.stroke(); ctx.fillStyle = 'white'; ctx.fill(); ctx.restore(); // Draw Horizontal Line h1 = centerX - halfExpandLength; h2 = Math.min(centerX + halfExpandLength, x + w); if (h2 > h1) { drawLine(ctx, h1, centerY, h2, centerY, 'black'); } // Draw Vertical Line if (!expanded && (centerX < x + w)) { drawLine(ctx, centerX, centerY - halfExpandLength, centerX, centerY + halfExpandLength, 'black'); } } } let node = tree.items[options.row]; let showTreeLine = true; if (!node) { return; } let centerX = Math.floor(x) + node.depth() * indent + node.depth() * levelIndent + indent / 2; let x1 = centerX + indent / 2; let centerY = Math.floor((y + (y + h)) / 2); let y1; // Draw Sibling Line if (showTreeLine) { // Draw Horizontal Line if (centerX < x + w) { drawLine(ctx, centerX, centerY, Math.min(x1, x + w), centerY, 'gray'); let img; if(node.data.projType === projectType.folder){ img = document.getElementById('folder_open_pic'); imgWidth = 15; } else if(node.data.projType === projectType.project){ img = document.getElementById('proj_pic'); imgWidth = 18; } else if(node.data.projType === projectType.engineering){ img = document.getElementById('eng_pic'); imgWidth = 14; } else if(node.data.projType === projectType.tender){ img = document.getElementById('tender_pic'); imgWidth = 14; } ctx.drawImage(img, centerX+indent/2+3, centerY - 7, imgWidth,imgHeight); } // Draw Vertical Line if (centerX < x + w) { y1 = node.isLast() ? centerY : y + h; if (node.isFirst() && !node.parent.parent) { drawLine(ctx, centerX, centerY, centerX, y1, 'gray'); } else { drawLine(ctx, centerX, y, centerX, y1, 'gray'); } } } // Draw Expand Box if (node.children.length > 0) { drawExpandBox(ctx, x, y, w, h, centerX, centerY, node.expanded); } // Draw Parent Line if (showTreeLine) { var parent = node.parent, parentCenterX = centerX - indent - levelIndent; while (parent.parent) { if (!parent.isLast()) { if (parentCenterX < x + w) { drawLine(ctx, parentCenterX, y, parentCenterX, y + h, 'gray'); } } parent = parent.parent; parentCenterX -= (indent + levelIndent); } }; // Draw Text //x = x + (node.depth() + 1) * indent + node.depth() * levelIndent; x = x + (node.depth() + 1) * indent + node.depth() * levelIndent + imgWidth + 3; GC.Spread.Sheets.CellTypes.Text.prototype.paint.apply(this, arguments); }; TreeNodeCellType.prototype.getHitInfo = function (x, y, cellStyle, cellRect, context) { return { x: x, y: y, row: context.row, col: context.col, cellStyle: cellStyle, cellRect: cellRect, sheetArea: context.sheetArea, isReservedLocation: true }; }; TreeNodeCellType.prototype.processMouseDown = function (hitinfo) { let offset = -1; let node = tree.items[hitinfo.row]; tree.selected = node; let centerX = hitinfo.cellRect.x + offset + node.depth() * indent + node.depth() * levelIndent + indent / 2; let centerY = (hitinfo.cellRect.y + offset + (hitinfo.cellRect.y + offset + hitinfo.cellRect.height)) / 2; let text = hitinfo.sheet.getText(hitinfo.row, hitinfo.col); let value = hitinfo.sheet.getValue(hitinfo.row, hitinfo.col); let acStyle = hitinfo.sheet.getActualStyle(hitinfo.row, hitinfo.col), zoom = hitinfo.sheet.zoom(); let textLength = this.getAutoFitWidth(value, text, acStyle, zoom, {sheet: hitinfo.sheet, row: hitinfo.row, col: hitinfo.col, sheetArea: GC.Spread.Sheets.SheetArea.viewport}); //(图标+名字)区域 function withingClickArea(){ return hitinfo.x > centerX + halfBoxLength && hitinfo.x < centerX + halfBoxLength + imgWidth + indent/2+3 + textLength; } //建设项目,侧滑汇总 if(node.data.projType === projectType.project && withingClickArea()){ setDataToSideBar(); $(".slide-sidebar").animate({width:"800"}).addClass("open"); $('body').unbind('click'); setTimeout(function () { $("body").bind('click', function (event) { var e = event || window.event; //浏览器兼容性 if (!$(event.target).is('a')) { var elem = event.target || e.srcElement; while (elem) { //循环判断至跟节点,防止点击的是div子元素 if (elem.className == "open-sidebar" || elem.className == 'slide-sidebar open') { return false; } elem = elem.parentNode; } $(".slide-sidebar").animate({width: "0"}).removeClass("open")// 关闭处理 } }); }, 100); } //单项文件,进入造价书界面 else if(node.data.projType === projectType.tender && withingClickArea()){ let newTab = window.open('about:blank'); BeforeOpenProject(node.data.ID, {'fullFolder': GetFullFolder(node.parent)}, function () { let mainUrl = `/main?project=${node.data.ID}`; CommonAjax.get(mainUrl, [], function () { newTab.location.href = mainUrl; }); }); return; } if (!node || node.children.length === 0) { return; } if (hitinfo.x > centerX - halfBoxLength && hitinfo.x < centerX + halfBoxLength && hitinfo.y > centerY - halfBoxLength && hitinfo.y < centerY + halfBoxLength) { node.setExpanded(!node.expanded); TREE_SHEET_HELPER.massOperationSheet(hitinfo.sheet, function () { let iCount = node.posterityCount(), i, child; for (i = 0; i < iCount; i++) { child = tree.items[hitinfo.row + i + 1]; hitinfo.sheet.setRowVisible(hitinfo.row + i + 1, child.visible, hitinfo.sheetArea); } hitinfo.sheet.invalidateLayout(); }); hitinfo.sheet.repaint(); } }; TreeNodeCellType.prototype.processMouseMove = function (hitInfo) { let sheet = hitInfo.sheet; let div = sheet.getParent().getHost(); let canvasId = div.id + "vp_vp"; let canvas = $(`#${canvasId}`)[0]; //改变鼠标图案 let node = tree.items[hitInfo.row]; let offset = -1; let centerX = hitInfo.cellRect.x + offset + node.depth() * indent + node.depth() * levelIndent + indent / 2; let text = hitInfo.sheet.getText(hitInfo.row, hitInfo.col); let value = hitInfo.sheet.getValue(hitInfo.row, hitInfo.col); let acStyle = hitInfo.sheet.getActualStyle(hitInfo.row, hitInfo.col), zoom = hitInfo.sheet.zoom(); let textLength = this.getAutoFitWidth(value, text, acStyle, zoom, {sheet: hitInfo.sheet, row: hitInfo.row, col: hitInfo.col, sheetArea: GC.Spread.Sheets.SheetArea.viewport}); if (sheet && hitInfo.x > centerX + halfBoxLength && hitInfo.x < centerX + halfBoxLength + imgWidth + indent/2+3 + textLength) { canvas.style.cursor='pointer'; return true; }else{ canvas.style.cursor='default'; } return false; }; return new TreeNodeCellType(); }, setCellValue: function (cell, node) { const sheet = this.workBook.getActiveSheet(); const {row, col} = cell; let dataCode = this.setting.header[col]['dataCode']; let value = ''; if(dataCode === 'engineeringCost'){ if(node.data.projType === projectType.tender){ value = node.data.engineeringCost ? node.data.engineeringCost : 0; } } else if(dataCode === 'unitPriceFile'){ if(node.data.projType === projectType.tender){ value = node.data.property && node.data.property.unitPriceFile && node.data.property.unitPriceFile.name ? node.data.property.unitPriceFile.name : ''; } } else if(dataCode === 'feeRateFile'){ if(node.data.projType === projectType.tender){ value = node.data.property && node.data.property.feeFile && node.data.property.feeFile.name ? node.data.property.feeFile.name : ''; } } else if(dataCode === 'createDateTime'){ value = node.data.createDateTime ? new Date(node.data.createDateTime).Format('yyyy-MM-dd') : ''; } else { value = node.data[dataCode] ? node.data[dataCode] : ''; } sheet.setValue(row, col, value); }, showTreeData: function (nodes, headers) { let me = this; let sheet = me.workBook.getActiveSheet(); let fuc = function(){ sheet.setRowCount(nodes.length); for(let i = 0; i < nodes.length; i++){ let treeNodeCell = me.getTreeNodeCell(me.tree); sheet.getCell(i, 0).cellType(treeNodeCell); for(let j = 0; j < headers.length; j++){ sheet.getRange(-1, j, -1, 1).hAlign(GC.Spread.Sheets.HorizontalAlign[headers[j]['hAlign']]); sheet.getRange(-1, j, -1, 1).vAlign(GC.Spread.Sheets.VerticalAlign[headers[j]['vAlign']]); me.setCellValue({row: i, col: j}, nodes[i]); let dataCode = headers[j].dataCode; //sheet.setValue(i, j, nodes[i]['data'][dataCode]); } } }; me.renderSheetFuc(sheet, fuc); }, refreshNodeData: function (node) { let me = this; let sheet = me.workBook.getActiveSheet(); let header = me.setting.header; let rIdx = me.tree.items.indexOf(node); me.renderSheetFuc(sheet, function () { for(let i = 0; i < header.length; i++){ me.setCellValue({row: rIdx, col: i}, node); } }); }, insert: function (data, parent, next) { let node = this.tree.addNodeData(data, parent, next); this.addRow(node); return node; }, addRow: function (node) { const me = this; const sheet = this.workBook.getActiveSheet(); me.renderSheetFuc(sheet, function () { const items = me.tree.items; const rIdx = items.indexOf(node); const cIdx = sheet.getActiveColumnIndex(); sheet.addRows(rIdx, 1); //set selection selected sheet.setSelection(rIdx, cIdx, 1, 1); me.tree.selected = node; //父节点收起时添加子节点,子节点添加完后隐藏 if(node.parent && !node.parent.expanded){ sheet.setRowVisible(rIdx, false); } sheet.getCell(rIdx, 0).cellType(me.getTreeNodeCell(me.tree)); me.refreshNodeData(node); }); }, remove: function (sheet, rIdx, count) { let me = this; me.renderSheetFuc(sheet, function () { sheet.deleteRows(rIdx, count); sheet.setRowCount(me.tree.items.length); me.initSelection({row: sheet.getActiveRowIndex(), rowCount: 1}); }); }, move: function (orgRow, newRow) { this.workBook.getActiveSheet().deleteRows(orgRow, 1); this.addRow(this.tree.items[newRow]); } }; $(document).ready(function() { init(); $('#tab_pm_all').on('show.bs.tab', function () { gcTreeObj.tree = null; init(); }); // 侧滑数据 /* $(".poj-list").on('click', ".open-sidebar", function() { setDataToSideBar(); $(".slide-sidebar").animate({width:"800"}).addClass("open"); });*/ //单价、费率文件删除确认 $('#fileDelConfirm').click(function () { if(fileDelObj && fileDelObj.id){ let updateObj = Object.create(null); updateObj.updateType = 'delete'; updateObj.updateData = Object.create(null); if(fileDelObj.fileType === fileType.unitPriceFile){ updateObj.updateData.id = fileDelObj.id; } else if(fileDelObj.fileType === fileType.feeRateFile){ updateObj.updateData.ID = fileDelObj.id; } updateObj.fileType = fileDelObj.fileType; a_updateFiles([updateObj], function () { fileDelObj = null; $('#fileDelCancel').click(); //refresh front? }); } }); //绑定新建建设项目、新建单项工程、新建文件夹、重命名Enter键事件 bindInputs($('#project-name'), $('#engineering-name'), $('#folder-name'), $('#rename-name')); //绑定新建建设项目、新建单项工程、新建文件夹、重命名弹窗隐藏事件 bindModalsHidden($('#add-project-dialog'), $('#add-engineering-dialog'), $('#add-folder-dialog'), $('#rename-dialog')); // 新增建设项目点击 $('#add-project-btn').click(function () { let selectedItem = projTreeObj.tree.selected; $('#add-project-dialog').modal('show'); }); // 新增建设项目操作 $('#addProjOk').click(function () { AddProject(); }); // 选择计价方式 $("input[name='valuation_type']").click(function() { let type = $(this).val(); let targetData = type === 'bill' ? JSON.parse(billValuation) : JSON.parse(rationValuation); let html = ''; for(let valuation of targetData) { if (valuation === null) { continue; } html += ''; } $("#valuation").html(html); $("#tender-engineering").html(''); }); //选择计价规则 $("#valuation").change(function () { let engineeringList = getEngineeringList(); let engineeringHtml = getEngineeringHtml(engineeringList); $("#tender-engineering").html(engineeringHtml); $('#valuation-info').hide(); }); // 新增单项项目点击 $("#add-engineering-btn").click(function() { let selectedItem = projTreeObj.tree.selected; try { if(selectedItem !== null && selectedItem.data.projType !== projectType.folder){ $("#add-engineering-dialog").modal("show"); } } catch (error) { alert(error); } }); // 新增单项工程操作 $("#add-engineering-confirm").click(function() { AddEngineering(); }); // 新增单位工程点击 $("#add-tender-btn").click(function() { let selectedItem = projTreeObj.tree.selected; $("#add-tender-dialog").modal("show"); }); //新建单位工程-建设项目提示 $('#poj-name').change(function () { let pojName = $('#poj-name').val().trim(); let nameList = getNameList($('#poj-name-list').children()); let isExist = hasListName(nameList, pojName); if(!isExist){ if(pojName !== ''){ replaceClass($('#poj-name-info'), 'text-danger', 'text-info'); setDangerInfo($('#poj-name-info'), `新建“${pojName}”`); } //清空单项工程下拉和文件下拉 setEngOptions(null); setFileOptions(null); } else { $('#poj-name-info').hide(); } }); //新建单位工程-单项工程提示 $('#eng-name').change(function () { let engName = $('#eng-name').val().trim(); let nameList = getNameList($('#eng-name-list').children()); let isExist = hasListName(nameList, engName); if(!isExist){ if(engName !== ''){ replaceClass($('#eng-name-info'), 'text-danger', 'text-info'); setDangerInfo($('#eng-name-info'), `新建“${engName}”`); } } else { $('#eng-name-info').hide(); } }); //新建单位工程-单位工程提示 $('#tender-name').change(function () { let selected = projTreeObj.tree.selected; let pojName = $('#poj-name').val().trim(); let engName = $('#eng-name').val().trim(); let tenderName = $('#tender-name').val().trim(); let isExist = hasTender(selected, pojName, engName, tenderName); if(isExist){ if(tenderName !== '') setDangerInfo($('#tender-name-info'), `已存在“${tenderName}”`); } else { $('#tender-name-info').hide(); } }); //下拉是否含有输入的名字 function hasListName(nameList, name){ for(let i = 0, len = nameList.length; i < len; i++){ if(nameList[i] === name){ return true; } } return false; } function getNameList(list){ let rst = []; for(let i = 0, len = list.length; i < len; i++){ rst.push($(list[i]).text()); } return rst; } // 新增单位工程弹层改变 $('#add-tender-dialog').on('show.bs.modal', function() { //clear info $('#poj-name-info').hide(); $('#eng-name-info').hide(); $('#tender-name-info').hide(); $('#tender-name').val(''); $('#valuation-info').hide(); $('#engineering-info').hide(); //获取建设项目 let selected = projTreeObj.tree.selected; let projs = getProjs(selected); setProjOptions(projs, selected); $($("input[name='valuation_type']")[0]).click(); }); // 新增单位工程 $("#add-tender-confirm").click(function() { AddTender(); }); // 新增文件夹按钮点击 $("#add-folder-btn").click(function() { $("#add-folder-dialog").modal("show"); }); // 新增文件夹操作 $("#add-folder-confirm").click(function() { AddFolder(); }); // 删除按钮点击 $('#del-btn').click(function() { if (projTreeObj.tree && projTreeObj.tree.selected) { $('#del').modal('show'); } }); // 删除时文字替换 $('#del').on('show.bs.modal', function() { let hasTenderChild = function (children) { for (let i = 0; i < children.length; i++) { if (children[i].children.length === 0) { if (children[i].data.projType === 'Tender') { return true; } } else if (hasTenderChild(children[i].children)) { return true; } } return false; }; // 显示内容 let tenderHintElement = $('#tenderHint'); let folderHintElement = $('#folderHint'); if (projTreeObj.tree.selected.children.length === 0) { tenderHintElement.show(); tenderHintElement.text('删除 "' + projTreeObj.tree.selected.data.name +'" ?'); folderHintElement.hide(); } else { tenderHintElement.hide(); folderHintElement.show(); folderHintElement.text('删除 "'+ projTreeObj.tree.selected.data.name +'" 以及它包含的子项?'); } // 显示是否可以找回 if (hasTenderChild([projTreeObj.tree.selected])) { $('#restoreHint').show(); } else { $('#restoreHint').hide(); } }); // 删除操作 $('#delete-confirm').click(function () { let updateData = null; let dialog = $('#del'); if (projTreeObj.tree) { updateData = GetDeleteUpdateData(projTreeObj.tree.selected); UpdateProjectData(updateData, function () { dialog.modal('hide'); //删除行号 let rIdx = projTreeObj.tree.items.indexOf(projTreeObj.tree.selected); //删除行数 let rCout = projTreeObj.tree.selected.posterityCount() + 1; projTreeObj.tree.removeNode(projTreeObj.tree.selected); //delete view let sheet = projTreeObj.workBook.getActiveSheet(); projTreeObj.remove(sheet, rIdx, rCout); }); } }); // 重命名按钮点击 $('#rename-btn').click(function() { if (!projTreeObj.tree) { return false; } if (!projTreeObj.tree.selected) { alert('请选择需要重命名的数据'); return false; } $('#rename-dialog').modal('show'); }); // 重命名操作 $("#rename-confirm").click(function() { let select = projTreeObj.tree.selected; let newName = $('#rename-name').val(); let dialog = $('#rename-dialog'); if (newName === '') { setDangerInfo($('#rename-name-info'), '请输入重命名'); return false; } if (newName === select.data.name) { dialog.modal('hide'); return false; } RenameProject(select.id(), newName, select.data.ParentID, function () { setDangerInfo($('#rename-name-info'), '', false); dialog.modal('hide'); select.data.name = newName; let sheet = projTreeObj.workBook.getActiveSheet(); sheet.setValue(sheet.getActiveRowIndex(), 0, newName); }); }); // 移动到按钮点击 $('#move-to-btn').click(function () { if (projTreeObj.tree && projTreeObj.tree.selected) { $('#move-to-dialog').modal('show'); } }); // 移动到窗口内容重组 $('#move-to-dialog').on('show.bs.modal', function () { movetoZTree = ConvertTreeToZtree(projTreeObj.tree, $('#treeDemo'), projTreeObj.tree.selected); }); // 移动到操作 $('#move-to-confirm').click(function () { let updateData = null; let dialog = $('#move-to-dialog'); let target = GetTargetTreeNode($.fn.zTree.getZTreeObj('treeDemo')); let cur = projTreeObj.tree.selected; if (!target) { dialog.modal('hide'); return false; } if (target.data.projType !== projectType.engineering) { alert("请移动到单项工程中!"); return false; } // 判断同级是否有同名 if (target.children.length > 0) { for (let tmp in target.children) { if (tmp === 0) { continue; } if (target.children[tmp].data.name === cur.data.name) { alert("对应单项工程中存在同名数据!"); return false; } } } let parent = target; let next = target.firstChild(); if (parent !== cur.parent || (next !== cur && next !== cur.nextSibling)){ let typeInfo = { updateType: 'update', projectType: null }; updateData = GetUpdateData(null, parent, next, '', null, projTreeObj.tree.selected.id(), typeInfo); //维护cur pre let curPre = cur.preSibling(); if(curPre){ updateData.push({updateType: 'update', updateData: {ID: curPre.id(), NextSiblingID: cur.nid()}}); } UpdateProjectData(updateData, function (data) { dialog.modal('hide'); let orgRow = projTreeObj.tree.items.indexOf(projTreeObj.tree.selected); projTreeObj.tree.move(projTreeObj.tree.selected, parent, next); let newRow = projTreeObj.tree.items.indexOf(projTreeObj.tree.selected); //view move projTreeObj.move(orgRow, newRow); }); } else { dialog.modal('hide'); } }); // 复制到按钮点击 $('#copy-to-btn').click(function () { let selectedItem = projTreeObj.tree.selected; try { let selectedType = selectedItem !== null && selectedItem.data !== undefined ? selectedItem.data.projType : ''; if (selectedType !== projectType.tender) { throw '请选择单位工程进行复制'; } } catch (error) { alert(error); return false; } $('#copy-to-dialog').modal('show'); }); // 复制到弹层替换 $('#copy-to-dialog').on('show.bs.modal', function () { copytoZTree = ConvertTreeToZtree(projTreeObj.tree, $('#treeDemo2'), null); }); // 复制到操作 $("#copy-to-confirm").click(function() { let dialog = $('#copy-to-dialog'); let target = GetTargetTreeNode($.fn.zTree.getZTreeObj('treeDemo2')); let parent = null; let next = null; let pre = null; let cur = projTreeObj.tree.selected; if (!target) { return false; } if (target.data.projType !== projectType.engineering) { alert("请移动到单项工程中!"); return false; } if (target.data.projType !== projectType.tender && target.children.length !== 0 && target.firstChild().data.projType !== projectType.tender) { dialog.modal('hide'); } // 判断同级是否有同名 if (target.children.length > 0) { for (let tmp in target.children) { if (tmp === 0) { continue; } if (target.children[tmp].data.name === cur.data.name) { alert("对应单项工程中存在同名数据!"); return false; } } } if (target.data.projType === projectType.tender) { parent = target.parent; next = target.nextSibling; } else { parent = target; next = target.firstChild(); } if (parent !== cur.parent || (next !== cur && next !== cur.nextSibling)){ CommonAjax.post('/pm/api/getNewProjectID', {count: 1, user_id: userID}, function (IDs) { let typeInfo = { updateType: 'copy', projType: cur.data.projectType }; let updateData = GetUpdateData(null, parent, next, cur.data.name, cur.data.property, IDs.lowID, typeInfo); updateData.forEach(function (data) { if (data.updateType === 'copy') { data['srcProjectId'] = cur.id(); } }); pre = GetNeedUpdatePreNode(parent, next); if (pre) { updateData = {}; updateData['updateType'] = 'update'; updateData['updateData'] = {}; updateData['updateData'][projTreeObj.tree.setting.tree.id] = pre.id(); updateData['updateData'][projTreeObj.tree.setting.tree.nid] = projTreeObj.tree.maxNodeId() + 1; } projTreeObj.tree.maxNodeId(IDs.lowID - 1); CommonAjax.post('/pm/api/copyProjects', {updateData: updateData, user_id: userID}, function (data) { dialog.modal('hide'); data.forEach(function (nodeData) { if (nodeData.updateType === 'copy') { projTreeObj.insert(nodeData.updateData, parent, next); } }); }, function () { dialog.modal('hide'); }); }); } }); // 选择工程专业后动态更改费率文件等数据 $("#tender-engineering").change(function() { $('#engineering-info').hide(); let engineeringList = getEngineeringList(); if(engineeringList.length === 0){ return false; } let selectedEngineering = $(this).val(); selectedEngineering = parseInt(selectedEngineering); let currentLib = {}; for(let engineering of engineeringList) { if (engineering.engineering === selectedEngineering) { currentLib = engineering.lib; } } if (Object.keys(currentLib).length <= 0) { return false; } // 输出数据到页面 if (currentLib.fee_lib !== undefined && currentLib.fee_lib.length > 0) { $("#tender-fee-rate").children("option").first().val("newFeeRate-"+currentLib.fee_lib[0].id); } $(this).parent().siblings('.hidden-area').slideDown('fast'); }); }); /** * 初始化数据 * * @return {void} */ function init() { billValuation = billValuation.replace(/\n/g, '\\n'); rationValuation = rationValuation.replace(/\n/g, '\\n'); //init spread and pmTree $.bootstrapLoading.start(); GetAllProjectData(function (datas) { // projTreeObj.getShowData(datas); projTreeObj.tree = pmTree.createNew(projTreeObj.setting, datas); projTreeObj.tree.selected = projTreeObj.tree.items[0]; projTreeObj.buildSheet(); projTreeObj.showTreeData(projTreeObj.tree.items, projTreeObj.setting.header); //初始选择 let initSel = projTreeObj.workBook.getSheet(0).getSelections()[0] ? projTreeObj.workBook.getSheet(0).getSelections()[0] : {row: 0, rowCount: 1}; projTreeObj.initSelection(initSel); $.bootstrapLoading.end(); }); engineering = engineeringList !== null && engineeringList !== undefined ? JSON.parse(engineeringList) : []; } /** * 新增建设项目 * * @return {boolean} */ function AddProject() { let name = $('#project-name').val().trim(); if (name === '') { setDangerInfo($('#project-name-info'), '请填写建设项目名称'); return false; } let existCallback = function () { setDangerInfo($('#project-name-info'), `已存在“${$("#project-name").val()}”`); }; let sucCallback = function () { $('#add-project-dialog').modal('hide'); $('#project-name').val(''); setDangerInfo($('#project-name-info'), '', false); }; let selectedItem = projTreeObj.tree.selected; /* * (1)、当前没有焦点行,新建建设项目为第一个节点。 (2)、当前定位在文件夹,新建建设项目为文件夹的最后一个子节点。 (3)、当前定位在建设项目,新建建设项目为其后兄弟。 (4)、当前定位在单项工程或单位工程,新建项目为当前所属建设项目的后兄弟。 * */ if(!selectedItem){ AddSiblingsItem(selectedItem, name, null, projectType.project, existCallback, sucCallback); } else { if(selectedItem.data.projType === projectType.project){ AddSiblingsItem(selectedItem, name, null, projectType.project, existCallback, sucCallback); } else if(selectedItem.data.projType === projectType.engineering || selectedItem.data.projType === projectType.tender){ let proj = selectedItem.parent.data.projType === projectType.project ? selectedItem.parent : selectedItem.parent.parent; AddSiblingsItem(proj, name, null, projectType.project, existCallback, sucCallback); } else if(selectedItem.data.projType === projectType.folder){ AddChildrenItem(selectedItem, name, null, projectType.project, existCallback, sucCallback); } } } //新建建设项目、新建单项工程、新建文件夹、重命名弹窗隐藏事件 function bindModalsHidden(projDialog, engDialog, folderDialog, renameDialog){ projDialog.on('hidden.bs.modal', function () { setDangerInfo($('#project-name-info'), '', false); $('#project-name').val(''); }); engDialog.on('hidden.bs.modal', function () { setDangerInfo($('#engineering-name-info'), '', false); $('#engineering-name').val(''); }); folderDialog.on('hidden.bs.modal', function () { setDangerInfo($('#folder-name-info'), '', false); $('#folder-name').val(''); }); renameDialog.on('hidden.bs.modal', function () { setDangerInfo($('#rename-name-info'), '', false); $('#rename-name').val(''); }); } //绑定新建建设项目、新建单项工程、新建文件夹、重命名回车键功能 function bindInputs(projInput, engInput, foldInput, renameInput){ projInput.bind('keypress', function (event) { if(event.keyCode === 13){ $('#addProjOk').click(); return false; } }); engInput.bind('keypress', function (event) { if(event.keyCode === 13){ $('#add-engineering-confirm').click(); return false; } }); foldInput.bind('keypress', function (event) { if(event.keyCode === 13){ $('#add-folder-confirm').click(); return false; } }); renameInput.bind('keypress', function (event) { if(event.keyCode === 13){ $('#rename-confirm').click(); return false; } }); } //新建建设项目、单项工程、文件夹、重命名提示(文本改变,暂时不需要) function getChangedFunc(input, nameInfo){ return function () { let selected = Tree.selected(); let parent = selected ? selected.parent : Tree._root; let name = input.val(); if(existName(name, parent.children)){ nameInfo.text(`已存在“${name}”`); nameInfo.show(); } else { nameInfo.text(''); nameInfo.hide(); } } } function AddTenderItems(selected, projName, engName, tenderName, property, callback){ const addPath = {p_e_t: 'p_e_t', e_t: 'e_t', t: 't'}; let path, updateDatas = []; let tempProjs = getProjs(selected); let tempProj = getNodeByName(projName, tempProjs); let tempEng; if(tempProj){ tempEng = getNodeByName(engName, tempProj.children); if(tempEng){ path = addPath.t; } else { path = addPath.e_t } } else { path = addPath.p_e_t; } if(path === addPath.p_e_t){ let parent, pre, next; GetNewProjectId(3, function (IDs) { let projID = IDs.lowID, engID = IDs.lowID + 1, tenderID = IDs.lowID + 2; if(!selected || selected.data.projType === projectType.project){ parent = selected ? selected.parent : projTreeObj.tree._root; pre = selected; next = selected ? selected.nextSibling : projTreeObj.tree.firstNode(); } else if(selected.data.projType === projectType.folder){ parent = selected ? selected : projTreeObj.tree._root; pre = selected ? selected.lastChild() : projTreeObj.tree.firstNode(); next = null; } else if(selected.data.projType === projectType.engineering || selected.data.projType === projectType.tender){ let selectedProj = selected.parent.data.projType === projectType.project ? selected.parent : selected.parent.parent; parent = selectedProj ? selectedProj.parent : projTreeObj.tree._root; pre = selectedProj; next = selectedProj ? selectedProj.nextSibling : projTreeObj.tree.firstNode(); } let updateProjs = GetUpdateData(pre, parent, next, projName, null, projID, {updateType: 'new', projectType: projectType.project}); let updateEng = {updateType: 'new', updateData: {ID: engID, ParentID: projID, NextSiblingID: -1, name: engName, projType: projectType.engineering}}; property.rootProjectID = projID; let updateTender = {updateType: 'new', updateData: {ID: tenderID, ParentID: engID, NextSiblingID: -1, name: tenderName, projType: projectType.tender, property: property}}; updateDatas = updateDatas.concat(updateProjs); updateDatas.push(updateEng); updateDatas.push(updateTender); UpdateProjectData(updateDatas, function(datas){ let projData, engData, tenderData; datas.forEach(function (data) { if (data.updateType === 'new') { if(data.updateData.projType === projectType.project){ projData = data.updateData; } else if(data.updateData.projType === projectType.engineering){ engData = data.updateData; } else if(data.updateData.projType === projectType.tender){ tenderData = data.updateData; } } }); let pojNode = projTreeObj.insert(projData, parent, next); let engNode = projTreeObj.insert(engData, pojNode, null); projTreeObj.insert(tenderData, engNode, null); callback(); }); }); } else if(path === addPath.e_t){ GetNewProjectId(2, function (IDs) { let engID = IDs.lowID, tenderID = IDs.lowID + 1; let pre = tempProj.lastChild(); let next = null; let updateEng = {updateType: 'new', updateData: {ID: engID, ParentID: tempProj.data.ID, NextSiblingID: -1, name: engName, projType: projectType.engineering}}; property.rootProjectID = tempProj.data.ID; let updateTender = {updateType: 'new', updateData: {ID: tenderID, ParentID: engID, NextSiblingID: -1, name: tenderName, projType: projectType.tender, property: property}}; if(selected && selected.data.projType === projectType.engineering && selected.parent === tempProj){ pre = selected; next = selected.nextSibling; updateEng.updateData.NextSiblingID = pre.data.NextSiblingID; } updateDatas.push(updateEng); updateDatas.push(updateTender); if(pre){ updateDatas.push({updateType: 'update', updateData: {ID: pre.id(), NextSiblingID: engID}}); } UpdateProjectData(updateDatas, function (datas) { let engData, tenderData; datas.forEach(function (data) { if (data.updateType === 'new') { if(data.updateData.projType === projectType.engineering){ engData = data.updateData; } else if(data.updateData.projType === projectType.tender){ tenderData = data.updateData; } } }); let engNode = projTreeObj.insert(engData, tempProj, next); projTreeObj.insert(tenderData, engNode, null); callback(); }); }); } else if(path === addPath.t){ GetNewProjectId(1, function (IDs) { let tenderID = IDs.lowID; let pre = tempEng.lastChild(); property.rootProjectID = tempProj.data.ID; let updateTender = {updateType: 'new', updateData: {ID: tenderID, ParentID: tempEng.id(), NextSiblingID: -1, name: tenderName, projType: projectType.tender, property: property}}; updateDatas.push(updateTender); if(pre){ updateDatas.push({updateType: 'update', updateData: {ID: pre.id(), NextSiblingID: tenderID}}); } UpdateProjectData(updateDatas, function (datas) { datas.forEach(function (data) { if(data.updateType === 'new') { projTreeObj.insert(data.updateData, tempEng, null); } }); callback(); }) }); } } /** * 新增子元素 * * @param {String} name * @param {String} type * @param {function} callback * @return {void} */ function AddChildrenItem(selected, name, property, type, existCallback, sucCallback) { if(!selected){ selected = projTreeObj.tree.selected; } let parent = selected ? selected : projTreeObj.tree._root; let pre = selected ? selected.lastChild() : projTreeObj.tree.firstNode(); if(existName(name, parent.children)){ //alert('同级目录已存在相同名称数据.'); existCallback(); } else { GetNewProjectId(1, function(IDs) { let typeInfo = { updateType: 'new', projectType: type }; let updateData = GetUpdateData(pre, parent, null, name, property, IDs.lowID, typeInfo); projTreeObj.tree.maxNodeId(IDs.lowID - 1); UpdateProjectData(updateData, function(datas){ datas.forEach(function (data) { if (data.updateType === 'new') { projTreeObj.insert(data.updateData, parent, null); } }); sucCallback(); }); }); } } /** * 新增同级元素 * * @param {String} name * @param {String} type * @param {function} callback * @return {void} */ function AddSiblingsItem(selected, name, property, type, existCallback, sucCallback) { if(!selected){ selected = projTreeObj.tree.selected; } let parent = selected ? selected.parent : projTreeObj.tree._root; let next = selected ? selected.nextSibling : projTreeObj.tree.firstNode(); if(existName(name, parent.children)){ //alert('同级目录已存在相同名称数据.'); existCallback(); } else { GetNewProjectId(1, function(IDs) { let typeInfo = { updateType: 'new', projectType: type }; let updateData = GetUpdateData(selected, parent, next, name, property, IDs.lowID, typeInfo); projTreeObj.tree.maxNodeId(IDs.lowID - 1); UpdateProjectData(updateData, function(datas){ datas.forEach(function (data) { if (data.updateType === 'new') { projTreeObj.insert(data.updateData, parent, next); } }); sucCallback(); }); }); } } function getEngineeringList(){ let valuation = $("#valuation").val(); let valuationType = $("input[name='valuation_type']:checked").val(); let valuationData = valuationType === 'bill' ? JSON.parse(billValuation) : JSON.parse(rationValuation); let engineeringList = []; for(let tmp of valuationData) { if (tmp._id === valuation) { engineeringList = tmp.engineering_list; break; } } return engineeringList; } function getNodeByName(name, nodes){ for(let i = 0, len = nodes.length; i < len; i++){ if(name === nodes[i].data.name){ return nodes[i]; } } return null; } //同级是否重名 function existName(name , nodes){ for(let i = 0, len = nodes.length; i < len; i++){ if(name === nodes[i].data.name){ return true; } } return false; } //获取新建单位工程时的建设项目数据 function getProjs(selected){ let rst = []; let temp; let firstNode; if(!selected){ temp = projTreeObj.tree._root; firstNode = temp.children[0]; } else if(selected.data.projType === projectType.folder){ temp = selected; firstNode = temp.children[0]; } else if(selected.data.projType === projectType.project){ temp = selected.parent; firstNode = temp.children[0]; } else if(selected.data.projType === projectType.engineering || selected.data.projType === projectType.tender){ let proj = selected.parent.data.projType === projectType.project ? selected.parent : selected.parent.parent; temp = proj.parent; firstNode = proj; } for(let childNode of temp.children){ if(childNode.data.projType === projectType.project){ rst.push(childNode); } } if(firstNode){ //firstNode to first place let index = null; for(let i = 0, len = rst.length; i < len; i++){ if(rst[i].data.ID === firstNode.data.ID){ index = i; break; } } if(index){ rst.splice(index, 1); rst.splice(0, 0, firstNode); } } return rst; } function setFileOptions(projID){ // 获取单价文件数据 if(!projID){ $("#unit-price").children("option:not(':first')").remove(); let first = $("#tender-fee-rate").children("option").first(); $("#tender-fee-rate").empty(); $("#tender-fee-rate").append(first); } else { getUnitFile(projID, function (response) { $("#unit-price").children("option:not(':first')").remove(); if (response.data.length <= 0) { return false; } let unitFileHtml = ''; for(let tmp of response.data) { unitFileHtml += ''; } $("#unit-price").children("option").first().after(unitFileHtml); }); // 获取费率文件数据 getFeeRateFile(projID, function (response) { let first = $("#tender-fee-rate").children("option").first(); $("#tender-fee-rate").empty(); $("#tender-fee-rate").append(first); if (response.data.length <= 0) { return false; } for(let tmp of response.data) { let option = $("