detail.ejs 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467
  1. <script type="text/javascript" src="/public/jspdf/jspdf.min.js"></script>
  2. <script type="text/javascript" src="/public/report/js/rpt_public.js"></script>
  3. <script type="text/javascript" src="/public/js/common_ajax.js"></script>
  4. <script type="text/javascript" src="/public/report/js/jpc_output_value_define.js"></script>
  5. <script type="text/javascript" src="/public/report/js/rpt_signature.js"></script>
  6. <script type="text/javascript" src="/public/report/js/jpc_output.js"></script>
  7. <script type="text/javascript" src="/public/report/js/rpt_move_signature.js"></script>
  8. <script type="text/javascript" src="/public/report/js/rpt_jspdf.js"></script>
  9. <div class="panel-content">
  10. <div class="panel-title fluid">
  11. <div class="title-main d-flex justify-content-between">
  12. <div><a class="mr-2" href="/payment/<%- ctx.paymentTender.id %>/list/<%- trInfo.id %>"><i class="fa fa-chevron-left"></i> 返回</a><%- ctx.paymentTender.name %> / <%- trInfo.rpt_name %> / <%- ctx.detail.code %></div>
  13. <div>
  14. <% if ((ctx.detail.status == auditConst.status.uncheck || ctx.detail.status == auditConst.status.checkNo) && trInfo.is_change) { %>
  15. <span class="text-danger pull-right">报表内容已发生变化,请删除并重新生成详情</span>
  16. <% } else { %>
  17. <% include ./audit_btn.ejs %>
  18. <% if (rptAudit &&
  19. ((ctx.detail.status !== auditConst.status.checkNo && ctx.detail.status !== auditConst.status.checked) ||
  20. (ctx.detail.status === auditConst.status.checked && !nextDetail) ||
  21. (ctx.detail.status === auditConst.status.checkNo && ctx.detail.uid === ctx.session.sessionUser.accountId))
  22. ) { %>
  23. <a href="#sub-sp5" data-toggle="modal" data-target="#sub-sp5" class="btn btn-sm btn-primary pull-right mr-2">签字意见</a>
  24. <% } %>
  25. <a href="#sign-flow" data-toggle="modal" data-target="#sign-flow" class="btn btn-sm btn-outline-success pull-right mr-2">签署进度</a>
  26. <% } %>
  27. </div>
  28. </div>
  29. </div>
  30. <div class="content-wrap">
  31. <div class="c-body">
  32. <div class="sjs-height-0">
  33. <div class="row m-0 my-2">
  34. <div class="col-5">
  35. <div class="sjs-bar-1">
  36. <ul class="nav nav-tabs" id="myTab" role="tablist">
  37. <li class="nav-item">
  38. <a class="nav-link active" id="content-tab" data-tab="form" data-toggle="tab" href="#content" role="tab" aria-controls="content" aria-selected="true">表单内容</a>
  39. </li>
  40. <li class="nav-item">
  41. <a class="nav-link" id="annex-tab" data-tab="fujian" data-toggle="tab" href="#annex" role="tab" aria-controls="annex" aria-selected="false">附件</a>
  42. </li>
  43. <li class="nav-item ml-auto pt-1" id="fujian_btn" style="display:none;">
  44. <!--所有附件 翻页-->
  45. <button data-toggle="modal" class="btn btn-sm btn-primary" id="bach-download"><i class="fa fa-download "></i> 批量下载</button>
  46. <!-- <a href="javascript: void(0);" data-toggle="modal" class="btn btn-sm btn-primary" id="bach-download"><i class="fa fa-download "></i> 批量下载</a> -->
  47. <a href="javascript:void(0);" class="page-select ml-3" content="pre"><i class="fa fa-chevron-left"></i></a> <span id="currentPage">1</span>/<span id="totalPage">10</span> <a href="javascript:void(0);" class="page-select mr-3" content="next"><i class="fa fa-chevron-right"></i></a>
  48. <% if (ctx.detail.filePermission) { %>
  49. <a href="#addfujian" data-toggle="modal" class="btn btn-sm btn-light text-primary" data-placement="bottom" title="" data-original-title="上传附件"><i class="fa fa-cloud-upload" aria-hidden="true"></i> 上传附件</a>
  50. <% } %>
  51. <a href="javascript: void(0);" id="zipDown" download style="display: none;"></a>
  52. </li>
  53. </ul>
  54. </div>
  55. <div class="tab-content mt-2" id="myTabContent">
  56. <div class="tab-pane fade show active" id="content" role="tabpanel" aria-labelledby="content-tab">
  57. <div id="rpt-form">
  58. <% for (const c of content) { %>
  59. <div>
  60. <h5><%- c.title %>内容</h5>
  61. <% for (const item of c.items) { %>
  62. <div class="form-group">
  63. <label class="d-flex"><%- item.label %>
  64. <% if (item.link !== undefined) { %>
  65. <div class="dropdown dropup mx-2 show-link-dropdown">
  66. <% if (ctx.detail.uid === ctx.session.sessionUser.accountId &&
  67. (ctx.detail.status === auditConst.status.uncheck || ctx.detail.status === auditConst.status.checkNo)) { %>
  68. <a href="javascript:void(0)" data-toggle="dropdown" title="关联数据" data-target="#link-data1"><i class="fa fa-paperclip"></i></a>
  69. <% } %>
  70. <span class="show-link"><% if (item.link !== '') { %>关联数据:<%= ctx.helper._.find(numberList, { index: item.link }) ? ctx.helper._.find(numberList, { index: item.link }).Label : '' %><% } %></span>
  71. <% if (ctx.detail.uid === ctx.session.sessionUser.accountId &&
  72. (ctx.detail.status === auditConst.status.uncheck || ctx.detail.status === auditConst.status.checkNo)) { %>
  73. <div class="link-dropdown dropdown-menu pb-1" aria-labelledby="dropdownMenuButton">
  74. <div class="px-3">
  75. <% if (numberList.length > 0) { %>
  76. <% for (const numberInfo of numberList) { %>
  77. <div class="form-check py-1">
  78. <input class="form form-check-input" type="radio" id="item_<%- item.index %>_number_<%- numberInfo.index %>"
  79. value="<%- numberInfo.index %>" name="radio_<%- item.index %>" <% if (item.link === numberInfo.index) { %>checked<% } %> />
  80. <label class="form-check-label" for="item_<%- item.index %>_number_<%- numberInfo.index %>"><%- numberInfo.Label %></label>
  81. </div>
  82. <% } %>
  83. <% } %>
  84. <div class="form-check py-1">
  85. <input class="form form-check-input" type="radio" id="item_<%- item.index %>_number_" value="" <% if (item.link === '') { %>checked<% } %> name="radio_<%- item.index %>" />
  86. <label class="form-check-label" for="item_<%- item.index %>_number_">无</label>
  87. </div>
  88. <hr class="m-1">
  89. <div class="float-right">
  90. <button type="button" item-index="<%- item.index %>" old-link="<%- item.link %>" class="btn btn-sm btn-primary change-link">确定</button>
  91. </div>
  92. </div>
  93. </div>
  94. <% } %>
  95. </div>
  96. <% } %>
  97. </label>
  98. <% if (item.type === 'textarea') { %>
  99. <textarea <% if (ctx.detail.readOnly) { %>readonly<% } %> class="form-control form-control-sm" data-index="<%- item.index %>"><%- item.value %></textarea>
  100. <% } else { %>
  101. <input <% if (ctx.detail.readOnly) { %>readonly<% } %> type="<%- item.type %>" value="<%- item.type === 'number' && ctx.helper._.indexOf(item.value, '元') !== -1 ? parseFloat(item.value) : item.value %>" <% if (item.type === 'number') { %>step="0.000001"<% } %> data-index="<%- item.index %>" class="form-control form-control-sm" placeholder="请输入">
  102. <% } %>
  103. </div>
  104. <% } %>
  105. </div>
  106. <% } %>
  107. </div>
  108. </div>
  109. <!-- 附件 -->
  110. <div class="tab-pane fade" id="annex" role="tabpanel" aria-labelledby="annex-tab">
  111. <div class="sjs-sh-1" style="overflow-y: auto;">
  112. <div class="p-2">
  113. <table class="table table-bordered" style="word-break:break-all; table-layout: fixed">
  114. <thead>
  115. <tr>
  116. <td width="25" style="background-color: #e9ecef;"><input type="checkbox" id="check-all-file" ></td>
  117. <th width="40">序号</th>
  118. <th>名称</th>
  119. <th width="130">上传时间/大小</th>
  120. <th width="60">操作</th>
  121. </tr>
  122. </thead>
  123. <tbody id="attList">
  124. <% if (attList !== undefined && attList !== '') { %>
  125. <% for (const [index,att] of attList.entries()) { %>
  126. <tr>
  127. <td width="25"><input type="checkbox" class="check-file" file-id=<%- att.id %>></td>
  128. <td><%- index+1 %></td>
  129. <td><a href="javascript: void(0);" class="file-atn" f-id="<%- att.id %>"><%- att.filename %><%- att.fileext %></a></td>
  130. <td><%- moment(att.upload_time).format("YYYY-MM-DD HH:mm:ss") %><br><%- ctx.helper.bytesToSize(att.filesize) %></td>
  131. <td>
  132. <a href="/payment/<%- ctx.paymentTender.id %>/detail/<%- ctx.detail.id %>/file/<%- att.id %>/download" class="mr-2" title="下载"><span class="fa fa-download text-primary"></span></a>
  133. <% if (att.uid === ctx.session.sessionUser.accountId && (ctx.detail.status === auditConst.status.checked ? Boolean(att.extra_upload) : true )) { %>
  134. <a href="javascript:void(0)" class="mr-2 delete-file" data-attid="<%- att.id %>" title="删除附件"><span class="fa fa-trash text-danger"></span></a>
  135. <% } %>
  136. </td>
  137. </tr>
  138. <% } %>
  139. <% } %>
  140. </tbody>
  141. </table>
  142. <a href="" id="file-upload" target="_blank" style="display: none;"></a>
  143. </div>
  144. </div>
  145. </div>
  146. </div>
  147. </div>
  148. <div class="col-6 ml-5">
  149. <div class="d-flex flex-row">
  150. <!--<a href="javascript: void(0);" onclick="auditRptPrintHelper.showPage()" class="mr-2" >刷新</a>-->
  151. <a href="javascript: void(0);" class="mr-2" onclick="auditRptPrintHelper.directPDF()">导出pdf</a>
  152. <a href="javascript: void(0);" onclick="auditRptPrintHelper.directPrint()">打印</a>
  153. </div>
  154. <div align="center">
  155. <canvas id="auditRptCanvas" height="1200" width="920"></canvas>
  156. </div>
  157. </div>
  158. </div>
  159. </div>
  160. </div>
  161. </div>
  162. </div>
  163. <script type="text/javascript">
  164. const accountId = parseInt('<%- ctx.session.sessionUser.accountId %>');
  165. const tenderId = parseInt('<%- ctx.paymentTender.id %>');
  166. const detailId = parseInt('<%- ctx.detail.id %>');
  167. const detailStatus = parseInt('<%- ctx.detail.status %>');
  168. const trName = JSON.parse(unescape('<%- escape(JSON.stringify(trInfo.rpt_name)) %>'));
  169. const detailName = JSON.parse(unescape('<%- escape(JSON.stringify(ctx.detail.code)) %>'));
  170. const auditConst = JSON.parse(unescape('<%- escape(JSON.stringify(auditConst)) %>'));
  171. const rptAudit = JSON.parse(unescape('<%- escape(JSON.stringify(rptAudit)) %>'));
  172. <% if (rptAudit &&
  173. ((ctx.detail.status !== auditConst.status.checkNo && ctx.detail.status !== auditConst.status.checked) ||
  174. (ctx.detail.status === auditConst.status.checked && !nextDetail) ||
  175. (ctx.detail.status === auditConst.status.checkNo && ctx.detail.uid === ctx.session.sessionUser.accountId))
  176. ) { %>
  177. let currentStamp = JSON.parse(unescape('<%- escape(JSON.stringify(currentStamp)) %>'));
  178. <% } %>
  179. let tesRpttData = JSON.parse(unescape('<%- escape(JSON.stringify(report_json)) %>'));
  180. console.log(tesRpttData);
  181. const whiteList = JSON.parse('<%- JSON.stringify(whiteList) %>');
  182. let attData = JSON.parse(unescape('<%- escape(JSON.stringify(attList)) %>'));
  183. const uidList = JSON.parse(unescape('<%- escape(JSON.stringify(uidList)) %>'));
  184. let currPageFileData = [];
  185. const SCREEN_DPI = [];
  186. const PAGE_SHOW = {closeWaterMark: 1};
  187. const current_stage_status = -1;
  188. const VIEW_CANVAS = document.getElementById("auditRptCanvas");
  189. const OSS_PATH = '<%- OSS_PATH %>';
  190. const CUST_CFG = {
  191. "fonts": [
  192. {
  193. "ID": "ReportTitle_Main",
  194. "Name": "宋体",
  195. "FontBold": "T",
  196. "FontHeight": 32,
  197. "FontItalic": "F",
  198. "CfgDispName": "表标题",
  199. "FontUnderline": "F"
  200. },
  201. {
  202. "ID": "Column",
  203. "Name": "宋体",
  204. "FontBold": "F",
  205. "FontHeight": 12,
  206. "FontItalic": "F",
  207. "CfgDispName": "列标题",
  208. "FontUnderline": "F"
  209. },
  210. {
  211. "ID": "Content",
  212. "Name": "宋体",
  213. "FontBold": "F",
  214. "FontHeight": 12,
  215. "FontItalic": "F",
  216. "CfgDispName": "正文内容",
  217. "FontUnderline": "F"
  218. },
  219. {
  220. "ID": "Total",
  221. "Name": "宋体",
  222. "FontBold": "F",
  223. "FontHeight": 12,
  224. "FontItalic": "F",
  225. "CfgDispName": "合计",
  226. "FontUnderline": "F"
  227. },
  228. {
  229. "ID": "Header",
  230. "Name": "宋体",
  231. "FontBold": "F",
  232. "FontHeight": 12,
  233. "FontItalic": "F",
  234. "CfgDispName": "表眉/表脚",
  235. "FontUnderline": "F"
  236. }
  237. ],
  238. "margins": {
  239. "Top": 12,
  240. "Left": 15,
  241. "Right": 15,
  242. "Bottom": 15
  243. },
  244. "fillZero": false,
  245. "isNarrow": false,
  246. "borderThick": 2,
  247. "showVerticalLine": true,
  248. "closeWarterMark": false,
  249. "continuousOutput": true
  250. }
  251. let zTreeOprObj = {
  252. _chkPrePayStatus: function() {
  253. return -1;
  254. }
  255. };
  256. let rptTplObj = {
  257. pdfFont: {'SmartSimsun': [], 'simhei': [], 'simkai': []},
  258. isLoading: false,
  259. };
  260. let auditRptPrintHelper = {
  261. currentPageData: null,
  262. currentDownloadIdx: 0,
  263. chkPicFeatures: async function(pageData) {
  264. for (let page of pageData.items) {
  265. for (let signCell of page.signature_cells) {
  266. if (typeof signCell.path === 'string' && signCell.path.length > 10) {
  267. let paths = signCell.path.split('!;!');
  268. signCell.picFeatures = [];
  269. if (!signCell.orgArea) {
  270. signCell.orgArea = JSON.parse(JSON.stringify(signCell.area));
  271. }
  272. signCell.signType = 'mixed';
  273. for (let path of paths) {
  274. let imgSrc = path;
  275. if (path.indexOf(OSS_PATH) < 0 && path[0] !== '/') {
  276. imgSrc = OSS_PATH + path;
  277. }
  278. const picFeature = await getPicFeature(imgSrc);
  279. signCell.picFeatures.push(picFeature);
  280. }
  281. }
  282. }
  283. }
  284. },
  285. showPage: async function() {
  286. await auditRptPrintHelper.chkPicFeatures(tesRpttData);
  287. JpcCanvasOutput.cleanCanvas(VIEW_CANVAS);
  288. JpcCanvasOutput.drawPageBorder(tesRpttData, VIEW_CANVAS, getScreenDPI());
  289. JpcCanvasOutput.drawToCanvas(tesRpttData, VIEW_CANVAS, 1, false, true);
  290. },
  291. directPrint: function() {
  292. sessionStorage.report_direct_data = JSON.stringify(tesRpttData);
  293. sessionStorage.closeWaterMark = 1;
  294. sessionStorage.pageSize = 'A4';
  295. sessionStorage.OSS_PATH = OSS_PATH;
  296. window.open('/printReport/A4');
  297. },
  298. _getPdfFontCallback: function(fontProperty) {
  299. let me = auditRptPrintHelper;
  300. if (rptTplObj.pdfFont['SmartSimsun'].indexOf(fontProperty) < 0) {
  301. rptTplObj.pdfFont['SmartSimsun'].push(fontProperty);
  302. }
  303. if (rptTplObj.pdfFont['SmartSimsun'].length >= 2) {
  304. $.bootstrapLoading.end();
  305. downloadPDFReport([tesRpttData], 'A4', [tesRpttData['打印页面_信息']['报表名称']], [], [], [-1], []);
  306. }
  307. },
  308. directPDF: function() {
  309. if (rptTplObj.pdfFont['SmartSimsun'].length >= 2) {
  310. downloadPDFReport([tesRpttData], 'A4', [tesRpttData['打印页面_信息']['报表名称']], [], [], [-1], []);
  311. } else {
  312. dynamicLoadJs('https://d2.smartcost.com.cn/cach/SmartSimsun-normal2.js', 'normal', this._getPdfFontCallback);
  313. dynamicLoadJs('https://d2.smartcost.com.cn/cach/SmartSimsun-bold.js', 'bold', this._getPdfFontCallback);
  314. }
  315. },
  316. };
  317. // $(document).ready(() => {
  318. // autoFlashHeight();
  319. // auditRptPrintHelper.showPage();
  320. // iniPage();
  321. // });
  322. function _getAdhocDummyCells(srcCell, rstCells, controls = null) {
  323. if (typeof srcCell.path === 'string') {
  324. let paths = srcCell.path.split('!;!');
  325. for (let dtlPathIdx = 0; dtlPathIdx < paths.length; dtlPathIdx++) {
  326. dtlPath = paths[dtlPathIdx];
  327. // srcCell.picFeatures
  328. if (dtlPath.length > 10) {
  329. let imgSrc = dtlPath;
  330. if (dtlPath.indexOf(OSS_PATH) < 0 && dtlPath[0] !== '/') {
  331. imgSrc = OSS_PATH + dtlPath;
  332. }
  333. let couldCreate = true;
  334. if (srcCell.picFeatures && srcCell.picFeatures.length === paths.length && (srcCell.picFeatures[dtlPathIdx] === 'not found!')) {
  335. couldCreate = false;
  336. }
  337. if (couldCreate) {
  338. let area = srcCell.area;
  339. if ((dtlPathIdx === 0) && (srcCell.orgArea)) {
  340. area = JSON.parse(JSON.stringify(srcCell.orgArea));
  341. let control = srcCell[JV.PROP_CONTROL];
  342. if (typeof srcCell[JV.PROP_CONTROL] === "string") {
  343. control = controls[srcCell[JV.PROP_CONTROL]];
  344. }
  345. let tmpArea = srcCell.area;
  346. srcCell.area = area;
  347. srcCell.isOrgShow = (dtlPathIdx !== 0);
  348. let signArea = getProperSignatureArea(srcCell, control, 0, 0, JV);
  349. srcCell.area = tmpArea;
  350. area[JV.PROP_LEFT] = signArea[0];
  351. area[JV.PROP_TOP] = signArea[1];
  352. area[JV.PROP_RIGHT] = signArea[2];
  353. area[JV.PROP_BOTTOM] = signArea[3];
  354. }
  355. const newStampCell = {
  356. signature_name: 'dummy_pic',
  357. control: srcCell.control,
  358. // style: srcCell.style,
  359. style: (srcCell.style && srcCell.style !== '') ? srcCell.style : 'sign_pic' ,
  360. path: imgSrc,
  361. isStamp: true,
  362. area,
  363. isOrgShow: (dtlPathIdx === 0),
  364. };
  365. rstCells.push(newStampCell);
  366. }
  367. }
  368. }
  369. }
  370. }
  371. function downloadPDFReport(pageDataArr, pageSize, rpt_names, signatureRelArr, signatureRelInfo, refRptTplIds, STAGE_AUDIT) {
  372. auditRptPrintHelper.currentDownloadIdx = 0;
  373. const private_download = function(newPageDataArr, new_rpt_names, dummyCells) {
  374. if (auditRptPrintHelper.currentDownloadIdx < newPageDataArr.length) {
  375. let singleSignatureRelArr = [];
  376. for (let rIdx = 0; rIdx < signatureRelInfo.length; rIdx++) {
  377. let rptId = refRptTplIds[auditRptPrintHelper.currentDownloadIdx];
  378. if (signatureRelInfo[rIdx].rpt_id === rptId) {
  379. singleSignatureRelArr = signatureRelArr[rIdx]; // 有些报表可能没有签名
  380. break;
  381. }
  382. }
  383. let pageData = newPageDataArr[auditRptPrintHelper.currentDownloadIdx];
  384. let rptName = new_rpt_names[auditRptPrintHelper.currentDownloadIdx];
  385. auditRptPrintHelper.currentDownloadIdx++;
  386. JpcJsPDFHelper.outputAsPdf(pageData, pageSize, rptName, singleSignatureRelArr, STAGE_AUDIT, true); // 精确控制签名
  387. if (auditRptPrintHelper.currentDownloadIdx < newPageDataArr.length) {
  388. setTimeout(private_download(newPageDataArr, new_rpt_names), 2000);
  389. } else {
  390. for (let pd of newPageDataArr) {
  391. for (let pItem of pd.items) {
  392. for (let idx = pItem.signature_cells.length - 1; idx >= 0; idx--) {
  393. let pIdx = dummyCells.indexOf(pItem.signature_cells[idx]);
  394. if (pIdx >= 0) {
  395. pItem.signature_cells.splice(idx, 1);
  396. dummyCells.splice(pIdx, 1);
  397. }
  398. }
  399. }
  400. }
  401. }
  402. }
  403. };
  404. // 导出PDF审核优化代码
  405. let picPaths = [], dummyPicAmt = 0, dummyCells = [];
  406. // 1. 先找有没有dummy
  407. for (let pageData of pageDataArr) {
  408. let tmpDummyCells = [];
  409. let controls = pageData[JV.NODE_CONTROL_COLLECTION];
  410. for (let page of pageData.items) {
  411. for (let dCell of page.signature_cells) {
  412. _getAdhocDummyCells(dCell, tmpDummyCells, controls);
  413. }
  414. if (tmpDummyCells.length > 0) {
  415. page.signature_cells = page.signature_cells.concat(tmpDummyCells);
  416. dummyCells = dummyCells.concat(tmpDummyCells);
  417. }
  418. }
  419. }
  420. dummyPicAmt = dummyCells.length;
  421. if (dummyPicAmt > 0) {
  422. // 2. 有则一个个请求下载图片,下载完后统一导出PDF
  423. $.bootstrapLoading.start();
  424. let handledAmt = 0, exceptionAmt = 0;
  425. for (let pIdx = 0; pIdx < dummyCells.length; pIdx++) {
  426. let dCell = dummyCells[pIdx];
  427. getBlobPublic(dCell.path).then(blob => {
  428. if (blob === 'not found!') {
  429. exceptionAmt++;
  430. if ((handledAmt + exceptionAmt) === dummyPicAmt) {
  431. $.bootstrapLoading.end();
  432. private_download(pageDataArr, rpt_names, dummyCells);
  433. }
  434. } else {
  435. let oFileReader = new FileReader();
  436. oFileReader.onloadend = function (e) {
  437. let base64 = e.target.result;
  438. dCell.pic = base64;
  439. handledAmt++;
  440. if ((handledAmt + exceptionAmt) === dummyPicAmt) {
  441. $.bootstrapLoading.end();
  442. private_download(pageDataArr, rpt_names, dummyCells);
  443. }
  444. };
  445. oFileReader.readAsDataURL(blob);
  446. }
  447. });
  448. }
  449. } else {
  450. // 3. 无则普通导出
  451. private_download(pageDataArr, rpt_names);
  452. }
  453. //*/
  454. }
  455. </script>