Browse Source

Merge branch 'master' of http://smartcost.f3322.net:3000/SmartCost/ConstructionCost

zhongzewei 7 years ago
parent
commit
2ae035c7f6

+ 5 - 0
modules/all_models/project_glj.js

@@ -91,6 +91,11 @@ let modelSchema = {
     connect_code: String,
     materialType: Number,   //三材类别
     materialCoe: Number,    //三材系数
+    // 是否主要材料 (0为否 1为是)
+    is_main_material: {
+        type: Number,
+        default: 0
+    },
     ratio_data: Schema.Types.Mixed
 };
 mongoose.model(collectionName, new Schema(modelSchema, {versionKey: false}));

+ 1 - 1
modules/glj/controllers/glj_controller.js

@@ -82,7 +82,7 @@ class GLJController extends BaseController {
         try {
             // 可编辑的字段
             let editableField = ['is_evaluate', 'unit_price.market_price', 'is_adjust_price', 'mix_ratio.consumption',
-                'supply', 'supply_quantity','delivery_address','delivery','materialType','materialCoe'];
+                'supply', 'supply_quantity','delivery_address','delivery','materialType','materialCoe','is_main_material'];
             if (editableField.indexOf(field) < 0) {
                 throw '对应字段不能编辑';
             }

+ 67 - 4
modules/reports/util/rpt_construct_data_util.js

@@ -7,6 +7,7 @@ let $JE = require('../rpt_component/jpc_rte');
 let consts = require('../../../modules/main/models/project_consts');
 
 let fsUtil = require("../../../public/fsUtil");
+let stringUtil = require("../../../public/stringUtil");
 
 let treeUtil = require('../../../public/treeUtil');
 let projectConst = consts.projectConst;
@@ -102,6 +103,13 @@ class Rpt_Common{
         }
         return rst;
     };
