浏览代码

Merge branch 'master' of http://smartcost.in.8866.org:26903/SmartCost/ConstructionCost

vian 5 年之前
父节点
当前提交
53d7a6d126

+ 34 - 0
modules/reports/controllers/rpt_controller.js

@@ -34,6 +34,17 @@ let callback = function(req, res, err, data){
     }
 };
 
+const WATERMARK_FONT = {
+    "Name": "宋体",
+    "FontHeight": "32",
+    "FontColor": "CYAN",
+    "FontBold": "T",
+    "FontItalic": "F",
+    "FontUnderline": "F",
+    "FontStrikeOut": "F",
+    "FontAngle": "45"
+};
+
 function getAllPagesCommonOrg(rpt_id, pageSize, option, cb) {
     let rptTpl = null;
     rptTplFacade.getRptTemplate(rpt_id).then(function(rst) {
@@ -348,6 +359,29 @@ function getAllPagesCommon(user_id, prj_id, rpt_id, pageSize, orientation, custo
     })
 }
 
+function fillWaterMark(pageRstArray) {
+    for (const pageRst of pageRstArray) {
+        if (!pageRst[JV.NODE_FONT_COLLECTION].hasOwnProperty('WaterMark')) {
+            pageRst[JV.NODE_FONT_COLLECTION]['WaterMark'] = WATERMARK_FONT;
+        }
+        for (const page of pageRst.items) {
+            const warterCell = {
+                "font": "WaterMark",
+                "control": "NewContent_Center",
+                "style": "Default_None",
+                "Value": "大司空云计价",
+                "area": {
+                    "Left": 300,
+                    "Right": 500,
+                    "Top": 300,
+                    "Bottom": 500
+                }
+            };
+            page.cells.push(warterCell);
+        }
+    }
+}
+
 
 module.exports = {
     getReportAllPages: function (req, res) {

+ 4 - 1
package.json

@@ -64,6 +64,9 @@
     "start": "C:\\Users\\mai\\AppData\\Roaming\\npm\\babel-node.cmd server.js",
     "server": "node --max-old-space-size=2048 server.js",
     "socket": "node socket.js",
-    "import": "node --max-old-space-size=2048 importserver.js"
+    "import": "node --max-old-space-size=2048 importserver.js",
+    "dev_server":"SET NODE_ENV=qa&& babel-node server.js",
+    "dev_socket":"SET NODE_ENV=qa&& babel-node socket.js",
+    "dev_import":"SET NODE_ENV=qa&& babel-node importserver.js"
   }
 }

+ 109 - 0
public/web/div_resizer.js

@@ -0,0 +1,109 @@
+'use strict';
+
+/**
+ *
+ * div可拖动调整分栏
+ *
+ * 示例结构:
+ * <div id="top-div"></div>
+ * <div r-Type="height|width" div1="#top-div" div2="#bottom-div" store-id="XXX" store-version="1.0.0" min="100">
+ * <div id="bottom-div"></div>
+ *
+ * 其中:
+ * r-Type: height表示上下拖动调整, width表示左右拖动调整
+ * div1: 上(左)部结构的id
+ * div2: 下(右)部结构的id
+ * store-id:可选,存在则以该值生成key,将调整结果写入localStorage
+ * min: 可选,无则默认两部分结构相加的10%
+ *
+ * setting: {select, callback}
+ * 其中:
+ * select:选定分栏
+ * callback:回调(除了上述两个div外需要调整的,自定义放在此处)
+ *
+ * @author Mai
+ * @date 2019/3/15
+ * @version
+ */
+
+(function($){
+    $.divResizer = function(setting) {
+        const obj = $(setting.select);
+        let drag, mouseMoveCount, startPos, orgSize1, orgSize2, newSize1, newSize2, objSize;
+        // if (obj.attr('r-type') === 'height') {
+        //     obj.css('width', '100%').css('height', '1%').css('resize', 'vertical').css('cursor', 's-resize').css('float', 'top');
+        // } else {
+        //     obj.css('width', '1%').css('height', '100%').css('resize', 'horizontal').css('cursor', 'w-resize').css('float', 'left');
+        // }
+        // 根据localStorage初始化
+        if (obj.attr('store-id')) {
+            const rType = obj.attr('r-type'), version = obj.attr('store-version') ? ('-'+obj.attr('store-version')) : '' ;
+            const objSize1 = getLocalCache('v-resize-1-' + obj.attr('store-id') + version);
+            if (objSize1) {
+                $(obj.attr('div1')).css(rType, objSize1);
+            }
+            const objSize2 = getLocalCache('v-resize-2-' + obj.attr('store-id') + version);
+            if (objSize2) {
+                $(obj.attr('div2')).css(rType, objSize2);
+            }
+            if (setting.callback) { setting.callback(); }
+        }
+
+        obj.mousedown(function (e) {
+            const rType = obj.attr('r-type');
+            mouseMoveCount = 0;
+            drag = true;
+            startPos = rType === 'height' ? e.clientY : e.clientX;
+            // 获取左(上)部分的宽度(高度)
+            orgSize1 = $($(this).attr('div1'))[rType]();
+            // 获取右(下)部分的宽度(高度)
+            orgSize2 = $($(this).attr('div2'))[rType]();
+            // nav宽(高度)部分
+            objSize = $(this)[rType]();
+            //resizeElement.tooltip('hide');
+
+        });
+        $('body').mousemove(function (e) {
+            if (drag) {
+                const rType = obj.attr('r-type'), aType = obj.attr('a-type');
+                const moveSize = rType === 'height' ? e.clientY - startPos : e.clientX - startPos;
+                //实时刷新页面
+                mouseMoveCount += moveSize;
+                //当累计移动超过5个像素时,才刷新,减少刷新次数
+                if(Math.abs(mouseMoveCount) >= 5){
+                    if (aType === 'percent') {
+                        const min = obj.attr('min') ? obj.attr('min') : 10;
+                        const max = 100 - min;
+
+                        const percent1 = Math.min(Math.max((orgSize1 + moveSize) / (orgSize1 + orgSize2) * 100, min), max);
+                        $(obj.attr('div1')).css(rType, percent1 + '%');
+                        const percent2 = Math.min(Math.max((orgSize2 - moveSize) / (orgSize1 + orgSize2) * 100, min), max);
+                        $(obj.attr('div2')).css(rType, percent2 + '%');
+                    } else {
+                        const min = obj.attr('min') ? obj.attr('min') : parseInt(((orgSize1 + orgSize2) / 10).toFixed(0));
+                        const max = orgSize1 + orgSize2 - min;
+
+                        // 判断拖动范围不能超出
+                        newSize1 = Math.min(Math.max(orgSize1 + moveSize, min), max);
+                        newSize2 = Math.min(Math.max(orgSize2 - moveSize, min), max);
+
+                        $(obj.attr('div1'))[rType](newSize1);
+                        $(obj.attr('div2'))[rType](newSize2);
+                    }
+
+                    if(setting.callback) { setting.callback(); }
+                    mouseMoveCount = 0;
+                }
+            }
+        });
+        $('body').mouseup(function () {
+            if (drag) {
+                drag = false;
+                const rType = obj.attr('r-type');
+                const localId = obj.attr('store-id'), div1 = $(obj.attr('div1')), div2 = $(obj.attr('div2'));
+                setLocalCache('v-resize-1-' + localId, div1[rType]());
+                setLocalCache('v-resize-2-' + localId, div2[rType]());
+            }
+        });
+    }
+})(jQuery);

+ 39 - 1
public/web/headerOpr.js

@@ -1,4 +1,4 @@
-                                                                                                                                                                                                                                      'use strict';
+'use strict';
 
 /**
  *
@@ -51,12 +51,20 @@ const CommonHeader = (function () {
             }
         })
     }
+
+    // 推荐给朋友
+    const copyDom = $('#copy_link');
+
     //绑定事件
     //@return {void}
     function addEventListener(){
         csDom.click(function () {
             getCategoryList(-1, '联系客服');
         });
+        copyDom.click(function () {
+            copy('大司空市政云计价,正版软件永久免费\r\nhttps://yun.smartcost.com.cn');
+            $('#show_share_msg').show();
+        })
     }
     //取消浏览器自带右键
     //@return {void}
@@ -76,6 +84,36 @@ const CommonHeader = (function () {
             }
         }
     }
+
+    /**
+     * 复制字符串到剪贴板的函数
+     * @param {String} value 需要被复制的字符串
+     * @returns {Boolean} 操作结果
+     */
+    function copy(value){
+        var currentFocus = document.activeElement;// 保存当前活动节点
+
+        let input = document.createElement('textarea');// 创建一个texterea标签
+        document.body.appendChild(input);// 把标签添加给body
+        input.style.opacity = 0;//设置input标签设置为透明(不可见)
+        input.value = value;// 把需要复制的值放到input上
+
+        // 记录当前滚动位置, 因为添加节点并选中的时候回影响页面滚动
+        let scrollY = window.scrollY;
+
+        input.focus();// input节点获取焦点
+        input.setSelectionRange(0, input.value.length);// 选中input框中的所有文字
+
+        var res = document.execCommand('copy');// 复制文字并获取结果
+
+        currentFocus.focus();// 之前活动节点获得焦点
+        document.body.removeChild(input);// 删除添加的input节点
+
+        // 页面滚动到之前位置
+        window.scrollTo(0, scrollY);
+
+        return res;// 返回操作结果
+    }
     return {getCategoryList, addEventListener, banNavigatorContextMenu};
 })();
 

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

