|
@@ -67,19 +67,32 @@ let BlockController = {
|
|
|
return null;
|
|
|
},
|
|
|
|
|
|
- copyBlock:function (selected) {
|
|
|
+ copyBlock:function (selection) {
|
|
|
let startTime = +new Date();
|
|
|
let blockOjb = {
|
|
|
- compilationID:projectInfoObj.projectInfo.compilation
|
|
|
+ compilationID:projectInfoObj.projectInfo.compilation,
|
|
|
+ datas:[]
|
|
|
};
|
|
|
- if(selected.sourceType == projectObj.project.Bills.getSourceType()){
|
|
|
- blockOjb.firstNodeType = selected.data.type;
|
|
|
- }else if(selected.sourceType == projectObj.project.Ration.getSourceType()){
|
|
|
+ let firstNode = projectObj.project.mainTree.items[selection.row];
|
|
|
+ let copyNodes = [firstNode];
|
|
|
+ if(selection.rowCount > 1){
|
|
|
+ for(let i = 1;i<selection.rowCount;i ++){
|
|
|
+ let temNode = projectObj.project.mainTree.items[selection.row + i];
|
|
|
+ if(this.copyBtnDisable(temNode) == false&&temNode.getParentID() != -1 && temNode.getParentID() == firstNode.getParentID() ){//多选时,与选中的第一个节点同一层次的才复制,即父节点一样的,其它的忽略,copyBtnDisable 判断要为false
|
|
|
+ copyNodes.push(temNode);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if(firstNode.sourceType == projectObj.project.Bills.getSourceType()){
|
|
|
+ blockOjb.firstNodeType = firstNode.data.type;
|
|
|
+ }else if(firstNode.sourceType == projectObj.project.Ration.getSourceType()){
|
|
|
blockOjb.firstNodeType = blockType.RATION;
|
|
|
}
|
|
|
- blockOjb.isFBFX = projectObj.project.Bills.isFBFX(selected);
|
|
|
+ blockOjb.isFBFX = projectObj.project.Bills.isFBFX(firstNode);
|
|
|
let ration_glj_Map = _.groupBy(projectObj.project.ration_glj.datas, 'rationID');
|
|
|
- blockOjb.data = this.getNodeDatas(selected,ration_glj_Map);
|
|
|
+ for(let cNode of copyNodes){
|
|
|
+ blockOjb.datas.push(this.getNodeDatas(cNode,ration_glj_Map));
|
|
|
+ }
|
|
|
let getDataTime = +new Date();
|
|
|
console.log(`复制所用时间——${getDataTime - startTime}`);
|
|
|
blockOjb.copyTime = +new Date();//设置复制时间,可以用来做过期处理
|
|
@@ -142,8 +155,12 @@ let BlockController = {
|
|
|
if(Bills.isFBFX(selected)){// (2.1)、焦点行属于“分部分项工程”:
|
|
|
//复制块的第一层、焦点行的类型都是“分部”
|
|
|
if(blockData.firstNodeType == blockType.FB && isFB(selected)){
|
|
|
- //默认为当前行的后项,可选前项、子项。
|
|
|
- setRadioProp('sub_node',{checked:false,disabled:false});
|
|
|
+ if(selected.children.length > 0 && isFXorBX(selected.children[0])){//焦点行分部下有分项补项,弹出“粘贴位置选择”,默认为当前行的后项,可选前项,子项灰显。
|
|
|
+ setRadioProp('sub_node',{checked:false,disabled:true});
|
|
|
+ }else {
|
|
|
+ //默认为当前行的后项,可选前项、子项。
|
|
|
+ setRadioProp('sub_node',{checked:false,disabled:false});
|
|
|
+ }
|
|
|
}
|
|
|
//复制块的第一层、焦点行的类型都是“分项”或补项
|
|
|
if(blockIsFXorBX(blockData.firstNodeType) && isFXorBX(selected)){
|
|
@@ -202,6 +219,7 @@ let BlockController = {
|
|
|
let project = projectObj.project;
|
|
|
let Bills = project.Bills;
|
|
|
let parent = null,next = null,pre = null;
|
|
|
+ let firstParentID = null, lastNextID = null;
|
|
|
let updateData = [],billUpdate = null;
|
|
|
let billsIDMap = {};//用来做新旧ID映射
|
|
|
if(blockData.compilationID != projectInfoObj.projectInfo.compilation){//如果编办不一样,不能复制
|
|
@@ -225,23 +243,27 @@ let BlockController = {
|
|
|
let parentID = parent?parent.getID():-1;
|
|
|
let nextID = next?next.getID():-1;
|
|
|
if(blockData.firstNodeType == blockType.RATION){ //复制的是定额,需根据新的父项信息和工程量明细计算工程量
|
|
|
- blockData.data.billsItemID = parentID;
|
|
|
- let billsQuantity = scMathUtil.roundForObj(parent.data.quantity,getDecimal("quantity",parent));
|
|
|
- this.calcRationQuantityAndContain(billsQuantity,blockData.data);
|
|
|
- //如果粘贴位置不属于分部分项工程,或者不是安装工程,则把安装增加费内容置空
|
|
|
- if(!Bills.isFBFX(parent)|| projectInfoObj.projectInfo.property.engineering!=engineeringType.BUILD_IN){
|
|
|
- blockData.data.ration_installations = [];
|
|
|
+ for(let d of blockData.datas){
|
|
|
+ d.billsItemID = parentID;
|
|
|
+ let billsQuantity = scMathUtil.roundForObj(parent.data.quantity,getDecimal("quantity",parent));
|
|
|
+ this.calcRationQuantityAndContain(billsQuantity,d);
|
|
|
+ //如果粘贴位置不属于分部分项工程,或者不是安装工程,则把安装增加费内容置空
|
|
|
+ if(!Bills.isFBFX(parent)|| projectInfoObj.projectInfo.property.engineering!=engineeringType.BUILD_IN){
|
|
|
+ d.ration_installations = [];
|
|
|
+ }
|
|
|
}
|
|
|
//计算序列号
|
|
|
this.calcRationSerialNo(parentID,blockData,updateData,pre,next);
|
|
|
}else {
|
|
|
- blockData.data.ParentID = parentID;
|
|
|
- blockData.data.NextSiblingID=nextID;
|
|
|
+ firstParentID = parentID;
|
|
|
+ lastNextID = nextID;
|
|
|
+ /* blockData.data.ParentID = parentID;
|
|
|
+ blockData.data.NextSiblingID = nextID;*/
|
|
|
if(pre){
|
|
|
- billUpdate = {type:blockData.data.sourceType,query:{ID:pre.getID()},doc:{NextSiblingID:blockData.data.ID}};
|
|
|
+ billUpdate = {type:blockData.datas[0].sourceType,query:{ID:pre.getID()},doc:{NextSiblingID:blockData.datas[0].ID}};
|
|
|
}
|
|
|
}
|
|
|
- let dataMap = this.preparePasteData(blockData.data,billsIDMap);
|
|
|
+ let dataMap = this.preparePasteData(blockData.datas,billsIDMap,firstParentID,lastNextID);
|
|
|
if(billUpdate){
|
|
|
billUpdate.doc.NextSiblingID = billsIDMap[billUpdate.doc.NextSiblingID];
|
|
|
updateData.push(billUpdate);
|
|
@@ -358,16 +380,39 @@ let BlockController = {
|
|
|
|
|
|
},
|
|
|
|
|
|
- preparePasteData : function (data,billsIDMap) {
|
|
|
+ preparePasteData : function (datas,billsIDMap,firstParentID,lastNextID) {
|
|
|
let me = this;
|
|
|
me.datas = _.cloneDeep(projectObj.project.Bills.datas);
|
|
|
let bills = [],rations=[],ration_gljs = [],ration_coes = [],quantity_details = [],ration_installations = [];
|
|
|
+ let firstBillIDs = [],lastBillID = null;//记录第一层清单的ID,和第一层的最后一个清单ID
|
|
|
+ let firstIDMap = {};
|
|
|
+ for(let i = 0 ;i< datas.length ;i++){
|
|
|
+ if(datas[i].sourceType == 'bills'){
|
|
|
+ firstBillIDs.push(datas[i].ID);
|
|
|
+ if(i == datas.length -1){//最后一个清单节点
|
|
|
+ lastBillID = datas[i].ID
|
|
|
+ }
|
|
|
+ }
|
|
|
+ eachData(datas[i]);
|
|
|
+ }
|
|
|
+ for(let f of firstBillIDs){
|
|
|
+ firstIDMap[billsIDMap[f]] = f //反向映射
|
|
|
+ }
|
|
|
|
|
|
- eachData(data);
|
|
|
for(let b of bills){//更新ID
|
|
|
- billsIDMap[b.ParentID]?b.ParentID = billsIDMap[b.ParentID]:'';
|
|
|
- billsIDMap[b.NextSiblingID]?b.NextSiblingID = billsIDMap[b.NextSiblingID]:'';
|
|
|
+ if(firstIDMap[b.ID]) {//如果是第一层清单节点对应的数据,更新父ID 为当前树中的父ID
|
|
|
+ b.ParentID = firstParentID;
|
|
|
+ }else {
|
|
|
+ billsIDMap[b.ParentID]?b.ParentID = billsIDMap[b.ParentID]:'';
|
|
|
+ }
|
|
|
+ if(b.ID == billsIDMap[lastBillID]){//如果是第一层清单最后节点对应的数据,更新下一节点ID为插入位置的下一个节点ID
|
|
|
+ b.NextSiblingID = lastNextID;
|
|
|
+ }else {
|
|
|
+ billsIDMap[b.NextSiblingID]?b.NextSiblingID = billsIDMap[b.NextSiblingID]:'';
|
|
|
+ }
|
|
|
}
|
|
|
+
|
|
|
+
|
|
|
return {bills:bills,rations:rations,ration_gljs:ration_gljs,ration_coes:ration_coes,quantity_details:quantity_details,ration_installations:ration_installations};
|
|
|
|
|
|
function eachData(data) {
|
|
@@ -482,20 +527,24 @@ let BlockController = {
|
|
|
|
|
|
calcRationSerialNo:function (billsItemID,blockData,updateData,pre,next) {
|
|
|
let br = projectObj.project.Ration.getBillsSortRation(billsItemID);
|
|
|
+ let firstSerialNo = 0;
|
|
|
if(next == null){ //没有下一树节点,即为最后节点
|
|
|
- blockData.data.serialNo = br.length > 0 ? br[br.length - 1].serialNo + 1 : 1;
|
|
|
+ firstSerialNo = br.length > 0 ? br[br.length - 1].serialNo + 1 : 1;
|
|
|
}else {//有下一节点
|
|
|
let startIndex =0;
|
|
|
if(pre){
|
|
|
startIndex = br.indexOf(pre.data)+1;
|
|
|
}
|
|
|
- blockData.data.serialNo = br[startIndex].serialNo;
|
|
|
+ firstSerialNo = br[startIndex].serialNo;
|
|
|
for(let i = startIndex;i < br.length; i++){
|
|
|
- let br_serialNo = i < br.length - 1 ? br [i + 1].serialNo : br[i].serialNo + 1;
|
|
|
- updateData.push({type:blockData.data.sourceType,query:{ID:br[i].ID},doc:{serialNo:br_serialNo}});//更新兄弟节点序列号
|
|
|
+ let br_serialNo = br[i].serialNo + blockData.datas.length; //i < br.length - 1 ? br [i + 1].serialNo : br[i].serialNo + 1;
|
|
|
+ updateData.push({type:blockData.datas[0].sourceType,query:{ID:br[i].ID},doc:{serialNo:br_serialNo}});//更新兄弟节点序列号
|
|
|
}
|
|
|
}
|
|
|
-
|
|
|
+ for(let i = 0 ; i < blockData.datas;i++){
|
|
|
+ blockData.datas[i] = firstSerialNo;
|
|
|
+ firstSerialNo += 1;
|
|
|
+ }
|
|
|
},
|
|
|
calcRationQuantityAndContain : function (billsQuantity,ration) {//计算定额工程量和含量
|
|
|
let EXPString = ration.quantityEXP+"";
|