@pisell/pisellos 2.2.164 → 2.2.166

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 (36) hide show
  1. package/dist/modules/BookingContext/utils/buildNormalProductCacheItemFromOrderLine.js +45 -15
  2. package/dist/modules/Order/index.d.ts +10 -3
  3. package/dist/modules/Order/index.js +275 -142
  4. package/dist/modules/Order/types.d.ts +9 -2
  5. package/dist/modules/Order/types.js +2 -0
  6. package/dist/modules/Order/utils.d.ts +13 -0
  7. package/dist/modules/Order/utils.js +69 -15
  8. package/dist/server/index.js +1 -0
  9. package/dist/solution/BaseSales/index.d.ts +9 -1
  10. package/dist/solution/BaseSales/index.js +378 -241
  11. package/dist/solution/BaseSales/types.d.ts +3 -0
  12. package/dist/solution/BaseSales/utils/transformBaseProductToOrderProduct.js +33 -14
  13. package/dist/solution/BaseSales/utils.js +36 -7
  14. package/dist/solution/BookingTicket/index.d.ts +3 -0
  15. package/dist/solution/BookingTicket/index.js +170 -86
  16. package/dist/solution/BookingTicket/utils/addProductDecision.d.ts +4 -2
  17. package/dist/solution/BookingTicket/utils/addProductDecision.js +37 -19
  18. package/dist/solution/ScanOrder/utils.js +36 -7
  19. package/lib/modules/BookingContext/utils/buildNormalProductCacheItemFromOrderLine.js +35 -9
  20. package/lib/modules/Order/index.d.ts +10 -3
  21. package/lib/modules/Order/index.js +107 -4
  22. package/lib/modules/Order/types.d.ts +9 -2
  23. package/lib/modules/Order/utils.d.ts +13 -0
  24. package/lib/modules/Order/utils.js +57 -9
  25. package/lib/server/index.js +1 -0
  26. package/lib/solution/BaseSales/index.d.ts +9 -1
  27. package/lib/solution/BaseSales/index.js +71 -3
  28. package/lib/solution/BaseSales/types.d.ts +3 -0
  29. package/lib/solution/BaseSales/utils/transformBaseProductToOrderProduct.js +31 -10
  30. package/lib/solution/BaseSales/utils.js +37 -5
  31. package/lib/solution/BookingTicket/index.d.ts +3 -0
  32. package/lib/solution/BookingTicket/index.js +57 -6
  33. package/lib/solution/BookingTicket/utils/addProductDecision.d.ts +4 -2
  34. package/lib/solution/BookingTicket/utils/addProductDecision.js +28 -12
  35. package/lib/solution/ScanOrder/utils.js +37 -5
  36. package/package.json +1 -1
