فهرست منبع

“输出最高限价”、“最高限价” 和部分导出接口信息

zhangweicheng 6 سال پیش
والد
کامیت
aedc5e5921

+ 1 - 0
config/gulpConfig.js

@@ -110,6 +110,7 @@ module.exports = {
         'web/building_saas/main/js/models/cache_tree.js',
         'web/building_saas/main/js/calc/calc_fees.js',
         'web/building_saas/main/js/models/exportStandardInterface.js',
+        'web/building_saas/main/js/models/exportSEIInterface.js',
         // 'web/building_saas/main/js/calc/ration_calc.js',
         // 'web/building_saas/main/js/calc/bills_calc.js',
         // 'public/calc_util.js',

+ 2 - 0
modules/all_models/bills.js

@@ -65,6 +65,8 @@ let billsSchema = new Schema({
     deleteInfo: deleteSchema,
     isEstimate:{type: Number,default:0},       // 1 true 0 false 是否暂估
     mainBills:{type:Schema.Types.Mixed,default:false},//true 是,false否,null 不确定,三个状态
+    outPutMaxPrice:{type:Schema.Types.Mixed,default:false},//输出最高限价 true 是,false否,null 不确定,三个状态
+    maxPrice:String,//最高限价
     remark:String,
     engineeringContent:String,//工程内容
     serviceContent:String,//服务内容

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

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

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

@@ -9,7 +9,8 @@ module.exports = {
     calcInstallationFee:calcInstallationFee,
     saveProperty: saveProperty,
     getDefaultColSetting: getDefaultColSetting,
-    markProjectsToChange:markProjectsToChange
+    markProjectsToChange:markProjectsToChange,
+    getSEIProjects:getSEIProjects
 };
 
 let mongoose = require('mongoose');
@@ -274,4 +275,64 @@ function saveProperty(data, callback){
 
 async function getDefaultColSetting(libID){
     return await stdColSettingModel.findOne({ID: libID, deleted: false}, '-_id main_tree_col');
+}
+
+function sortChildren(lists) {
+    let IDMap ={},nextMap = {}, firstNode = null,newList=[];
+    for(let l of lists){
+        if(l.children&&l.children.length > 0) l.children = sortChildren(l.children);//递规排序
+        IDMap[l.ID] = l;
+        if(l.NextSiblingID!=-1) nextMap[l.NextSiblingID] = l;
+    }
+    for(let t of lists){
+        if(!nextMap[t.ID]){ //如果在下一节点映射没找到,则是第一个节点
+            firstNode = t;
+            break;
+        }
+    }
+    if(firstNode){
+        newList.push(firstNode);
+        delete IDMap[firstNode.ID];
+        setNext(firstNode,newList);
+    }
+    //容错处理,如果链断了的情况,直接添加到后面
+    for(let key in IDMap){
+        if(IDMap[key]) newList.push(IDMap[key])
+    }
+    return newList;
+
+    function setNext(node,array) {
+        if(node.NextSiblingID != -1){
+            let next = IDMap[node.NextSiblingID];
+            if(next){
+                array.push(next);
+                delete IDMap[next.ID];
+                setNext(next,array);
+            }
+        }
+    }
+
+}
+
+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 engineers = [];
+    for(let e of tem_e){
+        if(!e.deleteInfo || !e.deleteInfo.deleted){
+            let tenders =  await projectsModel.find({ParentID:e.ID});
+            let children = [];
+            for(let t of tenders){
+                if(!t.deleteInfo || !t.deleteInfo.deleted){
+                    children.push(t);
+                }
+            }
+            e._doc.children = children;
+            engineers.push(e);
+        }
+    }
+    engineers = sortChildren(engineers);
+    project._doc.children = engineers;
+    return project;
 }

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

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

+ 1 - 1
public/web/tree_sheet/tree_sheet_helper.js

@@ -181,7 +181,7 @@ var TREE_SHEET_HELPER = {
                 var cell = sheet.getCell(iRow, iCol, GC.Spread.Sheets.SheetArea.viewport);
                 if (colSetting.data.getText && Object.prototype.toString.apply(colSetting.data.getText) === "[object Function]") {
                     cell.value(colSetting.data.getText(node));
-                }else if(colSetting.data.field=="mainBills"&&MainTreeCol.mainBillsEnable(node)){//主要清单有三种状态,所以直接显示就好,不走最后的逻辑
+                }else if((colSetting.data.field=="mainBills"||colSetting.data.field=="outPutMaxPrice")&&MainTreeCol.mainBillsEnable(node)){//主要清单有三种状态,所以直接显示就好,不走最后的逻辑
                     cell.value(node.data[colSetting.data.field]===undefined?false:node.data[colSetting.data.field]);
                 } else {
                     cell.value(getFieldText2());

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

@@ -146,6 +146,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>-->
                   <div class="side-tabs">
                       <ul class="nav nav-tabs" role="tablist">
                          <!-- <li class="nav-item">
@@ -2086,6 +2087,7 @@
     <script type="text/javascript" src="/web/building_saas/main/js/models/cache_tree.js"></script>
     <script type="text/javascript" src="/web/building_saas/main/js/calc/calc_fees.js"></script>
     <script type="text/javascript" src="/web/building_saas/main/js/models/exportStandardInterface.js"></script>
+    <script type="text/javascript" src="/web/building_saas/main/js/models/exportSEIInterface.js"></script>
     <!--<script type="text/javascript" src="/web/building_saas/main/js/calc/ration_calc.js"></script>-->
     <!--<script type="text/javascript" src="/web/building_saas/main/js/calc/bills_calc.js"></script>-->
     <!--<script type="text/javascript" src="/public/calc_util.js"></script>-->

+ 226 - 0
web/building_saas/main/js/models/exportSEIInterface.js

@@ -0,0 +1,226 @@
+/**
+ * Created by zhang on 2019/5/20.
+ */
+async function exportSEI(projectID) {
+
+    let tenderProjects = [];
+
+    let result = await ajaxPost("/project/getSEIProjects",{projectID:projectID});
+    console.log(result);
+    let project = getProject(result);
+
+    prepareTenderDatas(tenderProjects,project);
+
+
+
+    toXml(project);
+
+
+
+
+
+
+    function getProject(orignal) {//取建设项目信息
+        let basicInformation = getBaseInfo(orignal);
+        let project = {
+            name: "建设项目",
+            attrs: [
+                {name: "项目名称", value: orignal.name},
+                {name:"建设单位",value:getItemValueBykey(basicInformation.items,"constructionUnit")},
+                {name:"施工单位",value:getItemValueBykey(basicInformation.items,"buildingUnit")},
+                {name: "标准名称", value: "重庆市建设工程造价指标采集标准(清单计价)"},
+                {name: "标准版本号", value: "1.1"}
+            ],
+            basicInformation:basicInformation,
+            children:[]
+        };
+        initAtts(project.attrs);
+        for(let c of orignal.children){
+            project.children.push(getEngineering(c));
+        }
+        return project;
+    }
+
+    function getEngineering(source){
+        let engineer = {
+            name:"单项工程",
+            attrs:[
+                {name: "名称", value: source.name}
+            ],
+            children:[]
+        };
+
+        for(let c of source.children){
+            let tenderProject = getTender(c);
+            engineer.children.push(tenderProject);
+            tenderProjects.push(tenderProject);
+        }
+        return engineer
+    };
+
+    function getTender(source) {
+        let tender = {
+            ID:source.ID,
+            name:"单位工程",
+            attrs:[
+                {name: "名称", value: source.name}
+            ],
+            children:[],
+            valuationType:source.property.valuationType,
+            taxType:source.property.taxType
+        };
+        return tender;
+    }
+
+
+    function prepareTenderDatas(tenders,project) {
+        for(let t of tenders){
+            setTenderData(t,project);
+        }
+
+
+
+
+    }
+
+
+
+    function setTenderData(tender,project) {
+
+        tender.children.push(setEngineerInfo(tender,project));
+
+
+
+    }
+
+    function setEngineerInfo(tender,project) {
+        let baseInfo = project.basicInformation;
+        let calcType ={"bill":"工程量清单计价","ration":"定额计价"};
+        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:""}
+
+            ]
+        };
+        initAtts(info.attrs);
+        return info;
+    }
+//造价编制单位="" 造价审核单位="" 项目负责人="" 施工单位编制人员="" 编制人员="" 审核人员="" 开工日期="" 竣工日期="" 工程地点="" 工程类型="" 合同价类型="" 造价类型="" 计价方式及依据="" 工程类别="" 编制日期="" 计税方法="一般计税"
+
+    function getBaseInfo(project){
+        let basicInformation = {items:[]};
+        let tem = null;
+        if(project.property&&project.property.basicInformation) tem =_.find(project.property.basicInformation,{"key":"basicInfo"});
+        if(tem) basicInformation = tem;
+        return basicInformation;
+    }
+
+
+    function getItemValueBykey(items,key) {
+        let item = _.find(items,{"key":key});
+        if(item) return item.value;
+        return ""
+    }
+
+    function initAtts(arrs) {
+        _.remove(arrs,function (item) {
+            return item.required == false && _.isEmpty(item.value)
+        })
+    }
+
+    //开始标签
+    function startTag(ele) {
+        let rst = `<${ele.name}`;
+        for (let attr of ele.attrs) {
+            rst += ` ${attr.name}="${attr.value}"`;
+        }
+        rst += ele.children&&ele.children.length > 0 ? '>' : '/>';
+        return rst;
+    }
+    //结束标签
+    function endTag(ele) {
+        return `</${ele.name}>`;
+    }
+    //拼接成xml字符串
+    function toXMLStr(eles) {
+        let rst = '';
+        for (let ele of eles) {
+            rst += startTag(ele);
+            if (ele.children&& ele.children.length > 0) {
+                rst += toXMLStr(ele.children);
+                rst += endTag(ele);
+            }
+        }
+        return rst;
+    }
+    //格式化xml字符串
+    function formatXml(text) {
+        //去掉多余的空格
+        text = '\n' + text.replace(/>\s*?</g, ">\n<");
+        //调整格式
+        let rgx = /\n(<(([^\?]).+?)(?:\s|\s*?>|\s*?(\/)>)(?:.*?(?:(?:(\/)>)|(?:<(\/)\2>)))?)/mg;
+        let nodeStack = [];
+        let output = text.replace(rgx, function($0, all, name, isBegin, isCloseFull1, isCloseFull2, isFull1, isFull2){
+            let isClosed = (isCloseFull1 === '/') || (isCloseFull2 === '/' ) || (isFull1 === '/') || (isFull2 === '/');
+            let prefix = '';
+            if (isBegin === '!') {
+                prefix = getPrefix(nodeStack.length);
+            } else {
+                if (isBegin !== '/') {
+                    prefix = getPrefix(nodeStack.length);
+                    if (!isClosed) {
+                        nodeStack.push(name);
+                    }
+                } else {
+                    nodeStack.pop();
+                    prefix = getPrefix(nodeStack.length);
+                }
+            }
+            let ret =  '\n' + prefix + all;
+            return ret;
+        });
+        let outputText = output.substring(1);
+        return outputText;
+        function getPrefix(prefixIndex) {
+            let span = '    ';
+            let output = [];
+            for (let i = 0 ; i < prefixIndex; ++i) {
+                output.push(span);
+            }
+            return output.join('');
+        }
+    }
+    /*
+     * 导出数据
+     * @param {Number}tenderID(当前界面的单位工程ID,后台根据这个单位工程,根据导出粒度去找其建设项目下相关数据)
+     * @return {void}
+     * */
+     function toXml(eleData) {
+         //转换成xml字符串
+         let xmlStr = toXMLStr([eleData]);
+         //加上xml声明
+         xmlStr = `<?xml version="1.0" encoding="utf-8"?>${xmlStr}`;
+         //格式化
+         xmlStr = formatXml(xmlStr);
+         let blob = new Blob([xmlStr], {type: 'text/plain;charset=utf-8'});
+         saveAs(blob, '经济指标.ZBF');
+     }
+
+}
+

+ 16 - 15
web/building_saas/main/js/models/project.js

@@ -397,15 +397,13 @@ var PROJECT = {
             }
             return true;
         };
-        project.prototype.updateMainBills = function(node,newval){
+        project.prototype.updateCasCadeBills = function(node,newval,fieldName){
             let datas = [];
             let data =  {
                 type:node.sourceType,
-                data:{
-                    ID:node.data.ID,
-                    mainBills:newval
-                }
+                data:{ID:node.data.ID}
             };
+            setData(data.data,newval,fieldName);
             datas.push(data);
             setChildren(node,newval,datas);//同步设置所有子项
             setParent(node,newval,datas);//设置父节点
@@ -415,7 +413,10 @@ var PROJECT = {
                 for(let d of datas){
                     let node = projectObj.project.mainTree.findNode(d.data.ID);
                     if(node){
-                        node.data.mainBills = d.data.mainBills;
+                        for(let key in d.data){
+                            if(key == 'ID') continue;
+                            node.data[key] = d.data[key];
+                        }
                         nodes.push(node)
                     }
                 }
@@ -428,11 +429,9 @@ var PROJECT = {
                     for(let c of pnode.children){
                         let data =  {
                             type:c.sourceType,
-                            data:{
-                                ID:c.data.ID,
-                                mainBills:newValue
-                            }
+                            data:{ID:c.data.ID}
                         };
+                        setData(data.data,newval,fieldName);
                         datas.push(data);
                         setChildren(c,newValue,datas)
                     }
@@ -443,7 +442,7 @@ var PROJECT = {
                 if(cnode.parent && !projectObj.project.Bills.isMeasureNode(cnode.parent)){//排除措施项目节点
                     for(b of cnode.parent.children){
                         if(b == cnode) continue
-                        if(b.data.mainBills!== newValue){//有兄弟节点的值和本节点不一样,则父节点设置为null
+                        if(b.data[fieldName]!== newValue){//有兄弟节点的值和本节点不一样,则父节点设置为null
                             diferrent = true;
                             break;
                         }
@@ -451,15 +450,17 @@ var PROJECT = {
                     let pvalue = diferrent === true?null:newValue;
                     let data =  {
                         type:cnode.parent.sourceType,
-                        data:{
-                            ID:cnode.parent.data.ID,
-                            mainBills:pvalue
-                        }
+                        data:{ID:cnode.parent.data.ID}
                     };
+                    setData(data.data,pvalue,fieldName);
                     datas.push(data);
                     setParent(cnode.parent,pvalue,datas);
                 }
             }
+            function setData(data,avalue,fieldName) {
+                data[fieldName] = avalue;
+                if(fieldName == "outPutMaxPrice") data.maxPrice = null;
+            }
 
         };
 

+ 13 - 1
web/building_saas/main/js/views/main_tree_col.js

@@ -69,6 +69,13 @@ let MainTreeCol = {
                 if (rate) return rate.rate;
             }
             return node.data.feeRate;
+        },
+        maxPrice:function (node) {
+            if(node.data.outPutMaxPrice == true){
+                if(node.data.maxPrice === null&&node.data.feesIndex &&node.data.feesIndex.common) return node.data.feesIndex.common.totalFee;
+                return node.data.maxPrice;
+            }
+            return "";
         }
     },
     readOnly: {
@@ -130,7 +137,6 @@ let MainTreeCol = {
             }
             return false;
         },
-
         //根据节点、父节点类型判断是否可用计算基数
         calcBaseType: function (node) {
             function isDef(v) {
@@ -264,6 +270,9 @@ let MainTreeCol = {
                 }
             }
             return true;
+        },
+        maxPrice:function (node) {
+            return node.data.outPutMaxPrice!==true;
         }
     },
     cellType: {
@@ -357,6 +366,9 @@ let MainTreeCol = {
         },
         mainBills:function (node) {
             if(MainTreeCol.mainBillsEnable(node)) return sheetCommonObj.getCheckBox(true);
+        },
+        outPutMaxPrice:function (node) {
+            if(MainTreeCol.mainBillsEnable(node)) return sheetCommonObj.getCheckBox(true);
         }
     },
     mainBillsEnable:function (node) {

+ 17 - 5
web/building_saas/main/js/views/project_view.js

@@ -540,6 +540,9 @@ var projectObj = {
                 project.calcProgram.calcAndSave(node);
             } else {
                 if (node.sourceType === project.Bills.getSourceType()) {
+                    if(fieldName == "maxPrice"){
+                        value = scMathUtil.roundToString(value,getDecimal("totalPrice", node))
+                    }
                     project.Bills.updateField(node.source, fieldName, value, false);
                 } else if (node.sourceType === project.Ration.getSourceType()) {
                     project.Ration.updateField(node.source, fieldName, value);
@@ -958,7 +961,7 @@ var projectObj = {
 
                     // 综合单价、综合合价,小数部分应补0对齐。  CSL
                     // if (col.data.field.hasSubStr("common")){
-                        if (col.data.field.hasSubStr(".totalFee"))
+                        if (col.data.field.hasSubStr(".totalFee")||col.data.field.hasSubStr("maxPrice"))
                             col.data.formatter = MainTreeCol.getNumberFormatter(decimalObj.ration.totalPrice, true);
                         else if (col.data.field.hasSubStr(".unitFee"))
                             col.data.formatter = MainTreeCol.getNumberFormatter(decimalObj.ration.unitPrice, true);
@@ -1734,10 +1737,9 @@ var projectObj = {
             projectObj.onIsEstimateClick(node,info);
         }else if(fieldName == "evaluationProject"){
             projectObj.onEvaluationProjectClic(node,info);
-        }else if(fieldName == "mainBills"){
-            projectObj.onMainBillsClick(node,info);
+        }else if(fieldName == "mainBills"||fieldName == "outPutMaxPrice"){
+            projectObj.onCasCadeButtonClick(node,info,fieldName);
         }
-
     },
     onEvaluationProjectClic:function (node,info) {
         let checkboxValue = info.sheet.getCell(info.row, info.col).value();
@@ -1767,7 +1769,7 @@ var projectObj = {
             projectObj.project.projectGLJ.pGljUpdate(updateData);
         }
     },
-    onMainBillsClick:function (node,info) {//清单有三种状态,true,false,null。 打勾:true, 不打勾 false 子项有打勾和不打勾的情况 null
+   /* onMainBillsClick:function (node,info) {//清单有三种状态,true,false,null。 打勾:true, 不打勾 false 子项有打勾和不打勾的情况 null
         let checkboxValue = info.sheet.getCell(info.row, info.col).value();
         let cell = info.sheet.getCell(info.row, info.col), newval = true;
         if (checkboxValue == true) {
@@ -1776,6 +1778,16 @@ var projectObj = {
             newval = true;
         }
         projectObj.project.updateMainBills(node,newval);
+    },*/
+    onCasCadeButtonClick:function (node,info,fieldName) {
+        let checkboxValue = info.sheet.getCell(info.row, info.col).value();
+        let cell = info.sheet.getCell(info.row, info.col), newval = true;
+        if (checkboxValue == true) {
+            newval = false;
+        } else {
+            newval = true;
+        }
+        projectObj.project.updateCasCadeBills(node,newval,fieldName);
     },
     onSubcontractClick:function (node) {//点击分包费checkbox
         if (node.data.isSubcontract) node.data.isSubcontract = false;