sa2kit 1.6.57 → 1.6.58

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (145) hide show
  1. package/dist/AliyunOSSProvider-KSYW2IOG.js +15 -0
  2. package/dist/{AliyunOSSProvider-2FARPAQD.js.map → AliyunOSSProvider-KSYW2IOG.js.map} +1 -1
  3. package/dist/AliyunOSSProvider-TBK3G7YK.mjs +6 -0
  4. package/dist/{AliyunOSSProvider-UMVGVBDJ.mjs.map → AliyunOSSProvider-TBK3G7YK.mjs.map} +1 -1
  5. package/dist/LocalStorageProvider-2DGYRQAB.mjs +6 -0
  6. package/dist/{LocalStorageProvider-PYOHETJV.mjs.map → LocalStorageProvider-2DGYRQAB.mjs.map} +1 -1
  7. package/dist/LocalStorageProvider-SSRW3ZJW.js +15 -0
  8. package/dist/{LocalStorageProvider-JQF5WK5H.js.map → LocalStorageProvider-SSRW3ZJW.js.map} +1 -1
  9. package/dist/UniversalFileService-336GFY6N.mjs +6 -0
  10. package/dist/{UniversalFileService-TNYKO6JN.mjs.map → UniversalFileService-336GFY6N.mjs.map} +1 -1
  11. package/dist/UniversalFileService-J6ET6KZK.js +15 -0
  12. package/dist/{UniversalFileService-RBV6EN5J.js.map → UniversalFileService-J6ET6KZK.js.map} +1 -1
  13. package/dist/calendar/index.js +11 -11
  14. package/dist/calendar/index.mjs +4 -4
  15. package/dist/chunk-25OFOKNF.js +171 -0
  16. package/dist/chunk-25OFOKNF.js.map +1 -0
  17. package/dist/chunk-3DXPQ4YV.mjs +165 -0
  18. package/dist/chunk-3DXPQ4YV.mjs.map +1 -0
  19. package/dist/{chunk-4VJQZSPU.mjs → chunk-3NHAT7D4.mjs} +3 -4
  20. package/dist/chunk-3NHAT7D4.mjs.map +1 -0
  21. package/dist/{chunk-3JW4X3AC.mjs → chunk-622Y6LTH.mjs} +3 -3
  22. package/dist/{chunk-3JW4X3AC.mjs.map → chunk-622Y6LTH.mjs.map} +1 -1
  23. package/dist/chunk-CIVO4R6N.mjs +37 -0
  24. package/dist/chunk-CIVO4R6N.mjs.map +1 -0
  25. package/dist/{chunk-6BJ76BYC.mjs → chunk-EGJPS7OL.mjs} +3 -3
  26. package/dist/{chunk-6BJ76BYC.mjs.map → chunk-EGJPS7OL.mjs.map} +1 -1
  27. package/dist/{chunk-U7AQC2Z7.js → chunk-EKIOJEJK.js} +1179 -2002
  28. package/dist/chunk-EKIOJEJK.js.map +1 -0
  29. package/dist/{chunk-53WLQ22S.js → chunk-EOWTOG7Y.js} +6 -6
  30. package/dist/{chunk-53WLQ22S.js.map → chunk-EOWTOG7Y.js.map} +1 -1
  31. package/dist/chunk-HDMIOOZY.mjs +546 -0
  32. package/dist/chunk-HDMIOOZY.mjs.map +1 -0
  33. package/dist/{chunk-MZKATHB7.js → chunk-HHVDOIPV.js} +4 -4
  34. package/dist/{chunk-MZKATHB7.js.map → chunk-HHVDOIPV.js.map} +1 -1
  35. package/dist/chunk-HJ6MH7J7.js +552 -0
  36. package/dist/chunk-HJ6MH7J7.js.map +1 -0
  37. package/dist/chunk-KH6RQ4J5.js +28 -0
  38. package/dist/chunk-KH6RQ4J5.js.map +1 -0
  39. package/dist/{chunk-35CXIK5Y.js → chunk-NCOXT7SK.js} +11 -11
  40. package/dist/{chunk-35CXIK5Y.js.map → chunk-NCOXT7SK.js.map} +1 -1
  41. package/dist/chunk-NZZZUMMX.mjs +784 -0
  42. package/dist/chunk-NZZZUMMX.mjs.map +1 -0
  43. package/dist/{chunk-OBIPI4GU.mjs → chunk-OFYBMMWT.mjs} +4 -4
  44. package/dist/{chunk-OBIPI4GU.mjs.map → chunk-OFYBMMWT.mjs.map} +1 -1
  45. package/dist/{chunk-W2NCOORK.js → chunk-PVLLRDUT.js} +951 -145
  46. package/dist/chunk-PVLLRDUT.js.map +1 -0
  47. package/dist/chunk-Q5EDCKQA.js +336 -0
  48. package/dist/chunk-Q5EDCKQA.js.map +1 -0
  49. package/dist/{chunk-6NMIKAE7.mjs → chunk-SNBILYSH.mjs} +5 -5
  50. package/dist/{chunk-6NMIKAE7.mjs.map → chunk-SNBILYSH.mjs.map} +1 -1
  51. package/dist/{chunk-IPY26RQH.js → chunk-UVHPCLP6.js} +5 -5
  52. package/dist/{chunk-IPY26RQH.js.map → chunk-UVHPCLP6.js.map} +1 -1
  53. package/dist/{chunk-V6BXO6ZS.mjs → chunk-WGD2NBVR.mjs} +835 -38
  54. package/dist/chunk-WGD2NBVR.mjs.map +1 -0
  55. package/dist/{chunk-HYZ5C6FY.mjs → chunk-WS3QZYBI.mjs} +1175 -1996
  56. package/dist/chunk-WS3QZYBI.mjs.map +1 -0
  57. package/dist/{chunk-UR5TU4MW.mjs → chunk-XLR6QUDR.mjs} +3 -3
  58. package/dist/{chunk-UR5TU4MW.mjs.map → chunk-XLR6QUDR.mjs.map} +1 -1
  59. package/dist/chunk-YMS6BPXS.js +807 -0
  60. package/dist/chunk-YMS6BPXS.js.map +1 -0
  61. package/dist/chunk-YOTQG4NP.mjs +314 -0
  62. package/dist/chunk-YOTQG4NP.mjs.map +1 -0
  63. package/dist/chunk-ZGVB35L2.mjs +25 -0
  64. package/dist/chunk-ZGVB35L2.mjs.map +1 -0
  65. package/dist/chunk-ZRAW3HXA.js +43 -0
  66. package/dist/chunk-ZRAW3HXA.js.map +1 -0
  67. package/dist/{chunk-4XXIBWCO.js → chunk-ZRWED7Q6.js} +66 -66
  68. package/dist/{chunk-4XXIBWCO.js.map → chunk-ZRWED7Q6.js.map} +1 -1
  69. package/dist/{chunk-DVENFCQY.js → chunk-ZWQJSZEY.js} +4 -5
  70. package/dist/chunk-ZWQJSZEY.js.map +1 -0
  71. package/dist/components/index.js +104 -104
  72. package/dist/components/index.mjs +4 -4
  73. package/dist/index.js +146 -148
  74. package/dist/index.js.map +1 -1
  75. package/dist/index.mjs +8 -11
  76. package/dist/index.mjs.map +1 -1
  77. package/dist/logger/index.js +7 -7
  78. package/dist/logger/index.mjs +1 -4
  79. package/dist/mikuFusionGame/index.js +4 -4
  80. package/dist/mikuFusionGame/index.mjs +3 -3
  81. package/dist/portfolio/index.js +10 -10
  82. package/dist/portfolio/index.mjs +5 -5
  83. package/dist/showmasterpiece/db/index.js +42 -42
  84. package/dist/showmasterpiece/db/index.mjs +1 -1
  85. package/dist/showmasterpiece/index.js +143 -144
  86. package/dist/showmasterpiece/index.js.map +1 -1
  87. package/dist/showmasterpiece/index.mjs +7 -9
  88. package/dist/showmasterpiece/index.mjs.map +1 -1
  89. package/dist/showmasterpiece/logic/index.js +19 -19
  90. package/dist/showmasterpiece/logic/index.mjs +2 -2
  91. package/dist/showmasterpiece/server/index.js +42 -42
  92. package/dist/showmasterpiece/server/index.mjs +1 -1
  93. package/dist/showmasterpiece/ui/web/index.js +34 -34
  94. package/dist/showmasterpiece/ui/web/index.mjs +6 -6
  95. package/dist/universalExport/server/index.js +2 -4
  96. package/dist/universalExport/server/index.js.map +1 -1
  97. package/dist/universalExport/server/index.mjs +1 -3
  98. package/dist/universalExport/server/index.mjs.map +1 -1
  99. package/dist/universalFile/index.js +6 -9
  100. package/dist/universalFile/index.js.map +1 -1
  101. package/dist/universalFile/index.mjs +1 -5
  102. package/dist/universalFile/index.mjs.map +1 -1
  103. package/dist/universalFile/server/index.js +31 -64
  104. package/dist/universalFile/server/index.js.map +1 -1
  105. package/dist/universalFile/server/index.mjs +7 -42
  106. package/dist/universalFile/server/index.mjs.map +1 -1
  107. package/dist/utils/index.js +11 -11
  108. package/dist/utils/index.mjs +2 -2
  109. package/package.json +1 -1
  110. package/dist/AliyunOSSProvider-2FARPAQD.js +0 -15
  111. package/dist/AliyunOSSProvider-UMVGVBDJ.mjs +0 -9
  112. package/dist/LocalStorageProvider-JQF5WK5H.js +0 -15
  113. package/dist/LocalStorageProvider-PYOHETJV.mjs +0 -9
  114. package/dist/UniversalFileService-RBV6EN5J.js +0 -15
  115. package/dist/UniversalFileService-TNYKO6JN.mjs +0 -9
  116. package/dist/chunk-4NFOSCM6.js +0 -34
  117. package/dist/chunk-4NFOSCM6.js.map +0 -1
  118. package/dist/chunk-4VJQZSPU.mjs.map +0 -1
  119. package/dist/chunk-6AHYPPUP.js +0 -344
  120. package/dist/chunk-6AHYPPUP.js.map +0 -1
  121. package/dist/chunk-76V7EKBX.mjs +0 -796
  122. package/dist/chunk-76V7EKBX.mjs.map +0 -1
  123. package/dist/chunk-ACLOJXXE.js +0 -195
  124. package/dist/chunk-ACLOJXXE.js.map +0 -1
  125. package/dist/chunk-AEXPAH7Z.mjs +0 -32
  126. package/dist/chunk-AEXPAH7Z.mjs.map +0 -1
  127. package/dist/chunk-CFGX3EKK.js +0 -560
  128. package/dist/chunk-CFGX3EKK.js.map +0 -1
  129. package/dist/chunk-D2HXMGXS.js +0 -46
  130. package/dist/chunk-D2HXMGXS.js.map +0 -1
  131. package/dist/chunk-DVENFCQY.js.map +0 -1
  132. package/dist/chunk-HYZ5C6FY.mjs.map +0 -1
  133. package/dist/chunk-K7WNCB4V.mjs +0 -554
  134. package/dist/chunk-K7WNCB4V.mjs.map +0 -1
  135. package/dist/chunk-L4ZYBFB2.mjs +0 -44
  136. package/dist/chunk-L4ZYBFB2.mjs.map +0 -1
  137. package/dist/chunk-M4HGHTIC.js +0 -820
  138. package/dist/chunk-M4HGHTIC.js.map +0 -1
  139. package/dist/chunk-PXWDQFWV.mjs +0 -192
  140. package/dist/chunk-PXWDQFWV.mjs.map +0 -1
  141. package/dist/chunk-U7AQC2Z7.js.map +0 -1
  142. package/dist/chunk-V6BXO6ZS.mjs.map +0 -1
  143. package/dist/chunk-VTGPHE4Z.mjs +0 -322
  144. package/dist/chunk-VTGPHE4Z.mjs.map +0 -1
  145. package/dist/chunk-W2NCOORK.js.map +0 -1
