@pisell/pisellos 2.2.257 → 2.2.259

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 (59) hide show
  1. package/dist/modules/BookingContext/utils/buildCacheItemFromOrderLine.js +17 -13
  2. package/dist/modules/Order/index.d.ts +32 -1
  3. package/dist/modules/Order/index.js +615 -288
  4. package/dist/modules/Order/types.d.ts +20 -2
  5. package/dist/modules/Order/utils/bundleDiscountHydration.d.ts +5 -0
  6. package/dist/modules/Order/utils/bundleDiscountHydration.js +144 -0
  7. package/dist/modules/Order/utils.d.ts +4 -0
  8. package/dist/modules/Order/utils.js +114 -28
  9. package/dist/modules/Rules/index.d.ts +3 -3
  10. package/dist/modules/Rules/index.js +8 -3
  11. package/dist/modules/Rules/types.d.ts +2 -1
  12. package/dist/modules/SalesSummary/index.d.ts +7 -3
  13. package/dist/modules/SalesSummary/index.js +67 -39
  14. package/dist/modules/SalesSummary/types.d.ts +1 -0
  15. package/dist/modules/SalesSummary/utils.js +2 -1
  16. package/dist/modules/SurchargeList/index.d.ts +6 -4
  17. package/dist/modules/SurchargeList/index.js +62 -39
  18. package/dist/modules/SurchargeList/types.d.ts +6 -2
  19. package/dist/server/index.d.ts +3 -0
  20. package/dist/server/index.js +1136 -855
  21. package/dist/server/modules/order/index.d.ts +22 -3
  22. package/dist/server/modules/order/index.js +398 -316
  23. package/dist/solution/BaseSales/index.d.ts +22 -2
  24. package/dist/solution/BaseSales/index.js +995 -701
  25. package/dist/solution/BaseSales/types.d.ts +1 -0
  26. package/dist/solution/BaseSales/types.js +2 -1
  27. package/dist/solution/BaseSales/utils/transformBaseProductToOrderProduct.js +2 -1
  28. package/dist/solution/BookingTicket/index.d.ts +8 -0
  29. package/dist/solution/BookingTicket/index.js +153 -6
  30. package/lib/modules/BookingContext/utils/buildCacheItemFromOrderLine.js +11 -1
  31. package/lib/modules/Order/index.d.ts +32 -1
  32. package/lib/modules/Order/index.js +402 -64
  33. package/lib/modules/Order/types.d.ts +20 -2
  34. package/lib/modules/Order/utils/bundleDiscountHydration.d.ts +5 -0
  35. package/lib/modules/Order/utils/bundleDiscountHydration.js +139 -0
  36. package/lib/modules/Order/utils.d.ts +4 -0
  37. package/lib/modules/Order/utils.js +84 -2
  38. package/lib/modules/Rules/index.d.ts +3 -3
  39. package/lib/modules/Rules/index.js +4 -3
  40. package/lib/modules/Rules/types.d.ts +2 -1
  41. package/lib/modules/SalesSummary/index.d.ts +7 -3
  42. package/lib/modules/SalesSummary/index.js +28 -11
  43. package/lib/modules/SalesSummary/types.d.ts +1 -0
  44. package/lib/modules/SalesSummary/utils.js +2 -0
  45. package/lib/modules/SurchargeList/index.d.ts +6 -4
  46. package/lib/modules/SurchargeList/index.js +41 -21
  47. package/lib/modules/SurchargeList/types.d.ts +6 -2
  48. package/lib/server/index.d.ts +3 -0
  49. package/lib/server/index.js +215 -9
  50. package/lib/server/modules/order/index.d.ts +22 -3
  51. package/lib/server/modules/order/index.js +103 -53
  52. package/lib/solution/BaseSales/index.d.ts +22 -2
  53. package/lib/solution/BaseSales/index.js +246 -60
  54. package/lib/solution/BaseSales/types.d.ts +1 -0
  55. package/lib/solution/BaseSales/types.js +2 -1
  56. package/lib/solution/BaseSales/utils/transformBaseProductToOrderProduct.js +2 -1
  57. package/lib/solution/BookingTicket/index.d.ts +8 -0
  58. package/lib/solution/BookingTicket/index.js +101 -0
  59. package/package.json +1 -1
@@ -45,6 +45,7 @@ __reExport(BaseSales_exports, require("./types"), module.exports);
45
45
  var import_Quotation = require("../../modules/Quotation");
46
46
  var import_transformBaseProductToOrderProduct = require("./utils/transformBaseProductToOrderProduct");
47
47
  var import_quotationPrice = require("./utils/quotationPrice");
