@pisell/pisellos 2.3.56 → 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.
- package/dist/modules/Rules/index.js +14 -7
- package/dist/server/index.d.ts +6 -0
- package/dist/server/index.js +810 -729
- package/dist/server/modules/order/index.d.ts +1 -0
- package/dist/server/modules/order/index.js +9 -2
- package/dist/server/modules/order/types.d.ts +1 -1
- package/dist/solution/BaseSales/index.js +15 -10
- package/lib/modules/Rules/index.js +20 -5
- package/lib/server/index.d.ts +6 -0
- package/lib/server/index.js +51 -0
- package/lib/server/modules/order/index.d.ts +1 -0
- package/lib/server/modules/order/index.js +9 -3
- package/lib/server/modules/order/types.d.ts +1 -1
- package/lib/solution/BaseSales/index.js +6 -1
- package/package.json +1 -1
|
@@ -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.
|
|
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
|
* 只表达商品行成员关系变化,不包含数量、价格、备注等字段级修改。
|
|
@@ -4049,7 +4049,7 @@ export var BaseSalesImpl = /*#__PURE__*/function (_BaseModule) {
|
|
|
4049
4049
|
key: "scanWalletAsset",
|
|
4050
4050
|
value: (function () {
|
|
4051
4051
|
var _scanWalletAsset = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee42(code) {
|
|
4052
|
-
var result;
|
|
4052
|
+
var wallet, businessData, result;
|
|
4053
4053
|
return _regeneratorRuntime().wrap(function _callee42$(_context42) {
|
|
4054
4054
|
while (1) switch (_context42.prev = _context42.next) {
|
|
4055
4055
|
case 0:
|
|
@@ -4059,22 +4059,27 @@ export var BaseSalesImpl = /*#__PURE__*/function (_BaseModule) {
|
|
|
4059
4059
|
}
|
|
4060
4060
|
throw new Error('payment 模块未初始化');
|
|
4061
4061
|
case 2:
|
|
4062
|
-
|
|
4063
|
-
|
|
4064
|
-
|
|
4062
|
+
wallet = this.store.payment.wallet; // 扫码可能早于后台 Wallet 刷新,搜索参数必须以当前订单为准。
|
|
4063
|
+
businessData = this.buildWalletInitBusinessData();
|
|
4064
|
+
if (businessData) {
|
|
4065
|
+
wallet.generateWalletParams(businessData);
|
|
4066
|
+
}
|
|
4067
|
+
_context42.next = 7;
|
|
4068
|
+
return wallet.scanWalletAssetAsync(code);
|
|
4069
|
+
case 7:
|
|
4065
4070
|
result = _context42.sent;
|
|
4066
4071
|
if (!(result.type === 'normalCode')) {
|
|
4067
|
-
_context42.next =
|
|
4072
|
+
_context42.next = 13;
|
|
4068
4073
|
break;
|
|
4069
4074
|
}
|
|
4070
|
-
_context42.next =
|
|
4075
|
+
_context42.next = 11;
|
|
4071
4076
|
return this.syncSelectedWalletAssets(result.state);
|
|
4072
|
-
case
|
|
4073
|
-
_context42.next =
|
|
4077
|
+
case 11:
|
|
4078
|
+
_context42.next = 13;
|
|
4074
4079
|
return this.publishWalletAssetsState(result.state);
|
|
4075
|
-
case
|
|
4080
|
+
case 13:
|
|
4076
4081
|
return _context42.abrupt("return", result);
|
|
4077
|
-
case
|
|
4082
|
+
case 14:
|
|
4078
4083
|
case "end":
|
|
4079
4084
|
return _context42.stop();
|
|
4080
4085
|
}
|
|
@@ -858,15 +858,30 @@ var RulesModule = class extends import_BaseModule.BaseModule {
|
|
|
858
858
|
}
|
|
859
859
|
return false;
|
|
860
860
|
});
|
|
861
|
-
const
|
|
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(
|
|
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 =
|
|
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;
|
package/lib/server/index.d.ts
CHANGED
|
@@ -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>
|
package/lib/server/index.js
CHANGED
|
@@ -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-开始", {
|
|
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.
|
|
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
|
* 只表达商品行成员关系变化,不包含数量、价格、备注等字段级修改。
|
|
@@ -2661,7 +2661,12 @@ var BaseSalesImpl = class extends import_BaseModule.BaseModule {
|
|
|
2661
2661
|
async scanWalletAsset(code) {
|
|
2662
2662
|
if (!this.store.payment)
|
|
2663
2663
|
throw new Error("payment 模块未初始化");
|
|
2664
|
-
const
|
|
2664
|
+
const wallet = this.store.payment.wallet;
|
|
2665
|
+
const businessData = this.buildWalletInitBusinessData();
|
|
2666
|
+
if (businessData) {
|
|
2667
|
+
wallet.generateWalletParams(businessData);
|
|
2668
|
+
}
|
|
2669
|
+
const result = await wallet.scanWalletAssetAsync(code);
|
|
2665
2670
|
if (result.type === "normalCode") {
|
|
2666
2671
|
await this.syncSelectedWalletAssets(result.state);
|
|
2667
2672
|
await this.publishWalletAssetsState(result.state);
|