| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455 | /** * Created by zhang on 2018/1/22. */let zlfb_object={    sectionInfo:null,    getSectionInfo:function () {        let controller = projectObj.mainController, project = projectObj.project;        let Bill = project.Bills;        let FBFX = Bill.getFBFXNode(controller);//取分部分项工程节点;        let all_sub_nodes=[],FB_nodes =[],FX_nodes =[], query={};        let codeMap = {};        let reorganize = false;        controller.tree.getAllSubNode(FBFX,all_sub_nodes);//取分部分项工程节点下的所有节点,不包括定额和工料机节点;        for(let tem_node of all_sub_nodes){            if(tem_node.sourceType==Bill.getSourceType()){                if(tem_node.data.type == billType.FB){                    FB_nodes.push(tem_node);                }                if(tem_node.data.type == billType.FX||tem_node.data.type == billType.BX){                    FX_nodes.push(tem_node);                    let l_code = zlfb_object.getLibCode(tem_node.data.code);                    if(tem_node.data.billsLibId&&l_code!=false){                        reorganize = true;                        if(codeMap[l_code]){                            codeMap[l_code].push(tem_node);                        }else {                            codeMap[l_code]=[tem_node];                        }                        if(query[tem_node.data.billsLibId]){                            query[tem_node.data.billsLibId][l_code]=true;                        }else {                            query[tem_node.data.billsLibId]={};                            query[tem_node.data.billsLibId][l_code]=true;                        }                    }                }            }        }        if(reorganize==true){            zlfb_object.sectionInfo = {                'codeMap':codeMap,                'FB_nodes':FB_nodes,                'FX_nodes':FX_nodes            }            CommonAjax.post('/bills/getSectionInfo',query,function (data) {                if(data){                    zlfb_object.sectionInfo.fxMap = data.fxMap;                    zlfb_object.sectionInfo.sectionMap = data.sectionMap;                }                $("#zlfb").modal({show:true});            });        }else {            $("#zlfb").modal({show:true});        }    },    getLibCode:function (billCode) {//根据清单编号得到清单库中的编号        if(billCode&&billCode.length>=9){            return billCode.substr(0,9);        }else {            return false;        }    },    reorganizeNodes:function () {        let me = this;        let controller = projectObj.mainController, project = projectObj.project;        let Bill = project.Bills;        let FBFX = Bill.getFBFXNode(controller);//取分部分项工程节点;        let resort = true,recode=false,first=$('#bill_first').prop('checked');//清单排序和重新编码放到另外的页面        let second =$('#bill_second').prop('checked'), third =$('#bill_third').prop('checked');        let needSelf = first==true||second==true||third==true;//需要补充分部节点;        if(me.sectionInfo){            let FX_nodes =me.sectionInfo.FX_nodes,fxMap = me.sectionInfo.fxMap,FB_nodes =me.sectionInfo.FB_nodes;            let codeMap = {},sectionNodeMap={},allNewNode=[],updateData={},newDataMap={};            let first_FX_ID = -1;            if(FB_nodes.length>0){                updateData.delete = me.getDeleteData(FB_nodes);            }            Bill.deleteAllSubNodes();//在造价书树结构上先删除所有节点            if(resort){                FX_nodes = _.sortBy(FX_nodes,'data.code');            }            for(let tem_node of FX_nodes){                let isStd = true;//是标准工料机                let l_code = me.getLibCode(tem_node.data.code);                let parentNode = FBFX;                let newCode = tem_node.data.code;                if(l_code!=false&&fxMap[l_code]){//能找到说明是标准工料机                    let tem_sectionInfo = fxMap[l_code].sectionInfo;                    if(first&&tem_sectionInfo['first']){//需要专业分部标题                        parentNode= me.createSectionNode(sectionNodeMap,tem_sectionInfo['first'],parentNode,allNewNode,newDataMap,true);                    }                    if(second&&tem_sectionInfo['second']){//需要章分部标题                        let isRoot = first==true?false:true;                        parentNode= me.createSectionNode(sectionNodeMap,tem_sectionInfo['second'],parentNode,allNewNode,newDataMap,isRoot);                    }                    if(third&&tem_sectionInfo['third']){//需要章分部标题                        let isRoot = first==true||second==true?false:true;                        parentNode= me.createSectionNode(sectionNodeMap,tem_sectionInfo['third'],parentNode,allNewNode,newDataMap,isRoot);                    }                    if(recode==true){//需要重新编号                        if(codeMap[l_code]){                            codeMap[l_code]+=1;                        }else {                            codeMap[l_code]=1;                        }                        newCode = l_code+me.getEndCode(codeMap[l_code],3);                    }                }else {//自定义分项                    if(needSelf==true){                        parentNode= me.createSectionNode(sectionNodeMap,"customer",parentNode,allNewNode,newDataMap,true);                    }                    isStd = false;                }                let nextID=-1;                if(needSelf==false){//如果章节信息三项都不勾选的情况下,要插在自定义分项前                    if(isStd==false&&first_FX_ID==-1){//如果是自定义分项,并且是第一个,要记住ID                        first_FX_ID = tem_node.getID();                    }                   if(isStd==true){//如果是标准的分部,则要插入到第一个自定义分部前面                       nextID = first_FX_ID;                    }                }                let newFXNode  = controller.tree.insert(parentNode.getID(), nextID,tem_node.getID());                let newSource = Bill.tree.insertByData(tem_node.data,parentNode.getID(), nextID, true);                newFXNode.source = newSource;                newFXNode.sourceType = project.Bills.getSourceType();                newFXNode.data = newSource.data;                allNewNode.push(newFXNode);                newFXNode.data.code = newCode;                newFXNode.data.ParentID = parentNode.getID();                newFXNode.data.NextSiblingID=nextID;                newDataMap[newFXNode.getID()]={                    code:newCode,                    ParentID:parentNode.getID(),                    NextSiblingID:nextID                }                if(newFXNode.preSibling){                    newFXNode.preSibling.data.NextSiblingID = newFXNode.getID();                    newDataMap[newFXNode.preSibling.getID()].NextSiblingID=newFXNode.getID();                }                //生成定额或工料机节点                if(tem_node.children.length>0){                    me.addSubNode(newFXNode,tem_node.children,allNewNode,controller)                }            };            me.submitRequest(newDataMap,allNewNode,updateData,FBFX,controller);        }    },    ZLQD:async function(){//只清单排序或者重新编码        //        let me = this;        let selected = projectObj.project.mainTree.selected;        let resort = $('#bill_resort').prop('checked'),recode=$('#bill_recode').prop('checked')        let startNum = parseInt($('#bill_recode_start').val());        let FBNodes = [],updateMap = {},codeMap={};        let recoverMap = {};//排序失败后用来恢复原状的缓存        let tree = projectObj.mainController.tree;        if(resort||recode){            //先找出需要排序和重新编码的节点            for(let node of tree.items){                if(node.sourceType===ModuleNames.bills){                    if(node.data.type == billType.FB && node.children.length > 1){//有两个以上的才需要排序                        let subType = node.children[0].data.type;                        if(subType ===  billType.FX || subType ===  billType.BX){                            FBNodes.push(node);                            recoverMap[node.data.ID] = node.children;                        }                    }                 }             }               try {                if(resort){//如果需要重新排序  -- 重新排序还必须得先改变缓存,如果勾选了重新编码,顺序依赖于排好序的清单                    for(let FB of FBNodes){                        me.resortChildren(FB,updateMap)                    }                    tree.sortTreeItems(tree);                }                        if(recode){                    if(!(startNum >= 1)){                        return alert("起始编码必须大于1!")                    }                     for(let node of tree.items){                        if(node.data.billsLibId){                            let l_code = me.getLibCode(node.data.code);                             if(l_code !== false){                                if(codeMap[l_code]){                                    codeMap[l_code]+=1;                                }else {                                    codeMap[l_code]=startNum;                                }                                newCode = l_code+me.getEndCode(codeMap[l_code],3);                                if(updateMap[node.data.ID]){                                    updateMap[node.data.ID].data.code = newCode;                                }else{                                    updateMap[node.data.ID] =  {                                        type:'bills',                                        data:{                                               projectID:node.data.projectID,                                               ID:node.data.ID,                                               code :newCode                                            }                                         };                                }                            }                        }                    }                }                        let datas = [];                for(let ID in updateMap){                    datas.push(updateMap[ID]);                }               if(datas.length > 0) await projectObj.project.syncUpdateNodesAndRefresh(datas);               projectObj.mainController.refreshTreeNode(FBNodes,true);               this.refreshVisable(FBNodes);               let sel = projectObj.mainController.sheet.getSelections()[0];               sel.row = selected.serialNo();               projectObj.mainController.sheet.setSelection(sel.row,sel.col,sel.rowCount,sel.colCount);               projectObj.mainController.setTreeSelected(selected);            } catch (error) {                alert('清单排序/重新编码失败,请重试!');                console.log(error);                //恢复排序                for(let FB of FBNodes){                    me.resortChildren(FB,{},recoverMap[FB.data.ID]);                }                tree.sortTreeItems(tree);                this.refreshVisable(FBNodes);            }                           }    },    refreshVisable:function (FBNodes) {      let sheet =  projectObj.mainController.sheet;      let tree = projectObj.mainController.tree;      sheet.suspendPaint();      sheet.suspendEvent();      for(let pnode of FBNodes){        TREE_SHEET_HELPER.refreshChildrenVisiable(sheet,tree,pnode,pnode.serialNo());        for(let node of pnode.children){            TREE_SHEET_HELPER.refreshChildrenVisiable(sheet,tree,node,node.serialNo());        }        }       sheet.resumeEvent();      sheet.resumePaint();      },    resortChildren:function(node,updateMap,recoverChildren){        if(recoverChildren){            node.children = recoverChildren;        }else{            node.children = _.sortBy(node.children,'data.code');        }        for(let i=0;i<node.children.length;i++){           let subNode = node.children[i];           let tem = {            type:'bills',            data:{                projectID:subNode.data.projectID,                ID:subNode.data.ID,                }             };             if(i===0){                subNode.preSibling == 0;            }else{                subNode.preSibling = node.children[i-1];            }           if(i == node.children.length-1){//如果是最后一个节点            tem.data.NextSiblingID=-1;            subNode.nextSibling = null           }else{            tem.data.NextSiblingID= node.children[i+1].data.ID;            subNode.nextSibling = node.children[i+1];           }          updateMap[subNode.data.ID] = tem       }     },    addSubNode:function (parentNode,oldChildren,allNewNode,controller) {        for(let c of oldChildren){            let newChild = controller.tree.insert(parentNode.getID(), -1,c.getID());            newChild.source = c.data;            newChild.sourceType = c.sourceType;            newChild.data = c.data;            allNewNode.push(newChild);            if(c.children.length>0){                zlfb_object.addSubNode(newChild,c.children,allNewNode,controller);            }        }    },    getDeleteData:function (FB_nodes) {        let fbIDs=[];        for(let fb of FB_nodes){            fbIDs.push(fb.getID());        }        return fbIDs;    },    createSectionNode:function (sectionNodeMap,ID,parentNode,allNewNode,newDataMap,isRoot) {        let sectionMap = zlfb_object.sectionInfo.sectionMap;        let controller = projectObj.mainController;        if(sectionNodeMap[ID]){//如果这个节点已经存在            parentNode = sectionNodeMap[ID];        }else {//不存在就生成一个            let nodeID = uuid.v1();            let nextID=-1;            if(isRoot==true&&ID!='customer'&§ionNodeMap['customer']){//如果自定义分部存在,插入到自定文分部前面                nextID=sectionNodeMap['customer'].getID();            }            let newNode  = controller.tree.insert(parentNode.getID(), nextID,nodeID);            let data ={                ID:nodeID,                projectID:parseInt(projectObj.project.ID()),                ParentID:parentNode.getID(),                NextSiblingID:nextID,                type:billType.FB            };            if(newNode.preSibling){                newDataMap[newNode.preSibling.getID()].NextSiblingID=newNode.getID();                newNode.preSibling.data.NextSiblingID=newNode.getID();            }            if(ID=='customer'){                data.name = '补充分部';            }else {                if(sectionMap[ID]==undefined){                    console.log(ID);                }                data.code = sectionMap[ID].code;                data.name = sectionMap[ID].name;            }            let newSource = projectObj.project.Bills.tree.insertByData(data,parentNode.getID(), nextID, true);            newNode.source = newSource;            newNode.sourceType = projectObj.project.Bills.getSourceType();            newNode.data = newSource.data;            sectionNodeMap[ID]=newNode;            parentNode = newNode;            allNewNode.push(newNode);            newDataMap[nodeID]=data;        }        return parentNode;    },    getEndCode:function (number,length) {        let preString = '000000000000';        preString = preString+number;        return preString.substr(preString.length-length,length);    },    submitRequest:function(newDataMap,allNewNode,updateData,FBFX,controller){        for(let ID in newDataMap){ //生成更新数据            if(newDataMap[ID].type==billType.FB){//分部类型是插入                if(updateData['create']){                    updateData['create'].push(newDataMap[ID]);                }else {                    updateData['create']=[newDataMap[ID]];                }            }else {                if(updateData['update']){                    let u_data = {                        ID:ID,                        data:newDataMap[ID]                    };                    updateData['update'].push(u_data);                }else {                    let u_data = {                        ID:ID,                        data:newDataMap[ID]                    };                    updateData['update'] = [u_data];                }            }        }        updateData.projectID = FBFX.data.projectID;        updateData.user_id = userID;        $.bootstrapLoading.start();        CommonAjax.post('/bills/reorganizeFBFX',updateData,async function (data) {            $.bootstrapLoading.end();            //更新前端缓存            let billDatas = projectObj.project.Bills.datas;            let quantity_detail_datas = projectObj.project.quantity_detail.datas;            let mainTree = projectObj.mainController.tree;            if(updateData.delete && updateData.delete.length > 0){//删除                for( let d_ID of updateData.delete){                    _.remove(billDatas,{'ID':d_ID});                    _.remove(quantity_detail_datas,{'billID':d_ID});                }            }            if(updateData.update && updateData.update.length > 0){//更新数据                for(let u_data of updateData.update){                    let m_node = mainTree.findNode(u_data.ID);                    if(m_node){                        let m_data = m_node.data;                        for(let u_key in u_data.data){                            m_data[u_key] = u_data.data[u_key];                        }                    }                }            }            if(updateData.create && updateData.create.length > 0){                for(let n_data of updateData.create){                    billDatas.push(n_data);                }            }            controller.sheet.addRows(1, allNewNode.length);            for(let c of FBFX.children){                TREE_SHEET_HELPER.massOperationSheet(controller.sheet, function () {                    TREE_SHEET_HELPER.refreshTreeNodeData(controller.setting, controller.sheet, [c], true);                    controller.sheet.showRow(1, GC.Spread.Sheets.VerticalPosition.center);                });            }            mainTree.preSelected = null;            let selected = mainTree.findNode(mainTree.selected.getID());            if(!selected){                selected = controller.tree.items[0];            }            let sel = controller.sheet.getSelections()[0];            sel.row = selected.serialNo();            controller.sheet.setSelection(sel.row,sel.col,sel.rowCount,sel.colCount);            controller.setTreeSelected(selected);            cbTools.refreshFormulaNodes();            projectObj.project.installation_fee.calcInstallationFee(function () {                //重新计算                projectObj.project.Bills.getEngineeringCostNode(controller).changed = true;                projectObj.project.calcProgram.calcAllNodesAndSave();            });            await OVER_HEIGHT.reCalcOverHeightFee();        },function () {            //errorCallback        });    }}$(function () {    $('#zlfb_confirm').click(function (){        $("#zlfb").modal('hide');        zlfb_object.reorganizeNodes();    });    $('#zlfb').on('hidden.bs.modal', function (e) {        zlfb_object.sectionInfo=null;    })    $('#ZLQD_btn').click(function () {        $("#zlqd").modal('show');    });    $('#zlqd_confirm').click(function (){        $("#zlqd").modal('hide');        zlfb_object.ZLQD();    });});
 |