@pisell/pisellos 2.1.119 → 2.1.121

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 (231) hide show
  1. package/dist/apis/picoding.d.ts +0 -0
  2. package/dist/apis/picoding.js +1 -0
  3. package/dist/model/index.d.ts +1 -0
  4. package/dist/model/index.js +1 -0
  5. package/dist/model/strategy/adapter/index.d.ts +7 -0
  6. package/dist/model/strategy/adapter/index.js +7 -0
  7. package/dist/model/strategy/adapter/itemRule/adapter.d.ts +59 -0
  8. package/dist/model/strategy/adapter/itemRule/adapter.js +439 -0
  9. package/dist/model/strategy/adapter/itemRule/evaluator.d.ts +43 -0
  10. package/dist/model/strategy/adapter/itemRule/evaluator.js +169 -0
  11. package/dist/model/strategy/adapter/itemRule/examples.d.ts +64 -0
  12. package/dist/model/strategy/adapter/itemRule/examples.js +315 -0
  13. package/dist/model/strategy/adapter/itemRule/index.d.ts +5 -0
  14. package/dist/model/strategy/adapter/itemRule/index.js +5 -0
  15. package/dist/model/strategy/adapter/itemRule/type.d.ts +206 -0
  16. package/dist/model/strategy/adapter/itemRule/type.js +101 -0
  17. package/dist/model/strategy/adapter/promotion/adapter.d.ts +66 -0
  18. package/dist/model/strategy/adapter/promotion/adapter.js +271 -0
  19. package/dist/model/strategy/adapter/promotion/evaluator.d.ts +213 -0
  20. package/dist/model/strategy/adapter/promotion/evaluator.js +1206 -0
  21. package/dist/model/strategy/adapter/promotion/examples.d.ts +138 -0
  22. package/dist/model/strategy/adapter/promotion/examples.js +166 -0
  23. package/dist/model/strategy/adapter/promotion/index.d.ts +4 -0
  24. package/dist/model/strategy/adapter/promotion/index.js +0 -0
  25. package/dist/model/strategy/adapter/promotion/type.d.ts +447 -0
  26. package/dist/model/strategy/adapter/promotion/type.js +209 -0
  27. package/dist/model/strategy/adapter/type.d.ts +28 -0
  28. package/dist/model/strategy/adapter/type.js +1 -0
  29. package/dist/model/strategy/adapter/walletPass/evaluator.d.ts +84 -0
  30. package/dist/model/strategy/adapter/walletPass/evaluator.js +502 -0
  31. package/dist/model/strategy/adapter/walletPass/example.d.ts +4 -0
  32. package/dist/model/strategy/adapter/walletPass/example.js +258 -0
  33. package/dist/model/strategy/adapter/walletPass/index.d.ts +32 -0
  34. package/dist/model/strategy/adapter/walletPass/index.js +182 -0
  35. package/dist/model/strategy/adapter/walletPass/locales.d.ts +1 -0
  36. package/dist/model/strategy/adapter/walletPass/locales.js +26 -0
  37. package/dist/model/strategy/adapter/walletPass/type.d.ts +187 -0
  38. package/dist/model/strategy/adapter/walletPass/type.js +1 -0
  39. package/dist/model/strategy/adapter/walletPass/utils.d.ts +50 -0
  40. package/dist/model/strategy/adapter/walletPass/utils.js +1104 -0
  41. package/dist/model/strategy/engine.d.ts +106 -0
  42. package/dist/model/strategy/engine.js +611 -0
  43. package/dist/model/strategy/index.d.ts +3 -0
  44. package/dist/model/strategy/index.js +8 -0
  45. package/dist/model/strategy/strategy-example.d.ts +5 -0
  46. package/dist/model/strategy/strategy-example.js +331 -0
  47. package/dist/model/strategy/type.d.ts +228 -0
  48. package/dist/model/strategy/type.js +94 -0
  49. package/dist/modules/Cart/utils/cartProduct.js +1 -0
  50. package/dist/modules/OpenData/index.d.ts +24 -0
  51. package/dist/modules/OpenData/index.js +173 -0
  52. package/dist/modules/OpenData/types.d.ts +73 -0
  53. package/dist/modules/OpenData/types.js +1 -0
  54. package/dist/modules/OpenData/utils.d.ts +2 -0
  55. package/dist/modules/OpenData/utils.js +75 -0
  56. package/dist/modules/Order/index.d.ts +58 -1
  57. package/dist/modules/Order/index.js +796 -29
  58. package/dist/modules/Order/types.d.ts +144 -12
  59. package/dist/modules/Order/utils.d.ts +28 -0
  60. package/dist/modules/Order/utils.js +250 -1
  61. package/dist/modules/Product/index.d.ts +1 -1
  62. package/dist/modules/Product/utils.js +2 -2
  63. package/dist/modules/ProductList/index.d.ts +1 -1
  64. package/dist/modules/ProductList/index.js +2 -1
  65. package/dist/modules/Quotation/index.d.ts +48 -0
  66. package/dist/modules/Quotation/index.js +245 -0
  67. package/dist/modules/Quotation/types.d.ts +42 -0
  68. package/dist/modules/Quotation/types.js +1 -0
  69. package/dist/modules/Rules/index.js +4 -1
  70. package/dist/modules/SalesSummary/index.d.ts +63 -0
  71. package/dist/modules/SalesSummary/index.js +174 -0
  72. package/dist/modules/SalesSummary/types.d.ts +59 -0
  73. package/dist/modules/SalesSummary/types.js +1 -0
  74. package/dist/modules/SalesSummary/utils.d.ts +30 -0
  75. package/dist/modules/SalesSummary/utils.js +513 -0
  76. package/dist/modules/ScanOrderLogger/index.d.ts +21 -0
  77. package/dist/modules/ScanOrderLogger/index.js +161 -0
  78. package/dist/modules/ScanOrderLogger/providers/feishu.d.ts +2 -0
  79. package/dist/modules/ScanOrderLogger/providers/feishu.js +95 -0
  80. package/dist/modules/ScanOrderLogger/providers/grafana.d.ts +2 -0
  81. package/dist/modules/ScanOrderLogger/providers/grafana.js +50 -0
  82. package/dist/modules/ScanOrderLogger/types.d.ts +46 -0
  83. package/dist/modules/ScanOrderLogger/types.js +1 -0
  84. package/dist/modules/Schedule/getDateIsInSchedule.js +11 -18
  85. package/dist/modules/Summary/utils.d.ts +3 -3
  86. package/dist/modules/Summary/utils.js +4 -4
  87. package/dist/modules/index.d.ts +4 -0
  88. package/dist/modules/index.js +5 -1
  89. package/dist/solution/BookingByStep/index.d.ts +1 -1
  90. package/dist/solution/BookingByStep/types.d.ts +3 -1
  91. package/dist/solution/BookingByStep/types.js +5 -1
  92. package/dist/solution/BookingTicket/index.d.ts +1 -1
  93. package/dist/solution/ScanOrder/index.d.ts +90 -0
  94. package/dist/solution/ScanOrder/index.js +1853 -0
  95. package/dist/solution/ScanOrder/types.d.ts +210 -0
  96. package/dist/solution/ScanOrder/types.js +16 -0
  97. package/dist/solution/ScanOrder/utils.d.ts +93 -0
  98. package/dist/solution/ScanOrder/utils.js +397 -0
  99. package/dist/solution/VenueBooking/index.d.ts +163 -0
  100. package/dist/solution/VenueBooking/index.js +2931 -0
  101. package/dist/solution/VenueBooking/sales-section-4-annotated.json +343 -0
  102. package/dist/solution/VenueBooking/types.d.ts +130 -0
  103. package/dist/solution/VenueBooking/types.js +21 -0
  104. package/dist/solution/VenueBooking/utils/dateSummary.d.ts +10 -0
  105. package/dist/solution/VenueBooking/utils/dateSummary.js +102 -0
  106. package/dist/solution/VenueBooking/utils/resource.d.ts +4 -0
  107. package/dist/solution/VenueBooking/utils/resource.js +94 -0
  108. package/dist/solution/VenueBooking/utils/slotMerge.d.ts +29 -0
  109. package/dist/solution/VenueBooking/utils/slotMerge.js +203 -0
  110. package/dist/solution/VenueBooking/utils/timeSlot.d.ts +32 -0
  111. package/dist/solution/VenueBooking/utils/timeSlot.js +256 -0
  112. package/dist/solution/VenueBooking/utils.d.ts +1 -0
  113. package/dist/solution/VenueBooking/utils.js +1 -0
  114. package/dist/solution/index.d.ts +2 -0
  115. package/dist/solution/index.js +3 -1
  116. package/lib/apis/picoding.d.ts +0 -0
  117. package/lib/apis/picoding.js +0 -0
  118. package/lib/model/index.d.ts +1 -0
  119. package/lib/model/index.js +23 -0
  120. package/lib/model/strategy/adapter/index.d.ts +7 -0
  121. package/lib/model/strategy/adapter/index.js +57 -0
  122. package/lib/model/strategy/adapter/itemRule/adapter.d.ts +59 -0
  123. package/lib/model/strategy/adapter/itemRule/adapter.js +338 -0
  124. package/lib/model/strategy/adapter/itemRule/evaluator.d.ts +43 -0
  125. package/lib/model/strategy/adapter/itemRule/evaluator.js +124 -0
  126. package/lib/model/strategy/adapter/itemRule/examples.d.ts +64 -0
  127. package/lib/model/strategy/adapter/itemRule/examples.js +269 -0
  128. package/lib/model/strategy/adapter/itemRule/index.d.ts +5 -0
  129. package/lib/model/strategy/adapter/itemRule/index.js +58 -0
  130. package/lib/model/strategy/adapter/itemRule/type.d.ts +206 -0
  131. package/lib/model/strategy/adapter/itemRule/type.js +46 -0
  132. package/lib/model/strategy/adapter/promotion/adapter.d.ts +66 -0
  133. package/lib/model/strategy/adapter/promotion/adapter.js +217 -0
  134. package/lib/model/strategy/adapter/promotion/evaluator.d.ts +213 -0
  135. package/lib/model/strategy/adapter/promotion/evaluator.js +844 -0
  136. package/lib/model/strategy/adapter/promotion/examples.d.ts +138 -0
  137. package/lib/model/strategy/adapter/promotion/examples.js +192 -0
  138. package/lib/model/strategy/adapter/promotion/index.d.ts +4 -0
  139. package/lib/model/strategy/adapter/promotion/index.js +49 -0
  140. package/lib/model/strategy/adapter/promotion/type.d.ts +447 -0
  141. package/lib/model/strategy/adapter/promotion/type.js +51 -0
  142. package/lib/model/strategy/adapter/type.d.ts +28 -0
  143. package/lib/model/strategy/adapter/type.js +17 -0
  144. package/lib/model/strategy/adapter/walletPass/evaluator.d.ts +84 -0
  145. package/lib/model/strategy/adapter/walletPass/evaluator.js +424 -0
  146. package/lib/model/strategy/adapter/walletPass/example.d.ts +4 -0
  147. package/lib/model/strategy/adapter/walletPass/example.js +207 -0
  148. package/lib/model/strategy/adapter/walletPass/index.d.ts +32 -0
  149. package/lib/model/strategy/adapter/walletPass/index.js +142 -0
  150. package/lib/model/strategy/adapter/walletPass/locales.d.ts +1 -0
  151. package/lib/model/strategy/adapter/walletPass/locales.js +54 -0
  152. package/lib/model/strategy/adapter/walletPass/type.d.ts +187 -0
  153. package/lib/model/strategy/adapter/walletPass/type.js +17 -0
  154. package/lib/model/strategy/adapter/walletPass/utils.d.ts +50 -0
  155. package/lib/model/strategy/adapter/walletPass/utils.js +791 -0
  156. package/lib/model/strategy/engine.d.ts +106 -0
  157. package/lib/model/strategy/engine.js +450 -0
  158. package/lib/model/strategy/index.d.ts +3 -0
  159. package/lib/model/strategy/index.js +38 -0
  160. package/lib/model/strategy/strategy-example.d.ts +5 -0
  161. package/lib/model/strategy/strategy-example.js +318 -0
  162. package/lib/model/strategy/type.d.ts +228 -0
  163. package/lib/model/strategy/type.js +44 -0
  164. package/lib/modules/Cart/utils/cartProduct.js +1 -0
  165. package/lib/modules/OpenData/index.d.ts +24 -0
  166. package/lib/modules/OpenData/index.js +119 -0
  167. package/lib/modules/OpenData/types.d.ts +73 -0
  168. package/lib/modules/OpenData/types.js +17 -0
  169. package/lib/modules/OpenData/utils.d.ts +2 -0
  170. package/lib/modules/OpenData/utils.js +111 -0
  171. package/lib/modules/Order/index.d.ts +58 -1
  172. package/lib/modules/Order/index.js +437 -1
  173. package/lib/modules/Order/types.d.ts +144 -12
  174. package/lib/modules/Order/utils.d.ts +28 -0
  175. package/lib/modules/Order/utils.js +250 -2
  176. package/lib/modules/Product/index.d.ts +1 -1
  177. package/lib/modules/Product/utils.js +2 -2
  178. package/lib/modules/ProductList/index.d.ts +1 -1
  179. package/lib/modules/ProductList/index.js +2 -1
  180. package/lib/modules/Quotation/index.d.ts +48 -0
  181. package/lib/modules/Quotation/index.js +149 -0
  182. package/lib/modules/Quotation/types.d.ts +42 -0
  183. package/lib/modules/Quotation/types.js +17 -0
  184. package/lib/modules/Rules/index.js +4 -1
  185. package/lib/modules/SalesSummary/index.d.ts +63 -0
  186. package/lib/modules/SalesSummary/index.js +105 -0
  187. package/lib/modules/SalesSummary/types.d.ts +59 -0
  188. package/lib/modules/SalesSummary/types.js +17 -0
  189. package/lib/modules/SalesSummary/utils.d.ts +30 -0
  190. package/lib/modules/SalesSummary/utils.js +452 -0
  191. package/lib/modules/ScanOrderLogger/index.d.ts +21 -0
  192. package/lib/modules/ScanOrderLogger/index.js +135 -0
  193. package/lib/modules/ScanOrderLogger/providers/feishu.d.ts +2 -0
  194. package/lib/modules/ScanOrderLogger/providers/feishu.js +82 -0
  195. package/lib/modules/ScanOrderLogger/providers/grafana.d.ts +2 -0
  196. package/lib/modules/ScanOrderLogger/providers/grafana.js +52 -0
  197. package/lib/modules/ScanOrderLogger/types.d.ts +46 -0
  198. package/lib/modules/ScanOrderLogger/types.js +17 -0
  199. package/lib/modules/Schedule/getDateIsInSchedule.js +9 -11
  200. package/lib/modules/Summary/utils.d.ts +3 -3
  201. package/lib/modules/Summary/utils.js +4 -4
  202. package/lib/modules/index.d.ts +4 -0
  203. package/lib/modules/index.js +9 -1
  204. package/lib/solution/BookingByStep/index.d.ts +1 -1
  205. package/lib/solution/BookingByStep/types.d.ts +3 -1
  206. package/lib/solution/BookingByStep/types.js +10 -0
  207. package/lib/solution/BookingTicket/index.d.ts +1 -1
  208. package/lib/solution/ScanOrder/index.d.ts +90 -0
  209. package/lib/solution/ScanOrder/index.js +1071 -0
  210. package/lib/solution/ScanOrder/types.d.ts +210 -0
  211. package/lib/solution/ScanOrder/types.js +36 -0
  212. package/lib/solution/ScanOrder/utils.d.ts +93 -0
  213. package/lib/solution/ScanOrder/utils.js +359 -0
  214. package/lib/solution/VenueBooking/index.d.ts +163 -0
  215. package/lib/solution/VenueBooking/index.js +1578 -0
  216. package/lib/solution/VenueBooking/sales-section-4-annotated.json +343 -0
  217. package/lib/solution/VenueBooking/types.d.ts +130 -0
  218. package/lib/solution/VenueBooking/types.js +44 -0
  219. package/lib/solution/VenueBooking/utils/dateSummary.d.ts +10 -0
  220. package/lib/solution/VenueBooking/utils/dateSummary.js +101 -0
  221. package/lib/solution/VenueBooking/utils/resource.d.ts +4 -0
  222. package/lib/solution/VenueBooking/utils/resource.js +80 -0
  223. package/lib/solution/VenueBooking/utils/slotMerge.d.ts +29 -0
  224. package/lib/solution/VenueBooking/utils/slotMerge.js +208 -0
  225. package/lib/solution/VenueBooking/utils/timeSlot.d.ts +32 -0
  226. package/lib/solution/VenueBooking/utils/timeSlot.js +200 -0
  227. package/lib/solution/VenueBooking/utils.d.ts +1 -0
  228. package/lib/solution/VenueBooking/utils.js +69 -0
  229. package/lib/solution/index.d.ts +2 -0
  230. package/lib/solution/index.js +5 -1
  231. package/package.json +1 -1