@@ -107,7 +107,7 @@ export interface OrderTempOrder {
107
107
  shop_order_number: string | null;
108
108
  shop_full_order_number: string | null;
109
109
  type: string;
110
- business_code: string;
110
+ business_code?: string;
111
111
  platform: string;
112
112
  sales_channel: string;
113
113
  order_sales_channel: string;
@@ -193,6 +193,11 @@ export interface UpdateOrderProductParams {
193
193
  product_bundle?: any[];
194
194
  booking?: AddProductBookingInput;
195
195
  }
196
+ /** 仅更新购物车行数量;行定位语义与 updateOrderProduct / removeProductFromOrder 保持一致 */
197
+ export interface UpdateOrderProductQuantityParams extends OrderProductIdentity {
198
+ num: number;
199
+ identity_key?: string;
200
+ }
196
201
  export interface UpdateOrderBookingParams {
197
202
  unique_identification_number: string;
198
203
  updates: AddProductBookingInput;
@@ -251,7 +256,7 @@ export interface SubmitSalesOrderParams {
251
256
  shop_order_number: string | null;
252
257
  shop_full_order_number: string | null;
253
258
  type: string;
254
- business_code: string;
259
+ business_code?: string;
255
260
  platform: string;
256
261
  request_unique_idempotency_token?: string;
257
262
  sales_channel: string;
@@ -362,6 +367,7 @@ export interface SyncPaymentsToOrderParams {
362
367
  paymentStatus?: SubmitSalesOrderParams['query']['payment_status'];
363
368
  submitWhenPaid?: boolean;
364
369
  smallTicketDataFlag?: number;
370
+ channel?: string;
365
371
  }
366
372
  export interface SyncPaymentsToOrderResult<T = any> {
367
373
  isFullyPaid: boolean;
@@ -482,6 +488,7 @@ export interface OrderModuleAPI {
482
488
  updateTempOrderContactsInfo: (contactsInfo: Record<string, any> | null) => Record<string, any> | null;
483
489
  addProductToOrder: (product: Partial<OrderProduct> & OrderProductIdentity, booking?: AddProductBookingInput) => Promise<OrderProduct[]>;
484
490
  updateOrderProduct: (params: UpdateOrderProductParams) => Promise<OrderProduct[]>;
491
+ updateOrderProductQuantity: (params: UpdateOrderProductQuantityParams) => Promise<OrderProduct[]>;
485
492
  updateOrderBooking: (params: UpdateOrderBookingParams) => any[];
486
493
  removeProductFromOrder: (identity: OrderProductIdentity) => Promise<OrderProduct[]>;
487
494
  persistTempOrder: () => void;
@@ -29,6 +29,8 @@ export var OrderHooks = /*#__PURE__*/function (OrderHooks) {
29
29
 
30
30
  /** 更新购物车行:仅传 SKU 时命中同 SKU 第一行;多行同 SKU 须传 unique_identification_number / 选项指纹等 */
31
31
 
32
+ /** 仅更新购物车行数量;行定位语义与 updateOrderProduct / removeProductFromOrder 保持一致 */
33
+
32
34
  /**
33
35
  * 订单信息
34
36
  */
@@ -65,6 +65,19 @@ export declare function sumOptionUnitPrice(options?: Array<{
65
65
  *
66
66
  * 导出为纯函数方便单测直接驱动钩子,不依赖 OrderModule 实例。
67
67
  */
68
+ /** Rules calcDiscount 用手动价标记;undefined 表示交给 Rules 用 total/origin_total 推断 */
69
+ export declare function resolveRulesManualDiscountFlag(metadata: Record<string, any> | null | undefined): boolean | undefined;
70
+ /**
71
+ * 手动改价(price_override)时行级 original_price(composite 单价):
72
+ * 购物车划线价应对齐 metadata.origin._extend.origin_total(改价前单价 composite,如 40),
73
+ * 而非 bundle 子项 catalog 原价合成的 composedOriginalPrice(如 30)。
74
+ *
75
+ * origin_total 与 SkuDetailModal / cacheItem._extend 一致,为单价语义,不再除以 num。
76
+ */
77
+ export declare function resolveManualOverrideLineOriginalPrice(params: {
78
+ num?: number;
79
+ metadata?: Record<string, any> | null;
80
+ }, fallbackCompositeOriginal: string): string;
68
81
  export declare function createDefaultOrderRulesHooks(): RulesParamsHooks;
69
82
  /**
70
83
  * 通过 session 类商品的开始时间结束时间生成商品的时长
@@ -113,6 +113,44 @@ export function sumOptionUnitPrice(options) {
113
113
  *
114
114
  * 导出为纯函数方便单测直接驱动钩子,不依赖 OrderModule 实例。
115
115
  */
116
+
117
+ /** Rules calcDiscount 用手动价标记;undefined 表示交给 Rules 用 total/origin_total 推断 */
118
+ export function resolveRulesManualDiscountFlag(metadata) {
119
+ if (!metadata) return undefined;
120
+ if (metadata.is_manual_discount === true || metadata.is_manual_discount === 1) {
121
+ return true;
122
+ }
123
+ var priceOverride = metadata.price_override;
124
+ if (priceOverride !== undefined && priceOverride !== null && priceOverride !== '') {
125
+ return true;
126
+ }
127
+ return undefined;
128
+ }
129
+
130
+ /**
131
+ * 手动改价(price_override)时行级 original_price(composite 单价):
132
+ * 购物车划线价应对齐 metadata.origin._extend.origin_total(改价前单价 composite,如 40),
133
+ * 而非 bundle 子项 catalog 原价合成的 composedOriginalPrice(如 30)。
134
+ *
135
+ * origin_total 与 SkuDetailModal / cacheItem._extend 一致,为单价语义,不再除以 num。
136
+ */
137
+ export function resolveManualOverrideLineOriginalPrice(params, fallbackCompositeOriginal) {
138
+ var _metadata$origin;
139
+ var metadata = params.metadata || {};
140
+ var priceOverride = metadata.price_override;
141
+ if (priceOverride === undefined || priceOverride === null || priceOverride === '') {
142
+ return fallbackCompositeOriginal;
143
+ }
144
+ var refTotal = (_metadata$origin = metadata.origin) === null || _metadata$origin === void 0 || (_metadata$origin = _metadata$origin._extend) === null || _metadata$origin === void 0 ? void 0 : _metadata$origin.origin_total;
145
+ if (refTotal === undefined || refTotal === null || refTotal === '') {
146
+ return fallbackCompositeOriginal;
147
+ }
148
+ var parsed = Number(refTotal);
149
+ if (!Number.isFinite(parsed)) {
150
+ return fallbackCompositeOriginal;
151
+ }
152
+ return new Decimal(parsed).toDecimalPlaces(2).toFixed(2);
153
+ }
116
154
  export function createDefaultOrderRulesHooks() {
117
155
  var toUnitPriceString = function toUnitPriceString(totalLike, num) {
118
156
  var effectiveNum = Number(num) > 0 ? Number(num) : 1;
@@ -120,7 +158,7 @@ export function createDefaultOrderRulesHooks() {
120
158
  };
121
159
  return {
122
160
  getProduct: function getProduct(product) {
123
- var _product$metadata, _product$metadata2, _product$metadata3, _product$metadata4, _product$metadata5, _product$metadata6;
161
+ var _product$metadata, _product$metadata2, _product$metadata3, _product$metadata4, _product$metadata5;
124
162
  // source_product_price 是权威源;兜底链:source → mainSelling − options(反推)→ 行 selling_price
125
163
  var metadataAny = product.metadata || {};
126
164
  var optionSum = sumOptionUnitPrice(product.product_option_item);
@@ -161,9 +199,11 @@ export function createDefaultOrderRulesHooks() {
161
199
  bundle: product.product_bundle || [],
162
200
  booking_id: ((_product$metadata2 = product.metadata) === null || _product$metadata2 === void 0 ? void 0 : _product$metadata2.booking_id) || null,
163
201
  isClient: false,
164
- isManualDiscount: ((_product$metadata3 = product.metadata) === null || _product$metadata3 === void 0 ? void 0 : _product$metadata3.is_manual_discount) || false,
165
- holder_id: (_product$metadata4 = product.metadata) === null || _product$metadata4 === void 0 ? void 0 : _product$metadata4.holder_id,
166
- startDate: ((_product$metadata5 = product.metadata) === null || _product$metadata5 === void 0 ? void 0 : _product$metadata5.start_date) || ((_product$metadata6 = product.metadata) === null || _product$metadata6 === void 0 ? void 0 : _product$metadata6.startDate)
202
+ // 勿写死 false:否则 Rules 不会走 total≠origin_total 的手动价推断,
203
+ // 无券时会把 bundle 价还原成 original_price(手动改价套餐会从 20 回到 30)。
204
+ isManualDiscount: resolveRulesManualDiscountFlag(metadataAny),
205
+ holder_id: (_product$metadata3 = product.metadata) === null || _product$metadata3 === void 0 ? void 0 : _product$metadata3.holder_id,
206
+ startDate: ((_product$metadata4 = product.metadata) === null || _product$metadata4 === void 0 ? void 0 : _product$metadata4.start_date) || ((_product$metadata5 = product.metadata) === null || _product$metadata5 === void 0 ? void 0 : _product$metadata5.startDate)
167
207
  };
168
208
  },
169
209
  setProduct: function setProduct(product, values) {
@@ -196,9 +236,13 @@ export function createDefaultOrderRulesHooks() {
196
236
  bundle: nextBundle,
197
237
  useOriginalBundle: true
198
238
  });
239
+ var finalOriginalPrice = resolveManualOverrideLineOriginalPrice({
240
+ num: nextNum,
241
+ metadata: metadataAny
242
+ }, composedOriginalPrice);
199
243
  return _objectSpread(_objectSpread({}, product), {}, {
200
244
  selling_price: composedSellingPrice,
201
- original_price: composedOriginalPrice,
245
+ original_price: finalOriginalPrice,
202
246
  discount_list: (_values$discount_list = values.discount_list) !== null && _values$discount_list !== void 0 ? _values$discount_list : product.discount_list,
203
247
  num: (_values$quantity2 = values.quantity) !== null && _values$quantity2 !== void 0 ? _values$quantity2 : product.num,
204
248
  product_bundle: nextBundle,
@@ -505,8 +549,8 @@ export function createDefaultTempOrder(params) {
505
549
  order_number: null,
506
550
  shop_order_number: null,
507
551
  shop_full_order_number: null,
508
- type: 'appointment_booking',
509
- business_code: 'appointment_booking',
552
+ type: '',
553
+ business_code: undefined,
510
554
  platform: 'h5',
511
555
  sales_channel: 'my_pisel',
512
556
  order_sales_channel: 'online_store',
@@ -548,7 +592,7 @@ export function createDefaultTempOrder(params) {
548
592
  };
549
593
  }
550
594
  export function buildSubmitPayload(params) {
551
- var _ref10, _ref11, _ref12, _tempOrder$is_price_i, _tempOrder$is_deposit;
595
+ var _ref10, _tempOrder$is_price_i, _tempOrder$is_deposit;
552
596
  var tempOrder = params.tempOrder,
553
597
  cacheId = params.cacheId,
554
598
  _params$now = params.now,
@@ -579,16 +623,26 @@ export function buildSubmitPayload(params) {
579
623
  _createDate = _ref9.create_date,
580
624
  _holderId = _ref9.holder_id,
581
625
  tempOrderRest = _objectWithoutProperties(_ref9, _excluded3);
626
+ var submitType = type !== null && type !== void 0 ? type : tempOrder.type;
627
+ if (!submitType) {
628
+ var _tempOrder$bookings;
629
+ // 如果外部没有传递 types,根据订单里当前是否有 bookings 来决定是 appointment_booking 还是 virtual
630
+ if (tempOrder !== null && tempOrder !== void 0 && (_tempOrder$bookings = tempOrder.bookings) !== null && _tempOrder$bookings !== void 0 && _tempOrder$bookings.length) {
631
+ submitType = 'appointment_booking';
632
+ } else {
633
+ submitType = 'virtual';
634
+ }
635
+ }
582
636
  var payload = _objectSpread(_objectSpread({}, tempOrderRest), {}, {
583
637
  order_number: null,
584
638
  shop_order_number: null,
585
639
  shop_full_order_number: null,
586
640
  platform: normalizeSubmitPlatform(platform),
587
641
  request_unique_idempotency_token: tempOrder.request_unique_idempotency_token || "".concat(tempOrder.external_sale_number, "_").concat(now.getTime()),
588
- type: (_ref10 = type !== null && type !== void 0 ? type : tempOrder.type) !== null && _ref10 !== void 0 ? _ref10 : 'table-order',
589
- business_code: (_ref11 = businessCode !== null && businessCode !== void 0 ? businessCode : tempOrder.business_code) !== null && _ref11 !== void 0 ? _ref11 : 'table-order',
642
+ type: submitType,
643
+ business_code: businessCode !== null && businessCode !== void 0 ? businessCode : tempOrder.business_code,
590
644
  sales_channel: tempOrder.sales_channel || 'my_pisel',
591
- order_sales_channel: (_ref12 = channel !== null && channel !== void 0 ? channel : tempOrder.order_sales_channel) !== null && _ref12 !== void 0 ? _ref12 : 'online_store',
645
+ order_sales_channel: (_ref10 = channel !== null && channel !== void 0 ? channel : tempOrder.order_sales_channel) !== null && _ref10 !== void 0 ? _ref10 : 'online_store',
592
646
  status: tempOrder.status || 'normal',
593
647
  payment_status: tempOrder.payment_status || 'payment_processing',
594
648
  // shipping_status: tempOrder.shipping_status || 'unfulfilled',
@@ -615,10 +669,10 @@ export function buildSubmitPayload(params) {
615
669
  // holder: tempOrder.holder || null,
616
670
  // summary,
617
671
  metadata: function () {
618
- var _ref13 = tempOrder.metadata || {},
619
- _collectPax = _ref13.collect_pax,
620
- _tableOccupancyDuration = _ref13.table_occupancy_duration,
621
- rest = _objectWithoutProperties(_ref13, _excluded4);
672
+ var _ref11 = tempOrder.metadata || {},
673
+ _collectPax = _ref11.collect_pax,
674
+ _tableOccupancyDuration = _ref11.table_occupancy_duration,
675
+ rest = _objectWithoutProperties(_ref11, _excluded4);
622
676
  return _objectSpread({}, rest);
623
677
  }(),
624
678
  products: (tempOrder.products || []).map(function (product) {
@@ -2995,6 +2995,7 @@ var Server = /*#__PURE__*/function () {
2995
2995
  if (field === undefined || field === null || field === '') return;
2996
2996
  searchParams.append('with[]', String(field));
2997
2997
  });
2998
+ searchParams.append('lookup_mode', 'multi');
2998
2999
  var query = searchParams.toString();
2999
3000
  return "/shop/order/sales/".concat(encodeURIComponent(orderId)).concat(query ? "?".concat(query) : '');
3000
3001
  }
@@ -1,6 +1,6 @@
1
1
  import { Module, ModuleOptions, PisellCore } from '../../types';
2
2
  import { BaseModule } from '../../modules/BaseModule';
3
- import { BaseSalesOrderProduct, BaseSalesOrderProductIdentity, BaseSalesPaymentStatus, BaseSalesCalculateProductBookingPriceParams, BaseSalesProductBookingPriceResult, BaseSalesScanCodeResult } from './types';
3
+ import { BaseSalesOrderProduct, BaseSalesOrderProductIdentity, BaseSalesPaymentStatus, BaseSalesUpdateOrderProductQuantityParams, BaseSalesCalculateProductBookingPriceParams, BaseSalesProductBookingPriceResult, BaseSalesScanCodeResult } from './types';
4
4
  import { OrderModule } from '../../modules/Order';
5
5
  import type { AddProductBookingInput, LoadSalesDetailParams, OrderPaymentData, OrderPaymentSource, SendCustomerPayLinkParams, SyncPaymentsToOrderParams, SyncPaymentsToOrderResult, UpdateTempOrderCustomerInput, UpdateOrderBookingParams, UpdateOrderProductParams, OrderTempOrder } from '../../modules/Order/types';
6
6
  import type { SubmitPayloadEnhancer } from '../../modules/Order/utils';
@@ -110,15 +110,22 @@ export declare class BaseSalesImpl extends BaseModule implements Module {
110
110
  updateTempOrderNote(note: string): string;
111
111
  updateTempOrderNote(note: string, sync: true): Promise<string>;
112
112
  updateTempOrderNote(note: string, sync: boolean): string | Promise<string>;
113
+ updateRemoteOrderNote(orderId: number | string, note: string): void;
113
114
  updateTempOrderShopDiscount(amount: string | number): string;
114
115
  updateTempOrderContactsInfo(contactsInfo: Record<string, any> | null): Record<string, any> | null;
115
116
  private ensureTempOrder;
116
117
  addNewOrder(): Promise<OrderTempOrder>;
117
118
  saveDraft(): Promise<void>;
118
119
  restoreOrder(): Promise<OrderTempOrder>;
120
+ /**
121
+ * 仅清空 tempOrder 购物车行(products / bookings / discount_list)。
122
+ * 同步清空内存中的 salesDetail 商品/预约视图,避免编辑态仍读到旧 bookings。
123
+ */
124
+ clearOrderCartLines(): Promise<OrderTempOrder>;
119
125
  getOrderProducts(): import("../../modules/Order/types").OrderProduct[];
120
126
  getSummary(): Promise<import("../../modules/Order/types").OrderSummary>;
121
127
  private getHistoricalProductDiscountList;
128
+ private isPersistedOrderProduct;
122
129
  private mergeHistoricalDiscountList;
123
130
  loadDiscountConfig(params?: {
124
131
  customerId?: number;
@@ -215,6 +222,7 @@ export declare class BaseSalesImpl extends BaseModule implements Module {
215
222
  calculateProductBookingPrice(params: BaseSalesCalculateProductBookingPriceParams): Promise<BaseSalesProductBookingPriceResult>;
216
223
  addProductToOrder(product: Partial<BaseSalesOrderProduct> & BaseSalesOrderProductIdentity, booking?: AddProductBookingInput): Promise<import("../../modules/Order/types").OrderProduct[]>;
217
224
  updateOrderProduct(params: UpdateOrderProductParams): Promise<import("../../modules/Order/types").OrderProduct[]>;
225
+ updateOrderProductQuantity(params: BaseSalesUpdateOrderProductQuantityParams): Promise<import("../../modules/Order/types").OrderProduct[]>;
218
226
  updateOrderBooking(params: UpdateOrderBookingParams): any[];
219
227
  /**
220
228
  * 设置单行商品备注(与整单 `updateTempOrderNote` 区分)。