@pisell/pisellos 2.2.265 → 2.2.267

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 (66) hide show
  1. package/dist/model/strategy/adapter/promotion/index.js +0 -9
  2. package/dist/modules/BookingContext/utils/buildCacheItemFromOrderLine.js +5 -3
  3. package/dist/modules/BookingContext/utils/buildNormalProductCacheItemFromOrderLine.js +6 -3
  4. package/dist/modules/Order/index.d.ts +8 -27
  5. package/dist/modules/Order/index.js +490 -743
  6. package/dist/modules/Order/types.d.ts +1 -33
  7. package/dist/modules/Order/utils/orderCollectionIdentity.js +2 -7
  8. package/dist/modules/Order/utils.js +5 -8
  9. package/dist/modules/Payment/index.d.ts +0 -2
  10. package/dist/modules/Payment/index.js +50 -79
  11. package/dist/modules/Payment/types.d.ts +27 -29
  12. package/dist/modules/Payment/types.js +3 -5
  13. package/dist/server/index.d.ts +0 -16
  14. package/dist/server/index.js +1036 -1933
  15. package/dist/server/modules/order/index.d.ts +4 -49
  16. package/dist/server/modules/order/index.js +695 -1574
  17. package/dist/server/modules/order/types.d.ts +3 -11
  18. package/dist/server/modules/order/types.js +1 -1
  19. package/dist/solution/BaseSales/index.d.ts +11 -42
  20. package/dist/solution/BaseSales/index.js +385 -676
  21. package/dist/solution/BaseSales/utils/cartPromotion.js +5 -3
  22. package/dist/solution/BaseSales/utils/parseSalesResponse.d.ts +1 -6
  23. package/dist/solution/BookingTicket/index.d.ts +1 -1
  24. package/dist/solution/BookingTicket/index.js +1 -2
  25. package/dist/solution/BookingTicket/utils/addProductDecision.js +6 -0
  26. package/dist/solution/BookingTicket/utils/weighingProductSku.d.ts +5 -0
  27. package/dist/solution/BookingTicket/utils/weighingProductSku.js +45 -0
  28. package/dist/solution/Sales/index.d.ts +0 -1
  29. package/dist/solution/Sales/index.js +2 -10
  30. package/lib/model/strategy/adapter/promotion/index.js +0 -49
  31. package/lib/modules/BookingContext/utils/buildCacheItemFromOrderLine.js +2 -1
  32. package/lib/modules/BookingContext/utils/buildNormalProductCacheItemFromOrderLine.js +2 -1
  33. package/lib/modules/Order/index.d.ts +8 -27
  34. package/lib/modules/Order/index.js +69 -184
  35. package/lib/modules/Order/types.d.ts +1 -33
  36. package/lib/modules/Order/utils/orderCollectionIdentity.js +0 -3
  37. package/lib/modules/Order/utils.js +3 -5
  38. package/lib/modules/Payment/index.d.ts +0 -2
  39. package/lib/modules/Payment/index.js +13 -34
  40. package/lib/modules/Payment/types.d.ts +27 -29
  41. package/lib/modules/Payment/types.js +3 -3
  42. package/lib/server/index.d.ts +0 -16
  43. package/lib/server/index.js +18 -670
  44. package/lib/server/modules/order/index.d.ts +4 -49
  45. package/lib/server/modules/order/index.js +66 -657
  46. package/lib/server/modules/order/types.d.ts +3 -11
  47. package/lib/solution/BaseSales/index.d.ts +11 -42
  48. package/lib/solution/BaseSales/index.js +35 -214
  49. package/lib/solution/BaseSales/utils/cartPromotion.js +5 -2
  50. package/lib/solution/BaseSales/utils/parseSalesResponse.d.ts +1 -6
  51. package/lib/solution/BookingTicket/index.d.ts +1 -1
  52. package/lib/solution/BookingTicket/index.js +1 -2
  53. package/lib/solution/BookingTicket/utils/addProductDecision.js +4 -0
  54. package/lib/solution/BookingTicket/utils/weighingProductSku.d.ts +5 -0
  55. package/lib/solution/BookingTicket/utils/weighingProductSku.js +63 -0
  56. package/lib/solution/Sales/index.d.ts +0 -1
  57. package/lib/solution/Sales/index.js +3 -5
  58. package/package.json +2 -2
  59. package/dist/modules/Order/payment-utils.d.ts +0 -26
  60. package/dist/modules/Order/payment-utils.js +0 -225
  61. package/dist/utils/payment-number.d.ts +0 -9
  62. package/dist/utils/payment-number.js +0 -69
  63. package/lib/modules/Order/payment-utils.d.ts +0 -26
  64. package/lib/modules/Order/payment-utils.js +0 -224
  65. package/lib/utils/payment-number.d.ts +0 -9
  66. package/lib/utils/payment-number.js +0 -64
@@ -213,12 +213,10 @@ export interface OrderBookingItem {
213
213
  [key: string]: unknown;
214
214
  }[];
215
215
  }
216
- /** 支付记录 metadata */
216
+ /** 支付记录 metadata,常含 unique_payment_number */
217
217
  export interface OrderPaymentMetadata {
218
- /** 三方支付交易流水号 */
218
+ /** 设备端本地支付唯一标识 */
219
219
  unique_payment_number?: string;
220
- /** 刷卡机设备快照;server 不解析内部字段,仅透传并持久化 */
221
- card_reader_snapshot?: Record<string, unknown>;
222
220
  [key: string]: unknown;
223
221
  }
