@pisell/pisellos 2.2.274 → 2.2.276

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 (117) hide show
  1. package/dist/core/index.d.ts +2 -0
  2. package/dist/core/index.js +7 -0
  3. package/dist/model/strategy/adapter/promotion/adapter.d.ts +4 -0
  4. package/dist/model/strategy/adapter/promotion/adapter.js +23 -0
  5. package/dist/model/strategy/adapter/promotion/evaluator.d.ts +17 -0
  6. package/dist/model/strategy/adapter/promotion/evaluator.js +279 -6
  7. package/dist/model/strategy/adapter/promotion/examples.d.ts +86 -0
  8. package/dist/model/strategy/adapter/promotion/examples.js +99 -0
  9. package/dist/model/strategy/adapter/promotion/index.d.ts +1 -1
  10. package/dist/model/strategy/adapter/promotion/index.js +1 -1
  11. package/dist/model/strategy/adapter/promotion/type.d.ts +90 -2
  12. package/dist/model/strategy/adapter/promotion/type.js +45 -0
  13. package/dist/modules/OpenData/index.d.ts +2 -0
  14. package/dist/modules/OpenData/index.js +8 -0
  15. package/dist/modules/Order/index.d.ts +28 -8
  16. package/dist/modules/Order/index.js +907 -588
  17. package/dist/modules/Order/payment-utils.d.ts +26 -0
  18. package/dist/modules/Order/payment-utils.js +225 -0
  19. package/dist/modules/Order/types.d.ts +35 -1
  20. package/dist/modules/Order/utils/orderCollectionIdentity.js +7 -2
  21. package/dist/modules/Order/utils.js +10 -6
  22. package/dist/modules/Payment/index.d.ts +2 -0
  23. package/dist/modules/Payment/index.js +78 -49
  24. package/dist/modules/Payment/types.d.ts +104 -25
  25. package/dist/modules/Payment/types.js +17 -0
  26. package/dist/modules/Payment/walletpass.d.ts +38 -1
  27. package/dist/modules/Payment/walletpass.js +917 -114
  28. package/dist/modules/Rules/index.d.ts +3 -0
  29. package/dist/modules/Rules/index.js +100 -70
  30. package/dist/server/index.d.ts +25 -0
  31. package/dist/server/index.js +1993 -1061
  32. package/dist/server/modules/index.d.ts +1 -1
  33. package/dist/server/modules/order/index.d.ts +70 -4
  34. package/dist/server/modules/order/index.js +1816 -728
  35. package/dist/server/modules/order/types.d.ts +25 -3
  36. package/dist/server/modules/order/types.js +7 -1
  37. package/dist/solution/BaseSales/index.d.ts +104 -5
  38. package/dist/solution/BaseSales/index.js +1767 -436
  39. package/dist/solution/BaseSales/types.d.ts +55 -1
  40. package/dist/solution/BaseSales/types.js +2 -1
  41. package/dist/solution/BaseSales/utils/cartPromotion.d.ts +3 -1
  42. package/dist/solution/BaseSales/utils/cartPromotion.js +94 -32
  43. package/dist/solution/BaseSales/utils/parseSalesResponse.d.ts +6 -1
  44. package/dist/solution/BaseSales/utils/transformBaseProductToOrderProduct.js +7 -4
  45. package/dist/solution/BookingByStep/index.d.ts +1 -1
  46. package/dist/solution/BookingTicket/index.d.ts +21 -5
  47. package/dist/solution/BookingTicket/index.js +139 -56
  48. package/dist/solution/BookingTicket/types.d.ts +1 -0
  49. package/dist/solution/BookingTicket/utils/scan/applyGlobalScan.d.ts +8 -0
  50. package/dist/solution/BookingTicket/utils/scan/applyGlobalScan.js +173 -83
  51. package/dist/solution/Sales/index.d.ts +2 -0
  52. package/dist/solution/Sales/index.js +26 -4
  53. package/dist/solution/ScanOrder/index.js +31 -20
  54. package/dist/solution/VenueBooking/index.d.ts +1 -0
  55. package/dist/solution/VenueBooking/index.js +30 -19
  56. package/dist/types/index.d.ts +1 -0
  57. package/dist/utils/payment-number.d.ts +9 -0
  58. package/dist/utils/payment-number.js +69 -0
  59. package/lib/core/index.d.ts +2 -0
  60. package/lib/core/index.js +4 -0
  61. package/lib/model/strategy/adapter/promotion/adapter.d.ts +4 -0
  62. package/lib/model/strategy/adapter/promotion/adapter.js +20 -0
  63. package/lib/model/strategy/adapter/promotion/evaluator.d.ts +17 -0
  64. package/lib/model/strategy/adapter/promotion/evaluator.js +235 -0
  65. package/lib/model/strategy/adapter/promotion/examples.d.ts +86 -0
  66. package/lib/model/strategy/adapter/promotion/examples.js +91 -0
  67. package/lib/model/strategy/adapter/promotion/index.d.ts +1 -1
  68. package/lib/model/strategy/adapter/promotion/index.js +2 -0
  69. package/lib/model/strategy/adapter/promotion/type.d.ts +90 -2
  70. package/lib/model/strategy/adapter/promotion/type.js +2 -0
  71. package/lib/modules/OpenData/index.d.ts +2 -0
  72. package/lib/modules/OpenData/index.js +5 -0
  73. package/lib/modules/Order/index.d.ts +28 -8
  74. package/lib/modules/Order/index.js +252 -84
  75. package/lib/modules/Order/payment-utils.d.ts +26 -0
  76. package/lib/modules/Order/payment-utils.js +224 -0
  77. package/lib/modules/Order/types.d.ts +35 -1
  78. package/lib/modules/Order/utils/orderCollectionIdentity.js +3 -0
  79. package/lib/modules/Order/utils.js +11 -4
  80. package/lib/modules/Payment/index.d.ts +2 -0
  81. package/lib/modules/Payment/index.js +33 -12
  82. package/lib/modules/Payment/types.d.ts +104 -25
  83. package/lib/modules/Payment/types.js +1 -0
  84. package/lib/modules/Payment/walletpass.d.ts +38 -1
  85. package/lib/modules/Payment/walletpass.js +730 -21
  86. package/lib/modules/Rules/index.d.ts +3 -0
  87. package/lib/modules/Rules/index.js +38 -9
  88. package/lib/server/index.d.ts +25 -0
  89. package/lib/server/index.js +726 -31
  90. package/lib/server/modules/index.d.ts +1 -1
  91. package/lib/server/modules/order/index.d.ts +70 -4
  92. package/lib/server/modules/order/index.js +818 -69
  93. package/lib/server/modules/order/types.d.ts +25 -3
  94. package/lib/server/modules/order/types.js +1 -0
  95. package/lib/solution/BaseSales/index.d.ts +104 -5
  96. package/lib/solution/BaseSales/index.js +858 -27
  97. package/lib/solution/BaseSales/types.d.ts +55 -1
  98. package/lib/solution/BaseSales/types.js +2 -1
  99. package/lib/solution/BaseSales/utils/cartPromotion.d.ts +3 -1
  100. package/lib/solution/BaseSales/utils/cartPromotion.js +66 -12
  101. package/lib/solution/BaseSales/utils/parseSalesResponse.d.ts +6 -1
  102. package/lib/solution/BaseSales/utils/transformBaseProductToOrderProduct.js +4 -3
  103. package/lib/solution/BookingByStep/index.d.ts +1 -1
  104. package/lib/solution/BookingTicket/index.d.ts +21 -5
  105. package/lib/solution/BookingTicket/index.js +64 -13
  106. package/lib/solution/BookingTicket/types.d.ts +1 -0
  107. package/lib/solution/BookingTicket/utils/scan/applyGlobalScan.d.ts +8 -0
  108. package/lib/solution/BookingTicket/utils/scan/applyGlobalScan.js +37 -5
  109. package/lib/solution/Sales/index.d.ts +2 -0
  110. package/lib/solution/Sales/index.js +20 -6
  111. package/lib/solution/ScanOrder/index.js +8 -0
  112. package/lib/solution/VenueBooking/index.d.ts +1 -0
  113. package/lib/solution/VenueBooking/index.js +8 -0
  114. package/lib/types/index.d.ts +1 -0
  115. package/lib/utils/payment-number.d.ts +9 -0
  116. package/lib/utils/payment-number.js +64 -0
  117. package/package.json +1 -1
