@pisell/pisellos 2.3.23 → 2.3.24
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/model/strategy/adapter/dataVariant/adapter.d.ts +50 -0
- package/dist/model/strategy/adapter/dataVariant/adapter.js +167 -0
- package/dist/model/strategy/adapter/dataVariant/evaluator.d.ts +89 -0
- package/dist/model/strategy/adapter/dataVariant/evaluator.js +780 -0
- package/dist/model/strategy/adapter/dataVariant/examples.d.ts +39 -0
- package/dist/model/strategy/adapter/dataVariant/examples.js +277 -0
- package/dist/model/strategy/adapter/dataVariant/index.d.ts +4 -0
- package/dist/model/strategy/adapter/dataVariant/index.js +4 -0
- package/dist/model/strategy/adapter/dataVariant/type.d.ts +148 -0
- package/dist/model/strategy/adapter/dataVariant/type.js +54 -0
- package/dist/model/strategy/adapter/index.d.ts +4 -0
- package/dist/model/strategy/adapter/index.js +5 -1
- package/dist/modules/Discount/index.d.ts +5 -2
- package/dist/modules/Discount/index.js +30 -7
- package/dist/modules/Discount/types.d.ts +4 -0
- package/dist/modules/Order/index.d.ts +2 -1
- package/dist/modules/Order/index.js +25 -11
- package/dist/modules/Order/types.d.ts +2 -0
- package/dist/modules/Product/index.d.ts +1 -1
- package/dist/modules/Product/types.d.ts +22 -0
- package/dist/modules/ProductList/index.d.ts +1 -1
- package/dist/modules/ProductList/index.js +4 -2
- package/dist/modules/ProductList/types.d.ts +2 -0
- package/dist/server/index.d.ts +50 -0
- package/dist/server/index.js +995 -749
- package/dist/server/modules/products/index.d.ts +26 -7
- package/dist/server/modules/products/index.js +167 -76
- package/dist/server/modules/products/types.d.ts +14 -0
- package/dist/solution/BaseSales/index.d.ts +2 -0
- package/dist/solution/BaseSales/index.js +23 -13
- package/dist/solution/BookingTicket/types.d.ts +2 -0
- package/dist/solution/ShopDiscount/index.js +15 -14
- package/lib/model/strategy/adapter/dataVariant/adapter.d.ts +50 -0
- package/lib/model/strategy/adapter/dataVariant/adapter.js +149 -0
- package/lib/model/strategy/adapter/dataVariant/evaluator.d.ts +89 -0
- package/lib/model/strategy/adapter/dataVariant/evaluator.js +583 -0
- package/lib/model/strategy/adapter/dataVariant/examples.d.ts +39 -0
- package/lib/model/strategy/adapter/dataVariant/examples.js +293 -0
- package/lib/model/strategy/adapter/dataVariant/index.d.ts +4 -0
- package/lib/model/strategy/adapter/dataVariant/index.js +38 -0
- package/lib/model/strategy/adapter/dataVariant/type.d.ts +148 -0
- package/lib/model/strategy/adapter/dataVariant/type.js +31 -0
- package/lib/model/strategy/adapter/index.d.ts +4 -0
- package/lib/model/strategy/adapter/index.js +13 -2
- package/lib/modules/Discount/index.d.ts +5 -2
- package/lib/modules/Discount/index.js +23 -3
- package/lib/modules/Discount/types.d.ts +4 -0
- package/lib/modules/Order/index.d.ts +2 -1
- package/lib/modules/Order/index.js +13 -1
- package/lib/modules/Order/types.d.ts +2 -0
- package/lib/modules/Product/index.d.ts +1 -1
- package/lib/modules/Product/types.d.ts +22 -0
- package/lib/modules/ProductList/index.d.ts +1 -1
- package/lib/modules/ProductList/index.js +4 -2
- package/lib/modules/ProductList/types.d.ts +2 -0
- package/lib/server/index.d.ts +50 -0
- package/lib/server/index.js +206 -29
- package/lib/server/modules/products/index.d.ts +26 -7
- package/lib/server/modules/products/index.js +114 -35
- package/lib/server/modules/products/types.d.ts +14 -0
- package/lib/solution/BaseSales/index.d.ts +2 -0
- package/lib/solution/BaseSales/index.js +12 -3
- package/lib/solution/BookingTicket/types.d.ts +2 -0
- package/lib/solution/ShopDiscount/index.js +2 -1
- package/package.json +1 -1
|
@@ -1694,7 +1694,8 @@ export var BaseSalesImpl = /*#__PURE__*/function (_BaseModule) {
|
|
|
1694
1694
|
}
|
|
1695
1695
|
return _context17.abrupt("return", {
|
|
1696
1696
|
productList: tempOrder.products || [],
|
|
1697
|
-
discountList: currentDiscountList
|
|
1697
|
+
discountList: currentDiscountList,
|
|
1698
|
+
availableWalletIds: this.getAvailableWalletIds()
|
|
1698
1699
|
});
|
|
1699
1700
|
case 27:
|
|
1700
1701
|
nextDiscountList = this.mergeHistoricalDiscountList(preparedDiscountList || (discountModule === null || discountModule === void 0 || (_discountModule$getDi2 = discountModule.getDiscountList) === null || _discountModule$getDi2 === void 0 ? void 0 : _discountModule$getDi2.call(discountModule)) || [], tempOrder.products || []);
|
|
@@ -1729,7 +1730,8 @@ export var BaseSalesImpl = /*#__PURE__*/function (_BaseModule) {
|
|
|
1729
1730
|
case 39:
|
|
1730
1731
|
return _context17.abrupt("return", {
|
|
1731
1732
|
productList: tempOrder.products || [],
|
|
1732
|
-
discountList: nextDiscountList
|
|
1733
|
+
discountList: nextDiscountList,
|
|
1734
|
+
availableWalletIds: this.getAvailableWalletIds()
|
|
1733
1735
|
});
|
|
1734
1736
|
case 40:
|
|
1735
1737
|
if (!rulesModule) {
|
|
@@ -1830,7 +1832,8 @@ export var BaseSalesImpl = /*#__PURE__*/function (_BaseModule) {
|
|
|
1830
1832
|
case 83:
|
|
1831
1833
|
return _context17.abrupt("return", {
|
|
1832
1834
|
productList: tempOrder.products || [],
|
|
1833
|
-
discountList: nextDiscountList
|
|
1835
|
+
discountList: nextDiscountList,
|
|
1836
|
+
availableWalletIds: this.getAvailableWalletIds()
|
|
1834
1837
|
});
|
|
1835
1838
|
case 84:
|
|
1836
1839
|
case "end":
|
|
@@ -1843,6 +1846,13 @@ export var BaseSalesImpl = /*#__PURE__*/function (_BaseModule) {
|
|
|
1843
1846
|
}
|
|
1844
1847
|
return loadDiscountConfig;
|
|
1845
1848
|
}()
|
|
1849
|
+
}, {
|
|
1850
|
+
key: "getAvailableWalletIds",
|
|
1851
|
+
value: function getAvailableWalletIds() {
|
|
1852
|
+
var _this$store$order4;
|
|
1853
|
+
if (!((_this$store$order4 = this.store.order) !== null && _this$store$order4 !== void 0 && _this$store$order4.getAvailableWalletIds)) return [];
|
|
1854
|
+
return this.store.order.getAvailableWalletIds();
|
|
1855
|
+
}
|
|
1846
1856
|
}, {
|
|
1847
1857
|
key: "bestDiscount",
|
|
1848
1858
|
value: function () {
|
|
@@ -2415,7 +2425,7 @@ export var BaseSalesImpl = /*#__PURE__*/function (_BaseModule) {
|
|
|
2415
2425
|
value: function () {
|
|
2416
2426
|
var _printLocalOrderReceipt = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee26(lookup) {
|
|
2417
2427
|
var _this$otherParams14, _this$otherParams15, _this$otherParams16, _this$otherParams17;
|
|
2418
|
-
var hasLookup, lookupPayload, context, payload, response, _this$store$order$app, _this$store$
|
|
2428
|
+
var hasLookup, lookupPayload, context, payload, response, _this$store$order$app, _this$store$order5, _data;
|
|
2419
2429
|
return _regeneratorRuntime().wrap(function _callee26$(_context26) {
|
|
2420
2430
|
while (1) switch (_context26.prev = _context26.next) {
|
|
2421
2431
|
case 0:
|
|
@@ -2463,7 +2473,7 @@ export var BaseSalesImpl = /*#__PURE__*/function (_BaseModule) {
|
|
|
2463
2473
|
break;
|
|
2464
2474
|
}
|
|
2465
2475
|
_context26.next = 12;
|
|
2466
|
-
return (_this$store$order$app = (_this$store$
|
|
2476
|
+
return (_this$store$order$app = (_this$store$order5 = this.store.order).applyLocalPrintOrderNumbers) === null || _this$store$order$app === void 0 ? void 0 : _this$store$order$app.call(_this$store$order5, response === null || response === void 0 || (_data = response.data) === null || _data === void 0 ? void 0 : _data.order);
|
|
2467
2477
|
case 12:
|
|
2468
2478
|
return _context26.abrupt("return", response);
|
|
2469
2479
|
case 13:
|
|
@@ -2480,9 +2490,9 @@ export var BaseSalesImpl = /*#__PURE__*/function (_BaseModule) {
|
|
|
2480
2490
|
}, {
|
|
2481
2491
|
key: "getSubmitPaymentStatus",
|
|
2482
2492
|
value: function getSubmitPaymentStatus(paymentStatus) {
|
|
2483
|
-
var _this$store$
|
|
2493
|
+
var _this$store$order6, _this$store$order6$ge;
|
|
2484
2494
|
if (paymentStatus !== undefined) return paymentStatus;
|
|
2485
|
-
var amountSnapshot = (_this$store$
|
|
2495
|
+
var amountSnapshot = (_this$store$order6 = this.store.order) === null || _this$store$order6 === void 0 || (_this$store$order6$ge = _this$store$order6.getOrderAmountSnapshot) === null || _this$store$order6$ge === void 0 ? void 0 : _this$store$order6$ge.call(_this$store$order6);
|
|
2486
2496
|
if (!amountSnapshot) return undefined;
|
|
2487
2497
|
try {
|
|
2488
2498
|
return new Decimal(amountSnapshot.amountGap || 0).lte(0) ? 'paid' : undefined;
|
|
@@ -2806,8 +2816,8 @@ export var BaseSalesImpl = /*#__PURE__*/function (_BaseModule) {
|
|
|
2806
2816
|
}, {
|
|
2807
2817
|
key: "getWalletProductList",
|
|
2808
2818
|
value: function getWalletProductList() {
|
|
2809
|
-
var _this$store$
|
|
2810
|
-
var tempOrder = (_this$store$
|
|
2819
|
+
var _this$store$order7, _tempOrder$products;
|
|
2820
|
+
var tempOrder = (_this$store$order7 = this.store.order) === null || _this$store$order7 === void 0 ? void 0 : _this$store$order7.getTempOrder();
|
|
2811
2821
|
if (!(tempOrder !== null && tempOrder !== void 0 && (_tempOrder$products = tempOrder.products) !== null && _tempOrder$products !== void 0 && _tempOrder$products.length)) return [];
|
|
2812
2822
|
// 过滤出有 product_id的商品来,如果没有代表他是自定义商品,不需要参与 wallet
|
|
2813
2823
|
// debugger
|
|
@@ -3624,16 +3634,16 @@ export var BaseSalesImpl = /*#__PURE__*/function (_BaseModule) {
|
|
|
3624
3634
|
}, {
|
|
3625
3635
|
key: "getUnfulfilledPromotions",
|
|
3626
3636
|
value: function getUnfulfilledPromotions() {
|
|
3627
|
-
var _this$store$
|
|
3628
|
-
return ((_this$store$
|
|
3637
|
+
var _this$store$order8;
|
|
3638
|
+
return ((_this$store$order8 = this.store.order) === null || _this$store$order8 === void 0 ? void 0 : _this$store$order8.getUnfulfilledPromotions()) || [];
|
|
3629
3639
|
}
|
|
3630
3640
|
|
|
3631
3641
|
/** 最近一次促销计算输出的赠品操作 diff。 */
|
|
3632
3642
|
}, {
|
|
3633
3643
|
key: "getLastGiftActions",
|
|
3634
3644
|
value: function getLastGiftActions() {
|
|
3635
|
-
var _this$store$
|
|
3636
|
-
return ((_this$store$
|
|
3645
|
+
var _this$store$order9;
|
|
3646
|
+
return ((_this$store$order9 = this.store.order) === null || _this$store$order9 === void 0 ? void 0 : _this$store$order9.getLastGiftActions()) || null;
|
|
3637
3647
|
}
|
|
3638
3648
|
|
|
3639
3649
|
// 获取商品列表
|
|
@@ -756,7 +756,7 @@ export var ShopDiscountImpl = /*#__PURE__*/function (_BaseModule) {
|
|
|
756
756
|
key: "loadPrepareConfig",
|
|
757
757
|
value: function () {
|
|
758
758
|
var _loadPrepareConfig = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee9(params) {
|
|
759
|
-
var _this$getCustomer2, _this$store$discount7, _this$getDiscountList, _this$store$discount8, _this$store$productLi2, orderId, customerId, goodPassList, scanDiscount, scanDiscountIds, newGoodPassList, newDiscountList, filteredDiscountList, _result3;
|
|
759
|
+
var _this$getCustomer2, _this$store$discount7, _this$getDiscountList, _this$store$discount8, _this$store$productLi2, orderId, customerId, prepareConfigResult, goodPassList, scanDiscount, scanDiscountIds, newGoodPassList, newDiscountList, filteredDiscountList, _result3;
|
|
760
760
|
return _regeneratorRuntime().wrap(function _callee9$(_context9) {
|
|
761
761
|
while (1) switch (_context9.prev = _context9.next) {
|
|
762
762
|
case 0:
|
|
@@ -777,7 +777,8 @@ export var ShopDiscountImpl = /*#__PURE__*/function (_BaseModule) {
|
|
|
777
777
|
order_id: orderId
|
|
778
778
|
} : {}));
|
|
779
779
|
case 5:
|
|
780
|
-
|
|
780
|
+
prepareConfigResult = _context9.sent;
|
|
781
|
+
goodPassList = (prepareConfigResult === null || prepareConfigResult === void 0 ? void 0 : prepareConfigResult.discountList) || [];
|
|
781
782
|
scanDiscount = (_this$getDiscountList = this.getDiscountList()) === null || _this$getDiscountList === void 0 ? void 0 : _this$getDiscountList.filter(function (item) {
|
|
782
783
|
return item.isScan;
|
|
783
784
|
}); // goodPassList 里可能有 scanDiscount 重合的部分,goodPassList 需要剔除
|
|
@@ -789,35 +790,35 @@ export var ShopDiscountImpl = /*#__PURE__*/function (_BaseModule) {
|
|
|
789
790
|
});
|
|
790
791
|
newDiscountList = [].concat(_toConsumableArray(scanDiscount), _toConsumableArray(newGoodPassList || [])); // 存储原始优惠券列表
|
|
791
792
|
this.store.originalDiscountList = newDiscountList;
|
|
792
|
-
_context9.next =
|
|
793
|
+
_context9.next = 14;
|
|
793
794
|
return (_this$store$discount8 = this.store.discount) === null || _this$store$discount8 === void 0 ? void 0 : _this$store$discount8.setOriginalDiscountList(newDiscountList);
|
|
794
|
-
case
|
|
795
|
+
case 14:
|
|
795
796
|
// 根据当前预约时间过滤优惠券列表
|
|
796
797
|
filteredDiscountList = this.filterDiscountListByBookingTime(newDiscountList, this.store.currentBookingTime);
|
|
797
798
|
this.store.filteredDiscountList = filteredDiscountList;
|
|
798
799
|
this.setDiscountList(filteredDiscountList || []);
|
|
799
800
|
if (!((_this$store$productLi2 = this.store.productList) !== null && _this$store$productLi2 !== void 0 && _this$store$productLi2.length)) {
|
|
800
|
-
_context9.next =
|
|
801
|
+
_context9.next = 21;
|
|
801
802
|
break;
|
|
802
803
|
}
|
|
803
804
|
_result3 = this.calcDiscount(this.store.productList);
|
|
804
|
-
_context9.next =
|
|
805
|
+
_context9.next = 21;
|
|
805
806
|
return this.core.effects.emit("".concat(this.name, ":onLoadPrepareCalcResult"), _result3);
|
|
806
|
-
case
|
|
807
|
-
_context9.next =
|
|
807
|
+
case 21:
|
|
808
|
+
_context9.next = 23;
|
|
808
809
|
return this.core.effects.emit("".concat(this.name, ":onLoadDiscountList"), filteredDiscountList);
|
|
809
|
-
case
|
|
810
|
-
_context9.next =
|
|
810
|
+
case 23:
|
|
811
|
+
_context9.next = 28;
|
|
811
812
|
break;
|
|
812
|
-
case
|
|
813
|
-
_context9.prev =
|
|
813
|
+
case 25:
|
|
814
|
+
_context9.prev = 25;
|
|
814
815
|
_context9.t0 = _context9["catch"](0);
|
|
815
816
|
console.error('[ShopDiscount] 加载准备配置出错:', _context9.t0);
|
|
816
|
-
case
|
|
817
|
+
case 28:
|
|
817
818
|
case "end":
|
|
818
819
|
return _context9.stop();
|
|
819
820
|
}
|
|
820
|
-
}, _callee9, this, [[0,
|
|
821
|
+
}, _callee9, this, [[0, 25]]);
|
|
821
822
|
}));
|
|
822
823
|
function loadPrepareConfig(_x9) {
|
|
823
824
|
return _loadPrepareConfig.apply(this, arguments);
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import type { EvaluationResult, RuntimeContext } from '../../type';
|
|
2
|
+
import type { BusinessAdapter } from '../type';
|
|
3
|
+
import type { DataVariantBusinessData, DataVariantProduct } from './type';
|
|
4
|
+
/**
|
|
5
|
+
* Data Variant 适配器。
|
|
6
|
+
*
|
|
7
|
+
* 负责把智能定价运行态数据转换为 StrategyEngine 能识别的 attributes。
|
|
8
|
+
*/
|
|
9
|
+
export declare class DataVariantAdapter implements BusinessAdapter {
|
|
10
|
+
name: string;
|
|
11
|
+
version: string;
|
|
12
|
+
/**
|
|
13
|
+
* 准备批量全局上下文。
|
|
14
|
+
*
|
|
15
|
+
* 这里只放不依赖单个商品的字段,用于预计算 schedule/channel/orderType 等条件。
|
|
16
|
+
*/
|
|
17
|
+
prepareContext(businessData: DataVariantBusinessData): RuntimeContext;
|
|
18
|
+
/**
|
|
19
|
+
* 准备全局预计算上下文。
|
|
20
|
+
*/
|
|
21
|
+
prepareGlobalContext(businessData: DataVariantBusinessData): RuntimeContext;
|
|
22
|
+
/**
|
|
23
|
+
* 准备单商品上下文。
|
|
24
|
+
*
|
|
25
|
+
* 商品级条件只在当前商品 data_variants 引用到对应规则后才评估。
|
|
26
|
+
*/
|
|
27
|
+
prepareProductContext(businessData: DataVariantBusinessData, product: DataVariantProduct): RuntimeContext;
|
|
28
|
+
transformResult(result: EvaluationResult): EvaluationResult;
|
|
29
|
+
formatConfig(result: EvaluationResult, businessData?: DataVariantBusinessData): {
|
|
30
|
+
result: EvaluationResult;
|
|
31
|
+
businessData?: DataVariantBusinessData;
|
|
32
|
+
};
|
|
33
|
+
/**
|
|
34
|
+
* 构建 menu_match 使用的轻量商品对象。
|
|
35
|
+
*
|
|
36
|
+
* collection_ids 来自商品 collection 字段,避免 operator 读取复杂商品对象。
|
|
37
|
+
*/
|
|
38
|
+
buildProductValue(product: DataVariantProduct): {
|
|
39
|
+
id: number;
|
|
40
|
+
product_variant_id: number;
|
|
41
|
+
collection_ids: number[];
|
|
42
|
+
};
|
|
43
|
+
private toNumber;
|
|
44
|
+
/**
|
|
45
|
+
* 归一化客户 id:无效值返回 undefined,有效值统一为 number。
|
|
46
|
+
*/
|
|
47
|
+
private normalizeCustomerId;
|
|
48
|
+
private normalizeNumberArray;
|
|
49
|
+
}
|
|
50
|
+
export default DataVariantAdapter;
|
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
var __defProp = Object.defineProperty;
|
|
2
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
3
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
4
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
5
|
+
var __export = (target, all) => {
|
|
6
|
+
for (var name in all)
|
|
7
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
8
|
+
};
|
|
9
|
+
var __copyProps = (to, from, except, desc) => {
|
|
10
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
11
|
+
for (let key of __getOwnPropNames(from))
|
|
12
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
13
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
14
|
+
}
|
|
15
|
+
return to;
|
|
16
|
+
};
|
|
17
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
18
|
+
|
|
19
|
+
// src/model/strategy/adapter/dataVariant/adapter.ts
|
|
20
|
+
var adapter_exports = {};
|
|
21
|
+
__export(adapter_exports, {
|
|
22
|
+
DataVariantAdapter: () => DataVariantAdapter,
|
|
23
|
+
default: () => adapter_default
|
|
24
|
+
});
|
|
25
|
+
module.exports = __toCommonJS(adapter_exports);
|
|
26
|
+
var DataVariantAdapter = class {
|
|
27
|
+
constructor() {
|
|
28
|
+
this.name = "DataVariantAdapter";
|
|
29
|
+
this.version = "1.0.0";
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* 准备批量全局上下文。
|
|
33
|
+
*
|
|
34
|
+
* 这里只放不依赖单个商品的字段,用于预计算 schedule/channel/orderType 等条件。
|
|
35
|
+
*/
|
|
36
|
+
prepareContext(businessData) {
|
|
37
|
+
return this.prepareGlobalContext(businessData);
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* 准备全局预计算上下文。
|
|
41
|
+
*/
|
|
42
|
+
prepareGlobalContext(businessData) {
|
|
43
|
+
const {
|
|
44
|
+
products,
|
|
45
|
+
scheduleDateTime,
|
|
46
|
+
channel,
|
|
47
|
+
orderType,
|
|
48
|
+
businessCode,
|
|
49
|
+
customerId,
|
|
50
|
+
availableWalletIds,
|
|
51
|
+
custom
|
|
52
|
+
} = businessData;
|
|
53
|
+
const normalizedCustomerId = this.normalizeCustomerId(customerId);
|
|
54
|
+
const normalizedAvailableWalletIds = this.normalizeNumberArray(availableWalletIds ?? (custom == null ? void 0 : custom.available_wallet_ids));
|
|
55
|
+
const resolvedBusinessCode = businessCode || (custom == null ? void 0 : custom.business_code) || (custom == null ? void 0 : custom.businessCode) || "";
|
|
56
|
+
return {
|
|
57
|
+
entities: {
|
|
58
|
+
products
|
|
59
|
+
},
|
|
60
|
+
attributes: {
|
|
61
|
+
...custom,
|
|
62
|
+
schedule: scheduleDateTime || "",
|
|
63
|
+
channel: channel || (custom == null ? void 0 : custom.channel) || "",
|
|
64
|
+
orderType: orderType || (custom == null ? void 0 : custom.orderType) || (custom == null ? void 0 : custom.order_type) || "",
|
|
65
|
+
// snake_case 与策略配置 field 对齐;customerId 保留兼容旧配置
|
|
66
|
+
customer_id: normalizedCustomerId,
|
|
67
|
+
customerId: normalizedCustomerId,
|
|
68
|
+
available_wallet_ids: normalizedAvailableWalletIds,
|
|
69
|
+
availableWalletIds: normalizedAvailableWalletIds,
|
|
70
|
+
business_code: resolvedBusinessCode
|
|
71
|
+
},
|
|
72
|
+
metadata: {
|
|
73
|
+
timestamp: Date.now()
|
|
74
|
+
}
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* 准备单商品上下文。
|
|
79
|
+
*
|
|
80
|
+
* 商品级条件只在当前商品 data_variants 引用到对应规则后才评估。
|
|
81
|
+
*/
|
|
82
|
+
prepareProductContext(businessData, product) {
|
|
83
|
+
const base = this.prepareGlobalContext(businessData);
|
|
84
|
+
const productValue = this.buildProductValue(product);
|
|
85
|
+
return {
|
|
86
|
+
...base,
|
|
87
|
+
entities: {
|
|
88
|
+
...base.entities,
|
|
89
|
+
currentProduct: product
|
|
90
|
+
},
|
|
91
|
+
attributes: {
|
|
92
|
+
...base.attributes,
|
|
93
|
+
product: productValue,
|
|
94
|
+
productIdAndVariantId: {
|
|
95
|
+
product_id: productValue.id,
|
|
96
|
+
product_variant_id: productValue.product_variant_id
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
transformResult(result) {
|
|
102
|
+
return result;
|
|
103
|
+
}
|
|
104
|
+
formatConfig(result, businessData) {
|
|
105
|
+
return { result, businessData };
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* 构建 menu_match 使用的轻量商品对象。
|
|
109
|
+
*
|
|
110
|
+
* collection_ids 来自商品 collection 字段,避免 operator 读取复杂商品对象。
|
|
111
|
+
*/
|
|
112
|
+
buildProductValue(product) {
|
|
113
|
+
const productId = this.toNumber(product.id ?? product.product_id);
|
|
114
|
+
const variantId = this.toNumber(
|
|
115
|
+
product.product_variant_id ?? product.variant_id
|
|
116
|
+
);
|
|
117
|
+
const collectionIds = Array.isArray(product.collection) ? product.collection.map((item) => this.toNumber(item == null ? void 0 : item.id)).filter((id) => id > 0) : [];
|
|
118
|
+
return {
|
|
119
|
+
id: productId,
|
|
120
|
+
product_variant_id: variantId,
|
|
121
|
+
collection_ids: collectionIds
|
|
122
|
+
};
|
|
123
|
+
}
|
|
124
|
+
toNumber(value) {
|
|
125
|
+
const parsed = Number(value);
|
|
126
|
+
return Number.isFinite(parsed) ? parsed : 0;
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* 归一化客户 id:无效值返回 undefined,有效值统一为 number。
|
|
130
|
+
*/
|
|
131
|
+
normalizeCustomerId(value) {
|
|
132
|
+
if (value === void 0 || value === null || value === "") {
|
|
133
|
+
return void 0;
|
|
134
|
+
}
|
|
135
|
+
const parsed = Number(value);
|
|
136
|
+
return Number.isFinite(parsed) && parsed > 0 ? parsed : void 0;
|
|
137
|
+
}
|
|
138
|
+
normalizeNumberArray(value) {
|
|
139
|
+
if (!Array.isArray(value))
|
|
140
|
+
return [];
|
|
141
|
+
const ids = value.map((item) => Number(item)).filter((item) => Number.isFinite(item) && item > 0);
|
|
142
|
+
return Array.from(new Set(ids));
|
|
143
|
+
}
|
|
144
|
+
};
|
|
145
|
+
var adapter_default = DataVariantAdapter;
|
|
146
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
147
|
+
0 && (module.exports = {
|
|
148
|
+
DataVariantAdapter
|
|
149
|
+
});
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
import type { ConditionRule, StrategyConfig } from '../../type';
|
|
2
|
+
import type { ConditionScope, DataVariantBusinessData, DataVariantMenu, DataVariantRuleMetadata, MenuScope, ResolvedDataVariantResult } from './type';
|
|
3
|
+
/**
|
|
4
|
+
* Data Variant 评估器。
|
|
5
|
+
*
|
|
6
|
+
* 当前阶段只提供策略模型能力和示例验证,不接入 ProductList 业务链路。
|
|
7
|
+
*/
|
|
8
|
+
export declare class DataVariantEvaluator {
|
|
9
|
+
private adapter;
|
|
10
|
+
private strategyConfigs;
|
|
11
|
+
constructor();
|
|
12
|
+
/**
|
|
13
|
+
* 设置策略配置列表,仅保留 metadata.type === 'data_variant' 的策略。
|
|
14
|
+
*/
|
|
15
|
+
setStrategyConfigs(configs: StrategyConfig[]): void;
|
|
16
|
+
getStrategyConfigs(): StrategyConfig<DataVariantRuleMetadata>[];
|
|
17
|
+
/**
|
|
18
|
+
* 批量解析商品 Data Variant。
|
|
19
|
+
*
|
|
20
|
+
* 先执行全局预计算,再只针对商品自身 data_variants 引用到的规则做商品级判断。
|
|
21
|
+
*/
|
|
22
|
+
resolveProducts(businessData: DataVariantBusinessData): ResolvedDataVariantResult;
|
|
23
|
+
/**
|
|
24
|
+
* 根据 operator/field 判断条件是否依赖当前商品。
|
|
25
|
+
*/
|
|
26
|
+
getConditionScope(rule: ConditionRule): ConditionScope;
|
|
27
|
+
/**
|
|
28
|
+
* 将餐牌 partyroom_package 预构建为 Map/Set 索引。
|
|
29
|
+
*/
|
|
30
|
+
buildMenuScopeMap(menuList: DataVariantMenu[]): Map<number, MenuScope>;
|
|
31
|
+
/**
|
|
32
|
+
* 从当前策略中所有 schedule_match.value 绑定的 schedule_id 提取时间点。
|
|
33
|
+
*
|
|
34
|
+
* 这里不依赖餐牌,只读取策略配置和调用方传入的 scheduleList。
|
|
35
|
+
*/
|
|
36
|
+
buildScheduleTimePoints(strategyConfigs: StrategyConfig<DataVariantRuleMetadata>[], scheduleList: NonNullable<DataVariantBusinessData['scheduleList']>): string[];
|
|
37
|
+
private buildGlobalEffectiveRuleMap;
|
|
38
|
+
private resolveProduct;
|
|
39
|
+
/**
|
|
40
|
+
* 解析套餐子商品上的 Data Variant 覆盖。
|
|
41
|
+
*
|
|
42
|
+
* bundle_item 以 bundle_product_id / bundle_variant_id 作为商品身份参与 product_match 等条件判断。
|
|
43
|
+
*/
|
|
44
|
+
private resolveProductBundleItems;
|
|
45
|
+
/**
|
|
46
|
+
* 将 bundle_item 转为 DataVariantProduct 并评估 data_variants。
|
|
47
|
+
*/
|
|
48
|
+
private resolveBundleItem;
|
|
49
|
+
/**
|
|
50
|
+
* bundle_item 的商品身份映射:bundle_product_id + bundle_variant_id。
|
|
51
|
+
*/
|
|
52
|
+
private toBundleItemDataVariantProduct;
|
|
53
|
+
/**
|
|
54
|
+
* 仅回写命中的字段,避免污染 bundle_item 的结构字段。
|
|
55
|
+
*/
|
|
56
|
+
private mergeBundleItemResolvedData;
|
|
57
|
+
private evaluateProductRules;
|
|
58
|
+
/**
|
|
59
|
+
* 拆分策略条件。
|
|
60
|
+
*
|
|
61
|
+
* 当前 MVP 支持顶层 and 原子条件拆分;复杂条件保守地放到商品级完整判断。
|
|
62
|
+
*/
|
|
63
|
+
private splitStrategyConfig;
|
|
64
|
+
private createEngine;
|
|
65
|
+
private evaluateScheduleMatch;
|
|
66
|
+
private evaluateMenuMatch;
|
|
67
|
+
private evaluateArrayIntersects;
|
|
68
|
+
private collectScheduleIdsFromStrategies;
|
|
69
|
+
private extractTimePointsFromSchedules;
|
|
70
|
+
private addDateTimePoint;
|
|
71
|
+
private addRawTimePoint;
|
|
72
|
+
private extractTimeFromDateTime;
|
|
73
|
+
private normalizeTime;
|
|
74
|
+
private timeToMinutes;
|
|
75
|
+
private isProductInMenuScope;
|
|
76
|
+
private mergeMatchedVariants;
|
|
77
|
+
private getProductDataVariants;
|
|
78
|
+
private normalizeStrategyConfigs;
|
|
79
|
+
private isStrategyActive;
|
|
80
|
+
private getStrategyPriority;
|
|
81
|
+
private createAlwaysTrueConditions;
|
|
82
|
+
private flattenConditionRules;
|
|
83
|
+
private isConditionGroup;
|
|
84
|
+
private normalizeNumberArray;
|
|
85
|
+
private normalizeComparableArray;
|
|
86
|
+
private buildProductKey;
|
|
87
|
+
private toNumber;
|
|
88
|
+
}
|
|
89
|
+
export default DataVariantEvaluator;
|