zhangweicheng 6 лет назад
Родитель
Сommit
4fb4f898fe

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

@@ -325,7 +325,7 @@ function sortChildren(lists) {
 async  function getSEIProjects(projectID) {
     let project = await  projectsModel.findOne({ID:projectID});
     if(!project) throw new Error(`找不到建设项目:${projectID}`);
-    let tem_e = await projectsModel.find({ParentID:4061});
+    let tem_e = await projectsModel.find({ParentID:project.ID});
     let engineers = [];
     for(let e of tem_e){
         if(!e.deleteInfo || !e.deleteInfo.deleted){

+ 2 - 1
public/web/PerfectLoad.js

@@ -91,7 +91,8 @@ const SCComponent = (() => {
     * 假滚动条,0 - 80% 快, 80% - 95%很慢,95%开始停住,直到调用end方法
     * */
     const InitProgressBar = (() => {
-        function ProgressBar($modal, $title, $content, $bar) {
+        function ProgressBar($modal = $('#progress'), $title = $('#progress-title'),
+                             $content = $('#progress-content'), $bar = $('#progressBar')) {
             this.$modal = $modal;
             this.$title = $title;
             this.$content = $content;

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

@@ -98,9 +98,9 @@
                     </span>
                       <span id="exportSpan" class="btn btn-light btn-sm" data-toggle="tooltip" data-original-title="数据接口" data-placement="bottom">
                     <a class="dropdown-toggle" href="#" data-toggle="dropdown"><i class="fa  fa-code-fork"></i></a>
-                    <div class="dropdown-menu">
+                    <div class="dropdown-menu" id="exportMenu">
                         <a class="dropdown-item" href="#export" data-toggle="modal" data-target="#export">重庆市电子招投标数据接口</a>
-                        <a class="dropdown-item" href="#">重庆其他电子招投标数据接口</a>
+                        <a class="dropdown-item" href="javascript:void(0)" id="SEIMenu"  >重庆其他电子招投标数据接口</a>
                     </div>
                 </span>
                     <a href="javascript:void(0)" class="btn btn-light btn-sm" id="insertRation" data-toggle="tooltip" data-placement="bottom" data-original-title="插入定额"><i class="fa fa-sign-in" aria-hidden="true"></i></a>
@@ -155,7 +155,6 @@
                       <% } %>
                       <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>
                   <div class="side-tabs">
                       <ul class="nav nav-tabs" role="tablist">
                          <!-- <li class="nav-item">

+ 86 - 24
web/building_saas/main/js/models/exportSEIInterface.js

@@ -85,24 +85,74 @@ let exportUtil = {
         let areas = exportUtil.getBuildArea(projectObj.project.property.engineerFeatures);
         let f = _.find(projectObj.project.property.engineerFeatures,{index:true});
         return f?exportUtil.calcUnitB(total,areas,f.coe):exportUtil.calcUnitB(total,areas);
+    },
+    getIndexBills:function (bills) {
+        let parentMap = {},datas = [],totalCost = 0;
+        let FBFX_b = null,teh_b = null,costNode=null;
+        for(let b of bills) {
+            parentMap[b.ParentID] ? parentMap[b.ParentID].push(b) : parentMap[b.ParentID] = [b];//有添加,无则生成
+            if(b.flags && b.flags.length > 0){
+                let f = _.find(b.flags,{"fieldName":"fixed"});
+                if(!f) continue;
+                if(f.flag == fixedFlag.SUB_ENGINERRING) FBFX_b = b;//过滤出分部分项工程;
+                if(f.flag == fixedFlag.CONSTRUCTION_TECH) teh_b = b;//过滤出技术措施项目;
+                if(f.flag == fixedFlag.ENGINEERINGCOST) costNode = b;//过滤出技术措施项目;
+
+            }
+        }
+        if(FBFX_b) getChildren(FBFX_b,parentMap,datas);
+        if(teh_b) getChildren(teh_b,parentMap,datas);
+        if(costNode) totalCost = exportUtil.getTotalFee(costNode);
+
+        for(let td of datas){
+            if(parentMap[td.ID]){
+                td.economicType = "";
+                td.quantityIndexType = "";
+                td.quantityIndexUnit = "";
+                td.quantityIndexCoe = "";
+            }
+        }
+        return [datas,totalCost];
+
+        function getChildren(d,map,arr) {
+            let tem = {
+                ID:d.ID,
+                ParentID:d.ParentID,
+                code:d.code,
+                name:d.name,
+                unit:d.unit,
+                quantity:d.quantity,
+                totalFee:exportUtil.getTotalFee(d),
+                economicType:d.economicType,
+                quantityIndexType:d.quantityIndexType,
+                quantityIndexUnit:d.quantityIndexUnit,
+                quantityIndexCoe:d.quantityIndexCoe,
+            };
+            arr.push(tem);
+            if(map[d.ID]){
+                for(let s of map[d.ID]){
+                    getChildren(s,map,arr)
+                }
+            }
+        }
     }
 };
 
 async function exportSEI(projectID) {
 
     let tenderProjects = [];
-
     let result = await ajaxPost("/project/getSEIProjects",{projectID:projectID});
+    let pr = new SCComponent.InitProgressBar($('#progress'), $('#progress-title'), $('#progress-content'), $('#progressBar'));
+    pr.start('导出数据接口', '正在导出文件,请稍候……');
     console.log(result);
     let project = getProject(result);
 
     await prepareTenderDatas(tenderProjects,project);
 
 
-
     toXml(project);
 
-
+    pr.end();
 
 
 
@@ -173,7 +223,7 @@ 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(setEngineerInfo(tender));//设置工程信息
         tender.children.push(setEngineerIndex(tender,projectData));
         tender.children.push(await setGLJSummy(tender,projectData));
        //
@@ -235,35 +285,33 @@ async function exportSEI(projectID) {
 
 
 
-    function setEngineerInfo(tender,project) {//设置工程信息
-        let baseInfo = project.basicInformation;
-        let calcType ={"bill":"工程量清单计价","ration":"定额计价"};
+    function setEngineerInfo(tender) {//设置工程信息
+        let infos = tender.property.engineerInfos?tender.property.engineerInfos:[];
         let info = {
             name:"工程信息",
             attrs:[
-                {name:"造价编制单位",value:getItemValueBykey(baseInfo.items,"establishmentUnit")},
-                {name:"造价审核单位",value:getItemValueBykey(baseInfo.items,"auditUnit")},
-                {name:"项目负责人",value:""},
-                {name:"施工单位编制人员",value:""},
-                {name:"编制人员",value:""},
-                {name:"审核人员",value:""},
-                {name:"开工日期",value:""},
-                {name:"竣工日期",value:""},
-                {name:"工程地点",value:""},
-                {name:"工程类型",value:""},
-                {name:"合同价类型",value:""},
-                {name:"造价类型",value:""},
-                {name:"计价方式及依据",value:calcType[tender.valuationType]},
-                {name:"工程类别",value:""},
-                {name:"编制日期",value:""},
-                {name:"审查日期",value:""}
+                {name:"造价编制单位",value:getItemValueByDispName(infos,"造价编制单位")},
+                {name:"造价审核单位",value:getItemValueByDispName(infos,"造价审核单位")},
+                {name:"项目负责人",value:getItemValueByDispName(infos,"项目负责人")},
+                {name:"施工单位编制人员",value:getItemValueByDispName(infos,"施工单位编制人员")},
+                {name:"编制人员",value:getItemValueByDispName(infos,"编制人员")},
+                {name:"审核人员",value:getItemValueByDispName(infos,"审核人员")},
+                {name:"开工日期",value:getItemValueByDispName(infos,"开工日期")},
+                {name:"竣工日期",value:getItemValueByDispName(infos,"竣工日期")},
+                {name:"工程地点",value:getItemValueByDispName(infos,"工程地点")},
+                {name:"工程类型",value:getItemValueByDispName(infos,"工程类型")},
+                {name:"合同价类型",value:getItemValueByDispName(infos,"合同价类型")},
+                {name:"造价类型",value:getItemValueByDispName(infos,"造价类型")},
+                {name:"计价方式及依据",value:getItemValueByDispName(infos,"计价方式及依据")},
+                {name:"工程类别",value:getItemValueByDispName(infos,"工程类别")},
+                {name:"编制日期",value:getItemValueByDispName(infos,"编制日期")},
+                {name:"审查日期",value:getItemValueByDispName(infos,"审查日期")}
 
             ]
         };
         initAtts(info.attrs);
         return info;
     }
-//造价编制单位="" 造价审核单位="" 项目负责人="" 施工单位编制人员="" 编制人员="" 审核人员="" 开工日期="" 竣工日期="" 工程地点="" 工程类型="" 合同价类型="" 造价类型="" 计价方式及依据="" 工程类别="" 编制日期="" 计税方法="一般计税"
 
     function getBaseInfo(project){
         let basicInformation = {items:[]};
@@ -279,6 +327,11 @@ async function exportSEI(projectID) {
         if(item) return item.value;
         return ""
     }
+    function getItemValueByDispName(items,dispName) {
+        let item = _.find(items,{"dispName":dispName});
+        if(item) return item.value;
+        return ""
+    }
 
     function initAtts(arrs) {
         _.remove(arrs,function (item) {
@@ -366,3 +419,12 @@ async function exportSEI(projectID) {
 
 }
 
+$(function () {
+   $("#SEIMenu").click(async function () {
+
+
+       await exportSEI(projectObj.project.property.rootProjectID)
+       $("#exportMenu").removeClass("show");
+   })
+
+});

+ 77 - 16
web/building_saas/main/js/views/index_view.js

@@ -77,7 +77,7 @@ let indexObj= {
             {headerName: "编码", headerWidth: 200, dataCode: "code", dataType: "String"},
             {headerName: "名称", headerWidth: 160, dataCode: "name", dataType: "String"},
             {headerName: "单位", headerWidth: 45, dataCode: "unit", hAlign: "center", dataType: "String"},
-            {headerName: "工程量", headerWidth: 90, dataCode: "quantity", hAlign: "right", dataType: "Number",decimalField:'glj.quantity'},
+            {headerName: "工程量", headerWidth: 90, dataCode: "quantity", hAlign: "right", dataType: "Number"},
             {headerName: "综合单价", headerWidth: 70, dataCode: "unitFee", hAlign: "right", dataType: "Number",validator:"number"},//,decimalField:"glj.unitPrice"
             {headerName: "综合合价", headerWidth: 120, dataCode: "totalFee", hAlign: "right", dataType: "Number",validator:"number"},//,decimalField:"glj.unitPrice"
             {headerName: "工程经济指标类别", headerWidth: 120, dataCode: "economicType", hAlign: "center", dataType: "String",cellType:'comboBox',options:[]},
@@ -116,7 +116,8 @@ let indexObj= {
         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.bind(GC.Spread.Sheets.Events.ValueChanged, this.onEngineerInfoValueChange);
+        sheet.bind(GC.Spread.Sheets.Events.RangeChanged, this.onEngineerInfoRangeChange);
         sheet.name('engineerInfo');
         //sheet.setRowHeight(0, 36, 1);
     },
@@ -124,7 +125,8 @@ let indexObj= {
         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.ValueChanged, this.oEngineerFeatureValueChange);
+        sheet.bind(GC.Spread.Sheets.Events.RangeChanged, this.onEngineerFeatureRangeChange); //
         sheet.bind(GC.Spread.Sheets.Events.SelectionChanged,this.onSelectionChange);
 
         function getDatas() {
@@ -272,21 +274,20 @@ let indexObj= {
     showEconomic:function () {
         this.spread.setActiveSheetIndex(4);
         let sheet = this.spread.getActiveSheet();
-        let economicDatas = this.getEconomicDatas();
+        let economicDatas = this.getEconomicDatas(projectObj.project.property.economics,projectObj.project.Bills.datas);
         sheetCommonObj.showData(sheet, this.economicSetting,economicDatas);
         sheet.setRowCount(economicDatas.length);
     },
     showQuantity:function () {
         this.spread.setActiveSheetIndex(5);
         let sheet = this.spread.getActiveSheet();
-        let quantityDatas = this.getQuantityDatas();
+        let quantityDatas = this.getQuantityDatas(projectObj.project.property.mainQuantities,projectObj.project.Bills.datas);
         sheetCommonObj.showData(sheet, this.quantitySetting,quantityDatas);
         sheet.setRowCount(quantityDatas.length);
     },
-    getQuantityDatas:function () {
+    getQuantityDatas:function (mainQuantities,billsList) {
         let datas = [];
-        let mainQuantities = projectObj.project.property.mainQuantities;
-        let bills = this.getIndexBillsData({});
+        let [bills,totalFee] = exportUtil.getIndexBills(billsList);
         let billsGroup = _.groupBy(bills,'quantityIndexType');
         if(!mainQuantities) return datas;
         for(let m of mainQuantities){
@@ -312,12 +313,10 @@ let indexObj= {
         
         return datas;
     },
-    getEconomicDatas:function () {
+    getEconomicDatas:function (economics,billsList) {
         let datas = [];
-        let economics = projectObj.project.property.economics;
-        let bills = this.getIndexBillsData({});
+        let [bills,totalFee] = exportUtil.getIndexBills(billsList);
         let billsGroup = _.groupBy(bills,'economicType');
-        let totalFee = projectObj.project.Bills.getEngineeringCost();
         if(!economics) return datas;
         for(let e of economics){
             let tem = {
@@ -387,12 +386,12 @@ let indexObj= {
         this.spread.setActiveSheetIndex(6);
         let sheet = this.spread.getActiveSheet();
         let sel = sheet.getSelections()[0];
-        let oldData = sel.row<this.ecoQuantityDatas.length?this.ecoQuantityDatas[sel.row]:"";
+        let oldData = sel.row<this.ecoQuantityDatas.length?this.ecoQuantityDatas[sel.row]:null;
         this.ecoQuantityDatas = this.getIndexBillsData(parentMap);
         sheet.setRowCount(0);
         sheet.setRowCount(this.ecoQuantityDatas.length);
         sheetCommonObj.showTreeData(sheet, this.ecoQuantitySetting,this.ecoQuantityDatas);
-        sel.row = oldData?_.findIndex(this.ecoQuantityDatas,{'ID':oldData.ID}):'';
+        sel.row = oldData?_.findIndex(this.ecoQuantityDatas,{'ID':oldData.ID}):0;
         sheet.setSelection(sel.row==-1?0:sel.row,sel.col,sel.rowCount,sel.colCount);
 
         for(let row =0 ;row < this.ecoQuantityDatas.length;row ++){//锁定父清单
@@ -448,12 +447,12 @@ let indexObj= {
         this.spread.setActiveSheetIndex(7);
         let sheet = this.spread.getActiveSheet();
         let sel = sheet.getSelections()[0];
-        let oldData = sel.row<this.materialDatas.length?this.materialDatas[sel.row]:"";
+        let oldData = sel.row<this.materialDatas.length?this.materialDatas[sel.row]:null;
         this.materialDatas = getMaterialData();
         sheetCommonObj.showData(sheet, this.materialSetting,this.materialDatas );
         sheet.setRowCount(this.materialDatas .length);
 
-        sel.row = oldData?_.findIndex(this.materialDatas,{'id':oldData.id}):'';
+        sel.row = oldData?_.findIndex(this.materialDatas,{'id':oldData.id}):0;
         sheet.setSelection(sel.row==-1?0:sel.row,sel.col,sel.rowCount,sel.colCount);
         function getMaterialData() {
             let datas = [];
@@ -509,7 +508,69 @@ let indexObj= {
         let data = indexObj.getEcoQuantityUpdateData(recode,dataCode,value);
         projectObj.project.updateNodesAndRefresh([data],indexObj.showDatas)
     },
+    onEngineerInfoValueChange:function (sender,info) {
+        let value = info.newValue;
+        info.sheet.tag(value);
+        var date = info.sheet.tag();
+        // formatDate(new Date(v), 'yyyy-MM-dd');
+        //v = formatDate(new Date(v), 'yyyy-MM-dd');
+        let infos = projectObj.project.property.engineerInfos;
+        let data = indexObj.getNewPropertyData([{row:info.row,value:value}],infos);
+        if(!data) return indexObj.showDatas();
+        indexObj.updateProjectProperty(data,"engineerInfos");
+    },
+    oEngineerFeatureValueChange:function(sender,info){
+        let value = info.newValue;
+        let features = projectObj.project.property.engineerFeatures;
+        let data = indexObj.getNewPropertyData([{row:info.row,value:value}],features);
+        if(!data) return indexObj.showDatas();
+        indexObj.updateProjectProperty(data,"engineerFeatures");
+    },
+    onEngineerFeatureRangeChange:function (sender,info) {
+        let features = projectObj.project.property.engineerFeatures;
+        let datas = [];
+        for(let c of info.changedCells){
+            let value =  info.sheet.getCell(c.row, c.col).text();
+            datas.push({row:c.row,value:value})
+        }
+        let data = indexObj.getNewPropertyData(datas,features);
+        if(!data) return indexObj.showDatas();
+        indexObj.updateProjectProperty(data,"engineerFeatures");
+    },
+    onEngineerInfoRangeChange:function (sender,info) {
+        let infos = projectObj.project.property.engineerInfos;
+        let datas = [];
+        for(let c of info.changedCells){
+            let value =  info.sheet.getCell(c.row, c.col).text();
+            datas.push({row:c.row,value:value})
+        }
+        let data = indexObj.getNewPropertyData(datas,infos);
+        if(!data) return indexObj.showDatas();
+        indexObj.updateProjectProperty(data,"engineerInfos");
+
+    },
+    updateProjectProperty: function(datas,field){
+        let pfield = "property."+field;
+        let tem ={
+            type:'project',
+            data:{ID:projectObj.project.ID()}
+        };
+        tem.data[pfield] = datas;    
+             
+        projectObj.project.updateNodes([tem],function () {
+            projectObj.project.property[field] = datas;
+            indexObj.showDatas();
+        })
 
+    },
+    getNewPropertyData:function (datas,property) {
+        if(!property) return null;
+        property = _.cloneDeep(property);
+        for(let d of datas){
+            if(property[d.row])property[d.row].value = d.value;
+        }
+        return property;
+    },
 
     onMaterialChange:function (sender,info) {
         let value = info.newValue,updateMap = {};