فهرست منبع

报表新增签章功能(预览、打印、PDF)

Tony Kang 3 سال پیش
والد
کامیت
fb7062f650

+ 166 - 28
app/controller/report_controller.js

@@ -27,13 +27,19 @@ const needCustomTables = [
     'mem_material_sum_gl',
 ];
 
+const STD_COMP_STAMP_SIZE_WIDTH = 4.2 * 96 / 2.54; // 公章标准尺寸(宽4.2厘米)转成像素
+const STD_COMP_STAMP_SIZE_HEIGHT = STD_COMP_STAMP_SIZE_WIDTH; // 公章标准尺寸(高4.2厘米)转成像素
+const NORMAL_SIGN_STR = 'normal_sign';
+const COMPANY_SIGN_STR = 'company_stamp';
+const PRIVATE_SIGN_STR = 'private_stamp';
+
 module.exports = app => {
     class ReportController extends app.BaseController {
 
         /**
          * 获取审批界面所需的 原报、审批人数据等
-         * @param ctx
-         * @return {Promise<void>}
+         * @param {Object} ctx - egg全局context
+         * @return {void}
          * @private
          */
         async _getStageAuditViewData(ctx) {
@@ -85,11 +91,8 @@ module.exports = app => {
                 const custTreeNodes = await ctx.service.rptTreeNodeCust.getCustFoldersByUserId(this.ctx.session.sessionUser.accountId);
                 const custCfg = await ctx.service.rptCustomizeCfg.getCustomizeCfgByUserId('Administrator');
                 const stageList = await ctx.service.stage.getValidStagesShort(tender.id);
+                const unitList = await ctx.service.constructionUnit.getAllDataByCondition({ where: { pid: tender.data.project_id } }); // 找公司章用的
                 const isAdmin = ctx.session.sessionUser.is_admin;
-                // console.log(stage);
-                // console.log(stageList);
-                // console.log('ctx.stage.id: ' + ctx.stage.id);
-                // console.log('ctx.stage.stage_id: ' + ctx.stage.stage_id);
                 // console.log('this.ctx.session.sessionUser.accountId: ' + this.ctx.session.sessionUser.accountId);
                 if (stage && stage.status === auditConst.stage.status.uncheck) {
                     // 得判断账号是否在审核人列表中(不含原报)
@@ -97,8 +100,6 @@ module.exports = app => {
                         stage.auditorList = await ctx.service.stageAudit.getAuditors(ctx.stage.id, ctx.stage.times);
                     }
                     let isAudit = false;
-                    // console.log('stage.auditorList');
-                    // console.log(stage.auditorList);
                     for (const audit of stage.auditorList) {
                         if (audit.aid === this.ctx.session.sessionUser.accountId) {
                             isAudit = true;
@@ -116,8 +117,6 @@ module.exports = app => {
                                 stageList[idx].auditorList = await ctx.service.stageAudit.getAuditors(stageList[idx].id, stageList[idx].times);
                             }
                             let isAudit = false;
-                            // console.log('stageList[idx].auditorList');
-                            // console.log(stageList[idx].auditorList);
                             for (const audit of stageList[idx].auditorList) {
                                 if (audit.aid === this.ctx.session.sessionUser.accountId) {
                                     isAudit = true;
@@ -281,6 +280,7 @@ module.exports = app => {
                 const renderData = {
                     accountGroup: newAccountGroup,
                     accountList,
+                    unitList: JSON.stringify(unitList),
                     tender: tender.data,
                     tenderInfo: tender.info,
                     rpt_tpl_data: JSON.stringify(treeNodes),
@@ -319,6 +319,7 @@ module.exports = app => {
                     lastAuditor,
                     rpt_id: ctx.query.rpt_id,
                     isAdmin,
+                    OSS_PATH: ctx.app.config.fujianOssPath,
                 };
                 await this.layout('report/index.ejs', renderData, 'report/rpt_all_popup.ejs');
                 // await this.layout('report/index.ejs', renderData);
@@ -418,6 +419,7 @@ module.exports = app => {
             const stgAuditForOrg = await ctx.service.stageAudit.getStageAudit(params.stage_id, 1);
             // console.log('after role stage!');
             // console.log(roleRel);
+            mergeStampSignature(ctx, params.stage_status, pageRst, roleRel[0]);
             mergeTextSignature(params.isTextSignature, params.stage_status, pageRst, roleRel[0]);
             await encodeSignatureDataUri(roleRel, this.app.baseDir);
             if (params.getPicFlag) {
@@ -532,6 +534,7 @@ module.exports = app => {
             });
             // console.log('roleRel: ');
             // console.log(roleRel);
+            mergeStampSignature(ctx, params.stage_status, pageRstArr, roleRel, params.rpt_ids);
             mergeTextSignature(params.isTextSignature, params.stage_status, pageRstArr, roleRel, params.rpt_ids);
 
             await encodeSignatureDataUri(roleRel, this.app.baseDir);
@@ -600,6 +603,7 @@ module.exports = app => {
                 }
             }
 
+            mergeStampSignature(ctx, params.stage_status, pageRstArr, roleRelArr, params.rpt_ids);
             mergeTextSignature(params.isTextSignature, params.stage_status, pageRstArr, roleRelArr, params.rpt_ids);
 
             await this.ctx.helper.recursiveMkdirSync(baseDir + '/app/public/download');
@@ -787,6 +791,7 @@ module.exports = app => {
                     waterMarkStr = await getWatermarkPicData(pageRstArr[0], this.app.baseDir);
                 }
             }
+            mergeStampSignature(ctx, params.stage_status, pageRstArr, roleRelArr, params.rpt_ids);
             mergeTextSignature(params.isTextSignature, params.stage_status, pageRstArr, roleRelArr, params.rpt_ids);
             await this.ctx.helper.recursiveMkdirSync(this.app.baseDir + '/app/public/download');
             const runnableRst = [];
@@ -1471,30 +1476,29 @@ function mergeTextSignature(isTxtSignature, status, pageData, singleRoleRel, rpt
                 const deleteSCellsIdx = [];
                 for (let scIdx = 0; scIdx < page.signature_cells.length; scIdx++) {
                     const sCell = page.signature_cells[scIdx];
-                    sCell.Value = ''; // 这里要先清除原有信息
                     if (sCell.signature_name !== JV.SIGNATURE_NAME_DUMMY) {
-                        // console.log(sCell);
+                        sCell.Value = ''; // 这里要先清除原有信息
                         sCell.path = '';
                         sCell.pic = '';
-                    }
-                    if (status === 3) {
-                        for (const role_rel of roleRelContent) {
-                            if (sCell.signature_name === role_rel.signature_name) {
-                                sCell.Value = role_rel.user_name; // 只有审核通过了才需要文本签名内容,但不管如何,都不影响迁移
-                                break;
+                        if (status === 3) {
+                            for (const role_rel of roleRelContent) {
+                                if (sCell.signature_name === role_rel.signature_name) {
+                                    sCell.Value = role_rel.user_name; // 只有审核通过了才需要文本签名内容,但不管如何,都不影响迁移
+                                    break;
+                                }
                             }
                         }
+                        // 无论怎么处理,都得迁移
+                        const newCell = {
+                            font: 'Footer',
+                            control: sCell.control,
+                            style: sCell.style,
+                            Value: sCell.Value,
+                            area: { Left: sCell.area.Left, Right: sCell.area.Right, Top: sCell.area.Top, Bottom: sCell.area.Bottom },
+                        };
+                        page.cells.push(newCell); // 迁移
+                        deleteSCellsIdx.push(scIdx);
                     }
-                    // 无论怎么处理,都得迁移
-                    const newCell = {
-                        font: 'Footer',
-                        control: sCell.control,
-                        style: sCell.style,
-                        Value: sCell.Value,
-                        area: { Left: sCell.area.Left, Right: sCell.area.Right, Top: sCell.area.Top, Bottom: sCell.area.Bottom },
-                    };
-                    page.cells.push(newCell); // 迁移
-                    deleteSCellsIdx.push(scIdx);
                 }
                 // 删除 page.signature_cells 签名(草图不能删);
                 if (isDeleteSignCell) {
@@ -1524,6 +1528,104 @@ function mergeTextSignature(isTxtSignature, status, pageData, singleRoleRel, rpt
     }
 }
 
+// 因机制问题,此方法必须在mergeTextSignature之前调用
+function mergeStampSignature(ctx, status, pageData, singleRoleRel, rpt_ids) {
+    const createStampArea = function(orgCell, controls) {
+        const ctrl = controls[orgCell.control];
+        const rst = { Left: orgCell.area.Left, Right: orgCell.area.Right, Top: orgCell.area.Top, Bottom: orgCell.area.Bottom };
+        let pLeft = orgCell.area.Left,
+            pTop = orgCell.area.Top;
+        switch (ctrl[JV.CONTROL_PROPS[JV.CONTROL_PROP_IDX_HORIZON]]) {
+            case JV.OUTPUT_ALIGN.H[JV.H_ALIGN_IDX_LEFT]:
+                pLeft = orgCell.area.Left;
+                break;
+            case JV.OUTPUT_ALIGN.H[JV.H_ALIGN_IDX_CENTER]:
+                pLeft = (orgCell.area.Left + orgCell.area.Right - STD_COMP_STAMP_SIZE_WIDTH) / 2;
+                break;
+            case JV.OUTPUT_ALIGN.H[JV.H_ALIGN_IDX_RIGHT]:
+                pLeft = orgCell.area.Right - STD_COMP_STAMP_SIZE_WIDTH;
+                break;
+            default:break;
+        }
+        switch (ctrl[JV.CONTROL_PROPS[JV.CONTROL_PROP_IDX_VERTICAL]]) {
+            case JV.OUTPUT_ALIGN.H[JV.V_ALIGN_IDX_TOP]:
+                pTop = orgCell.area.Top;
+                break;
+            case JV.OUTPUT_ALIGN.H[JV.V_ALIGN_IDX_CENTER]:
+                pTop = (orgCell.area.Top + orgCell.area.Bottom - STD_COMP_STAMP_SIZE_HEIGHT) / 2;
+                break;
+            case JV.OUTPUT_ALIGN.H[JV.V_ALIGN_IDX_BOTTOM]:
+                pTop = orgCell.area.Bottom - STD_COMP_STAMP_SIZE_HEIGHT;
+                break;
+            default:break;
+        }
+        rst.Left = pLeft;
+        rst.Top = pTop;
+        rst.Right = pLeft + STD_COMP_STAMP_SIZE_WIDTH;
+        rst.Bottom = pTop + STD_COMP_STAMP_SIZE_WIDTH;
+        return rst;
+
+    };
+    const _mergeSingleStamp = function(_page, _roleRelList) {
+        let roleRelContent = [];
+        if (_roleRelList && _roleRelList.rel_content !== null && _roleRelList.rel_content !== undefined && _roleRelList.rel_content !== '') {
+            roleRelContent = JSON.parse(_roleRelList.rel_content);
+        }
+        for (const page of _page.items) {
+            if (page.signature_cells) {
+                const newStampCells = [];
+                for (let scIdx = 0; scIdx < page.signature_cells.length; scIdx++) {
+                    const sCell = page.signature_cells[scIdx];
+                    for (const role_rel of roleRelContent) {
+                        if (sCell.signature_name === role_rel.signature_name) {
+                            if (Array.isArray(role_rel.sign_output) && role_rel.sign_output.length > 0) {
+                                for (const signType of role_rel.sign_output) {
+                                    switch (signType) {
+                                        case COMPANY_SIGN_STR:
+                                        case PRIVATE_SIGN_STR:
+                                            // 创建一个新的cell
+                                            const stampPath = (signType === COMPANY_SIGN_STR) ? role_rel.company_stamp_path : role_rel.private_stamp_path;
+                                            const newStampCell = {
+                                                signature_name: JV.SIGNATURE_NAME_DUMMY,
+                                                control: sCell.control,
+                                                style: sCell.style,
+                                                path: ctx.app.config.fujianOssPath + stampPath,
+                                                isStamp: true,
+                                                area: createStampArea(sCell, _page[JV.NODE_CONTROL_COLLECTION]),
+                                            };
+                                            newStampCells.push(newStampCell);
+                                            break;
+                                        default: break;
+                                    }
+                                }
+                            }
+                        }
+                    }
+                }
+                if (newStampCells.length > 0) {
+                    page.signature_cells = page.signature_cells.concat(newStampCells);
+                }
+            }
+        }
+    };
+    if (status === 3) {
+        if (pageData instanceof Array) {
+            pageData.forEach((dtlPage, index) => {
+                let dftRolRel = [];
+                const rpt_id = rpt_ids[index];
+                for (const roleRel of singleRoleRel) {
+                    if (roleRel.rpt_id === rpt_id) {
+                        dftRolRel = roleRel;
+                    }
+                }
+                _mergeSingleStamp(dtlPage, dftRolRel);
+            });
+        } else {
+            _mergeSingleStamp(pageData, singleRoleRel);
+        }
+    }
+}
+
 function mergeSignAudit(pageData, currRoleRelList, currAuditList) {
     for (const page of pageData.items) {
         if (page.signature_audit_cells) {
@@ -1707,3 +1809,39 @@ function _resetPageDataByBreaks(pageDataArr, breakAmt, rpt_names, newRptNames) {
     }
     return rst;
 }
+
+function _resetStampPos(orgCell, targetCell, controls) {
+    const ctrl = controls[orgCell.control];
+    let pLeft = orgCell.area.Left,
+        pTop = orgCell.area.Top;
+    switch (ctrl[JV.CONTROL_PROPS[JV.CONTROL_PROP_IDX_HORIZON]]) {
+        case JV.OUTPUT_ALIGN.H[JV.H_ALIGN_IDX_LEFT]:
+            pLeft = orgCell.area.Left;
+            break;
+        case JV.OUTPUT_ALIGN.H[JV.H_ALIGN_IDX_CENTER]:
+            pLeft = (orgCell.area.Left + orgCell.area.Right - STD_STAMP_SIZE_WIDTH) / 2;
+            break;
+        case JV.OUTPUT_ALIGN.H[JV.H_ALIGN_IDX_RIGHT]:
+            pLeft = orgCell.area.Right - STD_STAMP_SIZE_WIDTH;
+            break;
+        default:
+            break;
+    }
+    switch (ctrl[JV.CONTROL_PROPS[JV.CONTROL_PROP_IDX_VERTICAL]]) {
+        case JV.OUTPUT_ALIGN.H[JV.V_ALIGN_IDX_TOP]:
+            pTop = orgCell.area.Top;
+            break;
+        case JV.OUTPUT_ALIGN.H[JV.V_ALIGN_IDX_CENTER]:
+            pTop = (orgCell.area.Top + orgCell.area.Bottom - STD_STAMP_SIZE_HEIGHT) / 2;
+            break;
+        case JV.OUTPUT_ALIGN.H[JV.V_ALIGN_IDX_BOTTOM]:
+            pTop = orgCell.area.Bottom - STD_STAMP_SIZE_HEIGHT;
+            break;
+        default:
+            break;
+    }
+    targetCell.area.Left = pLeft;
+    targetCell.area.Top = pTop;
+    targetCell.area.Right = pLeft + STD_STAMP_SIZE_WIDTH;
+    targetCell.area.Bottom = pTop + STD_STAMP_SIZE_HEIGHT;
+}

+ 6 - 0
app/public/css/main.css

@@ -1952,4 +1952,10 @@ animation:shake 1s .2s ease both;}
 0%,100%{transform:translateX(0);}
 10%,30%,50%,70%, 90%{transform:translateX(-10px);}
 20%,40%,60%,80%{transform:translateX(10px);}
+}
+.margin-inputbox{
+  margin-top: -4px;
+}
+.margin-inputbox .height-inputbox{
+  height: 30px !important;
 }

+ 11 - 3
app/public/report/js/jpc_output.js

@@ -414,8 +414,9 @@ let JpcCanvasOutput = {
             if (cell.path) {
                 const img = new Image();
                 img.src = cell.path;
+                img.crossOrigin = 'anonymous';
                 img.onload = function() {
-                    private_drawImage(cell, control, img);
+                    private_drawImage(cell, control, img, (!!cell.isStamp));
                 };
                 img.onerror = function() {
                     console.log('cell.path error: ' + cell.path);
@@ -423,9 +424,10 @@ let JpcCanvasOutput = {
             } else if (cell.pic) {
                 const img = new Image();
                 img.src = cell.pic;
+                img.crossOrigin = 'anonymous';
                 img.onload = function() {
                     if (cell.signature_name === JV.SIGNATURE_NAME_DUMMY) {
-                        private_drawImage(cell, control, img, [1, 1, 1, 1]);
+                        private_drawImage(cell, control, img, (!!cell.isStamp), [1, 1, 1, 1]);
                     } else {
                         private_drawImage(cell, control, img);
                     }
@@ -491,8 +493,14 @@ let JpcCanvasOutput = {
             rst[3] = rst[3] + JpcCanvasOutput.offsetY;
             return rst;
         }
-        function private_drawImage(cell, control, imageData, offsetArea) {
+        function private_drawImage(cell, control, imageData, orgSize = false, offsetArea) {
             let area = private_getProperSignatureArea(cell, control);
+            if (orgSize) {
+                area[0] = cell.area.Left; // Left
+                area[1] = cell.area.Top; // Top
+                area[2] = cell.area.Right; // Right
+                area[3] = cell.area.Bottom; // Bottom
+            }
             if (offsetArea) {
                 area[0] = area[0] + offsetArea[0]; // Left
                 area[1] = area[1] + offsetArea[1]; // Top

+ 11 - 0
app/public/report/js/jpc_output_value_define.js

@@ -35,6 +35,17 @@ let JV = {
 
     SIGNATURE_NAME_DUMMY: 'dummy_pic',
 
+    OUTPUT_ALIGN: {
+        H: ["left", "center", "right"],
+        V: ["top", "center", "bottom"]
+    },
+    H_ALIGN_IDX_LEFT : 0,
+    H_ALIGN_IDX_CENTER : 1,
+    H_ALIGN_IDX_RIGHT : 2,
+    V_ALIGN_IDX_TOP : 0,
+    V_ALIGN_IDX_CENTER : 1,
+    V_ALIGN_IDX_BOTTOM : 2,
+
     CONTROL_PROPS: ["Shrink", "ShowZero", "Horizon", "Vertical", "Wrap", "VerticalForExcel", "ShrinkFirst", "CloseOutput"],
     CONTROL_PROP_IDX_SHRINK: 0,
     CONTROL_PROP_IDX_SHOW_ZERO: 1,

+ 6 - 0
app/public/report/js/rpt_jspdf.js

@@ -229,6 +229,12 @@ let JpcJsPDFHelper = {
 
         function private_drawImage(doc, ctx, cell, control, imageData, offsetArea) {
             let area = private_getProperSignatureArea(cell, control);
+            if (cell.signature_name === JV.SIGNATURE_NAME_DUMMY) {
+                area[0] = cell[JV.PROP_AREA][JV.PROP_LEFT] + 1 + offsetX; // Left
+                area[1] = cell[JV.PROP_AREA][JV.PROP_TOP] + 1 + offsetX; // Top
+                area[2] = cell[JV.PROP_AREA][JV.PROP_RIGHT] - 1 + offsetX; // Right
+                area[3] = cell[JV.PROP_AREA][JV.PROP_BOTTOM] - 1 + offsetX; // Bottom
+            }
             if (offsetArea) {
                 area[0] = area[0] + offsetArea[0]; // Left
                 area[1] = area[1] + offsetArea[1]; // Top

+ 2 - 0
app/public/report/js/rpt_preview_common.js

@@ -7,6 +7,7 @@ let STAGE_AUDIT = []; //注意这个,与rpt_main.js不要混了
 let STAGE_LIST = [];
 let STAGE_AUDIT_ORG = [];
 let current_stage_id = -1;
+let OSS_PATH = '';
 // 设置Date对象Format函数
 // -- 打印预览需要重新设置一遍 ------------------------------------------------
 Date.prototype.Format = function(fmt) {
@@ -33,6 +34,7 @@ function printPageLoading() {
     let refRptTplIds = JSON.parse(sessionStorage.refRptTplIds);
     STAGE_LIST = JSON.parse(sessionStorage.STAGE_LIST);
     STAGE_AUDIT_ORG = JSON.parse(sessionStorage.STAGE_AUDIT_ORG);
+    OSS_PATH = sessionStorage.OSS_PATH;
     current_stage_id = parseInt(sessionStorage.current_stage_id);
     let scaleFactor = 1;
     CommonAjax.postXsrfEx("/tender/report_api/getMultiReports", params, 60000, true, getCookie('csrfToken_j'),

+ 8 - 7
app/public/report/js/rpt_print.js

@@ -27,6 +27,7 @@ let rptPrintHelper = {
             sessionStorage.refRptTplIds = JSON.stringify(refRptTplIds);
             sessionStorage.STAGE_LIST = JSON.stringify(STAGE_LIST);
             sessionStorage.STAGE_AUDIT_ORG = JSON.stringify(STAGE_AUDIT_ORG);
+            sessionStorage.OSS_PATH = OSS_PATH;
             sessionStorage.current_stage_id = getStageId();
             // sessionStorage.STAGE_AUDIT = JSON.stringify(STAGE_AUDIT);
             window.open('/printReport/' + sessionStorage.pageSize);
@@ -161,13 +162,13 @@ let rptPrintHelper = {
             }
             // 计量有电子签名,要单独处理
             for (let cell of page.signature_cells) {
-                svgPageArr.push(buildSignatureCellSvg(cell, styles, controls, page[JV.PROP_PAGE_MERGE_BORDER], pagesData[JV.BAND_PROP_MERGE_BAND],
+                svgPageArr.push(buildSignatureCellSvg(cell, styles, controls, fonts, page[JV.PROP_PAGE_MERGE_BORDER], pagesData[JV.BAND_PROP_MERGE_BAND],
                     offsetX - actAreaOffsetX, offsetY - actAreaOffsetY, adjustY, canvas, isHtoV, pixelSize, actAreaArr[idx]));
             }
             if (closeWaterMark === 0) {
                 for (let cell of page.watermark_cells) {
                     cell.pic = sessionStorage.waterMarkStr;
-                    svgPageArr.push(buildSignatureCellSvg(cell, styles, controls, page[JV.PROP_PAGE_MERGE_BORDER], pagesData[JV.BAND_PROP_MERGE_BAND],
+                    svgPageArr.push(buildSignatureCellSvg(cell, styles, controls, fonts, page[JV.PROP_PAGE_MERGE_BORDER], pagesData[JV.BAND_PROP_MERGE_BAND],
                         offsetX - actAreaOffsetX, offsetY - actAreaOffsetY, adjustY, canvas, isHtoV, pixelSize, actAreaArr[idx]));
                 }
             }
@@ -211,7 +212,7 @@ function getActualBorderStyle(cell, styles, mergeBorderStyle, pageBorderArea, bo
     return rst;
 }
 
-function buildSignatureCellSvg(cell, styles, controls, pageMergeBorder, rptMergeBorder, offsetX, offsetY, adjustY, canvas, isHtoV, pixelSize, actArea) {
+function buildSignatureCellSvg(cell, styles, controls, fonts, pageMergeBorder, rptMergeBorder, offsetX, offsetY, adjustY, canvas, isHtoV, pixelSize, actArea) {
     let rst = [];
     let style = styles[cell[JV.PROP_STYLE]];
     let mergeBandStyle = null;
@@ -344,10 +345,10 @@ function buildImage(destRst, cell, control, offsetX, offsetY, adjustY, isHtoV, H
     }
     const area = getProperSignatureArea(cell, control, offsetX, offsetY);
     if (cell.signature_name === JV.SIGNATURE_NAME_DUMMY) {
-        area[0] = area[0] + 1; // Left
-        area[1] = area[1] + 1; // Top
-        area[2] = area[2] - 1; // Right
-        area[3] = area[3] - 1; // Bottom
+        area[0] = cell[JV.PROP_AREA][JV.PROP_LEFT] + 1 + offsetX; // Left
+        area[1] = cell[JV.PROP_AREA][JV.PROP_TOP] + 1 + offsetX; // Top
+        area[2] = cell[JV.PROP_AREA][JV.PROP_RIGHT] - 1 + offsetX; // Right
+        area[3] = cell[JV.PROP_AREA][JV.PROP_BOTTOM] - 1 + offsetX; // Bottom
     }
     destRst.push('<image x="' + area[0] + '" y="' + area[1] + '" width="' + (area[2] - area[0]) + '" height="' + (area[3] - area[1]) + '" ');
     destRst.push(href + HtoVStr + ' />');

+ 197 - 75
app/public/report/js/rpt_signature.js

@@ -5,6 +5,11 @@
 'use strict'
 
 const DFT_ROLE_NAME = '';
+const NORMAL_SIGN_STR = 'normal_sign';
+const COMPANY_SIGN_STR = 'company_stamp';
+const PRIVATE_SIGN_STR = 'private_stamp';
+const STD_STAMP_SIZE_WIDTH = 4.2 * 96 / 2.54;   // 公章大小:宽度(4.2CM)
+const STD_STAMP_SIZE_HEIGHT = 4.2 * 96 / 2.54;  // 公章大小:高度(4.2CM)
 
 let rptSignatureHelper = {
     currentSelectedESignAccDom: null,
@@ -128,6 +133,7 @@ let rptSignatureHelper = {
             if (dftDate !== '' && dftDate.length > 20) {
                 dftDate = (new Date(dftDate)).Format('yyyy-MM-dd');
             }
+            let roleRel = null;
             if (directAcc) {
                 rptSignatureHelper.pushDomElementByUser(elementsStrArr, userAcc.name, userAcc.role);
                 // 还有ROLE_REL_LIST
@@ -140,8 +146,12 @@ let rptSignatureHelper = {
                 roleRelObj.user_name = userAcc.name;
                 roleRelObj.acc_id = userAcc.id;
                 roleRelObj.type = '用户';
+                roleRelObj.sign_output = [NORMAL_SIGN_STR]; // 默认是签字(还有:COMPANY_SIGN_STR:单位章, PRIVATE_SIGN_STR:个人章)
+                roleRelObj.company_stamp_path = rptSignatureHelper._getCompanySign(directAcc.company);
+                roleRelObj.private_stamp_path = (userAcc.stamp_path && userAcc.stamp_path !== '') ? userAcc.stamp_path : '';
                 roleRelObj.role = (userAcc.role === '')?DFT_ROLE_NAME:userAcc.role;
                 ROLE_REL_LIST.push(roleRelObj);
+                roleRel = roleRelObj;
             } else if (roleAcc) {
                 // 创建相关dom元素
                 rptSignatureHelper.pushDomElementByRole(elementsStrArr, roleAcc.name, userAcc.name);
@@ -154,13 +164,17 @@ let rptSignatureHelper = {
                 roleRelObj.sign_date_format = 'yyyy年M月d日';
                 roleRelObj.user_name = userAcc.name;
                 roleRelObj.acc_id = userAcc.id;
+                roleRelObj.sign_output = [NORMAL_SIGN_STR]; // 默认是签字(还有:COMPANY_SIGN_STR:单位章, PRIVATE_SIGN_STR:个人章)
+                roleRelObj.company_stamp_path = rptSignatureHelper._getCompanySign(userAcc.company);
+                roleRelObj.private_stamp_path = (userAcc.stamp_path && userAcc.stamp_path !== '') ? userAcc.stamp_path : null;
                 roleRelObj.type = '角色';
                 roleRelObj.role = (userAcc.role === '')?DFT_ROLE_NAME:userAcc.role;
                 roleRelObj.role_name = roleAcc.name;
                 ROLE_REL_LIST.push(roleRelObj);
+                roleRel = roleRelObj;
             }
             // elementsStrArr.push('');
-            rptSignatureHelper.pushDatePickerDom(elementsStrArr, userAcc.id);
+            rptSignatureHelper.pushDatePickerDom(elementsStrArr, userAcc, roleRel);
             $(rptSignatureHelper.currentSelectedESignAccDom).append(elementsStrArr.join(' '));
             //.appendChild(pNode);
             //*/
@@ -235,18 +249,11 @@ let rptSignatureHelper = {
                                 //角色
                                 rptSignatureHelper.pushDomElementByRole(elementsStrArr, role_rel.role_name, role_rel.user_name);
                             }
-                            const idSuffixStr = 'dtp_' + role_rel.signature_name + '_' + signatureDivId;
-                            elementsStrArr.push('<div class="">');
-                            if (role_rel.sign_date !== '') {
-                                const dt = new Date(role_rel.sign_date);
-                                const dtVal = dt.Format('yyyy-MM-dd');
-                                //elementsStrArr.push('<input class="datepicker-here form-control form-control-sm mt-0" placeholder="选择签名日期" data-language="zh" type="text" value="' + (new Date(role_rel.sign_date)).Format('yyyy-M-d') + '">');
-                                // elementsStrArr.push('<input id="' + idSuffixStr + '" class="datepicker-here form-control form-control-sm mt-0" placeholder="选择签名日期" data-language="zh" type="text" readonly="true" value="' + dtVal + '"');
-                                elementsStrArr.push('<input id="' + idSuffixStr + '" class="form-control form-control-sm mt-0" placeholder="选择签名日期" type="date" value="' + dtVal + '"');
-                            } else {
-                                // elementsStrArr.push('<input id="' + idSuffixStr + '" class="datepicker-here form-control form-control-sm mt-0" placeholder="选择签名日期" data-language="zh" type="text" readonly="true"');
-                                elementsStrArr.push('<input id="' + idSuffixStr + '" class="form-control form-control-sm mt-0" placeholder="选择签名日期" type="date"');
-                            }
+                            const userAcc = rptSignatureHelper.getUserAccount(role_rel.acc_id);
+                            role_rel.private_stamp_path = (userAcc.stamp_path && userAcc.stamp_path !== '') ? userAcc.stamp_path : '';
+                            role_rel.company_stamp_path = rptSignatureHelper._getCompanySign(userAcc.company);
+                    
+                            rptSignatureHelper.pushDatePickerDom(elementsStrArr, userAcc, role_rel);
                             hasPic = true;
                             break;
                         }
@@ -281,74 +288,72 @@ let rptSignatureHelper = {
         elementsStrArr.push('<p class=" d-flex justify-content-between m-0"><span>' + userName +
             '-<small class="text-muted">' + ((userRole === '')?DFT_ROLE_NAME:userRole) +
             '</small></span><a onclick="rptSignatureHelper.removeSignature(this)" class="text-danger"><i class="fa fa-remove" title="移除签名"></i></a></p>');
-        // rptSignatureHelper.pushDatePickerDom(elementsStrArr);
     },
     pushDomElementByRole: function (elementsStrArr, roleName, userName) {
         elementsStrArr.push('<p class=" d-flex justify-content-between m-0"><span><i class="fa fa-user" title="角色"> ' + roleName +
             '</i>-<small class="text-muted">' + userName +
             '</small></span><a onclick="rptSignatureHelper.removeSignature(this)" class="text-danger"><i class="fa fa-remove" title="移除签名"></i></a></p>');
-        // rptSignatureHelper.pushDatePickerDom(elementsStrArr);
     },
-    pushDatePickerDom: function (elementsStrArr, userAccId) {
+    pushDatePickerDom: function (elementsStrArr, userAcc, role_rel) {
         let idSuffixStr = 'dtp_' + rptSignatureHelper.currentSelectedESignAccName + '_' + rptSignatureHelper.currentSelectedESignParentDivId;
-        elementsStrArr.push('<div class="">');
-        // 日期控件存在页面高度不过高无法选中bug,先不用
-        // elementsStrArr.push('<input id="' + idSuffixStr + '" class="datepicker-here form-control form-control-sm mt-0" placeholder="选择签名日期" data-language="zh" data-position="right bottom" type="text" readonly="true"');
-        //*
-        let dftDate = _getSignDateByAllScenarios(userAccId);
+        elementsStrArr.push('<div class="mt-3">');
+        elementsStrArr.push('<div class="row">');
+        //-------------------------------------------------
+        if (!Array.isArray(role_rel.sign_output)) {
+            role_rel.sign_output = [NORMAL_SIGN_STR];
+        }
+        const normalSignChkStr = (role_rel.sign_output.indexOf(NORMAL_SIGN_STR) >= 0) ? 'checked' : '';
+        const companySignChkStr = (role_rel.sign_output.indexOf(COMPANY_SIGN_STR) >= 0) ? 'checked' : '';
+        const privateSignChkStr = (role_rel.sign_output.indexOf(PRIVATE_SIGN_STR) >= 0) ? 'checked' : '';
+        // 1. 签章类型:签字 单位章 个人章....
+        elementsStrArr.push('<div class="col-6">');
+        elementsStrArr.push('   <div class="form-control form-control-sm d-inline pt-2">');
+        elementsStrArr.push('       <div class="form-check form-check-inline px-2">');
+        elementsStrArr.push(`           <input class="form-check-input" type="checkbox" id="${idSuffixStr}_sign1" value="option1" ${normalSignChkStr} onchange="rptSignatureHelper._changeSignType(this, ${userAcc.id}, '${NORMAL_SIGN_STR}')" >`);
+        elementsStrArr.push(`           <label class="form-check-label" for="${idSuffixStr}_sign1">签字</label>`);
+        elementsStrArr.push('       </div>');
+        const hasIndividualStamp = (userAcc.stamp_path && userAcc.stamp_path !== ''); //用户账号的stamp_path是属于用户自己的私章,不是公司章
+        let chkType = hasIndividualStamp ? 'radio' : 'checkbox';
+        if (hasIndividualStamp) {
+            elementsStrArr.push('       <div class="form-check form-check-inline mx-1">');
+            elementsStrArr.push('           <div class="form-group">');
+            elementsStrArr.push('               <div class="form-check form-check-inline px-1">');
+            elementsStrArr.push(`                   <input class="form-check-input" type="${chkType}" id="${idSuffixStr}_sign2" value="companyStamp" name="${idSuffixStr}" onchange="rptSignatureHelper._changeSignType(this, ${userAcc.id}, '${COMPANY_SIGN_STR}')" ${companySignChkStr}>`);
+            elementsStrArr.push(`                   <label class="form-check-label" for="${idSuffixStr}_rdSign1">单位章</label>`);
+            elementsStrArr.push('               </div>');
+            elementsStrArr.push('               <div class="form-check form-check-inline">');
+            elementsStrArr.push(`                   <input class="form-check-input" type="${chkType}" id="${idSuffixStr}_sign3" value="individualStamp" name="${idSuffixStr}" onchange="rptSignatureHelper._changeSignType(this, ${userAcc.id}, '${PRIVATE_SIGN_STR}')" ${privateSignChkStr}>`);
+            elementsStrArr.push(`                   <label class="form-check-label" for="${idSuffixStr}_sign3">个人章</label>`);
+            elementsStrArr.push('               </div>');
+            elementsStrArr.push('           </div>');
+            elementsStrArr.push('       </div>');
+        } else {
+            elementsStrArr.push('       <div class="form-check form-check-inline px-2">');
+            elementsStrArr.push(`           <input class="form-check-input" type="${chkType}" id="${idSuffixStr}_sign2" value="option2" onchange="rptSignatureHelper._changeSignType(this, ${userAcc.id}, '${COMPANY_SIGN_STR}')" ${companySignChkStr}>`);
+            elementsStrArr.push(`           <label class="form-check-label" for="${idSuffixStr}_sign2">单位章</label>`);
+            elementsStrArr.push('       </div>');
+        }
+        elementsStrArr.push('   </div>');
+        elementsStrArr.push('</div>');
+        // 2. 日期
+        elementsStrArr.push('<div class="col-6">');
+        let dftDate = _getSignDateByAllScenarios(userAcc.id);
         if (dftDate !== '' && dftDate.length > 20) {
             dftDate = (new Date(dftDate)).Format('yyyy-MM-dd');
         }
-        /*/
-        let dftDate = '';
-        let hasAudit = false;
-        if (STAGE_AUDIT && STAGE_AUDIT.length > 0) {
-            for (const stga of STAGE_AUDIT) {
-                if (stga.aid === userAccId) {
-                    hasAudit = true;
-                    if (stga.status === 3 && stga.end_time && stga.end_time !== '' && stga.end_time.length > 20) {
-                        //只有在审批人通过后才获取审批时间
-                        // let dt = new Date(stga.end_time);
-                        dftDate = (new Date(stga.end_time)).Format('yyyy-MM-dd');
-                    } else {
-                        dftDate = '';
-                    }
-                    // break; // 实际情况:有可能会有多次审核,要取最后一次
-                }
-            }
-        }
-        let isOrgRpt = false;
-        for (const stg of STAGE_LIST) {
-            if (stg.id === current_stage_id) {
-                if (stg.user_id === userAccId) {
-                    isOrgRpt = true;
-                }
-                break;
-            }
-        }
-        if (isOrgRpt && !hasAudit && STAGE_AUDIT_ORG && STAGE_AUDIT_ORG.length > 0) {
-            if (STAGE_AUDIT_ORG[0].begin_time && STAGE_AUDIT_ORG[0].begin_time !== '' && STAGE_AUDIT_ORG[0].begin_time.length > 20) {
-                dftDate = (new Date(STAGE_AUDIT_ORG[0].begin_time)).Format('yyyy-MM-dd');
-            }
-        }
-        if (!isOrgRpt && !hasAudit) {
-            //非审批流程人员以及非原报,则显示期截至时间
-            for (const stg of STAGE_LIST) {
-                if (stg.id === current_stage_id && stg.period) {
-                    const period = stg.period.split(' ~ ');
-                    if (period.length === 2) {
-                        dftDate = period[1];
-                    }
-                }
-            }
-        }
-        //*/
+        elementsStrArr.push('<div class="input-group input-group-sm margin-inputbox">');
+        elementsStrArr.push('   <div class="input-group-prepend">');
+        elementsStrArr.push('       <span class="input-group-text height-inputbox" id="inputGroup-sizing-sm"><i class="fa fa-calendar" title="添加签名日期"></i></span>');
+        elementsStrArr.push('   </div>');
         if (dftDate !== '') {
-            elementsStrArr.push('<input id="' + idSuffixStr + '" class="form-control form-control-sm mt-0" placeholder="选择签名日期" type="date" value="' + dftDate + '"');
+            elementsStrArr.push(`<input id="${idSuffixStr}" type="text" class="form-control datepicker-here height-inputbox" aria-label="Small" aria-describedby="inputGroup-sizing-sm" data-language="zh" value="${dftDate}"></input>`);
         } else {
-            elementsStrArr.push('<input id="' + idSuffixStr + '" class="form-control form-control-sm mt-0" placeholder="选择签名日期" type="date"');
+            elementsStrArr.push(`<input id="${idSuffixStr}" type="text" class="form-control datepicker-here height-inputbox" aria-label="Small" aria-describedby="inputGroup-sizing-sm" data-language="zh"></input>`);
         }
         elementsStrArr.push('</div>');
+        //-------------------------------------------------
+        elementsStrArr.push('</div>');
+        elementsStrArr.push('</div>');
     },
     removeSignature: function (dom) {
         let accTxtName = $(dom.parentNode.parentNode.parentNode.parentNode.parentNode).find('label')[0].innerText;
@@ -480,10 +485,15 @@ let rptSignatureHelper = {
         rptSignatureHelper.resetSignAudit();
         if (current_stage_status === 3) {
             //1. 重刷page
+            let hasStamp = false;
             for (const page of zTreeOprObj.currentRptPageRst.items) {
                 if (page.signature_cells) {
-                    for (const sCell of page.signature_cells) {
-                        if (sCell.hasOwnProperty('pre_path')) {
+                    for (let cIdx = page.signature_cells.length - 1; cIdx >= 0; cIdx--) {
+                        const sCell = page.signature_cells[cIdx];
+                        if (sCell.isStamp) {
+                            page.signature_cells.splice(cIdx);
+                            hasStamp = true;
+                        } else if (sCell.hasOwnProperty('pre_path')) {
                             sCell.path = sCell.pre_path;
                             delete sCell.pre_path;
                         }
@@ -528,6 +538,7 @@ let rptSignatureHelper = {
                         rptSignatureHelper.mergeSignDate(zTreeOprObj.currentRptPageRst, ROLE_REL_LIST, true);
                         rptSignatureHelper.mergeSignature(zTreeOprObj.currentRptPageRst, ROLE_REL_LIST);
                         rptSignatureHelper.mergeSignAudit(zTreeOprObj.currentRptPageRst, ROLE_REL_LIST, STAGE_AUDIT);
+                        zTreeOprObj.showPage(zTreeOprObj.currentPage, zTreeOprObj.canvas);
                     }
                 } else {
                     // CURRENT_ROLE_REL_ID = -1;
@@ -620,20 +631,62 @@ let rptSignatureHelper = {
         }
         return rst;
     },
+    _getCompanySign: function(companyName) {
+        let rst = '';
+        for (const cUnit of CONSTRUCT_UNIT_LIST) {
+            if (cUnit.name === companyName) {
+                rst = cUnit.sign_path;
+                break;
+            }
+        }
+        return rst;
+    },
     mergeSignature: function (pageData, currRoleRelList, setPic = false) {
         for (const page of pageData.items) {
             if (page.signature_cells) {
+                const adHocScells = [];
                 for (const sCell of page.signature_cells) {
                     for (const role_rel of currRoleRelList) {
                         if (role_rel.signature_name === sCell.signature_name) {
-                            sCell.path = role_rel.sign_path;
-                            sCell.pre_path = role_rel.sign_path;
-                            if (setPic) {
-                                sCell.pic = role_rel.sign_pic; // 有些场景(如:批量归档)需要直接设置签名数据
+                            // 处理签章
+                            if (!Array.isArray(role_rel.sign_output)) {
+                                role_rel.sign_output = [];
+                                role_rel.sign_output.push(NORMAL_SIGN_STR);
+                            }
+                            for (const signType of role_rel.sign_output) {
+                                switch (signType) {
+                                    case NORMAL_SIGN_STR:
+                                        sCell.path = role_rel.sign_path;
+                                        sCell.pre_path = role_rel.sign_path;
+                                        if (setPic) {
+                                            sCell.pic = role_rel.sign_pic; // 有些场景(如:批量归档)需要直接设置签名数据
+                                        }
+                                        break;
+                                    case COMPANY_SIGN_STR:
+                                    case PRIVATE_SIGN_STR:
+                                        /*
+                                        const stampPath = (signType === COMPANY_SIGN_STR) ? role_rel.company_stamp_path : role_rel.private_stamp_path;
+                                        // 生成一个新的dummy cell(类似草图)
+                                        const newStampCell = _createDummyCell();
+                                        newStampCell.signature_name = JV.SIGNATURE_NAME_DUMMY;
+                                        newStampCell.path = OSS_PATH + stampPath;
+                                        newStampCell.control = sCell.control;
+                                        newStampCell.style = sCell.style;
+                                        newStampCell.isStamp = true; // 这个标记纯属为了刷新用,其他sign cell是没有的
+                                        // 设置坐标
+                                        rptSignatureHelper._resetStampPos(sCell, newStampCell, pageData[JV.NODE_CONTROL_COLLECTION]);
+                                        // 加到cells去
+                                        adHocScells.push(newStampCell);
+                                        //*/
+                                    break;
+                                    default:
+                                    break;
+                                }
                             }
                         }
                     }
                 }
+                page.signature_cells = page.signature_cells.concat(adHocScells);
             }
         }
     },
@@ -740,7 +793,65 @@ let rptSignatureHelper = {
                 }
             }
         }
-    }
+    },
+    _changeSignType: function(dom, acc_id, chkStr) {
+        for (const roleRel of ROLE_REL_LIST) {
+            if (roleRel.acc_id === acc_id) {
+                if (dom.checked) {
+                    if (roleRel.sign_output.indexOf(chkStr) < 0) {
+                        roleRel.sign_output.push(chkStr);
+                    }
+                } else {
+                    let idx = roleRel.sign_output.indexOf(chkStr);
+                    if (idx >= 0) {
+                        roleRel.sign_output.splice(idx, 1);
+                    }
+                }
+                if (chkStr === COMPANY_SIGN_STR) {
+                    let idx = roleRel.sign_output.indexOf(PRIVATE_SIGN_STR);
+                    if (idx >= 0) {
+                        roleRel.sign_output.splice(idx, 1);
+                    }
+                } else if (chkStr === PRIVATE_SIGN_STR) {
+                    let idx = roleRel.sign_output.indexOf(COMPANY_SIGN_STR);
+                    if (idx >= 0) {
+                        roleRel.sign_output.splice(idx, 1);
+                    }
+                }
+                break;
+            }
+        }
+    },
+    _resetStampPos: function(orgCell, targetCell, controls) {
+        const ctrl = controls[orgCell.control];
+        let pLeft = orgCell.area.Left, pTop = orgCell.area.Top;
+        switch(ctrl[JV.CONTROL_PROPS[JV.CONTROL_PROP_IDX_HORIZON]]) {
+            case JV.OUTPUT_ALIGN.H[JV.H_ALIGN_IDX_LEFT]: 
+                pLeft = orgCell.area.Left;
+            break;
+            case JV.OUTPUT_ALIGN.H[JV.H_ALIGN_IDX_CENTER]: 
+                pLeft = (orgCell.area.Left + orgCell.area.Right - STD_STAMP_SIZE_WIDTH) / 2 ;
+            break;
+            case JV.OUTPUT_ALIGN.H[JV.H_ALIGN_IDX_RIGHT]: 
+                pLeft = orgCell.area.Right - STD_STAMP_SIZE_WIDTH;
+            break;
+        }
+        switch(ctrl[JV.CONTROL_PROPS[JV.CONTROL_PROP_IDX_VERTICAL]]) {
+            case JV.OUTPUT_ALIGN.H[JV.V_ALIGN_IDX_TOP]: 
+                pTop = orgCell.area.Top;
+            break;
+            case JV.OUTPUT_ALIGN.H[JV.V_ALIGN_IDX_CENTER]: 
+                pTop = (orgCell.area.Top + orgCell.area.Bottom - STD_STAMP_SIZE_HEIGHT) / 2 ;
+            break;
+            case JV.OUTPUT_ALIGN.H[JV.V_ALIGN_IDX_BOTTOM]: 
+                pTop = orgCell.area.Bottom - STD_STAMP_SIZE_HEIGHT;
+            break;
+        }
+        targetCell.area.Left = pLeft;
+        targetCell.area.Top = pTop;
+        targetCell.area.Right = pLeft + STD_STAMP_SIZE_WIDTH;
+        targetCell.area.Bottom = pTop + STD_STAMP_SIZE_HEIGHT;
+    },
 }
 
 function _getSignDateByAllScenarios(userAccId) {
@@ -789,6 +900,17 @@ function _getSignDateDftName() {
     return '    年  月  日';
 }
 
+function _createDummyCell() {
+    const rst = {
+        font: 'Footer',
+        control: 'Footer',
+        style: 'Default_None',
+        Value: '',
+        area: { Left: 0, Right: 0, Top: 0, Bottom: 0 },
+    };
+    return rst;
+}
+
 function resetTextSignature(pageData) {
     for (const page of pageData.items) {
         for (let sCell of page.signature_cells) {
@@ -826,4 +948,4 @@ function resetTextSignature(pageData) {
             }
         }
     }
-}
+}

+ 7 - 7
app/reports/util/rpt_excel_util.js

@@ -1441,7 +1441,7 @@ function _checkAndSetSignatureCache(pageData, signKeyArr, signPathArr, roleRel,
                         // console.log(chkRoles);
                     }
                     if (signature.pic) {
-                        const signPath = { signature_name: signature.signature_name,  path: null, pic: null };
+                        const signPath = { signature_name: signature.signature_name, path: null, pic: null };
                         signPathArr.push(signPath);
                         signPath.pic = signature.pic; // 历史报表
                         signKeyArr.push(signature.signature_name);
@@ -1459,7 +1459,7 @@ function _checkAndSetSignatureCache(pageData, signKeyArr, signPathArr, roleRel,
                                     rst = true;
                                     signSheetIdxArr[pageIdx] = true;
                                 } else if (role.sign_path) {
-                                    let sPObj = _getDupPicPath(role.sign_path);
+                                    const sPObj = _getDupPicPath(role.sign_path);
                                     if (sPObj !== null && isSinglePage) { // 只有在isSinglePage为true时,才需要优化签名
                                     // if (sPObj !== null) {
                                     //     console.log('signature');
@@ -1488,7 +1488,7 @@ function _checkAndSetSignatureCache(pageData, signKeyArr, signPathArr, roleRel,
                     // console.log(`duplicate signature: ${signature.signature_name}`);
                     // signSheetIdxArr[pageIdx] = true;
                 }
-                //*/
+                //* /
             }
         }
         if (page[JV.PROP_WATERMARK_CELLS] && page[JV.PROP_WATERMARK_CELLS].length > 0) {
@@ -1516,7 +1516,7 @@ function _checkAndSetSignatureCache(pageData, signKeyArr, signPathArr, roleRel,
                 rst = true;
                 signSheetIdxArr[pageIdx] = true;
             }
-            //*/
+            //* /
         }
     }
     return rst;
@@ -1530,7 +1530,7 @@ function base64ToBuffer(dataurl) {
 }
 
 module.exports = {
-    exportExcel: function(pageData, paperSize, fName, options, custSheetNames, custSheetMergeBands, baseDir, roleRel, callback) {
+    exportExcel(pageData, paperSize, fName, options, custSheetNames, custSheetMergeBands, baseDir, roleRel, callback) {
         const rptOptions = ({ singlePage: false, fileName: 'report' });
         if (options === 'true' || options === true) {
             rptOptions.singlePage = true;
@@ -1639,7 +1639,7 @@ module.exports = {
                 file = 'image' + picIdx + '.png';
                 zip_media.file(file, data, { compression: 'DEFLATE' });
             }
-            //*/
+            //* /
             // 5.2
             const zip_drawings = zip_xl.folder('drawings');
             data = writeDrawings(pageData, signKeyArr, signPathArr, isSinglePage, signSheetIdxArr);
@@ -1744,7 +1744,7 @@ module.exports = {
         }
     },
 
-    exportExcelInOneBook: function(pageDataArray, paperSize, fName, baseDir, roleRelArr, callback) {
+    exportExcelInOneBook(pageDataArray, paperSize, fName, baseDir, roleRelArr, callback) {
         const me = this;
         const newPageData = {};
         // 1. 重新编排一下数据,把一份报表的pageData合并到一起作为一个Sheet输出(需要重新调整数据纵向坐标),多份报表数据就形成多个Sheet

+ 2 - 2
app/service/project_account.js

@@ -265,7 +265,7 @@ module.exports = app => {
          */
         async getAccountByProjectId(projectId) {
             const condition = {
-                columns: ['id', 'account', 'name', 'company', 'account_group', 'role', 'mobile', 'telephone', 'enable', 'permission', 'sign_path'],
+                columns: ['id', 'account', 'name', 'company', 'account_group', 'role', 'mobile', 'telephone', 'enable', 'permission', 'sign_path', 'stamp_path'],
                 where: { project_id: projectId, is_admin: 0 },
             };
             const accountList = await this.getAllDataByCondition(condition);
@@ -281,7 +281,7 @@ module.exports = app => {
          */
         async getAllAccountByProjectId(projectId) {
             const condition = {
-                columns: ['id', 'account', 'name', 'company', 'account_group', 'role', 'mobile', 'telephone', 'enable', 'permission', 'sign_path'],
+                columns: ['id', 'account', 'name', 'company', 'account_group', 'role', 'mobile', 'telephone', 'enable', 'permission', 'sign_path', 'stamp_path'],
                 where: { project_id: projectId },
             };
             const accountList = await this.getAllDataByCondition(condition);

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

@@ -299,6 +299,7 @@
     const category = JSON.parse('<%- JSON.stringify(categoryData) %>');
     const auditConst = JSON.parse('<%- JSON.stringify(auditConst) %>');
     const ledgerAuditConst = JSON.parse('<%- JSON.stringify(ledgerAuditConst) %>');
+    const OSS_PATH = '<%- OSS_PATH %>';
     $(document).ready(() => {
         rptCustomObj.initTenderTree(tenders, category);
         // rptCustomObj.initTenderTreeForCross(tenders, category);
@@ -388,6 +389,7 @@
     const STAGE_TIMES = <%- stg_times %>;
     const STAGE_LIST = <%- stage_list %>;
     const PRJ_ACCOUNT_LIST = <%- prj_account_list %>;
+    const CONSTRUCT_UNIT_LIST = <%- unitList %>;
     const ROLE_LIST = <%- role_list %>;
     const CUST_NAME = '<%- ctx.session.sessionUser.name %>';
     if (localStorage[CUST_NAME + '_custCfg']) {

+ 4 - 4
app/view/report/rpt_all_popup.ejs

@@ -192,7 +192,7 @@
     </div>
 </div>
 <div class="modal fade" id="eSignature" data-backdrop="static">
-    <div class="modal-dialog" role="document">
+    <div class="modal-dialog modal-lg" role="document">
         <div class="modal-content">
             <div class="modal-header">
                 <h5 class="modal-title">设置签字(审核通过后才显示)</h5>
@@ -218,7 +218,7 @@
     </div>
 </div>
 <div class="modal fade" id="batch-eSignature" data-backdrop="static">
-    <div class="modal-dialog modal-lg" role="document">
+    <div class="modal-dialog modal-xl" role="document">
         <div class="modal-content">
             <div class="modal-header">
                 <h5 class="modal-title">批量设置签字</h5>
@@ -229,11 +229,11 @@
             <div class="modal-body">
                 <div class="modal-height-300">
                     <div class="row">
-                        <div class="col-6">
+                        <div class="col-4">
                             <table class="table table-hover table-bordered" id="batch_tenders_individual">
                             </table>
                         </div>
-                        <div class="col-6" id="batch-eSignatureBodyDiv"></div>
+                        <div class="col-8" id="batch-eSignatureBodyDiv"></div>
                     </div>
                 </div>
                 <div class="alert alert-warning">批量操作会覆盖已设置好的签字,请谨慎操作。</div>