@@ -27,6 +27,8 @@ export declare class RulesModule extends BaseModule implements Module, RulesModu
27
27
  }): {
28
28
  isAvailable: boolean;
29
29
  discountList: Discount[];
30
+ /** 完整规则计算后的列表;调用方可用于保留暂时无适用商品的扫码卡券。 */
31
+ evaluatedDiscountList?: Discount[];
30
32
  productList: any[];
31
33
  unavailableReason?: UnavailableReason;
32
34
  };
@@ -35,6 +37,7 @@ export declare class RulesModule extends BaseModule implements Module, RulesModu
35
37
  excludeDiscountListByType(discountList: Discount[], type: string): Discount[];
36
38
  /** 手动改价场景:去掉 promotion,保留 type=product 等行内折扣 */
37
39
  resolveDiscountListForManualOverride(discountList: Discount[]): Discount[];
40
+ private isItemRewardProductDiscount;
38
41
  private getUnavailableReason;
39
42
  calcDiscount({ discountList, productList, holders, isFormSubject, orderTotalAmount }: {
40
43
  discountList: Discount[];
@@ -94,7 +94,7 @@ var RulesModule = class extends import_BaseModule.BaseModule {
94
94
  productList
95
95
  };
96
96
  }
97
- if (productList.every((item) => {
97
+ if (productList.length > 0 && productList.every((item) => {
98
98
  var _a;
99
99
  const product = this.hooks.getProduct(item);
100
100
  return product.booking_id && (((_a = product.discount_list) == null ? void 0 : _a.length) || product.total == 0);
@@ -152,6 +152,7 @@ var RulesModule = class extends import_BaseModule.BaseModule {
152
152
  return {
153
153
  isAvailable: hasApplicableDiscount,
154
154
  discountList: hasApplicableDiscount ? result.discountList : oldDiscountList,
155
+ evaluatedDiscountList: result.discountList,
155
156
  productList: hasApplicableDiscount ? result.productList : productList,
156
157
  unavailableReason
157
158
  };
@@ -167,13 +168,27 @@ var RulesModule = class extends import_BaseModule.BaseModule {
167
168
  resolveDiscountListForManualOverride(discountList) {
168
169
  return this.excludeDiscountListByType(discountList, "promotion");
169
170
  }
171
+ isItemRewardProductDiscount(product) {
172
+ var _a;
173
+ const discountList = Array.isArray(product == null ? void 0 : product.discount_list) ? product.discount_list : [];
174
+ return ((_a = product == null ? void 0 : product._promotion) == null ? void 0 : _a.actionType) === "ITEM_REWARD" && discountList.some(
175
+ (item) => {
176
+ var _a2, _b;
177
+ return (item == null ? void 0 : item.type) === "product" && ((_a2 = item == null ? void 0 : item.metadata) == null ? void 0 : _a2.source) === "promotion" && ((_b = item == null ? void 0 : item.metadata) == null ? void 0 : _b.actionType) === "ITEM_REWARD";
178
+ }
179
+ );
180
+ }
170
181
  // 获取券不可用的原因
171
182
  getUnavailableReason(discountList, productList) {
172
183
  var _a;
173
184
  for (const discount of discountList) {
174
- for (const item of productList) {
185
+ const bookingTimes = productList.length ? productList.map((item) => {
175
186
  const product = this.hooks.getProduct(item);
176
- const bookingTime = ((product == null ? void 0 : product.startDate) || (0, import_dayjs.default)()).format("YYYY-MM-DD HH:mm:ss");
187
+ return ((product == null ? void 0 : product.startDate) || (0, import_dayjs.default)()).format(
188
+ "YYYY-MM-DD HH:mm:ss"
189
+ );
190
+ }) : [(0, import_dayjs.default)().format("YYYY-MM-DD HH:mm:ss")];
191
+ for (const bookingTime of bookingTimes) {
177
192
  const filteredList = (0, import_utils.filterDiscountListByBookingTime)([discount], bookingTime);
178
193
  if (filteredList.length === 0) {
179
194
  return import_types.UnavailableReason.TimeLimit;
@@ -305,7 +320,7 @@ var RulesModule = class extends import_BaseModule.BaseModule {
305
320
  // 新增商品运行态通常带 _bundle_product_id;订单 hydrate 后只有
306
321
  // bundle_product_id。Change time 必须兼容两种结构,否则 bundle
307
322
  // 子项无法命中折扣卡的 limited_relation_product_data.product_ids。
308
- id: bundleItem._bundle_product_id ?? bundleItem.bundle_product_id ?? bundleItem.product_id,
323
+ id: bundleItem.bundle_product_id ?? bundleItem._bundle_product_id ?? bundleItem.product_id,
309
324
  _id: `${product._id}_bundle_${bundleIndex}`,
310
325
  parentId: product._id,
311
326
  num: bundleItem.num || 1,
@@ -502,6 +517,9 @@ var RulesModule = class extends import_BaseModule.BaseModule {
502
517
  startDate: (_a2 = flatItem.parentProduct) == null ? void 0 : _a2.startDate
503
518
  };
504
519
  }
520
+ if (this.isItemRewardProductDiscount(product)) {
521
+ return false;
522
+ }
505
523
  const isAvailableProduct = flatItem.type === "main" ? !((product == null ? void 0 : product.booking_id) && ((_b = product == null ? void 0 : product.discount_list) == null ? void 0 : _b.length) && ((_c = product == null ? void 0 : product.discount_list) == null ? void 0 : _c.every((d) => d.id && ["good_pass", "discount_card", "product_discount_card"].includes(d.tag || d.type)))) : !((flatItem == null ? void 0 : flatItem.booking_id) && !!((_e = (_d = flatItem == null ? void 0 : flatItem.bundleItem) == null ? void 0 : _d.discount_list) == null ? void 0 : _e.length) && ((_g = (_f = flatItem == null ? void 0 : flatItem.bundleItem) == null ? void 0 : _f.discount_list) == null ? void 0 : _g.every((d) => d.id)));
506
524
  if (!isAvailableProduct) {
507
525
  return false;
@@ -627,6 +645,7 @@ var RulesModule = class extends import_BaseModule.BaseModule {
627
645
  };
628
646
  originProduct = flatItem.originProduct;
629
647
  }
648
+ const isItemRewardProductDiscount = this.isItemRewardProductDiscount(product);
630
649
  addModeDiscount.forEach((discount) => {
631
650
  var _a3, _b, _c, _d, _e, _f, _g, _h, _i, _j;
632
651
  const limitedData = discount == null ? void 0 : discount.limited_relation_product_data;
@@ -650,7 +669,7 @@ var RulesModule = class extends import_BaseModule.BaseModule {
650
669
  ].includes(discount2.tag || discount2.type)
651
670
  ))) : !((flatItem == null ? void 0 : flatItem.booking_id) && !!((_d = (_c = flatItem == null ? void 0 : flatItem.bundleItem) == null ? void 0 : _c.discount_list) == null ? void 0 : _d.length) && ((_f = (_e = flatItem == null ? void 0 : flatItem.bundleItem) == null ? void 0 : _e.discount_list) == null ? void 0 : _f.every((discount2) => discount2.id)));
652
671
  const isBundleAvailable = this.checkPackageSubItemUsageRules(discount, flatItem);
653
- if (isAvailableProduct && isLimitedProduct && timeLimit && isBundleAvailable && ((_g = discount.config) == null ? void 0 : _g.isAvailable)) {
672
+ if (isAvailableProduct && !isItemRewardProductDiscount && isLimitedProduct && timeLimit && isBundleAvailable && ((_g = discount.config) == null ? void 0 : _g.isAvailable)) {
654
673
  (_h = discountApplicability.get(discount.id)) == null ? void 0 : _h.push(product.id);
655
674
  const applicableProducts = discountApplicableProducts.get(discount.id) || [];
656
675
  const discountType = discount.tag || discount.type;
@@ -766,6 +785,8 @@ var RulesModule = class extends import_BaseModule.BaseModule {
766
785
  }
767
786
  const applicableDiscounts = sortedDiscountList.filter((discount) => {
768
787
  var _a3, _b2, _c2, _d2;
788
+ if (this.isItemRewardProductDiscount(product))
789
+ return false;
769
790
  const discountType = discount.tag || discount.type;
770
791
  const currentOriginUid = getOriginProductUid(originProduct);
771
792
  const isReapplyEditModeDiscountForProduct = discount.isEditMode && reapplyBookingDiscountProductUids.size > 0 && currentOriginUid && reapplyBookingDiscountProductUids.has(String(currentOriginUid)) && discount.isSelected === true;
@@ -835,11 +856,17 @@ var RulesModule = class extends import_BaseModule.BaseModule {
835
856
  }
836
857
  return false;
837
858
  });
838
- const selectedDiscountCard = applicableDiscounts.find(
859
+ const explicitlySelectedDiscountCard = (options == null ? void 0 : options.isSelected) === true && options.discountId !== void 0 ? applicableDiscounts.find((discount) => {
860
+ const discountType = discount.tag || discount.type;
861
+ return String(discount.id) === String(options.discountId) && ["discount_card", "product_discount_card"].includes(discountType);
862
+ }) : void 0;
863
+ const scannedSelectedDiscountCard = applicableDiscounts.find(
839
864
  (n) => n.isScan && n.isSelected && (n.tag || n.type) !== "good_pass"
840
865
  );
866
+ const selectedDiscountCard = explicitlySelectedDiscountCard || scannedSelectedDiscountCard;
841
867
  const selectedDiscount = selectedDiscountCard || applicableDiscounts[0];
842
868
  let isManualDiscount = false;
869
+ let isItemRewardProductDiscount = false;
843
870
  if (flatItem.type === "main") {
844
871
  isManualDiscount = typeof product.isManualDiscount === "boolean" ? product.isManualDiscount : ((_g = product.discount_list) == null ? void 0 : _g.some((item) => item.type === "product")) || product.total != product.origin_total && (product.bundle || []).every(
845
872
  (item) => {
@@ -850,7 +877,8 @@ var RulesModule = class extends import_BaseModule.BaseModule {
850
877
  _i,
851
878
  (item) => item.type === "product"
852
879
  )));
853
- if (product.inPromotion) {
880
+ isItemRewardProductDiscount = this.isItemRewardProductDiscount(product);
881
+ if (product.inPromotion && !isItemRewardProductDiscount) {
854
882
  isManualDiscount = false;
855
883
  }
856
884
  } else {
@@ -964,7 +992,7 @@ var RulesModule = class extends import_BaseModule.BaseModule {
964
992
  } else {
965
993
  let total = product.inPromotion ? ((_w = product == null ? void 0 : product._promotion) == null ? void 0 : _w.finalPrice) ?? product.origin_total ?? product.total : product.origin_total ?? product.total;
966
994
  let main_product_selling_price = product.price;
967
- if ((product.discount_list || []).some((item) => item.type === "promotion") || (0, import_lodash_es.isBoolean)(product.vouchersApplicable) && !product.vouchersApplicable) {
995
+ if ((product.discount_list || []).some((item) => item.type === "promotion") || isItemRewardProductDiscount || (0, import_lodash_es.isBoolean)(product.vouchersApplicable) && !product.vouchersApplicable) {
968
996
  total = product.total ?? product.origin_total;
969
997
  main_product_selling_price = product.main_product_selling_price ?? main_product_selling_price;
970
998
  }
@@ -972,7 +1000,8 @@ var RulesModule = class extends import_BaseModule.BaseModule {
972
1000
  this.hooks.setProduct(originProduct, {
973
1001
  ...isManualDiscount ? {
974
1002
  price: product.price,
975
- main_product_selling_price: product.price
1003
+ main_product_selling_price: isItemRewardProductDiscount ? main_product_selling_price : product.price,
1004
+ ...isItemRewardProductDiscount ? { total } : {}
976
1005
  } : {
977
1006
  _id: product._id.split("___")[0] + "___" + index,
978
1007
  total,
@@ -57,6 +57,7 @@ declare class Server {
57
57
  private readonly BOOKING_REMOTE_CACHE_MAX_ENTRIES;
58
58
  private salesSearchSubscribers;
59
59
  private deviceTaskActionsRegistered;
60
+ private localPaymentUpdateQueues;
60
61
  private floorPlanQuerySubscribers;
61
62
  private moduleRegistry;
62
63
  constructor(core: PisellCore);
@@ -120,6 +121,8 @@ declare class Server {
120
121
  private handleSyncSalesTask;
121
122
  private runCheckoutSync;
122
123
  private omitCheckoutSyncMode;
124
+ private buildRemoteCheckoutData;
125
+ private mergeCheckoutSyncPayments;
123
126
  private persistSyncedCheckoutOrder;
124
127
  /**
125
128
  * 将普通层 QuotationModule 的报价单计算能力桥接到 Server Products 模块。
@@ -250,6 +253,11 @@ declare class Server {
250
253
  * 对单个商品 query 订阅者重算并推送(定时路径;不新建 schedule timer)。
251
254
  */
252
255
  private recomputeAndNotifySubscriber;
256
+ /**
257
+ * 根据餐牌 ID 获取其绑定日程中的全部时间点。
258
+ * 商品查询定时器与 schedule-time-points 路由共用此逻辑。
259
+ */
260
+ private getMenuScheduleTimePoints;
253
261
  /**
254
262
  * query 完成后为 subscriber 同步 schedule 定时器(先 clear 再 schedule)。
255
263
  */
@@ -453,6 +461,18 @@ declare class Server {
453
461
  */
454
462
  private handleUpdateLocalOrder;
455
463
  private handleOrderSalesCheckout;
464
+ private handleOrderSalesDraft;
465
+ private createLocalPaymentOperationId;
466
+ private buildLocalPaymentOrderLogContext;
467
+ private isValidLocalPaymentDecimal;
468
+ private getInvalidLocalPaymentSurchargeFields;
469
+ private buildLocalPaymentSurchargeUpdate;
470
+ private handleGetLocalPayment;
471
+ private handleUpdateLocalPayment;
472
+ private runLocalPaymentUpdateInQueue;
473
+ private processLocalPaymentUpdate;
474
+ private processSuccessfulLocalPayment;
475
+ private sanitizeLocalRecoveryOrder;
456
476
  private handleOrderCheckout;
457
477
  private getDeviceTaskPlugin;
458
478
  private getIdGeneratorPlugin;
@@ -480,8 +500,13 @@ declare class Server {
480
500
  private syncMachinecodeRedeemStatusToLocalOrder;
481
501
  private handleOrderCheckoutSubmit;
482
502
  private handleSyncCheckoutSubmit;
503
+ private handleOrderDraftSubmit;
483
504
  private handlePendingSyncCheckoutOrder;
484
505
  private buildPendingSyncCheckoutOrder;
506
+ /**
507
+ * Android 结账自动小票由当前设备设置控制;其它平台保持原有行为。
508
+ */
509
+ private shouldAutoPrintCheckoutReceipt;
485
510
  private shouldBuildSmallTicketData;
486
511
  private shouldPrintSyncedOrder;
487
512
  private hasPaymentStatus;