48
+ var SERVER_ORDER_CHANGED_EVENT = "order:onOrdersChanged";
48
49
  function isBaseSalesManualProductDiscountProduct(product) {
49
50
  var _a, _b;
50
51
  return ((_a = product == null ? void 0 : product.metadata) == null ? void 0 : _a.is_manual_discount) === true || ((_b = product == null ? void 0 : product.metadata) == null ? void 0 : _b.is_manual_discount) === 1 || ((product == null ? void 0 : product.discount_list) || []).some((item) => (item == null ? void 0 : item.type) === "product");
@@ -82,6 +83,18 @@ function getBaseSalesUniqueArrayMetadataKey(key) {
82
83
  return "unique_payment_number";
83
84
  return null;
84
85
  }
86
+ function isSameBaseSalesOrderRecord(left, right) {
87
+ if (!left || !right || typeof left !== "object" || typeof right !== "object")
88
+ return false;
89
+ const leftIdentities = new Set(
90
+ [left.order_id, left.id, left.external_sale_number, left.order_number].filter((value) => value !== void 0 && value !== null && value !== "").map(String)
91
+ );
92
+ if (leftIdentities.size === 0)
93
+ return false;
94
+ return [right.order_id, right.id, right.external_sale_number, right.order_number].some(
95
+ (value) => value !== void 0 && value !== null && value !== "" && leftIdentities.has(String(value))
96
+ );
97
+ }
85
98
  function getBaseSalesMetadataUid(item, metadataKey) {
86
99
  var _a;
87
100
  const uid = ((_a = item == null ? void 0 : item.metadata) == null ? void 0 : _a[metadataKey]) ?? (item == null ? void 0 : item[metadataKey]);
@@ -156,6 +169,12 @@ var BaseSalesImpl = class extends import_BaseModule.BaseModule {
156
169
  this.hasManualDiscountSelection = false;
157
170
  this.reusedSharedSubModuleNames = /* @__PURE__ */ new Set();
158
171
  this.paymentMethodsCache = [];
172
+ this.queuedAutoPaymentSync = false;
173
+ this.autoPaymentSyncFlushing = false;
174
+ this.autoPaymentSyncTimer = null;
175
+ this.salesDetailLoadInFlight = false;
176
+ this.serverOrderChangeUnsubscribe = null;
177
+ this.serverOrderChangeHydrateInFlight = null;
159
178
  }
160
179
  /**
161
180
  * 子类可覆盖此方法以追加/收敛要注册的子模块。
@@ -165,10 +184,10 @@ var BaseSalesImpl = class extends import_BaseModule.BaseModule {
165
184
  return ["products", "order", "salesSummary", "schedule", "payment", "quotation"];
166
185
  }
167
186
  getReusableSharedSubModule(moduleName) {
168
- var _a;
187
+ var _a, _b;
169
188
  if (moduleName !== "schedule" && moduleName !== "quotation")
170
189
  return null;
171
- return ((_a = this.core) == null ? void 0 : _a.getModule(moduleName)) || null;
190
+ return ((_b = (_a = this.core) == null ? void 0 : _a.getModule) == null ? void 0 : _b.call(_a, moduleName)) || null;
172
191
  }
173
192
  isScheduleListLoaded(scheduleModule) {
174
193
  if (!scheduleModule)
@@ -220,6 +239,53 @@ var BaseSalesImpl = class extends import_BaseModule.BaseModule {
220
239
  });
221
240
  }
222
241
  }
242
+ isCurrentSalesOrderRecord(order) {
243
+ var _a, _b;
244
+ const currentTempOrder = (_b = (_a = this.store.order) == null ? void 0 : _a.getTempOrder) == null ? void 0 : _b.call(_a);
245
+ const currentRecords = [
246
+ currentTempOrder,
247
+ this.currentSalesDetail
248
+ ].filter(Boolean);
249
+ return currentRecords.some((record) => isSameBaseSalesOrderRecord(record, order));
250
+ }
251
+ async syncCurrentSalesDetailFromServerOrderChange(payload) {
252
+ const changedOrders = Array.isArray(payload) ? payload : Array.isArray(payload == null ? void 0 : payload.changedOrders) ? payload.changedOrders : (payload == null ? void 0 : payload.data) && typeof payload.data === "object" ? [payload.data] : [];
253
+ if (this.salesDetailLoadInFlight || this.serverOrderChangeHydrateInFlight)
254
+ return;
255
+ const changedOrder = changedOrders.find(
256
+ (order) => this.isCurrentSalesOrderRecord(order)
257
+ );
258
+ if (!changedOrder)
259
+ return;
260
+ if (!this.store.order)
261
+ return;
262
+ this.serverOrderChangeHydrateInFlight = (async () => {
263
+ const sales = await this.store.order.hydrateTempOrderFromRecord(changedOrder, {
264
+ recalcOnHydrate: false
265
+ });
266
+ this.currentSalesDetail = sales;
267
+ await this.core.effects.emit(`${this.name}:onSalesOrderLoaded`, { sales });
268
+ })();
269
+ try {
270
+ await this.serverOrderChangeHydrateInFlight;
271
+ } finally {
272
+ this.serverOrderChangeHydrateInFlight = null;
273
+ }
274
+ }
275
+ registerServerOrderChangeSync() {
276
+ var _a, _b;
277
+ (_a = this.serverOrderChangeUnsubscribe) == null ? void 0 : _a.call(this);
278
+ const effects = (_b = this.core) == null ? void 0 : _b.effects;
279
+ if (!effects || typeof effects.on !== "function")
280
+ return;
281
+ this.serverOrderChangeUnsubscribe = effects.on(SERVER_ORDER_CHANGED_EVENT, (payload) => {
282
+ void this.syncCurrentSalesDetailFromServerOrderChange(payload).catch((error) => {
283
+ this.logError("sync sales detail from server order change failed", {
284
+ error: error instanceof Error ? error.message : String(error)
285
+ });
286
+ });
287
+ });
288
+ }
223
289
  hydrateOrderPaymentNames(payments) {
224
290
  if (!payments.length)
225
291
  return [];
@@ -634,9 +700,13 @@ var BaseSalesImpl = class extends import_BaseModule.BaseModule {
634
700
  );
635
701
  }
636
702
  await this.getPaymentMethodsAsync();
703
+ this.registerServerOrderChangeSync();
637
704
  this.core.effects.emit(`${this.name}:onInited`, {});
638
705
  }
639
706
  async destroy() {
707
+ var _a;
708
+ (_a = this.serverOrderChangeUnsubscribe) == null ? void 0 : _a.call(this);
709
+ this.serverOrderChangeUnsubscribe = null;
640
710
  Object.keys(this.store).forEach((key) => {
641
711
  if (this.reusedSharedSubModuleNames.has(key))
642
712
  return;
@@ -663,30 +733,35 @@ var BaseSalesImpl = class extends import_BaseModule.BaseModule {
663
733
  async loadSalesDetail(orderIdOrParams) {
664
734
  if (!this.store.order)
665
735
  throw new Error("order 模块未初始化");
666
- const params = typeof orderIdOrParams === "object" ? orderIdOrParams : { orderId: orderIdOrParams };
667
- const externalSaleNumber = params.externalSaleNumber || params.external_sale_number;
668
- const preloadedSalesDetail = params.preloadedSalesDetail;
669
- const lookup = params.orderId ?? externalSaleNumber ?? params.orderNumber ?? (preloadedSalesDetail == null ? void 0 : preloadedSalesDetail.order_id) ?? (preloadedSalesDetail == null ? void 0 : preloadedSalesDetail.external_sale_number) ?? (preloadedSalesDetail == null ? void 0 : preloadedSalesDetail.order_number);
670
- if (!preloadedSalesDetail && (lookup === void 0 || lookup === null || lookup === "")) {
671
- throw new Error("加载销售详情需要 orderIdexternalSaleNumber orderNumber");
672
- }
673
- const loadedRecord = preloadedSalesDetail ?? await this.store.order.getSalesOrderByLookup({
674
- lookup,
675
- forceRemote: params.forceRemote
676
- });
677
- if (!preloadedSalesDetail && (!loadedRecord || loadedRecord.code !== 200)) {
678
- const message = loadedRecord && (loadedRecord.message || loadedRecord.msg) || `加载销售详情失败: ${lookup}`;
679
- throw new Error(message);
680
- }
681
- const remoteRecord = preloadedSalesDetail ?? loadedRecord.data;
682
- const currentTempOrder = params.merge ? this.store.order.getTempOrder() : null;
683
- const record = params.merge ? mergeSalesDetailRecordWithTempOrder(currentTempOrder, remoteRecord) : remoteRecord;
684
- const sales = await this.store.order.hydrateTempOrderFromRecord(record, {
685
- recalcOnHydrate: false
686
- });
687
- this.currentSalesDetail = sales;
688
- await this.core.effects.emit(`${this.name}:onSalesOrderLoaded`, { sales });
689
- return sales;
736
+ this.salesDetailLoadInFlight = true;
737
+ try {
738
+ const params = typeof orderIdOrParams === "object" ? orderIdOrParams : { orderId: orderIdOrParams };
739
+ const externalSaleNumber = params.externalSaleNumber || params.external_sale_number;
740
+ const preloadedSalesDetail = params.preloadedSalesDetail;
741
+ const lookup = params.orderId ?? externalSaleNumber ?? params.orderNumber ?? (preloadedSalesDetail == null ? void 0 : preloadedSalesDetail.order_id) ?? (preloadedSalesDetail == null ? void 0 : preloadedSalesDetail.external_sale_number) ?? (preloadedSalesDetail == null ? void 0 : preloadedSalesDetail.order_number);
742
+ if (!preloadedSalesDetail && (lookup === void 0 || lookup === null || lookup === "")) {
743
+ throw new Error("加载销售详情需要 orderId、externalSaleNumber orderNumber");
744
+ }
745
+ const loadedRecord = preloadedSalesDetail ?? await this.store.order.getSalesOrderByLookup({
746
+ lookup,
747
+ forceRemote: params.forceRemote
748
+ });
749
+ if (!preloadedSalesDetail && (!loadedRecord || loadedRecord.code !== 200)) {
750
+ const message = loadedRecord && (loadedRecord.message || loadedRecord.msg) || `加载销售详情失败: ${lookup}`;
751
+ throw new Error(message);
752
+ }
753
+ const remoteRecord = preloadedSalesDetail ?? loadedRecord.data;
754
+ const currentTempOrder = params.merge ? this.store.order.getTempOrder() : null;
755
+ const record = params.merge ? mergeSalesDetailRecordWithTempOrder(currentTempOrder, remoteRecord) : remoteRecord;
756
+ const sales = await this.store.order.hydrateTempOrderFromRecord(record, {
757
+ recalcOnHydrate: false
758
+ });
759
+ this.currentSalesDetail = sales;
760
+ await this.core.effects.emit(`${this.name}:onSalesOrderLoaded`, { sales });
761
+ return sales;
762
+ } finally {
763
+ this.salesDetailLoadInFlight = false;
764
+ }
690
765
  }
691
766
  /** 获取当前已加载的销售详情(只读快照)。未加载过则返回 null。 */
692
767
  getSalesOrder() {
@@ -1019,7 +1094,7 @@ var BaseSalesImpl = class extends import_BaseModule.BaseModule {
1019
1094
  });
1020
1095
  }
1021
1096
  async loadDiscountConfig(params) {
1022
- var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l, _m, _n, _o, _p, _q, _r, _s, _t;
1097
+ var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l, _m, _n, _o, _p, _q, _r, _s;
1023
1098
  if (!this.store.order)
1024
1099
  throw new Error("order 模块未初始化");
1025
1100
  const tempOrder = this.store.order.ensureTempOrder();
@@ -1090,13 +1165,15 @@ var BaseSalesImpl = class extends import_BaseModule.BaseModule {
1090
1165
  };
1091
1166
  }
1092
1167
  if (rulesModule) {
1093
- const holders = ((_l = tempOrder.holder) == null ? void 0 : _l.form_record_id) ? [{ form_record_id: tempOrder.holder.form_record_id }] : [];
1168
+ const holders = ((_l = tempOrder.holder) == null ? void 0 : _l.form_record) || [];
1169
+ const orderTotalAmount = Number(((_m = orderStore.summary) == null ? void 0 : _m.total_amount) || 0);
1170
+ console.log("[BaseSales.applyDiscountConfig.calcDiscount]");
1094
1171
  const result = rulesModule.calcDiscount({
1095
1172
  productList: tempOrder.products,
1096
1173
  discountList: nextDiscountList,
1097
1174
  holders,
1098
- isFormSubject: !!((_m = tempOrder.holder) == null ? void 0 : _m.type) && tempOrder.holder.type === "form",
1099
- orderTotalAmount: Number(((_n = orderStore.summary) == null ? void 0 : _n.total_amount) || 0)
1175
+ isFormSubject: (product) => (0, import_utils.resolveIsFormSubject)(tempOrder, product),
1176
+ orderTotalAmount
1100
1177
  }) || { productList: tempOrder.products, discountList: nextDiscountList };
1101
1178
  if (result.productList) {
1102
1179
  tempOrder.products = preserveManualProductDiscountProducts(
@@ -1105,8 +1182,8 @@ var BaseSalesImpl = class extends import_BaseModule.BaseModule {
1105
1182
  );
1106
1183
  }
1107
1184
  for (const product of tempOrder.products || []) {
1108
- const productUid = (_o = product.metadata) == null ? void 0 : _o.unique_identification_number;
1109
- const runtimeOrigin = productUid ? (_r = (_q = (_p = tempOrder._extend) == null ? void 0 : _p.productsByUid) == null ? void 0 : _q[productUid]) == null ? void 0 : _r.origin : void 0;
1185
+ const productUid = (_n = product.metadata) == null ? void 0 : _n.unique_identification_number;
1186
+ const runtimeOrigin = productUid ? (_q = (_p = (_o = tempOrder._extend) == null ? void 0 : _o.productsByUid) == null ? void 0 : _p[productUid]) == null ? void 0 : _q.origin : void 0;
1110
1187
  if ((runtimeOrigin == null ? void 0 : runtimeOrigin.isManualDiscount) || isBaseSalesManualProductDiscountProduct(product))
1111
1188
  continue;
1112
1189
  const totalPerUnitDiscount = (product.discount_list || []).reduce(
@@ -1114,7 +1191,7 @@ var BaseSalesImpl = class extends import_BaseModule.BaseModule {
1114
1191
  0
1115
1192
  );
1116
1193
  const optionSum = (0, import_utils.sumOptionUnitPrice)((0, import_utils.getProductSkuOptions)(product));
1117
- const sourcePrice = ((_s = product.metadata) == null ? void 0 : _s.source_product_price) ?? (((_t = product.metadata) == null ? void 0 : _t.main_product_original_price) != null ? new import_decimal.default(Number(product.metadata.main_product_original_price) || 0).minus(optionSum).toFixed(2) : product.original_price ?? "0");
1194
+ const sourcePrice = ((_r = product.metadata) == null ? void 0 : _r.source_product_price) ?? (((_s = product.metadata) == null ? void 0 : _s.main_product_original_price) != null ? new import_decimal.default(Number(product.metadata.main_product_original_price) || 0).minus(optionSum).toFixed(2) : product.original_price ?? "0");
1118
1195
  const newSourceSellingPrice = new import_decimal.default(Number(sourcePrice) || 0).minus(totalPerUnitDiscount).toDecimalPlaces(2).toString();
1119
1196
  const newMainSellingPrice = new import_decimal.default(Number(newSourceSellingPrice) || 0).plus(optionSum).toDecimalPlaces(2).toFixed(2);
1120
1197
  if (product.metadata) {
@@ -1150,7 +1227,7 @@ var BaseSalesImpl = class extends import_BaseModule.BaseModule {
1150
1227
  };
1151
1228
  }
1152
1229
  async bestDiscount(cb) {
1153
- var _a, _b, _c, _d, _e;
1230
+ var _a, _b, _c, _d;
1154
1231
  if (!this.store.order)
1155
1232
  throw new Error("order 模块未初始化");
1156
1233
  const tempOrder = this.store.order.ensureTempOrder();
@@ -1169,13 +1246,15 @@ var BaseSalesImpl = class extends import_BaseModule.BaseModule {
1169
1246
  };
1170
1247
  await (discountModule == null ? void 0 : discountModule.setDiscountList(nextDiscountList));
1171
1248
  if (rulesModule) {
1172
- const holders = ((_c = tempOrder.holder) == null ? void 0 : _c.form_record_id) ? [{ form_record_id: tempOrder.holder.form_record_id }] : [];
1249
+ const holders = ((_c = tempOrder.holder) == null ? void 0 : _c.form_record) || [];
1250
+ const orderTotalAmount = Number(((_d = orderStore.summary) == null ? void 0 : _d.total_amount) || 0);
1251
+ console.log("[BaseSales.bestDiscount.calcDiscount]");
1173
1252
  result = rulesModule.calcDiscount({
1174
1253
  productList: tempOrder.products,
1175
1254
  discountList: nextDiscountList,
1176
1255
  holders,
1177
- isFormSubject: !!((_d = tempOrder.holder) == null ? void 0 : _d.type) && tempOrder.holder.type === "form",
1178
- orderTotalAmount: Number(((_e = orderStore.summary) == null ? void 0 : _e.total_amount) || 0)
1256
+ isFormSubject: (product) => (0, import_utils.resolveIsFormSubject)(tempOrder, product),
1257
+ orderTotalAmount
1179
1258
  }) || result;
1180
1259
  if (result.productList) {
1181
1260
  tempOrder.products = preserveManualProductDiscountProducts(
@@ -1244,16 +1323,19 @@ var BaseSalesImpl = class extends import_BaseModule.BaseModule {
1244
1323
  const orderStore = this.store.order.store || {};
1245
1324
  const discountModule = orderStore.discount;
1246
1325
  const rulesModule = orderStore.rules;
1247
- const holders = ((_a = tempOrder.holder) == null ? void 0 : _a.form_record_id) ? [{ form_record_id: tempOrder.holder.form_record_id }] : [];
1326
+ const holders = ((_a = tempOrder.holder) == null ? void 0 : _a.form_record) || [];
1248
1327
  let nextDiscountList = updated;
1249
1328
  await (discountModule == null ? void 0 : discountModule.setDiscountList(updated));
1250
1329
  if (rulesModule) {
1330
+ const orderTotalAmount = Number(((_b = orderStore.summary) == null ? void 0 : _b.total_amount) || 0);
1331
+ console.log("[BaseSales.setDiscountSelected.calcDiscount]");
1251
1332
  const result = rulesModule.calcDiscount(
1252
1333
  {
1253
1334
  productList: tempOrder.products,
1254
1335
  discountList: updated,
1255
1336
  holders,
1256
- isFormSubject: !!((_b = tempOrder.holder) == null ? void 0 : _b.type) && tempOrder.holder.type === "form"
1337
+ isFormSubject: (product) => (0, import_utils.resolveIsFormSubject)(tempOrder, product),
1338
+ orderTotalAmount
1257
1339
  },
1258
1340
  {
1259
1341
  discountId: params.discountId,
@@ -1276,6 +1358,7 @@ var BaseSalesImpl = class extends import_BaseModule.BaseModule {
1276
1358
  if (d.isSelected && !beforeSelectedIds.has(d.id)) {
1277
1359
  d.isSelected = false;
1278
1360
  d.isManualSelect = true;
1361
+ d.appliedProductDetails = [];
1279
1362
  }
1280
1363
  }
1281
1364
  }
@@ -1284,16 +1367,32 @@ var BaseSalesImpl = class extends import_BaseModule.BaseModule {
1284
1367
  const selectedResourceIds = new Set(
1285
1368
  nextDiscountList.filter((d) => d.isSelected).map((d) => d.id)
1286
1369
  );
1370
+ const filterSelectedDiscountDetails = (discountList) => (discountList || []).filter((pd) => {
1371
+ var _a2;
1372
+ const rid = ((_a2 = pd.discount) == null ? void 0 : _a2.resource_id) ?? pd.id;
1373
+ return rid != null && selectedResourceIds.has(rid);
1374
+ });
1287
1375
  for (const product of tempOrder.products) {
1288
1376
  const productUid = (_c = product.metadata) == null ? void 0 : _c.unique_identification_number;
1289
1377
  const runtimeOrigin = productUid ? (_f = (_e = (_d = tempOrder._extend) == null ? void 0 : _d.productsByUid) == null ? void 0 : _e[productUid]) == null ? void 0 : _f.origin : void 0;
1290
1378
  if ((runtimeOrigin == null ? void 0 : runtimeOrigin.isManualDiscount) || isBaseSalesManualProductDiscountProduct(product))
1291
1379
  continue;
1292
- product.discount_list = (product.discount_list || []).filter((pd) => {
1293
- var _a2;
1294
- const rid = ((_a2 = pd.discount) == null ? void 0 : _a2.resource_id) ?? pd.id;
1295
- return rid != null && selectedResourceIds.has(rid);
1296
- });
1380
+ product.discount_list = filterSelectedDiscountDetails(product.discount_list);
1381
+ if (Array.isArray(product.product_bundle)) {
1382
+ product.product_bundle = product.product_bundle.map((bundle) => {
1383
+ const nextBundleDiscountList = filterSelectedDiscountDetails(bundle == null ? void 0 : bundle.discount_list);
1384
+ const shouldRestoreBundlePrice = nextBundleDiscountList.length === 0;
1385
+ const restoredBundlePrice = (bundle == null ? void 0 : bundle.original_price) ?? (bundle == null ? void 0 : bundle.product_price) ?? (bundle == null ? void 0 : bundle.price);
1386
+ return {
1387
+ ...bundle,
1388
+ ...shouldRestoreBundlePrice ? {
1389
+ price: restoredBundlePrice,
1390
+ bundle_selling_price: restoredBundlePrice
1391
+ } : {},
1392
+ discount_list: nextBundleDiscountList
1393
+ };
1394
+ });
1395
+ }
1297
1396
  const totalPerUnitDiscount = (product.discount_list || []).reduce(
1298
1397
  (sum, pd) => sum + (pd.amount || 0),
1299
1398
  0
@@ -1382,6 +1481,7 @@ var BaseSalesImpl = class extends import_BaseModule.BaseModule {
1382
1481
  ...(params == null ? void 0 : params.payments) !== void 0 ? { payments: params.payments } : {},
1383
1482
  ...inferredPaymentStatus !== void 0 ? { paymentStatus: inferredPaymentStatus } : {},
1384
1483
  ...(params == null ? void 0 : params.smallTicketDataFlag) !== void 0 ? { smallTicketDataFlag: params.smallTicketDataFlag } : {},
1484
+ ...(params == null ? void 0 : params.confirmPendingVoucherPayments) !== void 0 ? { confirmPendingVoucherPayments: params.confirmPendingVoucherPayments } : {},
1385
1485
  ...(params == null ? void 0 : params.enhancePayload) !== void 0 ? { enhancePayload: params.enhancePayload } : {}
1386
1486
  };
1387
1487
  return this.store.order.submitTempOrder(submitParams);
@@ -1401,6 +1501,7 @@ var BaseSalesImpl = class extends import_BaseModule.BaseModule {
1401
1501
  ...(params == null ? void 0 : params.payments) !== void 0 ? { payments: params.payments } : {},
1402
1502
  ...inferredPaymentStatus !== void 0 ? { paymentStatus: inferredPaymentStatus } : {},
1403
1503
  ...(params == null ? void 0 : params.smallTicketDataFlag) !== void 0 ? { smallTicketDataFlag: params.smallTicketDataFlag } : {},
1504
+ ...(params == null ? void 0 : params.confirmPendingVoucherPayments) !== void 0 ? { confirmPendingVoucherPayments: params.confirmPendingVoucherPayments } : {},
1404
1505
  ...(params == null ? void 0 : params.enhancePayload) !== void 0 ? { enhancePayload: params.enhancePayload } : {}
1405
1506
  };
1406
1507
  return this.store.order.submitTempOrderAsync(submitParams);
@@ -1469,6 +1570,7 @@ var BaseSalesImpl = class extends import_BaseModule.BaseModule {
1469
1570
  };
1470
1571
  const syncState = this.store.order.getOrderSyncState();
1471
1572
  if (params.submitWhenPaid && syncState === "submitting") {
1573
+ this.queueLatestAutoPaymentSync();
1472
1574
  return this.store.order.syncPaymentsToOrder(syncParams);
1473
1575
  }
1474
1576
  const payments = params.payments || [];
@@ -1480,14 +1582,28 @@ var BaseSalesImpl = class extends import_BaseModule.BaseModule {
1480
1582
  });
1481
1583
  try {
1482
1584
  const syncResult = await this.store.order.syncPaymentsToOrder(syncParams);
1483
- await this.effectsEmit(import_types.BaseSalesHookNames.onPaymentSyncEnd, {
1585
+ const latestPayments = this.store.order.getOrderPayments();
1586
+ const amountSnapshot = this.store.order.getOrderAmountSnapshot();
1587
+ const orderSnapshot = this.store.order.getOrderSnapshot();
1588
+ const syncPayload = {
1484
1589
  ok: true,
1485
1590
  syncResult,
1486
- payments: this.store.order.getOrderPayments(),
1591
+ payments: latestPayments,
1487
1592
  params: syncParams,
1488
- amountSnapshot: this.store.order.getOrderAmountSnapshot(),
1489
- orderSnapshot: this.store.order.getOrderSnapshot()
1490
- });
1593
+ amountSnapshot,
1594
+ orderSnapshot,
1595
+ isFullyPaid: syncResult.isFullyPaid,
1596
+ isOrderFullyPaid: syncResult.isOrderFullyPaid,
1597
+ isDepositFullyPaid: syncResult.isDepositFullyPaid,
1598
+ paymentStage: syncResult.paymentStage,
1599
+ depositAmount: syncResult.depositAmount,
1600
+ orderExpectedAmount: syncResult.orderExpectedAmount
1601
+ };
1602
+ await this.effectsEmit(import_types.BaseSalesHookNames.onPaymentSyncEnd, syncPayload);
1603
+ if (syncResult.isDepositFullyPaid && !syncResult.isOrderFullyPaid) {
1604
+ await this.effectsEmit(import_types.BaseSalesHookNames.onDepositPaymentSyncEnd, syncPayload);
1605
+ }
1606
+ this.scheduleQueuedAutoPaymentSyncFlush(0);
1491
1607
  return syncResult;
1492
1608
  } catch (error) {
1493
1609
  await this.effectsEmit(import_types.BaseSalesHookNames.onPaymentSyncEnd, {
@@ -1498,6 +1614,7 @@ var BaseSalesImpl = class extends import_BaseModule.BaseModule {
1498
1614
  amountSnapshot: this.store.order.getOrderAmountSnapshot(),
1499
1615
  orderSnapshot: this.store.order.getOrderSnapshot()
1500
1616
  });
1617
+ this.scheduleQueuedAutoPaymentSyncFlush(0);
1501
1618
  throw error;
1502
1619
  }
1503
1620
  }
@@ -1514,6 +1631,61 @@ var BaseSalesImpl = class extends import_BaseModule.BaseModule {
1514
1631
  throw new Error("order 模块未初始化");
1515
1632
  return this.store.order.setOrderPayments(payments);
1516
1633
  }
1634
+ getPaymentStatusForSync(payments) {
1635
+ const order = this.store.order;
1636
+ if (!order)
1637
+ throw new Error("order 模块未初始化");
1638
+ const completion = order.getPaymentCompletion(payments);
1639
+ return completion.isOrderFullyPaid ? "paid" : "partially_paid";
1640
+ }
1641
+ queueLatestAutoPaymentSync() {
1642
+ this.queuedAutoPaymentSync = true;
1643
+ this.scheduleQueuedAutoPaymentSyncFlush();
1644
+ }
1645
+ scheduleQueuedAutoPaymentSyncFlush(delay = 100) {
1646
+ if (!this.queuedAutoPaymentSync)
1647
+ return;
1648
+ if (this.autoPaymentSyncTimer)
1649
+ return;
1650
+ this.autoPaymentSyncTimer = setTimeout(() => {
1651
+ this.autoPaymentSyncTimer = null;
1652
+ void this.flushQueuedAutoPaymentSync();
1653
+ }, delay);
1654
+ }
1655
+ async flushQueuedAutoPaymentSync() {
1656
+ if (!this.store.order)
1657
+ return;
1658
+ if (!this.queuedAutoPaymentSync || this.autoPaymentSyncFlushing)
1659
+ return;
1660
+ if (this.store.order.getOrderSyncState() === "submitting") {
1661
+ this.scheduleQueuedAutoPaymentSyncFlush();
1662
+ return;
1663
+ }
1664
+ this.autoPaymentSyncFlushing = true;
1665
+ try {
1666
+ while (this.queuedAutoPaymentSync) {
1667
+ this.queuedAutoPaymentSync = false;
1668
+ const payments = this.store.order.getOrderPayments();
1669
+ if (!payments.length)
1670
+ continue;
1671
+ await this.syncPaymentsToOrder({
1672
+ payments,
1673
+ paymentStatus: this.getPaymentStatusForSync(payments),
1674
+ submitWhenPaid: true,
1675
+ smallTicketDataFlag: 1
1676
+ });
1677
+ }
1678
+ } catch (error) {
1679
+ this.logError("queued auto sync payments failed", {
1680
+ error: error instanceof Error ? error.message : String(error)
1681
+ });
1682
+ } finally {
1683
+ this.autoPaymentSyncFlushing = false;
1684
+ if (this.queuedAutoPaymentSync) {
1685
+ this.scheduleQueuedAutoPaymentSyncFlush(0);
1686
+ }
1687
+ }
1688
+ }
1517
1689
  /** 追加单个支付项到当前订单。 */
1518
1690
  addOrderPayment(payment) {
1519
1691
  var _a;
@@ -1549,11 +1721,14 @@ var BaseSalesImpl = class extends import_BaseModule.BaseModule {
1549
1721
  });
1550
1722
  const amountSnapshot = this.store.order.getOrderAmountSnapshot();
1551
1723
  const syncState = this.store.order.getOrderSyncState();
1552
- if (amountSnapshot && syncState !== "submitting") {
1553
- const paymentStatus = Number(amountSnapshot.amountGap || 0) <= 0 ? "paid" : "partially_paid";
1724
+ if (amountSnapshot) {
1725
+ if (syncState === "submitting") {
1726
+ this.queueLatestAutoPaymentSync();
1727
+ return payments;
1728
+ }
1554
1729
  void this.syncPaymentsToOrder({
1555
1730
  payments,
1556
- paymentStatus,
1731
+ paymentStatus: this.getPaymentStatusForSync(payments),
1557
1732
  submitWhenPaid: true,
1558
1733
  smallTicketDataFlag: 1
1559
1734
  }).catch((error) => {
@@ -1561,7 +1736,6 @@ var BaseSalesImpl = class extends import_BaseModule.BaseModule {
1561
1736
  error: error instanceof Error ? error.message : String(error)
1562
1737
  });
1563
1738
  });
1564
- } else {
1565
1739
  }
1566
1740
  return payments;
1567
1741
  }
@@ -1578,21 +1752,33 @@ var BaseSalesImpl = class extends import_BaseModule.BaseModule {
1578
1752
  return this.store.order.deleteOrderPayment(paymentIdentity);
1579
1753
  }
1580
1754
  /** 覆盖 wallet pass 支付项,同时保留普通支付项。 */
1581
- updateVoucherOrderPayments(payments) {
1755
+ updateVoucherOrderPayments(payments, options) {
1582
1756
  if (!this.store.order)
1583
1757
  throw new Error("order 模块未初始化");
1584
- return this.store.order.updateVoucherOrderPayments(payments);
1758
+ return this.store.order.updateVoucherOrderPayments(payments, options);
1759
+ }
1760
+ confirmPendingVoucherPayments() {
1761
+ if (!this.store.order)
1762
+ throw new Error("order 模块未初始化");
1763
+ return this.store.order.confirmPendingVoucherPayments();
1764
+ }
1765
+ discardPendingVoucherPayments() {
1766
+ if (!this.store.order)
1767
+ throw new Error("order 模块未初始化");
1768
+ return this.store.order.discardPendingVoucherPayments();
1585
1769
  }
1586
1770
  getWalletProductList() {
1587
- var _a, _b, _c;
1771
+ var _a, _b;
1588
1772
  const tempOrder = (_a = this.store.order) == null ? void 0 : _a.getTempOrder();
1589
1773
  if (!((_b = tempOrder == null ? void 0 : tempOrder.products) == null ? void 0 : _b.length))
1590
1774
  return [];
1591
- const products = (_c = tempOrder == null ? void 0 : tempOrder.products) == null ? void 0 : _c.filter((n) => n.product_id);
1592
- const walletProducts = products.map((product) => {
1775
+ const walletProducts = tempOrder == null ? void 0 : tempOrder.products.map((product) => {
1593
1776
  const metadata = product.metadata || {};
1777
+ const rawHolderId = product.holder_id ?? metadata.holder_id;
1778
+ const holderIdValue = Array.isArray(rawHolderId) ? rawHolderId[0] : rawHolderId;
1779
+ const holder_id = Number.isInteger(Number(holderIdValue)) ? Number(holderIdValue) : void 0;
1594
1780
  return {
1595
- product_id: product.product_id,
1781
+ product_id: product.product_id || 0,
1596
1782
  product_variant_id: String(product.product_variant_id ?? ""),
1597
1783
  quantity: product.num || 1,
1598
1784
  is_price_include_tax: tempOrder.is_price_include_tax,
@@ -1600,7 +1786,7 @@ var BaseSalesImpl = class extends import_BaseModule.BaseModule {
1600
1786
  tax_fee: product.tax_fee,
1601
1787
  selling_price: Number(product.selling_price || 0),
1602
1788
  discount_list: product.discount_list || [],
1603
- holder_id: product.holder_id ?? metadata.holder_id,
1789
+ holder_id,
1604
1790
  original_price: product.original_price,
1605
1791
  main_product_original_price: metadata.main_product_original_price ?? product.original_price,
1606
1792
  main_product_selling_price: metadata.main_product_selling_price ?? product.selling_price,
@@ -14,6 +14,7 @@ export declare const BaseSalesHookNames: {
14
14
  readonly onCartValidationChanged: "onCartValidationChanged";
15
15
  readonly onPaymentSyncStart: "onPaymentSyncStart";
16
16
  readonly onPaymentSyncEnd: "onPaymentSyncEnd";
17
+ readonly onDepositPaymentSyncEnd: "onDepositPaymentSyncEnd";
17
18
  };
18
19
  export type BaseSalesHookName = typeof BaseSalesHookNames[keyof typeof BaseSalesHookNames];
19
20
  export declare function createBaseSalesHook(moduleName: string, hookName: BaseSalesHookName): string;
@@ -30,7 +30,8 @@ var BaseSalesHookNames = {
30
30
  onRefresh: "onRefresh",
31
31
  onCartValidationChanged: "onCartValidationChanged",
32
32
  onPaymentSyncStart: "onPaymentSyncStart",
33
- onPaymentSyncEnd: "onPaymentSyncEnd"
33
+ onPaymentSyncEnd: "onPaymentSyncEnd",
34
+ onDepositPaymentSyncEnd: "onDepositPaymentSyncEnd"
34
35
  };
35
36
  function createBaseSalesHook(moduleName, hookName) {
36
37
  return `${moduleName}:${hookName}`;
@@ -88,7 +88,8 @@ function normalizeBundleItems(bundleItems, preferPriceField = false) {
88
88
  price: bundleItem.price ?? unitStr,
89
89
  bundle_selling_price: unitStr,
90
90
  original_price: bundleItem.original_price ?? bundleItem.product_price ?? bundleItem.price ?? unitStr,
91
- option: normalizeOptionItems(bundleItem == null ? void 0 : bundleItem.option)
91
+ option: normalizeOptionItems(bundleItem == null ? void 0 : bundleItem.option),
92
+ discount_list: preferPriceField ? [] : bundleItem.discount_list
92
93
  };
93
94
  normalizedItem.bundle_selling_price = (0, import_utils.getBundleSellingMagnitude)(magnitudeSource).toFixed(2);
94
95
  if ((normalizedItem.price_type ?? normalizedItem.custom_price_type) === "markdown" && (normalizedItem.price_type_ext === "" || normalizedItem.price_type_ext === void 0 || normalizedItem.price_type_ext === null)) {
@@ -551,6 +551,14 @@ export declare class BookingTicketImpl extends BaseSalesImpl implements Module {
551
551
  setOtherParams(params: Record<string, any>, { cover }?: {
552
552
  cover?: boolean;
553
553
  }): Promise<void>;
554
+ private getDeviceTaskPlugin;
555
+ handlePrintWristband(params: {
556
+ voucher_ids: number[];
557
+ }): Promise<void>;
558
+ handleRedeem(params: {
559
+ voucher_ids: number[];
560
+ is_checkin: boolean;
561
+ }): Promise<any>;
554
562
  /**
555
563
  * 销毁模块:先调用父类(销毁所有 store 内子模块 + emit destroy + super.destroy()),
556
564
  * 再清理 BookingTicket 自有资源(scan 监听 + scan 内存缓存)。