@@ -1,7 +1,8 @@
1
- import { init_hooks, init_services, init_CartContext, useCartContext, useDeadlinePopup, BOOKING_EXPORT_FIELDS, DEFAULT_BOOKING_EXPORT_CONFIG, useBooking, useBookingForm, updateCollectionOrder, moveCollectionDown, moveCollectionUp, getAllCollections, updateArtworkOrder, moveArtworkDown, moveArtworkUp, getArtworksByCollection, BookingService, clearConfigCache, useMasterpieces, CartProvider, useMasterpiecesConfig, useBookingAdmin, getConfig, shouldUseUniversalFileService, getStorageModeDisplayName, createCategory } from './chunk-HYZ5C6FY.mjs';
1
+ import { init_hooks, init_masterpiecesService, init_masterpiecesConfigService, init_cartService, init_bookingService, init_bookingAdminService, init_cartHistoryService, init_CartContext, useCartContext, useDeadlinePopup, useBooking, useBookingForm, updateCollectionOrder, moveCollectionDown, moveCollectionUp, getAllCollections, updateArtworkOrder, moveArtworkDown, moveArtworkUp, getArtworksByCollection, BookingService, useMasterpieces, CartProvider, useMasterpiecesConfig, useBookingAdmin, getConfig, createCategory } from './chunk-WS3QZYBI.mjs';
2
2
  import { normalizeHomeTabConfig, getCategoryDisplayName, buildDefaultHomeTabConfig } from './chunk-MFG2Y6UR.mjs';
3
3
  import { UniversalExportClient, UniversalExportButton } from './chunk-TGNUEULF.mjs';
4
- import { Card, Badge, CardContent, Button, GenericOrderManager, Modal, CardHeader, CardTitle, CardDescription, Tabs, TabsList, TabsTrigger, TabsContent, Label, Input, Textarea, Select, SelectTrigger, SelectValue, SelectContent, SelectItem } from './chunk-3JW4X3AC.mjs';
4
+ import { Card, Badge, CardContent, Button, GenericOrderManager, Modal, CardHeader, CardTitle, CardDescription, Tabs, TabsList, TabsTrigger, TabsContent, Label, Input, Textarea, Select, SelectTrigger, SelectValue, SelectContent, SelectItem } from './chunk-622Y6LTH.mjs';
5
+ import { __require } from './chunk-WMJKH4XE.mjs';
5
6
  import React29, { createContext, useState, useEffect, useRef, useCallback, useMemo, useContext } from 'react';
6
7
  import { Check, Minus, Plus, ShoppingCart, ShoppingBag, Book, Eye, ImageIcon, ChevronLeft, ChevronRight, Grid3x3, X, Trash2, Calendar, Clock, CheckCircle, Package, Search, RefreshCw, Download, XCircle, Save, Edit, Settings, AlertTriangle, EyeOff, Database, Loader, ArrowLeft, User, Image, Info, History, Bell, Cog, RotateCcw, ArrowUpDown, LogOut, LogIn, Lock, Phone } from 'lucide-react';
7
8
  import Link from 'next/link';
@@ -725,8 +726,804 @@ var ThumbnailSidebar = ({
725
726
  ))));
726
727
  };
727
728
 
