浏览代码

Merge branch '1.0.0_online' of http://smartcost.f3322.net:3000/SmartCost/ConstructionCost into 1.0.0_online

# Conflicts:
#	web/building_saas/main/js/views/project_view.js
zhongzewei 6 年之前
父节点
当前提交
425126184e
共有 34 个文件被更改,包括 719 次插入54 次删除
  1. 1 0
      config/gulpConfig.js
  2. 6 1
      modules/all_models/bills.js
  3. 25 0
      modules/all_models/engineering_lib.js
  4. 4 0
      modules/all_models/project_glj.js
  5. 5 0
      modules/all_models/stdBills_bills.js
  6. 25 0
      modules/all_models/std_economic_lib.js
  7. 25 0
      modules/all_models/std_engineer_feature_lib.js
  8. 25 0
      modules/all_models/std_engineer_info_lib.js
  9. 4 0
      modules/all_models/std_glj.js
  10. 25 0
      modules/all_models/std_main_quantity_lib.js
  11. 25 0
      modules/all_models/std_material_lib.js
  12. 1 0
      modules/glj/models/glj_list_model.js
  13. 16 0
      modules/main/controllers/project_controller.js
  14. 47 1
      modules/main/facade/project_facade.js
  15. 9 3
      modules/main/models/bills.js
  16. 7 3
      modules/main/models/ration.js
  17. 1 0
      modules/main/routes/project_route.js
  18. 6 2
      modules/pm/models/project_model.js
  19. 2 2
      public/gljUtil.js
  20. 4 4
      public/web/gljUtil.js
  21. 112 4
      public/web/sheet/sheet_common.js
  22. 11 1
      web/building_saas/css/main.css
  23. 3 3
      web/building_saas/glj/html/project_glj.html
  24. 10 2
      web/building_saas/js/global.js
  25. 28 0
      web/building_saas/main/html/index_info.html
  26. 7 2
      web/building_saas/main/html/main.html
  27. 128 8
      web/building_saas/main/js/models/exportSEIInterface.js
  28. 2 4
      web/building_saas/main/js/models/project_glj.js
  29. 1 1
      web/building_saas/main/js/views/fee_rate_view.js
  30. 136 0
      web/building_saas/main/js/views/index_view.js
  31. 3 8
      web/building_saas/main/js/views/material_adjust_view.js
  32. 4 3
      web/building_saas/main/js/views/project_glj_view.js
  33. 3 2
      web/building_saas/main/js/views/project_view.js
  34. 8 0
      web/building_saas/pm/js/pm_newMain.js

+ 1 - 0
config/gulpConfig.js

