浏览代码

TASK #5043 调整

Tony Kang 5 月之前
父节点
当前提交
58761e457e
共有 2 个文件被更改,包括 103 次插入30 次删除
  1. 76 13
      app/public/report/js/rpt_jsexcel.js
  2. 27 17
      app/public/report/js/rpt_signature.js

+ 76 - 13
app/public/report/js/rpt_jsexcel.js

@@ -1062,6 +1062,14 @@ function writeDrawing(pageData, sheetData, subSignKeyArr, sheetIdx) {
     const yPos = [];
     const yMultiPos = [];
 
+    const _getPicIndex = (signCell) => {
+        // signatureCell.flowAccIdx = signPath.flowAccIdx;
+        let signKey = signCell.signature_name;
+        if (signCell.hasOwnProperty('flowAccIdx') && signCell.flowAccIdx >= 0) {
+            signKey = `${signCell.signature_name}_${signCell.flowAccIdx}`;
+        }
+        return subSignKeyArr.indexOf(signKey);
+    };
     const private_setSheetDrawingCellData = function(signCell, theYPos, startPicIdx, offsetRow) {
         let cellControl;
         if (typeof signCell[JV.PROP_CONTROL] === 'string') {
@@ -1108,7 +1116,8 @@ function writeDrawing(pageData, sheetData, subSignKeyArr, sheetIdx) {
         // 3.2
         rst.push('<xdr:blipFill>');
         // 重点!!!
-        const picIdx = subSignKeyArr.indexOf(signCell.signature_name) + 1;
+        // const picIdx = subSignKeyArr.indexOf(signCell.signature_name) + 1;
+        const picIdx = _getPicIndex(signCell) + 1;
         // 3.2.1
         rst.push('<a:blip xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" r:embed="rId' + picIdx + '" cstate="print">');
         rst.push('<a:extLst>');
@@ -1158,13 +1167,15 @@ function writeDrawing(pageData, sheetData, subSignKeyArr, sheetIdx) {
         // console.log('sheetData');
         let startPicIdx = 2 + sheetIdx * 1000;
         for (const sCell of sheetData[JV.PROP_SIGNATURE_CELLS]) {
-            if (subSignKeyArr.indexOf(sCell.signature_name) >= 0) {
+            if (_getPicIndex(sCell) >= 0) {
+            // if (subSignKeyArr.indexOf(sCell.signature_name) >= 0) {
                 private_setSheetDrawingCellData(sCell, yPos, startPicIdx, 0);
                 startPicIdx++;
             }
         }
         for (const sCell of sheetData[JV.PROP_WATERMARK_CELLS]) {
-            if (subSignKeyArr.indexOf(sCell.signature_name) >= 0) {
+            if (_getPicIndex(sCell) >= 0) {
+            // if (subSignKeyArr.indexOf(sCell.signature_name) >= 0) {
                 private_setSheetDrawingCellData(sCell, yPos, startPicIdx, 0);
                 startPicIdx++;
             }
@@ -1177,13 +1188,15 @@ function writeDrawing(pageData, sheetData, subSignKeyArr, sheetIdx) {
             const tmpPos = yMultiPos[i];
             let startPicIdx = 2;
             for (const sCell of shtItemData[JV.PROP_SIGNATURE_CELLS]) {
-                if (subSignKeyArr.indexOf(sCell.signature_name) >= 0) {
+                if (_getPicIndex(sCell) >= 0) {
+                // if (subSignKeyArr.indexOf(sCell.signature_name) >= 0) {
                     private_setSheetDrawingCellData(sCell, tmpPos, startPicIdx, rowOffset);
                     startPicIdx++;
                 }
             }
             for (const sCell of shtItemData[JV.PROP_WATERMARK_CELLS]) {
-                if (subSignKeyArr.indexOf(sCell.signature_name) >= 0) {
+                if (_getPicIndex(sCell) >= 0) {
+                // if (subSignKeyArr.indexOf(sCell.signature_name) >= 0) {
                     private_setSheetDrawingCellData(sCell, tmpPos, startPicIdx, rowOffset);
                     startPicIdx++;
                 }
@@ -1276,6 +1289,28 @@ function _checkAndSetSignatureCache(pageData, signKeyArr, signPathArr, roleRel,
         }
         return rst;
     };
+    const _chkSignKeys = (signature_name, pageIdx) => {
+        let rst = false;
+        let signKey = signature_name;
+        for (const role_rel of chkRoles) {
+            if (role_rel.signature_name === signature_name && role_rel.type === '流程') {
+                signKey = `${signature_name}_${role_rel.flowAccList[pageIdx]}`;
+                break;
+            }
+        }
+        rst = signKeyArr.includes(signKey);
+        return rst;
+    };
+    const _getFlowPicIndex = (signCell, pageIdx) => {
+        let rst = -1;
+        for (const role_rel of chkRoles) {
+            if (role_rel.signature_name === signCell.signature_name && role_rel.type === '流程') {
+                rst = role_rel.flowAccList[pageIdx];
+                break;
+            }
+        }
+        return rst;
+    };
     for (let pageIdx = 0; pageIdx < pageData.items.length; pageIdx++) {
         const page = pageData.items[pageIdx];
         // 优化调整,不再每页都设置一个,重复的签名只需要一个即可(极端case: 13xx多页的签名文档,导出有1.3G大)
@@ -1284,7 +1319,8 @@ function _checkAndSetSignatureCache(pageData, signKeyArr, signPathArr, roleRel,
         if (page[JV.PROP_SIGNATURE_CELLS] && page[JV.PROP_SIGNATURE_CELLS].length > 0) {
             for (const signatureCell of page[JV.PROP_SIGNATURE_CELLS]) {
                 // 这里把图片的路径作为key值判断
-                if (signKeyArr.indexOf(signatureCell.signature_name) < 0) {
+                if (!_chkSignKeys(signatureCell.signature_name, pageIdx)) {
+                // if (signKeyArr.indexOf(signatureCell.signature_name) < 0) {
                     // 还得判断用户是否有选择签名输出
                     for (const role_rel of chkRoles) {
                         const role = getTheRightRole(role_rel, pageIdx);
@@ -1318,14 +1354,29 @@ function _checkAndSetSignatureCache(pageData, signKeyArr, signPathArr, roleRel,
                                         let sPObj = _getDupPicPath(role.sign_path);
                                         if (sPObj !== null && isSinglePage) { // 只有在isSinglePage为true时,才需要优化签名
                                             signatureCell.signature_name = sPObj.signature_name; // 重点,如果有相同路径的,修改signature_name!
+                                            if (sPObj.flowAccIdx) signatureCell.flowAccIdx = sPObj.flowAccIdx;
                                             rst = true;
                                         } else {
                                             const signPath = { signature_name: signatureCell.signature_name, path: null, pic: null };
-                                            signPathArr.push(signPath);
-                                            signPath.path = role.sign_path;
-                                            signKeyArr.push(signatureCell.signature_name);
-                                            rst = true;
-                                            signSheetIdxArr[pageIdx] = true;
+                                            if (role_rel.type === '流程') {
+                                                signPath.flowAccIdx = role_rel.flowAccList[pageIdx]
+                                                if (signPath.flowAccIdx >= 0) {
+                                                    signKeyArr.push(`${signatureCell.signature_name}_${role_rel.flowAccList[pageIdx]}`);
+                                                    signatureCell.flowAccIdx = signPath.flowAccIdx;
+                                                    signPathArr.push(signPath);
+                                                    signPath.path = role.sign_path;
+                                                    rst = true;
+                                                    signSheetIdxArr[pageIdx] = true;
+                                                } else {
+                                                    // 这里不应有签名
+                                                }
+                                            } else {
+                                                signKeyArr.push(signatureCell.signature_name);
+                                                signPathArr.push(signPath);
+                                                signPath.path = role.sign_path;
+                                                rst = true;
+                                                signSheetIdxArr[pageIdx] = true;
+                                            }
                                         }
                                     }
                                 }
@@ -1334,8 +1385,11 @@ function _checkAndSetSignatureCache(pageData, signKeyArr, signPathArr, roleRel,
                         }
                     }
                 } else {
-                    // console.log(`duplicate signature: ${signatureCell.signature_name}`);
-                    // signSheetIdxArr[pageIdx] = true;
+                    // 终于需要此code branch了,因有流程签名,如果是流程签名,还需要加flowAccIdx属性
+                    const flowIdx = _getFlowPicIndex(signatureCell, pageIdx);
+                    if (flowIdx >= 0) {
+                        signatureCell.flowAccIdx = flowIdx;
+                    }
                 }
             }
         }
@@ -1429,12 +1483,21 @@ const excelExportUtil = {
         data = writeTheme();
         zip_theme.file(file, data, { compression: 'DEFLATE' });
         if (hasSignature) {
+            // const _getTheRightPath = (signPath) => {
+            //     for (const role of thisRoleRel) {
+            //         if (role.signature_name === signPath.signature_name && role.type === '流程') {
+            //             //
+            //         }
+            //     }
+            // };
             // 5.1 写所有的image
             const zip_media = zip_xl.folder('media');
             let picIdx = 0;
             // 优化调整,不再每页都设置一个,重复的签名只需要一个即可(极端case: 13xx多页的签名文档,导出有1.3G大)
             for (let pathIdx = 0; pathIdx < signPathArr.length; pathIdx++) {
                 picIdx++;
+                // 因业务调整,需要增加流程判断
+                // thisRoleRel
                 data = await writeImage(signPathArr[pathIdx].path, signPathArr[pathIdx].pic);
                 file = 'image' + picIdx + '.png';
                 zip_media.file(file, data, { compression: 'DEFLATE' });

+ 27 - 17
app/public/report/js/rpt_signature.js

@@ -234,9 +234,13 @@ let rptSignatureHelper = {
             // 个人章
             if (flowRoleRel.private_stamp_path && flowRoleRel.private_stamp_path !== '') {
                 const privateChk = flowRoleRel.sign_output.includes(PRIVATE_SIGN_STR) ? 'checked' : '';
-                assFlowElements.push(`<td><input type="checkbox" ${privateChk} onchange="rptSignatureHelper._changeSignType(this, '${roleRelObj.signature_name}', '${PRIVATE_SIGN_STR}', '${userAcc.stamp_path || ''}', ${index})" > 
-                    <a class="pl-2" href="#chose-private-stamp-path" data-toggle="modal" data-target="#chose-private-stamp-path" onclick="rptSignatureHelper.currentSelectedESignAccDom = this.parentNode;rptSignatureHelper.initChosePrivateStampPath('${userAcc.stamp_path}','${roleRelObj.signature_name}', ${index}) ">选择个人章</a>
-                    </td>`);
+                const pathList = (userAcc.stamp_path || '').split(';');
+                let privateSignSelection = '个人章';
+                if (pathList.length > 1) {
+                    privateSignSelection = `<a class="pl-2" href="#chose-private-stamp-path" data-toggle="modal" data-target="#chose-private-stamp-path" onclick="rptSignatureHelper.currentSelectedESignAccDom = this.parentNode;rptSignatureHelper.initChosePrivateStampPath('${userAcc.stamp_path}','${roleRelObj.signature_name}', ${index}) ">选择个人章</a>`;
+                }
+                assFlowElements.push(`<td><input type="checkbox" ${privateChk} onchange="rptSignatureHelper._changeSignType(this, '${roleRelObj.signature_name}', '${PRIVATE_SIGN_STR}', '${userAcc.stamp_path || ''}', ${index})" >
+                    ${privateSignSelection}</td>`);
             } else {
                 assFlowElements.push(`<td></td>`);
             }
@@ -1401,17 +1405,23 @@ function prepareRightFlowRoles(pageData, roleRelList = [], stg_audit = [], ledge
                 auditCache[`_${audit.aid}`] = `${audit.audit_ledger_id}`; // 统一用string类型来判断
             }
         });
-        const _chkMultiAuditFlow = (assFlowRole, page) => {
-            let rst = false;
+        const _getShortPath = (assFlowRole, page) => {
+            // 此方法获取当前页到流程审核的最短层次路径(考虑到不同人的控制的台账层次会有包含关系,需要厘清,以最短的用户为准),-1表示没有
+            let rst = -1;
+            let currentPageLedgeId = ledgerCache[page.extend_flow_options].ledger_id;
             const idStr = `${auditCache[`_${assFlowRole.acc_id}`]}`;
             const idStrs = idStr.split(',');
-            for (const key of idStrs) {
-                const rootLedgerPath = ledgerCache[`_${key}`].full_path || '';
-                const thisLedgerPath = ledgerCache[page.extend_flow_options].full_path || '';
-                if (thisLedgerPath.indexOf(rootLedgerPath) === 0) {
-                    rst = true;
+            let lv = 0;
+            while (true) {
+                if (idStrs.includes(`${currentPageLedgeId}`)) {
+                    rst = lv;
                     break;
                 }
+                lv++;
+                if (currentPageLedgeId !== -1) {
+                    currentPageLedgeId = ledgerCache[`_${currentPageLedgeId}`].ledger_pid;
+                }
+                if (currentPageLedgeId === -1) break;
             }
             return rst;
         };
@@ -1420,16 +1430,16 @@ function prepareRightFlowRoles(pageData, roleRelList = [], stg_audit = [], ledge
                 for (const role of roleRelList) {
                     if (role.type === '流程') {
                         role.flowAccList.push(-1); // !!! 每一页都要有一个流程签名指引,-1表示没有
-                        let preLen = -1; // 
+                        let preLen = 10000; // 
                         for (let assIdx = 0; assIdx < role.assFlowInfos.length; assIdx++) {
                             const assRole = role.assFlowInfos[assIdx];
                             if (auditCache[`_${assRole.acc_id}`]) {
-                                if (_chkMultiAuditFlow(assRole, page)) {
-                                    role.flowAccList[role.flowAccList.length - 1] = assIdx;
-                                    const thisLedgerPath = ledgerCache[page.extend_flow_options].full_path || '';
-                                    if (thisLedgerPath.length > preLen) {
-                                        preLen = thisLedgerPath.length; // 还要考虑到嵌套的情况
-                                    } else break;
+                                const chkLv = _getShortPath(assRole, page);
+                                if (chkLv !== -1) {
+                                    if (chkLv < preLen) {
+                                        role.flowAccList[role.flowAccList.length - 1] = assIdx;
+                                        preLen = chkLv; // 还要考虑到嵌套的情况
+                                    }
                                 }
                             }
                         }