728
- // src/showmasterpiece/ui/web/services/index.ts
729
- init_services();
729
+ // src/showmasterpiece/services/index.ts
730
+ init_masterpiecesService();
731
+ init_masterpiecesConfigService();
732
+ init_cartService();
733
+ init_bookingService();
734
+ init_bookingAdminService();
735
+ init_cartHistoryService();
736
+
737
+ // src/services/universalFile/config/index.ts
738
+ if (typeof window === "undefined") {
739
+ try {
740
+ __require("dotenv").config({ path: __require("path").join(process.cwd(), ".env.local") });
741
+ } catch (error) {
742
+ console.warn("\u26A0\uFE0F [ConfigManager] \u65E0\u6CD5\u52A0\u8F7D.env.local\u6587\u4EF6:", error);
743
+ }
744
+ }
745
+ var DEFAULT_CONFIG = {
746
+ defaultStorage: "aliyun-oss",
747
+ // 修改默认存储为OSS
748
+ storageProviders: {
749
+ "local": {
750
+ type: "local",
751
+ enabled: false,
752
+ // 默认禁用本地存储
753
+ rootPath: process.env.FILE_STORAGE_PATH || "uploads",
754
+ baseUrl: process.env.FILE_BASE_URL || "/uploads"
755
+ },
756
+ "aliyun-oss": {
757
+ type: "aliyun-oss",
758
+ enabled: true,
759
+ // 默认启用OSS
760
+ region: "",
761
+ bucket: "",
762
+ accessKeyId: "",
763
+ accessKeySecret: ""
764
+ },
765
+ "aws-s3": {
766
+ type: "aws-s3",
767
+ enabled: false
768
+ },
769
+ "qcloud-cos": {
770
+ type: "qcloud-cos",
771
+ enabled: false
772
+ }
773
+ },
774
+ defaultCDN: "none",
775
+ cdnProviders: {
776
+ "none": {
777
+ type: "none",
778
+ enabled: false
779
+ },
780
+ "aliyun-cdn": {
781
+ type: "aliyun-cdn",
782
+ enabled: false,
783
+ domain: "",
784
+ accessKeyId: "",
785
+ accessKeySecret: ""
786
+ },
787
+ "aws-cloudfront": {
788
+ type: "aws-cloudfront",
789
+ enabled: false
790
+ },
791
+ "qcloud-cdn": {
792
+ type: "qcloud-cdn",
793
+ enabled: false
794
+ }
795
+ },
796
+ maxFileSize: parseInt(process.env.MAX_FILE_SIZE || "104857600"),
797
+ // 100MB
798
+ allowedMimeTypes: [
799
+ // 图片类型
800
+ "image/jpeg",
801
+ "image/png",
802
+ "image/gif",
803
+ "image/webp",
804
+ "image/svg+xml",
805
+ // 音频类型
806
+ "audio/mpeg",
807
+ "audio/wav",
808
+ "audio/ogg",
809
+ "audio/mp4",
810
+ "audio/aac",
811
+ // 视频类型
812
+ "video/mp4",
813
+ "video/avi",
814
+ "video/mov",
815
+ "video/webm",
816
+ "video/mkv",
817
+ // 文档类型
818
+ "application/pdf",
819
+ "text/plain",
820
+ "application/json",
821
+ "application/javascript",
822
+ "text/css",
823
+ "text/html",
824
+ "text/markdown",
825
+ // 压缩文件
826
+ "application/zip",
827
+ "application/x-zip-compressed",
828
+ "application/x-rar-compressed",
829
+ "application/x-7z-compressed",
830
+ // 3D模型文件
831
+ "application/octet-stream",
832
+ // PMD/PMX文件
833
+ "model/gltf+json",
834
+ "model/gltf-binary"
835
+ ],
836
+ enableProcessing: process.env.ENABLE_FILE_PROCESSING === "true",
837
+ processingQueueSize: parseInt(process.env.PROCESSING_QUEUE_SIZE || "10"),
838
+ cache: {
839
+ metadataTTL: parseInt(process.env.METADATA_CACHE_TTL || "3600"),
840
+ // 1小时
841
+ urlTTL: parseInt(process.env.URL_CACHE_TTL || "1800")
842
+ // 30分钟
843
+ }
844
+ };
845
+ var FileServiceConfigManager = class {
846
+ constructor(customConfig) {
847
+ this.config = this.mergeConfig(DEFAULT_CONFIG, customConfig);
848
+ this.validateConfig();
849
+ }
850
+ /**
851
+ * 获取完整配置
852
+ */
853
+ getConfig() {
854
+ return { ...this.config };
855
+ }
856
+ /**
857
+ * 获取存储提供者配置
858
+ */
859
+ getStorageConfig(type) {
860
+ return this.config.storageProviders[type];
861
+ }
862
+ /**
863
+ * 获取CDN提供者配置
864
+ */
865
+ getCDNConfig(type) {
866
+ return this.config.cdnProviders[type];
867
+ }
868
+ /**
869
+ * 更新配置
870
+ */
871
+ updateConfig(updates) {
872
+ this.config = this.mergeConfig(this.config, updates);
873
+ this.validateConfig();
874
+ }
875
+ /**
876
+ * 启用存储提供者
877
+ */
878
+ enableStorageProvider(type, config) {
879
+ if (this.config.storageProviders[type]) {
880
+ this.config.storageProviders[type] = {
881
+ ...this.config.storageProviders[type],
882
+ ...config,
883
+ enabled: true
884
+ };
885
+ }
886
+ }
887
+ /**
888
+ * 禁用存储提供者
889
+ */
890
+ disableStorageProvider(type) {
891
+ if (this.config.storageProviders[type]) {
892
+ this.config.storageProviders[type].enabled = false;
893
+ }
894
+ }
895
+ /**
896
+ * 启用CDN提供者
897
+ */
898
+ enableCDNProvider(type, config) {
899
+ if (this.config.cdnProviders[type]) {
900
+ this.config.cdnProviders[type] = {
901
+ ...this.config.cdnProviders[type],
902
+ ...config,
903
+ enabled: true
904
+ };
905
+ this.config.defaultCDN = type;
906
+ }
907
+ }
908
+ /**
909
+ * 禁用CDN提供者
910
+ */
911
+ disableCDNProvider(type) {
912
+ if (this.config.cdnProviders[type]) {
913
+ this.config.cdnProviders[type].enabled = false;
914
+ if (this.config.defaultCDN === type) {
915
+ this.config.defaultCDN = "none";
916
+ }
917
+ }
918
+ }
919
+ /**
920
+ * 从环境变量加载阿里云OSS配置
921
+ */
922
+ loadAliyunOSSFromEnv() {
923
+ const config = {
924
+ region: process.env.ALIYUN_OSS_REGION,
925
+ bucket: process.env.ALIYUN_OSS_BUCKET,
926
+ accessKeyId: process.env.ALIYUN_OSS_ACCESS_KEY_ID,
927
+ accessKeySecret: process.env.ALIYUN_OSS_ACCESS_KEY_SECRET,
928
+ customDomain: process.env.ALIYUN_OSS_CUSTOM_DOMAIN,
929
+ secure: process.env.ALIYUN_OSS_SECURE === "true",
930
+ internal: process.env.ALIYUN_OSS_INTERNAL === "true"
931
+ };
932
+ console.log("\u{1F50D} [ConfigManager] \u963F\u91CC\u4E91OSS\u914D\u7F6E:", {
933
+ region: config.region,
934
+ bucket: config.bucket,
935
+ accessKeyId: config.accessKeyId ? "***" : "\u672A\u8BBE\u7F6E",
936
+ accessKeySecret: config.accessKeySecret ? "***" : "\u672A\u8BBE\u7F6E",
937
+ customDomain: config.customDomain || "\u672A\u8BBE\u7F6E"
938
+ });
939
+ if (config.region && config.bucket && config.accessKeyId && config.accessKeySecret) {
940
+ this.enableStorageProvider("aliyun-oss", config);
941
+ this.config.defaultStorage = "aliyun-oss";
942
+ console.log("\u2705 [ConfigManager] \u4ECE\u73AF\u5883\u53D8\u91CF\u52A0\u8F7D\u963F\u91CC\u4E91OSS\u914D\u7F6E\u6210\u529F");
943
+ } else {
944
+ console.warn("\u26A0\uFE0F [ConfigManager] \u963F\u91CC\u4E91OSS\u73AF\u5883\u53D8\u91CF\u914D\u7F6E\u4E0D\u5B8C\u6574");
945
+ }
946
+ }
947
+ /**
948
+ * 从配置管理模块加载阿里云OSS配置
949
+ */
950
+ async loadAliyunOSSFromConfigManager() {
951
+ return;
952
+ }
953
+ /**
954
+ * 从环境变量加载阿里云CDN配置
955
+ */
956
+ loadAliyunCDNFromEnv() {
957
+ const config = {
958
+ domain: process.env.ALIYUN_CDN_DOMAIN,
959
+ accessKeyId: process.env.ALIYUN_CDN_ACCESS_KEY_ID,
960
+ accessKeySecret: process.env.ALIYUN_CDN_ACCESS_KEY_SECRET,
961
+ region: process.env.ALIYUN_CDN_REGION
962
+ };
963
+ if (config.domain && config.accessKeyId && config.accessKeySecret) {
964
+ this.enableCDNProvider("aliyun-cdn", config);
965
+ console.log("\u2705 [ConfigManager] \u4ECE\u73AF\u5883\u53D8\u91CF\u52A0\u8F7D\u963F\u91CC\u4E91CDN\u914D\u7F6E\u6210\u529F");
966
+ } else {
967
+ console.log("\u2139\uFE0F [ConfigManager] \u963F\u91CC\u4E91CDN\u672A\u914D\u7F6E\uFF0C\u5C06\u4F7F\u7528\u9ED8\u8BA4\u5B58\u50A8\u65B9\u5F0F");
968
+ }
969
+ }
970
+ /**
971
+ * 验证配置有效性
972
+ */
973
+ validateConfig() {
974
+ const defaultStorageConfig = this.config.storageProviders[this.config.defaultStorage];
975
+ if (!defaultStorageConfig || !defaultStorageConfig.enabled) {
976
+ console.warn(`\u26A0\uFE0F [ConfigManager] \u9ED8\u8BA4\u5B58\u50A8\u63D0\u4F9B\u8005 ${this.config.defaultStorage} \u672A\u542F\u7528`);
977
+ }
978
+ if (this.config.maxFileSize <= 0) {
979
+ throw new Error("\u6587\u4EF6\u5927\u5C0F\u9650\u5236\u5FC5\u987B\u5927\u4E8E0");
980
+ }
981
+ if (this.config.processingQueueSize <= 0) {
982
+ throw new Error("\u5904\u7406\u961F\u5217\u5927\u5C0F\u5FC5\u987B\u5927\u4E8E0");
983
+ }
984
+ if (this.config.cache.metadataTTL <= 0 || this.config.cache.urlTTL <= 0) {
985
+ throw new Error("\u7F13\u5B58TTL\u5FC5\u987B\u5927\u4E8E0");
986
+ }
987
+ }
988
+ /**
989
+ * 合并配置
990
+ */
991
+ mergeConfig(base, override) {
992
+ if (!override) return { ...base };
993
+ return {
994
+ ...base,
995
+ ...override,
996
+ storageProviders: {
997
+ ...base.storageProviders,
998
+ ...override.storageProviders || {}
999
+ },
1000
+ cdnProviders: {
1001
+ ...base.cdnProviders,
1002
+ ...override.cdnProviders || {}
1003
+ },
1004
+ cache: {
1005
+ ...base.cache,
1006
+ ...override.cache || {}
1007
+ }
1008
+ };
1009
+ }
1010
+ };
1011
+ async function createFileServiceConfig(customConfig) {
1012
+ const configManager = new FileServiceConfigManager(customConfig);
1013
+ await configManager.loadAliyunOSSFromEnv();
1014
+ await configManager.loadAliyunCDNFromEnv();
1015
+ await configManager.loadAliyunOSSFromConfigManager();
1016
+ return configManager;
1017
+ }
1018
+
1019
+ // src/showmasterpiece/services/fileService.ts
1020
+ var cachedConfigManager = null;
1021
+ async function getShowmasterpieceOSSConfig() {
1022
+ try {
1023
+ console.log("\u{1F3A8} [ShowMasterpiece] \u5C1D\u8BD5\u4ECE\u72EC\u7ACB\u914D\u7F6E\u8BFB\u53D6OSS\u914D\u7F6E...");
1024
+ const environment = process.env.NODE_ENV === "production" ? "production" : "development";
1025
+ console.log(`\u{1F3A8} [ShowMasterpiece] \u5F53\u524D\u73AF\u5883: ${environment}`);
1026
+ if (typeof window !== "undefined") {
1027
+ console.log("\u{1F310} [ShowMasterpiece] \u5BA2\u6237\u7AEF\u73AF\u5883\uFF0C\u901A\u8FC7API\u8BFB\u53D6\u914D\u7F6E");
1028
+ const configKeys = "ALIYUN_OSS_REGION,ALIYUN_OSS_BUCKET,ALIYUN_OSS_ACCESS_KEY_ID,ALIYUN_OSS_ACCESS_KEY_SECRET,ALIYUN_OSS_CUSTOM_DOMAIN,ALIYUN_OSS_SECURE,ALIYUN_OSS_INTERNAL";
1029
+ const response = await fetch(`/api/showmasterpiece/config/items?environment=${environment}&keys=${configKeys}`);
1030
+ if (!response.ok) {
1031
+ console.warn("\u26A0\uFE0F [ShowMasterpiece] \u8BFB\u53D6\u72EC\u7ACB\u914D\u7F6EAPI\u5931\u8D25:", response.status);
1032
+ return null;
1033
+ }
1034
+ const data = await response.json();
1035
+ if (!data.success || !data.items) {
1036
+ console.warn("\u26A0\uFE0F [ShowMasterpiece] \u72EC\u7ACB\u914D\u7F6EAPI\u54CD\u5E94\u5F02\u5E38:", data);
1037
+ return null;
1038
+ }
1039
+ const configMap = {};
1040
+ data.items.forEach((item) => {
1041
+ if (item.value) {
1042
+ configMap[item.key] = item.value;
1043
+ }
1044
+ });
1045
+ const ossConfig = {
1046
+ region: configMap["ALIYUN_OSS_REGION"],
1047
+ bucket: configMap["ALIYUN_OSS_BUCKET"],
1048
+ accessKeyId: configMap["ALIYUN_OSS_ACCESS_KEY_ID"],
1049
+ accessKeySecret: configMap["ALIYUN_OSS_ACCESS_KEY_SECRET"],
1050
+ customDomain: configMap["ALIYUN_OSS_CUSTOM_DOMAIN"],
1051
+ secure: configMap["ALIYUN_OSS_SECURE"] === "true",
1052
+ internal: configMap["ALIYUN_OSS_INTERNAL"] === "true"
1053
+ };
1054
+ console.log("\u{1F3A8} [ShowMasterpiece] \u72EC\u7ACB\u914D\u7F6E\u8BFB\u53D6\u7ED3\u679C:", {
1055
+ region: ossConfig.region || "\u672A\u914D\u7F6E",
1056
+ bucket: ossConfig.bucket || "\u672A\u914D\u7F6E",
1057
+ accessKeyId: ossConfig.accessKeyId ? "***" : "\u672A\u914D\u7F6E",
1058
+ accessKeySecret: ossConfig.accessKeySecret ? "***" : "\u672A\u914D\u7F6E",
1059
+ customDomain: ossConfig.customDomain || "\u672A\u914D\u7F6E",
1060
+ secure: ossConfig.secure,
1061
+ internal: ossConfig.internal
1062
+ });
1063
+ if (ossConfig.region && ossConfig.bucket && ossConfig.accessKeyId && ossConfig.accessKeySecret) {
1064
+ console.log("\u2705 [ShowMasterpiece] \u72EC\u7ACB\u914D\u7F6E\u5B8C\u6574\uFF0C\u5C06\u4F7F\u7528\u72EC\u7ACBOSS\u914D\u7F6E");
1065
+ return ossConfig;
1066
+ } else {
1067
+ console.log("\u26A0\uFE0F [ShowMasterpiece] \u72EC\u7ACB\u914D\u7F6E\u4E0D\u5B8C\u6574\uFF0C\u5C06\u56DE\u9000\u5230\u516C\u5171\u914D\u7F6E");
1068
+ console.log("\u{1F50D} [ShowMasterpiece] \u7F3A\u5931\u914D\u7F6E\u9879:", {
1069
+ region: !ossConfig.region,
1070
+ bucket: !ossConfig.bucket,
1071
+ accessKeyId: !ossConfig.accessKeyId,
1072
+ accessKeySecret: !ossConfig.accessKeySecret
1073
+ });
1074
+ return null;
1075
+ }
1076
+ } else {
1077
+ console.log("\u{1F5A5}\uFE0F [ShowMasterpiece] \u670D\u52A1\u5668\u7AEF\u73AF\u5883\uFF0C\u4F7F\u7528\u9ED8\u8BA4\u914D\u7F6E\u56DE\u9000");
1078
+ return null;
1079
+ }
1080
+ } catch (error) {
1081
+ console.warn("\u26A0\uFE0F [ShowMasterpiece] \u8BFB\u53D6\u72EC\u7ACB\u914D\u7F6E\u5931\u8D25:", error);
1082
+ return null;
1083
+ }
1084
+ }
1085
+ async function getCachedConfigManager() {
1086
+ if (!cachedConfigManager) {
1087
+ const showmasterpieceOSSConfig = await getShowmasterpieceOSSConfig();
1088
+ if (showmasterpieceOSSConfig) {
1089
+ console.log("\u{1F3A8} [ShowMasterpiece] \u4F7F\u7528\u72EC\u7ACBOSS\u914D\u7F6E\u521B\u5EFA\u914D\u7F6E\u7BA1\u7406\u5668");
1090
+ cachedConfigManager = await createFileServiceConfig({
1091
+ defaultStorage: "aliyun-oss",
1092
+ storageProviders: {
1093
+ "local": {
1094
+ type: "local",
1095
+ enabled: false,
1096
+ rootPath: "uploads",
1097
+ baseUrl: "/uploads"
1098
+ },
1099
+ "aliyun-oss": {
1100
+ type: "aliyun-oss",
1101
+ enabled: true,
1102
+ ...showmasterpieceOSSConfig
1103
+ },
1104
+ "aws-s3": {
1105
+ type: "aws-s3",
1106
+ enabled: false
1107
+ },
1108
+ "qcloud-cos": {
1109
+ type: "qcloud-cos",
1110
+ enabled: false
1111
+ }
1112
+ }
1113
+ });
1114
+ } else {
1115
+ console.log("\u{1F3A8} [ShowMasterpiece] \u72EC\u7ACB\u914D\u7F6E\u4E0D\u5B8C\u6574\uFF0C\u4F7F\u7528\u9ED8\u8BA4\u914D\u7F6E");
1116
+ cachedConfigManager = await createFileServiceConfig({
1117
+ defaultStorage: "local",
1118
+ // 默认使用本地存储
1119
+ storageProviders: {
1120
+ "local": {
1121
+ type: "local",
1122
+ enabled: true,
1123
+ rootPath: "uploads",
1124
+ baseUrl: "/uploads"
1125
+ },
1126
+ "aliyun-oss": {
1127
+ type: "aliyun-oss",
1128
+ enabled: false
1129
+ // 如果独立配置失败,禁用OSS
1130
+ },
1131
+ "aws-s3": {
1132
+ type: "aws-s3",
1133
+ enabled: false
1134
+ },
1135
+ "qcloud-cos": {
1136
+ type: "qcloud-cos",
1137
+ enabled: false
1138
+ }
1139
+ }
1140
+ });
1141
+ }
1142
+ }
1143
+ return cachedConfigManager;
1144
+ }
1145
+ async function getShowMasterpieceFileConfig() {
1146
+ const configManager = await getCachedConfigManager();
1147
+ const config = configManager.getConfig();
1148
+ const ossConfig = config.storageProviders["aliyun-oss"];
1149
+ if (ossConfig && ossConfig.enabled) {
1150
+ console.log("\u2705 [ShowMasterpiece] \u4F7F\u7528\u963F\u91CC\u4E91OSS\u5B58\u50A8");
1151
+ return configManager;
1152
+ } else {
1153
+ console.log("\u2139\uFE0F [ShowMasterpiece] OSS\u672A\u914D\u7F6E\uFF0C\u4F7F\u7528\u672C\u5730\u5B58\u50A8");
1154
+ return configManager;
1155
+ }
1156
+ }
1157
+ async function uploadArtworkImage(file, collectionId) {
1158
+ console.log("\u{1F3A8} [ShowMasterpiece] \u5F00\u59CB\u4E0A\u4F20\u4F5C\u54C1\u56FE\u7247:", file.name);
1159
+ const formData = new FormData();
1160
+ formData.append("file", file);
1161
+ formData.append("moduleId", "showmasterpiece");
1162
+ formData.append("businessId", collectionId ? `collection-${collectionId}` : "artwork");
1163
+ const timestamp = Date.now();
1164
+ const randomId = Math.random().toString(36).substr(2, 9);
1165
+ const extension = file.name.split(".").pop()?.toLowerCase() || "jpg";
1166
+ const basePath = collectionId ? `showmasterpiece/collection-${collectionId}` : "showmasterpiece/artwork";
1167
+ formData.append("folderPath", `${basePath}/${timestamp}_${randomId}.${extension}`);
1168
+ formData.append("needsProcessing", "true");
1169
+ const response = await fetch("/api/universal-file/upload", {
1170
+ method: "POST",
1171
+ body: formData
1172
+ });
1173
+ if (!response.ok) {
1174
+ const errorData = await response.json();
1175
+ throw new Error(errorData.error || `HTTP ${response.status}: ${response.statusText}`);
1176
+ }
1177
+ const result = await response.json();
1178
+ if (!result.success) {
1179
+ throw new Error(result.error || "\u4E0A\u4F20\u5931\u8D25");
1180
+ }
1181
+ console.log("\u2705 [ShowMasterpiece] \u4F5C\u54C1\u56FE\u7247\u4E0A\u4F20\u6210\u529F:", {
1182
+ fileId: result.data.fileId,
1183
+ accessUrl: result.data.accessUrl
1184
+ });
1185
+ return {
1186
+ fileId: result.data.fileId,
1187
+ accessUrl: result.data.accessUrl
1188
+ };
1189
+ }
1190
+ async function getArtworkImageUrl(fileId) {
1191
+ console.log("\u{1F517} [ShowMasterpiece] \u83B7\u53D6\u4F5C\u54C1\u56FE\u7247URL:", fileId);
1192
+ const response = await fetch(`/api/universal-file/${fileId}`);
1193
+ if (!response.ok) {
1194
+ throw new Error(`\u83B7\u53D6\u6587\u4EF6URL\u5931\u8D25: HTTP ${response.status}`);
1195
+ }
1196
+ const result = await response.json();
1197
+ if (!result.success) {
1198
+ throw new Error(result.error || "\u83B7\u53D6\u6587\u4EF6URL\u5931\u8D25");
1199
+ }
1200
+ return result.data.accessUrl;
1201
+ }
1202
+ async function shouldUseUniversalFileService() {
1203
+ try {
1204
+ const configManager = await getCachedConfigManager();
1205
+ const config = configManager.getConfig();
1206
+ const ossConfig = config.storageProviders["aliyun-oss"];
1207
+ if (ossConfig && ossConfig.enabled) {
1208
+ return true;
1209
+ }
1210
+ return true;
1211
+ } catch (error) {
1212
+ console.warn("\u26A0\uFE0F [ShowMasterpiece] \u68C0\u67E5\u6587\u4EF6\u670D\u52A1\u914D\u7F6E\u5931\u8D25:", error);
1213
+ return false;
1214
+ }
1215
+ }
1216
+ async function getStorageModeDisplayName() {
1217
+ const shouldUse = await shouldUseUniversalFileService();
1218
+ if (shouldUse) {
1219
+ const configManager = await getCachedConfigManager();
1220
+ const config = configManager.getConfig();
1221
+ const ossConfig = config.storageProviders["aliyun-oss"];
1222
+ if (ossConfig && ossConfig.enabled) {
1223
+ return "\u963F\u91CC\u4E91OSS + CDN (\u72EC\u7ACB\u914D\u7F6E)";
1224
+ } else {
1225
+ return "\u672C\u5730\u5B58\u50A8 + \u6587\u4EF6\u670D\u52A1";
1226
+ }
1227
+ } else {
1228
+ return "Base64\u6570\u636E\u5E93\u5B58\u50A8";
1229
+ }
1230
+ }
1231
+ function clearConfigCache() {
1232
+ console.log("\u{1F9F9} [ShowMasterpiece] \u6E05\u9664\u914D\u7F6E\u7F13\u5B58");
1233
+ cachedConfigManager = null;
1234
+ }
1235
+ async function refreshFileServiceConfig() {
1236
+ console.log("\u{1F504} [ShowMasterpiece] \u5F3A\u5236\u5237\u65B0\u6587\u4EF6\u670D\u52A1\u914D\u7F6E");
1237
+ clearConfigCache();
1238
+ const configManager = await getCachedConfigManager();
1239
+ if (typeof window === "undefined") {
1240
+ try {
1241
+ const config = configManager.getConfig();
1242
+ const ossConfig = config?.storageProviders?.["aliyun-oss"];
1243
+ if (ossConfig && ossConfig.enabled) {
1244
+ console.log("\u{1F504} [ShowMasterpiece] \u91CD\u65B0\u521D\u59CB\u5316OSS Provider\u4EE5\u5E94\u7528\u65B0\u914D\u7F6E");
1245
+ const { UniversalFileService } = await import('./UniversalFileService-336GFY6N.mjs');
1246
+ const fileService = new UniversalFileService(config);
1247
+ await fileService.initialize();
1248
+ await fileService.reinitializeStorageProviders?.();
1249
+ }
1250
+ } catch (error) {
1251
+ console.warn("\u26A0\uFE0F [ShowMasterpiece] \u91CD\u65B0\u521D\u59CB\u5316Provider\u5931\u8D25:", error);
1252
+ }
1253
+ }
1254
+ return configManager;
1255
+ }
1256
+
1257
+ // src/showmasterpiece/services/exportConfig.ts
1258
+ var BOOKING_EXPORT_FIELDS = [
1259
+ {
1260
+ key: "id",
1261
+ label: "\u9884\u8BA2ID",
1262
+ type: "number",
1263
+ enabled: true,
1264
+ required: true,
1265
+ description: "\u9884\u8BA2\u8BB0\u5F55\u7684\u552F\u4E00\u6807\u8BC6",
1266
+ alignment: "center"
1267
+ },
1268
+ {
1269
+ key: "collectionId",
1270
+ label: "\u753B\u96C6ID",
1271
+ type: "number",
1272
+ enabled: true,
1273
+ required: true,
1274
+ description: "\u753B\u96C6\u7684\u552F\u4E00\u6807\u8BC6",
1275
+ alignment: "center"
1276
+ },
1277
+ {
1278
+ key: "qqNumber",
1279
+ label: "QQ\u53F7",
1280
+ type: "string",
1281
+ enabled: true,
1282
+ required: false,
1283
+ description: "\u7528\u6237\u7684QQ\u53F7\u7801",
1284
+ alignment: "left"
1285
+ },
1286
+ {
1287
+ key: "phoneNumber",
1288
+ label: "\u624B\u673A\u53F7",
1289
+ type: "string",
1290
+ enabled: true,
1291
+ required: false,
1292
+ description: "\u7528\u6237\u7684\u624B\u673A\u53F7\u7801",
1293
+ alignment: "left"
1294
+ },
1295
+ {
1296
+ key: "collectionTitle",
1297
+ label: "\u753B\u96C6\u6807\u9898",
1298
+ type: "string",
1299
+ enabled: true,
1300
+ required: true,
1301
+ description: "\u9884\u8BA2\u7684\u753B\u96C6\u6807\u9898",
1302
+ alignment: "left"
1303
+ },
1304
+ {
1305
+ key: "collectionNumber",
1306
+ label: "\u753B\u96C6\u7F16\u53F7",
1307
+ type: "string",
1308
+ enabled: true,
1309
+ required: true,
1310
+ description: "\u753B\u96C6\u7684\u7F16\u53F7",
1311
+ alignment: "left"
1312
+ },
1313
+ {
1314
+ key: "collectionPrice",
1315
+ label: "\u753B\u96C6\u4EF7\u683C",
1316
+ type: "number",
1317
+ enabled: true,
1318
+ required: true,
1319
+ description: "\u753B\u96C6\u7684\u4EF7\u683C",
1320
+ alignment: "right",
1321
+ formatter: (value) => `\xA5${Number(value).toFixed(2)}`
1322
+ },
1323
+ {
1324
+ key: "status",
1325
+ label: "\u9884\u8BA2\u72B6\u6001",
1326
+ type: "string",
1327
+ enabled: true,
1328
+ required: true,
1329
+ description: "\u9884\u8BA2\u7684\u5F53\u524D\u72B6\u6001",
1330
+ alignment: "center",
1331
+ formatter: (value) => {
1332
+ const statusMap = {
1333
+ pending: "\u5F85\u786E\u8BA4",
1334
+ confirmed: "\u5DF2\u786E\u8BA4",
1335
+ completed: "\u5DF2\u5B8C\u6210",
1336
+ cancelled: "\u5DF2\u53D6\u6D88"
1337
+ };
1338
+ return statusMap[value] || value;
1339
+ }
1340
+ },
1341
+ {
1342
+ key: "quantity",
1343
+ label: "\u9884\u8BA2\u6570\u91CF",
1344
+ type: "number",
1345
+ enabled: true,
1346
+ required: true,
1347
+ description: "\u9884\u8BA2\u7684\u6570\u91CF",
1348
+ alignment: "center"
1349
+ },
1350
+ {
1351
+ key: "price",
1352
+ label: "\u5355\u4EF7",
1353
+ type: "number",
1354
+ enabled: true,
1355
+ required: true,
1356
+ description: "\u5355\u4E2A\u753B\u96C6\u7684\u4EF7\u683C",
1357
+ alignment: "right",
1358
+ formatter: (value) => `\xA5${Number(value).toFixed(2)}`
1359
+ },
1360
+ {
1361
+ key: "totalPrice",
1362
+ label: "\u603B\u4EF7\u683C",
1363
+ type: "number",
1364
+ enabled: true,
1365
+ required: true,
1366
+ description: "\u603B\u4EF7\u683C\uFF08\u5355\u4EF7 \xD7 \u6570\u91CF\uFF09",
1367
+ alignment: "right",
1368
+ formatter: (value) => `\xA5${Number(value).toFixed(2)}`
1369
+ },
1370
+ {
1371
+ key: "notes",
1372
+ label: "\u7528\u6237\u5907\u6CE8",
1373
+ type: "string",
1374
+ enabled: true,
1375
+ required: false,
1376
+ description: "\u7528\u6237\u63D0\u4EA4\u7684\u5907\u6CE8\u4FE1\u606F",
1377
+ alignment: "left"
1378
+ },
1379
+ {
1380
+ key: "pickupMethod",
1381
+ label: "\u9886\u53D6\u65B9\u5F0F",
1382
+ type: "string",
1383
+ enabled: true,
1384
+ required: false,
1385
+ description: "\u7528\u6237\u9009\u62E9\u7684\u9886\u53D6\u65B9\u5F0F",
1386
+ alignment: "left"
1387
+ },
1388
+ {
1389
+ key: "adminNotes",
1390
+ label: "\u7BA1\u7406\u5458\u5907\u6CE8",
1391
+ type: "string",
1392
+ enabled: true,
1393
+ required: false,
1394
+ description: "\u7BA1\u7406\u5458\u6DFB\u52A0\u7684\u5907\u6CE8\u4FE1\u606F",
1395
+ alignment: "left"
1396
+ },
1397
+ {
1398
+ key: "createdAt",
1399
+ label: "\u521B\u5EFA\u65F6\u95F4",
1400
+ type: "date",
1401
+ enabled: true,
1402
+ required: true,
1403
+ description: "\u9884\u8BA2\u521B\u5EFA\u7684\u65F6\u95F4",
1404
+ alignment: "center",
1405
+ formatter: (value) => {
1406
+ if (!value) return "";
1407
+ const date = new Date(value);
1408
+ return date.toLocaleString("zh-CN");
1409
+ }
1410
+ },
1411
+ {
1412
+ key: "updatedAt",
1413
+ label: "\u66F4\u65B0\u65F6\u95F4",
1414
+ type: "date",
1415
+ enabled: true,
1416
+ required: true,
1417
+ description: "\u9884\u8BA2\u6700\u540E\u66F4\u65B0\u7684\u65F6\u95F4",
1418
+ alignment: "center",
1419
+ formatter: (value) => {
1420
+ if (!value) return "";
1421
+ const date = new Date(value);
1422
+ return date.toLocaleString("zh-CN");
1423
+ }
1424
+ },
1425
+ {
1426
+ key: "confirmedAt",
1427
+ label: "\u786E\u8BA4\u65F6\u95F4",
1428
+ type: "date",
1429
+ enabled: true,
1430
+ required: false,
1431
+ description: "\u9884\u8BA2\u786E\u8BA4\u7684\u65F6\u95F4",
1432
+ alignment: "center",
1433
+ formatter: (value) => {
1434
+ if (!value) return "";
1435
+ const date = new Date(value);
1436
+ return date.toLocaleString("zh-CN");
1437
+ }
1438
+ },
1439
+ {
1440
+ key: "completedAt",
1441
+ label: "\u5B8C\u6210\u65F6\u95F4",
1442
+ type: "date",
1443
+ enabled: true,
1444
+ required: false,
1445
+ description: "\u9884\u8BA2\u5B8C\u6210\u7684\u65F6\u95F4",
1446
+ alignment: "center",
1447
+ formatter: (value) => {
1448
+ if (!value) return "";
1449
+ const date = new Date(value);
1450
+ return date.toLocaleString("zh-CN");
1451
+ }
1452
+ },
1453
+ {
1454
+ key: "cancelledAt",
1455
+ label: "\u53D6\u6D88\u65F6\u95F4",
1456
+ type: "date",
1457
+ enabled: true,
1458
+ required: false,
1459
+ description: "\u9884\u8BA2\u53D6\u6D88\u7684\u65F6\u95F4",
1460
+ alignment: "center",
1461
+ formatter: (value) => {
1462
+ if (!value) return "";
1463
+ const date = new Date(value);
1464
+ return date.toLocaleString("zh-CN");
1465
+ }
1466
+ },
1467
+ {
1468
+ key: "userTotalPrice",
1469
+ label: "\u7528\u6237\u603B\u4EF7",
1470
+ type: "number",
1471
+ enabled: false,
1472
+ // 默认不启用,需要勾选才启用
1473
+ required: false,
1474
+ description: "\u6839\u636EQQ\u53F7\u548C\u624B\u673A\u53F7\u7EDF\u4E00\u5339\u914D\u7684\u8BE5\u7528\u6237\u6240\u6709\u9884\u8BA2\u5546\u54C1\u7684\u603B\u4EF7\u683C",
1475
+ alignment: "right",
1476
+ formatter: (value) => `\xA5${Number(value || 0).toFixed(2)}`
1477
+ }
1478
+ ];
1479
+ var DEFAULT_BOOKING_EXPORT_CONFIG = {
1480
+ id: "default_booking_export",
1481
+ name: "\u9884\u8BA2\u4FE1\u606F\u5BFC\u51FA",
1482
+ description: "\u5BFC\u51FA\u6240\u6709\u9884\u8BA2\u4FE1\u606F\u4E3AExcel\u683C\u5F0F\uFF0C\u652F\u6301QQ\u53F7\u548C\u624B\u673A\u53F7\u5408\u5E76\u5355\u5143\u683C",
1483
+ format: "excel",
1484
+ fields: BOOKING_EXPORT_FIELDS,
1485
+ grouping: {
1486
+ enabled: true,
1487
+ fields: [
1488
+ {
1489
+ key: "phoneNumber",
1490
+ label: "\u624B\u673A\u53F7",
1491
+ mode: "merge",
1492
+ valueProcessing: "first",
1493
+ showGroupHeader: false,
1494
+ mergeCells: true
1495
+ },
1496
+ {
1497
+ key: "qqNumber",
1498
+ label: "QQ\u53F7",
1499
+ mode: "merge",
1500
+ valueProcessing: "first",
1501
+ showGroupHeader: false,
1502
+ mergeCells: true
1503
+ },
1504
+ {
1505
+ key: "userTotalPrice",
1506
+ label: "\u7528\u6237\u603B\u4EF7",
1507
+ mode: "merge",
1508
+ valueProcessing: "first",
1509
+ showGroupHeader: false,
1510
+ mergeCells: true
1511
+ }
1512
+ ],
1513
+ preserveOrder: true,
1514
+ nullValueHandling: "separate"
1515
+ },
1516
+ fileNameTemplate: "\u9884\u8BA2\u4FE1\u606F_{date}",
1517
+ includeHeader: true,
1518
+ delimiter: ",",
1519
+ encoding: "utf-8",
1520
+ addBOM: true,
1521
+ maxRows: void 0,
1522
+ createdAt: /* @__PURE__ */ new Date(),
1523
+ updatedAt: /* @__PURE__ */ new Date(),
1524
+ moduleId: "showmasterpiece",
1525
+ businessId: "bookings"
1526
+ };
730
1527
 