@@ -0,0 +1,210 @@
1
+ import { OrderModule, ProductList, SalesSummaryModule, ScanOrderLogInput, ScanOrderLoggerModule, ScanOrderLoggerProviderConfig, ScanOrderLoggerProviderType } from '../../modules';
2
+ import type { QuantityCheckResult, QuantityLimitResult } from '../../model/strategy/adapter/itemRule';
3
+ /**
4
+ * 扫码下单流程 hook
5
+ */
6
+ export declare enum ScanOrderHooks {
7
+ onInited = "scanOrder:onInited",
8
+ onDestroy = "scanOrder:onDestroy",
9
+ onRetryInit = "scanOrder:onRetryInit",
10
+ onRefresh = "scanOrder:onRefresh",
11
+ onCartValidationChanged = "scanOrder:onCartValidationChanged"
12
+ }
13
+ export type ScanOrderStatus = 'idle' | 'initializing' | 'ready' | 'error';
14
+ export type ScanOrderEntryContext = {
15
+ biz: string;
16
+ mode: 'scan' | 'append';
17
+ resourceId?: string;
18
+ sourceOrderId?: string;
19
+ };
20
+ export interface ScanOrderConfig {
21
+ orderSource: 'local' | 'remote';
22
+ scanTimeout: number;
23
+ allowAppend: boolean;
24
+ maxAppendCount: number;
25
+ features: {
26
+ autoMerge: boolean;
27
+ verifyResource: boolean;
28
+ };
29
+ }
30
+ export interface ScanOrderOrderProductIdentity {
31
+ product_id: number | null;
32
+ product_variant_id: number;
33
+ identity_key?: string;
34
+ }
35
+ export interface ScanOrderOrderProduct extends ScanOrderOrderProductIdentity {
36
+ order_detail_id: number | null;
37
+ num: number;
38
+ product_option_item: any[];
39
+ selling_price: string;
40
+ original_price: string;
41
+ payment_price: string;
42
+ tax_fee: string;
43
+ is_charge_tax: number;
44
+ discount_list: any[];
45
+ product_bundle: any[];
46
+ metadata: Record<string, any>;
47
+ _origin?: Record<string, any>;
48
+ }
49
+ export interface ScanOrderSubmitProduct extends Omit<ScanOrderOrderProduct, '_origin' | 'identity_key'> {
50
+ }
51
+ export interface ScanOrderSummary {
52
+ product_quantity: number;
53
+ product_original_amount: string;
54
+ product_amount: string;
55
+ product_expect_amount: string;
56
+ product_tax_fee: string;
57
+ shipping_fee: string;
58
+ shipping_tax_fee: string;
59
+ tax_fee: string;
60
+ surcharge_fee: string;
61
+ discount_amount: string;
62
+ deposit_amount: string;
63
+ deposit?: {
64
+ total: string;
65
+ deposit_policy_ids: number[];
66
+ hasDeposit: boolean;
67
+ };
68
+ expect_amount: string;
69
+ total_amount: string;
70
+ amount_gap: string;
71
+ rounding_amount: string;
72
+ pay_service_charge_amount: string;
73
+ tax_title?: string;
74
+ tax_rate?: number;
75
+ }
76
+ /**
77
+ * ScanOrder 临时订单(runtime-clean 版本)
78
+ * 只保留运行时字段,不包含任何 __comment 字段
79
+ */
80
+ export interface ScanOrderTempOrder {
81
+ order_id: number | null;
82
+ relation_id?: string;
83
+ table_form_id?: string;
84
+ resource_id?: string;
85
+ order_number: string;
86
+ shop_order_number: string;
87
+ type: string;
88
+ business_code: string;
89
+ platform: string;
90
+ sales_channel: string;
91
+ order_sales_channel: string;
92
+ status: string;
93
+ payment_status: string;
94
+ shipping_status: string;
95
+ customer_id: number | null;
96
+ customer_name: string;
97
+ country_calling_code: string;
98
+ phone: string;
99
+ email: string;
100
+ is_price_include_tax: number;
101
+ tax_title: string;
102
+ tax_country_code: string;
103
+ currency_code: string;
104
+ currency_symbol: string;
105
+ currency_format: string;
106
+ is_deposit: number;
107
+ deposit_amount: string;
108
+ shop_discount: string;
109
+ surcharge_fee: string;
110
+ note: string;
111
+ schedule_date: string;
112
+ created_at: string;
113
+ products: ScanOrderOrderProduct[];
114
+ bookings: any[];
115
+ payments: any[];
116
+ surcharges: any[];
117
+ discount_list: any[];
118
+ relation_forms: any[];
119
+ contacts: any[];
120
+ contacts_info: any[];
121
+ holder: Record<string, any> | null;
122
+ summary: ScanOrderSummary;
123
+ metadata: Record<string, any>;
124
+ }
125
+ export interface ScanOrderSubmitPayload extends Omit<ScanOrderTempOrder, 'platform' | 'products' | 'created_at' | 'summary' | 'surcharges'> {
126
+ platform: 'H5' | 'PC';
127
+ request_unique_idempotency_token?: string;
128
+ form_record_ids?: Array<{
129
+ form_id: number | string;
130
+ form_record_ids: Array<number | string>;
131
+ }>;
132
+ products: ScanOrderSubmitProduct[];
133
+ }
134
+ export type ScanOrderAvailabilityMode = 'idle' | 'shop_closed' | 'resource_block' | 'resource_busy' | 'additional_order_with_code' | 'additional_order';
135
+ export interface ScanOrderAvailabilityInfo {
136
+ mode: ScanOrderAvailabilityMode;
137
+ order_id?: string;
138
+ relation_id?: string;
139
+ table_form_id?: string;
140
+ deskmate_valid?: boolean;
141
+ errorTips?: string;
142
+ policy?: string | null;
143
+ partyroom_booking?: string | null;
144
+ }
145
+ export interface ScanOrderTableSnackConfig {
146
+ snack?: boolean | number | string;
147
+ table_validate?: boolean | number | string;
148
+ }
149
+ export interface ScanOrderOrderNumberPrefixConfig {
150
+ table_order?: string;
151
+ pos?: string;
152
+ }
153
+ export interface ScanOrderTableFormRecord {
154
+ policy?: string | null;
155
+ }
156
+ export interface ScanOrderTableConfigApiData {
157
+ table_max_number?: number | string | null;
158
+ order_count?: number | string | null;
159
+ order_id?: number | string | null;
160
+ last_order_id?: number | string | null;
161
+ relation_id?: number | string | null;
162
+ table_form_id?: number | string | null;
163
+ table_snack?: ScanOrderTableSnackConfig[] | null;
164
+ order_number_prefix?: ScanOrderOrderNumberPrefixConfig[] | null;
165
+ [key: string]: any;
166
+ }
167
+ export interface ScanOrderTableConfigApiResponse {
168
+ status?: boolean;
169
+ code?: number;
170
+ message?: string;
171
+ data?: ScanOrderTableConfigApiData | null;
172
+ }
173
+ export interface ScanOrderResourceState extends ScanOrderAvailabilityInfo {
174
+ tableMaxNumber: number;
175
+ orderCount: number;
176
+ relationId?: string;
177
+ tableFormId?: string;
178
+ currentOrderId?: string;
179
+ lastOrderId?: string;
180
+ allowSnack: boolean;
181
+ deskmateValid: boolean;
182
+ isExclusive: boolean;
183
+ isFull: boolean;
184
+ orderNumberPrefix: ScanOrderOrderNumberPrefixConfig[];
185
+ raw: ScanOrderTableConfigApiData | null;
186
+ table_form_record?: ScanOrderTableFormRecord | null;
187
+ }
188
+ export interface ScanOrderState {
189
+ entryContext: ScanOrderEntryContext | null;
190
+ status: ScanOrderStatus;
191
+ config: ScanOrderTableConfigApiData | null;
192
+ resource: ScanOrderResourceState | null;
193
+ flow: Record<string, any>;
194
+ error: string | null;
195
+ products?: ProductList;
196
+ order?: OrderModule;
197
+ salesSummary?: SalesSummaryModule;
198
+ scanOrderLogger?: ScanOrderLoggerModule;
199
+ itemRuleQuantityLimits: QuantityLimitResult[];
200
+ cartValidation: {
201
+ passed: boolean | null;
202
+ failures: QuantityCheckResult[];
203
+ };
204
+ }
205
+ export interface ScanOrderLoggerRuntimeConfig {
206
+ provider?: ScanOrderLoggerProviderType;
207
+ providerConfig?: ScanOrderLoggerProviderConfig;
208
+ }
209
+ export interface ScanOrderAddLogParams extends ScanOrderLogInput {
210
+ }
@@ -0,0 +1,36 @@
1
+ var __defProp = Object.defineProperty;
2
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
3
+ var __getOwnPropNames = Object.getOwnPropertyNames;
4
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
5
+ var __export = (target, all) => {
6
+ for (var name in all)
7
+ __defProp(target, name, { get: all[name], enumerable: true });
8
+ };
9
+ var __copyProps = (to, from, except, desc) => {
10
+ if (from && typeof from === "object" || typeof from === "function") {
11
+ for (let key of __getOwnPropNames(from))
12
+ if (!__hasOwnProp.call(to, key) && key !== except)
13
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
14
+ }
15
+ return to;
16
+ };
17
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
18
+
19
+ // src/solution/ScanOrder/types.ts
20
+ var types_exports = {};
21
+ __export(types_exports, {
22
+ ScanOrderHooks: () => ScanOrderHooks
23
+ });
24
+ module.exports = __toCommonJS(types_exports);
25
+ var ScanOrderHooks = /* @__PURE__ */ ((ScanOrderHooks2) => {
26
+ ScanOrderHooks2["onInited"] = "scanOrder:onInited";
27
+ ScanOrderHooks2["onDestroy"] = "scanOrder:onDestroy";
28
+ ScanOrderHooks2["onRetryInit"] = "scanOrder:onRetryInit";
29
+ ScanOrderHooks2["onRefresh"] = "scanOrder:onRefresh";
30
+ ScanOrderHooks2["onCartValidationChanged"] = "scanOrder:onCartValidationChanged";
31
+ return ScanOrderHooks2;
32
+ })(ScanOrderHooks || {});
33
+ // Annotate the CommonJS export names for ESM import in node:
34
+ 0 && (module.exports = {
35
+ ScanOrderHooks
36
+ });
@@ -0,0 +1,93 @@
1
+ import { ScanOrderOrderProduct, ScanOrderOrderProductIdentity, ScanOrderSummary, ScanOrderTempOrder } from './types';
2
+ import type { CartItemSummary, ItemRuleBusinessData, PaxInfo, QuantityLimitResult } from '../../model/strategy/adapter/itemRule';
3
+ import type { StrategyConfig } from '../../model/strategy/type';
4
+ /**
5
+ * 构建金额全为 0 的空 summary。
6
+ * 作为尚未计算金额时的兜底默认值,避免下游因 undefined 报错。
7
+ */
8
+ export declare function createEmptySummary(): ScanOrderSummary;
9
+ /**
10
+ * 商品数量安全取值。
11
+ * - NaN / undefined / < 1 均视作 1(最低起订量)
12
+ * - 有值时取整(不支持小数数量)
13
+ */
14
+ export declare function getSafeProductNum(num?: number): number;
15
+ /**
16
+ * 宽松布尔值转换。
17
+ * 兼容后端/配置中心常见的 boolean / number / string 表达,统一归一成 true/false。
18
+ */
19
+ export declare function toBoolean(value: unknown): boolean;
20
+ /**
21
+ * 将值归一化为有效的正向字符串。
22
+ * null / undefined / 空串 / '0' / 'null' 统一视为无效值并返回 undefined。
23
+ */
24
+ export declare function toPositiveString(value: unknown): string | undefined;
25
+ /**
26
+ * 归一化 item rule 策略模型 ID 列表。
27
+ * - 支持 string / number 混合输入
28
+ * - 仅保留 > 0 的合法数字
29
+ * - 自动去重
30
+ */
31
+ export declare function normalizeEnabledItemRuleIds(rawIds: unknown): number[];
32
+ /**
33
+ * 从 tableConfig 中提取合法策略模型 ID 列表。
34
+ */
35
+ export declare function extractStrategyModelIdsFromTableConfig(tableConfig: Record<string, any> | null | undefined): number[];
36
+ /**
37
+ * 仅保留 item_rule 类型策略。
38
+ */
39
+ export declare function normalizeItemRuleStrategies(configs: unknown): StrategyConfig[];
40
+ export declare function toNonNegativeNumber(value: unknown): number;
41
+ export declare function toNonNegativeInt(value: unknown): number;
42
+ export declare function toPriceString(value: unknown, fallback?: string): string;
43
+ export declare function buildProductKey(productId: number, productVariantId: number): string;
44
+ export declare function getTopLevelProductId(product: Record<string, any>): number | null;
45
+ export declare function getTopLevelVariantId(product: Record<string, any>): number | null;
46
+ export declare function buildQuantityLimitIndex(limits: QuantityLimitResult[]): {
47
+ exactLimitMap: Map<string, QuantityLimitResult[]>;
48
+ productLimitMap: Map<number, QuantityLimitResult[]>;
49
+ };
50
+ export declare function resolveSkuMatchedQuantityLimits(params: {
51
+ productId: number;
52
+ variantId: number | null;
53
+ limitIndex: {
54
+ exactLimitMap: Map<string, QuantityLimitResult[]>;
55
+ productLimitMap: Map<number, QuantityLimitResult[]>;
56
+ };
57
+ }): QuantityLimitResult[];
58
+ export declare function aggregateItemRuleLimit(matchedLimits: QuantityLimitResult[]): {
59
+ min: number | undefined;
60
+ max: number | undefined;
61
+ exact: number | undefined;
62
+ mustInclude: boolean;
63
+ } | null;
64
+ export declare function buildItemRuleBusinessData(params: {
65
+ tempOrder: ScanOrderTempOrder;
66
+ runtimeConfig: {
67
+ pax?: Partial<PaxInfo>;
68
+ historicalItems?: CartItemSummary[];
69
+ serviceType?: string;
70
+ submissionIndex?: number;
71
+ custom?: Record<string, any>;
72
+ };
73
+ itemRuleConfigs: StrategyConfig[];
74
+ }): ItemRuleBusinessData;
75
+ export declare function attachItemRuleLimitsToTopLevelProducts<T>(productList: T, limits: QuantityLimitResult[]): T;
76
+ /**
77
+ * 判断两个商品 identity 是否匹配。
78
+ * 当双方都没有 identity_key 时回退到 product_id + product_variant_id 比较(向后兼容);
79
+ * 一旦有一方携带 identity_key,则必须严格相等。
80
+ */
81
+ export declare function isIdentityMatch(a: ScanOrderOrderProductIdentity, b: ScanOrderOrderProductIdentity): boolean;
82
+ /**
83
+ * 根据 identity 在商品列表中定位下标。
84
+ * 用于判断商品是否已存在(已存在则累加数量,否则新增)。
85
+ */
86
+ export declare function getProductIdentityIndex(products: ScanOrderOrderProduct[], identity: ScanOrderOrderProductIdentity): number;
87
+ /**
88
+ * 对外部传入的商品对象做归一化:
89
+ * - 补全可选字段默认值(未传则使用兜底值,避免后续计算时因 undefined 导致异常)
90
+ * - 对 num 调用 getSafeProductNum 做安全处理
91
+ * - 保留 _origin 供后续业务流程(如促销规则)使用
92
+ */
93
+ export declare function normalizeOrderProduct(product: Partial<ScanOrderOrderProduct> & ScanOrderOrderProductIdentity): ScanOrderOrderProduct;
@@ -0,0 +1,359 @@
1
+ var __defProp = Object.defineProperty;
2
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
3
+ var __getOwnPropNames = Object.getOwnPropertyNames;
4
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
5
+ var __export = (target, all) => {
6
+ for (var name in all)
7
+ __defProp(target, name, { get: all[name], enumerable: true });
8
+ };
9
+ var __copyProps = (to, from, except, desc) => {
10
+ if (from && typeof from === "object" || typeof from === "function") {
11
+ for (let key of __getOwnPropNames(from))
12
+ if (!__hasOwnProp.call(to, key) && key !== except)
13
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
14
+ }
15
+ return to;
16
+ };
17
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
18
+
19
+ // src/solution/ScanOrder/utils.ts
20
+ var utils_exports = {};
21
+ __export(utils_exports, {
22
+ aggregateItemRuleLimit: () => aggregateItemRuleLimit,
23
+ attachItemRuleLimitsToTopLevelProducts: () => attachItemRuleLimitsToTopLevelProducts,
24
+ buildItemRuleBusinessData: () => buildItemRuleBusinessData,
25
+ buildProductKey: () => buildProductKey,
26
+ buildQuantityLimitIndex: () => buildQuantityLimitIndex,
27
+ createEmptySummary: () => createEmptySummary,
28
+ extractStrategyModelIdsFromTableConfig: () => extractStrategyModelIdsFromTableConfig,
29
+ getProductIdentityIndex: () => getProductIdentityIndex,
30
+ getSafeProductNum: () => getSafeProductNum,
31
+ getTopLevelProductId: () => getTopLevelProductId,
32
+ getTopLevelVariantId: () => getTopLevelVariantId,
33
+ isIdentityMatch: () => isIdentityMatch,
34
+ normalizeEnabledItemRuleIds: () => normalizeEnabledItemRuleIds,
35
+ normalizeItemRuleStrategies: () => normalizeItemRuleStrategies,
36
+ normalizeOrderProduct: () => normalizeOrderProduct,
37
+ resolveSkuMatchedQuantityLimits: () => resolveSkuMatchedQuantityLimits,
38
+ toBoolean: () => toBoolean,
39
+ toNonNegativeInt: () => toNonNegativeInt,
40
+ toNonNegativeNumber: () => toNonNegativeNumber,
41
+ toPositiveString: () => toPositiveString,
42
+ toPriceString: () => toPriceString
43
+ });
44
+ module.exports = __toCommonJS(utils_exports);
45
+ function createEmptySummary() {
46
+ return {
47
+ product_quantity: 0,
48
+ product_original_amount: "0.00",
49
+ product_amount: "0.00",
50
+ product_expect_amount: "0.00",
51
+ product_tax_fee: "0.00",
52
+ shipping_fee: "0.00",
53
+ shipping_tax_fee: "0.00",
54
+ tax_fee: "0.00",
55
+ surcharge_fee: "0.00",
56
+ discount_amount: "0.00",
57
+ deposit_amount: "0.00",
58
+ expect_amount: "0.00",
59
+ total_amount: "0.00",
60
+ amount_gap: "0.00",
61
+ rounding_amount: "0.00",
62
+ pay_service_charge_amount: "0.00"
63
+ };
64
+ }
65
+ function getSafeProductNum(num) {
66
+ if (!num || Number.isNaN(num))
67
+ return 1;
68
+ if (num < 1)
69
+ return 1;
70
+ return Math.floor(num);
71
+ }
72
+ function toBoolean(value) {
73
+ if (typeof value === "boolean")
74
+ return value;
75
+ if (typeof value === "number")
76
+ return value !== 0;
77
+ if (typeof value === "string") {
78
+ const normalized = value.trim().toLowerCase();
79
+ return ["1", "true", "yes", "y", "on"].includes(normalized);
80
+ }
81
+ return false;
82
+ }
83
+ function toPositiveString(value) {
84
+ if (value === null || value === void 0 || value === "")
85
+ return void 0;
86
+ const normalized = String(value).trim();
87
+ if (!normalized || normalized === "0" || normalized.toLowerCase() === "null") {
88
+ return void 0;
89
+ }
90
+ return normalized;
91
+ }
92
+ function normalizeEnabledItemRuleIds(rawIds) {
93
+ if (!Array.isArray(rawIds))
94
+ return [];
95
+ const uniqueIds = /* @__PURE__ */ new Set();
96
+ for (const item of rawIds) {
97
+ const strategyId = Number(item);
98
+ if (Number.isFinite(strategyId) && strategyId > 0) {
99
+ uniqueIds.add(strategyId);
100
+ }
101
+ }
102
+ return Array.from(uniqueIds);
103
+ }
104
+ function extractStrategyModelIdsFromTableConfig(tableConfig) {
105
+ const rawIds = Array.isArray(tableConfig == null ? void 0 : tableConfig.strategy_model_ids) ? tableConfig.strategy_model_ids : [];
106
+ return rawIds.map((id) => Number(id)).filter((id) => Number.isFinite(id) && id > 0);
107
+ }
108
+ function normalizeItemRuleStrategies(configs) {
109
+ if (!Array.isArray(configs))
110
+ return [];
111
+ return configs.filter(
112
+ (config) => {
113
+ var _a;
114
+ return Boolean(
115
+ config && typeof config === "object" && ((_a = config == null ? void 0 : config.metadata) == null ? void 0 : _a.type) === "item_rule"
116
+ );
117
+ }
118
+ );
119
+ }
120
+ function toNonNegativeNumber(value) {
121
+ if (typeof value === "number") {
122
+ return Number.isFinite(value) && value >= 0 ? value : 0;
123
+ }
124
+ if (typeof value === "string") {
125
+ const parsed = Number(value);
126
+ return Number.isFinite(parsed) && parsed >= 0 ? parsed : 0;
127
+ }
128
+ return 0;
129
+ }
130
+ function toNonNegativeInt(value) {
131
+ return Math.floor(toNonNegativeNumber(value));
132
+ }
133
+ function toPriceString(value, fallback = "0.00") {
134
+ const parsedValue = Number(value);
135
+ if (Number.isNaN(parsedValue))
136
+ return fallback;
137
+ return parsedValue.toFixed(2);
138
+ }
139
+ function buildProductKey(productId, productVariantId) {
140
+ return `${productId}_${productVariantId}`;
141
+ }
142
+ function getTopLevelProductId(product) {
143
+ const rawProductId = product.product_id ?? product.id;
144
+ const productId = Number(rawProductId);
145
+ if (!Number.isFinite(productId) || productId <= 0)
146
+ return null;
147
+ return productId;
148
+ }
149
+ function getTopLevelVariantId(product) {
150
+ const rawVariantId = product.product_variant_id ?? product.variant_id;
151
+ if (rawVariantId === void 0 || rawVariantId === null || rawVariantId === "") {
152
+ return null;
153
+ }
154
+ const variantId = Number(rawVariantId);
155
+ if (!Number.isFinite(variantId) || variantId <= 0)
156
+ return null;
157
+ return variantId;
158
+ }
159
+ function buildQuantityLimitIndex(limits) {
160
+ const exactLimitMap = /* @__PURE__ */ new Map();
161
+ const productLimitMap = /* @__PURE__ */ new Map();
162
+ for (const limit of limits) {
163
+ for (const target of limit.targets || []) {
164
+ const productId = Number(target.product_id);
165
+ if (!Number.isFinite(productId) || productId <= 0)
166
+ continue;
167
+ const variantId = Number(target.product_variant_id);
168
+ const hasVariant = Number.isFinite(variantId) && variantId > 0;
169
+ if (hasVariant) {
170
+ const exactKey = buildProductKey(productId, variantId);
171
+ const existed2 = exactLimitMap.get(exactKey) || [];
172
+ exactLimitMap.set(exactKey, [...existed2, limit]);
173
+ continue;
174
+ }
175
+ const existed = productLimitMap.get(productId) || [];
176
+ productLimitMap.set(productId, [...existed, limit]);
177
+ }
178
+ }
179
+ return {
180
+ exactLimitMap,
181
+ productLimitMap
182
+ };
183
+ }
184
+ function resolveSkuMatchedQuantityLimits(params) {
185
+ const { productId, variantId, limitIndex } = params;
186
+ const exactMatched = variantId && variantId > 0 ? limitIndex.exactLimitMap.get(buildProductKey(productId, variantId)) || [] : [];
187
+ const productMatched = limitIndex.productLimitMap.get(productId) || [];
188
+ return [...exactMatched, ...productMatched];
189
+ }
190
+ function aggregateItemRuleLimit(matchedLimits) {
191
+ if (!matchedLimits.length)
192
+ return null;
193
+ let min;
194
+ let max;
195
+ let exact;
196
+ let mustInclude = false;
197
+ for (const limit of matchedLimits) {
198
+ if (typeof limit.requiredMin === "number" && Number.isFinite(limit.requiredMin)) {
199
+ min = min === void 0 ? limit.requiredMin : Math.max(min, limit.requiredMin);
200
+ }
201
+ if (typeof limit.requiredMax === "number" && Number.isFinite(limit.requiredMax)) {
202
+ max = max === void 0 ? limit.requiredMax : Math.min(max, limit.requiredMax);
203
+ }
204
+ if (typeof limit.requiredExact === "number" && Number.isFinite(limit.requiredExact)) {
205
+ exact = limit.requiredExact;
206
+ }
207
+ mustInclude = mustInclude || Boolean(limit.mustInclude);
208
+ }
209
+ if (typeof exact === "number" && Number.isFinite(exact)) {
210
+ min = exact;
211
+ max = exact;
212
+ }
213
+ return {
214
+ min,
215
+ max,
216
+ exact,
217
+ mustInclude
218
+ };
219
+ }
220
+ function buildItemRuleBusinessData(params) {
221
+ const { tempOrder, runtimeConfig, itemRuleConfigs } = params;
222
+ const rawPax = runtimeConfig.pax || {};
223
+ const adultPax = toNonNegativeInt(rawPax.adult);
224
+ const childPax = toNonNegativeInt(rawPax.child);
225
+ const totalPax = toNonNegativeInt(rawPax.total) || adultPax + childPax || 1;
226
+ const cartItems = tempOrder.products.reduce((result, product) => {
227
+ if (typeof product.product_id !== "number")
228
+ return result;
229
+ result.push({
230
+ product_id: product.product_id,
231
+ quantity: toNonNegativeInt(product.num),
232
+ ...typeof product.product_variant_id === "number" ? { product_variant_id: product.product_variant_id } : {}
233
+ });
234
+ return result;
235
+ }, []);
236
+ const historicalItems = Array.isArray(runtimeConfig.historicalItems) ? runtimeConfig.historicalItems.reduce((result, item) => {
237
+ if (typeof (item == null ? void 0 : item.product_id) !== "number")
238
+ return result;
239
+ result.push({
240
+ product_id: item.product_id,
241
+ quantity: toNonNegativeInt(item.quantity),
242
+ ...typeof item.product_variant_id === "number" ? { product_variant_id: item.product_variant_id } : {}
243
+ });
244
+ return result;
245
+ }, []) : [];
246
+ return {
247
+ pax: {
248
+ total: totalPax,
249
+ adult: adultPax,
250
+ child: childPax
251
+ },
252
+ cartItems,
253
+ historicalItems,
254
+ serviceType: runtimeConfig.serviceType || "dine-in",
255
+ submissionIndex: typeof runtimeConfig.submissionIndex === "number" ? toNonNegativeInt(runtimeConfig.submissionIndex) : tempOrder.order_id ? 1 : 0,
256
+ custom: runtimeConfig.custom || {},
257
+ strategyConfigs: itemRuleConfigs
258
+ };
259
+ }
260
+ function attachItemRuleLimitsToTopLevelProducts(productList, limits) {
261
+ if (!Array.isArray(productList))
262
+ return productList;
263
+ const limitIndex = buildQuantityLimitIndex(limits || []);
264
+ for (const item of productList) {
265
+ if (!item || typeof item !== "object")
266
+ continue;
267
+ const productItem = item;
268
+ const productId = getTopLevelProductId(productItem);
269
+ if (productId === null)
270
+ continue;
271
+ const variantId = getTopLevelVariantId(productItem);
272
+ const matchedLimits = limits.length ? resolveSkuMatchedQuantityLimits({
273
+ productId,
274
+ variantId,
275
+ limitIndex
276
+ }) : [];
277
+ const aggregatedLimit = aggregateItemRuleLimit(matchedLimits);
278
+ if (aggregatedLimit) {
279
+ productItem.item_rule_limit = aggregatedLimit;
280
+ } else if ("item_rule_limit" in productItem) {
281
+ delete productItem.item_rule_limit;
282
+ }
283
+ }
284
+ return productList;
285
+ }
286
+ function isIdentityMatch(a, b) {
287
+ if (a.product_id !== b.product_id || a.product_variant_id !== b.product_variant_id)
288
+ return false;
289
+ if (!a.identity_key && !b.identity_key)
290
+ return true;
291
+ return a.identity_key === b.identity_key;
292
+ }
293
+ function getProductIdentityIndex(products, identity) {
294
+ return products.findIndex((item) => isIdentityMatch(item, identity));
295
+ }
296
+ function normalizeOrderProduct(product) {
297
+ var _a;
298
+ const metadata = { ...product.metadata || {} };
299
+ if (product.identity_key && !metadata.unique_identification_number) {
300
+ metadata.unique_identification_number = product.identity_key;
301
+ }
302
+ const resolvedOriginalPrice = product.original_price || "0.00";
303
+ const resolvedSellingPrice = product.selling_price || "0.00";
304
+ if (metadata.main_product_original_price === void 0) {
305
+ metadata.main_product_original_price = resolvedOriginalPrice;
306
+ }
307
+ if (metadata.main_product_selling_price === void 0) {
308
+ metadata.main_product_selling_price = resolvedSellingPrice;
309
+ }
310
+ if (metadata.source_product_price === void 0) {
311
+ metadata.source_product_price = ((_a = product._origin) == null ? void 0 : _a.original_price) ?? resolvedOriginalPrice;
312
+ }
313
+ const normalizedBundle = (product.product_bundle || []).map((item) => ({
314
+ ...item,
315
+ bundle_selling_price: item.bundle_selling_price ?? item.price ?? "0.00",
316
+ custom_price: item.custom_price ?? item.bundle_selling_price ?? item.price ?? "0.00"
317
+ }));
318
+ return {
319
+ order_detail_id: product.order_detail_id || null,
320
+ product_id: product.product_id,
321
+ num: getSafeProductNum(product.num),
322
+ product_variant_id: product.product_variant_id,
323
+ identity_key: product.identity_key,
324
+ product_option_item: product.product_option_item || [],
325
+ selling_price: resolvedSellingPrice,
326
+ original_price: resolvedOriginalPrice,
327
+ payment_price: product.payment_price || "0.00",
328
+ tax_fee: product.tax_fee || "0.00",
329
+ is_charge_tax: product.is_charge_tax ?? 0,
330
+ discount_list: product.discount_list || [],
331
+ product_bundle: normalizedBundle,
332
+ metadata,
333
+ _origin: product._origin
334
+ };
335
+ }
336
+ // Annotate the CommonJS export names for ESM import in node:
337
+ 0 && (module.exports = {
338
+ aggregateItemRuleLimit,
339
+ attachItemRuleLimitsToTopLevelProducts,
340
+ buildItemRuleBusinessData,
341
+ buildProductKey,
342
+ buildQuantityLimitIndex,
343
+ createEmptySummary,
344
+ extractStrategyModelIdsFromTableConfig,
345
+ getProductIdentityIndex,
346
+ getSafeProductNum,
347
+ getTopLevelProductId,
348
+ getTopLevelVariantId,
349
+ isIdentityMatch,
350
+ normalizeEnabledItemRuleIds,
351
+ normalizeItemRuleStrategies,
352
+ normalizeOrderProduct,
353
+ resolveSkuMatchedQuantityLimits,
354
+ toBoolean,
355
+ toNonNegativeInt,
356
+ toNonNegativeNumber,
357
+ toPositiveString,
358
+ toPriceString
359
+ });