/** * Created by Mai on 2017/6/1. */ ProjectController = { /* sc: tree_sheet_controller */ syncDisplayNewNode: function (sc, newNode,callback) { TREE_SHEET_HELPER.massOperationSheet(sc.sheet, function () { var sels = sc.sheet.getSelections(); sc.sheet.addRows(newNode.serialNo(), 1); TREE_SHEET_HELPER.refreshTreeNodeData(sc.setting, sc.sheet, [newNode], false); sc.setTreeSelected(newNode); sc.sheet.setSelection(newNode.serialNo(), sels[0].col, 1, 1); //不显示到中间 //sc.sheet.showRow(newNode.serialNo(), GC.Spread.Sheets.VerticalPosition.center); cbTools.refreshFormulaNodes(); if(callback) callback(); }); }, syncDisplayNewNodes: function (sc, newNodes,withOutSelect=false) {//withOutSelect 不需要自动选中,外面自已处理 TREE_SHEET_HELPER.massOperationSheet(sc.sheet, function () { var sels = sc.sheet.getSelections(); newNodes.sort(function (a, b) { let rst = 0; if(a.serialNo() > b.serialNo()){ rst = 1; } else { rst = -1; } return rst; }); let lastNode = null; for(let newNode of newNodes){ sc.sheet.addRows(newNode.serialNo(), 1); TREE_SHEET_HELPER.refreshTreeNodeData(sc.setting, sc.sheet, [newNode], false); lastNode = newNode // sc.sheet.showRow(newNode.serialNo(), GC.Spread.Sheets.VerticalPosition.center); } if(withOutSelect==false&& lastNode){ sc.setTreeSelected(lastNode); sc.sheet.setSelection(lastNode.serialNo(), sels[0].col, 1, 1); } cbTools.refreshFormulaNodes(); }); }, syncDisplayNewRationGljNode:function (sc,newNode) { TREE_SHEET_HELPER.massOperationSheet(sc.sheet, function () { sc.sheet.addRows(newNode.serialNo(), 1); TREE_SHEET_HELPER.refreshTreeNodeData(sc.setting, sc.sheet, [newNode], false); // sc.sheet.showRow(newNode.serialNo(), GC.Spread.Sheets.VerticalPosition.center); cbTools.refreshFormulaNodes(); }); }, addBillsByData: async function (postData, isSameDepth = false) { if (!postData || !postData.length) { return []; } await ajaxPost('/bills/insertBills', { postData }); // 插入 const insertData = postData.filter(item => item.updateType === 'create'); const treeData = insertData.map(item => item.updateData); // 插入清单节点和主树节点 projectObj.project.Bills.datas = projectObj.project.Bills.datas.concat(treeData); let newNodes; if (isSameDepth) { const pre = postData.find(item => item.updateType === 'update'); const preID = pre && pre.updateData.ID || null; projectObj.project.Bills.tree.multiInsert(treeData, preID); newNodes = projectObj.project.mainTree.multiInsert(treeData, preID); } else { projectObj.project.Bills.tree.insertByDatas(treeData); newNodes = projectObj.project.mainTree.insertByDatas(treeData); } for (const node of newNodes) { node.source = projectObj.project.Bills.tree.nodes[projectObj.project.Bills.tree.prefix + node.getID()]; node.data = node.source.data; node.sourceType = projectObj.project.Bills.getSourceType(); } ProjectController.syncDisplayNewNodes(projectObj.mainController, newNodes, true); return newNodes; }, getBillsPostData: function (number, type) { const project = projectObj.project; const target = project.getParentTarget(project.mainTree.selected, 'sourceType', project.Bills.getSourceType()); const targetType = target.data.type; let baseParentID; let baseNextID; let updateNode; const targetIsFXOrBX = targetType === billType.FX || targetType === billType.BX; const beLastChild = (type === billType.FX && targetType === billType.FB) || (type === billType.BILL && target.depth() === 0); const beNextBrother = (type === billType.FX && targetIsFXOrBX) || (type === billType.BILL && target.depth() > 0); if (beLastChild) { baseParentID = target.source.getID(); baseNextID = -1; updateNode = target.source.children[target.source.children.length - 1]; } else if (beNextBrother) { baseParentID = target.source.getParentID(); baseNextID = target.source.getNextSiblingID(); updateNode = target; } else { return []; } const insertData = []; for (let i = 0; i < number; i++) { const data = { //type: billType.BILL, type, projectID: project.ID(), ID: uuid.v1(), ParentID: baseParentID, }; const pre = insertData[i - 1]; if (pre) { pre.NextSiblingID = data.ID; } if (i === number - 1) { data.NextSiblingID = baseNextID; } insertData.push(data); } const postData = insertData.map(item => ({ updateType: 'create', updateData: item })); if (updateNode) { postData.push({ updateType: 'update', updateData: { ID: updateNode.getID(), NextSiblingID: insertData[0].ID } }); } return postData; }, addBills: function (project, sheetController, std) { if (!project || !sheetController) { return null; } let target = project.getParentTarget(project.mainTree.selected, 'sourceType', project.Bills.getSourceType()); let newSource = null, newNode = null, parentID, nextSiblingID, nodeParentID, nodeNextSiblingID; if (target) { if(target.depth() === 0){ parentID = target.source.getID(); nextSiblingID = project.Bills.tree.setting.rootId; nodeParentID = target.getID(); nodeNextSiblingID = project.mainTree.rootID(); } else{ parentID = target.source.getParentID(); nextSiblingID = target.source.getNextSiblingID(); nodeParentID = target.getParentID(); nodeNextSiblingID = target.getNextSiblingID(); } parentID = target.depth() === 0 ? target.source.getID() : target.source.getParentID(); nextSiblingID = target.depth() === 0 ? project.Bills.tree.setting.rootId : target.source.getNextSiblingID(); if (std) { let fixedNode = getRootFixedNode(target); if(!isFlag(fixedNode.data) || (fixedNode.data.flagsIndex.fixed.flag !== fixedFlag.SUB_ENGINERRING && fixedNode.data.flagsIndex.fixed.flag !== fixedFlag.MEASURE)){ return false; } //焦点行属于分部分项 if(fixedNode.data.flagsIndex.fixed.flag === fixedFlag.SUB_ENGINERRING){ std.type = billType.FX; //焦点行是分部分项 let subType = getSubType(target); if(target.sourceType === project.Bills.getSourceType() && target.data.type === billType.DXFY && subType === billType.FB){ return false; } //焦点行是分部 else if(target.sourceType === project.Bills.getSourceType() && target.data.type === billType.FB){ if(!subType || subType === billType.FX){ parentID = target.source.getID(); nextSiblingID = project.Bills.tree.setting.rootId; nodeParentID = target.getID(); nodeNextSiblingID = project.mainTree.rootID(); } else{ return false; } } } else { std.type = billType.BILL; } let newCode = project.Bills.newFormatCode(std.code); newSource = project.Bills.insertStdBills(parentID, nextSiblingID, std, newCode); } else { newSource = project.Bills.insertBills(parentID, nextSiblingID); } newNode = project.mainTree.insert(nodeParentID, nodeNextSiblingID, newSource.data.ID); } else { alert('不可添加清单'); } if (newNode) { newNode.source = newSource; newNode.sourceType = project.Bills.getSourceType(); newNode.data = newSource.data; this.syncDisplayNewNode(sheetController, newNode); return newNode; } function getSubType(node){ for(let sub of node.children){ if(sub.sourceType === project.Bills.getSourceType() && sub.data.type === billType.FB){ return billType.FB; } else if(sub.sourceType === project.Bills.getSourceType() && sub.data.type === billType.FX){ return billType.FX; } } return null; } }, addRootBill:function (project, sheetController) {//添加大项费用 if (!project || !sheetController) { return null; } this.addSpecialBill(project, sheetController,null, project.mainTree.selected.nextSibling,true,billType.DXFY); }, addFB:function(project, sheetController,node,ext) {//添加分部 if (!project || !sheetController) { return null; } let selected =node|| project.mainTree.selected; if(selected.parent==null&&isFlag(selected.data)&&selected.data.flagsIndex.fixed.flag==fixedFlag.SUB_ENGINERRING){//选中的是分部分项,则插入做为最后一个子项 return this.addSpecialBill(project, sheetController,selected, null,true,billType.FB,ext); } if(selected.parent){ return this.addSpecialBill(project, sheetController,selected.parent, selected.nextSibling,true,billType.FB,ext); } }, addFXParent:async function(node,ext){ let datas = []; //let parent = node.parent.parent; let newBills = { 'ID':uuid.v1(), 'isAdd':1, 'type':billType.FB, 'projectID':node.data.projectID } if(ext) gljUtil.setProperty(newBills,ext); if(node.preSibling){//有前兄弟 在当前分项和前兄弟中间新增一行“分部”空行,空行作为分项的父项,原父项变为空行的前兄弟。 let changeParent = false; newBills.ParentID = node.parent.parent?node.parent.parent.getID():-1; newBills.NextSiblingID = node.parent.data.NextSiblingID; datas.push({type:ModuleNames.bills,data:newBills,action:"add",preSiblingID:node.parent.data.ID}); datas.push({type:ModuleNames.bills,data:{'ID':node.parent.getID(),'NextSiblingID':newBills.ID}}) for(let c of node.parent.children){ if(c.data.ID == node.data.ID) changeParent = true if(changeParent) datas.push({type:ModuleNames.bills,data:{'ID':c.getID(),'ParentID':newBills.ID}}) } }else{//没有前兄弟,在当前分项和父项中间新增一行“分部”空行,空行作为分项的父项,原父项变为空行的父项。当前分项/补项的所有兄弟都跟着移动。 newBills.ParentID = node.parent.getID(); newBills.NextSiblingID = -1; datas.push({type:ModuleNames.bills,data:newBills,action:"add"}); for(let c of node.parent.children){ datas.push({type:ModuleNames.bills,data:{'ID':c.getID(),'ParentID':newBills.ID}}) } } if(datas.length > 0){ let nodes = await projectObj.project.syncUpdateNodesAndRefresh(datas); //重新计算 cbTools.refreshFormulaNodes(); projectObj.project.calcProgram.calcNodesAndSave(nodes); projectObj.mainController.setTreeSelected(projectObj.project.mainTree.getNodeByID(newBills.ID)); } }, addFX:function(project, sheetController) {//添加分项 if (!project || !sheetController) { return null; } let selected = project.mainTree.selected; if(selected.data.type==billType.FB||(selected.parent==null&&isFlag(selected.data)&&selected.data.flagsIndex.fixed.flag==fixedFlag.SUB_ENGINERRING)){//选中的是分部或者是分部分项工程,则插入做为最后一个子项 return this.addSpecialBill(project, sheetController,selected, null,true,billType.FX); } if(selected.parent){ if(selected.data.type==billType.FX||selected.data.type==billType.BX){ return this.addSpecialBill(project, sheetController,selected.parent, selected.nextSibling,true,billType.FX); } } }, addSpecialBill(project,sheetController,parent,nextSibling,isUserAdd,type,ext){ let newSource = null, newNode = null; let b_nexID = nextSibling==null?-1:nextSibling.source.getID();//主树和清单树,对应的树节点ID不一样 let m_nexID = nextSibling==null?-1:nextSibling.getID(); let b_parent = parent==null?-1:parent.source.getID(); let m_parent = parent==null?-1:parent.getID(); newSource = project.Bills.insertSpecialBill(b_parent, b_nexID,isUserAdd,type,ext); newNode = project.mainTree.insert(m_parent,m_nexID, newSource.data.ID); if (newNode) { newNode.source = newSource; newNode.sourceType = project.Bills.getSourceType(); newNode.data = newSource.data; this.syncDisplayNewNode(sheetController, newNode); return newNode; } }, addRation: function (project, sheetController, rationType, std) { if (!project || !sheetController) { return; } let selected = project.mainTree.selected, newSource = null, newNode = null; if (selected === null) { return; } if (selected.sourceType === project.Bills.getSourceType() && selected.depth() > 0) { if (selected.source.children.length > 0) { alert('当前清单已有清单子项,不能套用定额。'); } else if (selected.data.calcBase&&selected.data.calcBase!="") { alert('当前有基数计算,不能插入定额/量价/人材机。'); } else { if(selected.data.type === billType.FB){ return; } if (std) { newSource = project.Ration.insertStdRation(selected.source.getID(), null, std); project.ration_glj.addRationGLJ(newSource,std); } else { newSource = project.Ration.insertRation(selected.source.getID(),null, rationType); } newNode = project.mainTree.insert(selected.getID(), selected.tree.rootID(), newSource.ID); } } else if (selected.sourceType === project.Ration.getSourceType()) { if (std) { newSource = project.Ration.insertStdRation(selected.source[project.masterField.ration], selected.source, std); project.ration_glj.addRationGLJ(newSource,std); } else { newSource = project.Ration.insertRation(selected.source[project.masterField.ration], selected.source, rationType); } newNode = project.mainTree.insert(selected.getParentID(), selected.getNextSiblingID(), newSource.ID); }; if (newNode) { newNode.source = newSource; newNode.sourceType = project.Ration.getSourceType(); newNode.data = newSource; this.syncDisplayNewNode(sheetController, newNode); } }, replaceRation: function (project, sheetController, std) { if (!project || !sheetController) { return; } let selected = project.mainTree.selected, newSource = null, newNode = null; if (selected === null) { return; } if ( selected.sourceType === project.Ration.getSourceType()) { project.Ration.replaceRation(selected.source, std); project.ration_glj.addRationGLJ(selected.source, std); sheetController.refreshTreeNode([selected], false); } else { alert('当前焦点行不是定额,无法替换。'); } }, addNewNodes:function (updateData){ let controller = projectObj.mainController; let Bill = projectObj.project.Bills; let newAddNode = []; let newRationNodes = []; for(let nb of updateData.bills.add){ let newSource = Bill.tree.insertByData(nb, nb.ParentID, -1, true);//按顺序插入的情况下,nextID为-1,树节点 let newNode = projectObj.project.mainTree.insert(nb.ParentID, -1, newSource.data.ID); newNode.source = newSource; newNode.sourceType = Bill.getSourceType(); newNode.data = newSource.data; controller.sheet.addRows(newNode.serialNo(), 1); // controller.sheet.showRow(newNode.serialNo(), GC.Spread.Sheets.VerticalPosition.center); newAddNode.push(newNode); Bill.datas.push(nb); } for(let nr of updateData.ration.add){ let newNode = projectObj.project.mainTree.insert(nr.billsItemID, -1, nr.ID); newNode.source = nr; newNode.sourceType = projectObj.project.Ration.getSourceType(); newNode.data = nr; controller.sheet.addRows(newNode.serialNo(), 1); // controller.sheet.showRow(newNode.serialNo(), GC.Spread.Sheets.VerticalPosition.center); newAddNode.push(newNode); newRationNodes.push(newNode); projectObj.project.Ration.datas.push(nr); } TREE_SHEET_HELPER.refreshTreeNodeData(controller.setting, controller.sheet, newAddNode, false); return newRationNodes; } /* addVolumePrice: function (project, sheetController) { if (!project || !sheetController) { return null; } var selected = project.mainTree.selected; var newSource = null, newNode = null; if(selected === null) { return; } if (selected.sourceType === project.Bills.getSourceType() && selected.source.children.length === 0) { newSource = project.VolumePrice.insertVolumePrice(selected.source.getID()); newNode = project.mainTree.insert(selected.getID(), selected.tree.rootID()); } else if (selected.sourceType === project.Ration.getSourceType() || selected.sourceType === project.VolumePrice.getSourceType()) { newSource = project.VolumePrice.insertVolumePrice(selected.source[project.masterField.volumePrice], selected.source); newNode = project.mainTree.insert(selected.getParentID(), selected.getNextSiblingID()); } if (newNode) { newNode.source = newSource; newNode.sourceType = project.VolumePrice.getSourceType(); newNode.data = newSource; this.syncDisplayNewNode(sheetController, newNode); } },*/ /* calculateAll: function (project, sheetController, CalcType) { this.project.setCalcFlag(CalcType); let calc = new BillsCalcHelper(project); calc.calcAll(); sheetController.showTreeData(); project.Bills.updateAll(); calc = null; }*/ }