From ef199920c1cd54acfea8d39fb32dc0308f038cae Mon Sep 17 00:00:00 2001
From: yuan <123@>
Date: 星期五, 09 十月 2026 14:47:57 +0800
Subject: [PATCH] fix: 库存报表入库时间不展示时分秒
---
src/utils/zipStore.js | 110 +++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 110 insertions(+), 0 deletions(-)
diff --git a/src/utils/zipStore.js b/src/utils/zipStore.js
new file mode 100644
index 0000000..98d38c9
--- /dev/null
+++ b/src/utils/zipStore.js
@@ -0,0 +1,110 @@
+/**
+ * 鏋佺畝 ZIP 鎵撳寘锛坰tore 瀛樺偍锛屼笉鍘嬬缉锛夈��
+ *
+ * OOXML 瀹瑰櫒锛坸lsx / docx锛夋湰璐ㄩ兘鏄� zip 鍖咃紝杩欓噷鍙疄鐜板啓鏂囦欢鎵�闇�鐨勬渶灏忛泦鍚堬細
+ * 鏈湴鏂囦欢澶� + 涓ぎ鐩綍 + 鐩綍缁撴潫璁板綍銆備笉鍘嬬缉鍙互鐪佹帀 deflate 渚濊禆锛�
+ * 浣撶Н瀵瑰鍑哄満鏅彲浠ユ帴鍙楋紝涓旀墍鏈夎В鏋愬櫒閮藉吋瀹广��
+ */
+
+const CRC_TABLE = (() => {
+ const table = new Uint32Array(256);
+ for (let i = 0; i < 256; i += 1) {
+ let c = i;
+ for (let k = 0; k < 8; k += 1) {
+ c = c & 1 ? 0xedb88320 ^ (c >>> 1) : c >>> 1;
+ }
+ table[i] = c >>> 0;
+ }
+ return table;
+})();
+
+const crc32 = (bytes) => {
+ let c = 0xffffffff;
+ for (let i = 0; i < bytes.length; i += 1) {
+ c = CRC_TABLE[(c ^ bytes[i]) & 0xff] ^ (c >>> 8);
+ }
+ return (c ^ 0xffffffff) >>> 0;
+};
+
+const encoder = new TextEncoder();
+
+export const utf8 = (text) => encoder.encode(text);
+
+/**
+ * @param {Array<{name: string, data: Uint8Array}>} files
+ * @param {string} mimeType
+ * @returns {Blob}
+ */
+export function createZip(files, mimeType) {
+ const now = new Date();
+ const dosTime =
+ (now.getHours() << 11) | (now.getMinutes() << 5) | Math.floor(now.getSeconds() / 2);
+ const dosDate =
+ ((now.getFullYear() - 1980) << 9) | ((now.getMonth() + 1) << 5) | now.getDate();
+
+ const localParts = [];
+ const centralParts = [];
+ let offset = 0;
+
+ files.forEach((file) => {
+ const nameBytes = utf8(file.name);
+ const data = file.data;
+ const crc = crc32(data);
+
+ const local = new Uint8Array(30 + nameBytes.length);
+ const lv = new DataView(local.buffer);
+ lv.setUint32(0, 0x04034b50, true);
+ lv.setUint16(4, 20, true);
+ lv.setUint16(6, 0x0800, true);
+ lv.setUint16(8, 0, true);
+ lv.setUint16(10, dosTime, true);
+ lv.setUint16(12, dosDate, true);
+ lv.setUint32(14, crc, true);
+ lv.setUint32(18, data.length, true);
+ lv.setUint32(22, data.length, true);
+ lv.setUint16(26, nameBytes.length, true);
+ lv.setUint16(28, 0, true);
+ local.set(nameBytes, 30);
+
+ const central = new Uint8Array(46 + nameBytes.length);
+ const cv = new DataView(central.buffer);
+ cv.setUint32(0, 0x02014b50, true);
+ cv.setUint16(4, 20, true);
+ cv.setUint16(6, 20, true);
+ cv.setUint16(8, 0x0800, true);
+ cv.setUint16(10, 0, true);
+ cv.setUint16(12, dosTime, true);
+ cv.setUint16(14, dosDate, true);
+ cv.setUint32(16, crc, true);
+ cv.setUint32(20, data.length, true);
+ cv.setUint32(24, data.length, true);
+ cv.setUint16(28, nameBytes.length, true);
+ cv.setUint16(30, 0, true);
+ cv.setUint16(32, 0, true);
+ cv.setUint16(34, 0, true);
+ cv.setUint16(36, 0, true);
+ cv.setUint32(38, 0, true);
+ cv.setUint32(42, offset, true);
+ central.set(nameBytes, 46);
+
+ localParts.push(local, data);
+ centralParts.push(central);
+ offset += local.length + data.length;
+ });
+
+ const centralSize = centralParts.reduce((sum, part) => sum + part.length, 0);
+ const end = new Uint8Array(22);
+ const ev = new DataView(end.buffer);
+ ev.setUint32(0, 0x06054b50, true);
+ ev.setUint16(4, 0, true);
+ ev.setUint16(6, 0, true);
+ ev.setUint16(8, files.length, true);
+ ev.setUint16(10, files.length, true);
+ ev.setUint32(12, centralSize, true);
+ ev.setUint32(16, offset, true);
+ ev.setUint16(20, 0, true);
+
+ return new Blob([...localParts, ...centralParts, end], { type: mimeType });
+}
+
+export default createZip;
--
Gitblit v1.9.3