731
1528
  // src/showmasterpiece/ui/web/components/CollectionOrderManagerV2.tsx
732
1529
  function CollectionOrderManagerV2({
@@ -1107,11 +1904,11 @@ var CartPage = ({ userId, onClose }) => {
1107
1904
  cart,
1108
1905
  loading,
1109
1906
  error,
1110
- updateCartItem,
1111
- removeFromCart,
1112
- batchBooking,
1907
+ updateCartItem: updateCartItem2,
1908
+ removeFromCart: removeFromCart2,
1909
+ batchBooking: batchBooking2,
1113
1910
  refreshCart,
1114
- clearCart
1911
+ clearCart: clearCart2
1115
1912
  } = useCartContext();
1116
1913
  const {
1117
1914
  configs: popupConfigs,
@@ -1195,7 +1992,7 @@ var CartPage = ({ userId, onClose }) => {
1195
1992
  const performCheckout = async () => {
1196
1993
  setIsCheckingOut(true);
1197
1994
  try {
1198
- const result = await batchBooking({
1995
+ const result = await batchBooking2({
1199
1996
  qqNumber: formData.qqNumber,
1200
1997
  phoneNumber: formData.phoneNumber,
1201
1998
  items: cart.items,
@@ -1269,7 +2066,7 @@ var CartPage = ({ userId, onClose }) => {
1269
2066
  ) : /* @__PURE__ */ React29.createElement("div", { className: "w-16 h-16 sm:w-16 sm:h-16 bg-gray-100 rounded-md flex-shrink-0 flex items-center justify-center text-gray-400 text-xs" }, "\u6682\u65E0\u56FE\u7247"), /* @__PURE__ */ React29.createElement("div", { className: "flex-1 min-w-0" }, /* @__PURE__ */ React29.createElement("h3", { className: "font-semibold text-gray-900 text-sm sm:text-base line-clamp-2" }, item.collection.title), /* @__PURE__ */ React29.createElement("p", { className: "text-xs sm:text-sm text-gray-600" }, "\u7F16\u53F7\uFF1A", item.collection.number), /* @__PURE__ */ React29.createElement("p", { className: "text-xs sm:text-sm text-gray-600" }, "\u4EF7\u683C\uFF1A", item.collection.price ? `\xA5${item.collection.price}` : "\u4EF7\u683C\u5F85\u5B9A")), /* @__PURE__ */ React29.createElement("div", { className: "flex flex-col sm:flex-row items-center gap-2 sm:gap-4 w-full sm:w-auto" }, /* @__PURE__ */ React29.createElement("div", { className: "flex items-center space-x-2" }, /* @__PURE__ */ React29.createElement(
1270
2067
  "button",
1271
2068
  {
1272
- onClick: () => updateCartItem({ collectionId: item.collectionId, quantity: item.quantity - 1 }),
2069
+ onClick: () => updateCartItem2({ collectionId: item.collectionId, quantity: item.quantity - 1 }),
1273
2070
  disabled: loading,
1274
2071
  className: "w-10 h-10 sm:w-8 sm:h-8 rounded-full border border-gray-300 flex items-center justify-center hover:bg-gray-50 disabled:opacity-50"
1275
2072
  },
@@ -1277,7 +2074,7 @@ var CartPage = ({ userId, onClose }) => {
1277
2074
  ), /* @__PURE__ */ React29.createElement("span", { className: "w-16 sm:w-12 text-center font-medium text-sm sm:text-base" }, item.quantity), /* @__PURE__ */ React29.createElement(
1278
2075
  "button",
1279
2076
  {
1280
- onClick: () => updateCartItem({ collectionId: item.collectionId, quantity: item.quantity + 1 }),
2077
+ onClick: () => updateCartItem2({ collectionId: item.collectionId, quantity: item.quantity + 1 }),
1281
2078
  disabled: loading,
1282
2079
  className: "w-10 h-10 sm:w-8 sm:h-8 rounded-full border border-gray-300 flex items-center justify-center hover:bg-gray-50 disabled:opacity-50"
1283
2080
  },
@@ -1285,7 +2082,7 @@ var CartPage = ({ userId, onClose }) => {
1285
2082
  )), /* @__PURE__ */ React29.createElement("div", { className: "text-center sm:text-right" }, /* @__PURE__ */ React29.createElement("p", { className: "font-semibold text-gray-900 text-sm sm:text-base" }, "\xA5", (item.collection.price || 0) * item.quantity))), /* @__PURE__ */ React29.createElement(
1286
2083
  "button",
1287
2084
  {
1288
- onClick: () => removeFromCart({ collectionId: item.collectionId }),
2085
+ onClick: () => removeFromCart2({ collectionId: item.collectionId }),
1289
2086
  disabled: loading,
1290
2087
  className: "text-red-500 hover:text-red-700 disabled:opacity-50 p-2 sm:p-1"
1291
2088
  },
@@ -1355,7 +2152,7 @@ var CartPage = ({ userId, onClose }) => {
1355
2152
  "button",
1356
2153
  {
1357
2154
  type: "button",
1358
- onClick: clearCart,
2155
+ onClick: clearCart2,
1359
2156
  disabled: loading || isCheckingOut,
1360
2157
  className: "flex-1 bg-gray-200 text-gray-800 py-3 sm:py-2 px-4 rounded-lg hover:bg-gray-300 transition-colors disabled:opacity-50 text-base"
1361
2158
  },
@@ -5102,14 +5899,14 @@ function ConfigPageContent() {
5102
5899
  tags,
5103
5900
  loading,
5104
5901
  error,
5105
- updateConfig,
5106
- resetConfig,
5107
- createCollection,
5108
- updateCollection,
5109
- deleteCollection,
5110
- addArtworkToCollection,
5111
- updateArtwork,
5112
- deleteArtwork,
5902
+ updateConfig: updateConfig2,
5903
+ resetConfig: resetConfig2,
5904
+ createCollection: createCollection2,
5905
+ updateCollection: updateCollection2,
5906
+ deleteCollection: deleteCollection2,
5907
+ addArtworkToCollection: addArtworkToCollection2,
5908
+ updateArtwork: updateArtwork2,
5909
+ deleteArtwork: deleteArtwork2,
5113
5910
  moveArtworkUp: moveArtworkUp2,
5114
5911
  moveArtworkDown: moveArtworkDown2,
5115
5912
  updateArtworkOrder: updateArtworkOrder2,
@@ -5138,9 +5935,9 @@ function ConfigPageContent() {
5138
5935
  refreshData: refreshBookingData,
5139
5936
  searchBookings,
5140
5937
  clearSearch,
5141
- updateBookingStatus,
5142
- deleteBooking,
5143
- exportBookings
5938
+ updateBookingStatus: updateBookingStatus3,
5939
+ deleteBooking: deleteBooking3,
5940
+ exportBookings: exportBookings2
5144
5941
  } = useBookingAdmin();
5145
5942
  const [useUniversalService, setUseUniversalService] = useState(false);
5146
5943
  const [storageModeDisplay, setStorageModeDisplay] = useState("\u68C0\u67E5\u4E2D...");
@@ -5356,7 +6153,7 @@ function ConfigPageContent() {
5356
6153
  }, [activeTab, showArtworkOrder, showArtworkForm, editingArtwork]);
5357
6154
  const handleSaveConfig = async () => {
5358
6155
  try {
5359
- await updateConfig(configForm);
6156
+ await updateConfig2(configForm);
5360
6157
  alert("\u914D\u7F6E\u4FDD\u5B58\u6210\u529F\uFF01");
5361
6158
  } catch (err) {
5362
6159
  alert("\u914D\u7F6E\u4FDD\u5B58\u5931\u8D25\uFF01");
@@ -5365,7 +6162,7 @@ function ConfigPageContent() {
5365
6162
  const handleResetConfig = async () => {
5366
6163
  if (confirm("\u786E\u5B9A\u8981\u91CD\u7F6E\u4E3A\u9ED8\u8BA4\u914D\u7F6E\u5417\uFF1F")) {
5367
6164
  try {
5368
- await resetConfig();
6165
+ await resetConfig2();
5369
6166
  alert("\u914D\u7F6E\u91CD\u7F6E\u6210\u529F\uFF01");
5370
6167
  } catch (err) {
5371
6168
  alert("\u914D\u7F6E\u91CD\u7F6E\u5931\u8D25\uFF01");
@@ -5375,10 +6172,10 @@ function ConfigPageContent() {
5375
6172
  const handleSaveCollection = async () => {
5376
6173
  try {
5377
6174
  if (editingCollection) {
5378
- await updateCollection(editingCollection, collectionForm);
6175
+ await updateCollection2(editingCollection, collectionForm);
5379
6176
  setEditingCollection(null);
5380
6177
  } else {
5381
- await createCollection(collectionForm);
6178
+ await createCollection2(collectionForm);
5382
6179
  }
5383
6180
  setShowCollectionForm(false);
5384
6181
  setCollectionForm({
@@ -5413,14 +6210,14 @@ function ConfigPageContent() {
5413
6210
  collectionId: editingArtwork.collectionId,
5414
6211
  artworkId: editingArtwork.artworkId
5415
6212
  });
5416
- await updateArtwork(editingArtwork.collectionId, editingArtwork.artworkId, artworkForm);
6213
+ await updateArtwork2(editingArtwork.collectionId, editingArtwork.artworkId, artworkForm);
5417
6214
  setEditingArtwork(null);
5418
6215
  console.log("\u2705 [\u914D\u7F6E\u9875\u9762] \u5546\u54C1\u8BE6\u60C5\u56FE\u66F4\u65B0\u5B8C\u6210");
5419
6216
  } else {
5420
6217
  console.log("\u2795 [\u914D\u7F6E\u9875\u9762] \u6267\u884C\u5546\u54C1\u8BE6\u60C5\u56FE\u521B\u5EFA...", {
5421
6218
  collectionId: selectedCollection
5422
6219
  });
5423
- await addArtworkToCollection(selectedCollection, artworkForm);
6220
+ await addArtworkToCollection2(selectedCollection, artworkForm);
5424
6221
  console.log("\u2705 [\u914D\u7F6E\u9875\u9762] \u5546\u54C1\u8BE6\u60C5\u56FE\u521B\u5EFA\u5B8C\u6210");
5425
6222
  }
5426
6223
  console.log("\u{1F9F9} [\u914D\u7F6E\u9875\u9762] \u6E05\u7406\u8868\u5355\u72B6\u6001...");
@@ -5725,7 +6522,7 @@ function ConfigPageContent() {
5725
6522
  {
5726
6523
  onClick: async () => {
5727
6524
  if (confirm("\u786E\u5B9A\u8981\u5220\u9664\u8FD9\u4E2A\u5546\u54C1\u5417\uFF1F")) {
5728
- await deleteCollection(collection.id);
6525
+ await deleteCollection2(collection.id);
5729
6526
  }
5730
6527
  },
5731
6528
  className: "flex items-center gap-1 px-3 py-1 bg-red-100 text-red-700 border border-red-200 rounded text-sm hover:bg-red-200 transition-colors"
@@ -5799,7 +6596,7 @@ function ConfigPageContent() {
5799
6596
  {
5800
6597
  onClick: () => {
5801
6598
  if (confirm("\u786E\u5B9A\u8981\u5220\u9664\u8FD9\u4E2A\u5546\u54C1\u8BE6\u60C5\u56FE\u5417\uFF1F")) {
5802
- deleteArtwork(selectedCollection, artwork.id);
6599
+ deleteArtwork2(selectedCollection, artwork.id);
5803
6600
  }
5804
6601
  },
5805
6602
  className: "flex items-center gap-1 px-3 py-1 bg-red-100 text-red-700 border border-red-200 rounded text-sm hover:bg-red-200 transition-colors"
@@ -5826,9 +6623,9 @@ function ConfigPageContent() {
5826
6623
  onRefresh: handleBookingRefresh,
5827
6624
  onSearch: handleBookingSearch,
5828
6625
  onClearSearch: handleBookingClearSearch,
5829
- onUpdateStatus: updateBookingStatus,
5830
- onDeleteBooking: deleteBooking,
5831
- onExportBookings: exportBookings
6626
+ onUpdateStatus: updateBookingStatus3,
6627
+ onDeleteBooking: deleteBooking3,
6628
+ onExportBookings: exportBookings2
5832
6629
  }
5833
6630
  )), /* @__PURE__ */ React29.createElement(TabsContent, { value: "popup", className: "space-y-6" }, /* @__PURE__ */ React29.createElement("div", { className: "mb-6" }, /* @__PURE__ */ React29.createElement("h2", { className: "text-2xl font-bold text-slate-800 mb-2" }, "\u5F39\u7A97\u914D\u7F6E"), /* @__PURE__ */ React29.createElement("p", { className: "text-slate-600" }, "\u7BA1\u7406\u8D2D\u7269\u8F66\u63D0\u4EA4\u65F6\u7684\u9650\u65F6\u63D0\u9192\u5F39\u7A97\u8BBE\u7F6E")), /* @__PURE__ */ React29.createElement(PopupConfigManagement, null)), /* @__PURE__ */ React29.createElement(TabsContent, { value: "system", className: "space-y-6" }, /* @__PURE__ */ React29.createElement("div", { className: "mb-6" }, /* @__PURE__ */ React29.createElement("h2", { className: "text-2xl font-bold text-slate-800 mb-2" }, "\u7CFB\u7EDF\u914D\u7F6E"), /* @__PURE__ */ React29.createElement("p", { className: "text-slate-600" }, "\u7BA1\u7406ShowMasterPieces\u6A21\u5757\u7684\u7CFB\u7EDF\u7EA7\u914D\u7F6E\u9879\uFF0C\u4E3A\u6A21\u5757\u72EC\u7ACB\u5316\u505A\u51C6\u5907"), /* @__PURE__ */ React29.createElement("div", { className: "mt-4 p-4 bg-blue-50 border border-blue-200 rounded-lg" }, /* @__PURE__ */ React29.createElement("div", { className: "flex items-start gap-3" }, /* @__PURE__ */ React29.createElement(Cog, { className: "text-blue-600 mt-0.5", size: 20 }), /* @__PURE__ */ React29.createElement("div", null, /* @__PURE__ */ React29.createElement("h3", { className: "font-semibold text-blue-900" }, "\u914D\u7F6E\u8BF4\u660E"), /* @__PURE__ */ React29.createElement("p", { className: "text-blue-800 text-sm mt-1" }, "\u8FD9\u91CC\u7684\u914D\u7F6E\u9879\u5C06\u7528\u4E8EShowMasterPieces\u6A21\u5757\u7684\u72EC\u7ACB\u8FD0\u884C\u3002 \u65B0\u521B\u5EFA\u7684\u914D\u7F6E\u9879\u4F1A\u81EA\u52A8\u6DFB\u52A0", /* @__PURE__ */ React29.createElement("code", { className: "bg-blue-100 px-1 rounded" }, "SHOWMASTER_"), "\u524D\u7F00\u3002"), /* @__PURE__ */ React29.createElement("p", { className: "text-blue-700 text-xs mt-2" }, "\u{1F4A1} \u63D0\u793A\uFF1A\u8FD9\u4E9B\u914D\u7F6E\u72EC\u7ACB\u4E8E\u5168\u5C40\u914D\u7F6E\uFF0C\u4FBF\u4E8E\u6A21\u5757\u6253\u5305\u548C\u90E8\u7F72\u3002"))))), /* @__PURE__ */ React29.createElement(SystemConfigManager, null)))), showCollectionForm && /* @__PURE__ */ React29.createElement("div", { className: "fixed inset-0 bg-black bg-opacity-50 flex items-center justify-center p-4 z-50" }, /* @__PURE__ */ React29.createElement("div", { className: "bg-white rounded-lg shadow-xl max-w-2xl w-full max-h-[90vh] overflow-hidden" }, /* @__PURE__ */ React29.createElement("div", { className: "flex items-center justify-between p-6 border-b border-slate-200" }, /* @__PURE__ */ React29.createElement("h3", { className: "text-xl font-semibold text-slate-800" }, editingCollection ? "\u7F16\u8F91\u5546\u54C1" : "\u6DFB\u52A0\u5546\u54C1"), /* @__PURE__ */ React29.createElement(
5834
6631
  "button",
@@ -6102,6 +6899,6 @@ function UserHistoryPage() {
6102
6899
  ))));
6103
6900
  }
6104
6901
 
6105
- export { AddConfigItemDialog, AddToCartButton, ArtworkOrderManagerV2, ArtworkViewer, BookingAdminPanel, BookingModal, BookingPage, CartButton, CartHistoryPage, CartModal, CartPage, CollectionCard, CollectionList, CollectionOrderManagerV2, ConfigPage, DeadlinePopup, DeadlinePopupManager, DeleteConfirmDialog, MobileAlbumViewer, PopupConfigManagement, ShowMasterPieces, SystemConfigManager, ThumbnailSidebar, UniversalImageUpload, UserHistoryPage };
6106
- //# sourceMappingURL=chunk-V6BXO6ZS.mjs.map
6107
- //# sourceMappingURL=chunk-V6BXO6ZS.mjs.map
6902
+ export { AddConfigItemDialog, AddToCartButton, ArtworkOrderManagerV2, ArtworkViewer, BOOKING_EXPORT_FIELDS, BookingAdminPanel, BookingModal, BookingPage, CartButton, CartHistoryPage, CartModal, CartPage, CollectionCard, CollectionList, CollectionOrderManagerV2, ConfigPage, DEFAULT_BOOKING_EXPORT_CONFIG, DeadlinePopup, DeadlinePopupManager, DeleteConfirmDialog, MobileAlbumViewer, PopupConfigManagement, ShowMasterPieces, SystemConfigManager, ThumbnailSidebar, UniversalImageUpload, UserHistoryPage, clearConfigCache, getArtworkImageUrl, getShowMasterpieceFileConfig, getStorageModeDisplayName, refreshFileServiceConfig, shouldUseUniversalFileService, uploadArtworkImage };
6903
+ //# sourceMappingURL=chunk-WGD2NBVR.mjs.map
6904
+ //# sourceMappingURL=chunk-WGD2NBVR.mjs.map