224
222
  /**
@@ -227,8 +225,6 @@ export interface OrderPaymentMetadata {
227
225
  export interface OrderPaymentItem {
228
226
  /** 支付记录 ID;存量/更新时传。来源:OrderPayment.id */
229
227
  order_payment_id?: number | null;
230
- /** 支付项稳定唯一号;历史支付项允许缺失 */
231
- payment_number?: string;
232
228
  /** 支付方式 ID(设备端从本地支付方式配置取详情)。来源:OrderPayment.custom_payment_id */
233
229
  custom_payment_id?: number;
234
230
  /** 支付方式编码。来源:OrderPayment.payment_method */
@@ -253,13 +249,11 @@ export interface OrderPaymentItem {
253
249
  created_at?: string | null;
254
250
  /** 手续费配置。来源:OrderPayment.service_charge */
255
251
  service_charge?: Record<string, unknown> | null;
256
- /** 已计算的支付手续费。来源:OrderPayment.service_fee */
257
- service_fee?: OrderMoneyString;
258
252
  /** Wallet Pass 使用单位 */
259
253
  wallet_pass_usage_unit?: unknown[] | null;
260
254
  /** Wallet Pass 使用值 */
261
255
  wallet_pass_use_value?: number | null;
262
- /** 元数据;三方支付成功后可含 unique_payment_number */
256
+ /** 元数据;含 unique_payment_number。来源:OrderPayment.metadata */
263
257
  metadata?: OrderPaymentMetadata | null;
264
258
  }
265
259
  /**
@@ -419,8 +413,6 @@ export interface OrderData {
419
413
  create_date?: string;
420
414
  /** 本地待同步标记:1 表示需要后续同步到云端 */
421
415
  need_sync?: 0 | 1 | number;
422
- /** 本地草稿标记:1 表示仅为 POS 可恢复草稿,不代表已提交云端 */
423
- is_draft_order?: 0 | 1 | number;
424
416
  /** 兼容:部分场景仍使用顶层 total_amount */
425
417
  total_amount?: OrderMoneyString | number;
426
418
  /** 扩展字段(物流、标签等);使用 any 以便筛选与数据源扩展 */
@@ -2,14 +2,14 @@ import { Module, ModuleOptions, PisellCore } from '../../types';
2
2
  import { BaseModule } from '../../modules/BaseModule';
3
3
  import { BaseSalesOrderProduct, BaseSalesOrderProductIdentity, BaseSalesPaymentStatus, BaseSalesUpdateOrderProductQuantityParams, BaseSalesCalculateProductBookingPriceParams, BaseSalesPriceRecalculationContextChange, BaseSalesProductBookingPriceResult, BaseSalesQuotationCustomerScopeInfo, BaseSalesScanCodeResult } from './types';
4
4
  import { OrderModule } from '../../modules/Order';
5
- import type { AddProductBookingInput, LoadSalesDetailParams, OrderPaymentData, OrderPaymentUpdateOptions, OrderPaymentUpdateResult, OrderPaymentSource, SendCustomerPayLinkParams, SyncPaymentsToOrderParams, SyncPaymentsToOrderResult, UpdateTempOrderCustomerInput, UpdateOrderBookingParams, UpdateOrderProductParams, OrderTempOrder, OrderSummary, OrderPromotionEvaluator, OrderGiftSelectResolver, OrderUnfulfilledPromotion, OrderLastGiftActions } from '../../modules/Order/types';
5
+ import type { AddProductBookingInput, LoadSalesDetailParams, OrderPaymentData, OrderPaymentSource, SendCustomerPayLinkParams, SyncPaymentsToOrderParams, SyncPaymentsToOrderResult, UpdateTempOrderCustomerInput, UpdateOrderBookingParams, UpdateOrderProductParams, OrderTempOrder, OrderSummary, OrderPromotionEvaluator, OrderGiftSelectResolver, OrderUnfulfilledPromotion, OrderLastGiftActions } from '../../modules/Order/types';
6
6
  import type { SubmitPayloadEnhancer } from '../../modules/Order/utils';
7
7
  import type { Discount } from '../../modules/Discount/types';
8
8
  import { RequestPlugin, WindowPlugin } from '../../plugins';
9
9
  export * from './types';
10
10
  import { ProductList } from '../../modules/ProductList';
11
11
  import { PaymentModule } from '../../modules/Payment';
12
- import type { PaymentMethod } from '../../modules/Payment/types';
12
+ import type { PaymentMethod, RoundingResult } from '../../modules/Payment/types';
13
13
  import type { SalesSummaryModule } from '../../modules/SalesSummary';
14
14
  import type { ScheduleModule } from '../../modules/Schedule';
15
15
  import { QuotationModule } from '../../modules/Quotation';
@@ -24,19 +24,6 @@ export interface BaseSalesState {
24
24
  schedule?: ScheduleModule;
25
25
  quotation?: QuotationModule;
26
26
  }
27
- export interface BaseSalesUpdateOrderPaymentOptions extends OrderPaymentUpdateOptions {
28
- persistDraft?: boolean;
29
- submitWhenPaid?: boolean;
30
- forceSubmitIfPaid?: boolean;
31
- /** 草稿恢复时,允许将新回调字段合并进已 paid 的支付项。 */
32
- applyUpdatesWhenPaid?: boolean;
33
- smallTicketDataFlag?: number;
34
- }
35
- export interface BaseSalesUpdateOrderPaymentResult extends OrderPaymentUpdateResult {
36
- draftResult?: unknown;
37
- draftError?: unknown;
38
- syncResult?: SyncPaymentsToOrderResult<any>;
39
- }
40
27
  export type BaseSalesPrintLocalOrderReceiptParams = string | number;
