Browse Source

Merge remote-tracking branch 'origin/master'

vian 5 years ago
parent
commit
3fcf641b9e

+ 25 - 2
modules/main/facade/project_facade.js

@@ -495,11 +495,34 @@ async function loadSEIProjectData(projectID) {
     };
     return{bills:bills,rations:rations,ration_gljs:ration_gljs,projectGLJs:projectGLJs}
 }
+//从建设项目中取工程信息默认值
+async function setDefaultInfo(rootProjectID,engineerInfos){
+    let rootProject = await projectsModel.findOne({ID:rootProjectID}).lean();
+    if(rootProject){
+        let baseInfo = _.find(rootProject.property.basicInformation,{key:"basicInfo"});
+        if(!baseInfo) return;
+        let baseMap = {};
+        let attrs = ["工程地点","开工日期","竣工日期","编制日期"];
+        for(let item of baseInfo.items){
+            baseMap[item.dispName] = item;
+        }
+        for(let en of engineerInfos){
+            if(attrs.indexOf(en.dispName) != -1){
+                let key = en.dispName;
+                if(key == "工程地点") key = "工程所在地";
+                en.value = baseMap[key].value;
+            }
+        }
+    }
+}
 
 async function setSEILibData(property){
     if(property.engineerInfoLibID){//工程信息指标
-        let engineerInfo = await engineerInfoLib.findOne({'ID':property.engineerInfoLibID});
-        if(engineerInfo) property.engineerInfos = engineerInfo.info;
+        let engineerInfo = await engineerInfoLib.findOne({'ID':property.engineerInfoLibID}).lean();
+        if(engineerInfo){
+            property.engineerInfos = engineerInfo.info;
+            await setDefaultInfo(property.rootProjectID,property.engineerInfos);
+        }
     }
     if(property.engineerFeatureLibID){//工程特征指标
         let engineerFeature = await engineerFeatureLib.findOne({'ID':property.engineerFeatureLibID});

+ 1 - 0
public/scHintBox.html

@@ -180,6 +180,7 @@
     };
 
     $('#hintBox_form').on('hide.bs.modal', function() {
+        $('#hintBox_caption').removeClass('export-check');
         if($.bootstrapLoading) $.bootstrapLoading.end();
         return;
     });

+ 3 - 0
public/web/sheet/sheet_common.js

@@ -378,6 +378,9 @@ var sheetCommonObj = {
                 val = setting.getText[setting.header[col].getText](data[row],val)
             }
             sheet.setValue(row, col, val, ch);
+            if(data[row].foreColor && data[row].styleCol == col){
+                sheet.setStyle(row, col, {foreColor: "#ff2a23"});
+            }
         }
         this.setRowStyle(row,sheet,data[row].bgColour);
         if(setting.autoFit==true){//设置自动行高

+ 69 - 14
web/building_saas/main/js/models/exportSEIInterface.js

@@ -29,24 +29,41 @@ let exportUtil = {
 async function exportSEI(projectID) {
 
     let tenderProjects = [];
+    let errorMap = {};
     let result = await ajaxPost("/project/getSEIProjects",{projectID:projectID});
     let pr = new SCComponent.InitProgressBar();
     pr.start('导出数据接口', '正在导出文件,请稍候……');
-    console.log(result);
     let project = getProject(result);
-
     await prepareTenderDatas(tenderProjects,project);
 
 
+    if(!_.isEmpty(errorMap)){
+        showError(errorMap);
+        return pr.end();
+    }
     toXml(project);
 
     pr.end();
 
-
-
+    
+    function showError(errorMap) {
+        let infoList = [];
+        for(let name in errorMap){
+            infoList.push(`<span style="font-weight: bold">单位工程“${name}”下:</span>`);
+            for(let err of errorMap[name]){
+                infoList.push(err);
+            }
+        }
+        if(infoList.length > 20){
+            $('#hintBox_caption').addClass('export-check');
+        }
+        let msg = infoList.join(`<br>`);
+        alert(msg);
+    }
 
     function getProject(orignal) {//取建设项目信息
         let basicInformation = getBaseInfo(orignal);
+        let textTpye =  orignal.property.taxType == 1 ?"一般计税":"简易计税";
         let project = {
             name: "建设项目",
             attrs: [
@@ -54,7 +71,8 @@ async function exportSEI(projectID) {
                 {name:"建设单位",value:getItemValueBykey(basicInformation.items,"constructionUnit")},
                 {name:"施工单位",value:getItemValueBykey(basicInformation.items,"buildingUnit")},
                 {name: "标准名称", value: "重庆市建设工程造价指标采集标准(清单计价)"},
-                {name: "标准版本号", value: "1.1"}
+                {name: "标准版本号", value: "1.1"},
+                {name: "计税模式", value: textTpye}
             ],
             basicInformation:basicInformation,
             children:[]
@@ -93,7 +111,8 @@ async function exportSEI(projectID) {
             children:[],
             valuationType:source.property.valuationType,
             taxType:source.property.taxType,
-            property:source.property
+            property:source.property,
+            name:source.name
         };
         return tender;
     }
@@ -141,6 +160,7 @@ async function exportSEI(projectID) {
             if(projectData) gljUtil.calcProjectGLJQuantity(projectData.projectGLJs,projectData.ration_gljs,projectData.rations,projectData.bills,getDecimal("glj.quantity"),_,scMathUtil);
             let materials = indexObj.getMainMaterialDatas(tender.property.materials,projectData.projectGLJs,tender.property.calcOptions,tender.property.decimal,false,_,scMathUtil);
             for(let m of materials){
+                if(m.name == "其他材料") continue;//2020-01-08  其他材料 不输出字段(不管是否有值)。
                 mainIndex.children.push(getMaterial(m))
             }
             let index = {
@@ -151,8 +171,9 @@ async function exportSEI(projectID) {
             return index;
 
             function getMaterial(m) {
+                let mname = m.exportName?m.exportName:m.name;
                 let material = {
-                    name:m.name,
+                    name:mname,
                     attrs:[
                         {name:"综合单价",value:scMathUtil.roundToString(m.unitPrice,2)},
                         {name:"数量",value:scMathUtil.roundToString(m.quantity,2)},
@@ -184,8 +205,9 @@ async function exportSEI(projectID) {
             return index;
 
             function getQuantity(q) {
+                let qname = q.exportName?q.exportName:q.name;
                 let quantity = {
-                    name:q.name,
+                    name:qname,
                     attrs:[
                         {name:"工程量指标",value:scMathUtil.roundToString(q.quantity,3)},
                         {name:"单位",value:q.quantityIndexUnit}
@@ -213,8 +235,9 @@ async function exportSEI(projectID) {
             return index;
 
             function getEco(e) {
+                let ename = e.exportName?e.exportName:e.name;
                 let eco = {
-                  name:e.name,
+                  name:ename,
                   attrs:[
                       {name:"综合合价",value:scMathUtil.roundToString(e.cost,2)},
                       {name:"单方指标",value:scMathUtil.roundToString(e.unitCost,2)},
@@ -264,13 +287,35 @@ async function exportSEI(projectID) {
                 {name: "备注", value: source.remark}
             ]
         };
+        handleXMLEntity(g.attrs);
         return g;
     }
-
+    // 对每个元素的所有属性值进行特殊字符处理
+    function handleXMLEntity(attrs) {
+        let _xmlEntity = {
+            '&': '&amp;',
+            '\n': '&#xA;',
+            '"': '&quot;',
+            '\'': '&apos;',
+            '<': '&lt;',
+            '>': '&gt;'
+        };
+        for (let attr of attrs) {
+            if (!attr.value) {
+                continue;
+            }
+            for (let [key, value] of Object.entries(_xmlEntity)) {
+                attr.value = attr.value+"";
+                attr.value = attr.value.replace(new RegExp(key, 'g'), value);
+            }
+        }
+    }
 
 
     function setEngineerInfo(tender) {//设置工程信息
         let infos = tender.property.engineerInfos?tender.property.engineerInfos:[];
+        let errors =  infoRequireChecking(infos);
+        if(errors.length > 0) errorMap[tender.name] = errors;
         let info = {
             name:"工程信息",
             attrs:[
@@ -289,8 +334,7 @@ async function exportSEI(projectID) {
                 {name:"计价方式及依据",value:getItemValueByDispName(infos,"计价方式及依据")},
                 {name:"工程类别",value:getItemValueByDispName(infos,"工程类别")},
                 {name:"编制日期",value:getItemValueByDispName(infos,"编制日期")},
-                {name:"审查日期",value:getItemValueByDispName(infos,"审查日期")}
-
+                {name:"审查日期",value:getItemValueByDispName(infos,"审查日期"),required:false}
             ]
         };
         initAtts(info.attrs);
@@ -348,7 +392,7 @@ async function exportSEI(projectID) {
 
         function getValue(node) {
             let value = node.value;
-            if(node.required == true){//必填项的值为空时导出0
+            if(node.required == true || node.cellType == "number"){//必填项的值为空时导出0
                 if(value == undefined || value == null || value == "") value = "0";
             }
             return value;
@@ -367,6 +411,15 @@ async function exportSEI(projectID) {
     }
 
 
+    function infoRequireChecking(items) {
+        let error = [];
+        for(let i of items){
+            if(i.required == true && _.isEmpty(i.value)) error.push(`工程信息 - ${i.dispName}不能为空。`);
+        }
+        return error;
+    }
+
+
     function getItemValueBykey(items,key) {
         let item = _.find(items,{"key":key});
         if(item) return item.value;
@@ -374,7 +427,9 @@ async function exportSEI(projectID) {
     }
     function getItemValueByDispName(items,dispName) {
         let item = _.find(items,{"dispName":dispName});
-        if(item) return item.value;
+        if(item){
+            return item.value;
+        }
         return ""
     }
 

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

@@ -231,7 +231,7 @@ const ExportView = (() => {
             STATE.exporting = false;
             STATE.confirming = false;
             //恢复设置提示弹窗 因为是共用的alert
-            $('#hintBox_caption').removeClass('export-check');
+            //$('#hintBox_caption').removeClass('export-check');  已经统一在info_box关闭时删除了
             $('#export input[type="checkbox"]:eq(0)').prop('checked', true);
             if (spread) {
                 spread.destroy();

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

@@ -224,6 +224,10 @@ let indexObj= {
                         options:info.options,
                         cellType:info.cellType
                     };
+                    if(info.required == true){
+                        d.foreColor = "#ff2a23";
+                        d.styleCol = 0;
+                    }
                     if(info.cellType)d.dateCol = 1;
                     datas.push(d);
                 }

+ 2 - 0
web/building_saas/main/js/views/tender_price_view.js

@@ -442,6 +442,8 @@ let tender_obj={
             }
 
             tender_obj.showTenderData();
+            projectObj.project.projectGLJ.calcQuantity();
+            // projectGljObject.refreshViewsData();
         };
         if (tender == tenderTypes.ttReverseGLJ || tender == tenderTypes.ttReverseRation){
             projectObj.project.calcProgram.prepareForDistribute(tender_obj.tenderTree.roots[0]);

+ 4 - 4
web/common/html/header.html

@@ -4,7 +4,7 @@
     <% if(controller === 'boot' || controller === 'pm'){ %>
     <!--<a style="text-decoration: none" href="javascript:void(0);" class="header-logo">-->
     <% }else { %>
-    <div class="mx-2"><a href="/pm" class="btn btn-sm" data-toggle="tooltip" title="返回项目管理"><i class="fa fa-angle-left" style="font-size:24px"></i></a></div>
+    <div class="mx-2"><a href="/pm" class="btn btn-sm text-white" data-toggle="tooltip" title="返回项目管理"><i class="fa fa-angle-left" style="font-size:24px"></i></a></div>
         <!--<a style="text-decoration: none" href="/pm" class="header-logo">-->
     <% } %>
     <div class="header-logo">
@@ -18,7 +18,7 @@
         <!--大屏菜单-->
         <ul class="nav navbar-nav" id="fluid-menu">
             <li class="nav-item dropdown" id="showqqgroup" >
-                <a class="nav-link text-danger" href="#"><i class="fa fa-qq" ></i> 群</a>
+                <a class="nav-link" href="#"><i class="fa fa-qq" ></i> 群</a>
                 <div class="dropdown-menu p-3 dropdown-menu-right" id="qqgroup" style="width: 200px;top:36px">
                     <p class="text-center">
                         <a href="https://jq.qq.com/?_wv=1027&k=5XivMJY" target="_blank" class="btn btn-sm btn-outline-primary">点击加入QQ交流群</a>
@@ -30,7 +30,7 @@
                 </div>
             </li>
             <li class="nav-item dropdown">
-                <a class="nav-link dropdown-toggle" href="#" data-toggle="dropdown" id="link_userName"><%= sessionUser.company ? sessionUser.company : sessionUser.real_name ? sessionUser.real_name : sessionUser.mobile %></a>
+                <a class="nav-link dropdown-toggle" href="#" data-toggle="dropdown" id="link_userName"><%= (sessionUser.company && sessionUser.real_name) ? (sessionUser.company + '(' + sessionUser.real_name + ')') : sessionUser.company ? sessionUser.company : sessionUser.real_name ? sessionUser.real_name : sessionUser.mobile %></a>
                 <div class="dropdown-menu dropdown-menu-right">
                     <a class="dropdown-item" href="/user/info" target="_blank">企业资料</a>
                     <a class="dropdown-item" href="/user/safe" target="_blank">账号安全</a>
@@ -79,7 +79,7 @@
                 </a>
                 <div class="dropdown-menu dropdown-menu-right">
                     <div class="dropdown dropleft dropdown-submenu">
-                        <button class="dropdown-item dropdown-toggle" type="button" data-toggle="dropdown"><%= sessionUser.company ? sessionUser.company : sessionUser.real_name ? sessionUser.real_name : sessionUser.mobile %></button>
+                        <button class="dropdown-item dropdown-toggle" type="button" data-toggle="dropdown"><%= (sessionUser.company && sessionUser.real_name) ? (sessionUser.company + '(' + sessionUser.real_name + ')') : sessionUser.company ? sessionUser.company : sessionUser.real_name ? sessionUser.real_name : sessionUser.mobile %></button>
                         <div class="dropdown-menu">
                             <a class="dropdown-item" href="/user/info" target="_blank">企业资料</a>
                             <a class="dropdown-item" href="/user/safe" target="_blank">账号安全</a>

+ 1 - 1
web/users/html/login-sms.html

@@ -18,7 +18,7 @@
     <div class="container login-panel">
         <form class="form-signin">
             <h1 class="d-flex justify-content-center mb-0"><img src="/web/building_saas/img/building2.png" width="40" height="40" class="mr-3" style="margin-top: 5px"> 大司空云计价</h1>
-            <p class="text-center mb-4 text-muted">市政、房建、轨道、管廊管线等专业工程计价软件</p>
+            <p class="text-center mb-4 text-muted">市政、房建、轨道、管廊管线等建设工程计价软件</p>
             <p class="mb-1">您关闭了「账号登录」,请通过手机验证码登录。</p>
             <p class="">请点击“获取验证码”,验证码将发送至手机 <%= mobile.substr(0, 3) + '****' + mobile.substr(7, 11) %>,注意查收。</p>
             <div class="form-row sms-login-modal">

+ 1 - 1
web/users/html/login-ver.html

@@ -18,7 +18,7 @@
     <div class="container login-panel ver-panel">
             <h1 class="d-flex justify-content-center mb-0">
                 <img src="/web/building_saas/img/building2.png" width="40" height="40" class="mr-3" style="margin-top: 5px"> 大司空云计价</h1>
-            <p class="text-center mb-4 text-muted">市政、房建、轨道、管廊管线等专业工程计价软件</p>
+            <p class="text-center mb-4 text-muted">市政、房建、轨道、管廊管线等建设工程计价软件</p>
             <div class="d-flex justify-content-between">
                 <h5 class="modal-title">选择费用定额</h5>
                 <p class=" text-warning"><i class="fa fa-exclamation-triangle"></i> <b>登录设置</b> 中可以修改您的登录习惯。</p>

+ 1 - 1
web/users/html/login.html

@@ -21,7 +21,7 @@
                 <img src="/web/building_saas/img/building.png" width="40" height="40" class="mr-3" style="margin-top: 5px">
                 大司空云计价
             </h1>
-            <p class="text-center mb-4 text-muted">市政、房建、轨道、管廊管线等专业工程计价软件</p>
+            <p class="text-center mb-4 text-muted">市政、房建、轨道、管廊管线等建设工程计价软件</p>
             <p class="change-login-p">账号登录</p>
             <div class="form-group user-login-modal">
                 <input id="inputEmail" class="form-control " name="inputEmail" placeholder="邮箱/手机" autofocus="" />

+ 2 - 2
web/users/html/user-buy.html

@@ -51,7 +51,7 @@
                             <div class="col-sm-4 mb-5">
                                 <div class="card free-version">
                                   <div class=" card-body">
-                                    <h3 class="card-title">免费版 </h3>
+                                    <h3 class="card-title text-white">免费版 </h3>
                                       <p class="card-text">
                                     <!--  <ul class="pl-3">
                                           <li>只可创建 50 个单位工程</li>
@@ -76,7 +76,7 @@
                             <div class="col-sm-4 mb-5">
                                 <div class="card pro-version">
                                   <div class=" card-body">
-                                    <h3 class="card-title">专业版</h3>
+                                    <h3 class="card-title text-white">专业版</h3>
                                       <p class="card-text">
                                       <!--<ul class="pl-3">
                                           <li>创建单位工程无限制</li>