1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021 |
- 'use strict';
- /**
- *
- *
- * @author Zhong
- * @date 2018/6/28
- * @version
- */
- const pmShare = (function () {
- const spreadDom = $('#shareSpread');
- let spreadObj = {workBook: null, sheet: null};
- let preSelection = null;
- //项目分享类型,由别人分享给自己的,和自己分享给别人的
- const shareType = {receive: 'receive', shareTo: 'shareTo'};
- //操作类型
- const oprType = {copy: 'copy', cancel: 'cancel'};
- let tree = null;
- const treeCol = 0;
- const treeSetting = {
- tree: {
- id: 'ID',
- pid: 'ParentID',
- nid: 'NextSiblingID',
- rootId: -1,
- autoUpdate: false
- }
- };
- const headers = [
- {name: '工程列表', dataCode: 'name', width: 300, rateWidth: 0.55, vAlign: 'center', hAlign: 'left'},
- {name: '由...分享', dataCode: 'from', width: 120, rateWidth: 0.15, vAlign: 'center', hAlign: 'left'},
- /* {name: '拷贝工程', dataCode: 'copy', width: 100, rateWidth: 0.075, vAlign: 'center', hAlign: 'left'},
- {name: '清除', dataCode: 'cancel', width: 100, rateWidth: 0.075, vAlign: 'center', hAlign: 'left'},*/
- {name: '工程造价', dataCode: 'engineeringCost', width: 100, vAlign: 'center', hAlign: 'right', formatter: '0.00'},
- {name: '分部分项合计', dataCode: 'subEngineering', width: 100, vAlign: 'center', hAlign: 'right', formatter: '0.00'},
- {name: '措施项目合计', dataCode: 'measure', width: 100, vAlign: 'center', hAlign: 'right', formatter: '0.00'},
- {name: '其他项目合计', dataCode: 'other', width: 100, vAlign: 'center', hAlign: 'right', formatter: '0.00'},
- {name: '规费', dataCode: 'charge', width: 100, vAlign: 'center', hAlign: 'right', formatter: '0.00'},
- {name: '税金', dataCode: 'tax', width: 100, vAlign: 'center', hAlign: 'right', formatter: '0.00'},
- {name: '占造价比例(%)', dataCode: 'rate', width: 100, vAlign: 'center', hAlign: 'right', formatter: '0.00'},
- {name: '建筑面积', dataCode: 'buildingArea', width: 100, vAlign: 'center', hAlign: 'right', formatter: '0.00'},
- {name: '单方造价', dataCode: 'perCost', width: 100, vAlign: 'center', hAlign: 'right', formatter: '0.00'},
- {name: '工程专业', dataCode: 'feeStandardName', width: 100, vAlign: 'center', hAlign: 'left'},
- ];
- const spreadOpts = {
- workBook: {
- tabStripVisible: false,
- allowContextMenu: false,
- allowCopyPasteExcelStyle : false,
- allowExtendPasteRange: false,
- allowUserDragDrop : false,
- allowUserDragFill: false,
- scrollbarMaxAlign : true
- },
- sheet: {
- isProtected: true,
- protectionOptions: {allowResizeRows: true, allowResizeColumns: true},
- clipBoardOptions: GC.Spread.Sheets.ClipboardPasteOptions.values
- }
- };
- const spreadEvents = {
- SelectionChanging: function (sender, info) {
- initSelection(info.newSelections[0], info.oldSelections[0]);
- }
- };
- //设置选中行底色
- //@param
- function setSelStyle(sel, backColor,sheet) {
- sel.row = sel.row === -1 ? 0 : sel.row;
- renderSheetFunc(sheet, function () {
- let style = projTreeObj.getSelStyle(backColor);
- for(let i = 0; i < sel.rowCount; i++){
- let row = i + sel.row;
- sheet.setStyle(row, -1, style);
- }
- });
- }
- //初始化焦点
- //@param {Object}newSel {Object}oldSel @return {void}
- function initSelection(newSel, oldSel = null) {
- let node = tree.items[newSel.row];
- tree.selected = node;
- shareSeleted = node;
- //恢复底色
- if(oldSel){
- setSelStyle(oldSel, projTreeObj.setting.style.defalutBackColor, spreadObj.sheet);
- }
- //设置选中行底色
- if(newSel){
- setSelStyle(newSel, projTreeObj.setting.style.selectedColor, spreadObj.sheet);
- }
- preSelection = newSel;
- }
- //渲染时方法,停止渲染
- //@param {Object}sheet {Function}func @return {void}
- function renderSheetFunc(sheet, func){
- sheet.suspendEvent();
- sheet.suspendPaint();
- if(func){
- func();
- }
- sheet.resumeEvent();
- sheet.resumePaint();
- }
- //设置表选项
- //@param {Object}workBook {Object}opts @return {void}
- function setSpreadOptions (workBook, opts) {
- for(let opt in opts.workBook){
- workBook.options[opt] = opts.workBook[opt];
- }
- for(let opt in opts.sheet){
- workBook.getActiveSheet().options[opt] = opts.sheet[opt];
- }
- }
- //建表头
- //@param {Object}sheet {Array}headers @return {void}
- function buildHeader(sheet, headers) {
- let fuc = function () {
- sheet.setColumnCount(headers.length);
- sheet.setRowHeight(0, 40, GC.Spread.Sheets.SheetArea.colHeader);
- //let spreadWidth = getWorkBookWidth();
- for(let i = 0, len = headers.length; i < len; i++){
- sheet.setColumnWidth(i, headers[i].width, GC.Spread.Sheets.SheetArea.colHeader);
- if(headers[i].formatter){
- sheet.setFormatter(-1, i, headers[i].formatter);
- }
- /* if(headers[i].dataCode === oprType.copy){
- //合并列
- sheet.addSpan(0, i, 1, 2, GC.Spread.Sheets.SheetArea.colHeader);
- sheet.setValue(0, i, '操作', GC.Spread.Sheets.SheetArea.colHeader);
- continue;
- }*/
- sheet.setValue(0, i, headers[i].name, GC.Spread.Sheets.SheetArea.colHeader);
- sheet.getRange(-1, i, -1, 1).hAlign(GC.Spread.Sheets.HorizontalAlign[headers[i]['hAlign']]);
- sheet.getRange(-1, i, -1, 1).vAlign(GC.Spread.Sheets.VerticalAlign[headers[i]['vAlign']]);
- }
- };
- renderSheetFunc(sheet, fuc);
- }
- //表监听事件
- //@param {Object}workBook @return {void}
- function bindEvent(workBook, events) {
- if(Object.keys(events).length === 0){
- return;
- }
- const Events = GC.Spread.Sheets.Events;
- for(let event in events){
- workBook.bind(Events[event], events[event]);
- }
- }
- //建表
- //@return {void}
- function buildSheet(){
- spreadObj.workBook = new GC.Spread.Sheets.Workbook(spreadDom[0], {sheetCount: 1});
- sheetCommonObj.spreadDefaultStyle(spreadObj.workBook);
- spreadObj.sheet = spreadObj.workBook.getActiveSheet();
- setSpreadOptions(spreadObj.workBook, spreadOpts);
- bindEvent(spreadObj.workBook, spreadEvents);
- buildHeader(spreadObj.sheet, headers);
- //全表不可编辑
- spreadObj.sheet.getRange(-1, -1, -1, -1).locked(true);
- }
- //此项目是否可以拷贝
- //@param {String}userID {Object}project @return {Boolean}
- function isAllowCopy(userID, project){
- for(let shareData of project.shareInfo){
- if(shareData.userID === userID){
- return shareData.allowCopy;
- }
- }
- return false;
- }
- //获取树节点
- //@param {Object}tree @return {Object}
- function getTreeNodeCell(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
- arguments[2] = x + (node.depth() + 1) * indent + node.depth() * levelIndent + imgWidth + 3;
- arguments[4] = w - (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) {
- let info = {x: x, y: y, row: context.row, col: context.col, cellStyle: cellStyle, cellRect: cellRect, sheetArea: context.sheetArea};
- let node = tree.items[info.row];
- let offset = -1;
- let centerX = info.cellRect.x + offset + node.depth() * indent + node.depth() * levelIndent + indent / 2;
- let text = context.sheet.getText(info.row, info.col);
- let value = context.sheet.getValue(info.row, info.col);
- let acStyle = context.sheet.getActualStyle(info.row, info.col),
- zoom = context.sheet.zoom();
- let textLength = this.getAutoFitWidth(value, text, acStyle, zoom, {sheet: context.sheet, row: info.row, col: info.col, sheetArea: GC.Spread.Sheets.SheetArea.viewport});
- if(info.x > centerX + halfBoxLength && info.x < centerX + halfBoxLength + imgWidth + indent/2+3 + textLength){
- info.isReservedLocation = true;
- }
- return info;
- };
- TreeNodeCellType.prototype.processMouseDown = function (hitinfo) {
- let offset = -1;
- let node = tree.items[hitinfo.row];
- 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.tender && withingClickArea()){
- let newTab = window.open('about:blank');
- //打开项目的实际ID
- BeforeOpenProject(node.data.actualTreeInfo.ID, {'fullFolder': GetFullFolder(node.parent)}, function () {
- let mainUrl = `/main?project=${node.data.actualTreeInfo.ID}`;
- CommonAjax.get(mainUrl, [], function () {
- newTab.location.href = mainUrl;
- });
- });
- }
- 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];
- //改变鼠标图案
- if (sheet && hitInfo.isReservedLocation) {
- canvas.style.cursor='pointer';
- return true;
- }else{
- canvas.style.cursor='default';
- }
- return false;
- };
- TreeNodeCellType.prototype.processMouseEnter = function (hitinfo) {
- let text = hitinfo.sheet.getText(hitinfo.row, hitinfo.col);
- let value = hitinfo.sheet.getValue(hitinfo.row, hitinfo.col);
- let tag = hitinfo.sheet.getTag(hitinfo.row, hitinfo.col);
- let acStyle = hitinfo.sheet.getActualStyle(hitinfo.row, hitinfo.col),
- zoom = hitinfo.sheet.zoom();
- let node = tree.items[hitinfo.row];
- let nodeIndent = node ? (node.depth() + 1) * indent + node.depth() * levelIndent + imgWidth + 3 : 0;
- let textLength = this.getAutoFitWidth(value, text, acStyle, zoom, {sheet: hitinfo.sheet, row: hitinfo.row, col: hitinfo.col, sheetArea: GC.Spread.Sheets.SheetArea.viewport});
- let cellWidth = hitinfo.sheet.getCell(-1, hitinfo.col).width();
- if(textLength > cellWidth - nodeIndent){
- TREE_SHEET_HELPER.showTipsDiv(text,{pos: {}},hitinfo);
- }
- };
- TreeNodeCellType.prototype.processMouseLeave = function (hitinfo) {
- TREE_SHEET_HELPER.tipDiv = 'hide';
- if (TREE_SHEET_HELPER._toolTipElement) {
- $(TREE_SHEET_HELPER._toolTipElement).hide();
- TREE_SHEET_HELPER._toolTipElement = null;
- };
- TREE_SHEET_HELPER.tipDivCheck();//延时检查:当tips正在show的时候,就调用了hide方法,会导致tips一直存在,所以设置一个超时处理
- }
- return new TreeNodeCellType();
- }
- //互动单元格
- function getInteractionCell() {
- let InteractionCell = function () {
- };
- InteractionCell.prototype = new GC.Spread.Sheets.CellTypes.Text();
- InteractionCell.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
- };
- };
- InteractionCell.prototype.processMouseDown = function (hitinfo) {
- let dataCode = headers[hitinfo.col]['dataCode'];
- let node = tree.items[hitinfo.row];
- 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(hitinfo.x - hitinfo.cellRect.x > 0 && hitinfo.x - hitinfo.cellRect.x < textLength){
- //由..分享,弹出分享者信息
- if(dataCode === 'from'){
- if(node.data.shareType === shareType.receive){
- $('#userinfo').find('h4').text(node.data.userInfo.name);
- $('#userinfo').find('h6').text(node.data.userInfo.company);
- let mobileHtml = `<i class="fa fa-tablet"> ${node.data.userInfo.mobile ? node.data.userInfo.mobile : ''}</i>`;
- $('#userinfo').find('li:first-child').html(mobileHtml);
- let emailHtml = `<i class="fa fa-envelope-o"> ${node.data.userInfo.email ? node.data.userInfo.email : ''}</i>`;
- $('#userinfo').find('li:last-child').html(emailHtml);
- $('#userinfo').modal('show');
- }
- }
- //分享给
- else if(dataCode === 'to'){
- if(node.data.shareType === shareType.shareTo){
- setShareToModal(node);
- $('#shareTo').modal('show');
- }
- }
- //操作
- else if(dataCode === oprType.copy){
- /* if(node.data.copy === '添加分享'){
- $('#sharePhone').val('');
- $('#share-info').hide();
- $('#share').find('.card').hide();
- $('#share').modal('show');
- $('#allowCopy').prop('checked', false);
- $('#allowCopyHint').hide();
- }
- else*/
- if(node.data.copy === '拷贝工程'){
- $('#copyShare').modal('show');
- }
- }
- else if (dataCode === oprType.cancel) {
- if (node.data.cancel === '清除') {
- let $p = $('<p>').text(`点“确定”按钮,确认清除分享文件 “${node.data.name}”。`);
- $('#cancelShare').find('.modal-body').empty();
- $('#cancelShare').find('.modal-body').append($p);
- $('#cancelShare').modal('show');
- }
- }
- }
- };
- InteractionCell.prototype.processMouseMove = function (hitInfo) {
- let dataCode = headers[hitInfo.col]['dataCode'];
- let node = tree.items[hitInfo.row];
- let sheet = hitInfo.sheet;
- let div = sheet.getParent().getHost();
- let canvasId = div.id + "vp_vp";
- let canvas = $(`#${canvasId}`)[0];
- //改变鼠标图案
- 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 - hitInfo.cellRect.x > 0 && hitInfo.x - hitInfo.cellRect.x < textLength) {
- canvas.style.cursor='pointer';
- return true;
- }else{
- canvas.style.cursor='default';
- }
- return false;
- };
- return new InteractionCell();
- }
- //设置分享给界面数据
- //@param {Object}selected @return {void}
- function setShareToModal(selected){
- $('#shareToInfo').empty();
- if(!selected){
- return;
- }
- let userIDs = [];
- for(let user of selected.data.shareInfo){
- userIDs.push(user.userID);
- }
- CommonAjax.post('/user/getUsers', {userIDs: userIDs}, function (rstData) {
- for(let userInfo of rstData){
- for(let user of selected.data.shareInfo){
- if(user.userID === userInfo._id){
- user.name = userInfo.real_name;
- user.company = userInfo.company;
- user.mobile = userInfo.mobile;
- user.email = userInfo.email;
- }
- }
- }
- let infoArr = [];
- for(let user of selected.data.shareInfo){
- let infoHtml = `<tr>
- <td style="width: 106px;">${user.name}</td>
- <td style="width: 146px;">${user.company}</td>
- <td style="width: 146px;">${user.mobile}</td>
- <td style="width: 156px;">${user.email}</td>
- <td style="width: 70px;text-align: center"><input value="allowCopy" ${user.allowCopy ? 'checked' : ''} type="checkbox"></td>
- <td style="width: 70px;text-align: center"><input value="cancelShare" type="checkbox"></td>
- </tr>`;
- infoArr.push(infoHtml);
- }
- let infoHtml = infoArr.join('');
- $('#shareToInfo').html(infoHtml);
- });
- }
- //更新项目分享信息
- //@param {Object}selected
- function updateShareInfo(selected){
- if(!selected){
- return;
- }
- let usersTr = $('#shareToInfo').find('tr');
- let newShareInfo = [];
- for(let i = 0; i < usersTr.length; i++){
- let userTr = usersTr[i];
- let allowCopy = $(userTr).find('input:first').prop('checked');
- let cancelShare = $(userTr).find('input:last').prop('checked');
- selected.data.shareInfo[i].allowCopy = allowCopy;
- if(!cancelShare){
- newShareInfo.push(selected.data.shareInfo[i]);
- }
- }
- CommonAjax.post('/pm/api/updateProjects', {user_id: userID, updateData: [{updateType: 'update', updateData: {ID: selected.data.ID, shareInfo: newShareInfo}}]}, function () {
- selected.data.shareInfo = newShareInfo;
- if(newShareInfo.length === 0){
- renderSheetFunc(spreadObj.sheet, function () {
- let rIdx = selected.serialNo();
- tree.removeNode(selected);
- spreadObj.sheet.deleteRows(rIdx, 1);
- spreadObj.sheet.setRowCount(tree.items);
- initSelection({row: spreadObj.sheet.getActiveRowIndex(), rowCount: 1},null);
- });
- }
- });
- }
- const foreColor = '#007bff';
- const cancelForeColor = 'red';
- //显示树结构数据
- //@param {Array}nodes {Array}headers @return {void}
- function showTreeData(nodes, headers){
- let sheet = spreadObj.workBook.getActiveSheet();
- let fuc = function(){
- sheet.setRowCount(nodes.length);
- for(let i = 0; i < nodes.length; i++){
- let treeNodeCell = getTreeNodeCell(tree);
- sheet.getCell(i, treeCol).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']]);
- let dataCode = headers[j].dataCode;
- if(dataCode === oprType.copy){
- let style = new GC.Spread.Sheets.Style();
- style.foreColor = foreColor;
- sheet.setStyle(i, j, style);
- sheet.getCell(i, j).cellType(getInteractionCell());
- }
- else if (dataCode === oprType.cancel) {
- let style = new GC.Spread.Sheets.Style();
- style.foreColor = cancelForeColor;
- sheet.setStyle(i, j, style);
- sheet.getCell(i, j).cellType(getInteractionCell());
- }
- else if(dataCode === 'from'){
- if(nodes[i].data.shareType && nodes[i].data.shareType === shareType.receive){
- let style = new GC.Spread.Sheets.Style();
- style.foreColor = foreColor;
- sheet.setStyle(i, j, style);
- sheet.getCell(i, j).cellType(getInteractionCell());
- }
- }
- else if(dataCode === 'to'){
- if(nodes[i].data.shareType && nodes[i].data.shareType === shareType.shareTo){
- let style = new GC.Spread.Sheets.Style();
- style.foreColor = foreColor;
- sheet.setStyle(i, j, style);
- sheet.getCell(i, j).cellType(getInteractionCell());
- }
- }
- sheet.setValue(i, j, nodes[i].data[dataCode] !== null && typeof nodes[i].data[dataCode] !== 'undefined' ? nodes[i].data[dataCode] : '');
- }
- }
- };
- renderSheetFunc(sheet, fuc);
- }
- //同一棵树,可能存在相同数据显示多条的问题(传入的datas中不存在相同数据),将真实树结构数据存在actualTreeInfo中,外部树结构数据用uuid重置。
- //@param {Array}datas
- function setTreeInfo(datas) {
- let IDMapping = {};
- for (let data of datas) {
- IDMapping[data.ID] = uuid.v1();
- }
- for (let data of datas) {
- data.actualTreeInfo = {ID: data.ID, ParentID: data.ParentID, NextSiblingID: data.NextSiblingID};
- data.ID = IDMapping[data.ID];
- data.NextSiblingID = IDMapping[data.NextSiblingID] ? IDMapping[data.NextSiblingID] : -1;
- data.ParentID = IDMapping[data.ParentID] ? IDMapping[data.ParentID] : -1;
- }
- }
- //整理同层数据的NextSiblingID,ParentID
- //@param {Array}datas {Number || String}pid @return {void}
- function sortSameDepthData(datas, pid) {
- for (let i = 0; i < datas.length; i++) {
- let data = datas[i],
- nextData = datas[i + 1];
- data.NextSiblingID = nextData ? nextData.ID : -1;
- data.ParentID = pid;
- }
- }
- //给项目设置分享信息:由xx分享、分享给我、可进行的操作,含有userInfo信息的文件为他人直接分享的文件,他人分享父级文件,子文件不含有userInfo信息
- //@param {Array}datas @return {void}
- function setShareInfo(datas) {
- for (let data of datas) {
- if (data.userInfo) {
- data.from = `由 ${data.userInfo.name} 分享`;
- data.to = '分享给 我';
- data.cancel = '清除';
- //拷贝操作只允许到单位工程级
- let tendersCanCopy = isAllowCopy(userID, data);
- let tenders = data.projType === projectType.tender ? [data] : _.filter(data.children, {projType: projectType.tender});
- for (let tender of tenders) {
- tender.copy = tendersCanCopy ? '拷贝工程' : '';
- }
- }
- }
- }
- //给项目设置汇总信息
- //@param {Array}projs {Object}summaryInfo
- function setSummaryInfo(grouped, summaryInfo) {
- if (!summaryInfo) {
- return;
- }
- let allDatas = [];
- for (let data of grouped) {
- allDatas.push(data);
- if (data.children && data.children.length > 0) {
- allDatas = allDatas.concat(data.children);
- }
- }
- for(let proj of allDatas){
- let summaryProj = summaryInfo[proj.ID];
- if(summaryProj){
- proj.engineeringCost = summaryProj.engineeringCost;
- proj.subEngineering = summaryProj.subEngineering;
- proj.measure = summaryProj.measure;
- proj.safetyConstruction = summaryProj.safetyConstruction;
- proj.other = summaryProj.other;
- proj.charge = summaryProj.charge;
- proj.tax = summaryProj.tax;
- proj.rate = summaryProj.rate;
- proj.buildingArea = summaryProj.buildingArea;
- proj.perCost = summaryProj.perCost;
- }
- }
- }
- //获取可成树的数据
- //@param {Array}datas @return {Array}
- function getTreeDatas(groupedDatas, ungroupedDatas){
- //设置新的树结构数据
- for (let data of groupedDatas) {
- setTreeInfo([data].concat(data.children));
- }
- let engs = _.filter(ungroupedDatas, {projType: projectType.engineering}),
- tenders = _.filter(ungroupedDatas, {projType: projectType.tender});
- for (let data of engs) {
- setTreeInfo([data].concat(data.children));
- }
- setTreeInfo(tenders);
- let rst = [];
- //整理树结构
- sortSameDepthData(groupedDatas, -1);
- //新建未分类建设项目及单项工程
- let ungroupedProj = {ID: uuid.v1(), ParentID: -1, NextSiblingID: -1, name: '未分类建设项目', projType: projectType.project};
- let ungroupedEng = {ID: uuid.v1(), ParentID: ungroupedProj.ID, NextSiblingID: -1, name: '未分类单项工程', projType: projectType.engineering};
- if (groupedDatas.length > 0) {
- groupedDatas[groupedDatas.length - 1].NextSiblingID = ungroupedProj.ID;
- }
- //将未分类的数据归类
- sortSameDepthData(engs, ungroupedProj.ID);
- sortSameDepthData(tenders, ungroupedEng.ID);
- //未分类单项工程处于同层第一个节点
- ungroupedEng.NextSiblingID = engs[0] ? engs[0].ID : ungroupedEng.NextSiblingID;
- let allDatas = groupedDatas.concat(ungroupedDatas);
- //设置分享信息及操作信息
- setShareInfo(allDatas);
- for (let data of allDatas) {
- rst.push(data);
- if (data.children) {
- rst = rst.concat(data.children);
- }
- }
- rst.push(ungroupedProj);
- rst.push(ungroupedEng);
- return rst;
- }
- //按照时间排序
- //@param {Array}datas @return {void}
- function sortByDate(datas){
- datas.sort(function (a, b) {
- let shareInfoA = _.find(a.shareInfo, {userID}),
- shareInfoB = _.find(b.shareInfo, {userID});
- let aV = shareInfoA ? Date.parse(shareInfoA.shareDate) : 0,
- bV = shareInfoB ? Date.parse(shareInfoB.shareDate) : 0;
- //时间越晚越靠前
- if (aV > bV) {
- return -1;
- } else if (aV < bV) {
- return 1;
- }
- return 0;
- });
- }
- //建立树
- //@return void
- function initShareTree(){
- $.bootstrapLoading.start();
- //获取分享数据
- CommonAjax.post('/pm/api/receiveProjects', {user_id: userID}, function (rstData) {
- // 排序 --分享的文件按照时间先后顺序排序,分享文件下的子文件,按照原本树结构显示,不需要排序
- sortByDate(rstData.grouped);
- sortByDate(rstData.ungrouped);
- //设置汇总信息
- if (rstData.summaryInfo) {
- setSummaryInfo(rstData.grouped, rstData.summaryInfo.grouped);
- setSummaryInfo(rstData.ungrouped, rstData.summaryInfo.ungrouped);
- }
- let treeDatas = getTreeDatas(rstData.grouped, rstData.ungrouped);
- tree = pmTree.createNew(treeSetting, treeDatas);
- tree.selected = tree.items[0];
- showTreeData(tree.items, headers);
- //初始选择
- let initSel = spreadObj.sheet.getSelections()[0] ? spreadObj.sheet.getSelections()[0] : {row: 0, rowCount: 1};
- initSelection(initSel);
- autoFlashHeight();
- spreadObj.sheet.frozenColumnCount(4);
- spreadObj.workBook.refresh();
- $.bootstrapLoading.end();
- });
- }
- //初始化右键菜单
- function initContextMenu() {
- $.contextMenu({
- selector: '#shareSpread',
- build: function ($trigger, e) {
- let target = SheetDataHelper.safeRightClickSelection($trigger, e, spreadObj.workBook);
- initSelection({row: target.row, rowCount: 1}, preSelection ? preSelection : null, spreadObj.sheet);
- return target.hitTestType === GC.Spread.Sheets.SheetArea.viewport || target.hitTestType === GC.Spread.Sheets.SheetArea.rowHeader;
- },
- items: {
- "copy": {
- name: "拷贝工程",
- icon: 'fa-copy',
- disabled: function () {
- let selected = tree.selected;
- return !(selected && selected.data.copy && selected.data.copy === '拷贝工程');
- },
- callback: function (key, opt) {
- $('#copyShare').modal('show');
- }
- },
- "cancel": {
- name: "清除",
- icon: 'fa-remove',
- disabled: function () {
- let selected = tree.selected;
- return !(selected && selected.data.cancel && selected.data.cancel === '清除');
- },
- callback: function (key, opt) {
- let $p = $('<p>').text(`点“确定”按钮,确认清除分享文件 “${tree.selected.data.name}”。`);
- $('#cancelShare').find('.modal-body').empty();
- $('#cancelShare').find('.modal-body').append($p);
- $('#cancelShare').modal('show');
- }
- }
- }
- });
- }
- //初始化视图
- //@return void
- function initView(){
- if(tree){
- tree = null;
- }
- if(spreadObj.workBook){
- spreadObj.workBook.destroy();
- spreadObj.workBook = null;
- }
- initContextMenu();
- buildSheet();
- initShareTree();
- }
- //根据建设项目获取单项工程
- //@param {Number}projID @return {void}
- function setEng(projID){
- let engQuery = {$or: [{deleteInfo: null}, {'deleteInfo.deleted': false}], projType: projectType.engineering, userID: userID, ParentID: projID};
- CommonAjax.post('/pm/api/getProjectsByQuery', {user_id: userID, query: engQuery, options: '-_id -property'}, function (rstData) {
- $('#copyShare_selectEng').empty();
- for(let eng of rstData){
- let opt = $('<option>').val(eng.ID).text(eng.name);
- $('#copyShare_selectEng').append(opt);
- }
- });
- }
- //从其他建设项目中复制中,建设项目的文件层次结构名称和顺序
- //@param {Array}treeData @return {Array}
- function getFileHierarchyInfo(treeData){
- let tree = idTree.createNew({id: 'ID', pid: 'ParentID', nid: 'NextSiblingID', rootId: -1});
- tree.loadDatas(treeData);
- let items = tree.items;
- let rst = [];
- function getFileHierarchyName(node){
- let nodeName = node.data.name;
- let name = [];
- while (node.parent){
- name.push(node.parent.data.name ? node.parent.data.name : '');
- node = node.parent;
- }
- name = name.reverse();
- name.push(nodeName);
- return name.join('\\');
- }
- for(let node of items){
- if(node.children.length === 0 ){//project
- rst.push({ID: node.data.ID, fileHierarchyName: getFileHierarchyName(node)})
- }
- }
- return rst;
- }
- //设置拷贝工程下拉选择
- //@return {void}
- function setCopyModal(){
- //获取建设项目
- let projQuery = {$or: [{deleteInfo: null}, {'deleteInfo.deleted': false}], projType: {$in: [projectType.project, projectType.folder]}, userID: userID};
- CommonAjax.post('/pm/api/getProjectsByQuery', {user_id: userID, query: projQuery, options: '-_id -property'}, function (rstData) {
- let fileHierarchyData = getFileHierarchyInfo(rstData);
- $('#copyShare_selectProj').empty();
- for(let proj of fileHierarchyData){
- let opt = $('<option>').val(proj.ID).text(proj.fileHierarchyName);
- $('#copyShare_selectProj').append(opt);
- }
- //初始选择
- if(fileHierarchyData.length > 0){
- setEng(fileHierarchyData[0].ID);
- }
- });
- }
- //拷贝分享的工程
- //@param {Object}selected {Number}parentID @return {void}
- function copyShareProject(selected, projID, engID){
- if(!engID || !selected){
- return;
- }
- let copyMap = {copy: null, update: null};
- let newName = getCopyName(selected);
- //获取单项工程的单位工程
- let tenderQuery = {$or: [{deleteInfo: null}, {'deleteInfo.deleted': false}], userID: userID, ParentID: engID};
- CommonAjax.post('/pm/api/getProjectsByQuery', {user_id: userID, query: tenderQuery, options: '-_id -property'}, function (rstData) {
- let updateTender = null;
- for(let tender of rstData){
- if(tender.name === newName){
- $('#copyShare_name').text('已存在此单位工程。');
- $('#copyShare_name').addClass('text-danger');
- return;
- }
- if(tender.NextSiblingID == -1){
- updateTender = tender;
- }
- }
- //更新前节点
- if(updateTender){
- copyMap.update = {query: {ID: updateTender.ID}};
- }
- //拷贝
- let copyData = {
- userID: userID,
- ID: selected.data.actualTreeInfo.ID,
- NextSiblingID: -1,
- ParentID: engID,
- name: newName,
- shareInfo: [],
- compilation: selected.data.compilation,
- createDateTime: selected.data.createDateTime,
- fileVer: selected.data.fileVer ? selected.data.fileVer : '',
- projType: selected.data.projType,
- property: {},
- recentDateTime: selected.data.recentDateTime,
- fullFolder: selected.data.fullFolder
- };
- copyData.property.rootProjectID = projID;
- copyMap.copy = {document: copyData};
- $('#copyShare').modal('hide');
- $.bootstrapLoading.start();
- CommonAjax.post('/pm/api/copyProjects', {projectMap: copyMap, user_id: userID}, function (rstData) {
- $.bootstrapLoading.end();
- }, function () {
- $.bootstrapLoading.end();
- });
- });
- }
- //获取拷贝后的名称
- //@param {Object}node @return {String}
- function getCopyName(node) {
- //当前单位工程可能没有分享的用户信息,可能他人分享的是父级文件,userInfo在父级文件中
- let orgName = node.data.name,
- userInfo = node.data.userInfo;
- while (node && !userInfo) {
- node = node.parent;
- userInfo = node.data.userInfo;
- }
- return `${orgName} (${userInfo.name}分享拷贝)`;
- }
- //事件监听器
- //@return void
- function eventListener(){
- //tab
- $('#tab_pm_share').on('shown.bs.tab', function () {
- //侧滑隐藏
- $('.slide-sidebar').removeClass('open');
- $('.slide-sidebar').css('width', '0');
- projTreeObj.tree = null;
- if(projTreeObj.workBook){
- projTreeObj.workBook.destroy();
- projTreeObj.workBook = null;
- }
- gcTreeObj.tree = null;
- if(gcTreeObj.workBook){
- gcTreeObj.workBook.destroy();
- gcTreeObj.workBook = null;
- }
- initView();
- });
- //关闭拷贝工程
- $('#copyShare').on('hidden.bs.modal', function () {
- $('#copyShareProj-info').hide();
- $('#copyShareEng-info').hide();
- });
- //打开拷贝工程
- $('#copyShare').on('shown.bs.modal', function () {
- setCopyModal();
- //更改显示名称
- let newName = getCopyName(shareSeleted);
- $('#copyShare_name').html(`拷贝后,工程将重命名为 "<b>${newName}</b>"`);
- $('#copyShare_name').removeClass('text-danger');
- });
- //拷贝工程改变选择建设项目
- $('#copyShare_selectProj').change(function () {
- //更改显示名称
- let newName = getCopyName(shareSeleted);
- $('#copyShare_name').html(`拷贝后,工程将重命名为 "<b>${newName}</b>"`);
- $('#copyShare_name').removeClass('text-danger');
- $('#copyShareProj-info').hide();
- $('#copyShareEng-info').hide();
- let curSelID = $(this).select().val();
- setEng(parseInt(curSelID));
- });
- //拷贝工程改变选择单项工程
- $('#copyShare_selectEng').change(function () {
- //更改显示名称
- let newName = getCopyName(shareSeleted);
- $('#copyShare_name').html(`拷贝后,工程将重命名为 "<b>${newName}</b>"`);
- $('#copyShare_name').removeClass('text-danger');
- });
- //确认拷贝
- $('#copyShare_confirm').click(function () {
- let selProj = $('#copyShare_selectProj').select().val();
- if(!selProj){
- $('#copyShareProj-info').show();
- return;
- }
- let selEng = $('#copyShare_selectEng').select().val();
- if(!selEng){
- $('#copyShareEng-info').show();
- return;
- }
- copyShareProject(tree.selected, parseInt(selProj), parseInt(selEng));
- });
- //清除分享
- $('#cancelShareConfirm').click(function () {
- $.bootstrapLoading.start();
- CommonAjax.post('/pm/api/share', {user_id: userID, type: oprType.cancel, projectID: tree.selected.data.actualTreeInfo.ID, shareData:[{userID: userID}]}, function (rstData) {
- $.bootstrapLoading.end();
- tree.removeNode(tree.selected);
- showTreeData(tree.items, headers);
- }, function () {
- $.bootstrapLoading.end();
- });
- });
- }
- return {spreadObj, headers, initView, eventListener}
- })();
- $(document).ready(function () {
- pmShare.eventListener();
- });
|