/** * Created by Tony on 2017/6/26. */ 'use strict' const PRE_PAGE_OFFSET = 150; const NEXT_PAGE_OFFSET = 160; const FIRST_PAGE_OFFSET = 50; const LAST_PAGE_OFFSET = 60; const WAIT_TIME_EXPORT = 300000; let fontSuffixMapObj = {"表标题": "title", "列标题": "column", "正文内容": "content", "合计": "summary", "表眉/表脚": "header_footer"}; let rptTplObj = { hasInitialized: false, pdfFont: {'SmartSimsun': [], 'simhei': [], 'simkai': []}, iniPage: function() { let me = this; if (!me.hasInitialized) { zTreeOprObj.getReportTemplateTree(); zTreeOprObj.selectedPrjIDs = []; me.hasInitialized = true; zTreeOprObj.canvas = document.getElementById("rptCanvas"); zTreeOprObj.canvas.onclick = canvasOprObj.canvasOnClick; zTreeOprObj.canvas.onmousemove = canvasOprObj.canvasOnMouseMove; dynamicLoadJs('/public/jspdf/Arial Narrow-normal.js'); dynamicLoadJs('/public/jspdf/Arial Narrow-bold.js'); dynamicLoadJs('/public/jspdf/Arial Narrow-italic.js'); dynamicLoadJs('/public/jspdf/Arial Narrow-bolditalic.js'); rptControlObj.loadPDFFonts(); indexDbOprObj.iniDb('tmpForPDF', 2); // dynamicLoadJs('/public/jspdf/SmartSimsun-normal.js'); // dynamicLoadJs('/public/jspdf/SmartSimsun-normal2.js'); // dynamicLoadJs('/public/jspdf/SmartSimsun-bold.js', me.pdfFontSimsunCallBack); } }, pdfFontSimsunCallBack: function() { rptTplObj.pdfFont['SmartSimsun'].push('normal'); rptTplObj.pdfFont['SmartSimsun'].push('bold'); }, pdfFontSimkaiCallBack: function() { rptTplObj.pdfFont['simkai'].push('normal'); rptTplObj.pdfFont['simkai'].push('bold'); }, pdfFontSimheiCallBack: function() { rptTplObj.pdfFont['simhei'].push('normal'); rptTplObj.pdfFont['simhei'].push('bold'); } } let zTreeOprObj = { treeObj: null, prjFolderTreeObj: null, currentNode: null, checkedRptTplNodes: null, currentRptPageRst: null, defReportPageCfg: null, currentPage: 1, maxPages: 0, canvas: null, selectedPrjIDs: [], reIniReport: function() { const me = zTreeOprObj; JpcCanvasOutput.cleanCanvas(me.canvas); me.currentRptPageRst = null; me.currentNode = null; }, countChkedRptTpl: function () { let me = zTreeOprObj; if (me.treeObj) { me.checkedRptTplNodes = []; let chkNodes = me.treeObj.getCheckedNodes(true), cnt = 0, hasCurrentNode = false; for (let node of chkNodes) { if (node.nodeType === TPL_TYPE_TEMPLATE) { cnt++; me.checkedRptTplNodes.push(node); if (me.currentNode === node) hasCurrentNode = true; } } if (!hasCurrentNode && cnt === 0 && me.currentNode !== null) { //这里根据实际需求再做处理 cnt++; me.checkedRptTplNodes.push(me.currentNode); } $("#print_div").find("span").each(function(cIdx,elementSpan){ elementSpan.innerText = cnt; }); $("#export_div").find("span").each(function(cIdx,elementSpan){ elementSpan.innerText = cnt; }); // if (cnt) { // $('#btnBatchArchiveRpt').removeAttr('disabled'); // } else { // $('#btnBatchArchiveRpt').attr('disabled', ''); // } } }, getReportTemplateTree: function() { let me = zTreeOprObj; const _chkIfShouldFilter = function(rptItem, currentRptType = 'normal') { let rst = (!(rptItem.released) && rptItem.nodeType === 2 || rptItem.hidden); //未发布判断 或 故意隐藏 if (!rst) { // 根据当前业务类型判断及检测其他非同类报表,如动态决算类型、支付审批类型 switch(currentRptType) { case 'normal': if (rptItem.flags) { if (rptItem.flags.dynamicType || rptItem.flags.payAuditType) { if (rptItem.flags.dynamicType && rptItem.flags.dynamicType !== 'N/A') { rst = true; break; } if (rptItem.flags.payAuditType && rptItem.flags.payAuditType !== 'N/A') { rst = true; break; } } } // 检测:预付款 if (CURRENT_SELECTED_BIZ_TYPE === 'change_prepay' && rptItem.nodeType === 2) { rst = true; if (rptItem.flags && rptItem.flags.rptTplType) { if (current_advance_id > 0) { rst = !((rptItem.flags.rptTplType || '') === getAdvanceType()); } } } break; case 'juesuan': break; case 'zhifushenpi': break; default: break; } } return rst; }; const private_remove_hide_item = function (items, nlv) { if (items && items.length > 0) { for (let i = items.length - 1; i >= 0; i--) { if (_chkIfShouldFilter(items[i])) { items.splice(i, 1); } else { if (items[i].items && items[i].items.length > 0) { private_remove_hide_item(items[i].items, nlv + 1); if (items[i].items.length === 0 && nlv > 0) { items.splice(i, 1); } } } } } }; const _changeSourceType = function(items, newType = 1) {4 if (items && items.length > 0) { for (let i = items.length - 1; i >= 0; i--) { items[i].source_type = newType; if (items[i].items && items[i].items.length > 0) { _changeSourceType(items[i].items); } } } }; let nodeLv = 0; private_remove_hide_item(TOP_TREE_NODES, nodeLv); if (STAGE_ID === -300) { // -300是变更令报表用,在此情况下,经过测试,是走的tender路线,所以把source_type调整为‘标段&期’的模式(未来如有变化,可能需要调整回来) // _changeSourceType(TOP_TREE_NODES); // SOURCE_TYPE = 1; } zTreeHelper.createTreeDirectly(TOP_TREE_NODES, rpt_tpl_setting, "rptTplTree", me); me.treeObj.expandAll(true); // let topNodes = me.treeObj.getNodes(); // for (let topLvItem of topNodes) { // me.treeObj.expandNode(topLvItem, true, false, false); // if (topLvItem.items && topLvItem.items.length > 0) { // for (let secTopLvItem of topLvItem.items) { // me.treeObj.expandNode(secTopLvItem, true, false, false); // } // } // } me.refreshNodes(); }, getCustomerCfg: function() { let me = zTreeOprObj; me.defReportPageCfg = {}; Object.assign(me.defReportPageCfg, CUST_CFG); me.defReportPageCfg.margins = {}; Object.assign(me.defReportPageCfg.margins, CUST_CFG.margins); me.defReportPageCfg.fonts = []; for (let fi = 0; fi < CUST_CFG.fonts.length; fi++) { me.defReportPageCfg.fonts.push({}); Object.assign(me.defReportPageCfg.fonts[fi], CUST_CFG.fonts[fi]); } }, iniFontCfgDom: function (cfg) { for (let font of cfg.fonts) { let domArrs = []; let fontPropSuffix = fontSuffixMapObj[font.CfgDispName]; domArrs.push("
"); //1. label domArrs.push("
" + font.CfgDispName + "
"); //2. font name domArrs.push("
"); domArrs.push(""); domArrs.push("
"); //3. font height domArrs.push("
"); domArrs.push(""); domArrs.push("
"); //4. font bold italic underline domArrs.push("
"); domArrs.push(""); domArrs.push(""); domArrs.push(""); domArrs.push("
"); // domArrs.push("
"); $(domArrs.join("")).insertBefore($("#font_cfg_blank_flag")); } }, renderRptCfg: function (cfg) { this.renderMargin(cfg); this.renderFormat(cfg); }, renderMargin: function (cfg) { $("#elementMargin_Left")[0].value = cfg.margins.Left; $("#elementMargin_Right")[0].value = cfg.margins.Right; $("#elementMargin_Top")[0].value = cfg.margins.Top; $("#elementMargin_Bottom")[0].value = cfg.margins.Bottom; }, renderFormat: function (cfg) { for (let font of cfg.fonts) { let fontPropSuffix = fontSuffixMapObj[font.CfgDispName]; document.getElementById("fontName_" + fontPropSuffix).value = font.Name; document.getElementById("fontHeight_" + fontPropSuffix).value = font.FontHeight; document.getElementById("font_bold_" + fontPropSuffix).className = (font.FontBold === "T")?"btn btn-sm btn-outline-secondary active":"btn btn-sm btn-outline-secondary"; document.getElementById("font_italic_" + fontPropSuffix).className = (font.FontItalic === "T")?"btn btn-sm btn-outline-secondary active":"btn btn-sm btn-outline-secondary"; document.getElementById("font_underline_" + fontPropSuffix).className = (font.FontUnderline === "T")?"btn btn-sm btn-outline-secondary active":"btn btn-sm btn-outline-secondary"; } document.getElementById("cfg_border_thick").value = cfg.borderThick; document.getElementById("cfg_rpt_vertical_line").checked = cfg.showVerticalLine; document.getElementById("cfg_rpt_fill_zero").checked = cfg.fillZero; document.getElementById("cfg_rpt_narrow").checked = cfg.isNarrow; document.getElementById("cfg_rpt_close_warter_mark").checked = cfg.closeWarterMark; if (PAGE_SHOW['closeWatermark'] === 0) { $("#cfg_rpt_close_warter_mark_div")[0].style.display = ''; } else { $("#cfg_rpt_close_warter_mark_div")[0].style.display = 'none'; } document.getElementById("cfg_rpt_continuous").checked = cfg.continuousOutput; }, extractRptCfg: function (cfg) { cfg.margins.Left = $("#elementMargin_Left")[0].value; cfg.margins.Right = $("#elementMargin_Right")[0].value; cfg.margins.Top = $("#elementMargin_Top")[0].value; cfg.margins.Bottom = $("#elementMargin_Bottom")[0].value; for (let font of cfg.fonts) { let fontPropSuffix = fontSuffixMapObj[font.CfgDispName]; font.Name = document.getElementById("fontName_" + fontPropSuffix).value; font.FontHeight = document.getElementById("fontHeight_" + fontPropSuffix).value; font.FontBold = (document.getElementById("font_bold_" + fontPropSuffix).className === "btn btn-sm btn-outline-secondary active")?"T":"F"; font.FontItalic = (document.getElementById("font_italic_" + fontPropSuffix).className === "btn btn-sm btn-outline-secondary active")?"T":"F"; font.FontUnderline = (document.getElementById("font_underline_" + fontPropSuffix).className === "btn btn-sm btn-outline-secondary active")?"T":"F"; } cfg.showVerticalLine = document.getElementById("cfg_rpt_vertical_line").checked; cfg.isNarrow = document.getElementById("cfg_rpt_narrow").checked; cfg.fillZero = document.getElementById("cfg_rpt_fill_zero").checked; cfg.borderThick = document.getElementById("cfg_border_thick").value; }, refreshNodes: function() { let me = this; const _set_archive_icon = function (tplNode) { let hasArchive = false; if (PAGE_SHOW['showArchive']) { for (let aItem of ARCHIVE_LIST) { if (parseInt(aItem.rpt_id) === parseInt(tplNode.refId)) { hasArchive = true; tplNode.icon = "/public/css/ztree/img/diy/10.png"; break; } } } if (!hasArchive) { if (!tplNode.isParent) { tplNode.icon = null; tplNode.className = "button ico_docu"; } } }; let private_setupIsParent = function(node){ node.isParent = (node.nodeType === RT.NodeType.NODE || node.level === 0); _set_archive_icon(node); if (node.items && node.items.length) { for (let i = 0; i < node.items.length; i++) { private_setupIsParent(node.items[i]); } } }; let topNodes = me.treeObj.getNodes(); for (let i = 0; i < topNodes.length; i++) { private_setupIsParent(topNodes[i]); } me.treeObj.refresh(); }, onCheck: function(event, treeId, treeNode) { zTreeOprObj.countChkedRptTpl(); rptCustomObj.showMaterialSelect(); if (treeNode.isParent) { zTreeOprObj.treeObj.expandNode(treeNode, true, true, false); } }, onClick: async function(event,treeId,treeNode) { let me = zTreeOprObj; if (treeNode && treeNode.nodeType === TPL_TYPE_TEMPLATE && treeNode.refId > 0) { window.history.pushState({},0, window.location.pathname + `?rpt_id=${treeNode.refId}`); me.currentNode = treeNode; let params = {}; rptControlObj.getRptRequestCommonParam(params); params.rpt_tpl_id = treeNode.refId; _getSplitAmendmentParam(params, treeNode); rptArchiveObj.toggleBtn(false); if (customSelects) { const gather_select = customSelects.gather_select.find(function (x) { return x.id === treeNode.refId; }); if (gather_select) { rptCustomObj.init(gather_select.custom_define, customSelects.stageFlow, gather_select); return; } const stage_select = customSelects.stage_select.find(function (x) { return x.id === treeNode.refId; }); if (stage_select) { rptCustomObj.init(stage_select.custom_define, customSelects.stageFlow, stage_select); return; } const material_sum_select = customSelects.material_sum_select.find(function (x) { return x.id === treeNode.refId; }); if (material_sum_select) { rptCustomObj.init(material_sum_select.custom_define, customSelects.stageFlow, material_sum_select); return; } const change_select = customSelects.change_select.find(function (x) { return x.id === treeNode.refId; }); if (change_select) { rptCustomObj.init(change_select.custom_define, customSelects.stageFlow, change_select); return; } } rptArchiveObj.toggleBtn(true); delete params.orientation; await me.requestNormalReport(params); me.countChkedRptTpl(); rptCustomObj.showMaterialSelect(); } }, changePageSize: function(dom) { let me = zTreeOprObj, targetDom = document.getElementById("btnRptPageSize"); let tmpStr = targetDom.innerHTML.trim(); targetDom.innerHTML = dom.innerHTML.trim(); dom.innerHTML = tmpStr; me.changeCfg(); }, changeOrientation: function(dom) { let me = zTreeOprObj, targetDom = document.getElementById("btnRptOrientation"); let tmpStr = targetDom.innerHTML.trim(); targetDom.innerHTML = dom.innerHTML.trim(); dom.innerHTML = tmpStr; me.changeCfg(); }, changeCfg: async function(preCb = null) { let me = zTreeOprObj; if (preCb) { preCb(); } if (me.currentNode) { CUST_CFG_ORG = JSON.parse(JSON.stringify(CUST_CFG)); let params = {}; rptControlObj.getRptRequestCommonParam(params); params.rpt_tpl_id = me.currentNode.refId; _getSplitAmendmentParam(params, me.currentNode); localStorage[CUST_NAME + '_custCfg'] = JSON.stringify(CUST_CFG); if (customSelects) { const gather_select = customSelects.gather_select.find(function (x) { return x.id === me.currentNode.refId; }); if (gather_select) { rptCustomObj.init(gather_select.custom_define, customSelects.stageFlow, gather_select); return; } const stage_select = customSelects.stage_select.find(function (x) { return x.id === me.currentNode.refId; }); if (stage_select) { rptCustomObj.init(stage_select.custom_define, customSelects.stageFlow, stage_select); return; } const material_sum_select = customSelects.material_sum_select.find(function (x) { return x.id === me.currentNode.refId; }); if (material_sum_select) { rptCustomObj.init(material_sum_select.custom_define, customSelects.stageFlow, material_sum_select); return; } const change_select = customSelects.change_select.find(function (x) { return x.id === me.currentNode.refId; }); if (change_select) { rptCustomObj.init(change_select.custom_define, customSelects.stageFlow, change_select); return; } } await me.requestNormalReport(params); me.countChkedRptTpl(); rptCustomObj.showMaterialSelect(); } }, resetAfter: function (pageRst) { let size = pageRst[JV.NODE_PAGE_INFO][JV.NODE_PAGE_SIZE].slice(0); if (size[0] > size[1]) { document.getElementById("btnRptOrientation").innerHTML = "横向"; document.getElementById("hrefRptOrientation").innerHTML = "纵向"; } else { document.getElementById("btnRptOrientation").innerHTML = "纵向"; document.getElementById("hrefRptOrientation").innerHTML = "横向"; } }, _parseRoleRelList: function(org_rel_content) { const rst = JSON.parse(org_rel_content); for (const role_rel of rst) { if (role_rel.sign_date !== null && role_rel.sign_date !== undefined && role_rel.sign_date.length >= 8) { role_rel.sign_date = new Date(role_rel.sign_date); } } return rst; }, _setupArchive: function() { // }, _chkPrePayStatus: function() { let rst = -1; let me = zTreeOprObj; if (me.currentNode && me.currentNode.hasOwnProperty('flags') && me.currentNode.flags.hasOwnProperty('rptTplType')) { let prePayArr = PRE_PAY; // 返回一个数组,得自己判断,有2种type,0:开工预付款,1:材料预付款; status与stage的status对应(3表示审核通过);order表示顺序(以同类型的最大选择顺序为判断基准),selected表示是否选择(0,1) let ppType = -1; if (me.currentNode['flags']['rptTplType'] === 'tplType_prePay1') { // 开工预付款 ppType = 0; } else if (me.currentNode['flags']['rptTplType'] === 'tplType_prePay2') { // 材料预付款 ppType = 1; } for (let ppItem of prePayArr) { if (ppItem.type === ppType) { if (current_stage_id > 0 && ppItem.selected || current_stage_id === -1) { rst = ppItem.status; } } // if (ppItem.type === ppType && ppItem.selected) { // rst = ppItem.status; // break; // } } } return rst; }, requestNormalReport: async function (params) { let me = zTreeOprObj; if (COMMON_WATER_MARK_PIC_DATA === null || COMMON_WATER_MARK_PIC_DATA === '') { params.needWaterMark = true; } else { params.needWaterMark = false; } $.bootstrapLoading.start(); CommonAjax.postXsrfEx("/tender/report_api/getReport", params, 300000, true, getCookie('csrfToken_j'), async function(result){ $.bootstrapLoading.end(); let pageRst = result.data; if (params.needWaterMark) COMMON_WATER_MARK_PIC_DATA = result.waterMarkStr; STAGE_AUDIT = result.stageAudit || []; STAGE_AUDIT_ORG = result.stageAuditOrg || []; STAGE_FLOW = result.stageFlow || []; LEDGER_LIST = result.ledger || []; //stageAuditOrg if (result.signatureRelInfo && result.signatureRelInfo.length > 0) { CURRENT_ROLE_REL_ID = result.signatureRelInfo[0].id; ROLE_REL_LIST = me._parseRoleRelList(result.signatureRelInfo[0].rel_content); rptSignatureHelper.originalRoleRelList = me._parseRoleRelList(result.signatureRelInfo[0].rel_content); // prepareRightFlowRoles(pageRst, ROLE_REL_LIST, STAGE_AUDIT, LEDGER_LIST); resetStampSignature(pageRst, ROLE_REL_LIST, getStageStatus() !== 3, STAGE_AUDIT, LEDGER_LIST); rptSignatureHelper.mergeSignDate(pageRst, ROLE_REL_LIST, true, getStageStatus() !== 3); rptSignatureHelper.mergeSignature(pageRst, ROLE_REL_LIST, true, getStageStatus() !== 3); await rptSignatureHelper.resetDummySignature(pageRst, ROLE_REL_LIST, getStageStatus() !== 3); // 这里重新整理签章坐标信息(因签章大小在后台暂时获取不到,挪到前端处理) rptSignatureHelper.mergeSignAudit(pageRst, ROLE_REL_LIST, STAGE_AUDIT, getStageStatus() !== 3); if (PAGE_SHOW.isTextSignature) { resetTextSignature(pageRst, getStageStatus() !== 3); } } else { CURRENT_ROLE_REL_ID = -1; ROLE_REL_LIST = []; } // if (ROLE_REL_LIST) let canvas = zTreeOprObj.canvas; if (pageRst && pageRst.items && pageRst.items.length > 0) { me.resetAfter(pageRst); me.currentRptPageRst = pageRst; me.maxPages = pageRst.items.length; me.currentPage = 1; me.displayPageValue(); let size = JpcCanvasOutput.getReportSizeInPixel(me.currentRptPageRst, getScreenDPI()); canvas.width = size[0] * JpcCanvasOutput.scaleFactor + 20; if (size[1] > size[0]) { canvas.height = size[1] * JpcCanvasOutput.scaleFactor + 100; } else { canvas.height = size[1] * JpcCanvasOutput.scaleFactor + 50; } // zTreeOprObj.resetESignature(zTreeOprObj.currentRptPageRst); rptSignatureHelper.buildFlowAccount(); rptSignatureHelper.buildSelectableAccount(); rptSignatureHelper.buildSelectableAccountUsed(); rptSignatureHelper.buildRoleDom(ROLE_LIST); // if (PAGE_SHOW.isTextSignature) { // resetTextSignature(zTreeOprObj.currentRptPageRst, current_stage_status !== 3); // } me.showPage(1, canvas); if (PAGE_SHOW.showArchive) { rptArchiveObj.showArchivedItem(me.currentNode); } } else { //返回了无数据表 JpcCanvasOutput.cleanCanvas(canvas); JpcCanvasOutput.drawPageBorder(me.currentRptPageRst, canvas, getScreenDPI()); } rptCustomObj.init(result.customDefine, result.stageFlow, result.customSelect); try { if (is_debug && result.debugInfo) { console.log('含有key的debug信息:'); for (const k in result.debugInfo.key) { console.log(k + ':', ...result.debugInfo.key[k]); } //console.log(result.debugInfo.key); console.log('其他debug信息:'); for (const di of result.debugInfo.other) { console.log(...di); } } } catch(err) { } }, function(err){ if (me.currentRptPageRst === null) rptArchiveObj.toggleBtn(false); $.bootstrapLoading.end(); }, function(ex){ if (me.currentRptPageRst === null) rptArchiveObj.toggleBtn(false); $.bootstrapLoading.end(); } ); }, scaleReport: function (accScale) { let me = zTreeOprObj; let canvas = zTreeOprObj.canvas; if (accScale !== 0) { JpcCanvasOutput.scaleFactor += accScale; if (JpcCanvasOutput.scaleFactor < 0.5) JpcCanvasOutput.scaleFactor = 0.5; if (JpcCanvasOutput.scaleFactor > 1.5) JpcCanvasOutput.scaleFactor = 1.5; } else { JpcCanvasOutput.scaleFactor = 1; } document.getElementById("btnNormalScale").innerText = (JpcCanvasOutput.scaleFactor * 100) + '%'; me.showPage(me.currentPage, canvas); }, requestPrjFolderCommon: function () { // }, changePreviewScale: function(newScale = 1) { const me = zTreeOprObj; JpcCanvasOutput.scaleFactor = newScale; const canvas = me.canvas; const size = JpcCanvasOutput.getReportSizeInPixel(me.currentRptPageRst, getScreenDPI()); canvas.width = size[0] * newScale + 20; if (size[1] > size[0]) { canvas.height = size[1] * newScale + 100; } else { canvas.height = size[1] * newScale + 50; } me.showPage(me.currentPage, canvas); }, showPage: function (pageNum, canvas) { let me = zTreeOprObj; if (pageNum >= 1 && pageNum <= me.maxPages) { me.currentPage = pageNum; JpcCanvasOutput.cleanCanvas(canvas); JpcCanvasOutput.drawPageBorder(me.currentRptPageRst, canvas, getScreenDPI()); // JpcCanvasOutput.highlightConflictArea(me.currentRptPageRst, pageNum); JpcCanvasOutput.drawToCanvas(me.currentRptPageRst, canvas, me.currentPage); //测试: // JpcFigureOutput.offsetX = JpcCanvasOutput.offsetX; // JpcFigureOutput.offsetY = JpcCanvasOutput.offsetY; // JpcFigureOutput.drawToCanvas(canvas, page); // let invisibleCanvas = document.getElementById("invisibleCanvas"); // JpcFigureOutput.toImageData(canvas, me.currentRptPageRst); } me.displayPageValue(); }, displayPageValue: function() { let me = zTreeOprObj; $("#rpt_page_num")[0].value = me.currentPage + "/" + me.maxPages; $("#rpt_fullscreen_page_num")[0].value = me.currentPage + "/" + me.maxPages; } }; let canvasOprObj = { canvasOnMouseMove: function (event) { if (zTreeOprObj.currentNode) { let x = event.offsetX - JpcCanvasOutput.offsetX, canvas = event.originalTarget; if (!(canvas)) canvas = event.target; //chrome浏览器不认event.originalTarget,只认event.target或event.currentTarget if (x < PRE_PAGE_OFFSET) { canvas.style.cursor = "url(/public/images/PreviousPage.cur), auto"; } else if ((canvas.width - x) < NEXT_PAGE_OFFSET) { canvas.style.cursor = "url(/public/images/NextPage.cur), auto"; } else { canvas.style.cursor = ""; } } }, canvasOnClick: function(event){ if (zTreeOprObj.currentNode) { let x = event.offsetX - JpcCanvasOutput.offsetX, canvas = event.originalTarget; if (!(canvas)) canvas = event.target; //chrome浏览器不认event.originalTarget,只认event.target或event.currentTarget if (x < PRE_PAGE_OFFSET) { zTreeOprObj.showPage(zTreeOprObj.currentPage - 1, canvas); } else if ((canvas.width - x) < NEXT_PAGE_OFFSET) { zTreeOprObj.showPage(zTreeOprObj.currentPage + 1, canvas); } } }, showFullSreen: function () { if (zTreeOprObj.currentRptPageRst) { let orgH = zTreeOprObj.canvas.height; let orgW = zTreeOprObj.canvas.width; zTreeOprObj.canvas = document.getElementById("fullScrCanvas"); // zTreeOprObj.canvas.height = orgH; // zTreeOprObj.canvas.width = orgW; // zTreeOprObj.showPage(zTreeOprObj.currentPage, zTreeOprObj.canvas); // zTreeOprObj.changePreviewScale(1); this.fullScreenChangeScale(0); $("#btn_show_full_screen").trigger("click"); $('#fullscreen').on('hide.bs.modal', function () { zTreeOprObj.canvas = document.getElementById("rptCanvas"); // zTreeOprObj.showPage(zTreeOprObj.currentPage, zTreeOprObj.canvas); zTreeOprObj.changePreviewScale(1); }); } }, fullScreenChangeScale: function(newScaleFactor, dom) { let rstScale = JpcCanvasOutput.scaleFactor + newScaleFactor; let scaleBtn = document.getElementById("fullScreenScaleBtn");; if (newScaleFactor === 0) { rstScale = 1; } else if (rstScale < 1) { rstScale = 1; } else if (rstScale > 2){ rstScale = 2; } scaleBtn.innerHTML = `${(rstScale * 100).toFixed(0)}%`; zTreeOprObj.changePreviewScale(rstScale); } }; let rptControlObj = { currentOutputType: "Excel", currentDownloadUrl: null, currentDownloadIdx: 0, isLoading: false, getCurrentPageSize: function() { // let rst = "A4"; let rst = document.getElementById("btnRptPageSize").innerHTML.trim(); //btnRptPageSize return rst; }, getCurrentOrientation: function() { // let rst = "横向"; let rst = document.getElementById("btnRptOrientation").innerHTML.trim(); return rst; }, changeType: function(newType) { let me = rptControlObj; let excelDom = document.getElementById("EXCEL_TYPE"); let pdfDom = document.getElementById("PDF_TYPE"); if (newType === "Excel") { excelDom.className = "btn btn-block btn-primary"; pdfDom.className = "btn btn-block btn-outline-secondary"; me.currentOutputType = newType; } else if (newType === "PDF") { excelDom.className = "btn btn-block btn-outline-secondary"; pdfDom.className = "btn btn-block btn-primary"; me.currentOutputType = newType; } else { //me.currentOutputType = newType; } }, getTplIdsCommon: function (refRptTplIds, rpt_names, splitArchives = []) { for (let node of zTreeOprObj.checkedRptTplNodes) { refRptTplIds.push(node.refId); if (rpt_names) rpt_names.push(node.name); if (node.hasOwnProperty('flags') && node.flags.hasOwnProperty('reportType') && node['flags']['reportType'] !== 'NA') { // 未来可能会有额外处理,目前空着 } if (node.flags && node.flags.amendmentType === 'splitArchive') { // splitArchives.push(node.refId); splitArchives.push({rpt_id: node.refId, split_field_id: parseInt(node.flags.splitArchiveField)}); } else { splitArchives.push(null); } } }, getRptRequestCommonParam: function(params) { if (params) { params.pageSize = rptControlObj.getCurrentPageSize(); params.orientation = rptControlObj.getCurrentOrientation(); params.custCfg = CUST_CFG; params.project_id = PROJECT_ID; params.tender_id = TENDER_ID; params.budget_id = BUDGET_ID; params.sp_id = SP_ID; // if (params.sp_id && params.sp_id !== -1 && params.sp_id !== '-1') params.id = params.sp_id; // 这里的id实际就是sp_id,给后台检测用的 params.id = params.sp_id; // 这里的id实际就是sp_id,给后台检测用的 params.source_type = SOURCE_TYPE; params.stage_id = getStageId(); params.stage_status = getStageStatus(); params.stage_order = getStageOrder(); params.stage_times = getStageTimes(); params.material_order = getMaterialOrder(); params.closeWatermark = getCloseWatermark(); params.isTextSignature = getTxtSignature(); params.detail_id = DETAIL_ID; params.change_id = CHANGE_ID; params.business_id = BUSINESS_ID; params.change_plan_id = CHNAGE_PLAN_ID; params.change_project_id = CHNAGE_PROJECT_ID; params.change_apply_id = CHNAGE_APPLY_ID; params.change_times = CHANGE_TIMES; params.change_plan_times = CHNAGE_PLAN_TIMES; params.change_project_times = CHNAGE_PROJECT_TIMES; params.change_apply_times = CHNAGE_APPLY_TIMES; params.advance_id = current_advance_id; params.material_id = current_material_id; } }, creatCommonExportParam: function (refRptTplIds) { let rst = {}; rptControlObj.getRptRequestCommonParam(rst); rst.rpt_ids = refRptTplIds; rst.orientation = ((zTreeOprObj.checkedRptTplNodes.length > 1)?null:rptControlObj.getCurrentOrientation()); rst.closeArchiveSignature = getCloseArchiveSignature(); return rst; }, getAllInOneBook: async function () { if (zTreeOprObj.checkedRptTplNodes && zTreeOprObj.checkedRptTplNodes.length > 0) { let me = rptControlObj; let refRptTplIds = [], rpt_sheet_names = [], splitArchives = []; rptControlObj.getTplIdsCommon(refRptTplIds, rpt_sheet_names, splitArchives); let params = rptControlObj.creatCommonExportParam(refRptTplIds); params.closeWatermark = getCloseWatermarkForExcel(); if (current_stage_id > 0) { await rptCustomObj.getCustomSelect(params); } params.rpt_names = rpt_sheet_names; params.rptName = TENDER_NAME; params.option = getExcelOutputOption(); params.splitArchives = splitArchives; let chkNodes = zTreeOprObj.treeObj.getCheckedNodes(true); if (chkNodes.length > 0) { delete params.orientation; // 打印时有勾选的话,不需要提供方向 } $.bootstrapLoading.start(); CommonAjax.postXsrfEx("/tender/report_api/createExcelFilesInOneBook", params, WAIT_TIME_EXPORT, true, getCookie('csrfToken_j'), function(result){ $.bootstrapLoading.end(); if (result) { let uuIdUrls = []; let uuIdUrl = "/getFileByUUID/" + result.data[0].uuid + "/" + stringUtil.replaceAll(result.data[0].reportName, "#", "_") + "/xlsx"; uuIdUrls.push(uuIdUrl); downloadReport(uuIdUrls); } else { // } }, function(failRst){ // closeWaitingView(); $.bootstrapLoading.end(); console.log(failRst); }, function(exceptionRst){ // closeWaitingView(); $.bootstrapLoading.end(); console.log(exceptionRst); } ); } }, getAllIndividualExcelBook: async function () { let me = rptControlObj; if (zTreeOprObj.checkedRptTplNodes && zTreeOprObj.checkedRptTplNodes.length > 0) { let refRptTplIds = []; let rpt_names = [], splitArchives = []; rptControlObj.getTplIdsCommon(refRptTplIds, rpt_names, splitArchives); let params = rptControlObj.creatCommonExportParam(refRptTplIds); params.closeWatermark = getCloseWatermarkForExcel(); if (current_stage_id > 0) { await rptCustomObj.getCustomSelect(params); } params.isOneSheet = true; params.rpt_names = rpt_names; params.rptName = 'All'; params.splitArchives = splitArchives; // 测试连续输出 params.option = getExcelOutputOption(); let chkNodes = zTreeOprObj.treeObj.getCheckedNodes(true); if (chkNodes.length > 0) { delete params.orientation; // 打印时有勾选的话,不需要提供方向 } $.bootstrapLoading.start(); CommonAjax.postXsrfEx("/tender/report_api/createExcelFiles", params, WAIT_TIME_EXPORT, true, getCookie('csrfToken_j'), function(result){ $.bootstrapLoading.end(); if (result) { let uuIdUrls = []; for (let uuIdObj of result.data) { let uuIdUrl = "/getFileByUUID/" + uuIdObj.uuid + "/" + stringUtil.replaceAll(uuIdObj.reportName, "#", "_") + "/xlsx"; uuIdUrls.push(uuIdUrl); } downloadReport(uuIdUrls); } else { // } }, function(failRst){ // closeWaitingView(); $.bootstrapLoading.end(); console.log(failRst); }, function(exceptionRst){ // closeWaitingView(); $.bootstrapLoading.end(); console.log(exceptionRst); } ); } }, downloadExcelReport: async function(pageDataArr, pageSize, rpt_names, signatureRelArr) { const MAX_BRK_PAGE = 300; const __sleep = (n) => { var start = new Date().getTime(); while(true) if(new Date().getTime()-start > n) break; } const private_download = async function(currentIndex) { if (currentIndex < pageDataArr.length) { //这里的数据应该在调用前己处理 const rptName = rpt_names[currentIndex]; const singlePage = true; let role_rel_list = signatureRelArr[currentIndex]; // await excelExportUtil.exportExcel(pageDataArr[currentIndex], pageSize, rptName, singlePage, null, null, ROLE_REL_LIST, null); const dtlSignCells = []; filterSignCells(pageDataArr[currentIndex], dtlSignCells, null, null, PAGE_SHOW.isTextSignature, false); await excelExportUtil.exportExcel(pageDataArr[currentIndex], pageSize, rptName, singlePage, null, null, role_rel_list, null, getStageStatus() !== 3); restoreSignCells(pageDataArr[currentIndex], dtlSignCells, null, null, PAGE_SHOW.isTextSignature, false); } }; const _splitDownload = async (currentIndex) => { if (currentIndex < pageDataArr.length) { const rptName = rpt_names[currentIndex]; const ttlPages = pageDataArr[currentIndex].items.length; const splitAmt = Math.ceil(ttlPages / MAX_BRK_PAGE); const singlePage = true; let role_rel_list = signatureRelArr[currentIndex]; const bkItems = [].concat(pageDataArr[currentIndex].items); for (let sIdx = 0; sIdx < splitAmt; sIdx++) { let dlItems = bkItems.slice(sIdx * MAX_BRK_PAGE, (sIdx + 1) * MAX_BRK_PAGE); pageDataArr[currentIndex].items = dlItems; await excelExportUtil.exportExcel(pageDataArr[currentIndex], pageSize, `${rptName}${sIdx}`, singlePage, null, null, role_rel_list, null, getStageStatus() !== 3); if (sIdx < splitAmt - 1) __sleep(10000); } } }; for (let idx = 0; idx < pageDataArr.length; idx++) { if (pageDataArr[idx].items.length > MAX_BRK_PAGE) { await private_download(idx); // 应该用_splitDownload方法,只是目前的判断条件还不够理想,需要在qa上再仔细调整,在外网需要临时debug来分批导出 } else { await private_download(idx); } } }, downloadExcelReportInOneBook: async function(pageDataArr, pageSize, signatureRelArr, rpt_names) { let rptRoleRelArr = []; let ttlRoleAmt = 0; const reAssignSignatureName = function(pageData, roleRel, rpt_name_key) { const keyMap = {}; for (const pageItem of pageData.items) { for (const signCell of pageItem[JV.PROP_SIGNATURE_CELLS]) { if (!keyMap.hasOwnProperty(signCell.signature_name)) { keyMap[signCell.signature_name] = rpt_name_key + '_' + signCell.signature_name; } } //水印也要reAssign for (const watermarkCell of pageItem[JV.PROP_WATERMARK_CELLS]) { if (!keyMap.hasOwnProperty(watermarkCell.signature_name)) { keyMap[watermarkCell.signature_name] = rpt_name_key + '_' + watermarkCell.signature_name; } } } for (const pageItem of pageData.items) { for (const signCell of pageItem[JV.PROP_SIGNATURE_CELLS]) { if (keyMap.hasOwnProperty(signCell.signature_name)) { signCell.signature_name = keyMap[signCell.signature_name]; } } for (const watermarkCell of pageItem[JV.PROP_WATERMARK_CELLS]) { if (keyMap.hasOwnProperty(watermarkCell.signature_name)) { watermarkCell.signature_name = keyMap[watermarkCell.signature_name]; } } } for (const roleSign of roleRel) { if (keyMap.hasOwnProperty(roleSign.signature_name)) { roleSign.signature_name = keyMap[roleSign.signature_name]; } } }; const ttlDtlSignCells = []; for (let idx = 0; idx < pageDataArr.length; idx++) { const dtlSignCells = []; ttlDtlSignCells.push(dtlSignCells); filterSignCells(pageDataArr[idx], dtlSignCells, null, null, PAGE_SHOW.isTextSignature, false); let roleRel = signatureRelArr[idx]; ttlRoleAmt += roleRel.length; pageDataArr[idx][JV.NODE_PAGE_INFO][JV.NODE_MAIN_INFO_RPT_NAME] = rpt_names[idx]; // 这里要做些电子签名的signature_name转换,以防重名 if (roleRel.length > 0) { reAssignSignatureName(pageDataArr[idx], roleRel, rpt_names[idx]); rptRoleRelArr = rptRoleRelArr.concat(roleRel); } let hasWaterMark = false; if (pageDataArr[idx].items[0][JV.PROP_WATERMARK_CELLS] && pageDataArr[idx].items[0][JV.PROP_WATERMARK_CELLS].length > 0) { hasWaterMark = true; } if (ttlRoleAmt < 1 && hasWaterMark) { reAssignSignatureName(pageDataArr[idx], [], rpt_names[idx]); rptRoleRelArr = rptRoleRelArr.concat([pageDataArr[idx].items[0][JV.PROP_WATERMARK_CELLS][0].signature_name]); } } await excelExportUtil.exportExcelInOneBook(pageDataArr, pageSize, TENDER_NAME, rptRoleRelArr, null, getStageStatus() !== 3); for (let idx = 0; idx < pageDataArr.length; idx++) { restoreSignCells(pageDataArr[idx], ttlDtlSignCells[idx], null, null, PAGE_SHOW.isTextSignature, false); } }, getExcel_New: async function (isOneBook) { let me = rptControlObj; if (zTreeOprObj.checkedRptTplNodes && zTreeOprObj.checkedRptTplNodes.length > 0 && PAGE_SHOW['closeExportExcel'] !== 1) { let refRptTplIds = []; let rpt_names = [], splitArchives = []; rptControlObj.getTplIdsCommon(refRptTplIds, rpt_names, splitArchives); const signatureRelArr = []; if (refRptTplIds.length === 0) { if (zTreeOprObj.currentNode) { //在复杂情况下会影响到原有数据(文本签名 + 签章),为减少麻烦,还是当勾选处理 refRptTplIds.push(zTreeOprObj.currentNode.refId); rpt_names.push(zTreeOprObj.currentNode.name); } } if (refRptTplIds.length > 0) { let params = rptControlObj.creatCommonExportParam(refRptTplIds); params.option = getExcelOutputOption(); params.splitArchives = splitArchives; // params.getPicFlag = true; //专门针对草图项,只有此项为true,才需要把草图信息带过来,预览及打印动态加载草图 // 纠结:但这样还是解决不了效率问题,得另外想交互方式 if (current_stage_id > 0) { await rptCustomObj.getCustomSelect(params); } delete params.orientation; // 打印时有勾选的话,不需要提供方向 $.bootstrapLoading.start(); if ((COMMON_WATER_MARK_PIC_DATA === null || COMMON_WATER_MARK_PIC_DATA === '') && CUST_CFG.closeWarterMark === false) { params.needWaterMark = true; } else { params.needWaterMark = false; } params.outputType = 'Excel'; CommonAjax.postXsrfEx("/tender/report_api/getMultiReports", params, WAIT_TIME_EXPORT, true, getCookie('csrfToken_j'), function(result){ $.bootstrapLoading.end(); if (params.needWaterMark) COMMON_WATER_MARK_PIC_DATA = result.waterMarkStr; STAGE_AUDIT = result.stageAudit || []; STAGE_FLOW = result.stageFlow || []; LEDGER_LIST = result.ledger || []; let pageSize = rptControlObj.getCurrentPageSize(); let pageDataArr = result.data; let signatureRelInfo = result.signatureRelInfo; for (let pageObj of pageDataArr) { let tmpRel = []; for (const signatureRel of signatureRelInfo) { if (signatureRel.rpt_id === pageObj.id) { tmpRel = JSON.parse(signatureRel.rel_content); break; } } signatureRelArr.push(tmpRel); } // 统一安排merge(除草图外) for (let idx = 0; idx < pageDataArr.length; idx++) { const pageObj = pageDataArr[idx]; if (CUST_CFG.closeWarterMark) { pageObj.items.forEach(page => { page.watermark_cells = []; }); } let singleSignatureRelArr = signatureRelArr[idx]; if (signatureRelInfo && signatureRelInfo.length > 0) { resetStampSignature(pageObj, singleSignatureRelArr, getStageStatus() !== 3, STAGE_AUDIT, LEDGER_LIST); rptSignatureHelper.mergeSignDate(pageObj, singleSignatureRelArr, false, getStageStatus() !== 3); // rptSignatureHelper.mergeSignature(pageObj, singleSignatureRelArr); // 这里merge的意义不大 rptSignatureHelper.mergeSignAudit(pageObj, singleSignatureRelArr, STAGE_AUDIT, getStageStatus() !== 3); if (PAGE_SHOW.isTextSignature) { resetTextSignature(pageObj, getStageStatus() !== 3); } } } // if (getStageStatus() === 3) { // } if (isOneBook) { me.downloadExcelReportInOneBook(pageDataArr, pageSize, signatureRelArr, rpt_names); } else { me.downloadExcelReport(pageDataArr, pageSize, rpt_names, signatureRelArr); } }, function(failRst){ $.bootstrapLoading.end(); console.log(failRst); }, function(exceptionRst){ $.bootstrapLoading.end(); console.log(exceptionRst); } ); } else { // 这个分支本来是为了减少请求,用户已经点过的表,又没有勾选,那么就直接导出EXCEL // 但:发现在复杂情况下会影响到原有数据(文本签名 + 签章),为减少麻烦,在前面处理,保证不会走到这分支! } } }, checkAndGetExcel: function () { if (zTreeOprObj.treeObj) { let chkNodes = zTreeOprObj.treeObj.getCheckedNodes(true); if (chkNodes.length > 0) { $("#show_excel_output_cfg").trigger("click"); } else { rptControlObj.getExcel_New(false); } } }, getExcel: function () { let me = rptControlObj; if ($("#excelExportType_AllInOneBook")[0].checked) { // me.getAllInOneBook(); rptControlObj.getExcel_New(true); } else if ($("#excelExportType_IndividualBook")[0].checked) { // me.getAllIndividualExcelBook(); rptControlObj.getExcel_New(false); } }, getPdfFontCallbackLight: function(fontProperty) { rptTplObj.pdfFont['SmartSimsun'].push(fontProperty); if (rptTplObj.pdfFont['SmartSimsun'].length === 2) { rptControlObj.isLoading = false; } }, getPdfFontCallback: function(fontProperty) { let me = rptControlObj; if (rptTplObj.pdfFont['SmartSimsun'].indexOf(fontProperty) < 0) { rptTplObj.pdfFont['SmartSimsun'].push(fontProperty); } if (rptTplObj.pdfFont['SmartSimsun'].length === 2) { $.bootstrapLoading.end(); me.getPDFEx(); } }, loadPDFFonts: function () { //这里尝试下异步加载字体文件 let me = rptControlObj; me.isLoading = true; const urlStr = window.location.href; if (urlStr.includes('localhost') || urlStr.includes('jlqa')) { // dynamicLoadJs('/public/jspdf/SmartSimsun-normal.js', 'normal', me.getPdfFontCallbackLight); dynamicLoadJs('/public/jspdf/SmartSimsun-normal2.js', 'normal', me.getPdfFontCallbackLight); dynamicLoadJs('/public/jspdf/SmartSimsun-bold.js', 'bold', me.getPdfFontCallbackLight); } else { // dynamicLoadJs('https://d2.smartcost.com.cn/cach/SmartSimsun-normal.js', 'normal', me.getPdfFontCallbackLight); dynamicLoadJs('https://d2.smartcost.com.cn/cach/SmartSimsun-normal2.js', 'normal', me.getPdfFontCallbackLight); dynamicLoadJs('https://d2.smartcost.com.cn/cach/SmartSimsun-bold.js', 'bold', me.getPdfFontCallbackLight); } }, getPDFPre: function () { let me = rptControlObj; if (me.isLoading) { $.bootstrapLoading.start(); console.log('fonts are loading...'); setTimeout(me.getPDFPre, 3000); //延时3秒 } else { $.bootstrapLoading.end(); //根据测试,需要先做一次清理,防止在极端情况下出现阻塞 if (rptTplObj.pdfFont['SmartSimsun'].length === 2) { me.getPDFEx(); } else { $.bootstrapLoading.start(); // dynamicLoadJs('/public/jspdf/SmartSimsun-normal.js',"normal", me.getPdfFontCallback); // dynamicLoadJs('/public/jspdf/SmartSimsun-normal2.js',"normal", me.getPdfFontCallback); // dynamicLoadJs('/public/jspdf/SmartSimsun-bold.js',"bold", me.getPdfFontCallback); // dynamicLoadJs('https://d2.smartcost.com.cn/cach/SmartSimsun-normal.js', 'normal', me.getPdfFontCallback); dynamicLoadJs('https://d2.smartcost.com.cn/cach/SmartSimsun-normal2.js', 'normal', me.getPdfFontCallback); dynamicLoadJs('https://d2.smartcost.com.cn/cach/SmartSimsun-bold.js', 'bold', me.getPdfFontCallback); } } }, getTestPDFPre: function() { const params = {}; $.bootstrapLoading.start(); CommonAjax.postXsrfEx("/tender/report_api/getTestReport", params, WAIT_TIME_EXPORT, true, getCookie('csrfToken_j'), async function(result){ const pageSize = 'A4'; const rpt_names = ['测试PDF格式']; $.bootstrapLoading.end(); downloadPDFReport([result.data], pageSize, rpt_names, [], [], [], STAGE_AUDIT); }, function(failRst){ $.bootstrapLoading.end(); console.log(failRst); }, function(exceptionRst){ $.bootstrapLoading.end(); console.log(exceptionRst); } ); }, getPDFEx: async function () { let me = rptControlObj; if (zTreeOprObj.checkedRptTplNodes && zTreeOprObj.checkedRptTplNodes.length > 0 && PAGE_SHOW['closeExportPdf'] !== 1) { let refRptTplIds = []; let rpt_names = [], splitArchives = []; rptControlObj.getTplIdsCommon(refRptTplIds, rpt_names, splitArchives); const signatureRelArr = []; if (refRptTplIds.length > 0) { let params = rptControlObj.creatCommonExportParam(refRptTplIds); params.splitArchives = splitArchives; // params.getPicFlag = true; //专门针对草图项,只有此项为true,才需要把草图信息带过来,预览及打印动态加载草图 // 纠结:但这样还是解决不了效率问题,得另外想交互方式 if (current_stage_id > 0) { await rptCustomObj.getCustomSelect(params); } delete params.orientation; // 打印时有勾选的话,不需要提供方向 $.bootstrapLoading.start(); if (COMMON_WATER_MARK_PIC_DATA === null || COMMON_WATER_MARK_PIC_DATA === '') { params.needWaterMark = true; } else { params.needWaterMark = false; } params.outputType = 'PDF'; CommonAjax.postXsrfEx("/tender/report_api/getMultiReports", params, WAIT_TIME_EXPORT, true, getCookie('csrfToken_j'), async function(result){ // closeWaitingView(); $.bootstrapLoading.end(); if (params.needWaterMark) COMMON_WATER_MARK_PIC_DATA = result.waterMarkStr; STAGE_AUDIT = result.stageAudit || []; STAGE_FLOW = result.stageFlow || []; LEDGER_LIST = result.ledger || []; let pageSize = rptControlObj.getCurrentPageSize(); let pageDataArr = result.data; let signatureRelInfo = result.signatureRelInfo; for (let pageObj of pageDataArr) { let tmpRel = []; for (const signatureRel of signatureRelInfo) { if (signatureRel.rpt_id === pageObj.id) { tmpRel = JSON.parse(signatureRel.rel_content); break; } } signatureRelArr.push(tmpRel); } for (let idx = 0; idx < result.data.length; idx++) { const pageData = result.data[idx]; let singleSignatureRelArr = signatureRelArr[idx]; resetStampSignature(pageData, singleSignatureRelArr, getStageStatus() !== 3, STAGE_AUDIT, LEDGER_LIST); await rptSignatureHelper.resetDummySignature(pageData, null); // if (PAGE_SHOW.isTextSignature) { resetTextSignature(pageData, getStageStatus() !== 3); } } downloadPDFReport(result.data, pageSize, rpt_names, signatureRelArr, result.signatureRelInfo, refRptTplIds, STAGE_AUDIT); }, function(failRst){ // closeWaitingView(); $.bootstrapLoading.end(); console.log(failRst); }, function(exceptionRst){ // closeWaitingView(); $.bootstrapLoading.end(); console.log(exceptionRst); } ); } else { //这个分支是为了减少请求,用户已经点过的表,又没有勾选,那么就直接导出成PDF let pageSize = rptControlObj.getCurrentPageSize(); let pageData = zTreeOprObj.currentRptPageRst; signatureRelArr.push(ROLE_REL_LIST); // closeWaitingView(); $.bootstrapLoading.end(); JpcJsPDFHelper.outputAsPdf(pageData, pageSize, rpt_names[0], signatureRelArr, STAGE_AUDIT, false, zTreeOprObj._chkPrePayStatus()); } } }, firstPage: function(dom) { zTreeOprObj.showPage(1, zTreeOprObj.canvas); }, prePage: function(dom) { zTreeOprObj.showPage(zTreeOprObj.currentPage - 1, zTreeOprObj.canvas); }, nextPage: function(dom) { zTreeOprObj.showPage(zTreeOprObj.currentPage + 1, zTreeOprObj.canvas); }, lastPage: function(dom) { let me = zTreeOprObj; zTreeOprObj.showPage(me.maxPages, zTreeOprObj.canvas); }, onKeydown: function (event, dom) { let me = zTreeOprObj, keyPressed = null; if (window.event) { keyPressed = window.event.keyCode; // IE/Chrome } else { keyPressed = event.which; // Firefox } if (keyPressed === 13) { let pageNum = 1; try { pageNum = parseInt(dom.value); } catch (e) { pageNum = 1; } if (pageNum < 1) { pageNum = 1; } else if (pageNum > me.maxPages) { pageNum = me.maxPages; } zTreeOprObj.showPage(pageNum, zTreeOprObj.canvas); return false; } }, changeMargin: function(marginPropStr, marginDom) { CUST_CFG.margins[marginPropStr] = marginDom.value; }, changeFontMain: function(CfgDispName, fontProperty, fontDom) { for (let font of CUST_CFG.fonts) { if (font["CfgDispName"] === CfgDispName) { font[fontProperty] = fontDom.value; break; } } }, changeBorderWeight: function (dom) { CUST_CFG.borderThick = dom.value; }, changeCfgOption: function (optStr, dom) { CUST_CFG[optStr] = dom.checked; }, changeFontAdhoc: function(CfgDispName, fontProperty, fontDom) { for (let font of CUST_CFG.fonts) { if (font["CfgDispName"] === CfgDispName) { if (font[fontProperty] === 'T') { font[fontProperty] = 'F'; fontDom.className = "btn btn-sm btn-outline-secondary"; } else { font[fontProperty] = 'T'; fontDom.className = "btn btn-sm btn-outline-secondary active"; } break; } } }, restoreMargine: function () { zTreeOprObj.renderMargin(zTreeOprObj.defReportPageCfg); zTreeOprObj.extractRptCfg(CUST_CFG); }, restoreFormat: function () { zTreeOprObj.renderFormat(zTreeOprObj.defReportPageCfg); zTreeOprObj.extractRptCfg(CUST_CFG); }, restoreCustCFG: function () { let me = this; zTreeOprObj.renderRptCfg(zTreeOprObj.defReportPageCfg); zTreeOprObj.extractRptCfg(CUST_CFG); // me.saveCustCfg(); }, saveCustCfg: function() { let params = {}; params.custCfg = CUST_CFG; CommonAjax.postEx("report_tpl_api/saveCustomerCfg", params, 20000, true, function(result){ // alert("Save successfully!"); $("#update_msg_response")[0].style.color = "green"; $("#update_msg_response")[0].innerHTML = " (保存成功!)"; setTimeout(function(){ $("#update_msg_response")[0].innerHTML = ""; }, 1000); }, function (failRst) { $("#update_msg_response")[0].style.color = "red"; $("#update_msg_response")[0].innerHTML = " (保存失败!)"; setTimeout(function(){ $("#update_msg_response")[0].innerHTML = ""; }, 1000); }, null ); }, confirmCfgChange: function() { zTreeOprObj.changeCfg(); }, cancelCfgChange: function() { CUST_CFG = JSON.parse(JSON.stringify(CUST_CFG_ORG)); } }; function downloadPDFReport(pageDataArr, pageSize, rpt_names, signatureRelArr, signatureRelInfo, refRptTplIds, STAGE_AUDIT) { const ttlDtlSignCells = []; rptControlObj.currentDownloadIdx = 0; const private_download = function(newPageDataArr, new_rpt_names) { if (rptControlObj.currentDownloadIdx < newPageDataArr.length) { let singleSignatureRelArr = []; for (let rIdx = 0; rIdx < signatureRelInfo.length; rIdx++) { let rptId = refRptTplIds[rptControlObj.currentDownloadIdx]; if (signatureRelInfo[rIdx].rpt_id === rptId) { singleSignatureRelArr = signatureRelArr[rIdx]; // 有些报表可能没有签名 break; } } let pageData = newPageDataArr[rptControlObj.currentDownloadIdx]; let rptName = new_rpt_names[rptControlObj.currentDownloadIdx]; rptControlObj.currentDownloadIdx++; JpcJsPDFHelper.outputAsPdf(pageData, pageSize, rptName, singleSignatureRelArr, STAGE_AUDIT, false, zTreeOprObj._chkPrePayStatus()); // 精确控制签名 if (pageData.splitArcPages) { // 新方式的splitArcPages数据有所不同(主要是为了考虑流水式表处理方便),splitArcPages记录的是每一段的起始页 // 比如: [1,3,4,6],这里表示总共分4段,第一段起始页是1,总页数是第二段的起始页-第一段的起始页(即:3-1) // 最后一段的总页数是:ttlPages - 本段的起始页 + 1 /* let rptNameIdx = 0; const ttlPages = pageData.items.length; const orgItems = [].concat(pageData.items); for (let pIdx = 0; pIdx < pageData.splitArcPages.length; pIdx++) { const startPage = pageData.splitArcPages[pIdx]; let endPage = ttlPages; if (pIdx < pageData.splitArcPages.length - 1) { endPage = pageData.splitArcPages[pIdx + 1] - 1; } const indPages = []; for (let spIdx = startPage; spIdx <= endPage; spIdx++) { indPages.push(orgItems[spIdx - 1]); } pageData.items = indPages; JpcJsPDFHelper.outputAsPdf(pageData, pageSize, `${rptName}_${rptNameIdx}`, singleSignatureRelArr, STAGE_AUDIT); rptNameIdx++; } pageData.items = orgItems; //*/ // 已验证拆分ok } restoreSignCells(newPageDataArr[rptControlObj.currentDownloadIdx - 1], ttlDtlSignCells[rptControlObj.currentDownloadIdx - 1], null, null, PAGE_SHOW.isTextSignature, false); if (rptControlObj.currentDownloadIdx < newPageDataArr.length) setTimeout(private_download(newPageDataArr, new_rpt_names), 2000); } }; // 导出PDF真实优化代码 let picPaths = [], dummyPicAmt = 0, dummyCells = [], dupPicPath = [], dupPicCell = []; // 1. 先找有没有dummy pageDataArr.forEach((pageData, pgIdx) => { const dtlSignCells = []; ttlDtlSignCells.push(dtlSignCells); filterSignCells(pageData, dtlSignCells, null, null, PAGE_SHOW.isTextSignature, false); for (let page of pageData.items) { for (let dCell of page.signature_cells) { if (dCell.signature_name.indexOf('dummy_pic') >= 0) { let picIdx = picPaths.indexOf(dCell.path); if (picIdx < 0) { picPaths.push(dCell.path); dummyCells.push(dCell); dummyPicAmt++; } else { let dPicIdx = dupPicPath.indexOf(dCell.path); if (dPicIdx < 0) { dupPicPath.push(dCell.path); dupPicCell.push([]); dPicIdx = dupPicPath.length - 1; } dupPicCell[dPicIdx].push(dCell); } } } } }); if (dummyPicAmt > 0) { // 2. 有则一个个请求下载图片,下载完后统一导出PDF $.bootstrapLoading.start(); let handledAmt = 0, exceptionAmt = 0; for (let pIdx = 0; pIdx < dummyCells.length; pIdx++) { let dCell = dummyCells[pIdx]; getBlobPublic(dCell.path).then(blob => { if (blob === 'not found!') { exceptionAmt++; if ((handledAmt + exceptionAmt) === dummyPicAmt) { $.bootstrapLoading.end(); private_download(pageDataArr, rpt_names); } } else { let oFileReader = new FileReader(); oFileReader.onloadend = function (e) { let base64 = e.target.result; dCell.pic = base64; handledAmt++; let pPathIdx = dupPicPath.indexOf(dCell.path); if (pPathIdx >= 0) { for (let dupCell of dupPicCell[pPathIdx]) { dupCell.pic = base64; } } // console.log(`已处理草图: ${handledAmt}`); if ((handledAmt + exceptionAmt) === dummyPicAmt) { $.bootstrapLoading.end(); private_download(pageDataArr, rpt_names); } }; oFileReader.readAsDataURL(blob); } }); } } else { // 3. 无则普通导出 private_download(pageDataArr, rpt_names); } //*/ } function downloadReport(urls) { //考虑到多个报表下载,一些浏览器(如chrome)不允许一下子下载多个文件,得缓缓处理,统一在这处理 rptControlObj.currentDownloadUrl = null; rptControlObj.currentDownloadIdx = 0; const private_download = function() { if (rptControlObj.currentDownloadIdx >= 0 && rptControlObj.currentDownloadIdx < urls.length) { rptControlObj.currentDownloadUrl = urls[rptControlObj.currentDownloadIdx]; rptControlObj.currentDownloadIdx++; window.location = rptControlObj.currentDownloadUrl; if (rptControlObj.currentDownloadIdx < urls.length) setTimeout(private_download, 2000); } } private_download(); } function getAdvanceType() { return current_advance_type || ''; } function getStageStatus() { if ([-400, -500].includes(current_stage_id)) { if (current_stage_id === -400) { // 预付款 for (const advance of ADVANCE_LIST) { if (advance.id === current_advance_id) { return advance.status; } } } else { // 材差 for (const material of MATERIAL_LIST) { if (material.id === current_material_id) { return material.status; } } } } else if (current_stage_id > 0 || current_stage_id === -1) { let ppStatus = zTreeOprObj._chkPrePayStatus(); if (ppStatus === 3) { return ppStatus } else return current_stage_status; } else { if ([-100, -200].includes(current_stage_id)) { return 3 } else if ([-300, -301, -302, -303].includes(current_stage_id)) { // return 3; // 临时的 return BGL_OBJ?.status || -1; } } return -1; } function getStageId() { return current_stage_id; } function getStageOrder() { return CUR_ORDER; } function getMaterialOrder() { return parseInt($('#material-select').attr('m-order')); } function getStageTimes() { return current_stage_times; } function getCloseWatermark() { return PAGE_SHOW['closeWatermark']; } function getTxtSignature() { return PAGE_SHOW['isTextSignature']; } function getCloseArchiveSignature() { return PAGE_SHOW['closeArchiveSignature']; } function getCloseWatermarkForExcel() { if (PAGE_SHOW['closeWatermark'] === 1 || CUST_CFG.closeWarterMark) { return 1; } else { return 0; } } function getExcelOutputOption() { if (CUST_CFG.continuousOutput) { return 'infinity'; // 连续输出方式 } else { return 'normal'; // 目前是普通方式 } } function _getSplitAmendmentParam(params, tplNode) { if (params.amendmentType === undefined || params.amendmentType === null) { params.splitArchives = []; } if (tplNode.flags && tplNode.flags.amendmentType === 'splitArchive') { let hasSplit = false; for (let spl of params.splitArchives) { if (spl.split_field_id == tplNode.splitArchiveField) { hasSplit = true; break; } } if (!hasSplit) params.splitArchives.push({rpt_id: tplNode.refId, split_field_id: parseInt(tplNode.flags.splitArchiveField)}); } }