Forráskód Böngészése

Merge branch 'dev' of http://192.168.1.41:3000/maixinrong/Calculation into dev

TonyKang 4 éve
szülő
commit
bd93fbd032

+ 4 - 1
app/controller/change_controller.js

@@ -714,7 +714,10 @@ module.exports = app => {
                 renderData.auditList = auditList;
 
                 // 获取是否已存在调用变更令
-                const changeUsedData = await ctx.service.stageChange.getFinalUsedData(ctx.tender.id, change.cid);
+                let changeUsedData = await ctx.service.stageChange.getFinalUsedData(ctx.tender.id, change.cid);
+                changeUsedData = ctx.helper._.filter(changeUsedData, function(item) {
+                    return item.used_qty !== null;
+                })
                 renderData.changeUsedData = changeUsedData;
                 renderData.stageChangeNum = this.ctx.helper.sum(changeUsedData.map(x => { return Math.abs(x.used_qty); }));
                 await this.layout('change/information.ejs', renderData, 'change/information_modal.ejs');

+ 3 - 0
app/controller/deal_bills_controller.js

@@ -133,6 +133,9 @@ module.exports = app => {
                     if (file === '签约清单导入格式.xls') {
                         fileName = this.app.baseDir + '/app/public/deal_bills/签约清单导入格式.xls';
                         ctx.body = await fs.readFileSync(fileName);
+                    } else if (file === '签约清单转换格式.xls') {
+                        fileName = this.app.baseDir + '/app/public/deal_bills/转换格式.xls';
+                        ctx.body = await fs.readFileSync(fileName);
                     } else if (file === '签约清单.xlsx') {
                         const create_time = Date.parse(new Date()) / 1000;
                         fileName = this.app.baseDir + '/app/public/deal_bills/downloads/' + ctx.tender.id + '-' + create_time + '.xlsx';

+ 3 - 0
app/controller/tender_controller.js

@@ -504,6 +504,8 @@ module.exports = app => {
                     { num: tender.end_qc_tp ? tender.end_qc_tp : 0, name: '变更完成' },
                     { num: tender.undone_tp ? tender.undone_tp : 0, name: '未完成' },
                 ];
+                // 地图
+                const hadMap = true;
                 const renderData = {
                     tenders,
                     categoryData,
@@ -522,6 +524,7 @@ module.exports = app => {
                     materialData,
                     reviseNum,
                     stage_total,
+                    hadMap,
                     jsFiles: this.app.jsFiles.common.concat(this.app.jsFiles.tender.tenderInfo),
                 };
                 if (ctx.session.sessionUser.is_admin) {

+ 31 - 0
app/lib/sum_load.js

@@ -84,6 +84,33 @@ class loadGclBaseTree {
 
     gather(source, parent) {}
     getUpdateData() {}
+
+    recursiveCalculate(dealBills, node) {
+        if (node.children && node.children.length > 0) {
+            for (const child of node.children) {
+                this.recursiveCalculate(dealBills, child);
+            }
+        } else {
+            const p = this.ctx.helper.findPrecision(this.ctx.tender.info.precision, node.unit);
+            node.sgfh_qty = this.ctx.helper.round(node.sgfh_qty, p.value);
+            node.sjcl_qty = this.ctx.helper.round(node.sjcl_qty, p.value);
+            node.qtcl_qty = this.ctx.helper.round(node.qtcl_qty, p.value);
+            node.quantity = this.ctx.helper.round(node.quantity, p.value);
+
+            if (!node.unit_price) {
+                const db = dealBills.find(x => { return x.b_code === node.b_code && x.name === node.name && x.unit === node.unit });
+                if (!db) return;
+                node.unit_price = db.unit_price;
+            }
+            node.sgfh_tp = this.ctx.helper.mul(node.sgfh_qty, node.unit_price, this.ctx.tender.info.decimal.tp);
+            node.sjcl_tp = this.ctx.helper.mul(node.sjcl_qty, node.unit_price, this.ctx.tender.info.decimal.tp);
+            node.qtcl_tp = this.ctx.helper.mul(node.qtcl_qty, node.unit_price, this.ctx.tender.info.decimal.tp);
+            node.total_price = this.ctx.helper.mul(node.quantity, node.unit_price, this.ctx.tender.info.decimal.tp);
+        }
+    }
+    calculateAll(dealBills) {
+        this.recursiveCalculate(dealBills, this.parent);
+    }
 }
 
 class loadLedgerGclTree extends loadGclBaseTree {
@@ -318,6 +345,8 @@ class sumLoad {
                 this.recusiveLoadGatherGcl(top, null);
             }
         }
+        const dealBills = await this.ctx.service.dealBills.getAllDataByCondition({ tid: this.ctx.tender.id });
+        this.loadTree.calculateAll(dealBills);
         return this.loadTree;
     }
 
@@ -345,6 +374,8 @@ class sumLoad {
                 this.recusiveLoadGatherGcl(top, null);
             }
         }
+        const dealBills = await this.ctx.service.dealBills.getAllDataByCondition({ tid: this.ctx.tender.id });
+        this.loadTree.calculateAll(dealBills);
         return this.loadTree;
     }
 

BIN
app/public/deal_bills/转换格式.xls


+ 0 - 1
app/public/js/ledger.js

@@ -3698,7 +3698,6 @@ function getNodeList(node) {
   })
 }
 
