@pisell/pisellos 2.3.57 → 2.3.58

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.
@@ -235,6 +235,7 @@ export declare class OrderModule extends BaseModule implements Module {
235
235
  */
236
236
  private lookupOrderIndexByIdentityKeys;
237
237
  private isRemoteEchoMergeSource;
238
+ private isRemoteProductMembershipChangeSource;
238
239
  private getProductMembershipKey;
239
240
  private doProductsHaveStableMembershipIdentity;
240
241
  /**
@@ -1331,7 +1331,9 @@ export var OrderModule = /*#__PURE__*/function (_BaseModule) {
1331
1331
  _context11.next = 4;
1332
1332
  break;
1333
1333
  }
1334
- this.logInfo('upsertOrdersFromRemote-订单列表为空', {});
1334
+ this.logInfo('upsertOrdersFromRemote-订单列表为空', {
1335
+ source: source
1336
+ });
1335
1337
  return _context11.abrupt("return");
1336
1338
  case 4:
1337
1339
  this.logInfo('upsertOrdersFromRemote-开始', {
@@ -2638,6 +2640,11 @@ export var OrderModule = /*#__PURE__*/function (_BaseModule) {
2638
2640
  value: function isRemoteEchoMergeSource(source) {
2639
2641
  return source === 'pubsub.bodyUpsert' || source === 'pubsub.httpRefresh';
2640
2642
  }
2643
+ }, {
2644
+ key: "isRemoteProductMembershipChangeSource",
2645
+ value: function isRemoteProductMembershipChangeSource(source) {
2646
+ return this.isRemoteEchoMergeSource(source) || source === 'manual.editOpenRemoteCheck';
2647
+ }
2641
2648
  }, {
2642
2649
  key: "getProductMembershipKey",
2643
2650
  value: function getProductMembershipKey(product) {
@@ -2677,7 +2684,7 @@ export var OrderModule = /*#__PURE__*/function (_BaseModule) {
2677
2684
  value: function getRemoteProductMembershipChange(existingOrder, mergedOrder, source) {
2678
2685
  var _this17 = this,
2679
2686
  _mergedOrder$order_id;
2680
- if (!this.isRemoteEchoMergeSource(source)) return null;
2687
+ if (!this.isRemoteProductMembershipChangeSource(source)) return null;
2681
2688
  var previousProducts = Array.isArray(existingOrder.products) ? existingOrder.products : [];
2682
2689
  var currentProducts = Array.isArray(mergedOrder.products) ? mergedOrder.products : [];
2683
2690
  var unmatchedCurrentIndexes = new Set(currentProducts.map(function (_, index) {
@@ -568,7 +568,7 @@ export interface OrderChangedPayload {
568
568
  /** 触发来源,便于订阅者区分 pubsub / 远端覆盖 / 清空等场景 */
569
569
  source?: string;
570
570
  }
571
- export type RemoteProductMembershipChangeSource = 'pubsub.bodyUpsert' | 'pubsub.httpRefresh';
571
+ export type RemoteProductMembershipChangeSource = 'pubsub.bodyUpsert' | 'pubsub.httpRefresh' | 'manual.editOpenRemoteCheck';
572
572
  /**
573
573
  * 远端订单快照相对本地订单产生商品成员增删时的广播载荷。
574
574
  * 只表达商品行成员关系变化,不包含数量、价格、备注等字段级修改。
package/lib/core/index.js CHANGED
@@ -50,6 +50,7 @@ var PisellOSCore = class {
50
50
  this.serverOptions = options.server;
51
51
  }
52
52
  this.initialize(options);
53
+ console.log("constructor1234");
53
54
  }
54
55
  initialize(options) {
55
56
  if (options == null ? void 0 : options.plugins) {
@@ -858,15 +858,30 @@ var RulesModule = class extends import_BaseModule.BaseModule {
858
858
  }
859
859
  return false;
860
860
  });
861
- const explicitlySelectedDiscountCard = (options == null ? void 0 : options.isSelected) === true && options.discountId !== void 0 ? applicableDiscounts.find((discount) => {
861
+ const explicitlySelectedDiscount = (options == null ? void 0 : options.isSelected) === true && options.discountId !== void 0 ? applicableDiscounts.find((discount) => {
862
862
  const discountType = discount.tag || discount.type;
863
- return String(discount.id) === String(options.discountId) && ["discount_card", "product_discount_card"].includes(discountType);
863
+ return String(discount.id) === String(options.discountId) && ["good_pass", "discount_card", "product_discount_card"].includes(
864
+ discountType
865
+ );
864
866
  }) : void 0;
867
+ const explicitlySelectedDiscountCard = explicitlySelectedDiscount && (explicitlySelectedDiscount.tag || explicitlySelectedDiscount.type) !== "good_pass" ? explicitlySelectedDiscount : void 0;
865
868
  const scannedSelectedDiscountCard = applicableDiscounts.find(
866
869
  (n) => n.isScan && n.isSelected && (n.tag || n.type) !== "good_pass"
867
870
  );
868
871
  const selectedDiscountCard = explicitlySelectedDiscountCard || scannedSelectedDiscountCard;
869
- const selectedDiscount = selectedDiscountCard || applicableDiscounts[0];
872
+ const selectedDiscount = explicitlySelectedDiscount || selectedDiscountCard || applicableDiscounts[0];
873
+ const prioritizedApplicableDiscounts = explicitlySelectedDiscount && (explicitlySelectedDiscount.tag || explicitlySelectedDiscount.type) === "good_pass" ? [
874
+ explicitlySelectedDiscount,
875
+ ...applicableDiscounts.filter(
876
+ (discount) => {
877
+ const discountType = discount.tag || discount.type;
878
+ return discountType === "good_pass" && String(discount.id) !== String(explicitlySelectedDiscount.id);
879
+ }
880
+ ),
881
+ ...applicableDiscounts.filter(
882
+ (discount) => (discount.tag || discount.type) !== "good_pass"
883
+ )
884
+ ] : applicableDiscounts;
870
885
  let isManualDiscount = false;
871
886
  let isItemRewardProductDiscount = false;
872
887
  if (flatItem.type === "main") {
@@ -1103,7 +1118,7 @@ var RulesModule = class extends import_BaseModule.BaseModule {
1103
1118
  );
1104
1119
  }
1105
1120
  for (let i = 0; i < splitCount; i++) {
1106
- const selectedDiscount2 = selectedDiscountCard || applicableDiscounts[i];
1121
+ const selectedDiscount2 = isNeedSplit ? prioritizedApplicableDiscounts[i] : selectedDiscountCard || applicableDiscounts[i];
1107
1122
  usedDiscounts.set(selectedDiscount2.id, true);
1108
1123
  if ((selectedDiscount2.tag || selectedDiscount2.type) === "good_pass") {
1109
1124
  const currentCount = usedProductIdCounts.get(selectedDiscount2.product_id) || 0;
@@ -1230,7 +1245,7 @@ var RulesModule = class extends import_BaseModule.BaseModule {
1230
1245
  const discountNum = splitCount;
1231
1246
  const normalNum = totalQuantity - discountNum;
1232
1247
  for (let i = 0; i < discountNum; i++) {
1233
- const selectedDiscount2 = applicableDiscounts[i];
1248
+ const selectedDiscount2 = prioritizedApplicableDiscounts[i];
1234
1249
  usedDiscounts.set(selectedDiscount2.id, true);
1235
1250
  if ((selectedDiscount2.tag || selectedDiscount2.type) === "good_pass") {
1236
1251
  const currentCount = usedProductIdCounts.get(selectedDiscount2.product_id) || 0;
@@ -164,6 +164,12 @@ declare class Server {
164
164
  * 不影响当前界面展示,适用于切回前台、定时刷新等场景
165
165
  */
166
166
  refreshOrdersInBackground(): Promise<void>;
167
+ /**
168
+ * 编辑正式订单时强制查询 Server 最新快照并覆盖本地缓存。
169
+ * 商品成员增删由 OrderModule 在 SQLite/Store 更新完成后广播,
170
+ * UI 可复用 order:onRemoteProductMembershipChanged 处理冲突。
171
+ */
172
+ checkRemoteOrderProductMembership(orderId: string | number): Promise<void>;
167
173
  /**
168
174
  * 清空所有server模块的IndexedDB缓存
169
175
  * @returns Promise<void>
@@ -1789,6 +1789,57 @@ var Server = class {
1789
1789
  });
1790
1790
  }
1791
1791
  }
1792
+ /**
1793
+ * 编辑正式订单时强制查询 Server 最新快照并覆盖本地缓存。
1794
+ * 商品成员增删由 OrderModule 在 SQLite/Store 更新完成后广播,
1795
+ * UI 可复用 order:onRemoteProductMembershipChanged 处理冲突。
1796
+ */
1797
+ async checkRemoteOrderProductMembership(orderId) {
1798
+ const normalizedOrderId = String(orderId ?? "").trim();
1799
+ if (!normalizedOrderId || normalizedOrderId.startsWith("local_order")) {
1800
+ this.logInfo("checkRemoteOrderProductMembership: 跳过非正式订单", {
1801
+ orderId
1802
+ });
1803
+ return;
1804
+ }
1805
+ if (!this.order) {
1806
+ const error = new Error("Order 模块未注册");
1807
+ this.logWarning("checkRemoteOrderProductMembership: Order 模块未注册", {
1808
+ orderId: normalizedOrderId
1809
+ });
1810
+ throw error;
1811
+ }
1812
+ this.logInfo("checkRemoteOrderProductMembership 开始", {
1813
+ orderId: normalizedOrderId
1814
+ });
1815
+ const startTime = Date.now();
1816
+ try {
1817
+ const freshOrders = await this.order.fetchOrdersByHttp([
1818
+ normalizedOrderId
1819
+ ]);
1820
+ const freshOrder = freshOrders.find(
1821
+ (order) => String(order == null ? void 0 : order.order_id) === normalizedOrderId
1822
+ );
1823
+ if (!freshOrder) {
1824
+ throw new Error("Server 未返回目标订单最新快照");
1825
+ }
1826
+ await this.order.upsertOrdersFromRemote(
1827
+ [freshOrder],
1828
+ "manual.editOpenRemoteCheck"
1829
+ );
1830
+ this.logInfo("checkRemoteOrderProductMembership 完成", {
1831
+ orderId: normalizedOrderId,
1832
+ duration: `${Date.now() - startTime}ms`
1833
+ });
1834
+ } catch (error) {
1835
+ this.logError("checkRemoteOrderProductMembership 失败", {
1836
+ orderId: normalizedOrderId,
1837
+ duration: `${Date.now() - startTime}ms`,
1838
+ error: error instanceof Error ? error.message : String(error)
1839
+ });
1840
+ throw error;
1841
+ }
1842
+ }
1792
1843
  /**
1793
1844
  * 清空所有server模块的IndexedDB缓存
1794
1845
  * @returns Promise<void>
@@ -235,6 +235,7 @@ export declare class OrderModule extends BaseModule implements Module {
235
235
  */
236
236
  private lookupOrderIndexByIdentityKeys;
237
237
  private isRemoteEchoMergeSource;
238
+ private isRemoteProductMembershipChangeSource;
238
239
  private getProductMembershipKey;
239
240
  private doProductsHaveStableMembershipIdentity;
240
241
  /**
@@ -920,10 +920,13 @@ var OrderModule = class extends import_BaseModule.BaseModule {
920
920
  */
921
921
  async upsertOrdersFromRemote(freshOrders, source = "upsertOrdersFromRemote") {
922
922
  if (!(freshOrders == null ? void 0 : freshOrders.length)) {
923
- this.logInfo("upsertOrdersFromRemote-订单列表为空", {});
923
+ this.logInfo("upsertOrdersFromRemote-订单列表为空", { source });
924
924
  return;
925
925
  }
926
- this.logInfo("upsertOrdersFromRemote-开始", { count: freshOrders.length, source });
926
+ this.logInfo("upsertOrdersFromRemote-开始", {
927
+ count: freshOrders.length,
928
+ source
929
+ });
927
930
  await this.mergeOrdersToStore(freshOrders, source);
928
931
  }
929
932
  async markOrderSyncedByExternalSaleNumber(params) {
@@ -1685,6 +1688,9 @@ var OrderModule = class extends import_BaseModule.BaseModule {
1685
1688
  isRemoteEchoMergeSource(source) {
1686
1689
  return source === "pubsub.bodyUpsert" || source === "pubsub.httpRefresh";
1687
1690
  }
1691
+ isRemoteProductMembershipChangeSource(source) {
1692
+ return this.isRemoteEchoMergeSource(source) || source === "manual.editOpenRemoteCheck";
1693
+ }
1688
1694
  getProductMembershipKey(product) {
1689
1695
  const persistentId = (0, import_orderCollectionIdentity.getOrderCollectionPersistentId)("product", product);
1690
1696
  if (persistentId)
@@ -1717,7 +1723,7 @@ var OrderModule = class extends import_BaseModule.BaseModule {
1717
1723
  * 对比合并前后的商品成员集合。商品字段修改与数组重排不会产生 diff。
1718
1724
  */
1719
1725
  getRemoteProductMembershipChange(existingOrder, mergedOrder, source) {
1720
- if (!this.isRemoteEchoMergeSource(source))
1726
+ if (!this.isRemoteProductMembershipChangeSource(source))
1721
1727
  return null;
1722
1728
  const previousProducts = Array.isArray(existingOrder.products) ? existingOrder.products : [];
1723
1729
  const currentProducts = Array.isArray(mergedOrder.products) ? mergedOrder.products : [];
@@ -568,7 +568,7 @@ export interface OrderChangedPayload {
568
568
  /** 触发来源,便于订阅者区分 pubsub / 远端覆盖 / 清空等场景 */
569
569
  source?: string;
570
570
  }
571
- export type RemoteProductMembershipChangeSource = 'pubsub.bodyUpsert' | 'pubsub.httpRefresh';
571
+ export type RemoteProductMembershipChangeSource = 'pubsub.bodyUpsert' | 'pubsub.httpRefresh' | 'manual.editOpenRemoteCheck';
572
572
  /**
573
573
  * 远端订单快照相对本地订单产生商品成员增删时的广播载荷。
574
574
  * 只表达商品行成员关系变化,不包含数量、价格、备注等字段级修改。
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "private": false,
3
3
  "name": "@pisell/pisellos",
4
- "version": "2.3.57",
4
+ "version": "2.3.58",
5
5
  "description": "一个可扩展的前端模块化SDK框架,支持插件系统",
6
6
  "main": "dist/index.js",
7
7
  "types": "dist/index.d.ts",