|
@@ -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' });
|