zhangweicheng 5 vuotta sitten
vanhempi
commit
4d566af62f

+ 12 - 0
modules/all_models/divide_setting.js

@@ -0,0 +1,12 @@
+let mongoose = require('mongoose');
+let Schema = mongoose.Schema;
+
+let divideSchema = {
+  ID:{type:String,index: true},
+  projectID:Number,
+  divideList:[Schema.Types.Mixed],
+  ration_gljs:[Schema.Types.Mixed],
+  bills:[Schema.Types.Mixed]
+}
+
+mongoose.model("divide_setting", new Schema(divideSchema, {versionKey: false, collection: "divide_setting"}));

+ 30 - 0
modules/main/controllers/divide_controller.js

@@ -0,0 +1,30 @@
+/**
+ * Created by zhang on 2018/9/12.
+ */
+
+let divideFacade = require('../facade/divide_facade');
+let logger = require("../../../logs/log_helper").logger;
+let controller = {
+    updateItem:async function(req) {
+        let data = req.body.data;
+        return await divideFacade.updateItem(JSON.parse(data));
+    }
+   
+};
+
+module.exports ={
+    action:async function(req,res){//自动跳转到URL对应的controller方法
+        let result={
+            error:0
+        };
+        try {
+            let functionName = req.url.replace(/\//g,"");
+            result.data = controller[functionName]?await controller[functionName](req):"";
+        }catch (err){
+            logger.err(err);
+            result.error=1;
+            result.message = err.message;
+        }
+        res.json(result);
+    }
+};

+ 66 - 0
modules/main/facade/divide_facade.js

@@ -0,0 +1,66 @@
+module.exports = {
+  getData: getData,
+  updateItem:updateItem
+};
+
+let mongoose = require('mongoose');
+let divideModel = mongoose.model("divide_setting");
+let consts = require('../models/project_consts');
+let projectConsts = consts.projectConst;
+const uuidV1 = require('uuid/v1');
+
+
+async function updateItem(data){
+  let ID = data.ID;
+  let tasks= [];
+  for(let u of data.updateDatas){
+    if(u.type == 'add'){
+      tasks.push({updateOne: {filter: {ID: ID}, update: {"$push":{divideList:u.doc} }}});
+    }
+    if(u.type == "update"){
+      let ndoc = {};
+      let pre = "divideList.$."
+      for(let key in u.doc){
+        ndoc[pre+key] = u.doc[key]
+      }
+      tasks.push({updateOne: {filter: {"ID": ID,"divideList.ID":u.ID}, update: ndoc}});
+    }
+    if(u.type == "delete"){
+      tasks.push({updateOne: {filter: {ID: ID}, update: {"$pull":{divideList:{ID:u.ID}} }}});
+    }
+
+  }
+
+  if(tasks.length > 0) await divideModel.bulkWrite(tasks);
+
+
+
+  return data;
+}
+
+
+function getData(projectID, callback) {
+  divideModel.findOne({projectID: projectID}, '-_id', async function (err, datas) {
+    if (!err) {
+        // 旧项目没有人工系数文件,默认给它生成一个。
+        if (!datas) {
+          datas = {
+            ID: uuidV1(),
+            projectID:projectID,
+            divideList:[],
+            ration_gljs:[],
+            bills:[]
+          }
+          await divideModel.create(datas);
+          callback(0, projectConsts.DIVIDE_SETTING, datas);
+        } else {
+            callback(0, projectConsts.DIVIDE_SETTING, datas);
+        };
+    } else {
+        callback(1, projectConsts.DIVIDE_SETTING, null);
+    };
+  });
+
+
+
+}

+ 16 - 0
modules/main/routes/divide_route.js

@@ -0,0 +1,16 @@
+/**
+ * Created by zhang on 2018/9/12.
+ */
+
+let express = require('express');
+let divideController = require('../controllers/divide_controller');
+
+module.exports = function (app) {
+
+    var divideRouter = express.Router();
+
+    divideRouter.post('/updateItem', divideController.action);
+    //materialRouter.post('/replace', materialController.action);//材料替换,其实是材料修改
+
+    app.use('/divide',divideRouter);
+}

+ 121 - 0
web/building_saas/main/html/divide.html

@@ -0,0 +1,121 @@
+<div class="toolsbar d-flex px-1 justify-content-between" id="divideToolsBar">
+  <div class="form-inline py-1">
+      <a class="btn btn-sm ml-1" href="#" data-toggle="modal" data-target="#exe_divide">执行分摊</a>
+      <a class="btn btn-sm ml-1" href="#" data-toggle="modal" data-target="#cancel_divide"> 取消分摊</a></label>
+      <a class="btn btn-sm ml-1" href="#" data-toggle="modal" data-target="#cancel_all_divide"> 取消所有分摊</a></label>
+  </div>
+  <div class="divide_side-tabs form-inline">
+    <ul class="nav nav-tabs" role="tablist">
+      <li class="nav-item" id="li_divide_stdRationTab">
+        <a class="nav-link px-1 divide-nav-link" style="height: 110%;" href="javascript:void(0)" id="divide_stdRationTab"
+           relaPanel="#divide_de">定额库</a>
+    </li>
+    </ul>
+  </div>
+</div>
+
+<div class="container-fluid">
+  <div class="row" id="divideRow">
+      <div class="main-content col p-0 " id="divide_main" style="overflow: hidden">
+       <div class="top-content row"  id="divide_top" style="overflow: hidden;margin-left: 0px;margin-right: 0px;">
+          <div class="main-data-top left col-6" style="padding: 0px;" id="divide_main_sheet"></div>
+          <div class="main-data-top left col-6" style="padding: 0px;" id="divide_bills_sheet"></div>
+       </div>
+       <div class="resize-y" id="divideResize"></div>
+          <div class="bottom-content" id="divideBottom">
+              <ul class="nav nav-tabs d-flex" role="tablist">
+                  <li class="nav-item">
+                      <a class="nav-link active show" id="divide_glj_nav" data-toggle="tab" href="#divide_sub" role="tab" aria-selected="true">工料机</a>
+                  </li>
+                  <li class="nav-item">
+                      <a class="nav-link " id="divede_calc_nav" data-toggle="tab" href="#divide_sub" role="tab" aria-selected="false">计算程序</a>
+                  </li>
+              </ul>
+              <!-- Tab panes -->
+              <div class="tab-content"> 
+                  <div class="tab-pane" id="divide_sub" role="tabpanel">
+                      <div class="main-data-bottom" id="divide_sub_sheet" style="overflow:hidden"></div>
+                      <div class="main-data-bottom ovf-hidden" id="divide_itemTextDiv">
+                        <div class="resize-x main-data-bottom ovf-hidden" id="divide_rgResize" style="display: none"></div>
+                        <div class="item_spread main-data-bottom ovf-hidden " id="divide_gljSubDiv" style="width: 99%;">
+                            <div class="tab-content">
+                                <div class="tab-pane" id="divide_rnc-zm">
+                                    <div class="main-data-bottom ovf-hidden" id = "divide_coeSpread">
+                                    </div>
+                                </div>
+                                <div class="tab-pane" id="divide_rnc-cus">
+                                    <div class="main-data-bottom ovf-hidden" id = "divide_cusSpread">
+                                    </div>
+                                </div>
+                                <div class="tab-pane" id="divide_rnc-stable">
+                                    <div class="main-data-bottom ovf-hidden" id="divide_stableSpread"></div>
+                                </div>
+                            </div>
+                        </div>
+                        <div class=" main-data-bottom ovf-hidden col-auto p-0" id="divide_gljItemTab" style="width: 30px">
+                            <div class="rn-nav d-flex align-items-start flex-column divide_gljSubTab">
+                                <div id="divide_zmhs_toogle">
+                                    <div class="d-flex align-items-start flex-column" data-toggle="tooltip" data-placement="left" title="" data-original-title="打开定额调整">
+                                        <span class="mt-3 ml-2 text-primary">定额调整</span>
+                                        <i class="fa fa-arrow-left mt-auto mb-3 text-primary ml-2"></i>
+                                    </div>
+                                </div>
+                                <div id="divide_zmhs_nav" style="display: none">
+                                    <ul class="nav nav-tabs">
+                                        <li class="nav-item" data-toggle="tooltip" data-placement="left" title="收起">
+                                            <a data-toggle="tab" href="#rnc-close" role="tab" class="zmhs-link nav-link">收起<!--<i class="fa fa-arrow-right"></i>--></a>
+                                        </li>
+                                       
+                                        <li class="nav-item" data-toggle="tooltip" data-placement="left" title="附注条件"><a data-toggle="tab"  id="divide_hs-nav" href="#divide_rnc-zm" role="tab"class="zmhs-link nav-link">换算</a></li>
+                                        <li class="nav-item" data-toggle="tooltip" data-placement="left" title="自定义系数"><a data-toggle="tab" href="#divide_rnc-cus" role="tab"class="zmhs-link nav-link">系数</a></li>
+                                        <li class="nav-item" data-toggle="tooltip" data-placement="left" title="定额稳定土"><a data-toggle="tab" href="#divide_rnc-stable" role="tab" class="zmhs-link nav-link">稳定土</a></li>
+                                    </ul>
+                                </div>
+                            </div>
+                        </div>
+                    </div>
+                  </div>
+              </div>
+          </div>
+      </div>
+      <div class="divide_side" style="display: inline-block" id="divide_side">
+        <div class="resize-x" id="divideSideResize"></div>
+        <div class="tab-content" style="width: 99%; height: 100%; float: left">
+          <!--定额库-->
+          <div class="tab-pane" id="divide_de">
+            <div class="tools-bar-height-d container-fluid" id="divide_deToolsBar">
+                <div class="p-1 row">
+                    <select class="form-control form-control-sm col-6" id="divide_stdRationLibSelect">
+                    </select>
+                    <div class="input-group col-6">
+                        <input type="text" class="form-control form-control-sm" placeholder="搜索定额" value="" id="divide_rationSearchKeyword">
+                        <div class="input-group-append">
+                            <button class="btn btn-secondary btn-sm" type="button" id="divide_rationSearch"><i class="fa fa-search" aria-hidden="true"></i></button>
+                        </div>
+                    </div>
+                    <!--搜索结果窗体-->
+                    <div class="side-search-box col-12 p-0" id="divide_rationSearchResult" style="display: none;">
+                        <div class="d-flex justify-content-between">
+                            <div class="my-1">
+                                <span id="divide_rationSearchCount"></span>
+                                <button id="divide_curRationLib" type="button" class="btn btn-sm btn-secondary" style="margin-left: 15px;">本定额</button>
+                                <button id="divide_allRationLibs" type="button" class="btn btn-sm btn-light">全部定额</button>
+                            </div>
+                            <a title="关闭搜索" class="btn btn-link btn-sm" href="javascript:void(0)"><i class="fa fa-remove" aria-hidden="true"></i></a>
+                        </div>
+                        <div class="w-100 main-data-side-search"></div>
+                    </div>
+               
+                </div>
+            </div>
+            <div class="top-content" id="divide_deTopDiv" style="overflow: hidden">
+                <div class="main-data-side-d" id="divide_stdRationChapter"></div>
+            </div>
+            <div class="resize-y" id="divide_deResize" style="background: #F1F1F1"></div>
+            <div class="bottom-content" id="divide_deBottomDiv">
+                <div class="main-data-bottom" id="divide_stdSectionRations"></div>
+            </div>
+        </div>
+        </div>
+  </div>
+</div>

+ 468 - 0
web/building_saas/main/js/views/divide_view.js

@@ -0,0 +1,468 @@
+let divideObj = {
+  divideSetting:{//“类别”、“清单编号”、“名称”、“单位”、“工程量”、“单价”、“金额”、“预算价”、“取费类别”。
+    header: [
+      {headerName: "类别", headerWidth: 60, dataCode: "itemType", hAlign:'center', dataType: "String"},
+      {headerName: "清单编号", headerWidth: 130, dataCode: "code", hAlign:'left', dataType: "String", formatter: "@"},
+      {headerName: "名称", headerWidth: 160, dataCode: "name", dataType: "String",formatter: "@"},
+      {headerName: "单位", headerWidth: 100, dataCode: "unit", dataType: "String",cellType:'comboBox',editable:true,options:['m', 'm2', 'm3', 'km', 't', 'kg', '台班', '工日', '昼夜', '元', '项', '处', '个', '件',
+      '根', '组', '系统', '台', '套', '株', '丛', '缸', '支', '只', '块', '座', '对', '份', '樘', '攒', '榀']},
+      {headerName: "工程量", headerWidth: 80, dataCode: "quantity", dataType: "Number",validator:"number",getText:"notZero"},
+      {headerName: "单价", headerWidth: 100, dataCode: "unitPrice", dataType: "Number",validator:"number",getText:"notZero"},
+      {headerName: "金额", headerWidth: 100, dataCode: "totalPrice", dataType: "Number",validator:"number",getText:"notZero"},
+      {headerName: "预算价", headerWidth: 100, dataCode: "marketPrice", dataType: "Number",validator:"number",getText:"notZero"},
+      {headerName: "取费类别", headerWidth: 60, dataCode: "programID", hAlign:'center', dataType: "String",cellType:'comboBox',editorValueType:true}
+    ],
+    view:{ 
+      lockColumns: [0],
+      colHeaderHeight:30
+    },
+    getText:{
+      notZero:function (item,value) {
+        return value == 0?"":value;
+      }
+    },
+    treeCol:1
+  },
+  billsSetting:{
+    header: [//“编号”、“名称”、“分摊比例”、“分摊金额”、“原始金额”、“合计”、“金额”。
+      {headerName: "编号", headerWidth: 130, dataCode: "code", hAlign:'left', dataType: "String"},
+      {headerName: "名称", headerWidth: 160, dataCode: "name", dataType: "String"},
+      {headerName: "分摊比例", headerWidth: 80, dataCode: "divideRate", dataType: "Number",validator:"number"},
+      {headerName: "分摊金额", headerWidth: 100, dataCode: "dividePrice", dataType: "Number",validator:"number"},
+      {headerName: "原始金额", headerWidth: 100, dataCode: "originalPrice", dataType: "Number",validator:"number"},
+      {headerName: "合计", headerWidth: 100, dataCode: "totalPrice", dataType: "Number",validator:"number"},
+      {headerName: "金额", headerWidth: 60, dataCode: "price", dataType: "Number",validator:"number"}
+    ],
+    view:{ 
+      lockColumns: [0,1,2,3,4,5,6],
+      colHeaderHeight:30
+    }
+  },
+  divideSpread:null,
+  billsSpread:null,
+  initSpread:function(){
+    this.initDivideSpread();
+    this.initBillsSpread();
+    if(!projectReadOnly){
+      this.initDivideRightClick();
+    }else {
+      disableSpread(this.divideSpread);
+      disableSpread(this.billsSpread);
+    }
+  },
+  showDatas:function(){
+    this.showDivideDatas();
+    this.showBillsDatas();
+  },
+  refreshViews:function(){
+    if(!$('#divide_main').is(':visible')) return;
+    if(this.divideSpread) this.divideSpread.refresh();
+    if(this.billsSpread) this.billsSpread.refresh();
+  },
+  showDivideDatas:function(){
+    if(!$('#divide_main_sheet').is(':visible')) return;
+    this.divideDatas = getDivideDatas();
+    this.divideSheet.setRowCount(this.divideDatas.length);
+    let fheader= _.find(this.divideSetting.header,{'dataCode': "programID"})
+    fheader.options = this.getProgramOptions();
+    sheetCommonObj.showTreeData(this.divideSheet, this.divideSetting,this.divideDatas);
+
+    function getDivideDatas(){
+      let datas = [];
+      let divideSetting =  projectObj.project.divide_setting.datas
+      let parentMap={};
+
+      //divideSetting.divideList = [{ID:"1",code:"1",ParentID:-1,collapsed:false},{ID:"2",code:"2",ParentID:"1",collapsed:false}]
+      divideSetting.divideList = _.sortByAll(divideSetting.divideList,['seq'])
+      for(let d of divideSetting.divideList){
+        parentMap[d.ParentID]?parentMap[d.ParentID].push(d):parentMap[d.ParentID]=[d]
+      }
+      if(parentMap[-1]&&parentMap[-1].length>0){
+        for(let r of parentMap[-1]){
+          r.collapsed = false;
+          datas.push(r)
+          if(parentMap[r.ID] && parentMap[r.ID].length > 0){
+            for(let c of parentMap[r.ID]){
+              datas.push(c);
+            }
+          }
+        }
+      }
+      return datas;
+    }
+  },
+  getProgramOptions:function(){
+    let names = projectObj.project.calcProgram.compiledTemplateNames;
+    let map = projectObj.project.calcProgram.compiledTemplateMaps;
+    let options = [];
+    for(let n of names){
+      options.push({text:n,value:map[n]});
+    }
+    return options;
+
+  },
+  divideEditChecking:function(row,col){//return false表示不能编辑
+    let me = this;
+    let data = me.divideDatas[row],setting = me.divideSetting;
+    let dataCode = setting.header[col].dataCode;
+    if(data){
+      if(data.itemType == "分摊项"){
+        //金额,预算价,取费类别不可编辑
+        if(dataCode =="totalPrice" || dataCode =="marketPrice" || dataCode =="programID" ) return false;
+        //有子项时,单价不可编辑
+        if(_.find(me.divideDatas,{ParentID:data.ID})) return false;
+      }
+      if( data.itemType == "量价" && dataCode =="totalPrice") return false//量价:“金额”不可编辑。
+      if(data.itemType == "定额"){ //定额:“单位”、“单价”、“金额”、“预算价”
+        return !(dataCode == "unit"||dataCode == "unitPrice"||dataCode == "totalPrice"||dataCode == "marketPrice")
+      } 
+      return true
+    }
+    return false;  
+  },
+  showBillsDatas:function(){
+    if(!$('#divide_bills_sheet').is(':visible')) return;
+    this.billsDatas = getBillsDatas();
+    sheetCommonObj.showData(this.billsSheet, this.billsSetting,this.billsDatas);
+    this.billsSheet.setRowCount(this.billsDatas.length);
+
+    function getBillsDatas(){
+      return [];
+    }
+  },
+  getSelectedItem:function(){
+    let me = this,data=null;
+    let sel = me.divideSheet.getSelections()[0];
+    let srow = sel.row == -1||sel.row == ""?0:sel.row;
+    if(me.divideDatas.length>srow){
+        data = me.divideDatas[srow];
+    }
+    return data;
+  },
+  addNewItems:async function(itemType,type){
+    let newItem = {
+      ID:uuid.v1(),
+      itemType:itemType,
+      ParentID:-1
+    };
+    if(type) newItem.type = type;
+    let selected = this.getSelectedItem();
+    if(itemType!="分摊项"){//当插入定额或者量价时:
+      newItem.ParentID = selected.itemType == "分摊项"?selected.ID:selected.ParentID;
+    } 
+    if(itemType == "量价") newItem['programID'] = projectObj.project.calcProgram.compiledTemplateMaps["费率为0"];
+
+    let [seq,datas] = this.getNewSeqs(selected,newItem);
+    newItem.seq = seq;
+    datas.push({type:"add",doc:newItem});
+    await this.updateItem(datas);
+  },
+  deleteItem:async function(){
+    let selected = this.getSelectedItem();
+    let subItems = [];
+    if(selected.itemType == "分摊项"){
+      //检查是否执行了分摊,如果已经执行了,要取消分摊才能删除
+      // todo
+      for(let s of this.divideDatas){
+        if(s.ParentID == selected.ID) subItems.push({type:"delete",ID:s.ID});
+      }
+    }
+    subItems.push({type:"delete",ID:selected.ID});
+    await this.updateItem(subItems);
+  },
+  getNewSeqs:function(selected,newItem){
+    let seq = 1,datas=[],refreshSeq = false;
+    for(let d of this.divideDatas){
+      if(d.ParentID == newItem.ParentID){
+        if(refreshSeq == true){
+          if(d.seq == seq || d.seq > seq) datas.push({ID:d.ID,type:'update',doc:{seq:d.seq+1}})
+        }
+        if(selected && d.ID == selected.ID){
+          seq = d.seq + 1;
+          refreshSeq = true;
+        }
+      }
+    }
+    return [seq,datas]
+  },
+
+  updateItem: async function(datas){
+    let divideSetting =  projectObj.project.divide_setting.datas
+    try {
+      $.bootstrapLoading.start();
+      let result = ajaxPost("/divide/updateItem",{ID:divideSetting.ID,updateDatas:datas})
+      for(let d of datas){
+        if(d.type == "add"){
+          divideSetting.divideList.push(d.doc);
+        }
+        if(d.type == "delete"){
+          _.remove(divideSetting.divideList,{'ID':d.ID});
+        }
+        if(d.type == "update"){
+          let item = _.find(divideSetting.divideList,{'ID':d.ID});
+          if(item) gljUtil.updateProperty(item,d.doc);
+        }
+      }
+    } catch (error) {
+      console.log(error)
+    }
+    $.bootstrapLoading.end();
+    this.showDatas();
+  },
+
+  initDivideSpread:function(){
+    if(this.divideSpread) return;
+    this.divideSpread = SheetDataHelper.createNewSpread($("#divide_main_sheet")[0]);
+    sheetCommonObj.spreadDefaultStyle(this.divideSpread);
+    this.divideSheet = this.divideSpread.getSheet(0);
+    sheetCommonObj.initSheet(this.divideSheet, this.divideSetting, 2);
+    this.divideSheet.bind(GC.Spread.Sheets.Events.EditStarting,this.onDivideEditStarting);
+    this.divideSheet.bind(GC.Spread.Sheets.Events.ValueChanged,this.onDivideValueChange)
+/*     ;
+    this.divideSheet.bind(GC.Spread.Sheets.Events.RangeChanged, this.onCoeRangeChanged); */
+    this.divideSheet.bind(GC.Spread.Sheets.Events.SelectionChanged, function (e,args) {
+        args.sheet.repaint();
+    });
+
+    SheetDataHelper.protectdSheet(this.divideSheet);
+  },
+  onDivideEditStarting:function (sender, args) {
+    let me = divideObj;
+    let row = args.row;
+    let col = args.col;
+    if(me.divideEditChecking(row,col)==false){
+        args.cancel = true;
+    }
+  },
+  onDivideValueChange:async function(sender,info){
+    let me = divideObj,row = info.row, col = info.col;
+    let setting = me.divideSetting;
+    let dataCode = setting.header[col].dataCode;
+    let recode = me.divideDatas[row];
+    let value = info.newValue;
+    if(info.newValue === undefined ){
+      return;
+    }
+    if(value && !sheetCommonObj.checkData(col,setting,value)) {
+        alert('输入的数据类型不对,请重新输入!');
+        return me.showDatas();
+    }
+
+    await me.updateItem([me.getDivideUpdateData(recode,dataCode,value)]);
+  },
+  getDivideUpdateData:function(recode,dataCode,value){
+    let doc = {};
+    if(recode.itemType == "分摊项"){
+      if(dataCode == "quantity"){
+        value = scMathUtil.roundForObj(value,3);
+        let tu = scMathUtil.roundForObj(recode.unitPrice&&recode.unitPrice!=""?recode.unitPrice:0,getDecimal("bills.unitPrice"))
+        doc["totalPrice"] = scMathUtil.roundForObj(value * tu,getDecimal("bills.totalPrice"))
+      }
+      if(dataCode == "unitPrice"){
+        value = scMathUtil.roundForObj(value,getDecimal("bills.unitPrice"));
+        let tq = scMathUtil.roundForObj(recode.quantity && recode.quantity!=""?recode.quantity:0,3)
+        doc["totalPrice"] = scMathUtil.roundForObj(value * tq,getDecimal("bills.totalPrice"))
+      }
+    }
+    doc[dataCode]=value;
+    return {ID:recode.ID,type:'update',doc:doc}
+  },
+  initBillsSpread:function(){
+    if(this.billsSpread) return;
+    this.billsSpread = SheetDataHelper.createNewSpread($("#divide_bills_sheet")[0]);
+    sheetCommonObj.spreadDefaultStyle(this.billsSpread);
+    this.billsSheet = this.billsSpread.getSheet(0);
+    sheetCommonObj.initSheet(this.billsSheet, this.billsSetting, 0);
+    SheetDataHelper.protectdSheet(this.divideSheet);
+  },
+  initDivideRightClick:function(){
+    //如果当前行是无组成物的“普通材料”、“绿化苗木”、“外购砼构件”、“商品混凝土”、“商品砂浆”,则右键“添加计算材料”按钮有效。
+    let me = this;
+    $.contextMenu({
+        selector: '#divide_main_sheet',
+        build: function ($trigger, e) {
+            me.rightClickTarget = SheetDataHelper.safeRightClickSelection($trigger, e, me.divideSpread);
+            return me.rightClickTarget.hitTestType === GC.Spread.Sheets.SheetArea.viewport ||
+                me.rightClickTarget.hitTestType === GC.Spread.Sheets.SheetArea.rowHeader;
+        },
+        items: {
+            "insertItem": {
+                name: "插入分摊项",
+                icon: 'fa-sign-in',
+                disabled: function () { 
+                  let selected = me.getSelectedItem();
+                  if(selected && selected.itemType !="分摊项") return true;
+                  return false;
+                },
+                callback: function (key, opt) {
+                  me.addNewItems("分摊项");
+                }
+            },
+            "insertRation": {
+                name: "插入定额",
+                icon: 'fa-sign-in',
+                disabled: function () {
+                  return me.rightClickTarget.row === undefined
+                },
+                callback: function (key, opt) {  
+                  me.addNewItems("定额");
+                }
+            },
+            "insertVolumePrice": {
+                name: "插入量价",
+                icon: 'fa-sign-in',
+                disabled: function () {
+                  return me.rightClickTarget.row === undefined;
+                },
+                items:{
+                  insertLabour:{
+                      name: "人工",
+                      icon: 'fa-sign-in',
+                      callback:function(key){
+                        me.addNewItems("量价",1);
+                      }
+                  },
+                  insertMaterial:{
+                     name:"材料" ,
+                      icon: 'fa-sign-in',
+                      callback:function(key){
+                        me.addNewItems("量价",201);
+                      }
+                  },
+                  insertMachine:{
+                      name:"机械" ,
+                      icon: 'fa-sign-in',
+                      callback:function(key){
+                        me.addNewItems("量价",301);
+                      }
+                  }
+                }
+            },
+            "removeItem": {
+                name: "删除",
+                icon: 'fa-trash-o',
+                disabled: function () {
+                    return  me.rightClickTarget.row === undefined;;
+                },
+                callback: function (key, opt) {  
+                  me.deleteItem();
+                }
+            }
+        }
+    });
+  },
+
+  getDivideResizeEles:function () {
+    let divideResizeEles = {};
+    divideResizeEles.eleObj = {
+        module: 'divide',
+        resize: $('#divideResize'),
+        top: $('#divide_top'),
+        topSpread: $('#divide_main_sheet'),
+        bottom: $('#divideBottom'),
+        bottomSpread: [$('#sub_sheet')]
+    };
+    divideResizeEles.limit = {
+        min: 150,
+        max: `$(window).height()-$('.header').height()-$('#divideToolsBar').height()-150-5`,//5: resize.height()
+        notTopSpread: 0,
+        notBottomSpread: 0,
+        bottomNav:`$('#divideBottom ul').height()`,
+        totalHeight: `$(window).height()-$('.header').height()-$('#divideToolsBar').height()-5`
+    };
+    return divideResizeEles;
+  }
+}
+
+
+function loadDivideHeight(){
+  if(!$('#divide_main').is(':visible')) return;
+  let me = divideObj;
+  let divideResizeEles = me.getDivideResizeEles();
+  SlideResize.loadVerticalHeight(divideResizeEles.eleObj.module, divideResizeEles.eleObj, divideResizeEles.limit, function () {
+      me.refreshViews();
+  });
+}
+
+$('#tab_divide').on('shown.bs.tab', function (e) {
+  sessionStorage.setItem('mainTab', '#tab_divide');
+  loadDivideHeight();
+  divideObj.initSpread();
+  divideObj.showDatas();
+
+})
+
+$('.divide-nav-link').bind('click', function () {//$('.side-tabs ul li a').bind   2018-11-23  使用更多标签,所以不能这样绑定事件了
+    var tab = $(this), tabPanel = $(tab.attr('relaPanel'));
+    if(tab.hasClass('disabled')){
+        return;
+    }
+    let setActiveTab = tab;
+    if (!(setActiveTab.hasClass('active')&&tabPanel.is(":visible"))) {
+        $('.divide_side-tabs ul li a').removeClass('active');
+        setActiveTab.addClass('active');
+        showDivideSide(tabPanel, true, tab.attr('id'));
+    } else {
+        setActiveTab.removeClass('active');
+        showDivideSide(tabPanel, false, tab.attr('id'));
+    }
+    divideObj.refreshViews();  
+    
+});
+
+
+//定额库上下拖动
+let dividRationLibResizeEles = {};
+dividRationLibResizeEles.eleObj = {
+    module: 'divide_de',
+    resize: $('#divide_deResize'),
+    top: $('#divide_deTopDiv'),
+    topSpread: $('#divide_stdRationChapter'),
+    bottom: $('#divide_deBottomDiv'),
+    bottomSpread: $('#divide_stdSectionRations')
+};
+dividRationLibResizeEles.limit = {
+    min: 150,
+    max: `$(window).height()-$('.header').height()-$('.toolsbar').height()-$('#deToolsBar').height()-150-5`,//5: resize.height()
+    notTopSpread: 0,
+    notBottomSpread: 0,
+    totalHeight: `$(window).height()-$('.header').height()-$('.toolsbar').height()-$('#divide_deToolsBar').height()-5`
+};
+
+function showDivideSide(tabPanel, show, id){
+  let divideSideResizeEles = {};
+  divideSideResizeEles.eleObj = {
+      module: 'divideRationLibTab',
+      resize: $('#divideSideResize'),
+      parent: $('#divideRow'),
+      left: $('#divide_main'),
+      right: $('#divide_side')
+  };
+  divideSideResizeEles.limit = {
+      min: 150,
+      max: `$('#divideRow').width()-150`
+  };
+
+  divideSideResizeEles.eleObj.module = id;
+  if (show) {
+      //刚打开各库时的默认比例
+      divideSideResizeEles.eleObj.left.css('width', '66.666667%');
+      divideSideResizeEles.eleObj.right.css('width', '33.333333%');
+      SlideResize.setResizeWidth(divideSideResizeEles.eleObj.resize);
+      $('.divide_side .tab-pane').hide();
+      tabPanel.show();//locateTab要等div显示后才执行刷新操作
+      //加载打开的库与主界面的宽度比
+      SlideResize.loadHorizonWidth(id, [divideSideResizeEles.eleObj.resize], [divideSideResizeEles.eleObj.left, divideSideResizeEles.eleObj.right], function(){
+          
+        if (id === 'stdRationTab') {//加载定额库内部上下高度
+            SlideResize.loadVerticalHeight(dividRationLibResizeEles.eleObj.module, dividRationLibResizeEles.eleObj, dividRationLibResizeEles.limit, function () {
+                //sheetCommonObj.setColumnWidthByRate($('#divide_stdRationChapter').width() - 30, rationLibObj.rationChapterSpread, rationLibObj.rationChapterTreeSetting.cols);
+            });
+          }
+      });
+  } else {
+      divideSideResizeEles.eleObj.left.css('width', '100%');
+      divideSideResizeEles.eleObj.right.css('width', '0%');
+      tabPanel.hide();
+  }
+}