bep40 commited on
Commit
6143c4b
·
verified ·
1 Parent(s): 72eeaf4

Upload vai-fix-order-download-v1047.js

Browse files
Files changed (1) hide show
  1. vai-fix-order-download-v1047.js +113 -0
vai-fix-order-download-v1047.js ADDED
@@ -0,0 +1,113 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * V.AI STUDIO - Order Download Fix v1047 COMPLETE
3
+ *
4
+ * VẤN ĐỀ: Excel/PDF chỉ tải 1 lần, download lần 2+ không hoạt động
5
+ *
6
+ * NGĂN NHÂN GỐC CHÍNH:
7
+ * - Hàm _doExportDeliveryExcel trong qr-payment.js vẫn gọi URL.revokeObjectURL sau 60s
8
+ * - File v1042 chỉ override window.exportDeliveryExcel nhưng không can thiệp sâu
9
+ * - Blob URL được thu hồn khiến download thất bại
10
+ *
11
+ * FIX TRIỆT ĐỐI:
12
+ * - Monkey-patch URL.revokeObjectURL HOÀN TOÀN - KHÔNG revoke blob URLs
13
+ * - Cleanup blob khi unload (pagehide/beforeunload)
14
+ * - Không dùng setTimeout revoke - để trình duyệt tự giải phóng
15
+ */
16
+ (function() {
17
+ 'use strict';
18
+
19
+ // Registry lưu blob URLs
20
+ var blobRegistry = [];
21
+
22
+ // ===== PATCH URL.revokeObjectURL HOÀN TOÀN =====
23
+ var _originalRevoke = URL.revokeObjectURL;
24
+ var _revokePatched = false;
25
+
26
+ function patchRevoke() {
27
+ if (_revokePatched) return;
28
+ _revokePatched = true;
29
+
30
+ URL.revokeObjectURL = function(url) {
31
+ // Bỏ qua HOÀN TOÀN cho blob URLs
32
+ if (url && typeof url === 'string' && url.startsWith('blob:')) {
33
+ var exists = blobRegistry.find(function(e) {
34
+ return e.url === url;
35
+ });
36
+ if (!exists) {
37
+ blobRegistry.push({
38
+ url: url,
39
+ revoked: false,
40
+ created: Date.now()
41
+ });
42
+ }
43
+ // KHÔNG revoke - để download hoàn thành
44
+ return;
45
+ }
46
+ // Cho phép revoke các URL khác
47
+ return _originalRevoke.call(this, url);
48
+ };
49
+
50
+ console.log('[Fix v1047] URL.revokeObjectURL patched - blobs will persist until unload');
51
+ }
52
+
53
+ // Chạy ngay và kiểm tra lại mỗi 500ms
54
+ patchRevoke();
55
+ setInterval(patchRevoke, 500);
56
+
57
+ // ===== CLEANUP KHI UNLOAD =====
58
+ function cleanupBlobs() {
59
+ blobRegistry.forEach(function(entry) {
60
+ if (!entry.revoked && entry.url) {
61
+ try {
62
+ _originalRevoke.call(URL, entry.url);
63
+ entry.revoked = true;
64
+ } catch (e) {}
65
+ }
66
+ });
67
+ blobRegistry = [];
68
+ }
69
+
70
+ window.addEventListener('pagehide', cleanupBlobs);
71
+ window.addEventListener('beforeunload', cleanupBlobs);
72
+ window.addEventListener('unload', cleanupBlobs);
73
+
74
+ // ===== PATCH VAI_QR._doExportDeliveryExcel =====
75
+ function patchVAIDR() {
76
+ if (!window.VAI_QR || !window.VAI_QR._doExportDeliveryExcel) return;
77
+
78
+ var originalDoExport = window.VAI_QR._doExportDeliveryExcel;
79
+ var patched = originalDoExport._vaiPatched;
80
+
81
+ if (!patched) {
82
+ // Tạo wrapper mới - KHÔNG revoke blob
83
+ window.VAI_QR._doExportDeliveryExcel = async function(qd, code) {
84
+ // Gọi hàm gốc nhưng override URL.revokeObjectURL tạm thời
85
+ var savedRevoke = URL.revokeObjectURL;
86
+ URL.revokeObjectURL = function(url) {
87
+ if (url && url.startsWith('blob:')) {
88
+ blobRegistry.push({ url: url, revoked: false });
89
+ return; // KHÔNG revoke
90
+ }
91
+ return savedRevoke.call(this, url);
92
+ };
93
+
94
+ try {
95
+ await originalDoExport.call(this, qd, code);
96
+ } finally {
97
+ // Khôi phục revoke
98
+ URL.revokeObjectURL = savedRevoke;
99
+ }
100
+ };
101
+ window.VAI_QR._doExportDeliveryExcel._vaiPatched = true;
102
+ console.log('[Fix v1047] VAI_QR._doExportDeliveryExcel patched');
103
+ }
104
+ }
105
+
106
+ // Patch mỗi 500ms
107
+ setInterval(patchVAIDR, 500);
108
+
109
+ // Patch mặc định sau 2s
110
+ setTimeout(patchVAIDR, 2000);
111
+
112
+ console.log('[Fix v1047] Module loaded - multi-download support ready');
113
+ })();