@@ -146,6 +146,7 @@ module.exports = {
         'web/building_saas/main/js/views/zlfb_view.js',
         'web/building_saas/main/js/views/installation_fee_view.js',
         'web/building_saas/main/js/views/material_adjust_view.js',
+        'web/building_saas/main/js/views/index_view.js.js',
         'web/building_saas/main/js/views/project_glj_view.js',
         'web/building_saas/main/js/views/importBills.js',
         'public/web/rpt_tpl_def.js',

+ 6 - 1
modules/all_models/bills.js

@@ -70,7 +70,12 @@ let billsSchema = new Schema({
     remark:String,
     engineeringContent:String,//工程内容
     serviceContent:String,//服务内容
-    claimVisa:String//签证及索赔依据
+    claimVisa:String,//签证及索赔依据
+    //经济指标属性
+    economicType:String,//工程经济指标类别
+    quantityIndexType:String,//工程量指标类别
+    quantityIndexUnit:String,//工程量指标单位
+    quantityIndexCoe:Number//单位转换系数
 });
 
 mongoose.model("bills", billsSchema);

+ 25 - 0
modules/all_models/engineering_lib.js

@@ -62,6 +62,30 @@ let modelSchema = {
         type: Schema.Types.Mixed,
         default: []
     },
+    engineer_info_lib: {
+        type: Schema.Types.Mixed,
+        default: []
+    },
+    //工程特征指标库
+    engineer_feature_lib: {
+        type: Schema.Types.Mixed,
+        default: []
+    },
+    //主要工料指标库
+    material_lib: {
+        type: Schema.Types.Mixed,
+        default: []
+    },
+    //主要工程量指标库
+    main_quantity_lib: {
+        type: Schema.Types.Mixed,
+        default: []
+    },
+    //主要经济指标库
+    economic_lib: {
+        type: Schema.Types.Mixed,
+        default: []
+    },
     //设置人材机显示列
     glj_col:{
         showAdjustPrice:Boolean//是否显示调整价列
@@ -78,6 +102,7 @@ let modelSchema = {
     engineering:Number,
     //是否计算安装增加费
     isInstall:{type: Boolean, default: false},
+    indexName:String,//指标专业名称
     seq:Number//序列号
 };
 mongoose.model(collectionName, new Schema(modelSchema, {versionKey: false, collection: collectionName}));

+ 4 - 0
modules/all_models/project_glj.js

@@ -106,6 +106,10 @@ let modelSchema = {
     connect_code: String,
     materialType: Number,//三材类别
     materialCoe: Number,//三材系数
+    //经济指标数据
+    materialIndexType:String,//工料指标类别
+    materialIndexUnit:String,//工料指标单位
+    materialIndexCoe:Number,//单位转换系数
     // 是否主要材料 (0为否 1为是)
     is_main_material: {
         type: Number,

+ 5 - 0
modules/all_models/stdBills_bills.js

@@ -19,6 +19,11 @@ const stdBills_bills = new Schema({
             items: [],
             recharge:String,
             billsLibId: {type:Number, index: true},
+            //经济指标属性
+            economicType:String,//工程经济指标类别
+            quantityIndexType:String,//工程量指标类别
+            quantityIndexUnit:String,//工程量指标单位
+            quantityIndexCoe:Number,//单位转换系数
             deleted: Boolean
     },
     {versionKey: false}

+ 25 - 0
modules/all_models/std_economic_lib.js

@@ -0,0 +1,25 @@
+'use strict';
+
+/**
+ *
+ *
+ * @author Zhong
+ * @date 2019/3/5
+ * @version
+ */
+//主要工程量指标库
+const mongoose = require('mongoose');
+const Schema = mongoose.Schema;
+const oprSchema = require('../all_schemas/opr_schema');
+const economicLib = new Schema({
+    ID: {type: String, index: true},
+    name: String,
+    creator: String,
+    createDate: Number,
+    recentOpr: [oprSchema],
+    index: {
+        type: Schema.Types.Mixed,
+        default: []
+    }
+}, {versionKey: false});
+mongoose.model('std_economic_lib', economicLib, 'std_economic_lib');

+ 25 - 0
modules/all_models/std_engineer_feature_lib.js

@@ -0,0 +1,25 @@
+'use strict';
+
+/**
+ *
+ *
+ * @author Zhong
+ * @date 2019/3/5
+ * @version
+ */
+//建设项目基本信息库
+const mongoose = require('mongoose');
+const Schema = mongoose.Schema;
+const oprSchema = require('../all_schemas/opr_schema');
+const engineerFeatureLib = new Schema({
+    ID: {type: String, index: true},
+    name: String,
+    creator: String,
+    createDate: Number,
+    recentOpr: [oprSchema],
+    features: {
+        type: Schema.Types.Mixed,
+        default: []
+    }
+}, {versionKey: false});
+mongoose.model('std_engineer_feature_lib', engineerFeatureLib, 'std_engineer_feature_lib');

+ 25 - 0
modules/all_models/std_engineer_info_lib.js

@@ -0,0 +1,25 @@
+'use strict';
+
+/**
+ *
+ *
+ * @author Zhong
+ * @date 2019/3/5
+ * @version
+ */
+//建设工程信息指标库
+const mongoose = require('mongoose');
+const Schema = mongoose.Schema;
+const oprSchema = require('../all_schemas/opr_schema');
+const engineerInfoLib = new Schema({
+    ID: {type: String, index: true},
+    name: String,
+    creator: String,
+    createDate: Number,
+    recentOpr: [oprSchema],
+    info: {
+        type: Schema.Types.Mixed,
+        default: []
+    }
+}, {versionKey: false});
+mongoose.model('std_engineer_info_lib', engineerInfoLib, 'std_engineer_info_lib');

+ 4 - 0
modules/all_models/std_glj.js

@@ -38,6 +38,10 @@ const std_glj = new Schema({
     adjCoe: Number,
     materialType: Number,   //三材类别
     materialCoe: Number,    //三材系数
+    //经济指标数据
+    materialIndexType:String,//工料指标类别
+    materialIndexUnit:String,//工料指标单位
+    materialIndexCoe:Number,//单位转换系数
     component: [std_gljComponent]
 },{versionKey: false});
 

+ 25 - 0
modules/all_models/std_main_quantity_lib.js

@@ -0,0 +1,25 @@
+'use strict';
+
+/**
+ *
+ *
+ * @author Zhong
+ * @date 2019/3/5
+ * @version
+ */
+//主要工程量指标库
+const mongoose = require('mongoose');
+const Schema = mongoose.Schema;
+const oprSchema = require('../all_schemas/opr_schema');
+const quantityLib = new Schema({
+    ID: {type: String, index: true},
+    name: String,
+    creator: String,
+    createDate: Number,
+    recentOpr: [oprSchema],
+    index: {
+        type: Schema.Types.Mixed,
+        default: []
+    }
+}, {versionKey: false});
+mongoose.model('std_main_quantity_lib', quantityLib, 'std_main_quantity_lib');

+ 25 - 0
modules/all_models/std_material_lib.js

@@ -0,0 +1,25 @@
+'use strict';
+
+/**
+ *
+ *
+ * @author Zhong
+ * @date 2019/3/5
+ * @version
+ */
+//建设项目基本信息库
+const mongoose = require('mongoose');
+const Schema = mongoose.Schema;
+const oprSchema = require('../all_schemas/opr_schema');
+const materialLib = new Schema({
+    ID: {type: String, index: true},
+    name: String,
+    creator: String,
+    createDate: Number,
+    recentOpr: [oprSchema],
+    materials: {
+        type: Schema.Types.Mixed,
+        default: []
+    }
+}, {versionKey: false});
+mongoose.model('std_material_lib', materialLib, 'std_material_lib');

+ 1 - 0
modules/glj/models/glj_list_model.js

@@ -84,6 +84,7 @@ class GLJListModel extends BaseModel {
         let mixRationMap={};
         let keyMap={};
         let unitPriceList={};
+        unitPriceFileId = unitPriceFileId?unitPriceFileId:await ProjectModel.getUnitPriceFileId(projectId);
         try {
             // 首先获取对应标段下所有的项目工料机数据
             let condition = {project_id: projectId};

+ 16 - 0
modules/main/controllers/project_controller.js

@@ -167,5 +167,21 @@ module.exports = {
             result.message = err.message;
         }
         res.json(result);
+    },
+    loadSEIProjectData:async function(req,res){
+        let data = JSON.parse(req.body.data);
+        let result={
+            error: 0,
+            data: null
+        };
+        try{
+            result.data = await project_facade.loadSEIProjectData(data.projectID);
+        }
+        catch(err){
+            logger.err(err);
+            result.error=1;
+            result.message = err.message;
+        }
+        res.json(result);
     }
 };

+ 47 - 1
modules/main/facade/project_facade.js

@@ -10,7 +10,9 @@ module.exports = {
     saveProperty: saveProperty,
     getDefaultColSetting: getDefaultColSetting,
     markProjectsToChange:markProjectsToChange,
-    getSEIProjects:getSEIProjects
+    getSEIProjects:getSEIProjects,
+    loadSEIProjectData:loadSEIProjectData,
+    setSEILibData:setSEILibData
 };
 
 let mongoose = require('mongoose');
@@ -29,6 +31,12 @@ let ration_glj_facade = require("../../ration_glj/facade/ration_glj_facade");
 const uuidV1 = require('uuid/v1');
 const gljUtil = require('../../../public/gljUtil');
 let stdColSettingModel = mongoose.model('std_main_col_lib');
+import GLJListModel from "../../glj/models/glj_list_model";
+let economicLib = mongoose.model('std_economic_lib');
+let engineerFeatureLib = mongoose.model('std_engineer_feature_lib');
+let engineerInfoLib = mongoose.model('std_engineer_info_lib');
+let mainQuantityLib = mongoose.model('std_main_quantity_lib');
+let materialLib = mongoose.model('std_material_lib');
 
 
 
@@ -335,4 +343,42 @@ async  function getSEIProjects(projectID) {
     engineers = sortChildren(engineers);
     project._doc.children = engineers;
     return project;
+}
+
+async function loadSEIProjectData(projectID) {
+    let gljListModel = new GLJListModel();
+    let [gljList, mixRatioConnectData,mixRatioMap,unitPriceMap] = await gljListModel.getListByProjectId(projectID);
+    let rations = await ration_model.getDataSync(projectID);
+    let bills = await bill_model.getDataSync(projectID);
+    let ration_gljs = await  ration_glj_model.find({projectID:projectID});
+    let projectGLJs = {
+        gljList : gljList,
+        mixRatioConnectData:mixRatioConnectData,
+        mixRatioMap:mixRatioMap,
+        unitPriceMap:unitPriceMap
+    };
+    return{bills:bills,rations:rations,ration_gljs:ration_gljs,projectGLJs:projectGLJs}
+}
+
+async function setSEILibData(property){
+    if(property.engineerInfoLibID){//工程信息指标
+        let engineerInfo = await engineerInfoLib.findOne({'ID':property.engineerInfoLibID});
+        if(engineerInfo) property.engineerInfos = engineerInfo.info;
+    }
+    if(property.engineerFeatureLibID){//工程特征指标
+        let engineerFeature = await engineerFeatureLib.findOne({'ID':property.engineerFeatureLibID});
+        if(engineerFeature) property.engineerFeatures = engineerFeature.features;
+    }
+    if(property.materialLibID){//主要工料指标
+        let material = await materialLib.findOne({'ID':property.materialLibID});
+        if(material) property.materials = material.materials;
+    }
+    if(property.mainQuantityLibID){//主要工程量指标
+        let mainQuantity = await mainQuantityLib.findOne({'ID':property.mainQuantityLibID});
+        if(mainQuantity) property.mainQuantities = mainQuantity.index;
+    }
+    if(property.economicLibID){//主要工程量指标
+        let economic = await economicLib.findOne({'ID':property.economicLibID});
+        if(economic) property.economics = economic.index;
+    }
 }

+ 9 - 3
modules/main/models/bills.js

@@ -27,13 +27,16 @@ const billType ={
     BX:5//补项
 };
 
+
 class billsModel extends baseModel {
     constructor () {
         super(bills);
     };
-
-    getData (projectID, callback) {
-        this.model.find({'$or': [{projectID: projectID, deleteInfo: null}, {projectID: projectID, 'deleteInfo.deleted': {$in: [null, false]}}]}, '-_id', function(err, datas){
+    getQuery(projectID){
+        return {'$or': [{projectID: projectID, deleteInfo: null}, {projectID: projectID, 'deleteInfo.deleted': {$in: [null, false]}}]}
+    }
+     getData (projectID, callback) {
+        this.model.find(this.getQuery(projectID), '-_id', function(err, datas){
             if (!err) {
                 callback(0, projectConsts.BILLS, datas);
             } else {
@@ -41,6 +44,9 @@ class billsModel extends baseModel {
             };
         });
     };
+    async getDataSync(projectID){
+        return await this.model.find(this.getQuery(projectID),'-_id');
+    }
 
     save (user_id, datas, callback) {
         let functions = [];

+ 7 - 3
modules/main/models/ration.js

@@ -16,9 +16,11 @@ class rationModel extends baseModel {
     constructor () {
         super(ration);
     }
-
+    getQuery(projectID){
+        return {'$or': [{projectID: projectID, deleteInfo: null}, {projectID: projectID, 'deleteInfo.deleted': {$in: [null, false]}}]}
+    }
     getData (projectID, callback) {
-        ration.find({'$or': [{projectID: projectID, deleteInfo: null}, {projectID: projectID, 'deleteInfo.deleted': {$in: [null, false]}}]}, '-_id', function(err, datas){
+        ration.find(this.getQuery(projectID), '-_id', function(err, datas){
             if (!err) {
                 callback(0, projectConsts.RATION, datas);
             } else {
@@ -26,7 +28,9 @@ class rationModel extends baseModel {
             }
         });
     };
-
+    async getDataSync(projectID){
+        return await  ration.find(this.getQuery(projectID), '-_id');
+    }
     save (user_id, datas, callback) {
         let functions = [];
         let data;

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

@@ -16,6 +16,7 @@ module.exports = function (app) {
     projectRouter.post('/saveProperty', projectController.saveProperty);
     projectRouter.post('/getDefaultColSetting', projectController.getDefaultColSetting);
     projectRouter.post('/getSEIProjects', projectController.getSEIProjects);
+    projectRouter.post('/loadSEIProjectData', projectController.loadSEIProjectData);
     app.use('/project',projectRouter);
 };
 

+ 6 - 2
modules/pm/models/project_model.js

@@ -42,6 +42,8 @@ let feeRateFacade = require('../../fee_rates/facade/fee_rates_facade');
 let labourCoeFacade = require('../../main/facade/labour_coe_facade');
 let calcProgramFacade = require('../../main/facade/calc_program_facade');
 let installationFacade = require('../../main/facade/installation_facade');
+let projectFacade = require('../../main/facade/project_facade');
+
 let pmFacade = require('../facade/pm_facade');
 let logger = require("../../../logs/log_helper").logger;
 let BillsModel = require("../../main/models/bills").model;
@@ -183,7 +185,9 @@ ProjectsDAO.prototype.updateUserProjects = async function (userId, compilationId
                     data.updateData.property.lockBills = false;
                     //工料机单价调整系数
                     data.updateData.property.tenderSetting = tenderSetting;
-                } else if (data.updateData.projType === projectType.project) {
+                     //添加重庆经济指标数据
+                    await projectFacade.setSEILibData(data.updateData.property);
+                }else if (data.updateData.projType === projectType.project) {
                     //更新基本信息
                     data.updateData.property.basicInformation.forEach(function (pData) {
                         pData.items.forEach(function (item) {
@@ -196,7 +200,7 @@ ProjectsDAO.prototype.updateUserProjects = async function (userId, compilationId
                             }
                         });
                     });
-                }
+                }                
                 newProject = new Projects(data.updateData);
 
                 if (data.updateData.projType === 'Tender') {

+ 2 - 2
public/gljUtil.js

@@ -28,8 +28,8 @@ function getGLJPrice(glj,projectGLJDatas,calcOptions,labourCoeDatas,decimalObj,i
     return gljNodeUtil.getGLJPrice(glj,projectGLJDatas,calcOptions,labourCoeDatas,decimalObj,isRadio,_,scMathUtil);
 }
 
-function getMarketPrice(glj,projectGLJDatas,calcOptions,labourCoeDatas,decimalObj,isRadio=false) {
-    return gljNodeUtil.getMarketPrice(glj,projectGLJDatas,calcOptions,labourCoeDatas,decimalObj,isRadio,_,scMathUtil);
+function getMarketPrice(glj,projectGLJDatas,calcOptions,decimalObj,isRadio=false) {
+    return gljNodeUtil.getMarketPrice(glj,projectGLJDatas,calcOptions,decimalObj,isRadio,_,scMathUtil);
 }
 
 function getBasePrice(glj,projectGLJDatas,calcOptions,labourCoeDatas,decimalObj,isRadio=false) {

+ 4 - 4
public/web/gljUtil.js

@@ -166,7 +166,7 @@ let gljUtil = {
     },
     getGLJPrice:function (glj,projectGLJDatas,calcOptions,labourCoeDatas,decimalObj,isRadio,_,scMathUtil) {
         let result = {};
-        result.marketPrice = this.getMarketPrice(glj,projectGLJDatas,calcOptions,labourCoeDatas,decimalObj,isRadio,_,scMathUtil);
+        result.marketPrice = this.getMarketPrice(glj,projectGLJDatas,calcOptions,decimalObj,isRadio,_,scMathUtil);
         if(this.calcPriceDiff(glj,calcOptions)==true){//计取价差
             result.basePrice = this.getBasePrice(glj,projectGLJDatas,calcOptions,labourCoeDatas,decimalObj,isRadio,_,scMathUtil);
             result.adjustPrice = this.getAdjustPrice(glj,projectGLJDatas,calcOptions,labourCoeDatas,decimalObj,isRadio,_,scMathUtil);
@@ -176,7 +176,7 @@ let gljUtil = {
         }
         return result;
     },
-    getMarketPrice:function (glj,projectGLJDatas,calcOptions,labourCoeDatas,decimalObj,isRadio,_,scMathUtil,tenderCoe) {
+    getMarketPrice:function (glj,projectGLJDatas,calcOptions,decimalObj,isRadio,_,scMathUtil,tenderCoe) {
         let price_decimal = decimalObj.glj.unitPrice;
         let price_hasM_decimal = decimalObj.glj.unitPriceHasMix?decimalObj.glj.unitPriceHasMix:decimalObj.glj.unitPrice;
         let quantity_decimal = decimalObj.glj.quantity;
@@ -193,8 +193,8 @@ let gljUtil = {
                     'unit': ratio.unit
                 });
                 if(tem){
-                    let priceData=this.getGLJPrice(tem,projectGLJDatas,calcOptions,labourCoeDatas,decimalObj,true,_,scMathUtil);
-                    let temP = scMathUtil.roundForObj(priceData.marketPrice* priceCoe * scMathUtil.roundForObj(ratio.consumption,quantity_decimal),process_decimal);
+                    let tem_marketPrice = this.getMarketPrice(tem,projectGLJDatas,calcOptions,decimalObj,true,_,scMathUtil);  //let priceData=this.getGLJPrice(tem,projectGLJDatas,calcOptions,labourCoeDatas,decimalObj,true,_,scMathUtil);
+                    let temP = scMathUtil.roundForObj(tem_marketPrice * priceCoe * scMathUtil.roundForObj(ratio.consumption,quantity_decimal),process_decimal);
                     p = scMathUtil.roundForObj(temP + p,process_decimal);
                 }
             }

+ 112 - 4
public/web/sheet/sheet_common.js

@@ -109,6 +109,59 @@ var sheetCommonObj = {
             area.vAlign(GC.Spread.Sheets.VerticalAlign.center);
         }
     },
+    showTreeData:function (sheet,setting,data) {
+        let ch = GC.Spread.Sheets.SheetArea.viewport;
+        let parentMap=_.groupBy(data, 'ParentID');
+        let visibleMap = {};
+        sheet.suspendPaint();
+        sheet.suspendEvent();
+        for (let col = 0; col < setting.header.length; col++) {
+            let hAlign = "left", vAlign = "center";
+            if (setting.header[col].hAlign) {
+                hAlign = setting.header[col].hAlign;
+            } else if (setting.header[col].dataType !== "String"){
+                hAlign = "right";
+            }
+            vAlign = setting.header[col].vAlign?setting.header[col].vAlign:vAlign;
+            sheetCommonObj.setAreaAlign(sheet.getRange(-1, col, -1, 1), hAlign, vAlign);
+            if (setting.header[col].formatter) {
+                sheet.setFormatter(-1, col, setting.header[col].formatter, GC.Spread.Sheets.SheetArea.viewport);
+            }
+            for (let row = 0; row < data.length; row++) {
+                let val = data[row][setting.header[col].dataCode];
+                if(val&&setting.header[col].dataType === "Number"){
+                    if(setting.header[col].hasOwnProperty('decimalField')){
+                        let decimal = getDecimal(setting.header[col].decimalField);
+                        val =scMathUtil.roundToString(val,decimal);
+                        sheet.setFormatter(-1, col,getFormatter(decimal), GC.Spread.Sheets.SheetArea.viewport);
+                    }else {
+                        val =scMathUtil.roundToString(val,2);
+                    }
+                }
+                sheet.setValue(row, col, val, ch);
+                if(col==0){
+                    let treeType = sheetCommonObj.getTreeNodeCellType(data,row,parentMap);
+                    sheet.getCell(row, 0).cellType(treeType);
+                    visibleMap[data[row].ID] = treeType.collapsed;
+                    this.setRowVisible(data,row,visibleMap,sheet);
+                }
+            }
+        }
+        this.lockCells(sheet,setting);
+        sheet.resumeEvent();
+        sheet.resumePaint();
+    },
+    setRowVisible:function (data,row,visibleMap,sheet) {
+        sheet.getRange(row , -1, 1, -1).visible(getVisible(data[row].ParentID));//显示或隐藏
+        function getVisible(ParentID) {
+            if(visibleMap[ParentID]) return false //如果父节点是缩起的,那就隐藏本身。
+            if(visibleMap[ParentID] == false){//如果父节点不是缩起的,要再往父节点找看
+                let pnode = _.find(data,{'ID':ParentID});
+                if(pnode) return getVisible(pnode.ParentID);//如果有父节点,递归调用
+                return true;//没有,返回显示
+            }
+        }
+    },
     showData: function(sheet, setting, data,distTypeTree,callback) {
         var me = this, ch = GC.Spread.Sheets.SheetArea.viewport;
         sheet.suspendPaint();
@@ -165,6 +218,14 @@ var sheetCommonObj = {
     },
     showRowData:function (sheet,setting,row,data,distTypeTree=null) {
         let ch = GC.Spread.Sheets.SheetArea.viewport;
+        if(data[row].cellType == "date"){//日期格式比较特殊,要判断数据里的属性,为data类型,同时读取列
+            this.setDatePickerCellType(row,data[row].dateCol,sheet)
+        }
+        if(data[row].cellType === 'comboBox'){//对于选项在数据里下拉框类型,同时读取列
+            let options = data[row].options ? data[row].options.split("@") : [];
+            this.setComboBox(row,data[row].dateCol,sheet,options);
+        }
+
         for (var col = 0; col < setting.header.length; col++) {
             //var cell = sheet.getCell(row, col, GC.Spread.Sheets.SheetArea.viewport);
             var val = data[row][setting.header[col].dataCode];
@@ -192,11 +253,9 @@ var sheetCommonObj = {
             if(setting.header[col].cellType === "replaceButton"){
                 this.setReplaceButton(row,col,sheet,setting.header[col]);
             }
-
             if(setting.header[col].cellType === "cusButton"){
                 this.setCusButton(row,col,sheet,setting);
             }
-
             if(setting.header[col].cellType === "tipsCell"){
                 this.setTipsCell(row,col,sheet,setting.header[col]);
             }
@@ -652,6 +711,55 @@ var sheetCommonObj = {
         cellType.buttonBackColor("#07A0FF");
         sheet.setCellType(row, col,cellType,GC.Spread.Sheets.SheetArea.viewport);
     },
+    setDatePickerCellType(row,col,sheet){
+        let ns = GC.Spread.Sheets;
+
+        function DatePickerCellType() {
+        }
+        DatePickerCellType.prototype = new GC.Spread.Sheets.CellTypes.Base();
+
+        DatePickerCellType.prototype.createEditorElement = function (context) {
+            //Create input presenter.
+            return document.createElement("input");
+        };
+        DatePickerCellType.prototype.activateEditor = function (editorContext, cellStyle, cellRect, context) {
+            //Initialize input editor.
+            if (editorContext) {
+                $editor = $(editorContext);
+                //DatePickerCellType.prototype.activateEditor.apply(this, arguments);
+                $editor.datepicker({dateFormat: 'yy-mm-dd'});
+                $editor.css("position", "absolute");
+                $editor.attr("gcUIElement", "gcEditingInput");
+                $(".ui-datepicker").attr("gcUIElement", "gcEditingInput");
+            }
+        }
+        DatePickerCellType.prototype.deactivateEditor = function (editorContext, context) {
+            //Remove input editor when end editor status.
+            if (editorContext) {
+                var element = editorContext;
+                $(element).datepicker("hide");
+                $(element).datepicker("destroy");
+            }
+            // DatePickerCellType.prototype.deactivateEditor.apply(this, arguments)
+        };
+        DatePickerCellType.prototype.setEditorValue = function (editor, value, context) {
+            //Sync value from Cell value to editor value.
+            $(editor).datepicker("setDate", value);
+        };
+        DatePickerCellType.prototype.getEditorValue = function (editor, context) {
+            //Sync value from editor value to cell value.
+            return $(editor).datepicker("getDate");
+        };
+        DatePickerCellType.prototype.updateEditor = function (editorContext, cellStyle, cellRect, context) {
+            if (editorContext) {
+                $editor = $(editorContext);
+                $editor.css("width", cellRect.width - 1);
+                $editor.css("height", cellRect.height - 3);
+            }
+        };
+        let picker = new DatePickerCellType();
+        sheet.getCell(row, col).cellType(picker).width(100).formatter('yyyy-mm-dd');
+    },
 
     setTipsCell(row,col,sheet,header){
         let TipCellType = function () {};
@@ -783,7 +891,7 @@ var sheetCommonObj = {
 
         function TreeNodeCellType() {
             this.collapsed = gljUtil.isDef(datas[row].collapsed)?datas[row].collapsed: true; //默认是折叠的
-            this. treeNodeType = true;
+            this.treeNodeType = true;
             this.rectInfo = {};
         }
         TreeNodeCellType.prototype = new ns.CellTypes.Text();
@@ -885,7 +993,7 @@ var sheetCommonObj = {
         return new TreeNodeCellType()
 
         function getTreeLevel(item,data) {
-            if(item.ParentID){
+            if(item.ParentID && item.ParentID!=-1){
                 let pitem =  _.find(data,{'ID':item.ParentID});
                 return  getTreeLevel(pitem,data) + 1;
             }else {

+ 11 - 1
web/building_saas/css/main.css

@@ -373,9 +373,19 @@ a{
         transform: translateX(10px);
     }
 }
+.gl-side.gl-side-lg{
+    width:200px;
+}
+.nav-side .nav-link{
+    padding:.5rem;
+}
+.nav-side .nav-link.active{
+    background:#ddd;
+    color:#333;
+}
 .gl-side{
     border-right:1px solid #ccc;
-    width:150px
+    width:120px
 }
 .bottom-content .tab-content .main-data-bottom{
     height: 300px;

+ 3 - 3
web/building_saas/glj/html/project_glj.html

@@ -17,9 +17,9 @@
 
 <div class="container-fluid">
     <div class="row">
-        <div class="gl-side  filterType" id='filterType'>
-            <ul class="nav flex-column nav-pills mt-2 mb-2">
-                <li class="nav-item"><a class="nav-link active" href="#" id="ALL">所有人材机</a></li>
+        <div class="gl-side  " id='filterType'>
+            <ul class="nav flex-column nav-side mt-2 mb-2" style="margin-top: 0px!important;">
+                <li class="nav-item" ><a class="nav-link active" href="#" id="ALL">所有人材机</a></li>
              <!--   <li class="nav-item li_sub"><a class="nav-link" href="javascript:void(0)" id="LABOUR">人工</a></li>
                 <li class="nav-item li_sub"><a class="nav-link" href="javascript:void(0)" id="GENERAL_MATERIAL">材料</a></li>
                 <li class="nav-item li_sub"><a class="nav-link" href="javascript:void(0)" id="GENERAL_MACHINE">机械</a></li>

+ 10 - 2
web/building_saas/js/global.js

@@ -1,7 +1,7 @@
 /*全局自适应高度*/
 function autoFlashHeight(){
     let headerHeight = $(".header").height();
-    let toolsbarHeight = $(".toolsbar").height();
+    let toolsbarHeight = getToolsbarHeight();
     let ftoolsbarHeight = $(".toolsbar-f").height();
     let btntoolsbarHeight = $(".btn-toolbar").height();
     // var feeRateToolsbarHeight = $(".toolsbar_feeRate").height();
@@ -19,6 +19,7 @@ function autoFlashHeight(){
     //$("#main .main-data-top").height($(window).height()-headerHeight-toolsbarHeight-bottomContentHeight-1);
     typeof(loadMainSize)== 'function' ?loadMainSize():'';//zhang 2018-06-04  统一加载高度方法
     typeof(loadProjectGljSize)== 'function'?loadProjectGljSize():'';
+    typeof(onResize)== 'function'?onResize():'';
     $(".main-data-full").height($(window).height()-headerHeight-toolsbarHeight-1);
     $(".main-data-full-fl").height($(window).height()-headerHeight-toolsbarHeight-37);
     $(".main-data-full-feeRate").height($(window).height()-headerHeight-78);
@@ -35,10 +36,17 @@ function autoFlashHeight(){
     typeof(adaptiveTzjnrWidth)== 'function' ?adaptiveTzjnrWidth():'';
     $('#project-glj-main').width($(window).width()-($('.main-nav').width()+ 2)-($('.filterType').width()+12)-5); //2、12是padding宽度,width 是不算padding宽度的
     $('#material_adjust').width($(window).width()-($('.main-nav').width()+ 2)-($('.filterType').width()+12)-5);//材料调差
+    $('#index_content').width($(window).width()-($('.main-nav').width()+ 2)-($('#index_nav').width()+12)-5);//材料调差
     //typeof zmhs_obj === 'object' ? zmhs_obj.loadSideResize() : '';
 };
 
-
+function getToolsbarHeight() {//动态获取toolsbar高度,由于页面有多个toolsbar高度,直接取取不到当前页的toolsbar
+    for(let t of $(".toolsbar")) {
+        let height = $(t).height();
+        if(height != -1) return height;
+    }
+    return 0;
+}
 
 /*全局自适应高度结束*/
 $(function () {

+ 28 - 0
web/building_saas/main/html/index_info.html

@@ -0,0 +1,28 @@
+<div >
+    <div class="toolsbar px-1 toolbar_index>">
+        <div class="form-inline py-1">
+            <label class="mx-2"><i class="fa fa-database mr-1" aria-hidden="true"></i>指标信息</label>
+        </div>
+    </div>
+    <div class="container-fluid">
+        <div class="row">
+            <div class="gl-side gl-side-lg" id="index_nav">
+                <ul class="nav flex-column nav-side mt-2 mb-2">
+                    <li class="nav-item"><a href="#" class="nav-link active">工程信息指标</a></li>
+                    <li class="nav-item"><a href="#" class="nav-link">工程特征指标</a></li>
+                    <li class="nav-item"><a href="#" class="nav-link">工程造价指标</a></li>
+                    <li class="nav-item"><a href="#" class="nav-link ">主要工料指标</a></li>
+                    <li class="nav-item"><a href="#" class="nav-link">主要经济指标</a></li>
+                    <li class="nav-item"><a href="#" class="nav-link">主要工程量指标</a></li>
+                    <li class="nav-item"><a href="#" class="nav-link">设置主要经济、工程量指标</a></li>
+                    <li class="nav-item"><a href="#" class="nav-link">设置主要工料指标</a></li>
+                </ul>
+            </div>
+            <div class="main-content col p-0" id="index_content">
+                <div class="main-data-full" id="indexSpread"><!--spread js-->
+
+                </div>
+            </div>
+        </div>
+    </div>
+</div>

+ 7 - 2
web/building_saas/main/html/main.html

@@ -74,6 +74,7 @@
                 <li class="nav-item"><a data-toggle="tab" href="#calc_program_manage" id="tab_calc_program_manage" role="tab" style="display:none">总计算程序</a></li>
                 <li class="nav-item"><a data-toggle="tab" href="#tender_price" id="tab_tender_price" role="tab">调价</a></li>
                 <li class="nav-item"><a data-toggle="tab" href="#reports" role="tab" id="tab_report" onclick="rptTplObj.iniPage();">报表</a></li>
+                <li class="nav-item"><a data-toggle="tab" href="#index" id="tab_index" role="tab" style="display:none">指标信息</a></li>
             </ul>
         </div>
         <div class="content">
@@ -130,6 +131,7 @@
                               <% } %>
                               <a id="switchTznr" href="javascript:void(0);"  class="dropdown-item"><i class="fa fa-eye" aria-hidden="true"></i> 显示特征</a>
                               <a id = "menu_calc_program_manage"  href="javascript:void(0);" class="dropdown-item"><i class="fa fa-calculator" aria-hidden="true"></i> 总计算程序</a>
+                              <a id = "menu_index_info"  href="javascript:void(0);" class="dropdown-item"><i class="fa fa-database" aria-hidden="true"></i> 指标信息</a>
                           </div>
                       </div>
                  <!--   <span class="btn btn-light btn-sm">
@@ -153,7 +155,7 @@
                       <% } %>
                       <a id="switchTznr" href="javascript:void(0);"  class="btn btn-light btn-sm"><i class="fa fa-eye" aria-hidden="true"></i> 显示特征</a>-->
                   </div>
-                 <!-- <a href="javascript:void(0)" class="btn btn-light btn-sm" onclick="exportSEI('<%= projectData.property.rootProjectID%>')">导出经济指标</a>-->
+                <!--  <a href="javascript:void(0)" class="btn btn-light btn-sm" onclick="exportSEI('<%= projectData.property.rootProjectID%>')">导出经济指标</a>-->
                   <div class="side-tabs">
                       <ul class="nav nav-tabs" role="tablist">
                          <!-- <li class="nav-item">
@@ -769,10 +771,12 @@
             <div class="tab-pane" id="reports" role="tabpanel">
                 <%include ../../report/html/rpt_main.html %>
             </div>
-
             <div class="tab-pane" id="fee_rates" role="tabpanel">
                 <%include ../../fee_rates/fee_rate.html %>
             </div>
+              <div class="tab-pane" id="index" role="tabpanel">
+                  <%include index_info.html %>
+              </div>
               <div class="tab-pane" id="tender_price" role="tabpanel">
                   <%include tender_price.html %>
               </div>
@@ -2212,6 +2216,7 @@
     <script type="text/javascript" src='/web/building_saas/main/js/views/zlfb_view.js'></script>
     <script type="text/javascript" src='/web/building_saas/main/js/views/installation_fee_view.js'></script>
     <script type="text/javascript" src='/web/building_saas/main/js/views/material_adjust_view.js'></script>
+    <script type="text/javascript" src='/web/building_saas/main/js/views/index_view.js'></script>
     <script type="text/javascript" src='/web/building_saas/main/js/views/project_glj_view.js'></script>
     <script type="text/javascript" src="/web/building_saas/main/js/views/importBills.js"></script>
     <!--报表-->

+ 128 - 8
web/building_saas/main/js/models/exportSEIInterface.js

@@ -9,7 +9,7 @@ async function exportSEI(projectID) {
     console.log(result);
     let project = getProject(result);
 
-    prepareTenderDatas(tenderProjects,project);
+    await prepareTenderDatas(tenderProjects,project);
 
 
 
@@ -67,15 +67,16 @@ async function exportSEI(projectID) {
             ],
             children:[],
             valuationType:source.property.valuationType,
-            taxType:source.property.taxType
+            taxType:source.property.taxType,
+            property:source.property
         };
         return tender;
     }
 
 
-    function prepareTenderDatas(tenders,project) {
+    async function prepareTenderDatas(tenders,project) {
         for(let t of tenders){
-            setTenderData(t,project);
+            await setTenderData(t,project);
         }
 
 
@@ -83,17 +84,136 @@ async function exportSEI(projectID) {
 
     }
 
+    async function setTenderData(tender,project) {
+        let projectData = await ajaxPost("/project/loadSEIProjectData",{projectID:tender.ID});
+        tender.children.push(setEngineerInfo(tender,project));//设置工程信息
+        tender.children.push(setEngineerIndex(tender,projectData));
+        tender.children.push(await setGLJSummy(tender,projectData));
+       //
+    }
+
+
+    function setEngineerIndex(tender,projectData) {//设置工程指标
+        let index = {
+            name:"工程指标",
+            attrs:[],
+            children:[],
+        };
+
+        index.children.push(setEngineerPriceIndex(tender,projectData));
+
+        return index;
+    }
 
+    function setEngineerPriceIndex(tender,projectData) {
+        let priceIndex = {
+            name:"工程造价指标",
+            attrs:[],
+            children:[],
+        };
+        let fixMap = {};
+        let buildingArea =  tender.property.projectFeature?getItemValueBykey(tender.property.projectFeature,"buildingArea"):1;//建筑面积
+        buildingArea = buildingArea && buildingArea !=""? parseFloat(buildingArea):1;
+        for(let b of projectData.bills){
+            if(b.flags && b.flags.length > 0){
+                let f = _.find(b.flags,{"fieldName":"fixed"})
+                if(f) fixMap[f.flag] = getTotalFee(b);
+            }
+        }
+        //计算其他组织措施费 = 施工组织措施项目下的子项,除了  安全文明施工费、建设工程竣工档案编制费以外的项
+        let CONSTRUCTION_ORGANIZATION = fixMap[fixedFlag.CONSTRUCTION_ORGANIZATION]?fixMap[fixedFlag.CONSTRUCTION_ORGANIZATION]:0;
+        let SAFETY_CONSTRUCTION =  fixMap[fixedFlag.SAFETY_CONSTRUCTION]?fixMap[fixedFlag.SAFETY_CONSTRUCTION]:0;
+        let PROJECT_COMPLETE_ARCH_FEE =  fixMap[fixedFlag.PROJECT_COMPLETE_ARCH_FEE]? fixMap[fixedFlag.PROJECT_COMPLETE_ARCH_FEE]:0;
+        let other_org_fee = CONSTRUCTION_ORGANIZATION - SAFETY_CONSTRUCTION - PROJECT_COMPLETE_ARCH_FEE;
+        other_org_fee = other_org_fee >0 ?other_org_fee:0;
+
+
+        let engineerCost = fixMap[fixedFlag.ENGINEERINGCOST]?fixMap[fixedFlag.ENGINEERINGCOST]:1;
+         priceIndex.children.push(getFlag("分部分项工程费",fixMap[fixedFlag.SUB_ENGINERRING],engineerCost,buildingArea));
+         priceIndex.children.push(getFlag("技术措施费",fixMap[fixedFlag.CONSTRUCTION_TECH],engineerCost,buildingArea));
+         priceIndex.children.push(getFlag("安全文明施工费",fixMap[fixedFlag.SAFETY_CONSTRUCTION],engineerCost,buildingArea));
+         priceIndex.children.push(getFlag("建设工程竣工档案编制费",fixMap[fixedFlag.PROJECT_COMPLETE_ARCH_FEE],engineerCost,buildingArea));
+         priceIndex.children.push(getFlag("其他组织措施费",other_org_fee,engineerCost,buildingArea));
+         priceIndex.children.push(getFlag("暂列金额",fixMap[fixedFlag.PROVISIONAL],engineerCost,buildingArea));
+         priceIndex.children.push(getFlag("专业工程暂估价",fixMap[fixedFlag.ENGINEERING_ESITIMATE],engineerCost,buildingArea));
+         priceIndex.children.push(getFlag("计日工",fixMap[fixedFlag.DAYWORK],engineerCost,buildingArea));
+         priceIndex.children.push(getFlag("总承包服务费",fixMap[fixedFlag.TURN_KEY_CONTRACT],engineerCost,buildingArea));
+         priceIndex.children.push(getFlag("索赔与现场签证",fixMap[fixedFlag.CLAIM_VISA],engineerCost,buildingArea));
+         priceIndex.children.push(getFlag("规费",fixMap[fixedFlag.CHARGE],engineerCost,buildingArea));
+         priceIndex.children.push(getFlag("税金",fixMap[fixedFlag.TAX],engineerCost,buildingArea));
+         priceIndex.children.push(getFlag("工程造价",fixMap[fixedFlag.ENGINEERINGCOST],engineerCost,buildingArea));
+
+
+        return priceIndex;
+
+    }
+
+    function getTotalFee(b) {
+        let total = 0;
+        if(b.fees && b.fees.length > 0){
+            let common = _.find(b.fees,{"fieldName":"common"});
+            if(common) total = scMathUtil.roundForObj(common.totalFee,getDecimal("bills.totalPrice"))
+        }
+        return total;
+    }
 
-    function setTenderData(tender,project) {
+    function getFlag(name,totalCost,engineerCost,buildingArea) {
+        totalCost = totalCost?totalCost:0;
+        let flag = {
+            name:name,
+            attrs:[
+                {name: "金额", value: scMathUtil.roundToString(totalCost,3)},
+                {name: "单方造价", value: scMathUtil.roundToString(totalCost/buildingArea,3)},
+                {name: "占造价比例", value: scMathUtil.roundToString(totalCost/engineerCost * 100,3)},
+            ],
+        };
+        return flag;
+    }
 
-        tender.children.push(setEngineerInfo(tender,project));
+    async function setGLJSummy(tender,projectData) {
 
+        let gljs = {
+            name:"人材机汇总",
+            attrs:[],
+            children:[]
+        };
+        setGLJDetail(projectData,tender.property,gljs);
+        return gljs;
+    }
 
+    function setGLJDetail(projectData,property,gljs) {
+        if(projectData){
+            gljUtil.calcProjectGLJQuantity(projectData.projectGLJs,projectData.ration_gljs,projectData.rations,projectData.bills,getDecimal("glj.quantity"),_,scMathUtil);
+        }
+        for(let g of projectData.projectGLJs.gljList) {
+            if (!g.quantity || g.quantity == "") continue;
+            g.marketPrice = gljUtil.getMarketPrice(g,projectData.projectGLJs,property.calcOptions,property.decimal,false,_,scMathUtil);
+            gljs.children.push(setEachGLJ(g));
+        }
+    }
 
+    function setEachGLJ(source){
+        let g = {
+            name:"人材机",
+            attrs:[
+                {name: "代码", value: source.code},
+                {name: "名称", value: source.name},
+                {name: "规格型号", value: source.specs},
+                {name: "单位", value: source.unit},
+                {name: "市场单价", value: source.marketPrice},
+                {name: "数量", value: source.quantity},
+                {name: "类型", value: source.type},
+                {name: "产地", value: source.originPlace},
+                {name: "厂家", value: source.vender},
+                {name: "备注", value: source.remark}
+            ]
+        };
+        return g;
     }
 
-    function setEngineerInfo(tender,project) {
+
+
+    function setEngineerInfo(tender,project) {//设置工程信息
         let baseInfo = project.basicInformation;
         let calcType ={"bill":"工程量清单计价","ration":"定额计价"};
         let info = {
@@ -148,7 +268,7 @@ async function exportSEI(projectID) {
     function startTag(ele) {
         let rst = `<${ele.name}`;
         for (let attr of ele.attrs) {
-            rst += ` ${attr.name}="${attr.value}"`;
+            rst += ` ${attr.name}="${ attr.value!=undefined&&attr.value!= null?attr.value:""}"`;
         }
         rst += ele.children&&ele.children.length > 0 ? '>' : '/>';
         return rst;

+ 2 - 4
web/building_saas/main/js/models/project_glj.js

@@ -827,20 +827,18 @@ ProjectGLJ.prototype.getMarketPrice = function (glj,isRadio) {
     let proGLJ =  projectObj.project.projectGLJ;
     let calcOptions=projectObj.project.projectInfo.property.calcOptions;
     let decimalObj = projectObj.project.projectInfo.property.decimal;
-    let labourCoeDatas =  projectObj.project.labourCoe.datas;
-    return gljUtil.getMarketPrice(glj,proGLJ.datas,calcOptions,labourCoeDatas,decimalObj,isRadio,_,scMathUtil);
+    return gljUtil.getMarketPrice(glj,proGLJ.datas,calcOptions,decimalObj,isRadio,_,scMathUtil);
 };
 
 ProjectGLJ.prototype.getTenderMarketPrice = function (glj,isRadio) {
     let proGLJ =  projectObj.project.projectGLJ;
     let calcOptions=projectObj.project.projectInfo.property.calcOptions;
     let decimalObj = projectObj.project.projectInfo.property.decimal;
-    let labourCoeDatas =  projectObj.project.labourCoe.datas;
     let tenderCoe = 1;
     if (projectObj.project.property.tenderSetting && gljUtil.isDef(projectObj.project.property.tenderSetting.gljPriceTenderCoe) ){
         tenderCoe = parseFloat(projectObj.project.property.tenderSetting.gljPriceTenderCoe);
     }
-    return gljUtil.getMarketPrice(glj,proGLJ.datas,calcOptions,labourCoeDatas,decimalObj,isRadio,_,scMathUtil,tenderCoe);
+    return gljUtil.getMarketPrice(glj,proGLJ.datas,calcOptions,decimalObj,isRadio,_,scMathUtil,tenderCoe);
 };
 
 ProjectGLJ.prototype.isEstimateType = function(type){

+ 1 - 1
web/building_saas/main/js/views/fee_rate_view.js

@@ -139,7 +139,7 @@ var feeRateObject={
         feeRateObject.feeRateSheet.bind(GC.Spread.Sheets.Events.CellDoubleClick,feeRateObject.onCellDoubleClick);
     },
     showFeeRateTree:function (sheet,setting,data) {
-
+        console.log(data);
         let ch = GC.Spread.Sheets.SheetArea.viewport;
         let parentMap=_.groupBy(data, 'ParentID');
         let visibleMap = {};

+ 136 - 0
web/building_saas/main/js/views/index_view.js

@@ -0,0 +1,136 @@
+/**
+ * Created by zhang on 2019/5/28.
+ */
+
+let indexObj= {
+    nav_text:"工程信息指标",
+    spread:null,
+    engineerInfoSetting:{
+        header: [
+            {headerName: "名称", headerWidth: 160, dataCode: "dispName", dataType: "String"},
+            {headerName: "内容", headerWidth: 200, dataCode: "value", dataType: "String"}
+        ],
+        view:{ lockColumns: ["dispName"]}
+    },
+    engineerFeatureSetting:{
+        header: [
+            {headerName: "名称", headerWidth: 160, dataCode: "name", dataType: "String"},
+            {headerName: "内容", headerWidth: 200, dataCode: "value", dataType: "String"}
+        ],
+        view:{ lockColumns: [0]}
+    },
+    engineerInfoDatas:[],
+    engineerFeatureDatas:[],
+    initSpread:function () {
+        if(!this.spread){
+            this.spread = SheetDataHelper.createNewSpread($("#indexSpread")[0],8);
+            sheetCommonObj.spreadDefaultStyle(this.spread);
+            this.initEngineerInfoSheet();
+            this.initEngineerFeatureSheet();
+        }
+       // disableRightMenu("glj_from_sheet",this.spread);
+        if(projectReadOnly){
+            disableSpread(this.spread);
+        }
+        this.spread.refresh();
+    },
+    initEngineerInfoSheet:function () {
+        let sheet = this.spread.getSheet(0);
+        sheetCommonObj.initSheet(sheet,this.engineerInfoSetting,30);
+        sheet.bind(GC.Spread.Sheets.Events.SelectionChanged,this.onSelectionChange);
+        sheet.bind(GC.Spread.Sheets.Events.ValueChanged, this.onSheetValueChange);
+        sheet.name('engineerInfo');
+        //sheet.setRowHeight(0, 36, 1);
+    },
+    initEngineerFeatureSheet:function () {
+        let sheet = this.spread.getSheet(1);
+        this.engineerFeatureDatas = getDatas();
+        sheetCommonObj.initSheet(sheet,this.engineerFeatureSetting,1);
+        sheet.bind(GC.Spread.Sheets.Events.ValueChanged, this.onSheetValueChange);
+        sheet.bind(GC.Spread.Sheets.Events.SelectionChanged,this.onSelectionChange);
+
+        function getDatas() {
+            let datas = [];
+            if(projectObj.project.property.engineerFeatures){
+                for(let f of projectObj.project.property.engineerFeatures){
+                    let tem = {
+                        ID:f.ID,
+                        name:f.name,
+                        value:f.value,
+                        ParentID:f.ParentID,
+                        collapsed:false
+                    };
+                    datas.push(tem);
+                }
+            }
+            return datas;
+        }
+    },
+    showDatas:function(){
+        if(this.nav_text == "工程信息指标") this.showEngineerInfo();
+        if(this.nav_text == "工程特征指标") this.showEngineerFeature();
+    },
+    showEngineerInfo:function () {
+        this.spread.setActiveSheetIndex(0);
+        let sheet = this.spread.getActiveSheet();
+        this.engineerInfoDatas = getEngineerInfoData();
+        sheetCommonObj.showData(sheet, this.engineerInfoSetting,this.engineerInfoDatas);
+        sheet.setRowCount(this.engineerInfoDatas.length);
+        function getEngineerInfoData() {
+            let datas = [];
+            if(projectObj.project.property.engineerInfos){
+                for(let info of projectObj.project.property.engineerInfos){
+                    let d = {
+                        dispName:info.dispName,
+                        key:info.key,
+                        value:info.value,
+                        options:info.options,
+                        cellType:info.cellType
+                    };
+                    if(info.cellType)d.dateCol = 1;
+                    datas.push(d);
+                }
+            }
+            return datas;
+        }
+    },
+    showEngineerFeature:function () {
+        this.spread.setActiveSheetIndex(1);
+        let sheet = this.spread.getActiveSheet();
+        sheet.setRowCount(0);
+        sheet.setRowCount(this.engineerFeatureDatas.length);
+        refreshValue();
+        sheetCommonObj.showTreeData(sheet, this.engineerFeatureSetting,this.engineerFeatureDatas);
+        function refreshValue() {
+            let map = projectObj.project.property.engineerFeatures?_.indexBy(projectObj.project.property.engineerFeatures,'ID'):{};
+            for(let f of indexObj.engineerFeatureDatas){
+                if(map[f.ID]) f.value = map[f.ID].value;
+            }
+        }
+    },
+    onSelectionChange:function (sender, args) {
+        args.sheet.repaint();
+    }
+};
+
+
+$(function () {
+    $("#index_nav").on("click","ul li a",function(e){
+        let children = $('#index_nav a');
+        for(let c of children){
+            $(c).removeClass('active');
+        }
+        $(this).addClass('active');
+        indexObj.nav_text = $(this).text();
+        indexObj.showDatas();
+    });
+
+    $('#tab_index').on('shown.bs.tab', function (e) {
+        indexObj.initSpread();
+        indexObj.showDatas();
+    });
+});
+
+function onResize() {
+    if(indexObj.spread) indexObj.spread.refresh();
+}

+ 3 - 8
web/building_saas/main/js/views/material_adjust_view.js

@@ -68,14 +68,14 @@ let materialAdjustObj = {
         sheetCommonObj.initSheet(this.priceInfoSheet,this.priceInfoSetting,30);
         this.priceInfoSheet.bind(GC.Spread.Sheets.Events.ValueChanged, this.onSheetValueChange);
         this.priceInfoSheet.name('priceInfoSheet');
-        this.priceInfoSheet.setRowHeight(0, 45, 1);
+        this.priceInfoSheet.setRowHeight(0, 36, 1);
     },
     initPriceCoeSheet:function () {
         this.priceCoeSheet = this.spread.getSheet(1);
         sheetCommonObj.initSheet(this.priceCoeSheet,this.priceCoeSetting,30);
         this.priceCoeSheet.bind(GC.Spread.Sheets.Events.ValueChanged, this.onSheetValueChange);
         this.priceCoeSheet.name('priceCoeSheet');
-        this.priceCoeSheet.setRowHeight(0, 45, 1);
+        this.priceCoeSheet.setRowHeight(0, 36, 1);
     },
     onSheetValueChange:function (a,args) {
         let me = materialAdjustObj,row = args.row, col = args.col;
@@ -121,11 +121,6 @@ let materialAdjustObj = {
         if( _.isEmpty(updateMap)) return;
         projectGLJ.batchUpdateGLJProperty(updateMap,materialAdjustObj.refreshSheetDatas);
 
-
-
-      /*  let recode = datas[row];
-        let updateData = {id: recode.id, field: field, value: 0};
-        projectGLJ.pGljUpdate(updateData,me.refreshSheetDatas);*/
     },
     showPriceInfoDatas:function () {
         this.spread.setActiveSheetIndex(0);
@@ -274,7 +269,7 @@ let gljFromObj={
         this.sheet.bind(GC.Spread.Sheets.Events.EditStarting,this.onEditStarting);
         this.sheet.bind(GC.Spread.Sheets.Events.ClipboardPasting, this.onClipboardPasting);
         this.sheet.bind(GC.Spread.Sheets.Events.ValueChanged, this.onValueChanged);
-        this.sheet.setRowHeight(0, 45, 1);
+        this.sheet.setRowHeight(0, 36, 1);
         disableRightMenu("glj_from_sheet",this.spread);
     },
     onEditStarting:function (e,args) {

+ 4 - 3
web/building_saas/main/js/views/project_glj_view.js

@@ -79,7 +79,7 @@ projectGljObject={
         this.projectGljSheet.bind(GC.Spread.Sheets.Events.SelectionChanged,this.onProjectGljSelectionChange);
         this.projectGljSheet.bind(GC.Spread.Sheets.Events.EditStarting,this.onProjectGljEditStarting);
         this.projectGljSheet.name('projectGljSheet');
-        this.projectGljSheet.setRowHeight(0, 45, 1);
+        this.projectGljSheet.setRowHeight(0, 36, 1);
     },
     initMixRatio:function () {
         let me = projectGljObject;
@@ -1086,10 +1086,11 @@ projectGljObject={
         });
     },
     initFilterTypeList:function () {//初始化人材机汇总工料机类型过滤列表
-        let htmlString = '';
+        let htmlString = ' <ul class="nav flex-column">';
         for(let t of this.displayTypeMap){
-            htmlString += '<li class="nav-item li_sub"><a class="nav-link" href="javascript:void(0)" id="'+t.ID+'">'+t.text+'</a></li>';
+            htmlString += '<li class="nav-item "><a class="nav-link pl-4" href="javascript:void(0)" id="'+t.ID+'">'+t.text+'</a></li>';
         }
+        htmlString += '</ul>';
         $('#ALL').after(htmlString);
     }
 };

+ 3 - 2
web/building_saas/main/js/views/project_view.js

@@ -3316,8 +3316,9 @@ $('#calcBaseFeeRateConf').click(function () {
 $('#menu_calc_program_manage').click(function () {
     $('#tab_calc_program_manage').click();
 });
-
-//导出接口,如果选中多个文件,导出压缩包
+$('#menu_index_info').click(function () {
+    $('#tab_index').click();
+});//导出接口,如果选中多个文件,导出压缩包
 $('#export-confirm').click(async function () {
     let checkedDatas = $('#export input[type="checkbox"]:checked');
     if (!checkedDatas.length) {

+ 8 - 0
web/building_saas/pm/js/pm_newMain.js

@@ -3489,6 +3489,14 @@ function AddTender() {
             region: region,
             projectFeature: featureData ? featureData : []
         };
+        //导出指标信息
+        if(libs.indexName) tenderInfo.indexName = libs.indexName;
+        if(libs.engineer_info_lib && libs.engineer_info_lib.length > 0) tenderInfo.engineerInfoLibID = libs.engineer_info_lib[0].id;
+        if(libs.engineer_feature_lib && libs.engineer_feature_lib.length > 0) tenderInfo.engineerFeatureLibID = libs.engineer_feature_lib[0].id;
+        if(libs.economic_lib && libs.economic_lib.length > 0) tenderInfo.economicLibID = libs.economic_lib[0].id;
+        if(libs.main_quantity_lib && libs.main_quantity_lib.length > 0) tenderInfo.mainQuantityLibID = libs.main_quantity_lib[0].id;
+        if(libs.material_lib && libs.material_lib.length > 0) tenderInfo.materialLibID = libs.material_lib[0].id;
+
         AddTenderItems(selectedItem, projName, engName, tenderName, tenderInfo, callback);
 
     } catch (error) {