@@ -307,9 +307,6 @@ var sheetCommonObj = {
         for (var row = 0; row < data.length; row++) {
             //var cell = sheet.getCell(row, col, GC.Spread.Sheets.SheetArea.viewport);
             this.showRowData(sheet,setting,row,data,distTypeTree);
-            if(setting.getStyle && setting.getStyle(data[row])){
-                sheet.setStyle(row, -1, setting.getStyle(data[row]));
-            }
         }
         if(setting.emptyRowHeader){
             let rowCount = sheet.getRowCount();
@@ -399,6 +396,9 @@ var sheetCommonObj = {
 
             sheet.autoFitRow(row);
         }
+        if(setting.getStyle && setting.getStyle(data[row],row,sheet.getActiveRowIndex())){
+          sheet.setStyle(row, -1, setting.getStyle(data[row]));
+        }
     },
     checkData : function(col,setting, value) {
         let result = true;

+ 14 - 15
web/building_saas/main/html/main.html

@@ -110,7 +110,7 @@
                 </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>-->
-                    <!--2018-11-15 隐藏删除按钮   <a href="javascript:void(0)" class="btn btn-light btn-sm" id="delete" data-toggle="tooltip" data-placement="bottom" data-original-title="删除"><i class="fa fa-remove" aria-hidden="true"></i></a>-->
+                    <a href="javascript:void(0)" class="btn btn-light btn-sm" id="delete" data-toggle="tooltip" data-placement="bottom" data-original-title="删除"><i class="fa fa-remove" aria-hidden="true"></i></a>
                     <a href="javascript:void(0)" class="btn btn-light btn-sm" id="upLevel" data-toggle="tooltip" data-placement="bottom" data-original-title="升级"><i class="fa fa-arrow-left" aria-hidden="true"></i></a>
                     <a href="javascript:void(0)"  class="btn btn-light btn-sm" id="downLevel" data-toggle="tooltip" data-placement="bottom" data-original-title="降级"><i class="fa fa-arrow-right" aria-hidden="true"></i></a>
                       <a href="javascript:void(0)" class="btn btn-light btn-sm" id="upMove" data-toggle="tooltip" data-placement="bottom" data-original-title="上移"><i class="fa fa-arrow-up" aria-hidden="true"></i></a>
@@ -2148,7 +2148,7 @@
     <div class="modal-dialog" role="document">
         <div class="modal-content">
             <div class="modal-header">
-                <h5 class="modal-title"><%= region %>指标成果文件接口<!-- 重庆其他电子招投标数据接口 --></h5>
+                <h5 class="modal-title"><%= region %>指标成果接口文件<!-- 重庆其他电子招投标数据接口 --></h5>
                 <button type="button" class="close" data-dismiss="modal" aria-label="Close">
                     <span aria-hidden="true">&times;</span>
                 </button>
@@ -2157,7 +2157,7 @@
                 <!--检测提醒-->
                 <div class="card">
                     <div class="card-body">
-                        <h5 class="card-title">导出<%= region %>电子招投标数据接口文件</h5>
+                        <h5 class="card-title">导出<%= region %>指标成果接口文件</h5>
                         <p class="card-text">导出之前,建议您执行项目自检功能,避免出现错误。</p>
                         <a id="export-index-check" href="javascript:void(0);" class="btn btn-primary">自检</a>
                     </div>
@@ -2187,25 +2187,24 @@
                 <div class="modal-auto-height" style="overflow: hidden" id="exportSpread">
                 </div>
                 <p>*工程编号作为单项、单位工程的标识,要求在建设项目下唯一。</p>
-
-
-                <div class="form-group" style="">
+                <div class="form-group" id="export_index_checkbox" style="display: none">
                     <div class="form-check ml-4">
-                        <input class="form-check-input" type="checkbox"  id="sei1" checked>
+                        <input class="form-check-input" type="checkbox" disabled id="sei1" checked>
                         <label class="form-check-label" for="sei1">
-                            投标文件
+                            数据交换文件
                         </label>
-                        <small class="form-text text-muted">投标工程数据文件</small>
-                        <input class="form-check-input" type="checkbox"  id="sei2" checked>
+                    </div>
+                    <div class="form-check ml-4">
+                        <input class="form-check-input" type="checkbox" disabled id="sei2" checked>
                         <label class="form-check-label" for="sei2">
-                            投标文件
+                            项目文件
                         </label>
-                        <small class="form-text text-muted">投标工程数据文件</small>
-                        <input class="form-check-input" type="checkbox"  id="sei3" checked>
+                    </div>
+                    <div class="form-check ml-4">
+                        <input class="form-check-input" type="checkbox" disabled id="sei3" checked>
                         <label class="form-check-label" for="sei3">
-                            标文件
+                            造价指标文件
                         </label>
-                        <small class="form-text text-muted">投标工程数据文件</small>
                     </div>
                 </div>
             </div>

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

@@ -976,6 +976,7 @@ var Bills = {
             if(!billID){
                 billID = uuid.v1();
             }
+            if(!code) code = "BAZF";//2019-07-12  需求的修改,改成计算的时候不判断是否计取,直接按定额下的安装增加费的设置改了需求后,有可能造成选取位置为空的情况,这时code为undefinded
             let data = {
                 ID:billID,
                 projectID: parseInt(projectObj.project.ID()),

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

@@ -184,7 +184,7 @@ let contentOprObj = {
         if (!billsNode || !Array.isArray(billsNode.data.jobContent)) {
             return '';
         }
-        return billsNode.data.jobContent[0].content;
+        return billsNode.data.jobContent.length>0?billsNode.data.jobContent[0].content:"";
     },
     // 从清单节点获取工作内容文本数据
     getContentTexts: function (billsNode) {

+ 32 - 19
web/building_saas/main/js/views/export_view.js

@@ -76,7 +76,7 @@ const ExportView = (() => {
         }
     }
     // 确定导出
-    async function handleExportConfirm() {
+    async function handleExportConfirm(codes) {
         if (!spread || !_exportCache || !_exportCache.length) {
             return false;
         }
@@ -86,18 +86,6 @@ const ExportView = (() => {
         STATE.confirming = true;
         let pr = new SCComponent.InitProgressBar();
         try {
-            // 工程编号
-            let codes = getCodeFromSheet(spread.getSheet(0));
-            if (codes.includes('')) {
-                alert('单项、单位工程工程编号不可为空。');
-                STATE.confirming = false;
-                return false;
-            }
-            if ([...new Set(codes)].length !== codes.length) {
-                alert('单项、单位工程工程编号必须唯一。');
-                STATE.confirming = false;
-                return false;
-            }
             pr.start('导出数据接口', '正在导出文件,请稍候……');
             // 导出文件
             await _base.exportFile(codes, _exportCache, XMLStandard.resetContentCode, XMLStandard.saveAsFile);
@@ -216,17 +204,42 @@ const ExportView = (() => {
         //工程编号设置窗口-----
         //设置工程编号
         $('#exportCode').on('shown.bs.modal', function () {
-            if (!_exportCache || !_exportCache.length) {
-                alert('数据错误!');
-                $(this).modal('hide');
-                return false;
+            let projectData = null;
+            if(typeof SEIObject !== 'undefined' && SEIObject.exporting == true){//如果是重庆指标接口调用的
+                if(SEIObject.fileCache && SEIObject.fileCache.length == 2){
+                    projectData = SEIObject.fileCache[0].projectData;
+                }else{
+                    alert('数据错误!');
+                    $(this).modal('hide');
+                    return false;
+                }
+                $("#export_index_checkbox").show();
+            }else {
+                if (!_exportCache || !_exportCache.length) {
+                    alert('数据错误!');
+                    $(this).modal('hide');
+                    return false;
+                }
+                projectData = _cache.getItem('projectData');
+                $("#export_index_checkbox").hide();
             }
-            let projectData = _cache.getItem('projectData');
             initSpread(XML_EXPORT_BASE.UTIL.getCodeSheetData(projectData));
         });
         //设置完工程编号后,导出数据。如果选中多个文件,导出压缩包
         $('#exportCode-confirm').click(async function () {
-            await handleExportConfirm();
+            // 工程编号
+            let codes = getCodeFromSheet(spread.getSheet(0));
+            if (codes.includes('')) {
+                alert('单项、单位工程工程编号不可为空。');
+                STATE.confirming = false;
+                return false;
+            }
+            if ([...new Set(codes)].length !== codes.length) {
+                alert('单项、单位工程工程编号必须唯一。');
+                STATE.confirming = false;
+                return false;
+            }
+            typeof SEIObject !== 'undefined' && SEIObject.exporting ? await exportUtil.exprotZBFX(codes) : await handleExportConfirm(codes);
         });
         //导出窗口--------
         $('#export').on('hide.bs.modal', function() {

+ 7 - 1
web/building_saas/main/js/views/glj_col.js

@@ -68,7 +68,13 @@ let gljCol = {
             lockColumns: ["code","name","specs","unit","short_name","tenderPrice","adjustPrice","quantity","tenderQuantity"]
         },
         frozenCols:4,
-        headRows:2
+        headRows:2,
+        getStyle:function (data,row,activeRow) {
+          if(row == activeRow){//选中黄色显示
+              return {backColor:"#FFFACD"};
+          }
+          return null;
+      },
     },
     mixRatio_Setting:{
         header:[

+ 2 - 2
web/building_saas/main/js/views/glj_view.js

@@ -348,7 +348,7 @@ var gljOprObj = {
             gljOprObj.initSelection({row: gljOprObj.gljLibSheet.getActiveRowIndex()});
         });
     },
-    getSelStyle: function (selected,settingStyle) {
+    getSelStyle: function (selected,settingStyle,rcolor) {
         let style = new GC.Spread.Sheets.Style();
         if(settingStyle){
             for(let key in settingStyle){
@@ -361,7 +361,7 @@ var gljOprObj = {
         style.borderBottom = new GC.Spread.Sheets.LineBorder("#D4D4D4", GC.Spread.Sheets.LineStyle.thin);
         let colorOpts = optionsOprObj.getOption(optionsOprObj.optionsTypes.COLOROPTS);
         let selectedColor = colorOpts.SELECTED.backColor,
-            recColor = 'White';
+            recColor =  rcolor?rcolor:'White';
         style.backColor = selected ? selectedColor : recColor;
         return style;
     },

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

@@ -291,7 +291,7 @@ let MainTreeCol = {
                 field === 'jobContentText') {
                 return false;
             }
-            return !MainTreeCol.readOnly.bills(node) || (node.data.type !== billType.BILL && node.data.type !== billType.FX);
+            return !MainTreeCol.readOnly.bills(node) || (node.data.type !== billType.BILL && node.data.type !== billType.FX && node.data.type !== billType.BX);
         },
         forRuleText: function (node) {
             if(MainTreeCol.readOnly.bills(node)){

+ 26 - 16
web/building_saas/main/js/views/project_glj_view.js

@@ -213,19 +213,19 @@ let projectGljObject={
             gljId = null
         }
         projectObj.project.projectGLJ.getRatioData(gljId,function (data) {
-            if(gljId !== projectObj.project.projectGLJ.getRatioId){//两个id不一致说明不是最新的请求,不用往下执行。
-                return;
-            }
-            let ratioList =[];
-            for(let glj of data){
-                ratioList.push(me.getMixRatioSheetData(glj)) ;
-            }
-            ratioList = gljUtil.sortRationGLJ(ratioList);
-            me.mixRatioData = ratioList;
-            me.mixRatioSheet.setRowCount(0);
-            sheetCommonObj.showData(me.mixRatioSheet, me.mixRatioSetting,me.mixRatioData);
-            me.mixRatioSheet.setRowCount(me.mixRatioData.length);
-            me.mixRatioSheet.setSelection(oldSel.row==-1?0:oldSel.row,oldSel.col,oldSel.rowCount,oldSel.colCount);
+          if(gljId !== projectObj.project.projectGLJ.getRatioId){//两个id不一致说明不是最新的请求,不用往下执行。
+              return;
+          }
+          let ratioList =[];
+          for(let glj of data){
+              ratioList.push(me.getMixRatioSheetData(glj)) ;
+          }
+          ratioList = gljUtil.sortRationGLJ(ratioList);
+          me.mixRatioData = ratioList;
+          me.mixRatioSheet.setRowCount(0);
+          sheetCommonObj.showData(me.mixRatioSheet, me.mixRatioSetting,me.mixRatioData);
+          me.mixRatioSheet.setRowCount(me.mixRatioData.length);
+          me.mixRatioSheet.setSelection(oldSel.row==-1?0:oldSel.row,oldSel.col,oldSel.rowCount,oldSel.colCount);
         })
     },
     getMixRatioSheetData:function (glj) {
@@ -309,10 +309,20 @@ let projectGljObject={
         let me = projectGljObject;
         let newSel = args.newSelections[0];
         let oldSel = args.oldSelections?args.oldSelections[0]:{};
+        me.projectGljSheet.suspendPaint();
+        me.projectGljSheet.suspendEvent();
         if(newSel.row != oldSel.row){
-           me.projectGljRowChang();
-        }
-        me.projectGljSheet.repaint();
+          let style = gljOprObj.getSelStyle(true,{});
+          me.projectGljSheet.setStyle(newSel.row, -1, style);
+          let orow = oldSel.row==''||oldSel.row==-1?0:oldSel.row;
+          let tstyle = gljOprObj.getSelStyle(false,{},me.projectGljSheetData[orow].bgColour);
+          me.projectGljSheet.setStyle(orow, -1, tstyle);
+          me.projectGljRowChang();
+        }else{
+          me.projectGljSheet.repaint();
+        }
+        me.projectGljSheet.resumeEvent();
+        me.projectGljSheet.resumePaint();
     },
     projectGljRowChang:function(row){
         let me = projectGljObject;

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

@@ -25,6 +25,7 @@ var projectInfoObj = {
                 '<span data-toggle="tooltip" data-placement="bottom" data-original-title="当前的工程状态为“协作”,可直接编辑分享人的原始数据。">(协作)</span>'
                 : ''}`;
             fullPath.push(newHtml);
+            fullPath.push(`<input id="rootProjectName" value="${projectName}" type="hidden">`);
 
         }
         return fullPath.join('');

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

@@ -1660,9 +1660,6 @@ var projectObj = {
                     name: '删除',
                     icon: 'fa-remove',
                     disabled: function () {
-                        if (projectReadOnly) {
-                            return true;
-                        }
                         return !ifCanDelete();
                     },
                     callback: function () {
@@ -2871,6 +2868,9 @@ function isSingleSelect() {//是否选中造价书中的单行
     return false;
 }
 function ifCanDelete() {
+    if (projectReadOnly) {
+      return false;
+    }
     let selections = projectObj.mainSpread.getActiveSheet().getSelections();
     let tree = projectObj.project.mainTree;
     let selected = projectObj.project.mainTree.selected;

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

@@ -399,6 +399,7 @@ let tender_obj={
         let calcPriceOption = calcTools.getTenderCalcType();
         $('#calcPriceOption').val(calcPriceOption);
         $('#gljPriceTenderCoe').val(gljPriceTenderCoe);
+        $('#cbShowTenderFields').prop("checked", showTenderFields);
         if(calcPriceOption == 'coeBase'){
             $('#gljPriceTenderCoe').removeAttr("disabled");
             $('#tenderGLJQuantity').attr("disabled",true);
@@ -412,7 +413,6 @@ let tender_obj={
             $('#tenderRationQuantity').removeAttr("disabled");
             // $('#tenderPrice').attr("disabled",true);
         };
-        $('#cbShowTenderFields').prop("checked", showTenderFields);
     }
 };
 

+ 10 - 3
web/building_saas/report/html/rpt_main.html

@@ -1,7 +1,7 @@
-
+<script type="text/javascript" src="/public/web/div_resizer.js"></script>
 <div class="container-fluid">
     <div class="row">
-        <div class="col-lg-3 p-0">
+        <div class="col-auto pr-0" id="tree-view" style="width: 20%">
             <div class="print-list">
                 <!--
                 <div class="list-tools d-flex justify-content-center">
@@ -14,7 +14,8 @@
                 </div>
             </div>
         </div>
-        <div class="col-lg-9 p-0">
+        <div class="col-auto" id="main-view" style="width: 80%">
+            <div class="resize-x" id="right-spr" r-Type="width" div1="#tree-view" div2="#main-view" title="调整大小" a-type="percent"><!--调整左右高度条--></div>
             <div class="toolsbar-f d-flex justify-content-between">
                 <div class="print-toolsbar">
                     <div class="panel">
@@ -127,4 +128,10 @@
         }
         return SCREEN_DPI;
     }
+    $.divResizer({
+        select: '#right-spr',
+        callback: function () {
+            autoFlashHeight();
+        }
+    });
 </script>

+ 25 - 0
web/common/html/header.html

@@ -17,6 +17,9 @@
     <div class="navbar-text p-0 navbar-expand-sm">
         <!--大屏菜单-->
         <ul class="nav navbar-nav" id="fluid-menu">
+            <li class="nav-item" >
+                <a class="nav-link" href="#send2friends" data-toggle="modal" data-target="#send2friends" ><i class="fa fa-share-alt"></i> 推荐给朋友</a>
+            </li>
             <li class="nav-item dropdown" id="showqqgroup" >
                 <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">
@@ -280,6 +283,28 @@
         </div>
     </div>
 </div>
+<!--推荐给朋友-->
+<div class="modal fade" id="send2friends" data-backdrop="static">
+    <div class="modal-dialog" role="document">
+        <div class="modal-content">
+            <div class="modal-header">
+                <h5 class="modal-title">推荐给朋友</h5>
+                <button type="button" class="close" data-dismiss="modal" aria-label="Close">
+                    <span aria-hidden="true">&times;</span>
+                </button>
+            </div>
+            <div class="modal-body">
+                <div class="input-group mb-3">
+                    <input type="text" class="form-control " value="https://yun.smartcost.com.cn" disabled>
+                    <div class="input-group-append">
+                        <button class="btn btn-outline-secondary" id="copy_link">复制链接</button>
+                    </div>
+                </div>
+                <div id="show_share_msg" style="display: none" class="alert alert-success">地址复制成功,快去发给朋友试试吧。</div>
+            </div>
+        </div>
+    </div>
+</div>
 <div style="display: none">
     <%include dataStatistics.html %>
 </div>

+ 109 - 45
web/over_write/js/chongqing_2018_export_sei.js

@@ -23,72 +23,127 @@ let exportUtil = {
     },
     getIndexBills:function (bills) {
         return gljUtil.getIndexBills(bills,fixedFlag,_,scMathUtil);
+    },
+    getProjectInfo :async function (data) {
+        let result = await ajaxPost("/pm/api/exportProject",data);
+        return result;
+    },
+    getProjectFile:async function(projectID,projectName){
+        let spString = "|----|";
+        let sumString = "";
+        let result = await exportUtil.getProjectInfo({projectID:projectID,type:"main",user_id: userID});
+        let result_arr = result.split(spString);
+        sumString = result_arr[0];
+        if(result_arr.length == 2){
+            let tenders = JSON.parse(result_arr[1]);
+            for(let t of tenders){
+                let tenderString = await exportUtil.getProjectInfo({projectID:t,rootProjectID:projectID,type:"sub",user_id: userID});
+                await  setTimeoutSync(null,500);//设置间隔
+                sumString = sumString + spString +tenderString;
+            }
+        }else {
+            throw new Error("数据错误 导出建设项目失败!");
+        }
+        let blob = new Blob([sumString], {type: 'text/plain;charset=utf-8'});
+        return {
+            blob: blob,
+            fileName: projectName+".ybp"
+        }
+    },
+    exprotZBFX:async function (codes) {
+        let pr = new SCComponent.InitProgressBar();
+        pr.start('导出数据接口', '正在导出,请稍候……');
+        try {
+            if(SEIObject.fileCache.length== 2){
+                let tem = SEIObject.fileCache.shift();
+                let fileArry =await XML_EXPORT_BASE.getExtractFile(codes,tem.extractData);
+                //添加招投标数据文件
+                SEIObject.fileCache = SEIObject.fileCache.concat(fileArry);
+
+                //导出建设项目数据
+                let projectFile = await exportUtil.getProjectFile(projectObj.project.property.rootProjectID,$("#rootProjectName").val());
+                //导出压缩包
+                SEIObject.fileCache.push(projectFile);
+                await saveZBFX(SEIObject.fileCache);
+            }
+        }catch (e){
+            console.log(e);
+            alert(e.message);
+        }finally {
+            pr.end();
+            $('#exportCode').modal('hide');
+            $('#exportIndex').modal('hide');
+        }
+
+        async function saveZBFX(fileData) {
+            let zip = new JSZip();
+            for (let file of fileData) {
+                zip.file(file.fileName, file.blob, {binary: true});
+            }
+            let zipFile = await zip.generateAsync({type: 'blob'});
+            saveAs(zipFile, '经济指标.ZBFX');
+        }
     }
 };
 
-let SEIObject = {};
+let SEIObject = {
+    exporting:false,
+    fileCache:[],
+    errorMap:{},
+    selfChecked:false
+};
 
 async function selfChecking(projectID,exprotCall=false) {//自检和正式导出共用接口
-    let pr = new SCComponent.InitProgressBar();
-   if(!exprotCall) pr.start('导出数据接口', '正在自检,请稍候……');
-
-    //先检查招投标数据  - todo
-
-    //检查重庆指标接口数量
-    if(_.isEmpty(SEIObject.errorMap)){
-        let [errorMap,SEIFile] = await getSEIIndexFile(projectID);
-        if(errorMap) {
-            SEIObject.errorMap = errorMap;
-        }else {
-            SEIObject.fileCache.push(SEIFile);
+    if(SEIObject.selfChecked == false){//自检过了就不用重复自检了
+        let extraData = await XML_EXPORT_BASE.getExtractData();
+        SEIObject.errorMap = extraData.failList;
+        SEIObject.fileCache.push(extraData);
+        //检查重庆指标接口数量
+        if(_.isEmpty(SEIObject.errorMap)){
+            let [errorMap,SEIFile] = await getSEIIndexFile(projectID);
+            if(errorMap) {
+                SEIObject.errorMap = errorMap;
+            }else {
+                SEIObject.fileCache.push(SEIFile);
+            }
         }
     }
-    _.isEmpty(SEIObject.errorMap)?alert("自检完成,未检测到错误数据。"): showExportError(SEIObject.errorMap);
+    if(_.isEmpty(SEIObject.errorMap)){
+        if(!exprotCall) alert("自检完成,未检测到错误数据。")
+    }else{
+        showExportError(SEIObject.errorMap);
+    }
     SEIObject.selfChecked = true;
-    if(!exprotCall) pr.end();
 }
 
 
 async function exportSEI(projectID){
     if(!_.isEmpty(SEIObject.errorMap)) return showExportError(SEIObject.errorMap);//如果自检的时候已经有错误,直接提示;
     let pr = new SCComponent.InitProgressBar();
-    pr.start('导出数据接口', '正在导出文件,请稍候……');
     SEIObject.exporting = true;
     try {
-        if(!SEIObject.selfChecked){//没有经过自检,则从招投标接口开始取数据
-            await selfChecking(projectID,true);
-            if(!_.isEmpty(SEIObject.errorMap)) return  pr.end();
-        }
-        //导出建设项目数据
-        //导出压缩包
-       // saveZBFX(SEIObject.fileCache);
-
+        if(!SEIObject.selfChecked)  pr.start('导出数据接口', '正在自检,请稍候……');
+        await selfChecking(projectID,true);
+        pr.end();
+        await setTimeoutSync(null,300);//设置间隔
+        $('#exportCode').modal('show');
     }catch (e){
         console.log(e);
-    }finally {
         pr.end();
-        $('#exportCode').modal('show');
-        //SEIObject.exporting = false;
+        alert(e.message);
     }
-
-
-    async function saveZBFX(fileData) {
-        let zip = new JSZip();
-        for (let file of fileData) {
-            zip.file(file.fileName, file.blob, {binary: true});
-        }
-        let zipFile = await zip.generateAsync({type: 'blob'});
-        saveAs(zipFile, '经济指标.ZBFX');
-    }
-
 }
 
-function showExportError(errorMap) {
+function showExportError(errorMap) {//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(Array.isArray(errorMap)){
+        infoList = errorMap;
+    }else {
+        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){
@@ -578,8 +633,17 @@ async function getSEIIndexFile(projectID) {
 
 $(function () {
 
-    $("#export-index-check").click( function (){
-        selfChecking(projectObj.project.property.rootProjectID);
+    $("#export-index-check").click(async function (){
+        let pr = new SCComponent.InitProgressBar();
+        pr.start('导出数据接口', '正在自检,请稍候……');
+        try {
+           await selfChecking(projectObj.project.property.rootProjectID);
+        }catch (e){
+            console.log(e);
+        }finally {
+            pr.end();
+        }
+
     });
     $("#export-index-confirm").click(async function (){
         await  exportSEI(projectObj.project.property.rootProjectID);

+ 2 - 2
web/users/html/index.html

@@ -8,7 +8,7 @@
       <link rel="stylesheet" href="/lib/bootstrap/css/bootstrap.min.css">
       <link rel="stylesheet" href="/web/building_saas/css/all.css">
       <link rel="stylesheet" href="/web/building_saas/css/style.css">
-      <title>大司空云计价 - 远程办公,用免费正版市政计价软件</title>
+      <title>大司空云计价 - 正版软件永久免费</title>
       <link rel="shortcut icon" href="/web/building_saas/css/favicon.ico" />
    </head>
    <body>
@@ -33,7 +33,7 @@
       <!--banner-->
       <div class="hero bg-dark section " style="background-image: url(/web/users/images/bg_01.png);" id="home">
          <div class="container text-center">
-            <h1 class="text-white mb-4 f-50 ">远程办公,用免费正版市政计价软件</h1>
+            <h1 class="text-white mb-4 f-50 ">大司空市政云计价,正版软件永久免费</h1>
             <p class="lead text-white mb-5">跨平台,打开浏览器即可使用,全新在线计价体验。
             <!-- <div class="btn_hero mb-5">
                <a href="#" class="btn btn-primary btn-round mr-2">GET THIS APP</a>