+    FormatString(arrVal, formatStr){
+        let rst = [];
+        for (let val of arrVal) {
+            rst.push(stringUtil.replaceAll(formatStr, '%S', val));
+        }
+        return rst;
+    };
 }
 
 class Rpt_Data_Extractor {
@@ -191,6 +199,9 @@ class Rpt_Data_Extractor {
         $PROJECT.MAIN["myOwnRawDataObj"] = rawDataObj.prj._doc;
         $PROJECT.MAIN.getProperty = ext_mainGetPropety;
         $PROJECT.MAIN.getFee = ext_mainGetFee;
+        for (let item of rawDataObj.prjData) {
+            setupFunc($PROJECT.DETAIL, item.moduleName, item);
+        }
         if (tpl[JV.NODE_MAP_DATA_HANDLE_INFO]) {
             for (let preHandle of tpl[JV.NODE_MAP_DATA_HANDLE_INFO]) {
                 let srcData = getModuleDataByKey(rawDataObj.prjData, preHandle[JV.PROP_DATA_KEY]);
@@ -220,9 +231,6 @@ class Rpt_Data_Extractor {
                 }
             }
         }
-        for (let item of rawDataObj.prjData) {
-            setupFunc($PROJECT.DETAIL, item.moduleName, item);
-        }
         let rptDataObj = {};
         rptDataObj[JV.DATA_DISCRETE_DATA] = [];
         rptDataObj[JV.DATA_MASTER_DATA] = [];
@@ -716,16 +724,39 @@ function sortData(sourceData, sortCfg, prjData) {
             let addLevel = true;
             rst = treeUtil.buildTreeNodeDirectly(tempRstArr, addLevel);
             let newTopArr = [];
-            if (sortCfg[JV.PROP_FILTER_TOP_BILLS_NODES] && sortCfg[JV.PROP_FILTER_TOP_BILLS_NODES].length > 0) {
+            if ((sortCfg[JV.PROP_FILTER_TOP_BILLS_NODES] && sortCfg[JV.PROP_FILTER_TOP_BILLS_NODES].length > 0) ||
+                (sortCfg[JV.PROP_FILTER_OTHER_BILLS_NODES] && sortCfg[JV.PROP_FILTER_OTHER_BILLS_NODES].length > 0)) {
+                let local_check_bills = function(tItem) {
+                    let chkDtl = false;
+                    if (tItem.flags && tItem.flags.length > 0) {
+                        for (let flagItem of tItem.flags) {
+                            if (sortCfg[JV.PROP_FILTER_OTHER_BILLS_NODES].indexOf(flagItem.flag) >= 0) {
+                                newTopArr.push(tItem);
+                                chkDtl = true;
+                                break;
+                            }
+                        }
+                    }
+                    if (!chkDtl && tItem.items && tItem.items.length > 0) {
+                        for (let dtlItem of tItem.items) {
+                            local_check_bills(dtlItem);
+                        }
+                    }
+                };
                 for (let topItem of rst) {
+                    let chkTop = false;
                     if (topItem.flags && topItem.flags.length > 0) {
                         for (let flagItem of topItem.flags) {
                             if (sortCfg[JV.PROP_FILTER_TOP_BILLS_NODES].indexOf(flagItem.flag) >= 0) {
                                 newTopArr.push(topItem);
+                                chkTop = true;
                                 break;
                             }
                         }
                     }
+                    if (!chkTop && sortCfg[JV.PROP_FILTER_OTHER_BILLS_NODES] && sortCfg[JV.PROP_FILTER_OTHER_BILLS_NODES].length > 0) {
+                        local_check_bills(topItem);
+                    }
                 }
             } else {
                 newTopArr = rst;
@@ -800,7 +831,9 @@ function sortData(sourceData, sortCfg, prjData) {
 function setupFunc(obj, prop, ownRawObj) {
     obj[prop] = {};
     obj[prop]["myOwnRawDataObj"] = ownRawObj;
+    obj[prop]["myOwnOrgRawDataObj"] = ownRawObj.data;
     obj[prop].getProperty = ext_getPropety;
+    obj[prop].getPropertyByRefId = ext_getPropertyByRefId;
     obj[prop].getFee = ext_getFee;
     obj[prop].getPropertyByForeignId = ext_getPropertyByForeignId;
     obj[prop].getArrayValues = ext_getArrayValues;
@@ -920,6 +953,36 @@ function ext_getPropety(propKey) {
     return rst;
 }
 
+function ext_getPropertyByRefId(baseKey, refIDKey, propertyKey){
+    let rst = [], parentObj = this;
+    let dtObj = parentObj["myOwnRawDataObj"];
+    let orgDtObj = parentObj["myOwnOrgRawDataObj"];
+    if (baseKey && refIDKey && propertyKey && dtObj) {
+        for (let dItem of dtObj.data) {
+            let doc = (dItem._doc === null || dItem._doc === undefined)?dItem:dItem._doc;
+            let tmpRst = doc[baseKey];
+            if (typeof tmpRst === "string" && tmpRst[0] === "@") {
+                let refKey = tmpRst.slice(1);
+                let hasGetRef = false;
+                for (let orgDItem of orgDtObj) {
+                    let oDoc = (orgDItem._doc === null || orgDItem._doc === undefined)?orgDItem:orgDItem._doc;
+                    if (oDoc[refIDKey] === refKey) {
+                        rst.push(oDoc[propertyKey]);
+                        hasGetRef = true;
+                        break;
+                    }
+                }
+                if (!hasGetRef) {
+                    rst.push(tmpRst);
+                }
+            } else {
+                rst.push(tmpRst);
+            }
+        }
+    }
+    return rst;
+}
+
 function ext_mainGetFee(feeKey, dtlFeeKey) {
     let rst = [];
     let parentObj = this;

+ 1 - 0
public/web/rpt_value_define.js

@@ -55,6 +55,7 @@ const JV = {
     PROP_HANDLE_TYPE: "预处理类型",
     PROP_FILTER_KEYS: "过滤键值集",
     PROP_FILTER_TOP_BILLS_NODES: "清单顶节点集",
+    PROP_FILTER_OTHER_BILLS_NODES: "其他清单节点集",
     PROP_FILTER_COMPARE_OBJ: "compareObjKey",
     PROP_FILTER_COMPARE_OBJ_KEY: "compareObjIdKey",
     PROP_FILTER_COMPARE_VAL: "compareValue",

+ 3 - 2
public/web/sheet/sheet_data_helper.js

@@ -45,8 +45,9 @@ var SheetDataHelper = {
     initSetting: function (obj, setting) {
         setting.pos = this.getObjPos(obj);
     },
-    createNewSpread: function (obj) {
-        var spread = new GC.Spread.Sheets.Workbook(obj, {sheetCount: 1});
+    createNewSpread: function (obj,sheetCount) {
+        sheetCount = sheetCount?sheetCount:1;
+        var spread = new GC.Spread.Sheets.Workbook(obj, {sheetCount: sheetCount});
         spread.options.tabStripVisible = false;
         spread.options.scrollbarMaxAlign = true;
         spread.options.cutCopyIndicatorVisible = false;

+ 1 - 1
test/unit/reports/test_preview_page.js

@@ -24,7 +24,7 @@ cfgCacheUtil.setupDftCache();
 let fsUtil = require("../../../public/fsUtil");
 
 // let demoPrjId = - 1;
-let demoRptId = 232; //重庆09年建筑 09表
+let demoRptId = 275; //重庆09年建筑 09表
 // let demoRptId = 229; //重庆09年建筑 封2表
 
 let pagesize = "A4";

+ 106 - 0
test/unit/reports/test_tpl_10.js

@@ -0,0 +1,106 @@
+/**
+ * Created by Tony on 2018/5/22.
+ */
+/**
+ * Created by Tony on 2018/5/11.
+ */
+
+let test = require('tape');
+import JpcEx from "../../../modules/reports/rpt_component/jpc_ex";
+import JV from "../../../modules/reports/rpt_component/jpc_value_define";
+let config = require("../../../config/config.js");
+config.setupDb(process.env.NODE_ENV);
+let mongoose = require("mongoose");
+let fileUtils = require("../../../modules/common/fileUtils");
+let path = require('path');
+let dbm = require("../../../config/db/db_manager");
+let rpt_cfg = require('./rpt_cfg');
+dbm.connect(process.env.NODE_ENV);
+
+//统一引用models
+fileUtils.getGlobbedFiles('../../../modules/all_models/*.js').forEach(function(modelPath) {
+    require(path.resolve(modelPath));
+});
+
+//config.setupCache();
+let cfgCacheUtil = require("../../../config/cacheCfg");
+cfgCacheUtil.setupDftCache();
+
+let fsUtil = require("../../../public/fsUtil");
+
+let demoPrjId = - 1;
+let demoRptId = 245, pagesize = "A4";
+
+// let userId_Leng = "59cdf14a0034a1000ba52b97"; //小冷User Id 换成_id了 QQ号
+let userId_Leng = "5acac1e885bf55000bd055ba"; //小冷User Id2
+// demoPrjId = 720; //QA: DW3
+//demoPrjId = 1626; //QA:
+demoPrjId = 2260; //QA:
+//*/
+let userId_Dft = userId_Leng;
+/*/
+ let userId_Dft = "595328da1934dc327cad08eb";
+ //*/
+
+let rptTplFacade = require("../../../modules/reports/facade/rpt_template_facade");
+let rptTplDataFacade = require("../../../modules/reports/facade/rpt_tpl_data_facade");
+
+import rptDataExtractor from "../../../modules/reports/util/rpt_construct_data_util";
+
+let fs = require('fs');
+//设置Date Format函数
+fs.readFile(__dirname.slice(0, __dirname.length - 18) + '/public/web/date_util.js', 'utf8', 'r', function (err, data) {
+    eval(data);
+});
+
+test('测试 - 测试模板: 表-11 ', function (t) {
+    rptTplFacade.getRptTemplate(demoRptId).then(function(rptTpl) {
+        let rptDataUtil = new rptDataExtractor();
+        rptDataUtil.initialize(rptTpl._doc);
+        let filter = rptDataUtil.getDataRequestFilter();
+        console.log(filter);
+        //正常应该根据报表模板定义的数据类型来请求数据
+        rptTplDataFacade.prepareProjectData(userId_Dft, demoPrjId, filter, function (err, msg, rawDataObj) {
+            if (!err) {
+                try {
+                    // fsUtil.writeObjToFile(rawDataObj, "D:/GitHome/ConstructionCost/tmp/rptTplRawDataObject_建筑10表.jsp");
+                    let tplData = rptDataUtil.assembleData(rawDataObj);
+                    // fsUtil.writeObjToFile(tplData, "D:/GitHome/ConstructionCost/tmp/rptTplAssembledData_建筑10表.jsp");
+                    //it's time to build the report!!!
+                    let printCom = JpcEx.createNew();
+                    rptTpl[JV.NODE_MAIN_INFO][JV.NODE_PAGE_INFO][JV.PROP_PAGE_SIZE] = pagesize;
+                    let defProperties = rpt_cfg;
+                    let dftOption = JV.PAGING_OPTION_NORMAL;
+                    printCom.initialize(rptTpl);
+                    printCom.analyzeData(rptTpl, tplData, defProperties, dftOption);
+                    let maxPages = printCom.totalPages;
+                    let pageRst = printCom.outputAsSimpleJSONPageArray(rptTpl, tplData, 1, maxPages, defProperties);
+                    if (pageRst) {
+                        // fsUtil.writeObjToFile(pageRst, "D:/GitHome/ConstructionCost/tmp/testBuiltPageResult_建筑10表.jsp");
+                    } else {
+                        console.log("oh! no pages were created!");
+                    }
+                } catch (ex) {
+                    console.log(ex);
+                    t.pass('pass with exception!');
+                    t.end();
+                }
+
+                t.pass('pass succeeded!');
+                t.end();
+            } else {
+                console.log(msg);
+                t.pass('pass with error!');
+                t.end();
+            }
+        })
+    });
+});
+
+test('close the connection', function (t) {
+    setTimeout(function () {
+        mongoose.disconnect();
+        t.pass('closing db connection');
+        t.end();
+    }, 1000);
+});

+ 4 - 0
web/building_saas/css/custom.css

@@ -29,3 +29,7 @@ legend.legend{
 .toolsbar_feeRate {
     border-bottom: 1px solid #ccc
 }
+
+.li_sub {
+    margin-left: 14px;
+}

+ 12 - 3
web/building_saas/css/main.css

@@ -149,9 +149,10 @@ body {
 .bottom-tools {
     height: 30px;
     line-height: 30px;
-    background:#F1F1F1;
-    bottom:30px;
-    left:5px;
+    background:#fff;
+    bottom:22px;
+    left:22px;
+    z-index: 999
 }
 .side-tabs .nav-tabs .nav-item {
     z-index: 999
@@ -267,10 +268,18 @@ body {
         transform: translateX(10px);
     }
 }
+.gl-side{
+    border-right:1px solid #ccc;
+    width:150px
+}
 .bottom-content .tab-content .main-data-bottom{
     height: 300px;
     overflow: auto;
 }
+.bottom-content .main-data-bottom2{
+    height: 331px;
+    overflow: hidden;
+}
 .bottom-content .tab-content .ovf-hidden{
     overflow: hidden;
 }

+ 29 - 13
web/building_saas/glj/html/project_glj.html

@@ -12,33 +12,49 @@
 </div>
 <div class="container-fluid">
     <div class="row">
-        <div class="col-lg-12 p-0" id="project-glj-main">
+        <div class="gl-side col-lg-1" id='filterType'>
+            <ul class="list-unstyled ml-3 mt-2 mb-2">
+                <li><a href="javascript:void(0)" id="ALL">所有工料机</a></li>
+                <li class="mb-2 li_sub"><a href="javascript:void(0)" id="LABOUR">人工</a></li>
+                <li class="mb-2 li_sub"><a href="javascript:void(0)" id="GENERAL_MATERIAL">材料</a></li>
+                <li class="mb-2 li_sub"><a href="javascript:void(0)" id="GENERAL_MACHINE">机械</a></li>
+                <li class="mb-2 li_sub"><a href="javascript:void(0)" id="MAIN_MATERIAL">主材</a></li>
+                <li class="mb-2 li_sub"><a href="javascript:void(0)" id="EQUIPMENT">设备</a></li>
+                <li class="mb-2"><a href="javascript:void(0)" id="FBFX">分部分项工料机</a></li>
+                <li class="mb-2"><a href="javascript:void(0)" id="TECH">措施分项工料机</a></li>
+                <li class="mb-2"><a href="javascript:void(0)" id="JGCL">甲供材料</a></li>
+                <li class="mb-2"><a href="javascript:void(0)" id="ZGCL">暂估材料</a></li>
+                <li class="mb-2"><a href="javascript:void(0)" id="SCHZ">三材汇总</a></li>
+                <li class="mb-2"><a href="javascript:void(0)" id="ZYCL">主要材料</a></li>
+            </ul>
+        </div>
+        <div class="main-content col p-0 col-lg-11" id="project-glj-main">
             <div class="top-content">
-                <div class="main-data-top" style="width: 100%" id="project_glj_sheet">
+                <div class="main-data-top" style="width: 100% " id="project_glj_sheet">
                 </div>
             </div>
             <div class="resize"></div>
             <div class="bottom-content">
                 <ul class="nav nav-tabs" role="tablist">
-                    <li class="nav-item">
+                  <!--  <li class="nav-item">
                         <a class="nav-link active" data-toggle="tab" data-name="ration_sheet" id="ration_link" href="#glj_de_div" role="tab">相关定额</a>
-                    </li>
-                    <li class="nav-item">
-                        <a class="nav-link" data-toggle="tab" data-name="mix_ratio_sheet" id="mix_ratio_link" href="#ph_div" role="tab">配合比表</a>
-                    </li>
-                    <li class="nav-item">
+                    </li>-->
+                   <!-- <li class="nav-item">
+                        <a class="nav-link active" data-toggle="tab" data-name="mix_ratio_sheet" id="mix_ratio_link" href="#ph_div" role="tab">组成物</a> 配合比、机械单价表合并
+                    </li>-->
+                   <!-- <li class="nav-item">
                         <a class="nav-link" data-toggle="tab" data-name="machine_sheet" id="machine_ratio_link" href="#ph_div" role="tab">机械单价</a>
-                    </li>
+                    </li>-->
                 </ul>
                 <!-- Tab panes -->
                 <div class="tab-content">
-                    <div class="tab-pane active" id="glj_de_div" role="tabpanel">
+                    <!--<div class="tab-pane active" id="glj_de_div" role="tabpanel">
                         <div class="main-data-bottom ovf-hidden">
                             相关定额
                         </div>
-                    </div>
-                    <div class="tab-pane" id="ph_div" role="tabpanel">
-                        <div class="main-data-bottom" id="mix_ratio_sheet">
+                    </div>-->
+                    <div class="tab-pane active" id="ph_div" role="tabpanel">
+                        <div class="main-data-bottom" id="mix_ratio_sheet" style="overflow:hidden">
                         </div>
                     </div>
              <!--       <div class="tab-pane" id="jx_div" role="tabpanel">

+ 1 - 1
web/building_saas/js/global.js

@@ -16,7 +16,7 @@ function autoFlashHeight(){
     $('#glj_tree_div .modal-content').width($(window).width() < 1020 + 20 ? $(window).width() - 20 : 1020);
     //$("#main .main-data-top").height($(window).height()-headerHeight-toolsbarHeight-bottomContentHeight-1);
     $("#billsSpread").height($(window).height()-headerHeight-toolsbarHeight-mainBottomContentHeight-1);
-    $("#project_glj_sheet").height($(window).height()-headerHeight-toolsbarHeight-gljBottomContentHeight-25);
+    $("#project_glj_sheet").height($(window).height()-headerHeight-toolsbarHeight-gljBottomContentHeight-50);
     $(".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);

+ 17 - 2
web/building_saas/main/js/main.js

@@ -157,8 +157,9 @@ function loadSize(eles, type, callback) {
     let nearSize = getLocalCache(`near${type}:${tag}`);
     let farSize = getLocalCache(`far${type}:${tag}`);
     if (nearSize === null || farSize === null) {
-        eles.nearSpread[type](o_nearSize);
-        eles.farSpread[type](o_farSize);
+        setDefaultSize(tag,eles,type);//zhang 2018-05-21
+       /* eles.nearSpread[type](o_nearSize);
+        eles.farSpread[type](o_farSize);*/
     }else {
         nearSize = parseFloat(nearSize);
         farSize = parseFloat(farSize);
@@ -182,3 +183,17 @@ function getResizeWidthPercent(nearSize, farSize){
     let farPercent = (farSize / (resizeWidth + nearSize + farSize) * 100) + '%';
     return {nearPercent, farPercent};
 }
+
+function setDefaultSize(tag,eles,type) {
+    let o_nearSize = eles.nearSpread[type]();
+    let o_farSize = eles.farSpread[type]();
+    if(tag == "#main"){
+        eles.nearSpread[type](o_nearSize);  //工料机汇总和main页面处理方式不同
+        eles.farSpread[type](o_farSize);
+    }else if(tag == "#project-glj-main"){
+        o_nearSize = parseFloat(o_nearSize);
+        o_farSize = parseFloat(o_farSize);
+        eles.nearSpread[type](o_nearSize - o_farSize + 30);
+        eles.farSpread[type](o_farSize);
+    }
+}

+ 1 - 0
web/building_saas/main/js/models/composition.js

@@ -113,6 +113,7 @@ Composition.prototype.updateConsumptionInCache = function (pid,recode,updateData
         changValue = operationWithRound(parentGlj.quantity,changValue,"glj.quantity","*");
         let oldQuantity =  scMathUtil.roundForObj(mglj.quantity,decimal);
         mglj.quantity = scMathUtil.roundForObj(oldQuantity+changValue,decimal);
+        recode.consumption = newValue;
         projectObj.project.projectGLJ.quantityChangeMap[mglj.id] = mglj.quantity;
         let p_key = gljOprObj.getIndex(parentGlj,gljKeyArray);
         let m_list = projectObj.project.projectGLJ.datas.mixRatioMap[p_key];

+ 32 - 1
web/building_saas/main/js/models/main_consts.js

@@ -78,7 +78,8 @@ const compositionTypes = [
     gljType.MAIN_MATERIAL,
     gljType.CONCRETE,
     gljType.MORTAR,
-    gljType.MIX_RATIO
+    gljType.MIX_RATIO,
+    gljType.GENERAL_MACHINE
 ];
 
 const notEditType = [
@@ -344,6 +345,36 @@ const blockType ={
     BX:5//补项
 };
 
+const filterType = {
+    ALL:'0',
+    LABOUR:'1',
+    GENERAL_MATERIAL:'2',
+    GENERAL_MACHINE:'3',
+    MAIN_MATERIAL:'4',
+    EQUIPMENT:'5',
+    FBFX:'6',
+    TECH:'7',
+    JGCL:'8',
+    ZGCL:'9',
+    SCHZ:'10',
+    ZYCL:'11'
+};
+const filterTypeArray = ['1','2','3','4','5'];
+/*
+<li><a href="javascript:void(0)">所有工料机</a></li>
+    <li class="mb-2 li_sub"><a href="javascript:void(0)" id="labor">人工</a></li>
+    <li class="mb-2 li_sub"><a href="javascript:void(0)">材料</a></li>
+    <li class="mb-2 li_sub"><a href="javascript:void(0)">机械</a></li>
+    <li class="mb-2 li_sub"><a href="javascript:void(0)">主材</a></li>
+    <li class="mb-2 li_sub"><a href="javascript:void(0)">设备</a></li>
+    <li class="mb-2"><a href="javascript:void(0)">分部分项工料机</a></li>
+    <li class="mb-2"><a href="javascript:void(0)">措施分项工料机</a></li>
+    <li class="mb-2"><a href="javascript:void(0)">甲供材料</a></li>
+    <li class="mb-2"><a href="javascript:void(0)">暂估材料</a></li>
+    <li class="mb-2"><a href="javascript:void(0)">三材汇总</a></li>
+    <li class="mb-2"><a href="javascript:void(0)">主要材料</a></li>
+*/
+
 const installFeeType = ['子目费用','分项费用','措施费用'];
 const installSectionBase = ['分别按人材机乘系数','人工','材料','机械'];
 const supplyComboMap = [{text:"自行采购",value:0},{text:"完全甲供",value:2},{text:"部分甲供",value:1},{text:"甲定乙供",value:3}];//后来调整了下拉选项的顺序,为了不改之前的业务逻辑,这里的值对换了一下

+ 0 - 1
web/building_saas/main/js/views/installation_fee_view.js

@@ -217,7 +217,6 @@ let installationFeeObj={
                 }
             }
         ]
-
     },
     positionData:null,
     positionSelectedObject:null,

+ 119 - 38
web/building_saas/main/js/views/project_glj_view.js

@@ -3,6 +3,7 @@
  */
 projectGljObject={
     showTag:'ration',//mixRatio/machine
+    displayType:filterType.ALL,
     mixRatioType: [gljType.CONCRETE, gljType.MORTAR, gljType.MIX_RATIO,gljType.MAIN_MATERIAL],
     machineType: [gljType.GENERAL_MACHINE],
     projectGljSetting:{
@@ -17,6 +18,7 @@ projectGljObject={
             {headerName: "调整价", headerWidth: 70, dataCode: "adjustPrice", hAlign: "right", dataType: "Number",decimalField:"glj.unitPrice"},
             {headerName: "市场价", headerWidth: 70, dataCode: "marketPrice", hAlign: "right", dataType: "Number",decimalField:"glj.unitPrice",validator:"number"},
             {headerName: "是否暂估", headerWidth: 60, dataCode: "is_evaluate", hAlign: "center", dataType: "String",cellType:'checkBox'},
+            {headerName: "主要材料", headerWidth: 60, dataCode: "is_main_material", hAlign: "center", dataType: "String",cellType:'checkBox'},
             {headerName: "供货方式", headerWidth: 80, dataCode: "supply", hAlign: "center", dataType: "String",cellType:'comboBox',editorValueType:true,options:supplyComboMap},
             {headerName: "甲供数量", headerWidth: 100, dataCode: "supply_quantity", hAlign: "right", dataType: "Number",validator:"number"},
             {headerName: "三材类别", headerWidth: 80, dataCode: "materialType", hAlign: "center", dataType: "String",cellType:'comboBox',editorValueType:true,options:materialComboMap},
@@ -41,12 +43,47 @@ projectGljObject={
             {headerName: "定额价", headerWidth: 120, dataCode: "basePrice", hAlign: "right", dataType: "Number",decimalField:'glj.unitPrice',validator:"number"},
             {headerName: "调整价", headerWidth: 120, dataCode: "adjustPrice", hAlign: "right", dataType: "Number",decimalField:"glj.unitPrice"},
             {headerName: "市场价", headerWidth: 120, dataCode: "marketPrice", hAlign: "right", dataType: "Number",decimalField:"glj.unitPrice",validator:"number"},
-            {headerName: "量", headerWidth: 120, dataCode: "consumption", hAlign: "right", dataType: "Number",decimalField:"glj.quantity",validator:"number"}
+            {headerName: "消耗量", headerWidth: 120, dataCode: "consumption", hAlign: "right", dataType: "Number",decimalField:"glj.quantity",validator:"number"}
         ],
         view: {
             lockColumns: [0,1,2,3,4,5,6]
         }
     },
+    materialTreeSetting:{
+        "emptyRows":0,
+        "headRows":1,
+        "headRowHeight":[21],
+        "defaultRowHeight": 21,
+        "treeCol": 0,
+        "cols":[//left:0,center:1,right:2
+           /* {
+                "width":100,
+                "readOnly": true,
+                "head":{
+                    "titleNames":["具体位置"],
+                    "spanCols":[1],
+                    "spanRows":[1],
+                    "vAlign":[1],
+                    "hAlign":[1],
+                    "font":["Arial"]
+                },
+                "data":{
+                    "field":"selected",
+                    "vAlign":1,
+                    "hAlign":1,
+                    "font":"Arial",
+                    "cellType":function (node) {
+                        if(node.data.canSelect == true){
+                            return new GC.Spread.Sheets.CellTypes.CheckBox();
+                        }
+                    }
+                }
+            }*/
+        ]
+    },
+    materialSetting:{
+
+    },
     mixRatioSpread:null,
     mixRatioSheet:null,
     mixRatioData:[],
@@ -75,6 +112,9 @@ projectGljObject={
         this.initSheet(this.mixRatioSheet,this.mixRatioSetting);
         this.mixRatioSheet.name('mixRatioSheet');
     },
+
+
+
     unitPriceFileInit:function() {
         let me = this;
         let projectGLJ = projectObj.project.projectGLJ;
@@ -89,24 +129,26 @@ projectGljObject={
     getUsedTenderInfo:function() {
         return projectGljObject.usedTenderList.join("<br>");
     },
-    showMixRatioData:function () {
-        let me = this,gljId = null;
-        let consumptionCol =  _.findIndex(me.mixRatioSetting.header, { 'dataCode': 'consumption'});
+    showMixRatioData:function (from = 'projectGljSheet') { //projectGljSheet/materialSheet 工料机汇总和三材汇总表
+        let me = this,gljId = null,gljType = null;
+        /*let consumptionCol =  _.findIndex(me.mixRatioSetting.header, { 'dataCode': 'consumption'});
         if(me.showTag == 'ration'){
             return;
-        }else if(me.showTag == 'mixRatio'){
-            me.mixRatioSheet.setValue(0, consumptionCol, '用量', GC.Spread.Sheets.SheetArea.colHeader);
-        }else if(me.showTag == 'machine'){
-            me.mixRatioSheet.setValue(0, consumptionCol, '消耗量', GC.Spread.Sheets.SheetArea.colHeader);
+        }*/
+        if(from == 'projectGljSheet'){
+            let sel = me.projectGljSheet.getSelections()[0];
+            let srow = sel.row == -1?0:sel.row;
+            if(me.projectGljSheetData.length>srow){
+                gljId = me.projectGljSheetData[srow].id;
+                gljType = me.projectGljSheetData[srow].type;
+            }
         }
-        let sel = me.projectGljSheet.getSelections()[0];
-        let srow = sel.row == -1?0:sel.row;
-        if(me.projectGljSheetData.length>srow){
-            gljId = me.projectGljSheetData[srow].id;
+        if(compositionTypes.indexOf(gljType)==-1){//如果不是有组成物的类型,工料机id设置为空,组成物表设置为空
+            gljId = null
         }
+
         projectObj.project.projectGLJ.getRatioData(gljId,function (data) {
             let rationList =[];
-            console.log(data);
             for(let glj of data){
                 rationList.push(me.getMixRatioSheetData(glj)) ;
             }
@@ -132,7 +174,6 @@ projectGljObject={
         gljOprObj.setGLJPrice(data,glj);
         return data;
     },
-
     onProjectGljEditStarting:function (sender, args) {
         let me = projectGljObject;
         let row = args.row;
@@ -151,7 +192,7 @@ projectGljObject={
             return false;
         }
 
-        if(dataCode=='is_adjust_price'||dataCode=='is_evaluate'){
+        if(dataCode=='is_adjust_price'||dataCode=='is_evaluate'||dataCode=='glj.is_main_material'){
             return false;
         }
         if(dataCode=='basePrice'||dataCode=='marketPrice'||dataCode=='supply'){//有组成物时,市场单价、定额价、供货方式不能修改
@@ -169,7 +210,6 @@ projectGljObject={
         }
         return true;
     },
-
     onProjectGljSelectionChange:function (sender, args) {
         let me = projectGljObject;
         me.showMixRatioData();
@@ -213,8 +253,6 @@ projectGljObject={
             me.projectGljSheet.setSelection(selected.row,selected.col,selected.rowCount,selected.colCount);
         });
     },
-
-
     showProjectGljData:function () {
         let sel = this.projectGljSheet.getSelections()[0];
         let projectGljSheetData = [];
@@ -228,27 +266,42 @@ projectGljObject={
         this.projectGljSheet.setRowCount(0);
         sheetCommonObj.showData(this.projectGljSheet, this.projectGljSetting,this.projectGljSheetData);
         this.projectGljSheet.setRowCount(this.projectGljSheetData.length);
-        this.projectGljSheet.setSelection(sel.row,sel.col,sel.rowCount,sel.colCount);
+        this.projectGljSheet.setSelection(sel.row==-1?0:sel.row,sel.col,sel.rowCount,sel.colCount);
     },
     filterProjectGLJ:function (gljList) {
         let me = projectGljObject;
         if(gljList.length>0){
             gljList = _.filter(gljList,function (item) {
-                if(item.quantity !== 0 && item.quantity !== '0'){//过滤掉消耗量为0的工料机
-                    //showTag:'ration',//mixRatio/machine
-                    if(me.showTag == 'ration'){
-                        return true;
-                    }else if(me.showTag == 'mixRatio'){
-                        return _.includes(me.mixRatioType,item.type)
-                    }else if(me.showTag == 'machine'){
-                        return _.includes(me.machineType,item.type)
-                    }
-                }
-                return false;
+                return me.displayTypeFilter(item);
             });
         }
         return gljList;
     },
+    displayTypeFilter:function (item) {
+        let me = this;
+        if(item.quantity !== 0 && item.quantity !== '0'){//过滤掉消耗量为0的工料机
+            if(me.displayType == filterType.ALL){//所有工料机
+                return true;
+            }else if(filterTypeArray.indexOf(me.displayType) != -1){//人工、材料、机械、主材、设备
+                let typeString = item.type+"";
+                return typeString.startsWith(me.displayType);
+            }else if(me.displayType == filterType.FBFX){//“分部分项总消耗量”≠0的工料机行
+                return item.subdivisionQuantity !== 0 && item.subdivisionQuantity !== '0';
+            }else if(me.displayType == filterType.TECH){//筛选“措施项目总消耗量”≠0的工料机行
+                return item.techQuantity !== 0 && item.techQuantity !== '0';
+            }else if(me.displayType == filterType.JGCL){//筛选“供货方式”=“完全甲供”或“部分甲供”的工料机行
+                return item.supply == supplyType.WQJG || item.supply == supplyType.BFJG;
+            }else if(me.displayType == filterType.ZGCL){//筛选“是否暂估”=“是”的工料机行。
+                return item.is_evaluate == 1;
+            }else if(me.displayType == filterType.ZYCL){//筛选“主要材料”=“是”的工料机行。
+                return item.is_main_material == 1;
+            }
+
+            console.log(item);
+
+        }
+        return false;
+    },
     getSheetDataByGLJ:function (glj) {
         let projectGLJ = projectObj.project.projectGLJ;
         let materialIdList = projectGLJ.datas.constData.materialIdList;
@@ -274,6 +327,10 @@ projectGljObject={
         };
         gljOprObj.setGLJPrice(data,glj);
 
+
+        data.is_main_material = glj.is_main_material == 1?1:0;
+
+
         //供货方式为完全甲供时设置甲供数量为总消耗量
         if (data.supply == 2) {
             data.supply_quantity = glj.quantity;
@@ -298,10 +355,20 @@ projectGljObject={
         let me = projectGljObject;
         let rowData = me.projectGljSheetData[row];
         let glj = projectObj.project.projectGLJ.getByID(rowData.id);
+        let newRow = null;
         if(glj){
-            me.projectGljSheetData[row] = me.getSheetDataByGLJ(glj);
+            newRow = me.getSheetDataByGLJ(glj);
         }
-        sheetCommonObj.showRowData(this.projectGljSheet, this.projectGljSetting,row,this.projectGljSheetData);
+        if(me.displayTypeFilter(newRow) == true){
+            me.projectGljSheetData[row] = newRow;
+            sheetCommonObj.showRowData(this.projectGljSheet, this.projectGljSetting,row,this.projectGljSheetData);
+        }else {
+            me.projectGljSheetData.splice(row,1);
+            this.projectGljSheet.deleteRows(row,1);
+        }
+        //me.projectGljSheetData[row] = me.getSheetDataByGLJ(glj);
+
+
     },
     initSheet: function (sheet,setting) {
         var me = this;
@@ -333,7 +400,8 @@ projectGljObject={
         let prow= projectGljObject.projectGljSheet.getActiveRowIndex();//取父机械或组成物的下标
         let prowData = projectGljObject.projectGljSheetData[prow];
         composition.updateConsumption(updateData,recode,prowData.id,function (sid) {
-           me.refreshParentData(prow,prowData.id,sid);
+            me.refreshProjectGljRowByID(sid);
+            me.refreshParentData(prow,prowData.id,sid);
         });
     },
     refreshParentData:function (row,pid,sid) {
@@ -370,7 +438,6 @@ projectGljObject={
         }
         gljOprObj.refreshView();
     },
-
     deleteMixRatio:function (row) {
         let me = this, deleteRecode = me.mixRatioData[row];
         let consumption = deleteRecode.consumption;
@@ -419,10 +486,7 @@ projectGljObject={
             info.sheet.suspendEvent();
             me.refreshProjectGljRow(row);
             for(let g of impactList){
-                let index = _.findIndex(me.projectGljSheetData, { 'id': g.id });
-                if(index>=0&&index != row){
-                    me.refreshProjectGljRow(index);
-                }
+                me.refreshProjectGljRowByID(g.id,row);
             }
             info.sheet.resumeEvent();
             info.sheet.resumePaint();
@@ -459,6 +523,13 @@ projectGljObject={
             projectGLJ.pGljUpdate(updateData,callback);
         };
     },
+    refreshProjectGljRowByID:function (ID,row) {//row 可以不传,如果row 和 index 相等就不刷新
+        let me = this;
+        let index = _.findIndex(me.projectGljSheetData, { 'id': ID});
+        if(index>=0&&index != row){
+            me.refreshProjectGljRow(index);
+        }
+    },
     getSupplyQuantity : function(supplyType, quantity) {
         // 自行采购和甲定乙供则把甲供数量设置为0,其余情况则设置为当前总消耗量
         let supplyQuantity = supplyType == 0 || supplyType == 3 ? 0 : quantity;
@@ -561,6 +632,7 @@ $(function () {
         //projectObj.project.projectGLJ.calcQuantity(); 在工程量有更新的地方调用
 
         me.showProjectGljData();
+        me.initMixRatio();
         loadSize(pojGljResizeEles, 'height', function () {
             me.projectGljSpread.refresh();
             me.mixRatioSpread?me.mixRatioSpread.refresh():'';
@@ -698,6 +770,15 @@ $(function () {
             $("#unitFile-save-as").modal("hide");
         });
     });
+
+    $("#filterType").on("click","ul li a",function(){
+        let me = projectGljObject;
+        me.displayType = filterType[this.id];
+        me.showProjectGljData();
+        me.showMixRatioData();
+        console.log(this.id);
+    });
+
 });