-
 // 生成所有附件列表
 function getAllList(currPageNum = 1) {
   // 每页最多几个附件

+ 138 - 0
app/public/js/shares/db2full_code.js

@@ -0,0 +1,138 @@
+'use strict';
+
+/**
+ * 需要 export_excel.js
+ *
+ * @author Mai
+ * @date
+ * @version
+ */
+
+const dbFullCode = {
+    loadSheet: function (rows) {
+        this.dealBills = [];
+        let iCode = -1, iName = -1, iUnit = -1, iUp = -1, iQty = -1, iTp = -1, bCheckCol = false;
+        for (let iRow = 0; iRow < rows.length; iRow++) {
+            const row = rows[iRow];
+            if (!bCheckCol) {
+                for (let iCol = 0; iCol < row.length; iCol++) {
+                    let value = row[iCol];
+                    if (typeof value !== "string") { continue }
+                    value = _.trim(value);
+                    if (value === '子目号' || value === '清单编号') iCode = iCol;
+                    if (value.indexOf('名称') >= 0) iName = iCol;
+                    if (value.indexOf('单位') >= 0) iUnit = iCol;
+                    if (value.indexOf('单价') >= 0) iUp = iCol;
+                    if (value.indexOf('数量') >= 0) iQty = iCol;
+                    if (value.indexOf('金额') >= 0 || value.indexOf('合价') >= 0) iTp = iCol;
+                }
+                bCheckCol = (iCode >= 0 && iName >= 0 && iUnit >= 0 && iUp >= 0 && iQty >= 0 && iTp >= 0);
+                if (!bCheckCol) {
+                    iCode = -1;
+                    iName = -1;
+                    iUnit = -1;
+                    iUp = -1;
+                    iQty = -1;
+                    iTp = -1;
+                }
+            } else {
+                const code = cleanSymbols(_.trim(row[iCode]));
+                if (!code) continue;
+                this.dealBills.push({
+                    code: code,
+                    org_code: row[iCode],
+                    name: cleanSymbols(row[iName]),
+                    unit: cleanSymbols(row[iUnit]),
+                    unit_price: row[iUp],
+                    quantity: row[iQty],
+                    total_price: row[iTp],
+                });
+            }
+        }
+        if (!bCheckCol) {
+            throw '导入的Excel表头定义有误,请下载示例检查';
+        }
+    },
+    loadXlsx: function () {
+        const dbfile = $('#db-full-code-file')[0];
+        xlsxUtils.import(dbfile.files[0], () => {
+            try {
+                dbFullCode.loadSheet(xlsxUtils.getSheetByIndex(0, {header: 1}));
+                document.getElementById('db-full-code-change').disabled = false;
+            } catch (err) {
+                console.log(err);
+                if (err.stack) {
+                    toastr.error('该文件不支持转换,请选择其他文件');
+                } else {
+                    toastr.warning(err);
+                }
+            }
+        });
+    },
+    clear: function () {
+        const file = document.getElementById('db-full-code-file');
+        file.outerHTML = file.outerHTML;
+        document.getElementById('db-full-code-change').disabled = true;
+        $('#db-full-code-file').change(dbFullCode.loadXlsx);
+    },
+    change: function () {
+        const regChar = /^-[a-zA-Z]$/, regNum = /^-[0-9]{1,2}$/, regCode = /^[0-9]{3,4}((-[0-9]{1,2})|(-[a-zA-Z]))*$/;
+        let invalid = 0;
+        for (const [i, db] of this.dealBills.entries()) {
+            if (regCode.test(db.code)) {
+                db.tag = 0;
+                db.full_code = db.code;
+            } else if (regNum.test(db.code)) {
+                db.tag = 1;
+                for (let j = i-1; j >= 0; j--) {
+                    if (this.dealBills[j].tag !== db.tag) {
+                        db.full_code = this.dealBills[j].full_code + db.code;
+                    }
+                }
+            } else if (regChar.test(db.code)) {
+                db.tag = 2;
+                for (let j = i-1; j >= 0; j--) {
+                    if (this.dealBills[j].tag !== db.tag) {
+                        db.full_code = this.dealBills[j].full_code + db.code;
+                    }
+                }
+            } else {
+                db.tag = -1;
+                invalid += 1;
+            }
+        }
+        if (invalid > 0) toastr.warning(`存在${invalid}条清单编号非法,请仔细对照原编号检查`);
+    },
+    save() {
+        const setting = {
+            cols: [
+                {title: '清单编号', colSpan: '1', rowSpan: '1', field: 'full_code', hAlign: 0, width: 100, formatter: '@'},
+                {title: '原编号', colSpan: '1', rowSpan: '1', field: 'org_code', hAlign: 0, width: 60, formatter: '@'},
+                {title: '名称', colSpan: '1', rowSpan: '1', field: 'name', hAlign: 0, width: 300, formatter: '@'},
+                {title: '单位', colSpan: '1', rowSpan: '1', field: 'unit', hAlign: 1, width: 60, formatter: '@'},
+                {title: '单价', colSpan: '1', rowSpan: '1', field: 'unit_price', hAlign: 2, width: 80, type: 'Number'},
+                {title: '数量', colSpan: '1', rowSpan: '1', field: 'quantity', hAlign: 2, width: 80, type: 'Number'},
+                {title: '合价', colSpan: '1', rowSpan: '1', field: 'total_price', hAlign: 2, width: 80, type: 'Number'},
+            ],
+            headRows: 1,
+            headRowHeight: [32],
+            defaultRowHeight: 21,
+            headerFont: 'bold 10px 微软雅黑',
+            font: '10px 微软雅黑'
+        };
+        const orgFileName = $('#db-full-code-file')[0].files[0].name;
+        const pointIndex = orgFileName.lastIndexOf('.');
+        SpreadExcelObj.exportSimpleXlsxSheet(setting, this.dealBills, orgFileName.substring(0, pointIndex) + "-长编号.xlsx");
+    },
+    changeAndSave() {
+        dbFullCode.change();
+        dbFullCode.save();
+    }
+};
+
+$(document).ready(() => {
+    $('#db-full-code').on('show.bs.modal', () => {
+        dbFullCode.clear();
+    });
+    $('#db-full-code-change').click(dbFullCode.changeAndSave);
+});

+ 6 - 4
app/public/report/js/rpt_archive.js

@@ -128,7 +128,7 @@ let rptArchiveObj = {
             try {
                 if (can_netcasign) {
                     const msgSign = _.find(ARCHIVE_ENCRYPTION_LIST, {rpt_id: me.currentNode.ID});
-                    console.log(msgSign, me.currentArchiveUuid);
+                    console.log(msgSign);
                     me.currentEncryptionList = msgSign;
                     const uSignLogList = _.filter(signLogList, { uuid: me.currentArchiveUuid });
                     let html = '';
@@ -152,6 +152,7 @@ let rptArchiveObj = {
                             pagetr += '<tr><td>页'+ i +'</td><td>'+ me.currentNode.name +'</td><td>'+ uhtml +'</td></tr>';
                         }
                     }
+                    $('#dateStr').html(me.currentArchiveDateStr);
                     $('#role-list').html(html);
                     $('#page-list').html(pagetr);
                     $('#sign_num').text(uSignLogList.length);
@@ -163,7 +164,7 @@ let rptArchiveObj = {
                         $('#show-removesign-modal-btn').hide();
                     }
                     postData('/tender/'+ TENDER_ID +'/signReport/post', {type: 'pdfIsExist', uuid: me.currentArchiveUuid}, function (result) {
-                        me.currentArchivePdfPath = result ? oss_path + '/sign/'+ me.currentArchiveUuid +'.PDF' + (uSignLogList.length !== 0 ? '?' + uSignLogList.length : '') : oss_path + '/'+ me.currentArchiveUuid +'.PDF';
+                        me.currentArchivePdfPath = result ? oss_path + '/sign/'+ me.currentArchiveUuid +'.PDF' + (uSignLogList.length !== 0 ? '?' + uSignLogList[uSignLogList.length-1].versionid : '') : oss_path + '/'+ me.currentArchiveUuid +'.PDF';
                         $('#iframe_made').html('<iframe src="/archive/pdf/show?file=' + me.currentArchivePdfPath + '" height="750px" width="100%" style="border: none;"></iframe>');
                     }, function () {
                         me.currentArchivePdfPath = oss_path + '/'+ me.currentArchiveUuid +'.PDF';
@@ -191,7 +192,7 @@ let rptArchiveObj = {
         if(can_netcasign) {
             postData('/tender/'+ TENDER_ID +'/signReport/post', {type: 'pdfIsExist', uuid: me.currentArchiveUuid}, function (result) {
                 const uSignLogList = _.filter(signLogList, { uuid: me.currentArchiveUuid });
-                me.currentArchivePdfPath = result ? oss_path + '/sign/'+ me.currentArchiveUuid +'.PDF' + (uSignLogList.length !== 0 ? '?' + uSignLogList.length : '') : oss_path + '/'+ me.currentArchiveUuid +'.PDF';
+                me.currentArchivePdfPath = result ? oss_path + '/sign/'+ me.currentArchiveUuid +'.PDF' + (uSignLogList.length !== 0 ? '?' + uSignLogList[uSignLogList.length-1].versionid : '') : oss_path + '/'+ me.currentArchiveUuid +'.PDF';
                 $('#iframe_made').html('<iframe src="/archive/pdf/show?file=' + me.currentArchivePdfPath + '" height="750px" width="100%" style="border: none;"></iframe>');
                 me._buildeArchiveDateSelect();
             }, function () {
@@ -250,8 +251,9 @@ let rptArchiveObj = {
         $('#page-list').html(pagetr);
         if (needFrame) {
             me.currentArchivePdfPath = uSignLogList.length > 0 ? oss_path + '/sign/'+ me.currentArchiveUuid +'.PDF' : oss_path + '/'+ me.currentArchiveUuid +'.PDF';
-            $('#iframe_made').html('<iframe src="/archive/pdf/show?file=' + me.currentArchivePdfPath + (uSignLogList.length !== 0 ? '?' + uSignLogList.length : '') + '" height="750px" width="100%" style="border: none;"></iframe>');
+            $('#iframe_made').html('<iframe src="/archive/pdf/show?file=' + me.currentArchivePdfPath + (uSignLogList.length !== 0 ? '?' + uSignLogList[uSignLogList.length-1].versionid : '') + '" height="750px" width="100%" style="border: none;"></iframe>');
         }
+        $('#dateStr').html(me.currentArchiveDateStr);
         $('#sign_num').text(uSignLogList.length);
         const uHadSign = _.filter(uSignLogList, { uid: USER_ID});
         // 是否显示撤销按钮

+ 1 - 1
app/public/report/js/rpt_cfg_const.js

@@ -37,7 +37,7 @@ const rpt_prj_folder_setting = {
         selectedMulti: false
     },
     check: {
-        enable: true
+        enable: false
     },
     data: {
         keep: {

+ 1 - 0
app/view/ledger/explode.ejs

@@ -144,6 +144,7 @@
                                 <% } else { %>
                                 <a href="javascript: void(0);" class="btn btn-sm btn-primary disabled">上传签约清单</a>
                                 <% } %>
+                                <a href="#db-full-code" data-toggle="modal" data-target="#db-full-code" class="btn btn-sm btn-primary">转换长编号</a>
                                 <a href="/tender/<%- ctx.tender.id %>/deal/download/签约清单.xlsx" class="btn btn-sm btn-primary" style="display: none">下载签约清单</a>
                             </div>
                         </div>

+ 1 - 0
app/view/ledger/explode_modal.ejs

@@ -427,3 +427,4 @@
 <% include ../shares/check_modal2.ejs %>
 <% include ../shares/new_tag_modal.ejs %>
 <% include ../shares/tender_select_modal.ejs %>
+<% include ../shares/db2full_code.ejs %>

+ 3 - 2
app/view/profile/netcasign.ejs

@@ -11,7 +11,7 @@
                 <% if (ctx.session.sessionProject.page_show.openNetCaSign) { %>
                 <nav class="nav nav-tabs m-3" role="tablist">
                     <a class="nav-item nav-link active" href="/profile/sign/netca">Ukey认证签名</a>
-                    <a class="nav-item nav-link" href="/profile/sign">签字设置</a>
+                    <!--<a class="nav-item nav-link" href="/profile/sign">签字设置</a>-->
                 </nav>
                 <% } %>
                 <div class="row m-0">
@@ -21,7 +21,8 @@
                                 <label>网证通UKey</label>
                                 <div>
                                     <button class="btn btn-sm btn-outline-primary" id="getCert">获取证书信息</button>
-                                    <small class="form-text text-danger">请先插入网证通UKey获取证书信息再绑定</small>
+                                    <!--<small class="form-text text-danger">请先插入网证通UKey获取证书信息再绑定</small>-->
+                                    <small class="form-text text-danger">&nbsp;</small>
                                     <textarea id="DeviceOutputId" readonly class="form-control mt-1 mb-1" rows="3"></textarea>
                                     <input type="hidden" id="name" />
                                     <input type="hidden" id="keyId" />

+ 2 - 0
app/view/report/index.ejs

@@ -135,6 +135,7 @@
                                     报表设置
                                 </div>
                             </div>
+                            <% if (!pageShow.openNetCaSign) { %>
                             <div class="panel" id="pnl_eSignature">
                                 <div class="panel-body">
                                     <button class="btn btn-outline-primary btn-sm" type="button" data-toggle="modal" data-target="#eSignature" onclick="rptSignatureHelper.resetESignature(zTreeOprObj.currentRptPageRst, 'eSignatureBodyDiv'); rptSignatureHelper.checkAndShowCrossTendersESignature();">
@@ -143,6 +144,7 @@
                                     </button>
                                 </div>
                             </div>
+                            <% } %>
                             <div class="panel">
                                 <div class="panel-body">
                                     <div class="input-group input-group-sm">

+ 50 - 2
app/view/report/index_sign.ejs

@@ -120,9 +120,11 @@
             autoFlashHeight();
         }
     });
+    // $('iframe').css('pointerEvents', 'none');
     $.divResizer({
         select: '#right-spr',
         callback: function () {
+            // $('iframe').css('pointerEvents', 'auto');
             autoFlashHeight();
         }
     });
@@ -340,6 +342,32 @@
         return retSignValue;
     }
     $(function () {
+
+        //阻止事件冒泡
+        //不仅仅要stopPropagation,还要preventDefault
+        function pauseEvent(e){
+            if(e.stopPropagation) e.stopPropagation();
+            if(e.preventDefault) e.preventDefault();
+            e.cancelBubble=true;
+            e.returnValue=false;
+            return false;
+        }
+        let pe = 0;
+        $('#right-spr').mousedown(function (ev) {
+            $('iframe').css('pointerEvents', 'none');
+            let e = ev||event;
+            pauseEvent(e);
+            pe = 1;
+        });
+        $(document).mouseup(function (ev) {
+            if(pe) {
+                $('iframe').css('pointerEvents', 'auto');
+                pe = 0;
+                let e = ev||event;
+                pauseEvent(e);
+            }
+        });
+
         // 多层modal关闭后的滚动bug修复
         $('#add-sign').on('hidden.bs.modal', function (e) {
             $(document.body).addClass('modal-open');
@@ -349,13 +377,33 @@
 
         $('#sign_pdf').click(function () {
             $(this).attr('disabled', true);
-            $(this).text('签名条件判断中...')
+            $(this).text('签名条件判断中...');
+            // 判断同表中历史归档是否已存在签名
+            if(rptArchiveObj.currentNode && rptArchiveObj.currentArchiveUuid) {
+                const archiveList = _.find(ARCHIVE_LIST, { rpt_id: rptArchiveObj.currentNode.ID.toString() });
+                if (archiveList && archiveList.items) {
+                    const aidList = _.map(archiveList.items, 'uuid');
+                    _.remove(aidList, function (n) {
+                        return n === rptArchiveObj.currentArchiveUuid;
+                    });
+                    if (aidList.length > 0) {
+                        for (const a of aidList) {
+                            if (_.findIndex(signLogList, { uuid: a }) !== -1) {
+                                toastr.error('历史归档中已存在签名,请勿重复签署');
+                                $(this).attr('disabled', false);
+                                $(this).text('确定');
+                                return false;
+                            }
+                        }
+                    }
+                }
+            }
             // 判断是否已选中签名位置
             const val = $("input[name='sign_role']:checked").val();
             if (!val) {
                 toastr.error('请选择签名位置');
                 $(this).attr('disabled', false);
-                $(this).text('确定')
+                $(this).text('确定');
                 return false;
             }
             console.log(val);

+ 1 - 1
app/view/report/index_sign_modal.ejs

@@ -9,7 +9,7 @@
                 </button>
             </div>
             <div class="modal-body">
-                <p>当前使用 #3 2021-03-02 归档报表进行签名,签名后其余归档仅能查看。</p>
+                <p>当前使用 <span id="dateStr"></span> 归档报表进行签名,签名后其余归档仅能查看。</p>
                 <div class="card mb-3">
                     <div class="card-header">选择签名位置</div>
                     <div class="card-body py-3">

+ 24 - 0
app/view/shares/db2full_code.ejs

@@ -0,0 +1,24 @@
+<!--转换长编号-->
+<div class="modal fade" id="db-full-code" data-backdrop="static">
+    <div class="modal-dialog" role="document">
+        <div class="modal-content">
+            <div class="modal-header">
+                <h5 class="modal-title">转换长编号</h5>
+            </div>
+            <div class="modal-body">
+                <div class="form-group">
+                    <label for="exampleFormControlFile1">Excel模板</label>
+                    <div class="form-control form-control-plaintext"><a id="downloadDealTemplate" href="/tender/<%- ctx.tender.id %>/deal/download/签约清单转换格式.xls" class="btn btn-sm btn-link">下载示例</a></div>
+                </div>
+                <div class="form-group">
+                    <label for="exampleFormControlFile1">选择签约清单Excel文件</label>
+                    <input type="file" class="form-control-file" id="db-full-code-file" accept="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet, application/vnd.ms-excel">
+                </div>
+            </div>
+            <div class="modal-footer">
+                <button type="button" class="btn btn-secondary btn-sm" data-dismiss="modal">关闭</button>
+                <button type="button" class="btn btn-primary btn-sm" id="db-full-code-change">转换</button>
+            </div>
+        </div>
+    </div>
+</div>

+ 57 - 2
app/view/tender/detail.ejs

@@ -167,11 +167,16 @@
                         <!--章节计量情况图-->
                         <div class="col-6 pl-0">
                             <div class="card mb-3 bg-dark text-white">
+                                <% if (hadMap) { %>
+                                <div class="card-body" id="map" style="height: 453px; width: 100%;">
+                                </div>
+                                <% } else  { %>
                                 <div class="card-header"><h6 class="mb-0">章节计量情况图</h6></div>
                                 <div class="card-body">
                                     <div id="jlchart3" style="height: 372px; width: 100%;">
                                     </div>
                                 </div>
+                                <% } %>
                             </div>
                         </div>
                         <div class="col-3 pl-0">
@@ -306,19 +311,49 @@
                         <!--期进度表-->
                         <div class="col-6">
                             <div class="card mb-3 bg-dark text-white">
-                                <div class="card-header"><h6 class="mb-0">期进度表</h6></div>
+                                <% if (hadMap) { %>
+                                    <div class="card-header"><h6 class="mb-0">章节计量情况表</h6></div>
                                 <div class="card-body">
-                                    <div id="chartContainer4" style="height: 300px; width: 100%;"></div>
+                                    <div id="jlchart3" style="height: 338px; width: 100%;"></div>
                                 </div>
+                                <% } else { %>
+                                    <div class="card-header"><h6 class="mb-0">期进度表</h6></div>
+                                    <div class="card-body">
+                                        <div id="chartContainer4" style="height: 300px; width: 100%;"></div>
+                                    </div>
+                                <% } %>
                             </div>
                         </div>
                         <!--月进度表-->
                         <div class="col-6 pl-0">
                             <div class="card mb-3 bg-dark text-white">
+                                <% if (hadMap) { %>
+                                <div class="card-header">
+                                    <ul class="nav nav-tabs card-header-tabs panel-card-tabs">
+                                        <li class="nav-item">
+                                            <a class="nav-link active" data-toggle="tab" href="#qijindubiao" role="tab" aria-selected="true">期进度表</a>
+                                        </li>
+                                        <li class="nav-item">
+                                            <a class="nav-link" data-toggle="tab" href="#yuejindbiao" role="tab" aria-selected="true">月进度表</a>
+                                        </li>
+                                    </ul>
+                                </div>
+                                <div class="card-body">
+                                    <div class="tab-content">
+                                        <div class="tab-pane active" id="qijindubiao">
+                                            <div id="chartContainer4" style="height: 338px; width: 100%;"></div>
+                                        </div>
+                                        <div class="tab-pane" id="yuejindbiao" >
+                                            <div id="chartContainer3" style="height: 338px; width: 800px;"></div>
+                                        </div>
+                                    </div>
+                                </div>
+                                <% } else { %>
                                 <div class="card-header"><h6 class="mb-0">月进度表</h6></div>
                                 <div class="card-body">
                                     <div id="chartContainer3" style="height: 300px; width: 100%;"></div>
                                 </div>
+                                <% } %>
                             </div>
                         </div>
                     </div>
@@ -1071,3 +1106,23 @@
         };
     })
 </script>
+<% if (hadMap) { %>
+<!--<script src="//bj.bcebos.com/v1/mapopen/api-demos/js/mapStyle.js"></script>-->
+<script type="text/javascript" src="https://api.map.baidu.com/api?v=1.0&type=webgl&ak=C3hLZAjuWTaCdwnwoYY83APrwlPEj4v7"></script>
+<script type="text/javascript">
+    var map = new BMapGL.Map("map");
+    // 创建地图实例
+    var point = new BMapGL.Point(113.462, 22.2245);
+    // 初始化地图,设置中心点坐标和地图级别
+    map.centerAndZoom(point, 12);
+    map.enableScrollWheelZoom(true);
+    // map.setMapStyleV2({styleJson: styleJson2});
+    // 画线
+    var polyline = new BMapGL.Polyline([
+        new BMapGL.Point(113.352, 22.166),
+        new BMapGL.Point(113.572, 22.283),
+        // new BMapGL.Point(116.425, 39.900)
+    ], {strokeColor:"red", strokeWeight:5, strokeOpacity:1});
+    map.addOverlay(polyline);
+</script>
+<% } %>

+ 1 - 0
config/web.js

@@ -154,6 +154,7 @@ const JsFiles = {
                     '/public/js/ledger_check.js',
                     '/public/js/shares/tenders2tree.js',
                     '/public/js/shares/tender_select.js',
+                    '/public/js/shares/db2full_code.js',
                     '/public/js/ledger.js',
                 ],
                 mergeFile: 'explode',