41
28
  export declare class BaseSalesImpl extends BaseModule implements Module {
42
29
  protected defaultName: string;
@@ -141,8 +128,6 @@ export declare class BaseSalesImpl extends BaseModule implements Module {
141
128
  */
142
129
  protected readSessionCacheData(): Record<string, any>;
143
130
  protected getAppData<T>(key: string): T | undefined;
144
- private getPaymentNumberDevicePrefixSync;
145
- private getPaymentNumberDevicePrefixAsync;
146
131
  private syncAppDataToTempOrder;
147
132
  initialize(core: PisellCore, options?: ModuleOptions): Promise<void>;
148
133
  destroy(): Promise<void>;
@@ -255,13 +240,6 @@ export declare class BaseSalesImpl extends BaseModule implements Module {
255
240
  confirmPendingVoucherPayments?: boolean;
256
241
  enhancePayload?: SubmitPayloadEnhancer;
257
242
  }): Promise<T>;
258
- saveSalesOrderDraft<T = any>(params?: {
259
- platform?: string;
260
- businessCode?: string;
261
- channel?: string;
262
- type?: string;
263
- enhancePayload?: SubmitPayloadEnhancer;
264
- }): Promise<T>;
265
243
  submitTempOrderAsync<T = any>(params?: {
266
244
  payments?: OrderPaymentSource[];
267
245
  paymentStatus?: BaseSalesPaymentStatus;
@@ -280,24 +258,16 @@ export declare class BaseSalesImpl extends BaseModule implements Module {
280
258
  private queueLatestAutoPaymentSync;
281
259
  private scheduleQueuedAutoPaymentSyncFlush;
282
260
  private flushQueuedAutoPaymentSync;
283
- /**
284
- * 同步兼容入口。无法等待 IoT 短号时,按调用当下的 device_id 或 LOCAL 生成。
285
- */
261
+ /** 追加单个支付项到当前订单。 */
286
262
  addOrderPayment(payment: OrderPaymentSource): OrderPaymentData[];
287
- /** 创建新支付项时读取最新设备短号,不缓存运行时设备信息。 */
288
- addOrderPaymentAsync(payment: OrderPaymentSource): Promise<OrderPaymentData[]>;
289
- private addOrderPaymentWithDevicePrefix;
290
263
  /** 更新当前订单中的指定支付项。 */
291
- updateOrderPayment(paymentIdentity: string | number, updates: Partial<OrderPaymentData> & Record<string, any>, options?: BaseSalesUpdateOrderPaymentOptions): Promise<BaseSalesUpdateOrderPaymentResult>;
264
+ updateOrderPayment(paymentIdentity: string | number, updates: Partial<OrderPaymentData> & Record<string, any>): OrderPaymentData[];
292
265
  /** 删除当前订单中的指定支付项。 */
293
266
  deleteOrderPayment(paymentIdentity: string | number): OrderPaymentData[];
294
267
  /** 覆盖 wallet pass 支付项,同时保留普通支付项。 */
295
268
  updateVoucherOrderPayments(payments: OrderPaymentSource[], options?: {
296
269
  status?: 'paid' | 'payment_pending';
297
270
  }): OrderPaymentData[];
298
- updateVoucherOrderPaymentsAsync(payments: OrderPaymentSource[], options?: {
299
- status?: 'paid' | 'payment_pending';
300
- }): Promise<OrderPaymentData[]>;
301
271
  confirmPendingVoucherPayments(): OrderPaymentData[];
302
272
  discardPendingVoucherPayments(): OrderPaymentData[];
303
273
  private getWalletProductList;
@@ -320,16 +290,15 @@ export declare class BaseSalesImpl extends BaseModule implements Module {
320
290
  getPaymentMethodsAsync(): Promise<PaymentMethod[]>;
321
291
  /** 同步读取初始化时缓存的支付方式列表。 */
322
292
  getPaymentMethods(): PaymentMethod[];
323
- /** 轻量舍入能力,供现金支付 UI 计算 rounding_amount。 */
293
+ /**
294
+ * 按当前店铺的现金舍入配置计算金额,供现金支付 UI 使用。
295
+ *
296
+ * 舍入开关取自 CASHMANUAL 支付方式;舍入规则取自
297
+ * otherParams.order_rounding_setting,金额算法统一由 PaymentModule 维护。
298
+ */
324
299
  roundAmount(params: {
325
300
  amount: string | number;
326
- interval?: string | number;
327
- rule?: 'standard_rounding' | 'standard_down' | 'always_up' | 'always_down' | string;
328
- }): {
329
- originalAmount: string;
330
- roundedAmount: string;
331
- roundingDifference: string;
332
- };
301
+ }): Promise<RoundingResult>;
333
302
  /**
334
303
  * 发送支付链接。
335
304
  *
@@ -40,8 +40,6 @@ var import_decimal = __toESM(require("decimal.js"));
40
40
  var import_lodash_es = require("lodash-es");
41
41
  var import_types2 = require("../BookingByStep/types");
42
42
  var import_utils = require("../../modules/Order/utils");
43
- var import_payment_utils = require("../../modules/Order/payment-utils");
44
- var import_payment_number = require("../../utils/payment-number");
45
43
  var import_orderCollectionIdentity = require("../../modules/Order/utils/orderCollectionIdentity");
46
44
  var import_dayjs = __toESM(require("dayjs"));
47
45
  __reExport(BaseSales_exports, require("./types"), module.exports);
@@ -79,11 +77,6 @@ function isBaseSalesHistoricalDiscountEntry(discount) {
79
77
  (discount == null ? void 0 : discount.isEditMode) || (discount == null ? void 0 : discount.isDisabled) || (discount == null ? void 0 : discount.order_discount_id) != null
80
78
  );
81
79
  }
82
- function getBaseSalesUniqueArrayMetadataKey(key) {
83
- if (key === "products" || key === "bookings")
84
- return "unique_identification_number";
85
- return null;
86
- }
87
80
  var BASE_SALES_PERSISTENT_ID_FIELD_BY_KIND = {
88
81
  product: "order_detail_id",
89
82
  booking: "schedule_event_id",
@@ -157,15 +150,6 @@ function mergeBaseSalesCollectionItem(kind, currentItem, incomingItem, uidRemaps
157
150
  return kind === "product" ? mergeBaseSalesProductSnapshotFields(currentItem, mergedItem) : mergedItem;
158
151
  }
159
152
  function mergeBaseSalesOrderCollection(kind, currentValue, incomingValue, strategy, uidRemaps) {
160
- if (kind === "payment") {
161
- return (0, import_payment_utils.mergeOrderPaymentListsByIdentity)(
162
- currentValue,
163
- incomingValue,
164
- strategy === "preserve-local" ? { preserveUnmatchedExisting: true } : {
165
- preserveUnmatchedExistingWhen: (payment) => (0, import_payment_utils.isIdentifiedPendingOrderPayment)(payment) || !(0, import_orderCollectionIdentity.getOrderCollectionPersistentId)("payment", payment)
166
- }
167
- );
168
- }
169
153
  const currentItems = (0, import_orderCollectionIdentity.normalizeOrderCollection)(kind, currentValue, {
170
154
  ensureUid: false
171
155
  }).items;
@@ -225,35 +209,6 @@ function normalizeBaseSalesRecordCollections(sourceRecord, options) {
225
209
  }
226
210
  return normalizedRecord;
227
211
  }
228
- function getBaseSalesMetadataUid(item, metadataKey) {
229
- var _a;
230
- const uid = ((_a = item == null ? void 0 : item.metadata) == null ? void 0 : _a[metadataKey]) ?? (item == null ? void 0 : item[metadataKey]);
231
- if (uid === void 0 || uid === null || uid === "")
232
- return null;
233
- return String(uid);
234
- }
235
- function mergeBaseSalesUniqueArray(currentValue, loadedValue, metadataKey) {
236
- const result = [];
237
- const indexByUid = /* @__PURE__ */ new Map();
238
- const appendOrReplaceByUid = (item) => {
239
- const clonedItem = (0, import_lodash_es.cloneDeep)(item);
240
- const uid = getBaseSalesMetadataUid(clonedItem, metadataKey);
241
- if (!uid) {
242
- result.push(clonedItem);
243
- return;
244
- }
245
- const existingIndex = indexByUid.get(uid);
246
- if (existingIndex !== void 0) {
247
- result[existingIndex] = clonedItem;
248
- return;
249
- }
250
- indexByUid.set(uid, result.length);
251
- result.push(clonedItem);
252
- };
253
- currentValue.forEach(appendOrReplaceByUid);
254
- loadedValue.forEach(appendOrReplaceByUid);
255
- return result;
256
- }
257
212
  function mergeSalesDetailRecordWithTempOrder(currentTempOrder, loadedRecord, strategy) {
258
213
  const normalizedLoadedRecord = normalizeBaseSalesRecordCollections(
259
214
  loadedRecord || {},
@@ -282,15 +237,6 @@ function mergeSalesDetailRecordWithTempOrder(currentTempOrder, loadedRecord, str
282
237
  );
283
238
  }
284
239
  if (Array.isArray(currentValue) && Array.isArray(loadedValue)) {
285
- if (key === "payments" || key === "payment") {
286
- return (0, import_payment_utils.mergeOrderPaymentListsByIdentity)(currentValue, loadedValue, {
287
- preserveUnmatchedExisting: true
288
- });
289
- }
290
- const metadataKey = getBaseSalesUniqueArrayMetadataKey(key);
291
- if (metadataKey) {
292
- return mergeBaseSalesUniqueArray(currentValue, loadedValue, metadataKey);
293
- }
294
240
  return [
295
241
  ...(0, import_lodash_es.cloneDeep)(currentValue),
296
242
  ...(0, import_lodash_es.cloneDeep)(loadedValue)
@@ -309,18 +255,6 @@ function mergeSalesDetailRecordWithTempOrder(currentTempOrder, loadedRecord, str
309
255
  (0, import_orderCollectionIdentity.applyOrderCollectionUidRemaps)(mergedRecord, uidRemaps)
310
256
  );
311
257
  }
312
- function filterPendingPaymentsFromLoadedSalesDetail(sourceRecord) {
313
- if (!sourceRecord || typeof sourceRecord !== "object")
314
- return sourceRecord;
315
- const record = { ...sourceRecord };
316
- if (Array.isArray(sourceRecord.payments)) {
317
- record.payments = sourceRecord.payments.filter((payment) => !(0, import_payment_utils.isPendingOrderPayment)(payment));
318
- }
319
- if (Array.isArray(sourceRecord.payment)) {
320
- record.payment = sourceRecord.payment.filter((payment) => !(0, import_payment_utils.isPendingOrderPayment)(payment));
321
- }
322
- return record;
323
- }
324
258
  var BaseSalesImpl = class extends import_BaseModule.BaseModule {
325
259
  constructor(name, version) {
326
260
  super(name, version);
@@ -862,16 +796,6 @@ var BaseSalesImpl = class extends import_BaseModule.BaseModule {
862
796
  const coreData = (_f = (_d = (_c = app == null ? void 0 : app.models) == null ? void 0 : _c.getStore) == null ? void 0 : (_e = _d.call(_c)).getDataByModel) == null ? void 0 : _f.call(_e, "core", "core");
863
797
  return coreData == null ? void 0 : coreData[key];
864
798
  }
865
- getPaymentNumberDevicePrefixSync() {
866
- if (!this.appPlugin)
867
- return "LOCAL";
868
- return (0, import_payment_number.resolvePaymentNumberDevicePrefixFromDeviceId)((key) => this.getAppData(key));
869
- }
870
- getPaymentNumberDevicePrefixAsync() {
871
- if (!this.appPlugin)
872
- return Promise.resolve("LOCAL");
873
- return (0, import_payment_number.resolvePaymentNumberDevicePrefix)((key) => this.getAppData(key));
874
- }
875
799
  syncAppDataToTempOrder(tempOrder) {
876
800
  const isPriceIncludeTax = this.getAppData("is_price_include_tax");
877
801
  const taxCountryCode = this.getAppData("tax_country_code");
@@ -1006,16 +930,13 @@ var BaseSalesImpl = class extends import_BaseModule.BaseModule {
1006
930
  const message = loadedRecord && (loadedRecord.message || loadedRecord.msg) || `加载销售详情失败: ${lookup}`;
1007
931
  throw new Error(message);
1008
932
  }
1009
- const remoteRecord = filterPendingPaymentsFromLoadedSalesDetail(
1010
- preloadedSalesDetail ?? loadedRecord.data
1011
- );
933
+ const remoteRecord = preloadedSalesDetail ?? loadedRecord.data;
1012
934
  const currentTempOrder = params.merge ? this.store.order.getTempOrder() : null;
1013
- const mergedRecord = params.merge ? mergeSalesDetailRecordWithTempOrder(
935
+ const record = params.merge ? mergeSalesDetailRecordWithTempOrder(
1014
936
  currentTempOrder,
1015
937
  remoteRecord,
1016
938
  "preserve-local"
1017
939
  ) : remoteRecord;
1018
- const record = filterPendingPaymentsFromLoadedSalesDetail(mergedRecord);
1019
940
  return await this.hydrateLatestLoadedSalesDetail(record, loadSequence);
1020
941
  } finally {
1021
942
  this.salesDetailLoadInFlightCount = Math.max(
@@ -1806,20 +1727,6 @@ var BaseSalesImpl = class extends import_BaseModule.BaseModule {
1806
1727
  };
1807
1728
  return this.store.order.submitTempOrder(submitParams);
1808
1729
  }
1809
- async saveSalesOrderDraft(params) {
1810
- var _a, _b, _c, _d;
1811
- if (!this.store.order) {
1812
- throw new Error("BaseSales 解决方案需要 order 模块支持");
1813
- }
1814
- return this.store.order.saveTempOrderAsDraft({
1815
- cacheId: this.cacheId,
1816
- platform: (params == null ? void 0 : params.platform) ?? ((_a = this.otherParams) == null ? void 0 : _a.platform),
1817
- businessCode: (params == null ? void 0 : params.businessCode) ?? ((_b = this.otherParams) == null ? void 0 : _b.businessCode) ?? ((_c = this.otherParams) == null ? void 0 : _c.business_code),
1818
- channel: (params == null ? void 0 : params.channel) ?? this.getSubmitOrderSalesChannel(),
1819
- type: (params == null ? void 0 : params.type) ?? ((_d = this.otherParams) == null ? void 0 : _d.type),
1820
- ...(params == null ? void 0 : params.enhancePayload) !== void 0 ? { enhancePayload: params.enhancePayload } : {}
1821
- });
1822
- }
1823
1730
  async submitTempOrderAsync(params) {
1824
1731
  var _a, _b, _c, _d;
1825
1732
  if (!this.store.order) {
@@ -2020,26 +1927,8 @@ var BaseSalesImpl = class extends import_BaseModule.BaseModule {
2020
1927
  }
2021
1928
  }
2022
1929
  }
2023
- /**
2024
- * 同步兼容入口。无法等待 IoT 短号时,按调用当下的 device_id 或 LOCAL 生成。
2025
- */
1930
+ /** 追加单个支付项到当前订单。 */
2026
1931
  addOrderPayment(payment) {
2027
- const hasPaymentNumber = String(
2028
- payment.payment_number || ""
2029
- ).trim() !== "";
2030
- return this.addOrderPaymentWithDevicePrefix(
2031
- payment,
2032
- hasPaymentNumber ? "LOCAL" : this.getPaymentNumberDevicePrefixSync()
2033
- );
2034
- }
2035
- /** 创建新支付项时读取最新设备短号,不缓存运行时设备信息。 */
2036
- async addOrderPaymentAsync(payment) {
2037
- const paymentRecord = payment;
2038
- const hasPaymentNumber = String(paymentRecord.payment_number || "").trim() !== "";
2039
- const devicePrefix = hasPaymentNumber ? "LOCAL" : await this.getPaymentNumberDevicePrefixAsync();
2040
- return this.addOrderPaymentWithDevicePrefix(payment, devicePrefix);
2041
- }
2042
- addOrderPaymentWithDevicePrefix(payment, devicePrefix) {
2043
1932
  var _a;
2044
1933
  if (!this.store.order)
2045
1934
  throw new Error("order 模块未初始化");
@@ -2056,26 +1945,21 @@ var BaseSalesImpl = class extends import_BaseModule.BaseModule {
2056
1945
  if (shopWalletPassId !== void 0 && shopWalletPassId !== null) {
2057
1946
  metadata.shop_wallet_pass_id = shopWalletPassId;
2058
1947
  }
2059
- const normalizedPaymentRecord = (0, import_payment_utils.ensureOrderPaymentNumber)(
2060
- paymentRecord,
2061
- devicePrefix,
2062
- import_utils.createUuidV4
2063
- );
1948
+ if (!metadata.unique_payment_number) {
1949
+ metadata.unique_payment_number = (0, import_utils.createUuidV4)();
1950
+ }
2064
1951
  const paymentTimestamp = (0, import_dayjs.default)().format("YYYY-MM-DD HH:mm:ss");
2065
1952
  const paymentTime = paymentRecord.payment_time ?? paymentTimestamp;
2066
1953
  const createdAt = paymentRecord.created_at ?? paymentTimestamp;
2067
1954
  const serviceCharge = paymentRecord.service_charge && typeof paymentRecord.service_charge === "object" ? paymentRecord.service_charge : null;
2068
1955
  const calculatedServiceFee = serviceCharge ? new import_decimal.default(paymentRecord.origin_amount ?? paymentRecord.amount ?? 0).times(serviceCharge.percentage || 0).plus(serviceCharge.amount || 0).toDecimalPlaces(2).toFixed(2) : void 0;
2069
1956
  const payments = this.store.order.addOrderPayment({
2070
- ...normalizedPaymentRecord,
1957
+ ...paymentRecord,
2071
1958
  ...calculatedServiceFee !== void 0 ? { service_fee: calculatedServiceFee } : {},
2072
1959
  metadata,
2073
1960
  payment_time: paymentTime,
2074
1961
  created_at: createdAt
2075
1962
  });
2076
- if (paymentRecord.status === "payment_pending") {
2077
- return payments;
2078
- }
2079
1963
  const amountSnapshot = this.store.order.getOrderAmountSnapshot();
2080
1964
  const syncState = this.store.order.getOrderSyncState();
2081
1965
  if (amountSnapshot) {
@@ -2097,73 +1981,10 @@ var BaseSalesImpl = class extends import_BaseModule.BaseModule {
2097
1981
  return payments;
2098
1982
  }
2099
1983
  /** 更新当前订单中的指定支付项。 */
2100
- async updateOrderPayment(paymentIdentity, updates, options = {}) {
2101
- var _a, _b, _c;
1984
+ updateOrderPayment(paymentIdentity, updates) {
2102
1985
  if (!this.store.order)
2103
1986
  throw new Error("order 模块未初始化");
2104
- const matchMode = options.matchBy === "compat" || options.matchBy === "legacy" ? "compat" : "payment_number";
2105
- const previousMatch = (0, import_payment_utils.resolveOrderPaymentIdentity)(
2106
- this.store.order.getOrderPayments(),
2107
- paymentIdentity,
2108
- matchMode
2109
- );
2110
- const previousPayment = previousMatch == null ? void 0 : previousMatch.payment;
2111
- if ((previousPayment == null ? void 0 : previousPayment.status) === "paid" && !options.applyUpdatesWhenPaid) {
2112
- const currentPayments = this.store.order.getOrderPayments();
2113
- let syncResult2;
2114
- if (options.submitWhenPaid && options.forceSubmitIfPaid) {
2115
- syncResult2 = await this.syncPaymentsToOrder({
2116
- payments: currentPayments,
2117
- paymentStatus: this.getPaymentStatusForSync(currentPayments),
2118
- submitWhenPaid: true,
2119
- smallTicketDataFlag: options.smallTicketDataFlag ?? 1
2120
- });
2121
- }
2122
- return {
2123
- updated: false,
2124
- payment: previousPayment,
2125
- payments: currentPayments,
2126
- summary: ((_a = this.store.order.getOrderAmountSnapshot()) == null ? void 0 : _a.summary) || null,
2127
- ...syncResult2 !== void 0 ? { syncResult: syncResult2 } : {}
2128
- };
2129
- }
2130
- const result = await this.store.order.updateOrderPayment(paymentIdentity, updates, {
2131
- matchBy: matchMode
2132
- });
2133
- let draftResult;
2134
- let draftError;
2135
- if (options.persistDraft !== false) {
2136
- try {
2137
- draftResult = await this.saveSalesOrderDraft();
2138
- } catch (error) {
2139
- draftError = error;
2140
- this.logError("updateOrderPayment: 保存支付草稿失败", {
2141
- paymentIdentity,
2142
- error: error instanceof Error ? error.message : String(error)
2143
- });
2144
- if (!options.submitWhenPaid)
2145
- throw error;
2146
- }
2147
- }
2148
- const becamePaid = (previousPayment == null ? void 0 : previousPayment.status) !== "paid" && ((_b = result.payment) == null ? void 0 : _b.status) === "paid";
2149
- const shouldSubmit = Boolean(
2150
- options.submitWhenPaid && ((_c = result.payment) == null ? void 0 : _c.status) === "paid" && (becamePaid || options.forceSubmitIfPaid)
2151
- );
2152
- let syncResult;
2153
- if (shouldSubmit) {
2154
- syncResult = await this.syncPaymentsToOrder({
2155
- payments: result.payments,
2156
- paymentStatus: this.getPaymentStatusForSync(result.payments),
2157
- submitWhenPaid: true,
2158
- smallTicketDataFlag: options.smallTicketDataFlag ?? 1
2159
- });
2160
- }
2161
- return {
2162
- ...result,
2163
- ...draftResult !== void 0 ? { draftResult } : {},
2164
- ...draftError !== void 0 ? { draftError } : {},
2165
- ...syncResult !== void 0 ? { syncResult } : {}
2166
- };
1987
+ return this.store.order.updateOrderPayment(paymentIdentity, updates);
2167
1988
  }
2168
1989
  /** 删除当前订单中的指定支付项。 */
2169
1990
  deleteOrderPayment(paymentIdentity) {
@@ -2177,11 +1998,6 @@ var BaseSalesImpl = class extends import_BaseModule.BaseModule {
2177
1998
  throw new Error("order 模块未初始化");
2178
1999
  return this.store.order.updateVoucherOrderPayments(payments, options);
2179
2000
  }
2180
- async updateVoucherOrderPaymentsAsync(payments, options) {
2181
- if (!this.store.order)
2182
- throw new Error("order 模块未初始化");
2183
- return this.store.order.updateVoucherOrderPaymentsAsync(payments, options);
2184
- }
2185
2001
  confirmPendingVoucherPayments() {
2186
2002
  if (!this.store.order)
2187
2003
  throw new Error("order 模块未初始化");
@@ -2328,28 +2144,33 @@ var BaseSalesImpl = class extends import_BaseModule.BaseModule {
2328
2144
  getPaymentMethods() {
2329
2145
  return [...this.paymentMethodsCache];
2330
2146
  }
2331
- /** 轻量舍入能力,供现金支付 UI 计算 rounding_amount。 */
2332
- roundAmount(params) {
2333
- const amount = new import_decimal.default(params.amount || 0);
2334
- const interval = new import_decimal.default(params.interval || 0.05);
2335
- const rule = params.rule || "standard_rounding";
2336
- const quotient = amount.div(interval);
2337
- let roundedQuotient;
2338
- if (rule === "always_up") {
2339
- roundedQuotient = quotient.ceil();
2340
- } else if (rule === "always_down") {
2341
- roundedQuotient = quotient.floor();
2342
- } else if (rule === "standard_down") {
2343
- roundedQuotient = quotient.toDecimalPlaces(0, import_decimal.default.ROUND_HALF_DOWN);
2344
- } else {
2345
- roundedQuotient = quotient.toDecimalPlaces(0, import_decimal.default.ROUND_HALF_UP);
2147
+ /**
2148
+ * 按当前店铺的现金舍入配置计算金额,供现金支付 UI 使用。
2149
+ *
2150
+ * 舍入开关取自 CASHMANUAL 支付方式;舍入规则取自
2151
+ * otherParams.order_rounding_setting,金额算法统一由 PaymentModule 维护。
2152
+ */
2153
+ async roundAmount(params) {
2154
+ var _a, _b, _c;
2155
+ const amount = params.amount;
2156
+ const cashManualPayment = this.paymentMethodsCache.find(
2157
+ (paymentMethod) => paymentMethod.code === "CASHMANUAL"
2158
+ );
2159
+ if (!((_a = cashManualPayment == null ? void 0 : cashManualPayment.metadata) == null ? void 0 : _a.order_rounding_switch)) {
2160
+ return {
2161
+ originalAmount: amount.toString(),
2162
+ roundedAmount: amount.toString(),
2163
+ roundingDifference: "0.00"
2164
+ };
2346
2165
  }
2347
- const roundedAmount = roundedQuotient.times(interval).toDecimalPlaces(2);
2348
- return {
2349
- originalAmount: amount.toFixed(2),
2350
- roundedAmount: roundedAmount.toFixed(2),
2351
- roundingDifference: roundedAmount.minus(amount).toFixed(2)
2352
- };
2166
+ if (!this.payment) {
2167
+ throw new Error("payment 模块未初始化");
2168
+ }
2169
+ return this.payment.roundAmountAsync(
2170
+ amount,
2171
+ (_b = this.otherParams.order_rounding_setting) == null ? void 0 : _b.interval,
2172
+ (_c = this.otherParams.order_rounding_setting) == null ? void 0 : _c.type
2173
+ );
2353
2174
  }
2354
2175
  /**
2355
2176
  * 发送支付链接。
@@ -332,8 +332,11 @@ function getProductLineNoteSignature(product) {
332
332
  return uid ? `note:${uid}` : `note:${normalizedNote}`;
333
333
  }
334
334
  function getPromotionLineMergeBoundary(product) {
335
- var _a;
336
- if (((_a = product == null ? void 0 : product.metadata) == null ? void 0 : _a.is_edit_for_runtime) !== true)
335
+ var _a, _b;
336
+ if (Number(((_a = product == null ? void 0 : product.product_sku) == null ? void 0 : _a.open_sold_weight) || 0) === 1) {
337
+ return `weighing:${getOrderProductUid(product)}`;
338
+ }
339
+ if (((_b = product == null ? void 0 : product.metadata) == null ? void 0 : _b.is_edit_for_runtime) !== true)
337
340
  return "";
338
341
  return `edit:${getOrderProductUid(product)}`;
339
342
  }
@@ -82,13 +82,8 @@ export interface ISalesBooking {
82
82
  metadata?: Record<string, any> | null;
83
83
  [key: string]: any;
84
84
  }
85
- export interface ISalesPaymentMetadata extends Record<string, any> {
86
- /** 刷卡机设备快照;OS 不解析内部字段 */
87
- card_reader_snapshot?: Record<string, unknown>;
88
- }
89
85
  export interface ISalesPayment {
90
86
  order_payment_id?: number | null;
91
- payment_number?: string;
92
87
  custom_payment_id?: number;
93
88
  code?: string;
94
89
  name?: string;
@@ -100,7 +95,7 @@ export interface ISalesPayment {
100
95
  status?: string;
101
96
  payment_time?: string | null;
102
97
  service_charge?: Record<string, any> | null;
103
- metadata?: ISalesPaymentMetadata | null;
98
+ metadata?: Record<string, any> | null;
104
99
  [key: string]: any;
105
100
  }
106
101
  export interface ISalesSurcharge {
@@ -322,7 +322,7 @@ export declare class BookingTicketImpl extends BaseSalesImpl implements Module {
322
322
  * 获取当前的客户搜索条件
323
323
  * @returns 当前搜索条件
324
324
  */
325
- getCurrentCustomerSearchParams(): Omit<import("../../modules").ShopGetCustomerListParams, "num" | "skip">;
325
+ getCurrentCustomerSearchParams(): Omit<import("../../modules").ShopGetCustomerListParams, "skip" | "num">;
326
326
  /**
327
327
  * 获取客户列表状态(包含滚动加载相关状态)
328
328
  * @returns 客户状态
@@ -1153,8 +1153,7 @@ var BookingTicketImpl = class extends import_BaseSales.BaseSalesImpl {
1153
1153
  }
1154
1154
  /** 读取当前 booking config。 */
1155
1155
  getBookingConfig() {
1156
- var _a;
1157
- return (_a = this.store.bookingContext) == null ? void 0 : _a.getBookingConfig();
1156
+ return this.store.bookingContext.getBookingConfig();
1158
1157
  }
1159
1158
  /** 写入资源全集(来源:`/form/schedule`),同步派生 resourcesOriginMap。 */
1160
1159
  setResources(resources) {
@@ -44,6 +44,7 @@ module.exports = __toCommonJS(addProductDecision_exports);
44
44
  var import_dayjs = __toESM(require("dayjs"));
45
45
  var import_BookingContext = require("../../../modules/BookingContext");
46
46
  var import_transformBaseProductToOrderProduct = require("../../BaseSales/utils/transformBaseProductToOrderProduct");
47
+ var import_weighingProductSku = require("./weighingProductSku");
47
48
  function needsSpecDetailModal(item) {
48
49
  if (item == null ? void 0 : item.open_sold_weight)
49
50
  return true;
@@ -281,11 +282,14 @@ function buildBasePayloadFromCacheItem(cacheItem, ctx) {
281
282
  const quantity = (ctx == null ? void 0 : ctx.quantity) != null && ctx.quantity > 0 ? ctx.quantity : ((_b = cacheItem == null ? void 0 : cacheItem._extend) == null ? void 0 : _b.quantity) ?? 1;
282
283
  const resolvedPid = (cacheItem == null ? void 0 : cacheItem.product_id) ?? (cacheItem == null ? void 0 : cacheItem.id);
283
284
  const extend = (cacheItem == null ? void 0 : cacheItem._extend) || {};
285
+ const productSku = (0, import_weighingProductSku.buildProductSkuFromCacheItem)(cacheItem);
284
286
  return {
285
287
  id: (cacheItem == null ? void 0 : cacheItem.id) ?? (cacheItem == null ? void 0 : cacheItem.product_id),
286
288
  product_id: resolvedPid,
287
289
  variant_id: (other == null ? void 0 : other.product_variant_id) ?? (other == null ? void 0 : other.variant_id) ?? 0,
288
290
  quantity,
291
+ // 规格弹窗本次选择是 option 权威源,避免目录/旧订单里的空 option 覆盖它。
292
+ product_sku: productSku ? { ...productSku, option: (other == null ? void 0 : other.option) || [] } : void 0,
289
293
  option: (other == null ? void 0 : other.option) || [],
290
294
  bundle: (other == null ? void 0 : other.bundle) || ((_c = extend == null ? void 0 : extend.skuValue) == null ? void 0 : _c.bundle) || ((_d = extend == null ? void 0 : extend._skuValue) == null ? void 0 : _d.bundle) || [],
291
295
  unique: other == null ? void 0 : other.unique,
@@ -0,0 +1,5 @@
1
+ /**
2
+ * 将规格弹窗的称重结果写入订单行权威字段 product_sku。
3
+ * 商品目录已有的 SKU 字段会保留,本次称重结果只覆盖运行态称重字段。
4
+ */
5
+ export declare function buildProductSkuFromCacheItem(cacheItem: Record<string, any> | null | undefined): Record<string, any> | undefined;