瀏覽代碼

feat: 概算汇总,计算基数

vian 4 年之前
父節點
當前提交
3d6b9d2c09

+ 10 - 0
modules/main/controllers/bills_controller.js

@@ -269,6 +269,16 @@ module.exports = {
             callback(req, res, 1, err, null);
         }
     },
+    initialBudgetSummary: async function (req, res) {
+        const data = JSON.parse(req.body.data);
+        try {
+            const bills = await bill_facade.initialBudgetSummary(data.constructionID);
+            callback(req, res, 0, 'success', bills);
+        } catch (err) {
+            console.log(err);
+            callback(req, res, 1, err, null);
+        }
+    },
     getBudgetSummary: async function (req, res) {
         const data = JSON.parse(req.body.data);
         try {

+ 21 - 1
modules/main/facade/bill_facade.js

@@ -141,6 +141,18 @@ module.exports={
     getEquipmentFee: async function (unitIDs) {
         return 5000.15;
     },
+    // 获取概算汇总初始化数据
+    initialBudgetSummary: async function (constructionID) {
+        const treeData = await this.getBudgetSummary(constructionID);
+        const construction = await projectModel.findOne({ ID: constructionID }, { 'property.costGrowthRate': 1, 'property.growthPeriod': 1 }).lean();
+        const costGrowthRate = construction && construction.property && construction.property.costGrowthRate || 0;
+        const growthPeriod = construction && construction.property && construction.property.growthPeriod || 0;
+        return {
+            treeData,
+            costGrowthRate,
+            growthPeriod,
+        }
+    },
     // 获取概算汇总数据(拍好序的)
     getBudgetSummary: async function (constructionID) {
         // 获取建设项目清单数据(工程建设其他费用 - 建设项目总概算)部分
@@ -298,6 +310,7 @@ module.exports={
     },
     bulkOperation: async function (bulkData) {
         const bulks = [];
+        const projectBulks = [];
         bulkData.forEach(item => {
             if (item.type === 'new') {
                 bulks.push({
@@ -307,6 +320,10 @@ module.exports={
                 bulks.push({
                     updateOne: { filter: { ID: item.data.ID }, update: { $set: item.data } }
                 });
+            } else if (item.type === 'updateProject') {
+                projectBulks.push({
+                    updateOne: { filter: { ID: item.data.ID }, update: { $set: item.data } }
+                });
             } else {
                 bulks.push({
                     deleteOne: { filter: { ID: item.data.ID } }
@@ -314,7 +331,10 @@ module.exports={
             }
         });
         if (bulks.length) {
-            await bill_Model.bulkWrite(bulks);
+            await bill_Model.bulkWrite(bulks);  
+        }
+        if (projectBulks.length) {
+            await projectModel.bulkWrite(projectBulks);
         }
     }
 };

+ 1 - 0
modules/main/routes/bills_route.js

@@ -22,6 +22,7 @@ module.exports = function (app) {
     billsRouter.post('/import', billsController.import);
     billsRouter.get('/downloadExamp', billsController.downloadExample);
     billsRouter.post('/insertBills', billsController.insertBills);
+    billsRouter.post('/initialBudgetSummary', billsController.initialBudgetSummary);
     billsRouter.post('/getBudgetSummary', billsController.getBudgetSummary);
     billsRouter.post('/bulkOperation', billsController.bulkOperation);
     app.use('/bills', billsRouter);

+ 1 - 1
modules/main/templates/constructionBillsTemplate.js

@@ -30,7 +30,7 @@ const buildingTemplate = [
   { ID: 2281, ParentID: 228, NextSiblingID: 2282, code: '2.2.8.1', name: '勘察费', unit: '', calcBase: '', quantity: '', flags: [{ fieldName: 'fixed', flag: null }], type: billType.BILL },
   { ID: 2282, ParentID: 228, NextSiblingID: -1, code: '2.2.8.2', name: '设计费', unit: '', calcBase: '', quantity: '', flags: [{ fieldName: 'fixed', flag: fixedFlag.DESIGN_FEE }], type: billType.BILL },
   { ID: 229, ParentID: 22, NextSiblingID: 2210, code: '2.2.9', name: '咨询费', unit: '', calcBase: '', quantity: '', flags: [{ fieldName: 'fixed', flag: null }], type: billType.BILL },
-  { ID: 2291, ParentID: 229, NextSiblingID: 2292, code: '2.2.9.1', name: '设计咨询费', unit: '', calcBase: '', quantity: '', flags: [{ fieldName: 'fixed', flag: null }], type: billType.BILL },
+  { ID: 2291, ParentID: 229, NextSiblingID: 2292, code: '2.2.9.1', name: '设计咨询费', unit: '', calcBase: '', quantity: '', flags: [{ fieldName: 'fixed', flag: fixedFlag.DESIGN_COUNSEL_FEE }], type: billType.BILL },
   { ID: 2292, ParentID: 229, NextSiblingID: 2293, code: '2.2.9.2', name: '工程造价咨询费', unit: '', calcBase: '', quantity: '', flags: [{ fieldName: 'fixed', flag: null }], type: billType.BILL },
   { ID: 2293, ParentID: 229, NextSiblingID: -1, code: '2.2.9.3', name: '施工图审查费', unit: '', calcBase: '', quantity: '', flags: [{ fieldName: 'fixed', flag: null }], type: billType.BILL },
   { ID: 2210, ParentID: 22, NextSiblingID: 2211, code: '2.2.10', name: '全过程工程咨询服务费', unit: '', calcBase: '', quantity: '', flags: [{ fieldName: 'fixed', flag: null }], type: billType.BILL },

+ 8 - 6
public/common_constants.js

@@ -95,18 +95,20 @@
         CONSTRUCTION_OTHER_FEE: 1003,
         // 设计费
         DESIGN_FEE: 1004,
+        // 设计咨询费
+        DESIGN_COUNSEL_FEE: 1005,
         // 预备费
-        BUDGET_RESERVE: 1005,
+        BUDGET_RESERVE: 1006,
         // 基本预备费
-        BASIC_BUDGET_RESERVE: 1006,
+        BASIC_BUDGET_RESERVE: 1007,
         // 价差预备费
-        DIFF_BUDGET_RESERVE: 1007,
+        DIFF_BUDGET_RESERVE: 1008,
         // 专项费用
-        CONSTRUCTION_SPECIAL_FEE: 1008,
+        CONSTRUCTION_SPECIAL_FEE: 1009,
         // 建设期贷款利息
-        LOAN_INTEREST: 1009,
+        LOAN_INTEREST: 1010,
         // 建设项目总概算
-        CONSTRUCTION_BUDGET: 1010,
+        CONSTRUCTION_BUDGET: 1011,
 
     };
     // 清单类型

+ 47 - 0
web/building_saas/budget-summary/html/budget-summary.html

@@ -1,6 +1,10 @@
 <div class="budget-summary">
   <div class="toolsbar px-1 d-flex justify-content-between">
     <div class="tools-btn btn-group align-top">
+      <!-- <span id="openConstructionSet" class="btn btn-light btn-sm" data-toggle="tooltip" data-original-title="建设项目设置"
+                data-placement="bottom">
+        <a href="javascript:void(0);"><i class="fa fa-cog"></i></a>
+      </span> -->
       <a href="javascript:void(0)" class="btn btn-light btn-sm" id="budget-upLevel" data-toggle="tooltip"
         data-placement="bottom" data-original-title="升级"><i class="fa fa-arrow-left" aria-hidden="true"></i></a>
       <a href="javascript:void(0)" class="btn btn-light btn-sm" id="budget-downLevel" data-toggle="tooltip"
@@ -13,4 +17,47 @@
     </div>
   </div>
   <div class="sheet-wrapper" id="budget-summary-sheet"></div>
+</div>
+<div class="modal fade" id="constructionSet" data-backdrop="static">
+  <div class="modal-dialog modal-lg" role="document" style="max-width: 800px;">
+      <div class="modal-content ui-draggable">
+          <div class="modal-header ui-draggable-handle">
+              <h5 class="modal-title">建设项目设置</h5>
+              <button type="button" class="close" data-dismiss="modal" aria-label="Close">
+                  <span aria-hidden="true">×</span>
+              </button>
+          </div>
+          <div class="modal-body">
+            <div class="row">
+                <div class="col-3">
+                    <ul class="nav flex-column nav-pills" role="tablist">
+                        <li class="nav-item"><a class="nav-link active show" data-toggle="pill" href="#construction-setting" id="about-construction-calc" role="tab">关于计算</a></li>
+                    </ul>
+                </div>
+                <div class="col-9">
+                    <div class="tab-content">
+                        <!--关于计算-->
+                        <div class="tab-pane fade active show" id="construction-setting" role="tabpanel">
+                            <div class="modal-auto-height">
+                                <fieldset class="form-group" id="jcybf">
+                                    <h5>价差预备费</h5>
+                                    <div class="mt-1">
+                                        年造价增涨率<input id="costGrowthRate" class="form-control form-control-sm"  value="0" type="text" style="display: inline-block; width: 90px;">%
+                                    </div>
+                                    <div class="mt-1">
+                                        增涨计费年限<input id="growthPeriod" class="form-control form-control-sm"  value="0" type="text" style="display: inline-block; width: 90px;">
+                                    </div>
+                                </fieldset>
+                            </div>
+                        </div>
+                    </div>
+                </div>
+            </div>
+        </div>
+          <div class="modal-footer">
+            <a href="javascript:void(0);" class="btn btn-primary" id="construction-set-ok" data-dismiss="modal">确定</a>
+            <button type="button" class="btn btn-secondary" data-dismiss="modal">关闭</button>
+          </div>
+      </div>
+  </div>
 </div>

+ 107 - 21
web/building_saas/budget-summary/js/budgetSummarySheet.js

@@ -10,6 +10,11 @@ const budgetSummaryObj = (() => {
   let spread = null;
   // 建设其他费树
   let tree = null;
+  // 计算相关
+  const calcSetting = {
+    costGrowthRate: 0,
+    growthPeriod: 0,
+  };
 
   // 单位设置下拉框
   const setUnitCombo = (sheet, data) => {
@@ -217,39 +222,57 @@ const budgetSummaryObj = (() => {
     const lock = () => {
       if (projectReadOnly) {
         sheet.getRange(0, 0, nodes.length, budgetSummaryTreeSetting.cols.length, GC.Spread.Sheets.SheetArea.viewport).locked(true);
-        return;
+        return 0;
       }
       // 工程费用区域,只读
       const equipmentNode = nodes.find(node => node.getFlag() === fixedFlag.CONSTRUCTION_EQUIPMENT_FEE);
       if (!equipmentNode) {
-        return;
+        return 0;
       }
       sheet.getRange(0, 0, equipmentNode.serialNo() + 1, budgetSummaryTreeSetting.cols.length, GC.Spread.Sheets.SheetArea.viewport).locked(true);
-      // 剩下的区域,根据单元格锁定方法,按字段进行锁定判断
-      const startIndex = equipmentNode.serialNo() + 1;
-      for (let row = startIndex; row < nodes.length; row ++) {
-        const node = nodes[row];
-        budgetSummaryTreeSetting.cols.forEach((item, col) => {
-          const field = item.data.field;
-          const lockFunc = lockFactory[field];
-          if (!lockFunc) {
-            return;
-          }
-          const isLocked = lockFunc(node);
-          sheet.getCell(row, col).locked(isLocked);
-        });
-      }
-
+      return equipmentNode.serialNo() + 1;
     }
     if (isMass) {
       TREE_SHEET_HELPER.massOperationSheet(sheet, () => {
-        lock();
+        return lock();
       });
     } else {
-      lock();
+      return lock();
+    }
+  }
+
+  /* 单元格类型 */
+  const calcBaseButtonCallback = (hitInfo) => {
+    calcBaseView.onCalcBaseButtonClick(hitInfo, 'budget');
+  };
+  const cellTypeFactory = {
+    calcBase(node) {
+      const locked = lockFactory.calcBase(node);
+      return sheetCommonObj.getCusButtonCellType(calcBaseButtonCallback, locked);
     }
   }
 
+  /* 设置可编辑区域节点的只读性和单元格类型 */
+  const setCells = (sheet, startRow, nodes) => {
+    for (let row = startRow; row < nodes.length; row++) {
+      const node = nodes[row];
+      budgetSummaryTreeSetting.cols.forEach((item, col) => {
+        const field = item.data.field;
+        // 锁定单元格
+        const lockFunc = lockFactory[field];
+        if (lockFunc) {
+          const isLocked = lockFunc(node);
+          sheet.getCell(row, col).locked(isLocked);
+        }
+        // 设置单元格类型
+        const cellTypeFunc = cellTypeFactory[field];
+        if (cellTypeFunc) {
+          const cellType = cellTypeFunc(node);
+          sheet.getCell(row, col).cellType(cellType);
+        }
+      });
+    }
+  }
   /* 初始化表格 */
   const initSpread = () => {
     if (!spread) {
@@ -282,7 +305,8 @@ const budgetSummaryObj = (() => {
     sheet.setRowCount(data.length);
     setUnitCombo(sheet, data);
     TREE_SHEET_HELPER.massOperationSheet(sheet, () => {
-      lockData(sheet, tree.items, false);
+      const startRow = lockData(sheet, tree.items, false);
+      setCells(sheet, startRow, tree.items);
       // 表格格式化
       budgetSummaryTreeSetting.cols.forEach((item, index) => {
         sheet.setFormatter(-1, index, item.formatter || '@', GC.Spread.Sheets.SheetArea.viewport);
@@ -554,7 +578,12 @@ const budgetSummaryObj = (() => {
   const init = async (constructionID) => {
     try {
       $.bootstrapLoading.start();
-      rawData = await ajaxPost('/bills/getBudgetSummary', { constructionID });
+      const { treeData, costGrowthRate, growthPeriod } = await ajaxPost('/bills/initialBudgetSummary', { constructionID });
+      calcSetting.costGrowthRate = costGrowthRate;
+      calcSetting.growthPeriod = growthPeriod;
+      $('#costGrowthRate').val(costGrowthRate);
+      $('#growthPeriod').val(growthPeriod);
+      rawData = treeData;
       rawData.forEach((item) => {
         if (item.quantity) {
           item.quantity = parseFloat(item.quantity);
@@ -570,6 +599,7 @@ const budgetSummaryObj = (() => {
       const spread = initSpread();
       const sheet = spread.getSheet(0);
       initTree(rawData, sheet, budgetSummaryTreeSetting);
+      calcBase.initBudget();
     } catch (err) {
       console.log(err);
       alert(err);
@@ -597,9 +627,65 @@ const budgetSummaryObj = (() => {
     downMove();
   });
 
+  /* 建设项目设置 */
+  $('#openConstructionSet').click(() => {
+    $('#constructionSet').modal('show');
+  });
+  function isKeyNumber(keyCode) {
+    // 数字
+    if (keyCode >= 48 && keyCode <= 57) {
+      return true;
+    } else if (keyCode >= 96 && keyCode <= 105) { //小键盘数字
+      return true;
+    } else if (keyCode == 8 || keyCode == 46 || keyCode == 37 || keyCode == 39 || keyCode == 108 || keyCode == 110) {  // Backspace, del, 左右方向键
+      return true;
+    } else if (keyCode >= 112 && keyCode <= 123) { //F1 -F12
+      return true;
+    }
+    return false;
+  }
+
+  //年造价增涨率
+  $('#costGrowthRate').keydown(function (e) {
+    return isKeyNumber(e.keyCode);
+  });
+  //计费年限
+  $("#growthPeriod").keydown(function (e) {
+    return isKeyNumber(e.keyCode);
+  });
+  // 确认设置
+  $('#construction-set-ok').click(async () => {
+    try {
+      $.bootstrapLoading.start();
+      const curCostGrowthRate = $('#costGrowthRate').val();
+      const curGrowthPeriod = $('#growthPeriod').val();
+      const bulkData = [
+        {
+          type: 'updateProject',
+          data: {
+            ID: projectObj.project.property.rootProjectID,
+            'property.costGrowthRate': curCostGrowthRate,
+            'property.growthPeriod': curGrowthPeriod,
+          }
+        }
+      ];
+      await bulkOperation(bulkData);
+      calcSetting.costGrowthRate = curCostGrowthRate;
+      calcSetting.growthPeriod = curGrowthPeriod;
+    } catch (err) {
+      alert(err);
+      $('#costGrowthRate').val(calcSetting.costGrowthRate);
+      $('#growthPeriod').val(calcSetting.growthPeriod);
+    } finally {
+      $.bootstrapLoading.end();
+    }
+  });
+
+
   // 对外暴露
   return {
     getTree: () => tree,
+    calcSetting,
   };
 
 })();

+ 1 - 0
web/building_saas/main/html/main.html

@@ -2788,6 +2788,7 @@
 
 
 
+
   <%include ../../../common/components/share/index.html %>
 
   <img src="/web/dest/css/img/folder_open.png" id="folder_open_pic" style="display: none">

文件差異過大導致無法顯示
+ 541 - 332
web/building_saas/main/js/models/calc_base.js


+ 85 - 56
web/building_saas/main/js/views/calc_base_view.js

@@ -8,26 +8,26 @@ let calcBaseView = {
     //可用计算基数的清单固定列映射(与fixedFlag)
     inputExpr: $('#calcBaseExp'),
     confirmBtn: $('#calcBaseFeeRateConf'),//org:calcBaseConf
-    type: {bills: 'bills', ration: 'ration'},
-    billsCBClass:{ALL: [], FBFX: [], CSXM: [], QTXM: [], FBF: [], RCJ: [], GF: [], SJ: [], SQGCZJ: []},
+    type: { bills: 'bills', ration: 'ration' },
+    billsCBClass: { ALL: [], FBFX: [], CSXM: [], QTXM: [], FBF: [], RCJ: [], GF: [], SJ: [], SQGCZJ: [] },
     curType: null,
     editingCell: null,
     workBook: null,
-    setting:{
+    setting: {
         billsHeader: [
-            {name: '计算基础名称', dataCode: 'base', width: 220, vAlign: 'center', hAlign: 'left'},
-            {name: '金额', dataCode: 'price', width: 100, vAlign: 'center', hAlign: 'right'}
+            { name: '计算基础名称', dataCode: 'base', width: 220, vAlign: 'center', hAlign: 'left' },
+            { name: '金额', dataCode: 'price', width: 100, vAlign: 'center', hAlign: 'right' }
         ],
         rationHeader: [
-            {name: '定额计算程序基数名称', dataCode: 'base', width: 400, vAlign: 'center', hAlign: 'left'}
+            { name: '定额计算程序基数名称', dataCode: 'base', width: 400, vAlign: 'center', hAlign: 'left' }
         ],
         options: {
-            tabStripVisible:  false,
-            allowCopyPasteExcelStyle : false,
+            tabStripVisible: false,
+            allowCopyPasteExcelStyle: false,
             allowExtendPasteRange: false,
-            allowUserDragDrop : false,
+            allowUserDragDrop: false,
             allowUserDragFill: false,
-            scrollbarMaxAlign : true
+            scrollbarMaxAlign: true
         },
         locked: {
             rows: [],
@@ -44,7 +44,7 @@ let calcBaseView = {
     },
 
     setOptions: function (workbook, opts) {
-        for(let opt in opts){
+        for (let opt in opts) {
             workbook.options[opt] = opts[opt];
         }
     },
@@ -60,7 +60,7 @@ let calcBaseView = {
             sheet.setColumnCount(headers.length);
             sheet.setRowHeight(0, 20, GC.Spread.Sheets.SheetArea.colHeader);
             sheet.setColumnWidth(0, 20, GC.Spread.Sheets.SheetArea.rowHeader);
-            for(let i = 0, len = headers.length; i < len; i++){
+            for (let i = 0, len = headers.length; i < len; i++) {
                 sheet.setValue(0, i, headers[i].name, GC.Spread.Sheets.SheetArea.colHeader);
                 sheet.setColumnWidth(i, headers[i].width, GC.Spread.Sheets.SheetArea.colHeader);
             }
@@ -69,12 +69,12 @@ let calcBaseView = {
     },
 
     buildSheet: function () {
-        if(!this.workBook){
-            this.workBook = new GC.Spread.Sheets.Workbook($('#billsBaseSpread')[0], {sheetCount: 1});
+        if (!this.workBook) {
+            this.workBook = new GC.Spread.Sheets.Workbook($('#billsBaseSpread')[0], { sheetCount: 1 });
             sheetCommonObj.spreadDefaultStyle(this.workBook);
             this.setOptions(this.workBook, this.setting.options);
             //bills
-            if(this.curType === this.type.bills){
+            if (this.curType === this.type.bills || this.curType === 'budget') {
                 this.setting.header = this.setting.billsHeader;
             }
             //ration
@@ -92,7 +92,7 @@ let calcBaseView = {
         sheet.bind(_events.CellDoubleClick, this.onCellDoubleClick);
     },
 
-    showData(datas){
+    showData(datas) {
         let me = calcBaseView;
         let sheet = this.workBook.getActiveSheet();
         let cols = this.setting.header;
@@ -101,10 +101,10 @@ let calcBaseView = {
             let style = new GC.Spread.Sheets.Style();
             //style.formatter = MainTreeCol.getNumberFormatter(decimalObj.bills.totalPrice, true);
             sheet.setStyle(-1, 1, style);
-            for(let col = 0, cLen = cols.length; col < cLen; col++){
+            for (let col = 0, cLen = cols.length; col < cLen; col++) {
                 sheet.getRange(-1, col, -1, 1).hAlign(GC.Spread.Sheets.HorizontalAlign[cols[col]['hAlign']]);
                 sheet.getRange(-1, col, -1, 1).vAlign(GC.Spread.Sheets.VerticalAlign[cols[col]['vAlign']]);
-                for(let row = 0, rLen = datas.length; row < rLen; row++){
+                for (let row = 0, rLen = datas.length; row < rLen; row++) {
                     sheet.setValue(row, col, datas[row][cols[col]['dataCode']]);
                 }
             }
@@ -114,17 +114,17 @@ let calcBaseView = {
 
     onCellDoubleClick: function (sender, args) {
         let me = calcBaseView;
-        if(args.col === 0){
+        if (args.col === 0) {
             let v = args.sheet.getValue(args.row, args.col);
-            if(!me.isDef(v)){
+            if (!me.isDef(v)) {
                 return;
             }
             let baseFigure = '';
-            if(me.curType == me.type.bills)
+            if (me.curType == me.type.bills)
                 baseFigure = `{${v}}`
             else if (me.curType == me.type.ration)
                 baseFigure = `[${v}]`;
-            if(baseFigure.trim() !== ''){
+            if (baseFigure.trim() !== '') {
                 //在光标后面插入
                 let insertStr = me.insertStr(baseFigure);
                 me.inputExpr.val(insertStr);
@@ -138,16 +138,16 @@ let calcBaseView = {
     },
     //processMouseDown触发时间比SelectionChanged早,所以直接取selected是上一个节点的,需要传row取当前选中节点
     ifEdit: function (type, row) {
-        if (type == 'ration'){
+        if (type == 'ration') {
             return true;
-        } else{
+        } else {
             let selected = projectObj.project.mainTree.items[row];
-            return selected && MainTreeCol.readOnly.forCalcBase(selected)?false:true;
+            return selected && MainTreeCol.readOnly.forCalcBase(selected) ? false : true;
         }
     },
     bindClassBtn: function () {
         let me = this;
-        for(let clas in me.billsCBClass){
+        for (let clas in me.billsCBClass) {
             let jqS = `#cb_${clas}`;
             $(jqS).click(function () {
                 sheetCommonObj.cleanData(me.workBook.getSheet(0), me.setting, -1);
@@ -158,28 +158,40 @@ let calcBaseView = {
         }
     },
     //计算基数转换为显示数据Obj to Array, 给清单基数分类赋值
+    /*     toViewData: function (obj) {
+            let rst = [];
+            for(let figure in obj){
+                let figureObj = Object.create(null);
+                figureObj.base = figure;
+                figureObj.price = projectObj.project.calcBase.getBase(figure);
+                rst.push(figureObj);
+                //set class datas
+                this.billsCBClass.ALL.push(figureObj);
+                this.billsCBClass[obj[figure]['class']].push(figureObj);
+            }
+            return this.billsCBClass.ALL;
+        }, */
     toViewData: function (obj) {
         let rst = [];
-        for(let figure in obj){
+        for (let figure in obj) {
             let figureObj = Object.create(null);
             figureObj.base = figure;
             figureObj.price = projectObj.project.calcBase.getBase(figure);
             rst.push(figureObj);
             //set class datas
             this.billsCBClass.ALL.push(figureObj);
-            this.billsCBClass[obj[figure]['class']].push(figureObj);
         }
         return this.billsCBClass.ALL;
     },
 
-    initCalctor: function (type,field) {//type = bills、ration
+    initCalctor: function (type, field) {//type = bills、ration
         let me = calcBaseView;
         let showDatas;
         me.inputExpr = $('#calcBaseExp');
         me.curType = type;
         if (type === me.type.bills) {
             //锁定的清单不显示
-            if(field && MainTreeCol.lockBillChecking(projectObj.project.mainTree.selected,field)){
+            if (field && MainTreeCol.lockBillChecking(projectObj.project.mainTree.selected, field)) {
                 return;
             }
             //显示清单基数分类
@@ -196,8 +208,25 @@ let calcBaseView = {
             showDatas = me.toViewData(baseObj);
             $('#cbClassList li .btn ').removeClass('btn btn-outline-secondary btn-sm active');
             $('#cb_ALL').addClass('btn btn-outline-secondary btn-sm active');
-        }
-        else if (type == me.type.ration) {
+        } else if (type === 'budget') {
+            try {
+                //去除清单基数分类
+                $('#cbClassList').hide();
+                $('#cbRowDiv').removeClass('row');
+                $('#billsBaseSpread').removeClass('col-9');
+                const node = budgetSummaryObj.getTree().selected;
+                //输入框显示原本的
+                if (me.isDef(node.data.calcBase)) {
+                    me.inputExpr.val(cbParser.toFExpr(node.data.calcBase));
+                }
+                let baseObj = projectObj.project.calcBase.getBudgetBaseByClass(node);
+                showDatas = me.toViewData(baseObj);
+                $('#cbClassList li .btn ').removeClass('btn btn-outline-secondary btn-sm active');
+                $('#cb_ALL').addClass('btn btn-outline-secondary btn-sm active');
+            } catch (err) {
+                alert(err);
+            }
+        } else if (type == me.type.ration) {
             //去除清单基数分类
             $('#cbClassList').hide();
             //$('#qd-jsjs .modal-content').css('width', '');
@@ -206,7 +235,7 @@ let calcBaseView = {
             let calcItem = calcProgramManage.getSelectionInfo().calcItem;
             if (calcItem.dispExprUser) {
                 me.inputExpr.val(calcItem.dispExpr);
-                if (calcItem.dispExpr == '0'){
+                if (calcItem.dispExpr == '0') {
                     me.inputExpr.focus();
                     me.inputExpr.select();
                 }
@@ -215,7 +244,7 @@ let calcBaseView = {
             // bnArr.sort();
             let baseArr = [];
             for (let bn of bnArr) {
-                baseArr.push({base: bn})
+                baseArr.push({ base: bn })
             };
             showDatas = baseArr;
         }
@@ -244,7 +273,7 @@ let calcBaseView = {
     //运算符点击显示到运算窗口
     clickOpr: function (operators) {
         let me = calcBaseView;
-        for(let i = 0, len = operators.length; i < len; i++){
+        for (let i = 0, len = operators.length; i < len; i++) {
             operators[i].bind('click', function () {
                 let v = $(this)[0].textContent;
                 let insertStr = me.insertStr(v);
@@ -272,9 +301,9 @@ let calcBaseView = {
     //输入窗口控制
     inputControl: function () {
         let me = calcBaseView;
-        me.inputExpr.on('input',function () {
-            if(!me.arithmeticLegal(me.inputExpr.val())){
-                if(me.preInputExpr){
+        me.inputExpr.on('input', function () {
+            if (!me.arithmeticLegal(me.inputExpr.val())) {
+                if (me.preInputExpr) {
                     me.inputExpr.val(me.preInputExpr);
                 }
             }
@@ -288,15 +317,15 @@ let calcBaseView = {
         me.confirmBtn.bind('click', function () {
             //通过什么触发:计算基数、综合合价
             let toggle = me.confirmBtn.attr('toggle');
-            if(!toggle || toggle !== 'calcBase'){
+            if (!toggle || toggle !== 'calcBase') {
                 return;
             }
             debugger;
             //bills
-            if(me.curType === me.type.bills){
+            if (me.curType === me.type.bills) {
                 let selected = projectObj.project.mainTree.selected;
-                projectObj.updateCellValue(selected, me.getInputExpr(), {data: {field: 'calcBase'}});
-                if(projectObj.project.calcBase.success || selected.data.calcBase === me.getInputExpr()){
+                projectObj.updateCellValue(selected, me.getInputExpr(), { data: { field: 'calcBase' } });
+                if (projectObj.project.calcBase.success || selected.data.calcBase === me.getInputExpr()) {
                     //$('#qd-jsjs').modal('hide');
                     $('#calcBaseFeeRate').modal('hide');
                 }
@@ -309,8 +338,8 @@ let calcBaseView = {
                 let template = calcProgramManage.getSelectionInfo().template;
                 let calcItem = calcProgramManage.getSelectionInfo().calcItem;
 
-                if (calcItem.dispExpr != expr){
-                    if (analyzer.isLegal(expr, calcItem.ID, template)){
+                if (calcItem.dispExpr != expr) {
+                    if (analyzer.isLegal(expr, calcItem.ID, template)) {
                         let cp = projectObj.project.calcProgram;
                         let lc = analyzer.calcItemLabourCoe(calcItem);
                         calcItem.dispExpr = expr;
@@ -325,7 +354,7 @@ let calcBaseView = {
                             'calcItem': calcItem
                         };
                         calcProgramManage.saveCalcItem(data, function (rst) {
-                            if (rst){
+                            if (rst) {
                                 cp.compileTemplate(template);
                                 let relationNodes = calcTools.getNodesByProgramID(template.ID);
                                 cp.calcNodesAndSave(relationNodes);
@@ -336,21 +365,21 @@ let calcBaseView = {
                             }
                         });
                     }
-                    else{
+                    else {
                         $('#errorInfo').html(analyzer.error);
                     };
                 }
-                else{
+                else {
                     //$('#qd-jsjs').modal('hide');
                     $('#calcBaseFeeRate').modal('hide');
                 }
             }
         });
     },
-    onCalcBaseButtonClick:function (hitinfo,type='bills') {
+    onCalcBaseButtonClick: function (hitinfo, type = 'bills') {
         let me = calcBaseView;
         hitinfo.sheet.setActiveCell(hitinfo.row, hitinfo.col);
-        if(hitinfo.sheet.getParent() === projectObj.mainSpread){
+        if (hitinfo.sheet.getParent() === projectObj.mainSpread) {
             let node = projectObj.project.mainTree.items[hitinfo.row] ? projectObj.project.mainTree.items[hitinfo.row] : null;
             projectObj.mainController.setTreeSelected(node);
         }
@@ -358,17 +387,17 @@ let calcBaseView = {
         changeCalcBaseFeeRate('calcBase');
         $('#tabCalcBase').tab('show');
         let field = projectObj.mainController.setting.cols[hitinfo.col].data.field;
-        calcBaseView.initCalctor(type,field);
+        calcBaseView.initCalctor(type, field);
     }
 };
 
 $(document).ready(function () {
- /*   $('#qd-jsjs').on('shown.bs.modal', function () {
-        calcBaseView.workBook.refresh();
-    });*/
+    /*   $('#qd-jsjs').on('shown.bs.modal', function () {
+           calcBaseView.workBook.refresh();
+       });*/
     $('#calcBaseFeeRate').on('shown.bs.modal', function () {
         let toggle = calcBaseView.confirmBtn.attr('toggle');
-        if(toggle === 'calcBase'){
+        if (toggle === 'calcBase') {
             $('#tabCalcBase').tab('show');
         }
         sheetCommonObj.refreshWorkbookDelDefer(calcBaseView.workBook, 100);
@@ -395,12 +424,12 @@ $(document).ready(function () {
         $('#errorInfo').text('');
         //清空输入框
         calcBaseView.inputExpr.val('');
-        if(calcBaseView.workBook){
+        if (calcBaseView.workBook) {
             calcBaseView.workBook.destroy();
             calcBaseView.workBook = null;
         }
         //清空清单分类数据
-        for(let attr in calcBaseView.billsCBClass){
+        for (let attr in calcBaseView.billsCBClass) {
             calcBaseView.billsCBClass[attr] = [];
         }
     });