@pisell/pisellos 3.0.89 → 3.0.91
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/apis/picoding.d.ts +0 -0
- package/dist/apis/picoding.js +1 -0
- package/dist/model/index.d.ts +1 -0
- package/dist/model/index.js +1 -0
- package/dist/model/strategy/adapter/index.d.ts +7 -0
- package/dist/model/strategy/adapter/index.js +7 -0
- package/dist/model/strategy/adapter/itemRule/adapter.d.ts +67 -0
- package/dist/model/strategy/adapter/itemRule/adapter.js +483 -0
- package/dist/model/strategy/adapter/itemRule/evaluator.d.ts +43 -0
- package/dist/model/strategy/adapter/itemRule/evaluator.js +169 -0
- package/dist/model/strategy/adapter/itemRule/examples.d.ts +79 -0
- package/dist/model/strategy/adapter/itemRule/examples.js +382 -0
- package/dist/model/strategy/adapter/itemRule/index.d.ts +5 -0
- package/dist/model/strategy/adapter/itemRule/index.js +5 -0
- package/dist/model/strategy/adapter/itemRule/type.d.ts +225 -0
- package/dist/model/strategy/adapter/itemRule/type.js +101 -0
- package/dist/model/strategy/adapter/promotion/adapter.d.ts +66 -0
- package/dist/model/strategy/adapter/promotion/adapter.js +271 -0
- package/dist/model/strategy/adapter/promotion/evaluator.d.ts +213 -0
- package/dist/model/strategy/adapter/promotion/evaluator.js +1206 -0
- package/dist/model/strategy/adapter/promotion/examples.d.ts +138 -0
- package/dist/model/strategy/adapter/promotion/examples.js +166 -0
- package/dist/model/strategy/adapter/promotion/index.d.ts +4 -0
- package/dist/model/strategy/adapter/promotion/index.js +0 -0
- package/dist/model/strategy/adapter/promotion/type.d.ts +447 -0
- package/dist/model/strategy/adapter/promotion/type.js +209 -0
- package/dist/model/strategy/adapter/type.d.ts +28 -0
- package/dist/model/strategy/adapter/type.js +1 -0
- package/dist/model/strategy/adapter/walletPass/evaluator.d.ts +84 -0
- package/dist/model/strategy/adapter/walletPass/evaluator.js +502 -0
- package/dist/model/strategy/adapter/walletPass/example.d.ts +4 -0
- package/dist/model/strategy/adapter/walletPass/example.js +258 -0
- package/dist/model/strategy/adapter/walletPass/index.d.ts +32 -0
- package/dist/model/strategy/adapter/walletPass/index.js +182 -0
- package/dist/model/strategy/adapter/walletPass/locales.d.ts +1 -0
- package/dist/model/strategy/adapter/walletPass/locales.js +26 -0
- package/dist/model/strategy/adapter/walletPass/type.d.ts +187 -0
- package/dist/model/strategy/adapter/walletPass/type.js +1 -0
- package/dist/model/strategy/adapter/walletPass/utils.d.ts +50 -0
- package/dist/model/strategy/adapter/walletPass/utils.js +1104 -0
- package/dist/model/strategy/engine.d.ts +106 -0
- package/dist/model/strategy/engine.js +611 -0
- package/dist/model/strategy/index.d.ts +3 -0
- package/dist/model/strategy/index.js +8 -0
- package/dist/model/strategy/strategy-example.d.ts +5 -0
- package/dist/model/strategy/strategy-example.js +331 -0
- package/dist/model/strategy/type.d.ts +228 -0
- package/dist/model/strategy/type.js +94 -0
- package/dist/modules/Cart/utils/cartProduct.js +1 -0
- package/dist/modules/Discount/index.d.ts +4 -2
- package/dist/modules/Discount/index.js +90 -3
- package/dist/modules/Discount/types.d.ts +6 -0
- package/dist/modules/OpenData/index.d.ts +24 -0
- package/dist/modules/OpenData/index.js +173 -0
- package/dist/modules/OpenData/types.d.ts +73 -0
- package/dist/modules/OpenData/types.js +1 -0
- package/dist/modules/OpenData/utils.d.ts +2 -0
- package/dist/modules/OpenData/utils.js +75 -0
- package/dist/modules/Order/index.d.ts +66 -1
- package/dist/modules/Order/index.js +884 -10
- package/dist/modules/Order/types.d.ts +174 -12
- package/dist/modules/Order/types.js +2 -0
- package/dist/modules/Order/utils.d.ts +118 -0
- package/dist/modules/Order/utils.js +586 -2
- package/dist/modules/Product/utils.js +2 -2
- package/dist/modules/ProductList/index.d.ts +3 -1
- package/dist/modules/ProductList/index.js +19 -11
- package/dist/modules/Quotation/index.d.ts +48 -0
- package/dist/modules/Quotation/index.js +248 -0
- package/dist/modules/Quotation/types.d.ts +42 -0
- package/dist/modules/Quotation/types.js +1 -0
- package/dist/modules/Rules/index.js +17 -18
- package/dist/modules/SalesSummary/index.d.ts +63 -0
- package/dist/modules/SalesSummary/index.js +174 -0
- package/dist/modules/SalesSummary/types.d.ts +60 -0
- package/dist/modules/SalesSummary/types.js +1 -0
- package/dist/modules/SalesSummary/utils.d.ts +30 -0
- package/dist/modules/SalesSummary/utils.js +480 -0
- package/dist/modules/ScanOrderLogger/index.d.ts +23 -0
- package/dist/modules/ScanOrderLogger/index.js +174 -0
- package/dist/modules/ScanOrderLogger/providers/feishu.d.ts +2 -0
- package/dist/modules/ScanOrderLogger/providers/feishu.js +221 -0
- package/dist/modules/ScanOrderLogger/providers/grafana.d.ts +2 -0
- package/dist/modules/ScanOrderLogger/providers/grafana.js +50 -0
- package/dist/modules/ScanOrderLogger/types.d.ts +53 -0
- package/dist/modules/ScanOrderLogger/types.js +1 -0
- package/dist/modules/Schedule/getDateIsInSchedule.js +11 -18
- package/dist/modules/Schedule/utils.d.ts +1 -1
- package/dist/modules/Summary/utils.d.ts +3 -3
- package/dist/modules/Summary/utils.js +41 -31
- package/dist/modules/index.d.ts +4 -0
- package/dist/modules/index.js +5 -1
- package/dist/solution/BookingByStep/index.d.ts +3 -3
- package/dist/solution/BookingByStep/index.js +2 -1
- package/dist/solution/BookingByStep/types.d.ts +3 -1
- package/dist/solution/BookingByStep/types.js +5 -1
- package/dist/solution/ScanOrder/index.d.ts +158 -0
- package/dist/solution/ScanOrder/index.js +3474 -0
- package/dist/solution/ScanOrder/types.d.ts +306 -0
- package/dist/solution/ScanOrder/types.js +35 -0
- package/dist/solution/ScanOrder/utils.d.ts +172 -0
- package/dist/solution/ScanOrder/utils.js +796 -0
- package/dist/solution/ShopDiscount/index.d.ts +1 -0
- package/dist/solution/ShopDiscount/index.js +23 -18
- package/dist/solution/VenueBooking/index.d.ts +201 -0
- package/dist/solution/VenueBooking/index.js +3472 -0
- package/dist/solution/VenueBooking/sales-section-4-annotated.json +343 -0
- package/dist/solution/VenueBooking/types.d.ts +154 -0
- package/dist/solution/VenueBooking/types.js +21 -0
- package/dist/solution/VenueBooking/utils/dateSummary.d.ts +11 -0
- package/dist/solution/VenueBooking/utils/dateSummary.js +104 -0
- package/dist/solution/VenueBooking/utils/resource.d.ts +14 -0
- package/dist/solution/VenueBooking/utils/resource.js +131 -0
- package/dist/solution/VenueBooking/utils/slotMerge.d.ts +38 -0
- package/dist/solution/VenueBooking/utils/slotMerge.js +239 -0
- package/dist/solution/VenueBooking/utils/timeSlot.d.ts +32 -0
- package/dist/solution/VenueBooking/utils/timeSlot.js +453 -0
- package/dist/solution/VenueBooking/utils.d.ts +1 -0
- package/dist/solution/VenueBooking/utils.js +1 -0
- package/dist/solution/index.d.ts +2 -0
- package/dist/solution/index.js +3 -1
- package/lib/apis/picoding.d.ts +0 -0
- package/lib/apis/picoding.js +0 -0
- package/lib/model/index.d.ts +1 -0
- package/lib/model/index.js +23 -0
- package/lib/model/strategy/adapter/index.d.ts +7 -0
- package/lib/model/strategy/adapter/index.js +57 -0
- package/lib/model/strategy/adapter/itemRule/adapter.d.ts +67 -0
- package/lib/model/strategy/adapter/itemRule/adapter.js +377 -0
- package/lib/model/strategy/adapter/itemRule/evaluator.d.ts +43 -0
- package/lib/model/strategy/adapter/itemRule/evaluator.js +124 -0
- package/lib/model/strategy/adapter/itemRule/examples.d.ts +79 -0
- package/lib/model/strategy/adapter/itemRule/examples.js +316 -0
- package/lib/model/strategy/adapter/itemRule/index.d.ts +5 -0
- package/lib/model/strategy/adapter/itemRule/index.js +60 -0
- package/lib/model/strategy/adapter/itemRule/type.d.ts +225 -0
- package/lib/model/strategy/adapter/itemRule/type.js +46 -0
- package/lib/model/strategy/adapter/promotion/adapter.d.ts +66 -0
- package/lib/model/strategy/adapter/promotion/adapter.js +217 -0
- package/lib/model/strategy/adapter/promotion/evaluator.d.ts +213 -0
- package/lib/model/strategy/adapter/promotion/evaluator.js +844 -0
- package/lib/model/strategy/adapter/promotion/examples.d.ts +138 -0
- package/lib/model/strategy/adapter/promotion/examples.js +192 -0
- package/lib/model/strategy/adapter/promotion/index.d.ts +4 -0
- package/lib/model/strategy/adapter/promotion/index.js +0 -0
- package/lib/model/strategy/adapter/promotion/type.d.ts +447 -0
- package/lib/model/strategy/adapter/promotion/type.js +51 -0
- package/lib/model/strategy/adapter/type.d.ts +28 -0
- package/lib/model/strategy/adapter/type.js +17 -0
- package/lib/model/strategy/adapter/walletPass/evaluator.d.ts +84 -0
- package/lib/model/strategy/adapter/walletPass/evaluator.js +424 -0
- package/lib/model/strategy/adapter/walletPass/example.d.ts +4 -0
- package/lib/model/strategy/adapter/walletPass/example.js +207 -0
- package/lib/model/strategy/adapter/walletPass/index.d.ts +32 -0
- package/lib/model/strategy/adapter/walletPass/index.js +142 -0
- package/lib/model/strategy/adapter/walletPass/locales.d.ts +1 -0
- package/lib/model/strategy/adapter/walletPass/locales.js +54 -0
- package/lib/model/strategy/adapter/walletPass/type.d.ts +187 -0
- package/lib/model/strategy/adapter/walletPass/type.js +17 -0
- package/lib/model/strategy/adapter/walletPass/utils.d.ts +50 -0
- package/lib/model/strategy/adapter/walletPass/utils.js +791 -0
- package/lib/model/strategy/engine.d.ts +106 -0
- package/lib/model/strategy/engine.js +450 -0
- package/lib/model/strategy/index.d.ts +3 -0
- package/lib/model/strategy/index.js +38 -0
- package/lib/model/strategy/strategy-example.d.ts +5 -0
- package/lib/model/strategy/strategy-example.js +318 -0
- package/lib/model/strategy/type.d.ts +228 -0
- package/lib/model/strategy/type.js +44 -0
- package/lib/modules/Cart/utils/cartProduct.js +1 -0
- package/lib/modules/Discount/index.d.ts +4 -2
- package/lib/modules/Discount/index.js +60 -2
- package/lib/modules/Discount/types.d.ts +6 -0
- package/lib/modules/OpenData/index.d.ts +24 -0
- package/lib/modules/OpenData/index.js +119 -0
- package/lib/modules/OpenData/types.d.ts +73 -0
- package/lib/modules/OpenData/types.js +17 -0
- package/lib/modules/OpenData/utils.d.ts +2 -0
- package/lib/modules/OpenData/utils.js +111 -0
- package/lib/modules/Order/index.d.ts +66 -1
- package/lib/modules/Order/index.js +525 -0
- package/lib/modules/Order/types.d.ts +174 -12
- package/lib/modules/Order/utils.d.ts +118 -0
- package/lib/modules/Order/utils.js +483 -2
- package/lib/modules/Product/utils.js +2 -2
- package/lib/modules/ProductList/index.d.ts +3 -1
- package/lib/modules/ProductList/index.js +45 -34
- package/lib/modules/Quotation/index.d.ts +48 -0
- package/lib/modules/Quotation/index.js +152 -0
- package/lib/modules/Quotation/types.d.ts +42 -0
- package/lib/modules/Quotation/types.js +17 -0
- package/lib/modules/Rules/index.js +17 -18
- package/lib/modules/SalesSummary/index.d.ts +63 -0
- package/lib/modules/SalesSummary/index.js +105 -0
- package/lib/modules/SalesSummary/types.d.ts +60 -0
- package/lib/modules/SalesSummary/types.js +17 -0
- package/lib/modules/SalesSummary/utils.d.ts +30 -0
- package/lib/modules/SalesSummary/utils.js +420 -0
- package/lib/modules/ScanOrderLogger/index.d.ts +23 -0
- package/lib/modules/ScanOrderLogger/index.js +147 -0
- package/lib/modules/ScanOrderLogger/providers/feishu.d.ts +2 -0
- package/lib/modules/ScanOrderLogger/providers/feishu.js +157 -0
- package/lib/modules/ScanOrderLogger/providers/grafana.d.ts +2 -0
- package/lib/modules/ScanOrderLogger/providers/grafana.js +52 -0
- package/lib/modules/ScanOrderLogger/types.d.ts +53 -0
- package/lib/modules/ScanOrderLogger/types.js +17 -0
- package/lib/modules/Schedule/getDateIsInSchedule.js +9 -11
- package/lib/modules/Schedule/utils.d.ts +1 -1
- package/lib/modules/Summary/utils.d.ts +3 -3
- package/lib/modules/Summary/utils.js +22 -16
- package/lib/modules/index.d.ts +4 -0
- package/lib/modules/index.js +9 -1
- package/lib/solution/BookingByStep/index.d.ts +3 -3
- package/lib/solution/BookingByStep/index.js +2 -2
- package/lib/solution/BookingByStep/types.d.ts +3 -1
- package/lib/solution/BookingByStep/types.js +10 -0
- package/lib/solution/ScanOrder/index.d.ts +158 -0
- package/lib/solution/ScanOrder/index.js +2135 -0
- package/lib/solution/ScanOrder/types.d.ts +306 -0
- package/lib/solution/ScanOrder/types.js +36 -0
- package/lib/solution/ScanOrder/utils.d.ts +172 -0
- package/lib/solution/ScanOrder/utils.js +658 -0
- package/lib/solution/ShopDiscount/index.d.ts +1 -0
- package/lib/solution/ShopDiscount/index.js +4 -2
- package/lib/solution/VenueBooking/index.d.ts +201 -0
- package/lib/solution/VenueBooking/index.js +1937 -0
- package/lib/solution/VenueBooking/sales-section-4-annotated.json +343 -0
- package/lib/solution/VenueBooking/types.d.ts +154 -0
- package/lib/solution/VenueBooking/types.js +44 -0
- package/lib/solution/VenueBooking/utils/dateSummary.d.ts +11 -0
- package/lib/solution/VenueBooking/utils/dateSummary.js +110 -0
- package/lib/solution/VenueBooking/utils/resource.d.ts +14 -0
- package/lib/solution/VenueBooking/utils/resource.js +92 -0
- package/lib/solution/VenueBooking/utils/slotMerge.d.ts +38 -0
- package/lib/solution/VenueBooking/utils/slotMerge.js +237 -0
- package/lib/solution/VenueBooking/utils/timeSlot.d.ts +32 -0
- package/lib/solution/VenueBooking/utils/timeSlot.js +339 -0
- package/lib/solution/VenueBooking/utils.d.ts +1 -0
- package/lib/solution/VenueBooking/utils.js +69 -0
- package/lib/solution/index.d.ts +2 -0
- package/lib/solution/index.js +5 -1
- package/package.json +1 -1
|
@@ -1,10 +1,217 @@
|
|
|
1
|
+
var _excluded = ["_origin", "identity_key"],
|
|
2
|
+
_excluded2 = ["created_at", "summary", "surcharges"],
|
|
3
|
+
_excluded3 = ["collect_pax", "table_occupancy_duration"];
|
|
4
|
+
function _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }
|
|
5
|
+
function _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }
|
|
6
|
+
function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
|
|
1
7
|
function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); }
|
|
2
8
|
function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
|
|
3
|
-
function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
|
|
4
9
|
function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter); }
|
|
5
10
|
function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); }
|
|
11
|
+
function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
|
|
12
|
+
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
|
|
13
|
+
function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
|
|
14
|
+
function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : String(i); }
|
|
15
|
+
function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
|
|
16
|
+
function _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it.return != null) it.return(); } finally { if (didErr) throw err; } } }; }
|
|
17
|
+
function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
|
|
6
18
|
function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; }
|
|
7
19
|
import dayjs from "dayjs";
|
|
20
|
+
import Decimal from 'decimal.js';
|
|
21
|
+
import { buildProductLineFingerprint, createEmptySummary } from "../../solution/ScanOrder/utils";
|
|
22
|
+
/**
|
|
23
|
+
* 把"含 option 的主商品单价"与 bundle 合成"单行 composite 单价"。
|
|
24
|
+
*
|
|
25
|
+
* 新语义 v2 约定:
|
|
26
|
+
* - `mainPrice` 必须是**已经包含 option 的主商品单价**(即 `metadata.main_product_selling_price`
|
|
27
|
+
* 或 `metadata.main_product_original_price`),option 价格不由本函数叠加。
|
|
28
|
+
* - 套餐价:Σ((bundle.bundle_selling_price ?? bundle.price) × (bundle.num ?? bundle.quantity ?? 1))
|
|
29
|
+
* 当 `useOriginalBundle=true` 时,改用 `bundle.original_price ?? bundle.product_price ?? bundle.price`。
|
|
30
|
+
* - 返回值:保留 2 位小数的字符串,方便直接写回 `selling_price` / `original_price` 字段。
|
|
31
|
+
*
|
|
32
|
+
* 被 `normalizeOrderProduct`、Rules setProduct 钩子、各 Solution 的 setDiscountSelected 共用,
|
|
33
|
+
* 保证合成逻辑单点来源。
|
|
34
|
+
*/
|
|
35
|
+
export function composeLinePrice(params) {
|
|
36
|
+
var mainPrice = params.mainPrice,
|
|
37
|
+
bundle = params.bundle,
|
|
38
|
+
useOriginalBundle = params.useOriginalBundle;
|
|
39
|
+
var total = new Decimal(Number(mainPrice) || 0);
|
|
40
|
+
if (Array.isArray(bundle)) {
|
|
41
|
+
var _iterator = _createForOfIteratorHelper(bundle),
|
|
42
|
+
_step;
|
|
43
|
+
try {
|
|
44
|
+
for (_iterator.s(); !(_step = _iterator.n()).done;) {
|
|
45
|
+
var _ref, _item$original_price, _item$bundle_selling_, _ref2, _item$num;
|
|
46
|
+
var item = _step.value;
|
|
47
|
+
var rawPrice = useOriginalBundle ? (_ref = (_item$original_price = item === null || item === void 0 ? void 0 : item.original_price) !== null && _item$original_price !== void 0 ? _item$original_price : item === null || item === void 0 ? void 0 : item.product_price) !== null && _ref !== void 0 ? _ref : item === null || item === void 0 ? void 0 : item.price : (_item$bundle_selling_ = item === null || item === void 0 ? void 0 : item.bundle_selling_price) !== null && _item$bundle_selling_ !== void 0 ? _item$bundle_selling_ : item === null || item === void 0 ? void 0 : item.price;
|
|
48
|
+
var price = new Decimal(Number(rawPrice) || 0);
|
|
49
|
+
var rawNum = (_ref2 = (_item$num = item === null || item === void 0 ? void 0 : item.num) !== null && _item$num !== void 0 ? _item$num : item === null || item === void 0 ? void 0 : item.quantity) !== null && _ref2 !== void 0 ? _ref2 : 1;
|
|
50
|
+
var num = new Decimal(Number(rawNum) || 0);
|
|
51
|
+
total = total.plus(price.times(num));
|
|
52
|
+
}
|
|
53
|
+
} catch (err) {
|
|
54
|
+
_iterator.e(err);
|
|
55
|
+
} finally {
|
|
56
|
+
_iterator.f();
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
return total.toDecimalPlaces(2).toFixed(2);
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
/**
|
|
63
|
+
* 计算 option 单价合计:Σ(option.price × option.num)。
|
|
64
|
+
* 在新语义 v2 下,main_product_original_price = source_product_price + 本函数结果。
|
|
65
|
+
*/
|
|
66
|
+
export function sumOptionUnitPrice(options) {
|
|
67
|
+
var total = new Decimal(0);
|
|
68
|
+
if (!Array.isArray(options)) return total;
|
|
69
|
+
var _iterator2 = _createForOfIteratorHelper(options),
|
|
70
|
+
_step2;
|
|
71
|
+
try {
|
|
72
|
+
for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
|
|
73
|
+
var opt = _step2.value;
|
|
74
|
+
var price = new Decimal(Number(opt === null || opt === void 0 ? void 0 : opt.price) || 0);
|
|
75
|
+
var num = new Decimal(Number(opt === null || opt === void 0 ? void 0 : opt.num) || 0);
|
|
76
|
+
total = total.plus(price.times(num));
|
|
77
|
+
}
|
|
78
|
+
} catch (err) {
|
|
79
|
+
_iterator2.e(err);
|
|
80
|
+
} finally {
|
|
81
|
+
_iterator2.f();
|
|
82
|
+
}
|
|
83
|
+
return total;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
/**
|
|
87
|
+
* OrderModule 默认 Rules 钩子工厂。
|
|
88
|
+
*
|
|
89
|
+
* 价格语义约定(订单域,v2 composite 口径):
|
|
90
|
+
* - `selling_price`:券后 **行 composite 单价**
|
|
91
|
+
* = `metadata.main_product_selling_price` + Σ(bundle_selling_price × num)。
|
|
92
|
+
* - `original_price`:券前 **行 composite 单价**
|
|
93
|
+
* = `metadata.main_product_original_price` + Σ(bundle 原价 × num)。
|
|
94
|
+
* - `metadata.source_product_price`:主商品/variant 基础价(已应用报价单),不含 option、
|
|
95
|
+
* 不含折扣。**权威源**。
|
|
96
|
+
* - `metadata.main_product_original_price` = source + Σ(option.price × option.num)(含 option、不含折扣)。
|
|
97
|
+
* - `metadata.main_product_selling_price` = main_original − 主商品券 per-unit amount(含 option、含折扣)。
|
|
98
|
+
* - `payment_price`:出站 payload 中由 `selling_price` 派生以兼容后端(composite)。
|
|
99
|
+
*
|
|
100
|
+
* Rules 钩子契约(hook_adapt 方案,Rules 内部保持不变):
|
|
101
|
+
* - `getProduct.price` / `getProduct.original_price` 回传 **source-level 主价**
|
|
102
|
+
* (`metadata.source_product_price`)。Rules 内部 `getProductTotalPrice` /
|
|
103
|
+
* `getProductOriginTotalPrice` 会自行叠加 option + bundle,喂 source 可避免 option 双加。
|
|
104
|
+
* - `getProduct.total` = `selling_price × num`(行 composite × num),与 Rules 内部产出的
|
|
105
|
+
* total(source + option + bundle)对齐。
|
|
106
|
+
* - `setProduct` 反向流程:把 Rules 返回的 source-level `main_product_selling_price` / `price`
|
|
107
|
+
* 加回 Σoptions,重新合成含 option 的 main_product_* 并派生 composite。
|
|
108
|
+
* 优先级:
|
|
109
|
+
* 1. `values.main_product_selling_price`(券应用分支,per-unit 券后 source-level 主价)
|
|
110
|
+
* 2. `values.price`(还原分支 `restoredPrice`、good_pass 归零)
|
|
111
|
+
* 3. `values.total / num`(仅当 Rules 只给出总价时的兜底)
|
|
112
|
+
*
|
|
113
|
+
* 导出为纯函数方便单测直接驱动钩子,不依赖 OrderModule 实例。
|
|
114
|
+
*/
|
|
115
|
+
export function createDefaultOrderRulesHooks() {
|
|
116
|
+
var toUnitPriceString = function toUnitPriceString(totalLike, num) {
|
|
117
|
+
var effectiveNum = Number(num) > 0 ? Number(num) : 1;
|
|
118
|
+
return new Decimal(Number(totalLike) || 0).dividedBy(effectiveNum).toDecimalPlaces(2).toString();
|
|
119
|
+
};
|
|
120
|
+
return {
|
|
121
|
+
getProduct: function getProduct(product) {
|
|
122
|
+
var _product$_origin, _product$_origin2, _product$_origin3, _product$_origin4;
|
|
123
|
+
// source_product_price 是权威源;兜底链:source → mainSelling − options(反推)→ 行 selling_price
|
|
124
|
+
var metadataAny = product.metadata || {};
|
|
125
|
+
var optionSum = sumOptionUnitPrice(product.product_option_item);
|
|
126
|
+
var sourcePrice;
|
|
127
|
+
if (metadataAny.source_product_price !== undefined) {
|
|
128
|
+
sourcePrice = String(metadataAny.source_product_price);
|
|
129
|
+
} else if (metadataAny.main_product_selling_price !== undefined) {
|
|
130
|
+
sourcePrice = new Decimal(Number(metadataAny.main_product_selling_price) || 0).minus(optionSum).toDecimalPlaces(2).toString();
|
|
131
|
+
} else {
|
|
132
|
+
var _product$selling_pric;
|
|
133
|
+
sourcePrice = String((_product$selling_pric = product.selling_price) !== null && _product$selling_pric !== void 0 ? _product$selling_pric : 0);
|
|
134
|
+
}
|
|
135
|
+
var sourceOriginalPrice;
|
|
136
|
+
if (metadataAny.source_product_price !== undefined) {
|
|
137
|
+
sourceOriginalPrice = String(metadataAny.source_product_price);
|
|
138
|
+
} else if (metadataAny.main_product_original_price !== undefined) {
|
|
139
|
+
sourceOriginalPrice = new Decimal(Number(metadataAny.main_product_original_price) || 0).minus(optionSum).toDecimalPlaces(2).toString();
|
|
140
|
+
} else {
|
|
141
|
+
sourceOriginalPrice = sourcePrice;
|
|
142
|
+
}
|
|
143
|
+
return {
|
|
144
|
+
id: product.product_id,
|
|
145
|
+
// Rules 引擎用 _id 作为 processedProductsMap 键;必须与购物车行级 identity 一致,
|
|
146
|
+
// 否则同 SKU 不同小料会在 calcDiscount 重组时互相覆盖。
|
|
147
|
+
// 不透明 identity 契约下,normalizeOrderProduct / restoreTempOrderFromStorage 已保证 identity_key 必存在;
|
|
148
|
+
// 留 fingerprint 分支仅作 Rules 单测里直接传裸 product 时的兜底。
|
|
149
|
+
_id: product.identity_key ? "".concat(product.product_id, "_").concat(product.product_variant_id, "_").concat(product.identity_key) : "".concat(product.product_id, "_").concat(product.product_variant_id, "_").concat(buildProductLineFingerprint(product.product_option_item, product.product_bundle)),
|
|
150
|
+
// Rules 内部 getProductTotalPrice / getProductOriginTotalPrice 会各自再叠加 bundle + option,
|
|
151
|
+
// 所以这里必须喂 source-level(不含 option、不含 bundle、不含折扣)单价,避免双加 option。
|
|
152
|
+
price: sourcePrice,
|
|
153
|
+
// total / origin_total 使用 composite × num,跟 Rules 内部产出的 total 对齐(含 option + bundle)。
|
|
154
|
+
total: new Decimal(product.selling_price || 0).times(product.num || 1).toNumber(),
|
|
155
|
+
origin_total: new Decimal(product.original_price || product.selling_price || 0).times(product.num || 1).toNumber(),
|
|
156
|
+
original_price: sourceOriginalPrice,
|
|
157
|
+
quantity: product.num || 1,
|
|
158
|
+
num: product.num || 1,
|
|
159
|
+
discount_list: product.discount_list || [],
|
|
160
|
+
bundle: product.product_bundle || [],
|
|
161
|
+
booking_id: ((_product$_origin = product._origin) === null || _product$_origin === void 0 ? void 0 : _product$_origin.booking_id) || null,
|
|
162
|
+
isClient: false,
|
|
163
|
+
isManualDiscount: ((_product$_origin2 = product._origin) === null || _product$_origin2 === void 0 ? void 0 : _product$_origin2.isManualDiscount) || false,
|
|
164
|
+
holder_id: (_product$_origin3 = product._origin) === null || _product$_origin3 === void 0 ? void 0 : _product$_origin3.holder_id,
|
|
165
|
+
startDate: (_product$_origin4 = product._origin) === null || _product$_origin4 === void 0 ? void 0 : _product$_origin4.startDate
|
|
166
|
+
};
|
|
167
|
+
},
|
|
168
|
+
setProduct: function setProduct(product, values) {
|
|
169
|
+
var _ref3, _values$quantity, _ref4, _metadataAny$source_p, _values$bundle, _values$discount_list, _values$quantity2;
|
|
170
|
+
var nextNum = Number((_ref3 = (_values$quantity = values.quantity) !== null && _values$quantity !== void 0 ? _values$quantity : product.num) !== null && _ref3 !== void 0 ? _ref3 : 1) || 1;
|
|
171
|
+
var metadataAny = product.metadata || {};
|
|
172
|
+
var existedSource = (_ref4 = (_metadataAny$source_p = metadataAny.source_product_price) !== null && _metadataAny$source_p !== void 0 ? _metadataAny$source_p : product.selling_price) !== null && _ref4 !== void 0 ? _ref4 : '0';
|
|
173
|
+
var nextOptions = product.product_option_item;
|
|
174
|
+
var optionSum = sumOptionUnitPrice(nextOptions);
|
|
175
|
+
|
|
176
|
+
// Rules 返回的 main_product_selling_price / price / total 均为 source-level。
|
|
177
|
+
// 优先级:main_product_selling_price(per-unit 券后 source)> price(还原/good_pass 分支)>
|
|
178
|
+
// total/num(仅当 Rules 只给 total 时的兜底)> 保留当前 source。
|
|
179
|
+
var nextSourceSellingPrice = values.main_product_selling_price !== undefined ? String(values.main_product_selling_price) : values.price !== undefined ? String(values.price) : values.total !== undefined ? toUnitPriceString(values.total, nextNum) : String(existedSource);
|
|
180
|
+
|
|
181
|
+
// 券前 source:values.original_price 是 source-level(Rules 层本就不含 option),
|
|
182
|
+
// 缺省时保留现有 source(券前 = 当前 source)。
|
|
183
|
+
var nextSourceOriginalPrice = values.original_price !== undefined ? String(values.original_price) : String(existedSource);
|
|
184
|
+
|
|
185
|
+
// 含 option 的 main_product_*
|
|
186
|
+
var nextMainSellingPrice = new Decimal(Number(nextSourceSellingPrice) || 0).plus(optionSum).toDecimalPlaces(2).toFixed(2);
|
|
187
|
+
var nextMainOriginalPrice = new Decimal(Number(nextSourceOriginalPrice) || 0).plus(optionSum).toDecimalPlaces(2).toFixed(2);
|
|
188
|
+
var nextBundle = (_values$bundle = values.bundle) !== null && _values$bundle !== void 0 ? _values$bundle : product.product_bundle;
|
|
189
|
+
var composedSellingPrice = composeLinePrice({
|
|
190
|
+
mainPrice: nextMainSellingPrice,
|
|
191
|
+
bundle: nextBundle
|
|
192
|
+
});
|
|
193
|
+
var composedOriginalPrice = composeLinePrice({
|
|
194
|
+
mainPrice: nextMainOriginalPrice,
|
|
195
|
+
bundle: nextBundle,
|
|
196
|
+
useOriginalBundle: true
|
|
197
|
+
});
|
|
198
|
+
return _objectSpread(_objectSpread({}, product), {}, {
|
|
199
|
+
selling_price: composedSellingPrice,
|
|
200
|
+
original_price: composedOriginalPrice,
|
|
201
|
+
discount_list: (_values$discount_list = values.discount_list) !== null && _values$discount_list !== void 0 ? _values$discount_list : product.discount_list,
|
|
202
|
+
num: (_values$quantity2 = values.quantity) !== null && _values$quantity2 !== void 0 ? _values$quantity2 : product.num,
|
|
203
|
+
product_bundle: nextBundle,
|
|
204
|
+
metadata: _objectSpread(_objectSpread({}, metadataAny), {}, {
|
|
205
|
+
source_product_price: nextSourceOriginalPrice,
|
|
206
|
+
main_product_selling_price: nextMainSellingPrice,
|
|
207
|
+
main_product_original_price: nextMainOriginalPrice,
|
|
208
|
+
price_schema_version: 2
|
|
209
|
+
})
|
|
210
|
+
});
|
|
211
|
+
}
|
|
212
|
+
};
|
|
213
|
+
}
|
|
214
|
+
|
|
8
215
|
/**
|
|
9
216
|
* 通过 session 类商品的开始时间结束时间生成商品的时长
|
|
10
217
|
* @param {CartItem} cartItem
|
|
@@ -60,4 +267,381 @@ export var getAllDiscountList = function getAllDiscountList(cartItem) {
|
|
|
60
267
|
item.discount_list = undefined;
|
|
61
268
|
});
|
|
62
269
|
return discountList;
|
|
63
|
-
};
|
|
270
|
+
};
|
|
271
|
+
|
|
272
|
+
// ─── 以下为从 ScanOrder/utils.ts 迁入的 Order 专属工具函数 ───
|
|
273
|
+
|
|
274
|
+
export function createUuidV4() {
|
|
275
|
+
var template = 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx';
|
|
276
|
+
return template.replace(/[xy]/g, function (char) {
|
|
277
|
+
var randomValue = Math.floor(Math.random() * 16);
|
|
278
|
+
var value = char === 'x' ? randomValue : randomValue & 0x3 | 0x8;
|
|
279
|
+
return value.toString(16);
|
|
280
|
+
});
|
|
281
|
+
}
|
|
282
|
+
export function isTempOrder(data) {
|
|
283
|
+
if (!data || _typeof(data) !== 'object') return false;
|
|
284
|
+
if (!Array.isArray(data.products)) return false;
|
|
285
|
+
return true;
|
|
286
|
+
}
|
|
287
|
+
export function formatDateTime(date) {
|
|
288
|
+
var pad = function pad(value) {
|
|
289
|
+
return value.toString().padStart(2, '0');
|
|
290
|
+
};
|
|
291
|
+
var year = date.getFullYear();
|
|
292
|
+
var month = pad(date.getMonth() + 1);
|
|
293
|
+
var day = pad(date.getDate());
|
|
294
|
+
var hours = pad(date.getHours());
|
|
295
|
+
var minutes = pad(date.getMinutes());
|
|
296
|
+
var seconds = pad(date.getSeconds());
|
|
297
|
+
return "".concat(year, "-").concat(month, "-").concat(day, " ").concat(hours, ":").concat(minutes, ":").concat(seconds);
|
|
298
|
+
}
|
|
299
|
+
function normalizeSubmitPlatform(platform) {
|
|
300
|
+
return (platform === null || platform === void 0 ? void 0 : platform.toLowerCase()) === 'pc' ? 'PC' : 'H5';
|
|
301
|
+
}
|
|
302
|
+
|
|
303
|
+
// 出站重命名:后端 checkout 协议字段 option_group_item_id;
|
|
304
|
+
// tempOrder / UI 运行时一律使用 product_option_item_id。仅保留后端契约字段,
|
|
305
|
+
// 与 src/modules/Cart/utils/cartProduct.ts#formatOptionsToOrigin 形状一致。
|
|
306
|
+
function formatSubmitOptionItems(options) {
|
|
307
|
+
if (!Array.isArray(options)) return [];
|
|
308
|
+
return options.map(function (d) {
|
|
309
|
+
var _d$option_group_item_;
|
|
310
|
+
return {
|
|
311
|
+
num: d === null || d === void 0 ? void 0 : d.num,
|
|
312
|
+
option_group_item_id: (_d$option_group_item_ = d === null || d === void 0 ? void 0 : d.option_group_item_id) !== null && _d$option_group_item_ !== void 0 ? _d$option_group_item_ : d === null || d === void 0 ? void 0 : d.product_option_item_id,
|
|
313
|
+
option_group_id: d === null || d === void 0 ? void 0 : d.option_group_id
|
|
314
|
+
};
|
|
315
|
+
});
|
|
316
|
+
}
|
|
317
|
+
function toBundleNumber(value) {
|
|
318
|
+
var fallback = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;
|
|
319
|
+
var parsed = Number(value);
|
|
320
|
+
return Number.isFinite(parsed) ? parsed : fallback;
|
|
321
|
+
}
|
|
322
|
+
function toBundleCustomPriceString(value) {
|
|
323
|
+
var parsed = Number(value);
|
|
324
|
+
if (Number.isFinite(parsed)) return parsed.toFixed(2);
|
|
325
|
+
if (value === null || value === undefined || value === '') return '0.00';
|
|
326
|
+
return String(value);
|
|
327
|
+
}
|
|
328
|
+
|
|
329
|
+
// 出站补齐:以 additive 方式把 bundle 项补足为后端 checkout 协议所需的形状,
|
|
330
|
+
// 同时把 Summary / Rules 运行时写到 bundle 顶层的 surcharge_fee / relation_surcharge_ids
|
|
331
|
+
// 和来自 _origin 的 product_discount_difference 汇总到 metadata。
|
|
332
|
+
// 保留原对象上已有字段(如 discount_list、metadata.custom_product_bundle_map_id)
|
|
333
|
+
// 以兼容运行时 bundle 归一化、Rules、Summary 的消费。
|
|
334
|
+
function formatSubmitBundleItems(bundle) {
|
|
335
|
+
if (!Array.isArray(bundle)) return [];
|
|
336
|
+
return bundle.map(function (b) {
|
|
337
|
+
var _rawBundle$bundle_sel, _rawBundle$price_type, _rawBundle$surcharge_, _rawBundle$is_charge_, _rawBundle$bundle_var, _rawBundle$extension_, _rawBundle$extension_2, _rawBundle$price_type2, _ref5, _rawBundle$custom_pri;
|
|
338
|
+
var rawBundle = b && _typeof(b) === 'object' ? b : {};
|
|
339
|
+
var existedMetadata = rawBundle.metadata && _typeof(rawBundle.metadata) === 'object' ? rawBundle.metadata : {};
|
|
340
|
+
var sellingPriceNum = toBundleNumber((_rawBundle$bundle_sel = rawBundle.bundle_selling_price) !== null && _rawBundle$bundle_sel !== void 0 ? _rawBundle$bundle_sel : rawBundle.price, 0);
|
|
341
|
+
var priceNum = toBundleNumber(rawBundle.price, sellingPriceNum);
|
|
342
|
+
var priceType = (_rawBundle$price_type = rawBundle.price_type) !== null && _rawBundle$price_type !== void 0 ? _rawBundle$price_type : '';
|
|
343
|
+
// const customPriceStr = toBundleCustomPriceString(
|
|
344
|
+
// rawBundle.custom_price ?? rawBundle.bundle_selling_price ?? rawBundle.price,
|
|
345
|
+
// );
|
|
346
|
+
|
|
347
|
+
var relationSurchargeIds = Array.isArray(rawBundle.relation_surcharge_ids) ? rawBundle.relation_surcharge_ids : Array.isArray(existedMetadata.relation_surcharge_ids) ? existedMetadata.relation_surcharge_ids : [];
|
|
348
|
+
var surchargeFee = toBundleNumber((_rawBundle$surcharge_ = rawBundle.surcharge_fee) !== null && _rawBundle$surcharge_ !== void 0 ? _rawBundle$surcharge_ : existedMetadata.surcharge_fee, 0);
|
|
349
|
+
var productDiscountDifference = toBundleNumber(existedMetadata.product_discount_difference, 0);
|
|
350
|
+
return _objectSpread(_objectSpread({}, rawBundle), {}, {
|
|
351
|
+
is_charge_tax: (_rawBundle$is_charge_ = rawBundle.is_charge_tax) !== null && _rawBundle$is_charge_ !== void 0 ? _rawBundle$is_charge_ : 0,
|
|
352
|
+
tax_fee: toBundleNumber(rawBundle.tax_fee, 0),
|
|
353
|
+
bundle_variant_id: (_rawBundle$bundle_var = rawBundle.bundle_variant_id) !== null && _rawBundle$bundle_var !== void 0 ? _rawBundle$bundle_var : 0,
|
|
354
|
+
num: toBundleNumber(rawBundle.num, 1),
|
|
355
|
+
extension_id: (_rawBundle$extension_ = rawBundle.extension_id) !== null && _rawBundle$extension_ !== void 0 ? _rawBundle$extension_ : 0,
|
|
356
|
+
extension_type: (_rawBundle$extension_2 = rawBundle.extension_type) !== null && _rawBundle$extension_2 !== void 0 ? _rawBundle$extension_2 : 'normal',
|
|
357
|
+
price: priceNum,
|
|
358
|
+
price_type: priceType,
|
|
359
|
+
price_type_ext: (_rawBundle$price_type2 = rawBundle.price_type_ext) !== null && _rawBundle$price_type2 !== void 0 ? _rawBundle$price_type2 : '',
|
|
360
|
+
// custom_price: customPriceStr,
|
|
361
|
+
custom_price_type: (_ref5 = (_rawBundle$custom_pri = rawBundle.custom_price_type) !== null && _rawBundle$custom_pri !== void 0 ? _rawBundle$custom_pri : priceType) !== null && _ref5 !== void 0 ? _ref5 : '',
|
|
362
|
+
bundle_selling_price: sellingPriceNum,
|
|
363
|
+
option: formatSubmitOptionItems(rawBundle.option),
|
|
364
|
+
bundle_group_id: rawBundle === null || rawBundle === void 0 ? void 0 : rawBundle.group_id,
|
|
365
|
+
bundle_id: rawBundle === null || rawBundle === void 0 ? void 0 : rawBundle.id,
|
|
366
|
+
metadata: _objectSpread(_objectSpread({}, existedMetadata), {}, {
|
|
367
|
+
surcharge_fee: surchargeFee,
|
|
368
|
+
relation_surcharge_ids: relationSurchargeIds,
|
|
369
|
+
product_discount_difference: productDiscountDifference
|
|
370
|
+
})
|
|
371
|
+
});
|
|
372
|
+
});
|
|
373
|
+
}
|
|
374
|
+
|
|
375
|
+
/**
|
|
376
|
+
* 把 tempOrder product 打包成出站 submit payload。
|
|
377
|
+
*
|
|
378
|
+
* 价格字段语义(出站口径,v2 composite):
|
|
379
|
+
* - `selling_price`:**行 composite 券后单价**
|
|
380
|
+
* = `metadata.main_product_selling_price` + Σ(bundle_selling_price × num)。
|
|
381
|
+
* - `original_price`:**行 composite 券前单价**
|
|
382
|
+
* = `metadata.main_product_original_price` + Σ(bundle 原价 × num)。
|
|
383
|
+
* - `payment_price`:兼容后端的出站字段,直接从 `selling_price` 派生(composite)。
|
|
384
|
+
* - `metadata.source_product_price`:主商品/variant 基础价(不含 option、不含折扣),权威源。
|
|
385
|
+
* - `metadata.main_product_original_price`:含 option、不含折扣。
|
|
386
|
+
* - `metadata.main_product_selling_price`:含 option、含主商品折扣。
|
|
387
|
+
* - `metadata.price_schema_version`:schema 版本号(当前 = 2),用于跨端协商价格口径。
|
|
388
|
+
*
|
|
389
|
+
* 本函数不再改造价格字段形状,仅做字段/metadata 裁剪。
|
|
390
|
+
*/
|
|
391
|
+
function normalizeSubmitProduct(product) {
|
|
392
|
+
var _origin = product._origin,
|
|
393
|
+
identity_key = product.identity_key,
|
|
394
|
+
submitProduct = _objectWithoutProperties(product, _excluded);
|
|
395
|
+
var rawMetadata = submitProduct.metadata || {};
|
|
396
|
+
var bookingUid = rawMetadata.booking_uid;
|
|
397
|
+
var cleanMetadata = {};
|
|
398
|
+
if (rawMetadata.unique_identification_number) {
|
|
399
|
+
cleanMetadata.unique_identification_number = rawMetadata.unique_identification_number;
|
|
400
|
+
}
|
|
401
|
+
var priceMetaKeys = ['main_product_original_price', 'main_product_selling_price', 'source_product_price', 'price_schema_version'];
|
|
402
|
+
for (var _i = 0, _priceMetaKeys = priceMetaKeys; _i < _priceMetaKeys.length; _i++) {
|
|
403
|
+
var key = _priceMetaKeys[_i];
|
|
404
|
+
if (rawMetadata[key] !== undefined) {
|
|
405
|
+
cleanMetadata[key] = rawMetadata[key];
|
|
406
|
+
}
|
|
407
|
+
}
|
|
408
|
+
if (rawMetadata.price_breakdown) {
|
|
409
|
+
cleanMetadata.price_breakdown = rawMetadata.price_breakdown;
|
|
410
|
+
}
|
|
411
|
+
if (rawMetadata.is_rule !== undefined) {
|
|
412
|
+
cleanMetadata.is_rule = rawMetadata.is_rule;
|
|
413
|
+
}
|
|
414
|
+
return _objectSpread(_objectSpread(_objectSpread({}, submitProduct), bookingUid ? {
|
|
415
|
+
booking_uid: bookingUid
|
|
416
|
+
} : {}), {}, {
|
|
417
|
+
product_option_item: formatSubmitOptionItems(submitProduct.product_option_item),
|
|
418
|
+
discount_list: submitProduct.discount_list || [],
|
|
419
|
+
product_bundle: formatSubmitBundleItems(submitProduct.product_bundle),
|
|
420
|
+
metadata: cleanMetadata,
|
|
421
|
+
// 出站兼容:后端消费 payment_price 字段,这里从 selling_price 直接派生。
|
|
422
|
+
// 新语义下 selling_price 是 composite(含 option/bundle),payment_price 同语义。
|
|
423
|
+
payment_price: submitProduct.selling_price
|
|
424
|
+
});
|
|
425
|
+
}
|
|
426
|
+
var SUBMIT_BOOKING_METADATA_WHITELIST = ['unique_identification_number', 'collect_pax'];
|
|
427
|
+
export function normalizeSubmitBooking(booking) {
|
|
428
|
+
var rawMetadata = booking.metadata || {};
|
|
429
|
+
var cleanMetadata = {};
|
|
430
|
+
var _iterator3 = _createForOfIteratorHelper(SUBMIT_BOOKING_METADATA_WHITELIST),
|
|
431
|
+
_step3;
|
|
432
|
+
try {
|
|
433
|
+
for (_iterator3.s(); !(_step3 = _iterator3.n()).done;) {
|
|
434
|
+
var key = _step3.value;
|
|
435
|
+
if (rawMetadata[key] !== undefined) {
|
|
436
|
+
cleanMetadata[key] = rawMetadata[key];
|
|
437
|
+
}
|
|
438
|
+
}
|
|
439
|
+
} catch (err) {
|
|
440
|
+
_iterator3.e(err);
|
|
441
|
+
} finally {
|
|
442
|
+
_iterator3.f();
|
|
443
|
+
}
|
|
444
|
+
return _objectSpread(_objectSpread({}, booking), {}, {
|
|
445
|
+
metadata: cleanMetadata
|
|
446
|
+
});
|
|
447
|
+
}
|
|
448
|
+
var DEFAULT_TABLE_OCCUPANCY_DURATION = 20;
|
|
449
|
+
function resolveTableOccupancyDuration(tempOrder) {
|
|
450
|
+
var _metadata$table_confi, _metadata$tableConfig, _metadata$resource_co, _metadata$resourceCon;
|
|
451
|
+
var metadata = tempOrder.metadata || {};
|
|
452
|
+
var candidates = [metadata.table_occupancy_duration, metadata.booking_duration, metadata.table_duration, metadata.duration, (_metadata$table_confi = metadata.table_config) === null || _metadata$table_confi === void 0 ? void 0 : _metadata$table_confi.occupancy_duration, (_metadata$tableConfig = metadata.tableConfig) === null || _metadata$tableConfig === void 0 ? void 0 : _metadata$tableConfig.occupancy_duration, (_metadata$resource_co = metadata.resource_config) === null || _metadata$resource_co === void 0 ? void 0 : _metadata$resource_co.occupancy_duration, (_metadata$resourceCon = metadata.resourceConfig) === null || _metadata$resourceCon === void 0 ? void 0 : _metadata$resourceCon.occupancy_duration];
|
|
453
|
+
for (var _i2 = 0, _candidates = candidates; _i2 < _candidates.length; _i2++) {
|
|
454
|
+
var value = _candidates[_i2];
|
|
455
|
+
var duration = Number(value);
|
|
456
|
+
if (Number.isFinite(duration) && duration > 0) {
|
|
457
|
+
return Math.floor(duration);
|
|
458
|
+
}
|
|
459
|
+
}
|
|
460
|
+
return DEFAULT_TABLE_OCCUPANCY_DURATION;
|
|
461
|
+
}
|
|
462
|
+
|
|
463
|
+
/** 提交用人数:有限且为正则向下取整,否则为 1 */
|
|
464
|
+
export function normalizeSubmitCollectPaxValue(value) {
|
|
465
|
+
var n = Number(value);
|
|
466
|
+
return Number.isFinite(n) && n > 0 ? Math.floor(n) : 1;
|
|
467
|
+
}
|
|
468
|
+
|
|
469
|
+
/** 从临时订单 metadata 解析合成 booking 的 collect_pax */
|
|
470
|
+
export function resolveSubmitCollectPax(tempOrder) {
|
|
471
|
+
var _tempOrder$metadata;
|
|
472
|
+
return normalizeSubmitCollectPaxValue((_tempOrder$metadata = tempOrder.metadata) === null || _tempOrder$metadata === void 0 ? void 0 : _tempOrder$metadata.collect_pax);
|
|
473
|
+
}
|
|
474
|
+
export function createDefaultTempOrder(params) {
|
|
475
|
+
var summary = params.summary || createEmptySummary();
|
|
476
|
+
return {
|
|
477
|
+
order_id: null,
|
|
478
|
+
relation_id: undefined,
|
|
479
|
+
table_form_id: undefined,
|
|
480
|
+
resource_id: undefined,
|
|
481
|
+
order_number: '',
|
|
482
|
+
shop_order_number: '',
|
|
483
|
+
type: 'appointment_booking',
|
|
484
|
+
business_code: 'appointment_booking',
|
|
485
|
+
platform: 'h5',
|
|
486
|
+
sales_channel: 'my_pisel',
|
|
487
|
+
order_sales_channel: 'online_store',
|
|
488
|
+
status: 'normal',
|
|
489
|
+
payment_status: 'payment_processing',
|
|
490
|
+
shipping_status: 'unfulfilled',
|
|
491
|
+
customer_id: null,
|
|
492
|
+
customer_name: '',
|
|
493
|
+
country_calling_code: '',
|
|
494
|
+
phone: '',
|
|
495
|
+
email: '',
|
|
496
|
+
is_price_include_tax: 1,
|
|
497
|
+
tax_title: '',
|
|
498
|
+
tax_country_code: '',
|
|
499
|
+
currency_code: '',
|
|
500
|
+
currency_symbol: '',
|
|
501
|
+
currency_format: 'symbol_first',
|
|
502
|
+
is_deposit: 0,
|
|
503
|
+
deposit_amount: '0.00',
|
|
504
|
+
shop_discount: '0.00',
|
|
505
|
+
surcharge_fee: '0.00',
|
|
506
|
+
note: '',
|
|
507
|
+
schedule_date: params.now,
|
|
508
|
+
created_at: params.now,
|
|
509
|
+
products: [],
|
|
510
|
+
bookings: [],
|
|
511
|
+
payments: [],
|
|
512
|
+
surcharges: [],
|
|
513
|
+
discount_list: [],
|
|
514
|
+
relation_forms: [],
|
|
515
|
+
contacts: [],
|
|
516
|
+
contacts_info: [],
|
|
517
|
+
holder: null,
|
|
518
|
+
summary: summary,
|
|
519
|
+
metadata: {}
|
|
520
|
+
};
|
|
521
|
+
}
|
|
522
|
+
export function buildSubmitPayload(params) {
|
|
523
|
+
var _ref6, _ref7, _ref8, _tempOrder$is_price_i, _tempOrder$is_deposit;
|
|
524
|
+
var tempOrder = params.tempOrder,
|
|
525
|
+
cacheId = params.cacheId,
|
|
526
|
+
_params$now = params.now,
|
|
527
|
+
now = _params$now === void 0 ? new Date() : _params$now,
|
|
528
|
+
platform = params.platform,
|
|
529
|
+
businessCode = params.businessCode,
|
|
530
|
+
channel = params.channel,
|
|
531
|
+
type = params.type,
|
|
532
|
+
enhance = params.enhance;
|
|
533
|
+
var scheduleDate = tempOrder.schedule_date || tempOrder.created_at || formatDateTime(now);
|
|
534
|
+
var summary = tempOrder.summary || createEmptySummary();
|
|
535
|
+
var relationId = tempOrder.relation_id;
|
|
536
|
+
var tableFormId = tempOrder.table_form_id;
|
|
537
|
+
var bookingUuid = createUuidV4();
|
|
538
|
+
var bookingStart = dayjs(now);
|
|
539
|
+
var bookingDuration = resolveTableOccupancyDuration(tempOrder);
|
|
540
|
+
var bookingEnd = bookingStart.add(bookingDuration, 'minute');
|
|
541
|
+
var bookings = relationId && tableFormId ? [{
|
|
542
|
+
relation_id: 0,
|
|
543
|
+
form_id: 0,
|
|
544
|
+
start_time: bookingStart.format('HH:mm'),
|
|
545
|
+
start_date: bookingStart.format('YYYY-MM-DD'),
|
|
546
|
+
end_time: bookingEnd.format('HH:mm'),
|
|
547
|
+
end_date: bookingEnd.format('YYYY-MM-DD'),
|
|
548
|
+
duration: bookingDuration,
|
|
549
|
+
metadata: {
|
|
550
|
+
unique_identification_number: bookingUuid,
|
|
551
|
+
collect_pax: resolveSubmitCollectPax(tempOrder)
|
|
552
|
+
},
|
|
553
|
+
select_date: bookingStart.format('YYYY-MM-DD'),
|
|
554
|
+
is_all: false,
|
|
555
|
+
like_status: 'common',
|
|
556
|
+
schedule_id: 0,
|
|
557
|
+
relation_type: '',
|
|
558
|
+
number: 1
|
|
559
|
+
}] : tempOrder.bookings || [];
|
|
560
|
+
var formRecordIds = relationId && tableFormId ? [{
|
|
561
|
+
form_id: tableFormId,
|
|
562
|
+
form_record_id: relationId
|
|
563
|
+
}] : undefined;
|
|
564
|
+
var _createdAt = tempOrder.created_at,
|
|
565
|
+
_summary = tempOrder.summary,
|
|
566
|
+
_surcharges = tempOrder.surcharges,
|
|
567
|
+
tempOrderRest = _objectWithoutProperties(tempOrder, _excluded2);
|
|
568
|
+
var payload = _objectSpread(_objectSpread({}, tempOrderRest), {}, {
|
|
569
|
+
platform: normalizeSubmitPlatform(platform !== null && platform !== void 0 ? platform : tempOrder.platform),
|
|
570
|
+
request_unique_idempotency_token: cacheId,
|
|
571
|
+
type: (_ref6 = type !== null && type !== void 0 ? type : tempOrder.type) !== null && _ref6 !== void 0 ? _ref6 : 'table-order',
|
|
572
|
+
business_code: (_ref7 = businessCode !== null && businessCode !== void 0 ? businessCode : tempOrder.business_code) !== null && _ref7 !== void 0 ? _ref7 : 'table-order',
|
|
573
|
+
sales_channel: tempOrder.sales_channel || 'my_pisel',
|
|
574
|
+
order_sales_channel: (_ref8 = channel !== null && channel !== void 0 ? channel : tempOrder.order_sales_channel) !== null && _ref8 !== void 0 ? _ref8 : 'online_store',
|
|
575
|
+
status: tempOrder.status || 'normal',
|
|
576
|
+
payment_status: tempOrder.payment_status || 'payment_processing',
|
|
577
|
+
// shipping_status: tempOrder.shipping_status || 'unfulfilled',
|
|
578
|
+
is_price_include_tax: (_tempOrder$is_price_i = tempOrder.is_price_include_tax) !== null && _tempOrder$is_price_i !== void 0 ? _tempOrder$is_price_i : 1,
|
|
579
|
+
currency_format: tempOrder.currency_format || 'symbol_first',
|
|
580
|
+
is_deposit: (_tempOrder$is_deposit = tempOrder.is_deposit) !== null && _tempOrder$is_deposit !== void 0 ? _tempOrder$is_deposit : 0,
|
|
581
|
+
deposit_amount: tempOrder.deposit_amount || '0.00',
|
|
582
|
+
shop_discount: tempOrder.shop_discount || '0.00',
|
|
583
|
+
surcharge_fee: summary.surcharge_fee || tempOrder.surcharge_fee || '0.00',
|
|
584
|
+
note: tempOrder.note || '',
|
|
585
|
+
schedule_date: scheduleDate,
|
|
586
|
+
bookings: bookings.map(function (booking) {
|
|
587
|
+
return normalizeSubmitBooking(booking);
|
|
588
|
+
}),
|
|
589
|
+
payments: tempOrder.payments || [],
|
|
590
|
+
// discount_list: tempOrder.discount_list || [],
|
|
591
|
+
relation_forms: tempOrder.relation_forms || [],
|
|
592
|
+
form_record_ids: formRecordIds,
|
|
593
|
+
// contacts: tempOrder.contacts || [],
|
|
594
|
+
contacts_info: tempOrder.contacts_info || [],
|
|
595
|
+
// holder: tempOrder.holder || null,
|
|
596
|
+
// summary,
|
|
597
|
+
metadata: function () {
|
|
598
|
+
var _ref9 = tempOrder.metadata || {},
|
|
599
|
+
_collectPax = _ref9.collect_pax,
|
|
600
|
+
_tableOccupancyDuration = _ref9.table_occupancy_duration,
|
|
601
|
+
rest = _objectWithoutProperties(_ref9, _excluded3);
|
|
602
|
+
return _objectSpread({}, rest);
|
|
603
|
+
}(),
|
|
604
|
+
products: (tempOrder.products || []).map(function (product) {
|
|
605
|
+
return normalizeSubmitProduct(product);
|
|
606
|
+
})
|
|
607
|
+
});
|
|
608
|
+
return enhance ? enhance(payload, {
|
|
609
|
+
tempOrder: tempOrder,
|
|
610
|
+
bookingUuid: bookingUuid,
|
|
611
|
+
now: now
|
|
612
|
+
}) : payload;
|
|
613
|
+
}
|
|
614
|
+
|
|
615
|
+
/** 加单(scanOrderMore)不应提交 booking 关联的虚拟规则商品行 */
|
|
616
|
+
export function filterProductsForScanOrderMore(products) {
|
|
617
|
+
return (products || []).filter(function (p) {
|
|
618
|
+
var _p$metadata;
|
|
619
|
+
return ((_p$metadata = p.metadata) === null || _p$metadata === void 0 ? void 0 : _p$metadata.is_rule) !== true;
|
|
620
|
+
});
|
|
621
|
+
}
|
|
622
|
+
|
|
623
|
+
/**
|
|
624
|
+
* 历史 V1 加餐结构映射器。
|
|
625
|
+
*
|
|
626
|
+
* @deprecated 加餐(`PUT /order/order/product/:id`)已改为与正常 checkout 共用
|
|
627
|
+
* `ScanOrderSubmitProduct` 新结构(见 `OrderModule.submitTempOrder` 的加餐分支)。
|
|
628
|
+
* 本函数仅保留以兼容历史接入方,未来会移除。新代码请勿再调用。
|
|
629
|
+
*/
|
|
630
|
+
export function formatV1Product(products) {
|
|
631
|
+
return products.map(function (product) {
|
|
632
|
+
var _product$note;
|
|
633
|
+
return {
|
|
634
|
+
bundle: product.product_bundle,
|
|
635
|
+
key: product.product_id,
|
|
636
|
+
option: product.product_option_item,
|
|
637
|
+
product_id: product.product_id,
|
|
638
|
+
product_variant_id: product.product_variant_id,
|
|
639
|
+
num: product.num,
|
|
640
|
+
note: String((_product$note = product.note) !== null && _product$note !== void 0 ? _product$note : ''),
|
|
641
|
+
rowKey: product.product_id,
|
|
642
|
+
session: null,
|
|
643
|
+
unique: createUuidV4()
|
|
644
|
+
};
|
|
645
|
+
});
|
|
646
|
+
}
|
|
647
|
+
export { createEmptySummary } from "../../solution/ScanOrder/utils";
|
|
@@ -8,12 +8,12 @@
|
|
|
8
8
|
export function isNormalProduct(product) {
|
|
9
9
|
var _product$scheduleIds;
|
|
10
10
|
// 如果有 duration 配置,则不是普通商品
|
|
11
|
-
if (product.duration) {
|
|
11
|
+
if (product !== null && product !== void 0 && product.duration) {
|
|
12
12
|
return false;
|
|
13
13
|
}
|
|
14
14
|
|
|
15
15
|
// 如果有 schedule.ids 且长度大于0,则不是普通商品
|
|
16
|
-
if ((_product$scheduleIds = product['schedule.ids']) !== null && _product$scheduleIds !== void 0 && _product$scheduleIds.length) {
|
|
16
|
+
if (product !== null && product !== void 0 && (_product$scheduleIds = product['schedule.ids']) !== null && _product$scheduleIds !== void 0 && _product$scheduleIds.length) {
|
|
17
17
|
return false;
|
|
18
18
|
}
|
|
19
19
|
|
|
@@ -11,12 +11,14 @@ export declare class ProductList extends BaseModule implements Module {
|
|
|
11
11
|
constructor(name?: string, version?: string);
|
|
12
12
|
initialize(core: PisellCore, options: any): Promise<void>;
|
|
13
13
|
storeChange(path?: string, value?: any): Promise<void>;
|
|
14
|
-
loadProducts({ category_ids, product_ids, collection, schedule_date, cacheId }: {
|
|
14
|
+
loadProducts({ category_ids, product_ids, collection, schedule_date, schedule_datetime, cacheId, menu_list_ids, }: {
|
|
15
15
|
category_ids?: number[];
|
|
16
16
|
product_ids?: number[];
|
|
17
17
|
collection?: number | string[];
|
|
18
18
|
schedule_date?: string;
|
|
19
|
+
schedule_datetime?: string;
|
|
19
20
|
cacheId?: string;
|
|
21
|
+
menu_list_ids?: number[];
|
|
20
22
|
}): Promise<any>;
|
|
21
23
|
loadProductsPrice({ ids, customer_id, schedule_date, channel, }: {
|
|
22
24
|
ids?: number[];
|