|
@@ -52,9 +52,10 @@ const projTreeObj = {
|
|
|
tabStripVisible: false,
|
|
|
allowCopyPasteExcelStyle : false,
|
|
|
allowExtendPasteRange: false,
|
|
|
- allowUserDragDrop : false,
|
|
|
+ allowUserDragDrop : true,
|
|
|
allowUserDragFill: false,
|
|
|
- scrollbarMaxAlign : true
|
|
|
+ scrollbarMaxAlign : true,
|
|
|
+ showDragDropTip:false
|
|
|
}
|
|
|
},
|
|
|
renderSheetFuc: function (sheet, fuc) {
|
|
@@ -74,11 +75,14 @@ const projTreeObj = {
|
|
|
let sheet = workBook.getActiveSheet();
|
|
|
//改变选中节点set selected
|
|
|
sheet.bind(_events.SelectionChanging, this.onSelectionChanging);
|
|
|
+ sheet.bind(_events.EditStarting, this.onCellEditing);
|
|
|
+ sheet.bind(_events.ClipboardPasting,this.onCellEditing);
|
|
|
+ workBook.bind(_events.DragDropBlock, this.onDragDropBlock);
|
|
|
},
|
|
|
buildHeader: function (sheet, headers) {
|
|
|
let me = this;
|
|
|
let fuc = function () {
|
|
|
- sheet.options.isProtected = true;
|
|
|
+ //sheet.options.isProtected = true; //为了拖动功能,这里不设置protect,输入限制在editstarting控制
|
|
|
sheet.options.protectionOptions = {
|
|
|
allowResizeRows: true,
|
|
|
allowResizeColumns: true
|
|
@@ -169,6 +173,181 @@ const projTreeObj = {
|
|
|
let me = projTreeObj;
|
|
|
me.initSelection(args.newSelections[0], args.oldSelections[0]);
|
|
|
},
|
|
|
+ onDragDropBlock : function (sender,args) {//拖动移动项目位置
|
|
|
+ console.log(args);
|
|
|
+ let selected = projTreeObj.tree.selected;
|
|
|
+ let targetNode = projTreeObj.tree.items[args.toRow];
|
|
|
+ let projectMap = {},feeRateMap={},unitPriceMap = {},parent=null,next = null;
|
|
|
+ let rootProjectID = null;//记录建设项目ID
|
|
|
+ //let updateObj = {project:[],feeRateFile:[],unitPriceFile:[]};
|
|
|
+ args.cancel = true;//首先取消填充的动作
|
|
|
+ if(selected.preSibling()!=null&&selected.preSibling() == targetNode){
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ if(selected.data.projType=="Tender"){//移动单位工程
|
|
|
+ if(targetNode.data.projType=="Tender"||targetNode.data.projType=="Engineering"){//只能移动到这两个地方
|
|
|
+ if(targetNode.data.projType=="Tender"){//移动到单位工程后面
|
|
|
+ [parent,next] = getMoveUpdateData(selected,targetNode,projectMap,true);
|
|
|
+ rootProjectID = targetNode.parent.pid();
|
|
|
+ }else{//移动后成为单项工程的子项
|
|
|
+ [parent,next] =getMoveUpdateData(selected,targetNode,projectMap,false);
|
|
|
+ rootProjectID = targetNode.pid();
|
|
|
+ }
|
|
|
+ if(selected.data.property.rootProjectID != rootProjectID){//如果不属于同一个建设项目,要检查是否移动或复制单价文件和费率文件
|
|
|
+ projectMap[selected.id()].update['property.rootProjectID'] = rootProjectID; //要改变根项目ID
|
|
|
+ //检查费率文件和单价文件
|
|
|
+ moveOrCopy(selected,rootProjectID,feeRateMap,unitPriceMap,false);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if(selected.data.projType=="Engineering"){//移动的是单项工程
|
|
|
+ if(targetNode.data.projType=="Engineering"||targetNode.data.projType=="Project"){//目标位置是单项工程和建设项目
|
|
|
+ if(targetNode.data.projType=="Engineering"){
|
|
|
+ [parent,next] = getMoveUpdateData(selected,targetNode,projectMap,true);
|
|
|
+ rootProjectID = targetNode.pid();
|
|
|
+ }else {
|
|
|
+ [parent,next] = getMoveUpdateData(selected,targetNode,projectMap,false);
|
|
|
+ rootProjectID = targetNode.id();
|
|
|
+ }
|
|
|
+ if(selected.pid() != rootProjectID){//跨了建设项目,更新子项目,同时要检查是否移动或复制子项的单价文件和费率文件。
|
|
|
+ //检查费率文件和单价文件
|
|
|
+ //todo
|
|
|
+ for(let c of selected.children){
|
|
|
+ projectMap[c.id()] = {query:{'ID':c.id()},update:{'property.rootProjectID':rootProjectID}};
|
|
|
+ moveOrCopy(c,rootProjectID,feeRateMap,unitPriceMap,true);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if(selected.data.projType=="Project"){//移动的是建设项目
|
|
|
+ if(targetNode.data.projType=="Project"||targetNode.data.projType=="Folder") {//目标位置是建设项目和文件夹
|
|
|
+ if(targetNode.data.projType=="Project"){
|
|
|
+ [parent,next] = getMoveUpdateData(selected,targetNode,projectMap,true);
|
|
|
+ }else {
|
|
|
+ [parent,next] = getMoveUpdateData(selected,targetNode,projectMap,false);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if(selected.data.projType=="Folder"&&targetNode.data.projType=="Folder") {//文件夹只能移动到文件夹下
|
|
|
+ [parent,next] = getMoveUpdateData(selected,targetNode,projectMap,false);//成为子项
|
|
|
+ }
|
|
|
+ if(_.isEmpty(projectMap)){//项目数据为空
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ $.bootstrapLoading.start();
|
|
|
+ moveProjects({"user_id": userID,rootProjectID:rootProjectID,projectMap:projectMap,feeRateMap:feeRateMap,unitPriceMap:unitPriceMap},function (result) {
|
|
|
+ console.log(result);
|
|
|
+ for(let key in result){//更新前端节点数据
|
|
|
+ let updateData = result[key].update;
|
|
|
+ let node = projTreeObj.tree.findNode(result[key].query.ID);
|
|
|
+ if(node){
|
|
|
+ console.log(node.data);
|
|
|
+ for(let ukey in updateData){
|
|
|
+ _.set(node.data,ukey,updateData[ukey]);
|
|
|
+ }
|
|
|
+ console.log(node.data);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ projTreeObj.moveTo(selected,targetNode,parent,next);
|
|
|
+ $.bootstrapLoading.end();
|
|
|
+ });
|
|
|
+ // projTreeObj.moveTo(selected,targetNode,parent,next);
|
|
|
+ //删除行数
|
|
|
+
|
|
|
+
|
|
|
+ function getMoveUpdateData(sel,target,projectMap,sameLevel) {
|
|
|
+ let tem_parent = null,tem_next = null;
|
|
|
+ if(sameLevel==true){//移动后的位置的级别相同
|
|
|
+ tem_parent = target.parent;
|
|
|
+ tem_next = target.nextSibling;
|
|
|
+ //移动到target的后面
|
|
|
+ projectMap[target.id()] = {query:{'ID':target.id()},update:{'NextSiblingID':sel.id()}};
|
|
|
+ console.log(target.id()+'----'+target.data.name);
|
|
|
+ }else {//移动后变成子项
|
|
|
+ tem_parent = target;
|
|
|
+ tem_next = target.firstChild();
|
|
|
+ }
|
|
|
+ let nextID = tem_next?tem_next.id():-1;
|
|
|
+ if(sel.preSibling() != null){//如果原来有前项,更新下一节点
|
|
|
+ projectMap[sel.preSibling().id()] = {query:{'ID':sel.preSibling().id()},update:{'NextSiblingID':sel.data.NextSiblingID}};
|
|
|
+ console.log(sel.preSibling().id()+'----'+sel.preSibling().data.name);
|
|
|
+ }
|
|
|
+ if(sel.parent.id() == tem_parent.id()){//移动前移动后的父项相同,只改变next
|
|
|
+ projectMap[selected.id()] = {query:{'ID':selected.id()},update:{'NextSiblingID':nextID}};
|
|
|
+ console.log(selected.id()+'----'+selected.data.name);
|
|
|
+ }else {//
|
|
|
+ let temData = {query:{'ID':selected.id()},update:{'ParentID':tem_parent.id(),'NextSiblingID':nextID}};
|
|
|
+ let reName = projTreeObj.projectNameChecking(tem_parent,selected);//重名检查
|
|
|
+ if(reName){
|
|
|
+ temData.update['name'] = reName
|
|
|
+ }
|
|
|
+ projectMap[selected.id()] = temData;
|
|
|
+ console.log(selected.id()+'----'+selected.data.name);
|
|
|
+ }
|
|
|
+ return [tem_parent,tem_next]
|
|
|
+ }
|
|
|
+
|
|
|
+ function moveOrCopy(sel,rootProjectID,feeRateMap,unitPriceMap,sameCheck) {//检查选中的项目使用的费率文件和单价文件是要移动还是复制一份
|
|
|
+ let project = sel.parent.parent;//取建设项目
|
|
|
+ let sameParent_f = true;
|
|
|
+ let sameParent_u = true;
|
|
|
+ let useFeeRateProject = getTendersByFile(fileType.feeRateFile,sel.data.property.feeFile.id,project);
|
|
|
+ let useUnitPriceProject = getTendersByFile(fileType.unitPriceFile,sel.data.property.unitPriceFile.id,project);
|
|
|
+ let tem_feeRate = {action:'copy',rootProjectID:rootProjectID,name:sel.data.property.feeFile.name,query:{ID:sel.data.property.feeFile.id}};
|
|
|
+ let tem_unitPrice = {action:'copy',rootProjectID:rootProjectID,name:sel.data.property.unitPriceFile.name,query:{id:sel.data.property.unitPriceFile.id}}
|
|
|
+ if(useFeeRateProject.length==1){//如果没有其它项目使用同一个费率文件,则移动
|
|
|
+ tem_feeRate.action = 'move';
|
|
|
+ tem_feeRate.update = {rootProjectID:rootProjectID};
|
|
|
+ }
|
|
|
+ if(useUnitPriceProject.length == 1){//如果没有其它项目使用同一个单价文件,则移动
|
|
|
+ tem_unitPrice.action = 'move';
|
|
|
+ tem_unitPrice.update = {root_project_id:rootProjectID};
|
|
|
+ }
|
|
|
+ feeRateMap[sel.id()] = tem_feeRate;
|
|
|
+ unitPriceMap[sel.id()] = tem_unitPrice;
|
|
|
+ if(sameCheck == true){//需要检查是否属于同一个单项工程,移动单项工程的时候用
|
|
|
+ if(useUnitPriceProject.length > 1){
|
|
|
+ for(let f of useFeeRateProject){
|
|
|
+ if(f.pid()!=sel.pid()){//父节点不同
|
|
|
+ sameParent_f = false;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if(sameParent_f == true){//如果使用的都是同属于一个单项工程,在移动单项工程的时候,移动费率文件和单价文件就可以了
|
|
|
+ feeRateMap[sel.id()].action = 'move';
|
|
|
+ feeRateMap[sel.id()].update = {rootProjectID:rootProjectID};
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if(useUnitPriceProject.length > 1){
|
|
|
+ for(let u of useUnitPriceProject){
|
|
|
+ if(u.pid()!=sel.pid()){//父节点不同
|
|
|
+ sameParent_u = false;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if(sameParent_u == true){
|
|
|
+ unitPriceMap[sel.id()].action = 'move';
|
|
|
+ unitPriceMap[sel.id()].update = {root_project_id:rootProjectID};
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ },
|
|
|
+ projectNameChecking:function (parent,node) {
|
|
|
+ //decDate = '(' + new Date().Format('MM-dd hh:mm:ss') + '恢复)';
|
|
|
+ for(let c of parent.children){
|
|
|
+ if(c.data.name == node.data.name){//如果存在同名的项目
|
|
|
+ return node.data.name + '(' + new Date().Format('MM-dd hh:mm:ss') + '移动)';
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return null;
|
|
|
+ },
|
|
|
+ onCellEditing:function (sender,args) {
|
|
|
+ args.cancel = true;
|
|
|
+ },
|
|
|
getShowData: function (datas) {
|
|
|
for(let data of datas){
|
|
|
data.name = data.name ? data.name : '';
|
|
@@ -457,6 +636,7 @@ const projTreeObj = {
|
|
|
let dataCode = headers[j].dataCode;
|
|
|
//sheet.setValue(i, j, nodes[i]['data'][dataCode]);
|
|
|
}
|
|
|
+ sheet.getCell(i, 1,GC.Spread.Sheets.SheetArea.viewport).locked(true);
|
|
|
}
|
|
|
};
|
|
|
me.renderSheetFuc(sheet, fuc);
|
|
@@ -509,6 +689,40 @@ const projTreeObj = {
|
|
|
move: function (orgRow, newRow) {
|
|
|
this.workBook.getActiveSheet().deleteRows(orgRow, 1);
|
|
|
this.addRow(this.tree.items[newRow]);
|
|
|
+ },
|
|
|
+ moveTo : function(select,target,parent,next){
|
|
|
+ let me = this;
|
|
|
+ let fromRow = select.serialNo();
|
|
|
+ let rCout = select.posterityCount() + 1;//删除的行数
|
|
|
+ let toRow = target.serialNo();
|
|
|
+ let sheet = me.workBook.getActiveSheet();
|
|
|
+ me.tree.removeNode(select);//删除旧节点
|
|
|
+ let newNode = addNewNodes(select, parent, next);
|
|
|
+ // projTreeObj.remove(sheet, fromRow, rCout);
|
|
|
+
|
|
|
+ me.renderSheetFuc(sheet, function () {
|
|
|
+ sheet.deleteRows(fromRow, rCout);
|
|
|
+ sheet.addRows(newNode.serialNo(),rCout);
|
|
|
+ let oldSelection = sheet.getSelections()[0];
|
|
|
+ let newSelection = {row: newNode.serialNo(), rowCount: 1,col:oldSelection.col,colCount:oldSelection.colCount};
|
|
|
+ me.initSelection({row: newNode.serialNo(), rowCount: oldSelection.rowCount}, oldSelection);
|
|
|
+ sheet.setSelection(newNode.serialNo(),oldSelection.col,oldSelection.rowCount,oldSelection.colCount);
|
|
|
+ let children = newNode.getAllChildren();
|
|
|
+ children.push(newNode);
|
|
|
+ for(let c of children){
|
|
|
+ sheet.getCell(c.serialNo(), 0).cellType(me.getTreeNodeCell(me.tree));
|
|
|
+ me.refreshNodeData(c);
|
|
|
+ }
|
|
|
+ });
|
|
|
+
|
|
|
+ function addNewNodes(node,parent,next) {
|
|
|
+ let newNode = me.tree.addNodeData(node.data, parent, next);
|
|
|
+ for(let c of node.children){
|
|
|
+ addNewNodes(c,newNode,null);
|
|
|
+ }
|
|
|
+ return newNode;
|
|
|
+ }
|
|
|
+
|
|
|
}
|
|
|
};
|
|
|
|